@exponent-labs/exponent-sdk 0.9.0 → 0.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/client/vaults/index.d.ts +2 -0
- package/build/client/vaults/index.js +2 -0
- package/build/client/vaults/index.js.map +1 -1
- package/build/client/vaults/types/index.d.ts +2 -0
- package/build/client/vaults/types/index.js +2 -0
- package/build/client/vaults/types/index.js.map +1 -1
- package/build/client/vaults/types/kaminoFarmEntry.d.ts +15 -0
- package/build/client/vaults/types/kaminoFarmEntry.js +17 -0
- package/build/client/vaults/types/kaminoFarmEntry.js.map +1 -0
- package/build/client/vaults/types/kaminoObligationEntry.d.ts +21 -4
- package/build/client/vaults/types/kaminoObligationEntry.js +2 -1
- package/build/client/vaults/types/kaminoObligationEntry.js.map +1 -1
- package/build/client/vaults/types/positionUpdate.d.ts +9 -0
- package/build/client/vaults/types/positionUpdate.js +23 -0
- package/build/client/vaults/types/positionUpdate.js.map +1 -1
- package/build/client/vaults/types/proposalAction.js +0 -3
- package/build/client/vaults/types/proposalAction.js.map +1 -1
- package/build/client/vaults/types/reserveFarmMapping.d.ts +19 -0
- package/build/client/vaults/types/reserveFarmMapping.js +18 -0
- package/build/client/vaults/types/reserveFarmMapping.js.map +1 -0
- package/build/client/vaults/types/strategyPosition.d.ts +5 -0
- package/build/client/vaults/types/strategyPosition.js +5 -0
- package/build/client/vaults/types/strategyPosition.js.map +1 -1
- package/build/exponentVaults/aumCalculator.d.ts +25 -4
- package/build/exponentVaults/aumCalculator.js +236 -15
- package/build/exponentVaults/aumCalculator.js.map +1 -1
- package/build/exponentVaults/fetcher.d.ts +52 -0
- package/build/exponentVaults/fetcher.js +199 -0
- package/build/exponentVaults/fetcher.js.map +1 -0
- package/build/exponentVaults/index.d.ts +10 -9
- package/build/exponentVaults/index.js +26 -8
- package/build/exponentVaults/index.js.map +1 -1
- package/build/exponentVaults/kamino-farms.d.ts +144 -0
- package/build/exponentVaults/kamino-farms.js +396 -0
- package/build/exponentVaults/kamino-farms.js.map +1 -0
- package/build/exponentVaults/loopscale/client.d.ts +240 -0
- package/build/exponentVaults/loopscale/client.js +590 -0
- package/build/exponentVaults/loopscale/client.js.map +1 -0
- package/build/exponentVaults/loopscale/client.test.d.ts +1 -0
- package/build/exponentVaults/loopscale/client.test.js +183 -0
- package/build/exponentVaults/loopscale/client.test.js.map +1 -0
- package/build/exponentVaults/loopscale/helpers.d.ts +29 -0
- package/build/exponentVaults/loopscale/helpers.js +119 -0
- package/build/exponentVaults/loopscale/helpers.js.map +1 -0
- package/build/exponentVaults/loopscale/index.d.ts +3 -0
- package/build/exponentVaults/loopscale/index.js +12 -0
- package/build/exponentVaults/loopscale/index.js.map +1 -0
- package/build/exponentVaults/loopscale/prepared-transactions.d.ts +13 -0
- package/build/exponentVaults/loopscale/prepared-transactions.js +271 -0
- package/build/exponentVaults/loopscale/prepared-transactions.js.map +1 -0
- package/build/exponentVaults/loopscale/prepared-transactions.test.d.ts +1 -0
- package/build/exponentVaults/loopscale/prepared-transactions.test.js +400 -0
- package/build/exponentVaults/loopscale/prepared-transactions.test.js.map +1 -0
- package/build/exponentVaults/loopscale/prepared-types.d.ts +62 -0
- package/build/exponentVaults/loopscale/prepared-types.js +3 -0
- package/build/exponentVaults/loopscale/prepared-types.js.map +1 -0
- package/build/exponentVaults/loopscale/response-plan.d.ts +69 -0
- package/build/exponentVaults/loopscale/response-plan.js +141 -0
- package/build/exponentVaults/loopscale/response-plan.js.map +1 -0
- package/build/exponentVaults/loopscale/response-plan.test.d.ts +1 -0
- package/build/exponentVaults/loopscale/response-plan.test.js +139 -0
- package/build/exponentVaults/loopscale/response-plan.test.js.map +1 -0
- package/build/exponentVaults/loopscale/send-plan.d.ts +75 -0
- package/build/exponentVaults/loopscale/send-plan.js +235 -0
- package/build/exponentVaults/loopscale/send-plan.js.map +1 -0
- package/build/exponentVaults/loopscale/types.d.ts +443 -0
- package/build/exponentVaults/loopscale/types.js +3 -0
- package/build/exponentVaults/loopscale/types.js.map +1 -0
- package/build/exponentVaults/loopscale-client.d.ts +113 -524
- package/build/exponentVaults/loopscale-client.js +296 -539
- package/build/exponentVaults/loopscale-client.js.map +1 -1
- package/build/exponentVaults/loopscale-client.test.d.ts +1 -0
- package/build/exponentVaults/loopscale-client.test.js +162 -0
- package/build/exponentVaults/loopscale-client.test.js.map +1 -0
- package/build/exponentVaults/loopscale-client.types.d.ts +425 -0
- package/build/exponentVaults/loopscale-client.types.js +3 -0
- package/build/exponentVaults/loopscale-client.types.js.map +1 -0
- package/build/exponentVaults/loopscale-execution.d.ts +125 -0
- package/build/exponentVaults/loopscale-execution.js +341 -0
- package/build/exponentVaults/loopscale-execution.js.map +1 -0
- package/build/exponentVaults/loopscale-execution.test.d.ts +1 -0
- package/build/exponentVaults/loopscale-execution.test.js +139 -0
- package/build/exponentVaults/loopscale-execution.test.js.map +1 -0
- package/build/exponentVaults/loopscale-vault.d.ts +115 -0
- package/build/exponentVaults/loopscale-vault.js +275 -0
- package/build/exponentVaults/loopscale-vault.js.map +1 -0
- package/build/exponentVaults/loopscale-vault.test.d.ts +1 -0
- package/build/exponentVaults/loopscale-vault.test.js +102 -0
- package/build/exponentVaults/loopscale-vault.test.js.map +1 -0
- package/build/exponentVaults/policyBuilders.d.ts +62 -0
- package/build/exponentVaults/policyBuilders.js +119 -2
- package/build/exponentVaults/policyBuilders.js.map +1 -1
- package/build/exponentVaults/pricePathResolver.d.ts +45 -0
- package/build/exponentVaults/pricePathResolver.js +198 -0
- package/build/exponentVaults/pricePathResolver.js.map +1 -0
- package/build/exponentVaults/pricePathResolver.test.d.ts +1 -0
- package/build/exponentVaults/pricePathResolver.test.js +369 -0
- package/build/exponentVaults/pricePathResolver.test.js.map +1 -0
- package/build/exponentVaults/syncTransaction.js +4 -1
- package/build/exponentVaults/syncTransaction.js.map +1 -1
- package/build/exponentVaults/titan-quote.js +170 -36
- package/build/exponentVaults/titan-quote.js.map +1 -1
- package/build/exponentVaults/vault-instruction-types.d.ts +363 -0
- package/build/exponentVaults/vault-instruction-types.js +128 -0
- package/build/exponentVaults/vault-instruction-types.js.map +1 -0
- package/build/exponentVaults/vault-interaction.d.ts +203 -343
- package/build/exponentVaults/vault-interaction.js +1894 -426
- package/build/exponentVaults/vault-interaction.js.map +1 -1
- package/build/exponentVaults/vault-interaction.kamino-vault.test.d.ts +1 -0
- package/build/exponentVaults/vault-interaction.kamino-vault.test.js +143 -0
- package/build/exponentVaults/vault-interaction.kamino-vault.test.js.map +1 -0
- package/build/exponentVaults/vault.d.ts +51 -2
- package/build/exponentVaults/vault.js +324 -48
- package/build/exponentVaults/vault.js.map +1 -1
- package/build/exponentVaults/vaultTransactionBuilder.d.ts +100 -134
- package/build/exponentVaults/vaultTransactionBuilder.js +383 -285
- package/build/exponentVaults/vaultTransactionBuilder.js.map +1 -1
- package/build/exponentVaults/vaultTransactionBuilder.test.d.ts +1 -0
- package/build/exponentVaults/vaultTransactionBuilder.test.js +297 -0
- package/build/exponentVaults/vaultTransactionBuilder.test.js.map +1 -0
- package/build/marketThree.d.ts +6 -2
- package/build/marketThree.js +10 -8
- package/build/marketThree.js.map +1 -1
- package/package.json +34 -32
- package/src/client/vaults/index.ts +2 -0
- package/src/client/vaults/types/index.ts +2 -0
- package/src/client/vaults/types/kaminoFarmEntry.ts +32 -0
- package/src/client/vaults/types/kaminoObligationEntry.ts +6 -3
- package/src/client/vaults/types/positionUpdate.ts +62 -0
- package/src/client/vaults/types/proposalAction.ts +0 -3
- package/src/client/vaults/types/reserveFarmMapping.ts +35 -0
- package/src/client/vaults/types/strategyPosition.ts +18 -1
- package/src/exponentVaults/aumCalculator.ts +353 -16
- package/src/exponentVaults/fetcher.ts +257 -0
- package/src/exponentVaults/index.ts +65 -40
- package/src/exponentVaults/kamino-farms.ts +538 -0
- package/src/exponentVaults/loopscale/client.ts +808 -0
- package/src/exponentVaults/loopscale/helpers.ts +172 -0
- package/src/exponentVaults/loopscale/index.ts +57 -0
- package/src/exponentVaults/loopscale/prepared-transactions.ts +435 -0
- package/src/exponentVaults/loopscale/prepared-types.ts +73 -0
- package/src/exponentVaults/loopscale/types.ts +466 -0
- package/src/exponentVaults/policyBuilders.ts +170 -0
- package/src/exponentVaults/pricePathResolver.test.ts +466 -0
- package/src/exponentVaults/pricePathResolver.ts +273 -0
- package/src/exponentVaults/syncTransaction.ts +6 -1
- package/src/exponentVaults/titan-quote.ts +231 -45
- package/src/exponentVaults/vault-instruction-types.ts +493 -0
- package/src/exponentVaults/vault-interaction.kamino-vault.test.ts +149 -0
- package/src/exponentVaults/vault-interaction.ts +2818 -799
- package/src/exponentVaults/vault.ts +474 -63
- package/src/exponentVaults/vaultTransactionBuilder.test.ts +349 -0
- package/src/exponentVaults/vaultTransactionBuilder.ts +581 -433
- package/src/marketThree.ts +14 -6
- package/src/exponentVaults/loopscale-client.ts +0 -1373
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.executeLoopscaleExecutionPlan = exports.createLoopscaleExecutionPlan = void 0;
|
|
4
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
5
|
+
const vault_interaction_1 = require("./vault-interaction");
|
|
6
|
+
const loopscale_client_1 = require("./loopscale-client");
|
|
7
|
+
const LOOPSCALE_WRAPPERS = {
|
|
8
|
+
createLoan: (instruction) => vault_interaction_1.loopscaleAction.createLoan({ instruction }),
|
|
9
|
+
depositCollateral: (instruction) => vault_interaction_1.loopscaleAction.depositCollateral({ instruction }),
|
|
10
|
+
updateWeightMatrix: (instruction) => vault_interaction_1.loopscaleAction.updateWeightMatrix({ instruction }),
|
|
11
|
+
borrowPrincipal: (instruction) => vault_interaction_1.loopscaleAction.borrowPrincipal({ instruction }),
|
|
12
|
+
repayPrincipal: (instruction) => vault_interaction_1.loopscaleAction.repayPrincipal({ instruction }),
|
|
13
|
+
withdrawCollateral: (instruction) => vault_interaction_1.loopscaleAction.withdrawCollateral({ instruction }),
|
|
14
|
+
closeLoan: (instruction) => vault_interaction_1.loopscaleAction.closeLoan({ instruction }),
|
|
15
|
+
createStrategy: (instruction) => vault_interaction_1.loopscaleAction.createStrategy({ instruction }),
|
|
16
|
+
depositStrategy: (instruction) => vault_interaction_1.loopscaleAction.depositStrategy({ instruction }),
|
|
17
|
+
withdrawStrategy: (instruction) => vault_interaction_1.loopscaleAction.withdrawStrategy({ instruction }),
|
|
18
|
+
closeStrategy: (instruction) => vault_interaction_1.loopscaleAction.closeStrategy({ instruction }),
|
|
19
|
+
updateStrategy: (instruction) => vault_interaction_1.loopscaleAction.updateStrategy({ instruction }),
|
|
20
|
+
};
|
|
21
|
+
async function decompileTransaction(connection, transaction) {
|
|
22
|
+
const addressLookupTableAccounts = await Promise.all(transaction.message.addressTableLookups.map(async (lookup) => {
|
|
23
|
+
const result = await connection.getAddressLookupTable(lookup.accountKey);
|
|
24
|
+
if (!result.value) {
|
|
25
|
+
throw new Error(`Missing lookup table ${lookup.accountKey.toBase58()}`);
|
|
26
|
+
}
|
|
27
|
+
return result.value;
|
|
28
|
+
}));
|
|
29
|
+
return web3_js_1.TransactionMessage.decompile(transaction.message, { addressLookupTableAccounts }).instructions;
|
|
30
|
+
}
|
|
31
|
+
function isComputeBudgetInstruction(instruction) {
|
|
32
|
+
return instruction.programId.equals(web3_js_1.ComputeBudgetProgram.programId);
|
|
33
|
+
}
|
|
34
|
+
function wrapLoopscaleInstruction(instruction) {
|
|
35
|
+
const name = (0, loopscale_client_1.identifyLoopscaleInstruction)(instruction);
|
|
36
|
+
if (!name) {
|
|
37
|
+
throw new Error("Encountered a non-Loopscale or unsupported Loopscale instruction in a sync segment");
|
|
38
|
+
}
|
|
39
|
+
if (!(name in LOOPSCALE_WRAPPERS)) {
|
|
40
|
+
throw new Error(`Loopscale instruction ${name} is not supported through Exponent CPI execution`);
|
|
41
|
+
}
|
|
42
|
+
return LOOPSCALE_WRAPPERS[name](instruction);
|
|
43
|
+
}
|
|
44
|
+
function dedupeLookupTables(addressLookupTableAccounts) {
|
|
45
|
+
const seen = new Set();
|
|
46
|
+
return addressLookupTableAccounts.filter((account) => {
|
|
47
|
+
const key = account.key.toBase58();
|
|
48
|
+
if (seen.has(key))
|
|
49
|
+
return false;
|
|
50
|
+
seen.add(key);
|
|
51
|
+
return true;
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
async function resolveLookupTableAccounts(connection, addresses) {
|
|
55
|
+
const results = await Promise.all(addresses.map((address) => connection.getAddressLookupTable(address)));
|
|
56
|
+
return results
|
|
57
|
+
.map((result) => result.value)
|
|
58
|
+
.filter((value) => value !== null);
|
|
59
|
+
}
|
|
60
|
+
async function sendAndConfirm(connection, transaction, sendOptions, confirmation) {
|
|
61
|
+
const signature = await connection.sendTransaction(transaction, sendOptions);
|
|
62
|
+
let confirmationError = null;
|
|
63
|
+
let confirmed = false;
|
|
64
|
+
if (confirmation.blockhash && confirmation.lastValidBlockHeight !== undefined) {
|
|
65
|
+
const result = await connection.confirmTransaction({
|
|
66
|
+
signature,
|
|
67
|
+
blockhash: confirmation.blockhash,
|
|
68
|
+
lastValidBlockHeight: confirmation.lastValidBlockHeight,
|
|
69
|
+
}, confirmation.commitment).catch(() => null);
|
|
70
|
+
confirmationError = result?.value.err ?? null;
|
|
71
|
+
confirmed = result !== null;
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
for (let attempt = 0; attempt < 60; attempt += 1) {
|
|
75
|
+
const statuses = await connection.getSignatureStatuses([signature]);
|
|
76
|
+
const status = statuses.value[0];
|
|
77
|
+
if (status?.err || status?.confirmationStatus === "confirmed" || status?.confirmationStatus === "finalized") {
|
|
78
|
+
confirmationError = status?.err ?? null;
|
|
79
|
+
confirmed = status?.confirmationStatus === "confirmed" || status?.confirmationStatus === "finalized";
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
await new Promise((resolve) => setTimeout(resolve, 1_000));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (confirmationError) {
|
|
86
|
+
return {
|
|
87
|
+
signature,
|
|
88
|
+
logs: null,
|
|
89
|
+
error: confirmationError,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const finality = confirmation.commitment === "finalized" ? "finalized" : "confirmed";
|
|
93
|
+
for (let attempt = 0; attempt < 10; attempt += 1) {
|
|
94
|
+
const txResult = await connection.getTransaction(signature, {
|
|
95
|
+
commitment: finality,
|
|
96
|
+
maxSupportedTransactionVersion: 0,
|
|
97
|
+
});
|
|
98
|
+
if (txResult) {
|
|
99
|
+
return {
|
|
100
|
+
signature,
|
|
101
|
+
logs: txResult.meta?.logMessages ?? null,
|
|
102
|
+
error: txResult.meta?.err ?? null,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
106
|
+
}
|
|
107
|
+
const statuses = await connection.getSignatureStatuses([signature], { searchTransactionHistory: true });
|
|
108
|
+
const status = statuses.value[0];
|
|
109
|
+
if (status?.err) {
|
|
110
|
+
return {
|
|
111
|
+
signature,
|
|
112
|
+
logs: null,
|
|
113
|
+
error: status.err,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (status?.confirmationStatus === "confirmed" || status?.confirmationStatus === "finalized") {
|
|
117
|
+
return {
|
|
118
|
+
signature,
|
|
119
|
+
logs: null,
|
|
120
|
+
error: null,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
if (confirmed) {
|
|
124
|
+
return {
|
|
125
|
+
signature,
|
|
126
|
+
logs: null,
|
|
127
|
+
error: null,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
signature,
|
|
132
|
+
logs: null,
|
|
133
|
+
error: `Transaction ${signature} not found after confirmation timeout`,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Convert a raw Loopscale strategy or CPI-compatible loan response into an
|
|
138
|
+
* Exponent execution plan.
|
|
139
|
+
*
|
|
140
|
+
* The adapter preserves transaction boundaries while classifying each returned
|
|
141
|
+
* transaction into:
|
|
142
|
+
* 1. standalone top-level batches for contiguous non-Loopscale prefixes/suffixes
|
|
143
|
+
* 2. wrapped Loopscale sync batches containing only compute-budget prefixes and
|
|
144
|
+
* Loopscale program instructions
|
|
145
|
+
*
|
|
146
|
+
* This keeps the wrapped sync transaction small and preserves the relative
|
|
147
|
+
* ordering of any safe top-level setup/finalization work Loopscale includes
|
|
148
|
+
* around the CPI-compatible instruction segment.
|
|
149
|
+
*
|
|
150
|
+
* Loopscale loan maintenance responses such as `repayPrincipal`,
|
|
151
|
+
* `withdrawCollateral`, `updateWeightMatrix`, and `closeLoan` are supported as
|
|
152
|
+
* long as they are returned directly by Loopscale in a clean sync segment.
|
|
153
|
+
* Unsupported instructions such as `lockLoan`, `unlockLoan`, or
|
|
154
|
+
* `refinanceLedger` still throw instead of being guessed into the sync
|
|
155
|
+
* segment.
|
|
156
|
+
*/
|
|
157
|
+
async function createLoopscaleExecutionPlan({ connection, response, }) {
|
|
158
|
+
const rawResponses = (0, loopscale_client_1.getLoopscaleTransactionResponses)(response);
|
|
159
|
+
const rawTransactions = rawResponses.map((entry) => (0, loopscale_client_1.deserializeLoopscaleTransactionResponse)(entry));
|
|
160
|
+
const batches = [];
|
|
161
|
+
for (const transaction of rawTransactions) {
|
|
162
|
+
const instructions = await decompileTransaction(connection, transaction);
|
|
163
|
+
const loopscaleIndices = instructions
|
|
164
|
+
.map((instruction, index) => (0, loopscale_client_1.identifyLoopscaleInstruction)(instruction) !== null ? index : -1)
|
|
165
|
+
.filter((index) => index !== -1);
|
|
166
|
+
const firstLoopscaleIndex = loopscaleIndices[0] ?? -1;
|
|
167
|
+
if (firstLoopscaleIndex === -1) {
|
|
168
|
+
batches.push({
|
|
169
|
+
kind: "standalone",
|
|
170
|
+
instructions,
|
|
171
|
+
signers: [],
|
|
172
|
+
addressLookupTableAddresses: transaction.message.addressTableLookups.map((lookup) => lookup.accountKey),
|
|
173
|
+
rawTransaction: transaction,
|
|
174
|
+
});
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
const lastLoopscaleIndex = loopscaleIndices[loopscaleIndices.length - 1];
|
|
178
|
+
const prefixInstructions = [];
|
|
179
|
+
const preInstructions = [];
|
|
180
|
+
const syncInstructions = [];
|
|
181
|
+
const suffixInstructions = [];
|
|
182
|
+
for (let index = 0; index < firstLoopscaleIndex; index += 1) {
|
|
183
|
+
const instruction = instructions[index];
|
|
184
|
+
if (isComputeBudgetInstruction(instruction)) {
|
|
185
|
+
preInstructions.push(instruction);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
prefixInstructions.push(instruction);
|
|
189
|
+
}
|
|
190
|
+
for (let index = firstLoopscaleIndex; index <= lastLoopscaleIndex; index += 1) {
|
|
191
|
+
const instruction = instructions[index];
|
|
192
|
+
const name = (0, loopscale_client_1.identifyLoopscaleInstruction)(instruction);
|
|
193
|
+
if (name !== null) {
|
|
194
|
+
syncInstructions.push(wrapLoopscaleInstruction(instruction));
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
throw new Error("Loopscale execution plan cannot split non-Loopscale instructions interleaved within a sync segment");
|
|
198
|
+
}
|
|
199
|
+
for (let index = lastLoopscaleIndex + 1; index < instructions.length; index += 1) {
|
|
200
|
+
suffixInstructions.push(instructions[index]);
|
|
201
|
+
}
|
|
202
|
+
if (prefixInstructions.length > 0) {
|
|
203
|
+
batches.push({
|
|
204
|
+
kind: "standalone",
|
|
205
|
+
instructions: prefixInstructions,
|
|
206
|
+
signers: [],
|
|
207
|
+
addressLookupTableAddresses: transaction.message.addressTableLookups.map((lookup) => lookup.accountKey),
|
|
208
|
+
rawTransaction: transaction,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
batches.push({
|
|
212
|
+
kind: "sync",
|
|
213
|
+
preInstructions,
|
|
214
|
+
syncInstructions,
|
|
215
|
+
postInstructions: [],
|
|
216
|
+
signers: [],
|
|
217
|
+
addressLookupTableAddresses: [],
|
|
218
|
+
rawTransaction: transaction,
|
|
219
|
+
});
|
|
220
|
+
if (suffixInstructions.length > 0) {
|
|
221
|
+
batches.push({
|
|
222
|
+
kind: "standalone",
|
|
223
|
+
instructions: suffixInstructions,
|
|
224
|
+
signers: [],
|
|
225
|
+
addressLookupTableAddresses: transaction.message.addressTableLookups.map((lookup) => lookup.accountKey),
|
|
226
|
+
rawTransaction: transaction,
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return { batches, rawTransactions };
|
|
231
|
+
}
|
|
232
|
+
exports.createLoopscaleExecutionPlan = createLoopscaleExecutionPlan;
|
|
233
|
+
/**
|
|
234
|
+
* Execute a previously created Loopscale execution plan.
|
|
235
|
+
*
|
|
236
|
+
* Sync batches are wrapped into Squads sync transactions and optionally passed
|
|
237
|
+
* through `context.coSign`. Standalone batches are sent as regular top-level
|
|
238
|
+
* transactions without wrapping.
|
|
239
|
+
*/
|
|
240
|
+
async function executeLoopscaleExecutionPlan({ plan, context, }) {
|
|
241
|
+
if (context.signers.length === 0) {
|
|
242
|
+
throw new Error("Loopscale execution requires at least one signer");
|
|
243
|
+
}
|
|
244
|
+
const commitment = context.commitment ?? "confirmed";
|
|
245
|
+
const results = [];
|
|
246
|
+
for (const [batchIndex, batch] of plan.batches.entries()) {
|
|
247
|
+
if (batch.kind === "standalone") {
|
|
248
|
+
const addressLookupTableAccounts = await resolveLookupTableAccounts(context.connection, batch.addressLookupTableAddresses);
|
|
249
|
+
const { blockhash, lastValidBlockHeight } = await context.connection.getLatestBlockhash(commitment);
|
|
250
|
+
const message = new web3_js_1.TransactionMessage({
|
|
251
|
+
payerKey: context.signers[0].publicKey,
|
|
252
|
+
recentBlockhash: blockhash,
|
|
253
|
+
instructions: batch.instructions,
|
|
254
|
+
}).compileToV0Message(addressLookupTableAccounts);
|
|
255
|
+
const transaction = new web3_js_1.VersionedTransaction(message);
|
|
256
|
+
transaction.sign(context.signers);
|
|
257
|
+
const result = await sendAndConfirm(context.connection, transaction, context.sendOptions, { commitment, blockhash, lastValidBlockHeight });
|
|
258
|
+
results.push({
|
|
259
|
+
batchIndex,
|
|
260
|
+
kind: "standalone",
|
|
261
|
+
...result,
|
|
262
|
+
});
|
|
263
|
+
if (result.error) {
|
|
264
|
+
return { error: result.error, results };
|
|
265
|
+
}
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
const syncResult = await (0, vault_interaction_1.createVaultSyncTransaction)({
|
|
269
|
+
instructions: batch.syncInstructions,
|
|
270
|
+
owner: context.owner,
|
|
271
|
+
connection: context.connection,
|
|
272
|
+
policyPda: context.policyPda,
|
|
273
|
+
vaultPda: context.vaultPda,
|
|
274
|
+
signer: context.signer,
|
|
275
|
+
accountIndex: context.accountIndex,
|
|
276
|
+
constraintIndices: context.constraintIndices,
|
|
277
|
+
vaultAddress: context.vaultAddress,
|
|
278
|
+
leadingAccounts: context.leadingAccounts,
|
|
279
|
+
preHookAccounts: context.preHookAccounts,
|
|
280
|
+
postHookAccounts: context.postHookAccounts,
|
|
281
|
+
squadsProgram: context.squadsProgram,
|
|
282
|
+
});
|
|
283
|
+
if (syncResult.setupInstructions.length > 0) {
|
|
284
|
+
const { blockhash, lastValidBlockHeight } = await context.connection.getLatestBlockhash(commitment);
|
|
285
|
+
const setupMessage = new web3_js_1.TransactionMessage({
|
|
286
|
+
payerKey: context.signers[0].publicKey,
|
|
287
|
+
recentBlockhash: blockhash,
|
|
288
|
+
instructions: [
|
|
289
|
+
web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }),
|
|
290
|
+
...syncResult.setupInstructions,
|
|
291
|
+
],
|
|
292
|
+
}).compileToV0Message([]);
|
|
293
|
+
const setupTransaction = new web3_js_1.VersionedTransaction(setupMessage);
|
|
294
|
+
setupTransaction.sign(context.signers);
|
|
295
|
+
const setupResult = await sendAndConfirm(context.connection, setupTransaction, context.sendOptions, { commitment, blockhash, lastValidBlockHeight });
|
|
296
|
+
results.push({
|
|
297
|
+
batchIndex,
|
|
298
|
+
kind: "setup",
|
|
299
|
+
...setupResult,
|
|
300
|
+
});
|
|
301
|
+
if (setupResult.error) {
|
|
302
|
+
return { error: setupResult.error, results };
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
const rawLookupTableAccounts = await resolveLookupTableAccounts(context.connection, batch.addressLookupTableAddresses);
|
|
306
|
+
const addressLookupTableAccounts = dedupeLookupTables([
|
|
307
|
+
...(context.addressLookupTableAccounts ?? []),
|
|
308
|
+
...rawLookupTableAccounts,
|
|
309
|
+
]);
|
|
310
|
+
const { blockhash, lastValidBlockHeight } = await context.connection.getLatestBlockhash(commitment);
|
|
311
|
+
const message = new web3_js_1.TransactionMessage({
|
|
312
|
+
payerKey: context.signers[0].publicKey,
|
|
313
|
+
recentBlockhash: blockhash,
|
|
314
|
+
instructions: [
|
|
315
|
+
...(context.prependInstructions ?? []),
|
|
316
|
+
...batch.preInstructions,
|
|
317
|
+
...syncResult.preInstructions,
|
|
318
|
+
syncResult.instruction,
|
|
319
|
+
...batch.postInstructions,
|
|
320
|
+
...syncResult.postInstructions,
|
|
321
|
+
],
|
|
322
|
+
}).compileToV0Message(addressLookupTableAccounts);
|
|
323
|
+
let transaction = new web3_js_1.VersionedTransaction(message);
|
|
324
|
+
transaction.sign([...context.signers, ...syncResult.signers, ...batch.signers]);
|
|
325
|
+
if (context.coSign) {
|
|
326
|
+
transaction = await context.coSign(transaction);
|
|
327
|
+
}
|
|
328
|
+
const result = await sendAndConfirm(context.connection, transaction, context.sendOptions, { commitment, blockhash, lastValidBlockHeight });
|
|
329
|
+
results.push({
|
|
330
|
+
batchIndex,
|
|
331
|
+
kind: "sync",
|
|
332
|
+
...result,
|
|
333
|
+
});
|
|
334
|
+
if (result.error) {
|
|
335
|
+
return { error: result.error, results };
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
return { error: null, results };
|
|
339
|
+
}
|
|
340
|
+
exports.executeLoopscaleExecutionPlan = executeLoopscaleExecutionPlan;
|
|
341
|
+
//# sourceMappingURL=loopscale-execution.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loopscale-execution.js","sourceRoot":"","sources":["../../src/exponentVaults/loopscale-execution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const globals_1 = require("@jest/globals");
|
|
4
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
5
|
+
const policyBuilders_1 = require("./policyBuilders");
|
|
6
|
+
const loopscale_execution_1 = require("./loopscale-execution");
|
|
7
|
+
function buildLoopscaleInstruction(name, payer) {
|
|
8
|
+
return new web3_js_1.TransactionInstruction({
|
|
9
|
+
programId: policyBuilders_1.LOOPSCALE_PROGRAM_ID,
|
|
10
|
+
keys: [
|
|
11
|
+
{ pubkey: payer, isSigner: true, isWritable: true },
|
|
12
|
+
{ pubkey: new web3_js_1.PublicKey("4Nd1mY7V4KJ1mQ9MJ2VYfXh7WvyaManEXZDV4xQSSHqK"), isSigner: false, isWritable: true },
|
|
13
|
+
{ pubkey: new web3_js_1.PublicKey("8W2Y29Jw6dBfS4M7N6KBiD5D4Q2qk4VmF1jM7c3M4bXv"), isSigner: false, isWritable: true },
|
|
14
|
+
{ pubkey: new web3_js_1.PublicKey("9b3BfUqKNAYdP9KJ3cVd7hYjW4M5w2v8s2Q2Mmj74o8D"), isSigner: false, isWritable: true },
|
|
15
|
+
],
|
|
16
|
+
data: Buffer.concat([Buffer.from(policyBuilders_1.LOOPSCALE_DISCRIMINATORS[name]), Buffer.alloc(8)]),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
function buildNonLoopscaleInstruction(programId, payer) {
|
|
20
|
+
return new web3_js_1.TransactionInstruction({
|
|
21
|
+
programId,
|
|
22
|
+
keys: [{ pubkey: payer, isSigner: true, isWritable: true }],
|
|
23
|
+
data: Buffer.alloc(0),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function encodeTransactionResponse(instructions, payer = new web3_js_1.PublicKey("11111111111111111111111111111111")) {
|
|
27
|
+
const message = new web3_js_1.TransactionMessage({
|
|
28
|
+
payerKey: payer,
|
|
29
|
+
recentBlockhash: "11111111111111111111111111111111",
|
|
30
|
+
instructions,
|
|
31
|
+
}).compileToV0Message([]);
|
|
32
|
+
const transaction = new web3_js_1.VersionedTransaction(message);
|
|
33
|
+
return {
|
|
34
|
+
message: Buffer.from(transaction.message.serialize()).toString("base64"),
|
|
35
|
+
signatures: [{
|
|
36
|
+
publicKey: payer.toBase58(),
|
|
37
|
+
signature: Buffer.alloc(64).toString("base64"),
|
|
38
|
+
}],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
(0, globals_1.describe)("createLoopscaleExecutionPlan", () => {
|
|
42
|
+
const connection = new web3_js_1.Connection("http://127.0.0.1:8899");
|
|
43
|
+
const payer = new web3_js_1.PublicKey("11111111111111111111111111111111");
|
|
44
|
+
(0, globals_1.it)("splits non-Loopscale suffix instructions into a standalone batch after the sync segment", async () => {
|
|
45
|
+
const response = encodeTransactionResponse([
|
|
46
|
+
web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: 1_000_000 }),
|
|
47
|
+
web3_js_1.ComputeBudgetProgram.requestHeapFrame({ bytes: 64 * 1024 }),
|
|
48
|
+
buildLoopscaleInstruction("createStrategy", payer),
|
|
49
|
+
buildLoopscaleInstruction("depositStrategy", payer),
|
|
50
|
+
buildNonLoopscaleInstruction(web3_js_1.AddressLookupTableProgram.programId, payer),
|
|
51
|
+
], payer);
|
|
52
|
+
const plan = await (0, loopscale_execution_1.createLoopscaleExecutionPlan)({ connection, response: [response] });
|
|
53
|
+
(0, globals_1.expect)(plan.batches).toHaveLength(2);
|
|
54
|
+
const batch = plan.batches[0];
|
|
55
|
+
(0, globals_1.expect)(batch.kind).toBe("sync");
|
|
56
|
+
(0, globals_1.expect)(batch.preInstructions).toHaveLength(2);
|
|
57
|
+
(0, globals_1.expect)(batch.syncInstructions.map((instruction) => instruction.action)).toEqual([
|
|
58
|
+
"LOOPSCALE_CREATE_STRATEGY",
|
|
59
|
+
"LOOPSCALE_DEPOSIT_STRATEGY",
|
|
60
|
+
]);
|
|
61
|
+
(0, globals_1.expect)(batch.postInstructions).toHaveLength(0);
|
|
62
|
+
(0, globals_1.expect)(plan.batches[1].kind).toBe("standalone");
|
|
63
|
+
if (plan.batches[1].kind === "standalone") {
|
|
64
|
+
(0, globals_1.expect)(plan.batches[1].instructions).toHaveLength(1);
|
|
65
|
+
(0, globals_1.expect)(plan.batches[1].instructions[0].programId).toEqual(web3_js_1.AddressLookupTableProgram.programId);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
(0, globals_1.it)("preserves a pure loan transaction as one sync batch with a hoisted compute prefix", async () => {
|
|
69
|
+
const response = encodeTransactionResponse([
|
|
70
|
+
web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: 1_000_000 }),
|
|
71
|
+
buildLoopscaleInstruction("createLoan", payer),
|
|
72
|
+
buildLoopscaleInstruction("depositCollateral", payer),
|
|
73
|
+
buildLoopscaleInstruction("updateWeightMatrix", payer),
|
|
74
|
+
buildLoopscaleInstruction("borrowPrincipal", payer),
|
|
75
|
+
], payer);
|
|
76
|
+
const plan = await (0, loopscale_execution_1.createLoopscaleExecutionPlan)({ connection, response });
|
|
77
|
+
const batch = plan.batches[0];
|
|
78
|
+
(0, globals_1.expect)(batch.preInstructions).toHaveLength(1);
|
|
79
|
+
(0, globals_1.expect)(batch.syncInstructions.map((instruction) => instruction.action)).toEqual([
|
|
80
|
+
"LOOPSCALE_CREATE_LOAN",
|
|
81
|
+
"LOOPSCALE_DEPOSIT_COLLATERAL",
|
|
82
|
+
"LOOPSCALE_UPDATE_WEIGHT_MATRIX",
|
|
83
|
+
"LOOPSCALE_BORROW_PRINCIPAL",
|
|
84
|
+
]);
|
|
85
|
+
(0, globals_1.expect)(batch.postInstructions).toHaveLength(0);
|
|
86
|
+
});
|
|
87
|
+
(0, globals_1.it)("accepts the wrapped transactions response shape used by live borrow flows", async () => {
|
|
88
|
+
const response = {
|
|
89
|
+
transactions: [encodeTransactionResponse([
|
|
90
|
+
web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: 1_000_000 }),
|
|
91
|
+
buildLoopscaleInstruction("borrowPrincipal", payer),
|
|
92
|
+
], payer)],
|
|
93
|
+
expectedLoanInfo: {
|
|
94
|
+
loan: { address: payer.toBase58() },
|
|
95
|
+
},
|
|
96
|
+
};
|
|
97
|
+
const plan = await (0, loopscale_execution_1.createLoopscaleExecutionPlan)({ connection, response });
|
|
98
|
+
const batch = plan.batches[0];
|
|
99
|
+
(0, globals_1.expect)(batch.preInstructions).toHaveLength(1);
|
|
100
|
+
(0, globals_1.expect)(batch.syncInstructions.map((instruction) => instruction.action)).toEqual([
|
|
101
|
+
"LOOPSCALE_BORROW_PRINCIPAL",
|
|
102
|
+
]);
|
|
103
|
+
});
|
|
104
|
+
(0, globals_1.it)("returns a standalone batch when Loopscale instructions are absent", async () => {
|
|
105
|
+
const response = encodeTransactionResponse([
|
|
106
|
+
web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: 500_000 }),
|
|
107
|
+
buildNonLoopscaleInstruction(web3_js_1.SystemProgram.programId, payer),
|
|
108
|
+
], payer);
|
|
109
|
+
const plan = await (0, loopscale_execution_1.createLoopscaleExecutionPlan)({ connection, response });
|
|
110
|
+
(0, globals_1.expect)(plan.batches).toHaveLength(1);
|
|
111
|
+
(0, globals_1.expect)(plan.batches[0].kind).toBe("standalone");
|
|
112
|
+
if (plan.batches[0].kind === "standalone") {
|
|
113
|
+
(0, globals_1.expect)(plan.batches[0].instructions).toHaveLength(2);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
(0, globals_1.it)("rejects interleaved non-Loopscale instructions inside the sync segment", async () => {
|
|
117
|
+
const response = encodeTransactionResponse([
|
|
118
|
+
buildLoopscaleInstruction("createLoan", payer),
|
|
119
|
+
buildNonLoopscaleInstruction(web3_js_1.SystemProgram.programId, payer),
|
|
120
|
+
buildLoopscaleInstruction("depositCollateral", payer),
|
|
121
|
+
], payer);
|
|
122
|
+
await (0, globals_1.expect)((0, loopscale_execution_1.createLoopscaleExecutionPlan)({ connection, response })).rejects.toThrow("cannot split non-Loopscale instructions interleaved");
|
|
123
|
+
});
|
|
124
|
+
(0, globals_1.it)("accepts raw Loopscale repay and close-loan cleanup instructions", async () => {
|
|
125
|
+
const response = encodeTransactionResponse([
|
|
126
|
+
web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: 700_000 }),
|
|
127
|
+
buildLoopscaleInstruction("repayPrincipal", payer),
|
|
128
|
+
buildLoopscaleInstruction("closeLoan", payer),
|
|
129
|
+
], payer);
|
|
130
|
+
const plan = await (0, loopscale_execution_1.createLoopscaleExecutionPlan)({ connection, response });
|
|
131
|
+
const batch = plan.batches[0];
|
|
132
|
+
(0, globals_1.expect)(batch.preInstructions).toHaveLength(1);
|
|
133
|
+
(0, globals_1.expect)(batch.syncInstructions.map((instruction) => instruction.action)).toEqual([
|
|
134
|
+
"LOOPSCALE_REPAY_PRINCIPAL",
|
|
135
|
+
"LOOPSCALE_CLOSE_LOAN",
|
|
136
|
+
]);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=loopscale-execution.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loopscale-execution.test.js","sourceRoot":"","sources":["../../src/exponentVaults/loopscale-execution.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { type AccountMeta, type AddressLookupTableAccount, type Commitment, type SendOptions, type Signer, Connection, PublicKey, TransactionInstruction, VersionedTransaction } from "@solana/web3.js";
|
|
2
|
+
import { type LoopscaleInstruction } from "./vault-interaction";
|
|
3
|
+
import { type LoopscaleTransactionResponse } from "./loopscale-client";
|
|
4
|
+
/**
|
|
5
|
+
* A wrapped Loopscale batch that can be executed through the Exponent vault.
|
|
6
|
+
*
|
|
7
|
+
* `preInstructions` and `postInstructions` are top-level instructions hoisted
|
|
8
|
+
* from the raw Loopscale transaction. `syncInstructions` are the original
|
|
9
|
+
* Loopscale program instructions, wrapped minimally for `createVaultSyncTransaction`.
|
|
10
|
+
*/
|
|
11
|
+
export interface LoopscaleVaultSyncBatch {
|
|
12
|
+
kind: "sync";
|
|
13
|
+
preInstructions: TransactionInstruction[];
|
|
14
|
+
syncInstructions: LoopscaleInstruction[];
|
|
15
|
+
postInstructions: TransactionInstruction[];
|
|
16
|
+
signers: Signer[];
|
|
17
|
+
addressLookupTableAddresses: PublicKey[];
|
|
18
|
+
rawTransaction: VersionedTransaction;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* A raw top-level transaction batch that does not contain any Loopscale
|
|
22
|
+
* program instructions and therefore must not be wrapped in a Squads sync
|
|
23
|
+
* transaction.
|
|
24
|
+
*/
|
|
25
|
+
export interface LoopscaleVaultStandaloneBatch {
|
|
26
|
+
kind: "standalone";
|
|
27
|
+
instructions: TransactionInstruction[];
|
|
28
|
+
signers: Signer[];
|
|
29
|
+
addressLookupTableAddresses: PublicKey[];
|
|
30
|
+
rawTransaction: VersionedTransaction;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A single executable batch derived from a raw Loopscale response.
|
|
34
|
+
*/
|
|
35
|
+
export type LoopscaleVaultExecutionBatch = LoopscaleVaultSyncBatch | LoopscaleVaultStandaloneBatch;
|
|
36
|
+
/**
|
|
37
|
+
* Minimal execution plan derived from a raw Loopscale response.
|
|
38
|
+
*/
|
|
39
|
+
export interface LoopscaleVaultExecutionPlan {
|
|
40
|
+
/** Executable batches in the same order Loopscale returned them. */
|
|
41
|
+
batches: LoopscaleVaultExecutionBatch[];
|
|
42
|
+
/** Deserialized raw transactions returned by Loopscale. */
|
|
43
|
+
rawTransactions: VersionedTransaction[];
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Execution context for sending a Loopscale vault execution plan.
|
|
47
|
+
*/
|
|
48
|
+
export interface LoopscaleVaultExecutionContext {
|
|
49
|
+
connection: Connection;
|
|
50
|
+
owner: PublicKey;
|
|
51
|
+
vaultPda: PublicKey;
|
|
52
|
+
signer: PublicKey;
|
|
53
|
+
signers: Signer[];
|
|
54
|
+
vaultAddress?: PublicKey;
|
|
55
|
+
accountIndex?: number;
|
|
56
|
+
policyPda?: PublicKey;
|
|
57
|
+
constraintIndices?: number[];
|
|
58
|
+
leadingAccounts?: PublicKey[] | AccountMeta[];
|
|
59
|
+
preHookAccounts?: PublicKey[] | AccountMeta[];
|
|
60
|
+
postHookAccounts?: PublicKey[] | AccountMeta[];
|
|
61
|
+
squadsProgram?: PublicKey;
|
|
62
|
+
addressLookupTableAccounts?: AddressLookupTableAccount[];
|
|
63
|
+
prependInstructions?: TransactionInstruction[];
|
|
64
|
+
sendOptions?: SendOptions;
|
|
65
|
+
commitment?: Commitment;
|
|
66
|
+
/**
|
|
67
|
+
* Optional co-signing hook used for sync batches.
|
|
68
|
+
*
|
|
69
|
+
* When omitted, sync batches are sent without additional Loopscale co-signing.
|
|
70
|
+
*/
|
|
71
|
+
coSign?: (transaction: VersionedTransaction) => Promise<VersionedTransaction>;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Result for a single sent transaction while executing a vault plan.
|
|
75
|
+
*/
|
|
76
|
+
export interface BatchExecutionResult {
|
|
77
|
+
batchIndex: number;
|
|
78
|
+
kind: "setup" | "sync" | "standalone";
|
|
79
|
+
signature: string;
|
|
80
|
+
logs: string[] | null;
|
|
81
|
+
error: unknown;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Aggregate result for {@link executeLoopscaleVaultPlan}.
|
|
85
|
+
*/
|
|
86
|
+
export interface ExecutionResult {
|
|
87
|
+
error: unknown;
|
|
88
|
+
results: BatchExecutionResult[];
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Convert a raw Loopscale transaction response into a vault-compatible execution plan.
|
|
92
|
+
*
|
|
93
|
+
* The adapter preserves transaction boundaries and original instruction order.
|
|
94
|
+
* It only performs two structural changes:
|
|
95
|
+
* 1. Compute budget instructions are hoisted out of the sync segment.
|
|
96
|
+
* 2. A contiguous non-Loopscale prefix/suffix is hoisted to top-level.
|
|
97
|
+
*
|
|
98
|
+
* If a non-Loopscale instruction appears between two Loopscale instructions, the
|
|
99
|
+
* adapter throws instead of guessing how to rewrite the transaction.
|
|
100
|
+
*/
|
|
101
|
+
export declare function createLoopscaleVaultExecutionPlan({ connection, response, }: {
|
|
102
|
+
connection: Connection;
|
|
103
|
+
response: LoopscaleTransactionResponse;
|
|
104
|
+
}): Promise<LoopscaleVaultExecutionPlan>;
|
|
105
|
+
/**
|
|
106
|
+
* Execute a previously created Loopscale vault execution plan.
|
|
107
|
+
*
|
|
108
|
+
* Sync batches are wrapped into Squads sync transactions and optionally passed
|
|
109
|
+
* through `context.coSign`. Standalone batches are sent as regular top-level
|
|
110
|
+
* transactions without wrapping.
|
|
111
|
+
*/
|
|
112
|
+
export declare function executeLoopscaleVaultPlan({ plan, context, }: {
|
|
113
|
+
plan: LoopscaleVaultExecutionPlan;
|
|
114
|
+
context: LoopscaleVaultExecutionContext;
|
|
115
|
+
}): Promise<ExecutionResult>;
|