@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.
Files changed (155) hide show
  1. package/build/client/vaults/index.d.ts +2 -0
  2. package/build/client/vaults/index.js +2 -0
  3. package/build/client/vaults/index.js.map +1 -1
  4. package/build/client/vaults/types/index.d.ts +2 -0
  5. package/build/client/vaults/types/index.js +2 -0
  6. package/build/client/vaults/types/index.js.map +1 -1
  7. package/build/client/vaults/types/kaminoFarmEntry.d.ts +15 -0
  8. package/build/client/vaults/types/kaminoFarmEntry.js +17 -0
  9. package/build/client/vaults/types/kaminoFarmEntry.js.map +1 -0
  10. package/build/client/vaults/types/kaminoObligationEntry.d.ts +21 -4
  11. package/build/client/vaults/types/kaminoObligationEntry.js +2 -1
  12. package/build/client/vaults/types/kaminoObligationEntry.js.map +1 -1
  13. package/build/client/vaults/types/positionUpdate.d.ts +9 -0
  14. package/build/client/vaults/types/positionUpdate.js +23 -0
  15. package/build/client/vaults/types/positionUpdate.js.map +1 -1
  16. package/build/client/vaults/types/proposalAction.js +0 -3
  17. package/build/client/vaults/types/proposalAction.js.map +1 -1
  18. package/build/client/vaults/types/reserveFarmMapping.d.ts +19 -0
  19. package/build/client/vaults/types/reserveFarmMapping.js +18 -0
  20. package/build/client/vaults/types/reserveFarmMapping.js.map +1 -0
  21. package/build/client/vaults/types/strategyPosition.d.ts +5 -0
  22. package/build/client/vaults/types/strategyPosition.js +5 -0
  23. package/build/client/vaults/types/strategyPosition.js.map +1 -1
  24. package/build/exponentVaults/aumCalculator.d.ts +25 -4
  25. package/build/exponentVaults/aumCalculator.js +236 -15
  26. package/build/exponentVaults/aumCalculator.js.map +1 -1
  27. package/build/exponentVaults/fetcher.d.ts +52 -0
  28. package/build/exponentVaults/fetcher.js +199 -0
  29. package/build/exponentVaults/fetcher.js.map +1 -0
  30. package/build/exponentVaults/index.d.ts +10 -9
  31. package/build/exponentVaults/index.js +26 -8
  32. package/build/exponentVaults/index.js.map +1 -1
  33. package/build/exponentVaults/kamino-farms.d.ts +144 -0
  34. package/build/exponentVaults/kamino-farms.js +396 -0
  35. package/build/exponentVaults/kamino-farms.js.map +1 -0
  36. package/build/exponentVaults/loopscale/client.d.ts +240 -0
  37. package/build/exponentVaults/loopscale/client.js +590 -0
  38. package/build/exponentVaults/loopscale/client.js.map +1 -0
  39. package/build/exponentVaults/loopscale/client.test.d.ts +1 -0
  40. package/build/exponentVaults/loopscale/client.test.js +183 -0
  41. package/build/exponentVaults/loopscale/client.test.js.map +1 -0
  42. package/build/exponentVaults/loopscale/helpers.d.ts +29 -0
  43. package/build/exponentVaults/loopscale/helpers.js +119 -0
  44. package/build/exponentVaults/loopscale/helpers.js.map +1 -0
  45. package/build/exponentVaults/loopscale/index.d.ts +3 -0
  46. package/build/exponentVaults/loopscale/index.js +12 -0
  47. package/build/exponentVaults/loopscale/index.js.map +1 -0
  48. package/build/exponentVaults/loopscale/prepared-transactions.d.ts +13 -0
  49. package/build/exponentVaults/loopscale/prepared-transactions.js +271 -0
  50. package/build/exponentVaults/loopscale/prepared-transactions.js.map +1 -0
  51. package/build/exponentVaults/loopscale/prepared-transactions.test.d.ts +1 -0
  52. package/build/exponentVaults/loopscale/prepared-transactions.test.js +400 -0
  53. package/build/exponentVaults/loopscale/prepared-transactions.test.js.map +1 -0
  54. package/build/exponentVaults/loopscale/prepared-types.d.ts +62 -0
  55. package/build/exponentVaults/loopscale/prepared-types.js +3 -0
  56. package/build/exponentVaults/loopscale/prepared-types.js.map +1 -0
  57. package/build/exponentVaults/loopscale/response-plan.d.ts +69 -0
  58. package/build/exponentVaults/loopscale/response-plan.js +141 -0
  59. package/build/exponentVaults/loopscale/response-plan.js.map +1 -0
  60. package/build/exponentVaults/loopscale/response-plan.test.d.ts +1 -0
  61. package/build/exponentVaults/loopscale/response-plan.test.js +139 -0
  62. package/build/exponentVaults/loopscale/response-plan.test.js.map +1 -0
  63. package/build/exponentVaults/loopscale/send-plan.d.ts +75 -0
  64. package/build/exponentVaults/loopscale/send-plan.js +235 -0
  65. package/build/exponentVaults/loopscale/send-plan.js.map +1 -0
  66. package/build/exponentVaults/loopscale/types.d.ts +443 -0
  67. package/build/exponentVaults/loopscale/types.js +3 -0
  68. package/build/exponentVaults/loopscale/types.js.map +1 -0
  69. package/build/exponentVaults/loopscale-client.d.ts +113 -524
  70. package/build/exponentVaults/loopscale-client.js +296 -539
  71. package/build/exponentVaults/loopscale-client.js.map +1 -1
  72. package/build/exponentVaults/loopscale-client.test.d.ts +1 -0
  73. package/build/exponentVaults/loopscale-client.test.js +162 -0
  74. package/build/exponentVaults/loopscale-client.test.js.map +1 -0
  75. package/build/exponentVaults/loopscale-client.types.d.ts +425 -0
  76. package/build/exponentVaults/loopscale-client.types.js +3 -0
  77. package/build/exponentVaults/loopscale-client.types.js.map +1 -0
  78. package/build/exponentVaults/loopscale-execution.d.ts +125 -0
  79. package/build/exponentVaults/loopscale-execution.js +341 -0
  80. package/build/exponentVaults/loopscale-execution.js.map +1 -0
  81. package/build/exponentVaults/loopscale-execution.test.d.ts +1 -0
  82. package/build/exponentVaults/loopscale-execution.test.js +139 -0
  83. package/build/exponentVaults/loopscale-execution.test.js.map +1 -0
  84. package/build/exponentVaults/loopscale-vault.d.ts +115 -0
  85. package/build/exponentVaults/loopscale-vault.js +275 -0
  86. package/build/exponentVaults/loopscale-vault.js.map +1 -0
  87. package/build/exponentVaults/loopscale-vault.test.d.ts +1 -0
  88. package/build/exponentVaults/loopscale-vault.test.js +102 -0
  89. package/build/exponentVaults/loopscale-vault.test.js.map +1 -0
  90. package/build/exponentVaults/policyBuilders.d.ts +62 -0
  91. package/build/exponentVaults/policyBuilders.js +119 -2
  92. package/build/exponentVaults/policyBuilders.js.map +1 -1
  93. package/build/exponentVaults/pricePathResolver.d.ts +45 -0
  94. package/build/exponentVaults/pricePathResolver.js +198 -0
  95. package/build/exponentVaults/pricePathResolver.js.map +1 -0
  96. package/build/exponentVaults/pricePathResolver.test.d.ts +1 -0
  97. package/build/exponentVaults/pricePathResolver.test.js +369 -0
  98. package/build/exponentVaults/pricePathResolver.test.js.map +1 -0
  99. package/build/exponentVaults/syncTransaction.js +4 -1
  100. package/build/exponentVaults/syncTransaction.js.map +1 -1
  101. package/build/exponentVaults/titan-quote.js +170 -36
  102. package/build/exponentVaults/titan-quote.js.map +1 -1
  103. package/build/exponentVaults/vault-instruction-types.d.ts +363 -0
  104. package/build/exponentVaults/vault-instruction-types.js +128 -0
  105. package/build/exponentVaults/vault-instruction-types.js.map +1 -0
  106. package/build/exponentVaults/vault-interaction.d.ts +203 -343
  107. package/build/exponentVaults/vault-interaction.js +1894 -426
  108. package/build/exponentVaults/vault-interaction.js.map +1 -1
  109. package/build/exponentVaults/vault-interaction.kamino-vault.test.d.ts +1 -0
  110. package/build/exponentVaults/vault-interaction.kamino-vault.test.js +143 -0
  111. package/build/exponentVaults/vault-interaction.kamino-vault.test.js.map +1 -0
  112. package/build/exponentVaults/vault.d.ts +51 -2
  113. package/build/exponentVaults/vault.js +324 -48
  114. package/build/exponentVaults/vault.js.map +1 -1
  115. package/build/exponentVaults/vaultTransactionBuilder.d.ts +100 -134
  116. package/build/exponentVaults/vaultTransactionBuilder.js +383 -285
  117. package/build/exponentVaults/vaultTransactionBuilder.js.map +1 -1
  118. package/build/exponentVaults/vaultTransactionBuilder.test.d.ts +1 -0
  119. package/build/exponentVaults/vaultTransactionBuilder.test.js +297 -0
  120. package/build/exponentVaults/vaultTransactionBuilder.test.js.map +1 -0
  121. package/build/marketThree.d.ts +6 -2
  122. package/build/marketThree.js +10 -8
  123. package/build/marketThree.js.map +1 -1
  124. package/package.json +34 -32
  125. package/src/client/vaults/index.ts +2 -0
  126. package/src/client/vaults/types/index.ts +2 -0
  127. package/src/client/vaults/types/kaminoFarmEntry.ts +32 -0
  128. package/src/client/vaults/types/kaminoObligationEntry.ts +6 -3
  129. package/src/client/vaults/types/positionUpdate.ts +62 -0
  130. package/src/client/vaults/types/proposalAction.ts +0 -3
  131. package/src/client/vaults/types/reserveFarmMapping.ts +35 -0
  132. package/src/client/vaults/types/strategyPosition.ts +18 -1
  133. package/src/exponentVaults/aumCalculator.ts +353 -16
  134. package/src/exponentVaults/fetcher.ts +257 -0
  135. package/src/exponentVaults/index.ts +65 -40
  136. package/src/exponentVaults/kamino-farms.ts +538 -0
  137. package/src/exponentVaults/loopscale/client.ts +808 -0
  138. package/src/exponentVaults/loopscale/helpers.ts +172 -0
  139. package/src/exponentVaults/loopscale/index.ts +57 -0
  140. package/src/exponentVaults/loopscale/prepared-transactions.ts +435 -0
  141. package/src/exponentVaults/loopscale/prepared-types.ts +73 -0
  142. package/src/exponentVaults/loopscale/types.ts +466 -0
  143. package/src/exponentVaults/policyBuilders.ts +170 -0
  144. package/src/exponentVaults/pricePathResolver.test.ts +466 -0
  145. package/src/exponentVaults/pricePathResolver.ts +273 -0
  146. package/src/exponentVaults/syncTransaction.ts +6 -1
  147. package/src/exponentVaults/titan-quote.ts +231 -45
  148. package/src/exponentVaults/vault-instruction-types.ts +493 -0
  149. package/src/exponentVaults/vault-interaction.kamino-vault.test.ts +149 -0
  150. package/src/exponentVaults/vault-interaction.ts +2818 -799
  151. package/src/exponentVaults/vault.ts +474 -63
  152. package/src/exponentVaults/vaultTransactionBuilder.test.ts +349 -0
  153. package/src/exponentVaults/vaultTransactionBuilder.ts +581 -433
  154. package/src/marketThree.ts +14 -6
  155. package/src/exponentVaults/loopscale-client.ts +0 -1373
@@ -0,0 +1,141 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createLoopscaleResponsePlan = void 0;
4
+ const web3_js_1 = require("@solana/web3.js");
5
+ const vault_interaction_1 = require("../vault-interaction");
6
+ const client_1 = require("./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, 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
+ /**
45
+ * Convert a raw Loopscale strategy or CPI-compatible loan response into an
46
+ * Exponent response plan.
47
+ *
48
+ * The adapter preserves transaction boundaries while classifying each returned
49
+ * transaction into:
50
+ * 1. standalone top-level batches for contiguous non-Loopscale prefixes/suffixes
51
+ * 2. wrapped Loopscale sync batches containing only compute-budget prefixes and
52
+ * Loopscale program instructions
53
+ *
54
+ * This keeps the wrapped sync transaction small and preserves the relative
55
+ * ordering of any safe top-level setup/finalization work Loopscale includes
56
+ * around the CPI-compatible instruction segment.
57
+ *
58
+ * Loopscale loan maintenance responses such as `repayPrincipal`,
59
+ * `withdrawCollateral`, `updateWeightMatrix`, and `closeLoan` are supported as
60
+ * long as they are returned directly by Loopscale in a clean sync segment.
61
+ * Unsupported instructions such as `lockLoan`, `unlockLoan`, or
62
+ * `refinanceLedger` still throw instead of being guessed into the sync
63
+ * segment.
64
+ */
65
+ async function createLoopscaleResponsePlan({ connection, response, }) {
66
+ const rawResponses = (0, client_1.getLoopscaleTransactionResponses)(response);
67
+ const rawTransactions = rawResponses.map((entry) => (0, client_1.deserializeLoopscaleTransactionResponse)(entry));
68
+ const batches = [];
69
+ for (const transaction of rawTransactions) {
70
+ const instructions = await decompileTransaction(connection, transaction);
71
+ const loopscaleIndices = instructions
72
+ .map((instruction, index) => (0, client_1.identifyLoopscaleInstruction)(instruction) !== null ? index : -1)
73
+ .filter((index) => index !== -1);
74
+ const firstLoopscaleIndex = loopscaleIndices[0] ?? -1;
75
+ if (firstLoopscaleIndex === -1) {
76
+ batches.push({
77
+ kind: "standalone",
78
+ instructions,
79
+ signers: [],
80
+ addressLookupTableAddresses: transaction.message.addressTableLookups.map((lookup) => lookup.accountKey),
81
+ rawTransaction: transaction,
82
+ });
83
+ continue;
84
+ }
85
+ const lastLoopscaleIndex = loopscaleIndices[loopscaleIndices.length - 1];
86
+ const prefixInstructions = [];
87
+ const preInstructions = [];
88
+ const syncInstructions = [];
89
+ const suffixInstructions = [];
90
+ for (let index = 0; index < firstLoopscaleIndex; index += 1) {
91
+ const instruction = instructions[index];
92
+ if (isComputeBudgetInstruction(instruction)) {
93
+ preInstructions.push(instruction);
94
+ continue;
95
+ }
96
+ prefixInstructions.push(instruction);
97
+ }
98
+ for (let index = firstLoopscaleIndex; index <= lastLoopscaleIndex; index += 1) {
99
+ const instruction = instructions[index];
100
+ const name = (0, client_1.identifyLoopscaleInstruction)(instruction);
101
+ if (name !== null) {
102
+ syncInstructions.push(wrapLoopscaleInstruction(instruction));
103
+ continue;
104
+ }
105
+ throw new Error("Loopscale response plan cannot split non-Loopscale instructions interleaved within a sync segment");
106
+ }
107
+ for (let index = lastLoopscaleIndex + 1; index < instructions.length; index += 1) {
108
+ suffixInstructions.push(instructions[index]);
109
+ }
110
+ if (prefixInstructions.length > 0) {
111
+ batches.push({
112
+ kind: "standalone",
113
+ instructions: prefixInstructions,
114
+ signers: [],
115
+ addressLookupTableAddresses: transaction.message.addressTableLookups.map((lookup) => lookup.accountKey),
116
+ rawTransaction: transaction,
117
+ });
118
+ }
119
+ batches.push({
120
+ kind: "sync",
121
+ preInstructions,
122
+ syncInstructions,
123
+ postInstructions: [],
124
+ signers: [],
125
+ addressLookupTableAddresses: [],
126
+ rawTransaction: transaction,
127
+ });
128
+ if (suffixInstructions.length > 0) {
129
+ batches.push({
130
+ kind: "standalone",
131
+ instructions: suffixInstructions,
132
+ signers: [],
133
+ addressLookupTableAddresses: transaction.message.addressTableLookups.map((lookup) => lookup.accountKey),
134
+ rawTransaction: transaction,
135
+ });
136
+ }
137
+ }
138
+ return { batches, rawTransactions };
139
+ }
140
+ exports.createLoopscaleResponsePlan = createLoopscaleResponsePlan;
141
+ //# sourceMappingURL=response-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-plan.js","sourceRoot":"","sources":["../../../src/exponentVaults/loopscale/response-plan.ts"],"names":[],"mappings":"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"}
@@ -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 response_plan_1 = require("./response-plan");
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)("createLoopscaleResponsePlan", () => {
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, response_plan_1.createLoopscaleResponsePlan)({ 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, response_plan_1.createLoopscaleResponsePlan)({ 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, response_plan_1.createLoopscaleResponsePlan)({ 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, response_plan_1.createLoopscaleResponsePlan)({ 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, response_plan_1.createLoopscaleResponsePlan)({ 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, response_plan_1.createLoopscaleResponsePlan)({ 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=response-plan.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-plan.test.js","sourceRoot":"","sources":["../../../src/exponentVaults/loopscale/response-plan.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
1
+ import { type AccountMeta, type AddressLookupTableAccount, type Commitment, type SendOptions, type Signer, Connection, PublicKey, TransactionInstruction, VersionedTransaction } from "@solana/web3.js";
2
+ import { type LoopscaleResponsePlan } from "./response-plan";
3
+ import type { LoopscaleTransactionResponse } from "./types";
4
+ /**
5
+ * Context for sending a Loopscale response plan through Exponent.
6
+ *
7
+ * This is intentionally not exported from the main SDK barrel. The public
8
+ * Loopscale module stops at raw response adaptation; direct sending remains an
9
+ * internal/testing utility for now.
10
+ */
11
+ export interface LoopscaleResponsePlanContext {
12
+ connection: Connection;
13
+ owner: PublicKey;
14
+ vaultPda: PublicKey;
15
+ signer: PublicKey;
16
+ signers: Signer[];
17
+ vaultAddress?: PublicKey;
18
+ accountIndex?: number;
19
+ policyPda?: PublicKey;
20
+ constraintIndices?: number[];
21
+ leadingAccounts?: PublicKey[] | AccountMeta[];
22
+ preHookAccounts?: PublicKey[] | AccountMeta[];
23
+ postHookAccounts?: PublicKey[] | AccountMeta[];
24
+ squadsProgram?: PublicKey;
25
+ addressLookupTableAccounts?: AddressLookupTableAccount[];
26
+ prependInstructions?: TransactionInstruction[];
27
+ /**
28
+ * Override for the wrapped sync transaction compute unit limit.
29
+ *
30
+ * This sender is used after raw Loopscale instructions are wrapped into an
31
+ * Exponent sync transaction, which can require more compute than the raw
32
+ * Loopscale budget originally anticipated.
33
+ */
34
+ syncComputeUnitLimit?: number;
35
+ sendOptions?: SendOptions;
36
+ commitment?: Commitment;
37
+ coSign?: (transaction: VersionedTransaction) => Promise<VersionedTransaction>;
38
+ }
39
+ /**
40
+ * Result for a single sent transaction while sending a Loopscale response plan.
41
+ */
42
+ export interface LoopscaleBatchSendResult {
43
+ batchIndex: number;
44
+ kind: "setup" | "sync" | "standalone";
45
+ signature: string;
46
+ logs: string[] | null;
47
+ error: unknown;
48
+ }
49
+ /**
50
+ * Aggregate result for {@link sendLoopscaleResponsePlan}.
51
+ */
52
+ export interface LoopscaleResponsePlanResult {
53
+ error: unknown;
54
+ results: LoopscaleBatchSendResult[];
55
+ }
56
+ /**
57
+ * Send a previously created Loopscale response plan.
58
+ *
59
+ * This helper is kept outside the main public Loopscale SDK surface so the
60
+ * foundation layer can stay focused on raw API responses plus adaptation.
61
+ */
62
+ export declare function sendLoopscaleResponsePlan({ plan, context, }: {
63
+ plan: LoopscaleResponsePlan;
64
+ context: LoopscaleResponsePlanContext;
65
+ }): Promise<LoopscaleResponsePlanResult>;
66
+ /**
67
+ * Adapt and send a raw Loopscale response through Exponent.
68
+ *
69
+ * This keeps tests and internal callers focused on the real boundary they
70
+ * care about: "Loopscale returned this response, now send it".
71
+ */
72
+ export declare function sendLoopscaleResponse({ response, context, }: {
73
+ response: LoopscaleTransactionResponse;
74
+ context: LoopscaleResponsePlanContext;
75
+ }): Promise<LoopscaleResponsePlanResult>;
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendLoopscaleResponse = exports.sendLoopscaleResponsePlan = void 0;
4
+ const web3_js_1 = require("@solana/web3.js");
5
+ const vault_interaction_1 = require("../vault-interaction");
6
+ const response_plan_1 = require("./response-plan");
7
+ function dedupeLookupTables(addressLookupTableAccounts) {
8
+ const seen = new Set();
9
+ return addressLookupTableAccounts.filter((account) => {
10
+ const key = account.key.toBase58();
11
+ if (seen.has(key))
12
+ return false;
13
+ seen.add(key);
14
+ return true;
15
+ });
16
+ }
17
+ async function resolveLookupTableAccounts(connection, addresses) {
18
+ const results = await Promise.all(addresses.map((address) => connection.getAddressLookupTable(address)));
19
+ return results
20
+ .map((result) => result.value)
21
+ .filter((value) => value !== null);
22
+ }
23
+ async function sendAndConfirm(connection, transaction, sendOptions, confirmation) {
24
+ const signature = await connection.sendTransaction(transaction, sendOptions);
25
+ let confirmationError = null;
26
+ let confirmed = false;
27
+ if (confirmation.blockhash && confirmation.lastValidBlockHeight !== undefined) {
28
+ const result = await connection.confirmTransaction({
29
+ signature,
30
+ blockhash: confirmation.blockhash,
31
+ lastValidBlockHeight: confirmation.lastValidBlockHeight,
32
+ }, confirmation.commitment).catch(() => null);
33
+ confirmationError = result?.value.err ?? null;
34
+ confirmed = result !== null;
35
+ }
36
+ else {
37
+ for (let attempt = 0; attempt < 60; attempt += 1) {
38
+ const statuses = await connection.getSignatureStatuses([signature]);
39
+ const status = statuses.value[0];
40
+ if (status?.err || status?.confirmationStatus === "confirmed" || status?.confirmationStatus === "finalized") {
41
+ confirmationError = status?.err ?? null;
42
+ confirmed = status?.confirmationStatus === "confirmed" || status?.confirmationStatus === "finalized";
43
+ break;
44
+ }
45
+ await new Promise((resolve) => setTimeout(resolve, 1_000));
46
+ }
47
+ }
48
+ if (confirmationError) {
49
+ return {
50
+ signature,
51
+ logs: null,
52
+ error: confirmationError,
53
+ };
54
+ }
55
+ const finality = confirmation.commitment === "finalized" ? "finalized" : "confirmed";
56
+ for (let attempt = 0; attempt < 10; attempt += 1) {
57
+ const txResult = await connection.getTransaction(signature, {
58
+ commitment: finality,
59
+ maxSupportedTransactionVersion: 0,
60
+ });
61
+ if (txResult) {
62
+ return {
63
+ signature,
64
+ logs: txResult.meta?.logMessages ?? null,
65
+ error: txResult.meta?.err ?? null,
66
+ };
67
+ }
68
+ await new Promise((resolve) => setTimeout(resolve, 500));
69
+ }
70
+ const statuses = await connection.getSignatureStatuses([signature], { searchTransactionHistory: true });
71
+ const status = statuses.value[0];
72
+ if (status?.err) {
73
+ return {
74
+ signature,
75
+ logs: null,
76
+ error: status.err,
77
+ };
78
+ }
79
+ if (status?.confirmationStatus === "confirmed" || status?.confirmationStatus === "finalized") {
80
+ return {
81
+ signature,
82
+ logs: null,
83
+ error: null,
84
+ };
85
+ }
86
+ if (confirmed) {
87
+ return {
88
+ signature,
89
+ logs: null,
90
+ error: null,
91
+ };
92
+ }
93
+ return {
94
+ signature,
95
+ logs: null,
96
+ error: `Transaction ${signature} not found after confirmation timeout`,
97
+ };
98
+ }
99
+ function isSetComputeUnitLimitInstruction(instruction) {
100
+ return (instruction.programId.equals(web3_js_1.ComputeBudgetProgram.programId)
101
+ && instruction.data.length > 0
102
+ && instruction.data[0] === 2);
103
+ }
104
+ function overrideSyncComputeUnitLimit(instructions, units) {
105
+ return [
106
+ ...instructions.filter((instruction) => !isSetComputeUnitLimitInstruction(instruction)),
107
+ web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units }),
108
+ ];
109
+ }
110
+ /**
111
+ * Send a previously created Loopscale response plan.
112
+ *
113
+ * This helper is kept outside the main public Loopscale SDK surface so the
114
+ * foundation layer can stay focused on raw API responses plus adaptation.
115
+ */
116
+ async function sendLoopscaleResponsePlan({ plan, context, }) {
117
+ if (context.signers.length === 0) {
118
+ throw new Error("Loopscale execution requires at least one signer");
119
+ }
120
+ const commitment = context.commitment ?? "confirmed";
121
+ const syncComputeUnitLimit = context.syncComputeUnitLimit ?? 1_400_000;
122
+ const results = [];
123
+ for (const [batchIndex, batch] of plan.batches.entries()) {
124
+ if (batch.kind === "standalone") {
125
+ const addressLookupTableAccounts = await resolveLookupTableAccounts(context.connection, batch.addressLookupTableAddresses);
126
+ const { blockhash, lastValidBlockHeight } = await context.connection.getLatestBlockhash(commitment);
127
+ const message = new web3_js_1.TransactionMessage({
128
+ payerKey: context.signers[0].publicKey,
129
+ recentBlockhash: blockhash,
130
+ instructions: batch.instructions,
131
+ }).compileToV0Message(addressLookupTableAccounts);
132
+ const transaction = new web3_js_1.VersionedTransaction(message);
133
+ transaction.sign(context.signers);
134
+ const result = await sendAndConfirm(context.connection, transaction, context.sendOptions, { commitment, blockhash, lastValidBlockHeight });
135
+ results.push({
136
+ batchIndex,
137
+ kind: "standalone",
138
+ ...result,
139
+ });
140
+ if (result.error) {
141
+ return { error: result.error, results };
142
+ }
143
+ continue;
144
+ }
145
+ const syncResult = await (0, vault_interaction_1.createVaultSyncTransaction)({
146
+ instructions: batch.syncInstructions,
147
+ owner: context.owner,
148
+ connection: context.connection,
149
+ policyPda: context.policyPda,
150
+ vaultPda: context.vaultPda,
151
+ signer: context.signer,
152
+ accountIndex: context.accountIndex,
153
+ constraintIndices: context.constraintIndices,
154
+ vaultAddress: context.vaultAddress,
155
+ leadingAccounts: context.leadingAccounts,
156
+ preHookAccounts: context.preHookAccounts,
157
+ postHookAccounts: context.postHookAccounts,
158
+ squadsProgram: context.squadsProgram,
159
+ });
160
+ if (syncResult.setupInstructions.length > 0) {
161
+ const { blockhash, lastValidBlockHeight } = await context.connection.getLatestBlockhash(commitment);
162
+ const setupMessage = new web3_js_1.TransactionMessage({
163
+ payerKey: context.signers[0].publicKey,
164
+ recentBlockhash: blockhash,
165
+ instructions: [
166
+ web3_js_1.ComputeBudgetProgram.setComputeUnitLimit({ units: 400_000 }),
167
+ ...syncResult.setupInstructions,
168
+ ],
169
+ }).compileToV0Message([]);
170
+ const setupTransaction = new web3_js_1.VersionedTransaction(setupMessage);
171
+ setupTransaction.sign(context.signers);
172
+ const setupResult = await sendAndConfirm(context.connection, setupTransaction, context.sendOptions, { commitment, blockhash, lastValidBlockHeight });
173
+ results.push({
174
+ batchIndex,
175
+ kind: "setup",
176
+ ...setupResult,
177
+ });
178
+ if (setupResult.error) {
179
+ return { error: setupResult.error, results };
180
+ }
181
+ }
182
+ const rawLookupTableAccounts = await resolveLookupTableAccounts(context.connection, batch.addressLookupTableAddresses);
183
+ const addressLookupTableAccounts = dedupeLookupTables([
184
+ ...(context.addressLookupTableAccounts ?? []),
185
+ ...rawLookupTableAccounts,
186
+ ]);
187
+ const { blockhash, lastValidBlockHeight } = await context.connection.getLatestBlockhash(commitment);
188
+ const message = new web3_js_1.TransactionMessage({
189
+ payerKey: context.signers[0].publicKey,
190
+ recentBlockhash: blockhash,
191
+ instructions: [
192
+ ...(context.prependInstructions ?? []),
193
+ ...overrideSyncComputeUnitLimit(batch.preInstructions, syncComputeUnitLimit),
194
+ ...syncResult.preInstructions,
195
+ syncResult.instruction,
196
+ ...batch.postInstructions,
197
+ ...syncResult.postInstructions,
198
+ ],
199
+ }).compileToV0Message(addressLookupTableAccounts);
200
+ let transaction = new web3_js_1.VersionedTransaction(message);
201
+ transaction.sign([...context.signers, ...syncResult.signers, ...batch.signers]);
202
+ if (context.coSign) {
203
+ transaction = await context.coSign(transaction);
204
+ }
205
+ const result = await sendAndConfirm(context.connection, transaction, context.sendOptions, { commitment, blockhash, lastValidBlockHeight });
206
+ results.push({
207
+ batchIndex,
208
+ kind: "sync",
209
+ ...result,
210
+ });
211
+ if (result.error) {
212
+ return { error: result.error, results };
213
+ }
214
+ }
215
+ return { error: null, results };
216
+ }
217
+ exports.sendLoopscaleResponsePlan = sendLoopscaleResponsePlan;
218
+ /**
219
+ * Adapt and send a raw Loopscale response through Exponent.
220
+ *
221
+ * This keeps tests and internal callers focused on the real boundary they
222
+ * care about: "Loopscale returned this response, now send it".
223
+ */
224
+ async function sendLoopscaleResponse({ response, context, }) {
225
+ const plan = await (0, response_plan_1.createLoopscaleResponsePlan)({
226
+ connection: context.connection,
227
+ response,
228
+ });
229
+ return sendLoopscaleResponsePlan({
230
+ plan,
231
+ context,
232
+ });
233
+ }
234
+ exports.sendLoopscaleResponse = sendLoopscaleResponse;
235
+ //# sourceMappingURL=send-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-plan.js","sourceRoot":"","sources":["../../../src/exponentVaults/loopscale/send-plan.ts"],"names":[],"mappings":"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"}