@symmetry-hq/sdk 1.0.1

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 (121) hide show
  1. package/dist/src/constants.d.ts +23 -0
  2. package/dist/src/constants.js +38 -0
  3. package/dist/src/index.d.ts +804 -0
  4. package/dist/src/index.js +2097 -0
  5. package/dist/src/instructions/automation/auction.d.ts +6 -0
  6. package/dist/src/instructions/automation/auction.js +40 -0
  7. package/dist/src/instructions/automation/claimBounty.d.ts +12 -0
  8. package/dist/src/instructions/automation/claimBounty.js +44 -0
  9. package/dist/src/instructions/automation/flashSwap.d.ts +21 -0
  10. package/dist/src/instructions/automation/flashSwap.js +74 -0
  11. package/dist/src/instructions/automation/priceUpdate.d.ts +19 -0
  12. package/dist/src/instructions/automation/priceUpdate.js +89 -0
  13. package/dist/src/instructions/automation/rebalanceIntent.d.ts +32 -0
  14. package/dist/src/instructions/automation/rebalanceIntent.js +117 -0
  15. package/dist/src/instructions/automation/rebalanceSwap.d.ts +11 -0
  16. package/dist/src/instructions/automation/rebalanceSwap.js +42 -0
  17. package/dist/src/instructions/management/addBounty.d.ts +7 -0
  18. package/dist/src/instructions/management/addBounty.js +41 -0
  19. package/dist/src/instructions/management/admin.d.ts +9 -0
  20. package/dist/src/instructions/management/admin.js +53 -0
  21. package/dist/src/instructions/management/claimFees.d.ts +15 -0
  22. package/dist/src/instructions/management/claimFees.js +95 -0
  23. package/dist/src/instructions/management/createBasket.d.ts +21 -0
  24. package/dist/src/instructions/management/createBasket.js +98 -0
  25. package/dist/src/instructions/management/edit.d.ts +51 -0
  26. package/dist/src/instructions/management/edit.js +477 -0
  27. package/dist/src/instructions/management/luts.d.ts +30 -0
  28. package/dist/src/instructions/management/luts.js +99 -0
  29. package/dist/src/instructions/pda.d.ts +25 -0
  30. package/dist/src/instructions/pda.js +128 -0
  31. package/dist/src/instructions/user/deposit.d.ts +20 -0
  32. package/dist/src/instructions/user/deposit.js +100 -0
  33. package/dist/src/instructions/user/withdraw.d.ts +8 -0
  34. package/dist/src/instructions/user/withdraw.js +36 -0
  35. package/dist/src/jup.d.ts +49 -0
  36. package/dist/src/jup.js +80 -0
  37. package/dist/src/keeperMonitor.d.ts +52 -0
  38. package/dist/src/keeperMonitor.js +624 -0
  39. package/dist/src/layouts/basket.d.ts +191 -0
  40. package/dist/src/layouts/basket.js +51 -0
  41. package/dist/src/layouts/config.d.ts +281 -0
  42. package/dist/src/layouts/config.js +237 -0
  43. package/dist/src/layouts/fraction.d.ts +20 -0
  44. package/dist/src/layouts/fraction.js +164 -0
  45. package/dist/src/layouts/intents/bounty.d.ts +18 -0
  46. package/dist/src/layouts/intents/bounty.js +19 -0
  47. package/dist/src/layouts/intents/intent.d.ts +209 -0
  48. package/dist/src/layouts/intents/intent.js +97 -0
  49. package/dist/src/layouts/intents/rebalanceIntent.d.ts +212 -0
  50. package/dist/src/layouts/intents/rebalanceIntent.js +94 -0
  51. package/dist/src/layouts/lookupTable.d.ts +7 -0
  52. package/dist/src/layouts/lookupTable.js +10 -0
  53. package/dist/src/layouts/oracle.d.ts +63 -0
  54. package/dist/src/layouts/oracle.js +96 -0
  55. package/dist/src/states/basket.d.ts +14 -0
  56. package/dist/src/states/basket.js +479 -0
  57. package/dist/src/states/config.d.ts +3 -0
  58. package/dist/src/states/config.js +71 -0
  59. package/dist/src/states/intents/intent.d.ts +10 -0
  60. package/dist/src/states/intents/intent.js +316 -0
  61. package/dist/src/states/intents/rebalanceIntent.d.ts +42 -0
  62. package/dist/src/states/intents/rebalanceIntent.js +680 -0
  63. package/dist/src/states/oracles/constants.d.ts +9 -0
  64. package/dist/src/states/oracles/constants.js +15 -0
  65. package/dist/src/states/oracles/oracle.d.ts +24 -0
  66. package/dist/src/states/oracles/oracle.js +168 -0
  67. package/dist/src/states/oracles/pythOracle.d.ts +132 -0
  68. package/dist/src/states/oracles/pythOracle.js +609 -0
  69. package/dist/src/states/oracles/raydiumClmmOracle.d.ts +184 -0
  70. package/dist/src/states/oracles/raydiumClmmOracle.js +843 -0
  71. package/dist/src/states/oracles/raydiumCpmmOracle.d.ts +120 -0
  72. package/dist/src/states/oracles/raydiumCpmmOracle.js +540 -0
  73. package/dist/src/states/oracles/switchboardOracle.d.ts +0 -0
  74. package/dist/src/states/oracles/switchboardOracle.js +1 -0
  75. package/dist/src/states/withdrawBasketFees.d.ts +10 -0
  76. package/dist/src/states/withdrawBasketFees.js +154 -0
  77. package/dist/src/txUtils.d.ts +65 -0
  78. package/dist/src/txUtils.js +306 -0
  79. package/dist/test.d.ts +1 -0
  80. package/dist/test.js +561 -0
  81. package/package.json +31 -0
  82. package/src/constants.ts +40 -0
  83. package/src/index.ts +2431 -0
  84. package/src/instructions/automation/auction.ts +55 -0
  85. package/src/instructions/automation/claimBounty.ts +69 -0
  86. package/src/instructions/automation/flashSwap.ts +104 -0
  87. package/src/instructions/automation/priceUpdate.ts +117 -0
  88. package/src/instructions/automation/rebalanceIntent.ts +181 -0
  89. package/src/instructions/management/addBounty.ts +55 -0
  90. package/src/instructions/management/admin.ts +72 -0
  91. package/src/instructions/management/claimFees.ts +129 -0
  92. package/src/instructions/management/createBasket.ts +138 -0
  93. package/src/instructions/management/edit.ts +602 -0
  94. package/src/instructions/management/luts.ts +157 -0
  95. package/src/instructions/pda.ts +151 -0
  96. package/src/instructions/user/deposit.ts +143 -0
  97. package/src/instructions/user/withdraw.ts +53 -0
  98. package/src/jup.ts +113 -0
  99. package/src/keeperMonitor.ts +585 -0
  100. package/src/layouts/basket.ts +233 -0
  101. package/src/layouts/config.ts +576 -0
  102. package/src/layouts/fraction.ts +164 -0
  103. package/src/layouts/intents/bounty.ts +35 -0
  104. package/src/layouts/intents/intent.ts +324 -0
  105. package/src/layouts/intents/rebalanceIntent.ts +306 -0
  106. package/src/layouts/lookupTable.ts +14 -0
  107. package/src/layouts/oracle.ts +157 -0
  108. package/src/states/basket.ts +527 -0
  109. package/src/states/config.ts +62 -0
  110. package/src/states/intents/intent.ts +311 -0
  111. package/src/states/intents/rebalanceIntent.ts +751 -0
  112. package/src/states/oracles/constants.ts +13 -0
  113. package/src/states/oracles/oracle.ts +212 -0
  114. package/src/states/oracles/pythOracle.ts +874 -0
  115. package/src/states/oracles/raydiumClmmOracle.ts +1193 -0
  116. package/src/states/oracles/raydiumCpmmOracle.ts +784 -0
  117. package/src/states/oracles/switchboardOracle.ts +0 -0
  118. package/src/states/withdrawBasketFees.ts +160 -0
  119. package/src/txUtils.ts +424 -0
  120. package/test.ts +609 -0
  121. package/tsconfig.json +101 -0
@@ -0,0 +1,479 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.computeTokenMintsHash = computeTokenMintsHash;
16
+ exports.addFieldsToBasket = addFieldsToBasket;
17
+ exports.addLutsToBaskets = addLutsToBaskets;
18
+ exports.fetchBasket = fetchBasket;
19
+ exports.fetchBasketsMultiple = fetchBasketsMultiple;
20
+ exports.fetchBaskets = fetchBaskets;
21
+ exports.fetchBasketOracleAccountInfos = fetchBasketOracleAccountInfos;
22
+ exports.loadBasketPrice = loadBasketPrice;
23
+ const decimal_js_1 = __importDefault(require("decimal.js"));
24
+ const crypto_1 = require("crypto");
25
+ const web3_js_1 = require("@solana/web3.js");
26
+ const constants_1 = require("../constants");
27
+ const basket_1 = require("../layouts/basket");
28
+ const oracle_1 = require("../layouts/oracle");
29
+ const txUtils_1 = require("../txUtils");
30
+ const oracle_2 = require("./oracles/oracle");
31
+ const pythOracle_1 = require("./oracles/pythOracle");
32
+ const raydiumClmmOracle_1 = require("./oracles/raydiumClmmOracle");
33
+ const fraction_1 = require("../layouts/fraction");
34
+ // export async function computeTokenMintsHash(mints: string[]): Promise<Buffer> {
35
+ // let hashBuffer = new Uint8Array(32)
36
+ // for (const mint of mints) {
37
+ // const mintBytes = new PublicKey(mint).toBytes()
38
+ // const combined = new Uint8Array(hashBuffer.length + mintBytes.length)
39
+ // combined.set(hashBuffer, 0)
40
+ // combined.set(mintBytes, hashBuffer.length)
41
+ // const hashArrayBuffer = await crypto.subtle.digest("SHA-256", combined)
42
+ // hashBuffer = new Uint8Array(hashArrayBuffer)
43
+ // }
44
+ // return Buffer.from(hashBuffer)
45
+ // }
46
+ function computeTokenMintsHash(mints) {
47
+ let hashBuffer = Buffer.alloc(32);
48
+ for (const mint of mints) {
49
+ hashBuffer = (0, crypto_1.createHash)('sha256').update(Buffer.concat([hashBuffer, new web3_js_1.PublicKey(mint).toBytes()])).digest();
50
+ }
51
+ return Array.from(hashBuffer);
52
+ }
53
+ function addFieldsToBasket(basket) {
54
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
55
+ let metadataSettings = basket.settings.metadata;
56
+ let metadata = {
57
+ symbol: Buffer.from(metadataSettings.symbol.slice(0, metadataSettings.symbolLength)).toString(),
58
+ name: Buffer.from(metadataSettings.name.slice(0, metadataSettings.nameLength)).toString(),
59
+ uri: Buffer.from(metadataSettings.uri.slice(0, metadataSettings.uriLength)).toString()
60
+ };
61
+ basket.composition = basket.composition.slice(0, basket.numTokens);
62
+ for (let i = 0; i < basket.numTokens; i++) {
63
+ let agg = basket.composition[i].oracleAggregator;
64
+ basket.composition[i].oracleAggregator.oracles = agg.oracles.slice(0, agg.numOracles);
65
+ for (let j = 0; j < agg.numOracles; j++) {
66
+ let lutIds = agg.oracles[j].accountsToLoadLutIds;
67
+ let lutIndices = agg.oracles[j].accountsToLoadLutIndices;
68
+ basket.composition[i].oracleAggregator.oracles[j].accountsToLoadLutIds =
69
+ lutIds.slice(0, agg.oracles[j].oracleSettings.numRequiredAccounts);
70
+ basket.composition[i].oracleAggregator.oracles[j].accountsToLoadLutIndices =
71
+ lutIndices.slice(0, agg.oracles[j].oracleSettings.numRequiredAccounts);
72
+ }
73
+ }
74
+ let totalManagers = constants_1.MAX_MANAGERS_PER_BASKET;
75
+ while (totalManagers > 0 && basket.settings.managers.managers[totalManagers - 1].equals(web3_js_1.PublicKey.default)) {
76
+ totalManagers--;
77
+ }
78
+ basket.settings.managers.managers = basket.settings.managers.managers.slice(0, totalManagers);
79
+ basket.settings.managers.managersWeightBps = basket.settings.managers.managersWeightBps.slice(0, totalManagers);
80
+ basket = Object.assign(Object.assign({}, basket), { metadata: metadata });
81
+ let creator_settings = {
82
+ creator: basket.settings.creator.toBase58(),
83
+ };
84
+ let manager_settings = {
85
+ managers: basket.settings.managers.managers.map((manager, i) => ({
86
+ pubkey: manager.toBase58(),
87
+ fee_split_weight_bps: basket.settings.managers.managersWeightBps[i],
88
+ authorities: {
89
+ managers: (((2 ** i) & basket.settings.managersAuthorityBitmask) != 0),
90
+ fees: (((2 ** i) & basket.settings.feesAuthorityBitmask) != 0),
91
+ schedule: (((2 ** i) & basket.settings.scheduleAuthorityBitmask) != 0),
92
+ automation: (((2 ** i) & basket.settings.automationAuthorityBitmask) != 0),
93
+ lp: (((2 ** i) & basket.settings.lpAuthorityBitmask) != 0),
94
+ metadata: (((2 ** i) & basket.settings.metadataAuthorityBitmask) != 0),
95
+ deposits: (((2 ** i) & basket.settings.depositsAuthorityBitmask) != 0),
96
+ force_rebalance: (((2 ** i) & basket.settings.forceRebalanceAuthorityBitmask) != 0),
97
+ custom_rebalance: (((2 ** i) & basket.settings.customRebalanceAuthorityBitmask) != 0),
98
+ add_token: (((2 ** i) & basket.settings.addTokenIntentAuthorityBitmask) != 0),
99
+ update_weights: (((2 ** i) & basket.settings.updateWeightsIntentAuthorityBitmask) != 0),
100
+ make_direct_swap: (((2 ** i) & basket.settings.makeDirectSwapIntentAuthorityBitmask) != 0),
101
+ },
102
+ })),
103
+ modification_delay: parseInt(basket.settings.managers.modificationDelay.toString()),
104
+ updated_at: parseInt(basket.settings.managersLastUpdateTimestamp.toString()),
105
+ };
106
+ let fee_settings = {
107
+ host_deposit_fee_bps: basket.settings.fees.hostDepositFeeBps,
108
+ host_withdraw_fee_bps: basket.settings.fees.hostWithdrawFeeBps,
109
+ host_management_fee_bps: basket.settings.fees.hostManagementFeeBps,
110
+ host_performance_fee_bps: basket.settings.fees.hostPerformanceFeeBps,
111
+ creator_deposit_fee_bps: basket.settings.fees.creatorDepositFeeBps,
112
+ creator_withdraw_fee_bps: basket.settings.fees.creatorWithdrawFeeBps,
113
+ creator_management_fee_bps: basket.settings.fees.creatorManagementFeeBps,
114
+ creator_performance_fee_bps: basket.settings.fees.creatorPerformanceFeeBps,
115
+ managers_deposit_fee_bps: basket.settings.fees.managersDepositFeeBps,
116
+ managers_withdraw_fee_bps: basket.settings.fees.managersWithdrawFeeBps,
117
+ managers_management_fee_bps: basket.settings.fees.managersManagementFeeBps,
118
+ managers_performance_fee_bps: basket.settings.fees.managersPerformanceFeeBps,
119
+ basket_deposit_fee_bps: basket.settings.fees.basketDepositFeeBps,
120
+ basket_withdraw_fee_bps: basket.settings.fees.basketWithdrawFeeBps,
121
+ modification_delay: parseInt(basket.settings.fees.modificationDelay.toString()),
122
+ updated_at: parseInt(basket.settings.feesLastUpdateTimestamp.toString()),
123
+ };
124
+ let schedule_settings = {
125
+ cycle_start_time: parseInt(basket.settings.schedule.cycleStartTime.toString()),
126
+ cycle_duration: parseInt(basket.settings.schedule.cycleDuration.toString()),
127
+ deposits_start: parseInt(basket.settings.schedule.depositsStart.toString()),
128
+ deposits_end: parseInt(basket.settings.schedule.depositsEnd.toString()),
129
+ automation_start: parseInt(basket.settings.schedule.automationStart.toString()),
130
+ automation_end: parseInt(basket.settings.schedule.automationEnd.toString()),
131
+ management_start: parseInt(basket.settings.schedule.managementStart.toString()),
132
+ management_end: parseInt(basket.settings.schedule.managementEnd.toString()),
133
+ modification_delay: parseInt(basket.settings.schedule.modificationDelay.toString()),
134
+ updated_at: parseInt(basket.settings.scheduleLastUpdateTimestamp.toString()),
135
+ };
136
+ let automation_settings = {
137
+ enabled: basket.settings.automation.allowAutomation == 1 ? true : false,
138
+ rebalance_slippage_threshold_bps: basket.settings.automation.rebalanceSlippageThresholdBps,
139
+ per_trade_rebalance_slippage_threshold_bps: basket.settings.automation.perTradeRebalanceSlippageThresholdBps,
140
+ rebalance_activation_threshold_abs_bps: basket.settings.automation.rebalanceActivationThresholdAbsBps,
141
+ rebalance_activation_threshold_rel_bps: basket.settings.automation.rebalanceActivationThresholdRelBps,
142
+ rebalance_activation_cooldown: parseInt(basket.settings.automation.rebalanceActivationCooldown.toString()),
143
+ modification_delay: parseInt(basket.settings.automation.modificationDelay.toString()),
144
+ updated_at: parseInt(basket.settings.automationLastUpdateTimestamp.toString()),
145
+ };
146
+ let lp_settings = {
147
+ enabled: basket.settings.lp.allowLp == 1 ? true : false,
148
+ lp_threshold_bps: basket.settings.lp.lpThresholdBps,
149
+ modification_delay: parseInt(basket.settings.lp.modificationDelay.toString()),
150
+ updated_at: parseInt(basket.settings.lpLastUpdateTimestamp.toString()),
151
+ };
152
+ let metadata_settings = {
153
+ symbol: metadata.symbol,
154
+ name: metadata.name,
155
+ uri: metadata.uri,
156
+ modification_delay: parseInt(basket.settings.metadata.modificationDelay.toString()),
157
+ updated_at: parseInt(basket.settings.metadataLastUpdateTimestamp.toString()),
158
+ };
159
+ let deposits_settings = {
160
+ enabled: basket.settings.depositsAreAllowed == 1 ? true : false,
161
+ };
162
+ let force_rebalance_settings = {
163
+ enabled: basket.settings.forceRebalanceIsAllowed == 1 ? true : false,
164
+ modification_delay: parseInt(basket.settings.forceRebalanceModificationDelay.toString()),
165
+ updated_at: parseInt(basket.settings.forceRebalanceLastUpdateTimestamp.toString()),
166
+ };
167
+ let custom_rebalance_settings = {
168
+ enabled: basket.settings.customRebalanceIsAllowed == 1 ? true : false,
169
+ modification_delay: parseInt(basket.settings.customRebalanceModificationDelay.toString()),
170
+ updated_at: parseInt(basket.settings.customRebalanceLastUpdateTimestamp.toString()),
171
+ };
172
+ let add_token_settings = {
173
+ modification_delay: parseInt(basket.settings.addTokenDelay.toString()),
174
+ updated_at: parseInt(basket.settings.addTokenLastUpdateTimestamp.toString()),
175
+ };
176
+ let update_weights_settings = {
177
+ modification_delay: parseInt(basket.settings.updateWeightsDelay.toString()),
178
+ updated_at: parseInt(basket.settings.updateWeightsLastUpdateTimestamp.toString()),
179
+ };
180
+ let make_direct_swap_settings = {
181
+ modification_delay: parseInt(basket.settings.makeDirectSwapDelay.toString()),
182
+ updated_at: parseInt(basket.settings.makeDirectSwapLastUpdateTimestamp.toString()),
183
+ };
184
+ let accumulated_fees = {
185
+ symmetry_fees: parseInt(basket.accumulatedFees.symmetryFees.toString()),
186
+ creator_fees: parseInt(basket.accumulatedFees.creatorFees.toString()),
187
+ host_fees: parseInt(basket.accumulatedFees.hostFees.toString()),
188
+ managers_fees: parseInt(basket.accumulatedFees.managersFees.toString()),
189
+ };
190
+ let lookup_tables = {
191
+ active: [
192
+ {
193
+ pubkey: basket.lookupTables.active[0].toBase58(),
194
+ contents: ((_b = (_a = basket.lutPubkeys) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.state.addresses.map(address => address.toBase58())) || [],
195
+ },
196
+ {
197
+ pubkey: basket.lookupTables.active[1].toBase58(),
198
+ contents: ((_d = (_c = basket.lutPubkeys) === null || _c === void 0 ? void 0 : _c[1]) === null || _d === void 0 ? void 0 : _d.state.addresses.map(address => address.toBase58())) || [],
199
+ },
200
+ ],
201
+ temp: [
202
+ {
203
+ pubkey: basket.lookupTables.temp[0].toBase58(),
204
+ contents: ((_f = (_e = basket.lutPubkeys) === null || _e === void 0 ? void 0 : _e[2]) === null || _f === void 0 ? void 0 : _f.state.addresses.map(address => address.toBase58())) || [],
205
+ },
206
+ {
207
+ pubkey: basket.lookupTables.temp[1].toBase58(),
208
+ contents: ((_h = (_g = basket.lutPubkeys) === null || _g === void 0 ? void 0 : _g[3]) === null || _h === void 0 ? void 0 : _h.state.addresses.map(address => address.toBase58())) || [],
209
+ },
210
+ ],
211
+ };
212
+ let composition = basket.composition.map(asset => ({
213
+ mint: asset.mint.toBase58(),
214
+ amount: parseInt(asset.amount.toString()),
215
+ weight: asset.weight,
216
+ active: asset.active == 1 ? true : false,
217
+ oracle_aggregator: {
218
+ num_oracles: asset.oracleAggregator.numOracles,
219
+ min_oracles_thresh: asset.oracleAggregator.minOraclesThresh,
220
+ oracles: asset.oracleAggregator.oracles.map(oracle => {
221
+ var _a;
222
+ return ({
223
+ oracle_settings: {
224
+ oracle_type: (_a = oracle_1.ORACLE_TYPES_STRINGS.get(oracle.oracleSettings.oracleType)) !== null && _a !== void 0 ? _a : "example",
225
+ account_lut_id: oracle.accountsToLoadLutIds[0],
226
+ account_lut_index: oracle.accountsToLoadLutIndices[0],
227
+ account: lookup_tables.active[oracle.accountsToLoadLutIds[0]].contents[oracle.accountsToLoadLutIndices[0]],
228
+ num_required_accounts: oracle.oracleSettings.numRequiredAccounts,
229
+ weight: oracle.oracleSettings.weight,
230
+ is_required: oracle.oracleSettings.isRequired == 1 ? true : false,
231
+ conf_thresh_bps: oracle.oracleSettings.confThreshBps,
232
+ volatility_thresh_bps: oracle.oracleSettings.volatilityThreshBps,
233
+ max_slippage_bps: oracle.oracleSettings.maxSlippageBps,
234
+ min_liquidity: parseInt(oracle.oracleSettings.minLiquidity.toString()),
235
+ staleness_thresh: parseInt(oracle.oracleSettings.stalenessThresh.toString()),
236
+ staleness_conf_rate_bps: oracle.oracleSettings.stalenessConfRateBps,
237
+ token_decimals: oracle.oracleSettings.tokenDecimals,
238
+ twap_seconds_ago: parseInt(oracle.oracleSettings.twapSecondsAgo.toString()),
239
+ twap_secondary_seconds_ago: parseInt(oracle.oracleSettings.twapSecondarySecondsAgo.toString()),
240
+ quote: oracle.oracleSettings.quote == 0 ? "usdc" : "wsol",
241
+ side: oracle.oracleSettings.side == 0 ? "base" : "quote",
242
+ },
243
+ accounts_to_load_lut_ids: oracle.accountsToLoadLutIds.map(id => id),
244
+ accounts_to_load_lut_indices: oracle.accountsToLoadLutIndices.map(index => index),
245
+ });
246
+ }),
247
+ min_conf_bps: asset.oracleAggregator.minConfBps,
248
+ conf_thresh_bps: asset.oracleAggregator.confThreshBps,
249
+ conf_multiplier: (0, fraction_1.fractionToDecimal)(asset.oracleAggregator.confMultiplier).toNumber(),
250
+ },
251
+ }));
252
+ let formatted = {
253
+ pubkey: basket.ownAddress.toBase58(),
254
+ name: ((_j = basket.metadata) === null || _j === void 0 ? void 0 : _j.name) || "",
255
+ symbol: ((_k = basket.metadata) === null || _k === void 0 ? void 0 : _k.symbol) || "",
256
+ uri: ((_l = basket.metadata) === null || _l === void 0 ? void 0 : _l.uri) || "",
257
+ version: basket.version,
258
+ own_address: basket.ownAddress.toBase58(),
259
+ mint: basket.mint.toBase58(),
260
+ supply_outstanding: parseInt(basket.supplyOutstanding.toString()),
261
+ creator: basket.settings.creator.toBase58(),
262
+ host: basket.settings.host.toBase58(),
263
+ basket_type: (_m = basket_1.BASKET_TYPES_STRINGS.get(basket.settings.basketType)) !== null && _m !== void 0 ? _m : "private",
264
+ bounty_mint: basket.settings.bountyMint.toBase58(),
265
+ bounty_balance: parseInt(basket.settings.bountyBalance.toString()),
266
+ start_price: (0, fraction_1.fractionToDecimal)(basket.settings.startPrice).toNumber(),
267
+ high_watermark: (0, fraction_1.fractionToDecimal)(basket.settings.highWaterMark).toNumber(),
268
+ active_rebalance: parseInt(basket.settings.activeRebalance.toString()),
269
+ active_withdraws: parseInt(basket.settings.activeWithdraws.toString()),
270
+ active_managements: parseInt(basket.settings.activeManagements.toString()),
271
+ last_automation_execution_timestamp: parseInt(basket.settings.lastAutomationExecutionTimestamp.toString()),
272
+ creator_settings: creator_settings,
273
+ manager_settings: manager_settings,
274
+ fee_settings: fee_settings,
275
+ schedule_settings: schedule_settings,
276
+ automation_settings: automation_settings,
277
+ lp_settings: lp_settings,
278
+ metadata_settings: metadata_settings,
279
+ deposits_settings: deposits_settings,
280
+ force_rebalance_settings: force_rebalance_settings,
281
+ custom_rebalance_settings: custom_rebalance_settings,
282
+ add_token_settings: add_token_settings,
283
+ update_weights_settings: update_weights_settings,
284
+ make_direct_swap_settings: make_direct_swap_settings,
285
+ accumulated_fees: accumulated_fees,
286
+ lookup_tables: lookup_tables,
287
+ composition: composition,
288
+ };
289
+ basket = Object.assign(Object.assign({}, basket), { formatted: formatted });
290
+ return basket;
291
+ }
292
+ function addLutsToBaskets(connection, baskets) {
293
+ return __awaiter(this, void 0, void 0, function* () {
294
+ let allLutPubkeys = [];
295
+ for (let basket of baskets)
296
+ allLutPubkeys.push([...basket.lookupTables.active, ...basket.lookupTables.temp]);
297
+ let allInfos = (yield (0, txUtils_1.getMultipleAddressLookupTableAccounts)(connection, [allLutPubkeys]))[0];
298
+ for (let i = 0; i < baskets.length; i++) {
299
+ baskets[i].lutPubkeys = allInfos[i];
300
+ }
301
+ return baskets;
302
+ });
303
+ }
304
+ function fetchBasket(connection, basketAddress) {
305
+ return __awaiter(this, void 0, void 0, function* () {
306
+ const basketAi = yield connection.getAccountInfo(basketAddress);
307
+ if (!basketAi)
308
+ throw new Error("Basket not found");
309
+ let basket = basket_1.BasketLayout.decode(basketAi.data.slice(8));
310
+ basket = (yield addLutsToBaskets(connection, [basket]))[0];
311
+ basket = addFieldsToBasket(basket);
312
+ return basket;
313
+ });
314
+ }
315
+ function fetchBasketsMultiple(connection, basketAddresses) {
316
+ return __awaiter(this, void 0, void 0, function* () {
317
+ let multipleAccountsInfo = yield (0, txUtils_1.getMultipleAccountsInfoBatched)(connection, basketAddresses);
318
+ let baskets = basketAddresses.map(address => {
319
+ let ai = multipleAccountsInfo.get(address.toBase58());
320
+ if (!ai)
321
+ return null;
322
+ return basket_1.BasketLayout.decode(ai.data.slice(8));
323
+ }).filter(basket => basket !== null);
324
+ baskets = yield addLutsToBaskets(connection, baskets);
325
+ baskets = baskets.map(basket => addFieldsToBasket(basket));
326
+ let basketsMap = new Map();
327
+ for (let basket of baskets) {
328
+ basketsMap.set(basket.ownAddress.toBase58(), basket);
329
+ }
330
+ return basketsMap;
331
+ });
332
+ }
333
+ function fetchBaskets(connection, filter) {
334
+ return __awaiter(this, void 0, void 0, function* () {
335
+ // Managers array begins at this offset in Basket account data.
336
+ const MANAGERS_ARRAY_OFFSET = 8 + 1 + 32 + 32 + 8 + 32 + 32 + 1 + 32 + 8 + 16 + 16 + 8 + 8 + 8 + 8;
337
+ const MANAGER_PUBKEY_SIZE = 32;
338
+ if ((filter === null || filter === void 0 ? void 0 : filter.type) === "manager") {
339
+ try {
340
+ const managerPubkey = new web3_js_1.PublicKey(filter.pubkey);
341
+ const managerBytes = Buffer.from(managerPubkey.toBytes());
342
+ const managerSliceLength = constants_1.MAX_MANAGERS_PER_BASKET * MANAGER_PUBKEY_SIZE;
343
+ // Request only manager bytes for each basket (single GPA), then filter locally.
344
+ const managerSlices = yield connection.getProgramAccounts(constants_1.BASKETS_V3_PROGRAM_ID, {
345
+ commitment: "confirmed",
346
+ filters: [{ dataSize: 8 + basket_1.BasketLayout.getSpan() }],
347
+ dataSlice: {
348
+ offset: MANAGERS_ARRAY_OFFSET,
349
+ length: managerSliceLength,
350
+ },
351
+ encoding: 'base64',
352
+ });
353
+ const matchedPubkeys = [];
354
+ for (const basketAccount of managerSlices) {
355
+ const managersData = basketAccount.account.data;
356
+ for (let i = 0; i < constants_1.MAX_MANAGERS_PER_BASKET; i++) {
357
+ const start = i * MANAGER_PUBKEY_SIZE;
358
+ const end = start + MANAGER_PUBKEY_SIZE;
359
+ if (managersData.subarray(start, end).equals(managerBytes)) {
360
+ matchedPubkeys.push(basketAccount.pubkey);
361
+ break;
362
+ }
363
+ }
364
+ }
365
+ if (matchedPubkeys.length === 0) {
366
+ return [];
367
+ }
368
+ const matchedAccountsInfo = yield (0, txUtils_1.getMultipleAccountsInfoBatched)(connection, matchedPubkeys);
369
+ const accounts = [];
370
+ for (const pubkey of matchedPubkeys) {
371
+ const accountInfo = matchedAccountsInfo.get(pubkey.toBase58());
372
+ if (accountInfo) {
373
+ accounts.push(accountInfo);
374
+ }
375
+ }
376
+ let baskets = accounts.map(account => basket_1.BasketLayout.decode(account.data.slice(8)));
377
+ baskets = yield addLutsToBaskets(connection, baskets);
378
+ baskets = baskets.map(basket => addFieldsToBasket(basket));
379
+ return baskets;
380
+ }
381
+ catch (error) {
382
+ // Fallback for RPC providers that might not support/serve this path reliably.
383
+ }
384
+ }
385
+ let filters = [{ dataSize: 8 + basket_1.BasketLayout.getSpan() }];
386
+ if ((filter === null || filter === void 0 ? void 0 : filter.type) === "creator" || (filter === null || filter === void 0 ? void 0 : filter.type) === "host") {
387
+ filters.push({
388
+ memcmp: {
389
+ offset: (filter === null || filter === void 0 ? void 0 : filter.type) === "creator" ? 8 + 1 + 32 + 32 + 8 : 8 + 1 + 32 + 32 + 8 + 32,
390
+ bytes: filter.pubkey
391
+ }
392
+ });
393
+ }
394
+ let accounts = yield connection.getProgramAccounts(constants_1.BASKETS_V3_PROGRAM_ID, {
395
+ commitment: "confirmed",
396
+ filters: filters,
397
+ encoding: 'base64'
398
+ });
399
+ let baskets = accounts.map(account => basket_1.BasketLayout.decode(account.account.data.slice(8)));
400
+ baskets = yield addLutsToBaskets(connection, baskets);
401
+ baskets = baskets.map(basket => addFieldsToBasket(basket));
402
+ return baskets;
403
+ });
404
+ }
405
+ function fetchBasketOracleAccountInfos(connection, basket) {
406
+ return __awaiter(this, void 0, void 0, function* () {
407
+ let allKeys = [];
408
+ for (let i = 0; i < basket.numTokens; i++) {
409
+ let agg = basket.composition[i].oracleAggregator;
410
+ for (let j = 0; j < agg.numOracles; j++) {
411
+ const oracleData = agg.oracles[j];
412
+ for (let k = 0; k < oracleData.oracleSettings.numRequiredAccounts; k++) {
413
+ const lutId = oracleData.accountsToLoadLutIds[k];
414
+ const lutIdx = oracleData.accountsToLoadLutIndices[k];
415
+ if (lutId === 0 && lutIdx === 0)
416
+ continue;
417
+ if (!basket.lutPubkeys)
418
+ continue;
419
+ allKeys.push(basket.lutPubkeys[lutId].state.addresses[lutIdx]);
420
+ }
421
+ }
422
+ }
423
+ allKeys.push(constants_1.PYTHNET_CUSTODY_PRICE_WSOL_ACCOUNT);
424
+ allKeys.push(constants_1.PYTHNET_CUSTODY_PRICE_USDC_ACCOUNT);
425
+ // load known accounts
426
+ const baseInfos = yield (0, txUtils_1.getMultipleAccountsInfoBatched)(connection, allKeys);
427
+ // derive and bind tick array PDAs for Raydium CLMM, then batch load them
428
+ const derivedTickArrayKeys = [];
429
+ for (let i = 0; i < basket.numTokens; i++) {
430
+ const agg = basket.composition[i].oracleAggregator;
431
+ for (let j = 0; j < agg.numOracles; j++) {
432
+ const oracleData = agg.oracles[j];
433
+ if (oracleData.oracleSettings.oracleType !== oracle_1.OracleType.RaydiumClmm)
434
+ continue;
435
+ const lutId = oracleData.accountsToLoadLutIds[0];
436
+ const lutIdx = oracleData.accountsToLoadLutIndices[0];
437
+ if (!basket.lutPubkeys)
438
+ continue;
439
+ const poolPk = basket.lutPubkeys[lutId].state.addresses[lutIdx];
440
+ const poolAi = baseInfos.get(poolPk.toBase58());
441
+ if (!poolAi)
442
+ continue;
443
+ const [poolState] = raydiumClmmOracle_1.PoolState.decode(poolAi.data, 8);
444
+ const currStart = (0, raydiumClmmOracle_1.getTickArrayStartIndexByTick)(poolState.tickCurrent, poolState.tickSpacing);
445
+ const prevStart = (0, raydiumClmmOracle_1.getNextTickArrayStartIndex)(currStart, poolState.tickSpacing, true);
446
+ const nextStart = (0, raydiumClmmOracle_1.getNextTickArrayStartIndex)(currStart, poolState.tickSpacing, false);
447
+ [prevStart, currStart, nextStart].forEach(start => derivedTickArrayKeys.push((0, raydiumClmmOracle_1.getPdaTickArrayAddress)(poolPk, start)));
448
+ }
449
+ }
450
+ let derivedInfos = new Map();
451
+ derivedInfos = yield (0, txUtils_1.getMultipleAccountsInfoBatched)(connection, derivedTickArrayKeys);
452
+ derivedInfos.forEach((v, k) => baseInfos.set(k, v));
453
+ return baseInfos;
454
+ });
455
+ }
456
+ function loadBasketPrice(basket, connection) {
457
+ return __awaiter(this, void 0, void 0, function* () {
458
+ let oracleAccountInfos = yield fetchBasketOracleAccountInfos(connection, basket);
459
+ let solPrice = pythOracle_1.PythOracle.fetch(oracle_1.PYTH_WSOL_ORACLE_SETTINGS, //@ts-ignore
460
+ [oracleAccountInfos.get(constants_1.PYTHNET_CUSTODY_PRICE_WSOL_ACCOUNT.toBase58())]);
461
+ let usdcPrice = pythOracle_1.PythOracle.fetch(oracle_1.PYTH_USDC_ORACLE_SETTINGS, //@ts-ignore
462
+ [oracleAccountInfos.get(constants_1.PYTHNET_CUSTODY_PRICE_USDC_ACCOUNT.toBase58())]);
463
+ let totalValue = new decimal_js_1.default(0);
464
+ for (let i = 0; i < basket.numTokens; i++) {
465
+ const oraclePrice = oracle_2.PriceAggregator.fetch(basket.composition[i].oracleAggregator, //@ts-ignore
466
+ [basket.lutPubkeys[0], basket.lutPubkeys[1]], oracleAccountInfos, solPrice, usdcPrice);
467
+ let amount = new decimal_js_1.default(basket.composition[i].amount.toString());
468
+ const value = oraclePrice.price.mul(amount);
469
+ basket.composition[i].price = oraclePrice;
470
+ basket.composition[i].value = value;
471
+ totalValue = totalValue.add(value);
472
+ }
473
+ basket.tvl = totalValue;
474
+ let supplyOutstanding = new decimal_js_1.default(basket.supplyOutstanding.toString());
475
+ if (supplyOutstanding.gt(new decimal_js_1.default(0)))
476
+ basket.price = totalValue.div(supplyOutstanding);
477
+ return basket;
478
+ });
479
+ }
@@ -0,0 +1,3 @@
1
+ import { Connection } from "@solana/web3.js";
2
+ import { GlobalConfig } from "../layouts/config";
3
+ export declare function fetchGlobalConfig(connection: Connection): Promise<GlobalConfig>;
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.fetchGlobalConfig = fetchGlobalConfig;
13
+ const config_1 = require("../layouts/config");
14
+ const pda_1 = require("../instructions/pda");
15
+ const fraction_1 = require("../layouts/fraction");
16
+ function fetchGlobalConfig(connection) {
17
+ return __awaiter(this, void 0, void 0, function* () {
18
+ var _a;
19
+ let globalConfig = (0, pda_1.getGlobalConfigPda)();
20
+ let globalConfigData = yield connection.getAccountInfo(globalConfig);
21
+ let globalConfigState = config_1.GlobalConfigLayout.decode((_a = globalConfigData === null || globalConfigData === void 0 ? void 0 : globalConfigData.data.slice(8)) !== null && _a !== void 0 ? _a : Buffer.alloc(0));
22
+ let formatted = {
23
+ pubkey: globalConfig.toBase58(),
24
+ admin: globalConfigState.admin.toBase58(),
25
+ owners: globalConfigState.owners.map(owner => owner.toBase58()),
26
+ total_number_of_baskets: parseInt(globalConfigState.totalNumberOfBaskets.toString()),
27
+ allow_interactions: globalConfigState.allowInteractions === 1,
28
+ allow_creation: globalConfigState.allowCreation === 1,
29
+ allow_management: globalConfigState.allowManagement === 1,
30
+ allow_automation: globalConfigState.allowAutomation === 1,
31
+ allow_deposits: globalConfigState.allowDeposits === 1,
32
+ allow_withdraws: globalConfigState.allowWithdraws === 1,
33
+ max_deposit_fee_bps: globalConfigState.maxDepositFeeBps,
34
+ max_withdraw_fee_bps: globalConfigState.maxWithdrawFeeBps,
35
+ max_management_fee_bps: globalConfigState.maxManagementFeeBps,
36
+ max_performance_fee_bps: globalConfigState.maxPerformanceFeeBps,
37
+ symmetry_fee_collector: globalConfigState.symmetryFeeCollector.toBase58(),
38
+ symmetry_deposit_fee_bps: globalConfigState.symmetryDepositFeeBps,
39
+ symmetry_deposit_fee_share_bps: globalConfigState.symmetryDepositFeeShareBps,
40
+ symmetry_withdraw_fee_bps: globalConfigState.symmetryWithdrawFeeBps,
41
+ symmetry_withdraw_fee_share_bps: globalConfigState.symmetryWithdrawFeeShareBps,
42
+ symmetry_management_fee_bps: globalConfigState.symmetryManagementFeeBps,
43
+ symmetry_management_fee_share_bps: globalConfigState.symmetryManagementFeeShareBps,
44
+ symmetry_performance_fee_bps: globalConfigState.symmetryPerformanceFeeBps,
45
+ symmetry_performance_fee_share_bps: globalConfigState.symmetryPerformanceFeeShareBps,
46
+ symmetry_trade_fee_bps: globalConfigState.symmetryTradeFeeBps,
47
+ symmetry_limit_order_fee_bps: globalConfigState.symmetryLimitOrderFeeBps,
48
+ bounty_mint: globalConfigState.bountyMint.toBase58(),
49
+ min_bounty_for_basket_automation: parseInt(globalConfigState.minBountyForBasketAutomation.toString()),
50
+ bounty_bond_amount: parseInt(globalConfigState.bountyBondAmount.toString()),
51
+ bounty_per_task: {
52
+ min_bounty: parseInt(globalConfigState.bountyPerTask.minBounty.toString()),
53
+ max_bounty: parseInt(globalConfigState.bountyPerTask.maxBounty.toString()),
54
+ min_bounty_until: parseInt(globalConfigState.bountyPerTask.minBountyUntil.toString()),
55
+ max_bounty_after: parseInt(globalConfigState.bountyPerTask.maxBountyAfter.toString()),
56
+ },
57
+ bounty_per_price_update_task_divisor: parseInt(globalConfigState.bountyPerPriceUpdateTaskDivisor.toString()),
58
+ min_remaining_value: (0, fraction_1.fractionToDecimal)(globalConfigState.minRemainingValue).toNumber(),
59
+ min_mint_ratio: (0, fraction_1.fractionToDecimal)(globalConfigState.minMintRatio).toNumber(),
60
+ apr_bps_per_year: globalConfigState.aprBpsPerYear,
61
+ rebalance_intent_lifetime: parseInt(globalConfigState.rebalanceIntentLifetime.toString()),
62
+ rebalance_auction_1_timeframe: parseInt(globalConfigState.rebalanceAuction1Timeframe.toString()),
63
+ rebalance_auction_2_timeframe: parseInt(globalConfigState.rebalanceAuction2Timeframe.toString()),
64
+ rebalance_auction_3_timeframe: parseInt(globalConfigState.rebalanceAuction3Timeframe.toString()),
65
+ price_update_delay_after_creation: parseInt(globalConfigState.priceUpdateDelayAfterCreation.toString()),
66
+ price_update_lifetime: parseInt(globalConfigState.priceUpdateLifetime.toString()),
67
+ price_update_reexecution_delay: parseInt(globalConfigState.priceUpdateReexecutionDelay.toString()),
68
+ };
69
+ return Object.assign(Object.assign({}, globalConfigState), { formatted: formatted });
70
+ });
71
+ }
@@ -0,0 +1,10 @@
1
+ import { Connection, PublicKey } from '@solana/web3.js';
2
+ import { Intent } from '../../layouts/intents/intent';
3
+ export declare function addFieldsToIntent(intent: Intent): Intent;
4
+ export declare function fetchIntent(connection: Connection, intentAddress: PublicKey): Promise<Intent>;
5
+ export declare function fetchIntentsMultiple(connection: Connection, intentAddresses: PublicKey[]): Promise<Map<string, Intent>>;
6
+ export interface IntentFilter {
7
+ type: "basket" | "manager";
8
+ pubkey: string;
9
+ }
10
+ export declare function fetchIntents(connection: Connection, filter?: IntentFilter): Promise<Intent[]>;