@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,154 @@
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.addFieldsToWithdrawBasketFees = addFieldsToWithdrawBasketFees;
13
+ exports.fetchWithdrawBasketFees = fetchWithdrawBasketFees;
14
+ exports.fetchWithdrawBasketFeesMultiple = fetchWithdrawBasketFeesMultiple;
15
+ exports.fetchWithdrawBasketFeesList = fetchWithdrawBasketFeesList;
16
+ const web3_js_1 = require("@solana/web3.js");
17
+ const constants_1 = require("../constants");
18
+ const basket_1 = require("../layouts/basket");
19
+ const txUtils_1 = require("../txUtils");
20
+ function addFieldsToWithdrawBasketFees(withdrawBasketFees) {
21
+ // Filter out default/empty owners
22
+ let numOwners = constants_1.MAX_MANAGERS_PER_BASKET;
23
+ while (numOwners > 0 && withdrawBasketFees.owners[numOwners - 1].equals(web3_js_1.PublicKey.default)) {
24
+ numOwners--;
25
+ }
26
+ withdrawBasketFees.owners = withdrawBasketFees.owners.slice(0, numOwners);
27
+ withdrawBasketFees.ownersWeights = withdrawBasketFees.ownersWeights.slice(0, numOwners);
28
+ // Filter out default/empty tokens
29
+ let numTokens = constants_1.MAX_SUPPORTED_TOKENS_PER_BASKET;
30
+ while (numTokens > 0 && withdrawBasketFees.accumulatedTokens[numTokens - 1].equals(web3_js_1.PublicKey.default)) {
31
+ numTokens--;
32
+ }
33
+ withdrawBasketFees.accumulatedTokens = withdrawBasketFees.accumulatedTokens.slice(0, numTokens);
34
+ withdrawBasketFees.accumulatedFees = withdrawBasketFees.accumulatedFees.slice(0, numTokens);
35
+ let formatted = {
36
+ pubkey: withdrawBasketFees.ownAddress.toBase58(),
37
+ basket: withdrawBasketFees.basket.toBase58(),
38
+ rent_payer: withdrawBasketFees.rentPayer.toBase58(),
39
+ owners: withdrawBasketFees.owners.map(owner => owner.toBase58()),
40
+ owners_weights: withdrawBasketFees.ownersWeights,
41
+ accumulated_tokens: withdrawBasketFees.accumulatedTokens.map(token => token.toBase58()),
42
+ accumulated_fees: withdrawBasketFees.accumulatedFees.map(fee => parseInt(fee.toString())),
43
+ };
44
+ withdrawBasketFees.formatted = formatted;
45
+ return withdrawBasketFees;
46
+ }
47
+ function fetchWithdrawBasketFees(connection, withdrawBasketFeesAddress) {
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ const accountInfo = yield connection.getAccountInfo(withdrawBasketFeesAddress);
50
+ if (!accountInfo)
51
+ throw new Error("WithdrawBasketFees account not found");
52
+ let withdrawBasketFees = basket_1.WithdrawBasketFeesLayout.decode(accountInfo.data.slice(8));
53
+ withdrawBasketFees.ownAddress = withdrawBasketFeesAddress;
54
+ withdrawBasketFees = addFieldsToWithdrawBasketFees(withdrawBasketFees);
55
+ return withdrawBasketFees;
56
+ });
57
+ }
58
+ function fetchWithdrawBasketFeesMultiple(connection, withdrawBasketFeesAddresses) {
59
+ return __awaiter(this, void 0, void 0, function* () {
60
+ let multipleAccountsInfo = yield (0, txUtils_1.getMultipleAccountsInfoBatched)(connection, withdrawBasketFeesAddresses);
61
+ let withdrawBasketFeesList = withdrawBasketFeesAddresses.map(address => {
62
+ let ai = multipleAccountsInfo.get(address.toBase58());
63
+ if (!ai)
64
+ return null;
65
+ let withdrawBasketFees = Object.assign(Object.assign({}, basket_1.WithdrawBasketFeesLayout.decode(ai.data.slice(8))), { ownAddress: address });
66
+ withdrawBasketFees = addFieldsToWithdrawBasketFees(withdrawBasketFees);
67
+ return withdrawBasketFees;
68
+ }).filter((item) => item !== null);
69
+ let withdrawBasketFeesMap = new Map();
70
+ for (let withdrawBasketFees of withdrawBasketFeesList) {
71
+ withdrawBasketFeesMap.set(withdrawBasketFees.ownAddress.toBase58(), withdrawBasketFees);
72
+ }
73
+ return withdrawBasketFeesMap;
74
+ });
75
+ }
76
+ function fetchWithdrawBasketFeesList(connection, filter) {
77
+ return __awaiter(this, void 0, void 0, function* () {
78
+ const MANAGERS_ARRAY_OFFSET = 8 + 32 + 32;
79
+ const MANAGER_PUBKEY_SIZE = 32;
80
+ if ((filter === null || filter === void 0 ? void 0 : filter.type) === "manager") {
81
+ try {
82
+ const managerPubkey = new web3_js_1.PublicKey(filter.pubkey);
83
+ const managerBytes = Buffer.from(managerPubkey.toBytes());
84
+ const managerSliceLength = constants_1.MAX_MANAGERS_PER_BASKET * MANAGER_PUBKEY_SIZE;
85
+ // Request only manager bytes for each basket (single GPA), then filter locally.
86
+ const managerSlices = yield connection.getProgramAccounts(constants_1.BASKETS_V3_PROGRAM_ID, {
87
+ commitment: "confirmed",
88
+ filters: [{ dataSize: 8 + basket_1.WithdrawBasketFeesLayout.getSpan() }],
89
+ dataSlice: {
90
+ offset: MANAGERS_ARRAY_OFFSET,
91
+ length: managerSliceLength,
92
+ },
93
+ encoding: 'base64',
94
+ });
95
+ const matchedPubkeys = [];
96
+ for (const basketAccount of managerSlices) {
97
+ const managersData = basketAccount.account.data;
98
+ for (let i = 0; i < constants_1.MAX_MANAGERS_PER_BASKET; i++) {
99
+ const start = i * MANAGER_PUBKEY_SIZE;
100
+ const end = start + MANAGER_PUBKEY_SIZE;
101
+ if (managersData.subarray(start, end).equals(managerBytes)) {
102
+ matchedPubkeys.push(basketAccount.pubkey);
103
+ break;
104
+ }
105
+ }
106
+ }
107
+ if (matchedPubkeys.length === 0)
108
+ return [];
109
+ const matchedAccountsInfo = yield (0, txUtils_1.getMultipleAccountsInfoBatched)(connection, matchedPubkeys);
110
+ let withdrawBasketFeesList = [];
111
+ for (let pubkey of matchedPubkeys) {
112
+ const accountInfo = matchedAccountsInfo.get(pubkey.toBase58());
113
+ if (!accountInfo)
114
+ continue;
115
+ let withdrawBasketFees = basket_1.WithdrawBasketFeesLayout.decode(accountInfo.data.slice(8));
116
+ withdrawBasketFees.ownAddress = pubkey;
117
+ withdrawBasketFees = addFieldsToWithdrawBasketFees(withdrawBasketFees);
118
+ withdrawBasketFeesList.push(withdrawBasketFees);
119
+ }
120
+ return withdrawBasketFeesList;
121
+ }
122
+ catch (error) {
123
+ // Fallback for RPC providers that might not support/serve this path reliably.
124
+ }
125
+ }
126
+ let filters = [{ dataSize: 8 + basket_1.WithdrawBasketFeesLayout.getSpan() }];
127
+ if ((filter === null || filter === void 0 ? void 0 : filter.type) === "creator" || (filter === null || filter === void 0 ? void 0 : filter.type) === "host" || (filter === null || filter === void 0 ? void 0 : filter.type) === "symmetry")
128
+ filters.push({
129
+ memcmp: {
130
+ offset: 8 + 32 + 32,
131
+ bytes: filter.pubkey
132
+ }
133
+ });
134
+ if ((filter === null || filter === void 0 ? void 0 : filter.type) === "basket")
135
+ filters.push({
136
+ memcmp: {
137
+ offset: 8,
138
+ bytes: filter.pubkey
139
+ }
140
+ });
141
+ let results = yield connection.getProgramAccounts(constants_1.BASKETS_V3_PROGRAM_ID, {
142
+ commitment: "confirmed",
143
+ filters: filters,
144
+ encoding: 'base64'
145
+ });
146
+ let withdrawBasketFeesList = results.map(account => {
147
+ let withdrawBasketFees = basket_1.WithdrawBasketFeesLayout.decode(account.account.data.slice(8));
148
+ withdrawBasketFees.ownAddress = account.pubkey;
149
+ withdrawBasketFees = addFieldsToWithdrawBasketFees(withdrawBasketFees);
150
+ return withdrawBasketFees;
151
+ });
152
+ return withdrawBasketFeesList;
153
+ });
154
+ }
@@ -0,0 +1,65 @@
1
+ import { AccountInfo, Transaction } from '@solana/web3.js';
2
+ import { AddressLookupTableAccount, Connection, Keypair, PublicKey, TransactionInstruction, VersionedTransaction } from '@solana/web3.js';
3
+ type TransactionSignature = string;
4
+ export interface Wallet {
5
+ signTransaction<T extends Transaction | VersionedTransaction>(tx: T): Promise<T>;
6
+ signAllTransactions<T extends Transaction | VersionedTransaction>(txs: T[]): Promise<T[]>;
7
+ publicKey: PublicKey;
8
+ /** Keypair of the configured payer (Node only) */
9
+ payer?: Keypair;
10
+ }
11
+ export declare function wrapWsolIxs(connection: Connection, wallet: PublicKey, amount: number): Promise<TransactionInstruction[]>;
12
+ export interface TxData {
13
+ payer: PublicKey;
14
+ instructions: TransactionInstruction[];
15
+ lookupTables: PublicKey[];
16
+ }
17
+ export interface TxBatchData {
18
+ batches: TxData[][];
19
+ }
20
+ export interface VersionedTxs {
21
+ blockhash: string;
22
+ lastValidBlockHeight: number;
23
+ batches: VersionedTransaction[][];
24
+ }
25
+ export interface TxPayloadIxAccountMeta {
26
+ pubkey: string;
27
+ is_signer: boolean;
28
+ is_writable: boolean;
29
+ }
30
+ export interface TxPayloadIx {
31
+ program_id: string;
32
+ accounts: TxPayloadIxAccountMeta[];
33
+ data: string;
34
+ }
35
+ export interface TxPayload {
36
+ tx_b64: string;
37
+ message_version: "0" | "legacy";
38
+ recent_blockhash: string;
39
+ payer: string;
40
+ lookup_tables: string[];
41
+ instructions: TxPayloadIx[];
42
+ }
43
+ export interface TxPayloadBatch {
44
+ transactions: TxPayload[];
45
+ }
46
+ export interface TxPayloadBatchSequence {
47
+ batches: TxPayloadBatch[];
48
+ }
49
+ export interface BasketCreationTx extends TxPayloadBatchSequence {
50
+ mint: string;
51
+ basket: string;
52
+ }
53
+ export declare function prepareTxPayloadBatchSequence(txBatchData: TxBatchData, versionedTxs?: VersionedTxs): TxPayloadBatchSequence;
54
+ export declare function delay(ms: number): Promise<void>;
55
+ export declare function getMultipleAccountsInfoBatched(connection: Connection, pubkeys: PublicKey[]): Promise<Map<string, AccountInfo<Buffer> | null>>;
56
+ export declare function getAddressLookupTableAccounts(connection: Connection, keys: PublicKey[]): Promise<Map<string, AddressLookupTableAccount>>;
57
+ export declare function getMultipleAddressLookupTableAccounts(connection: Connection, batches: PublicKey[][][]): Promise<AddressLookupTableAccount[][][]>;
58
+ export declare function compileVersionedTransaction(blockhash: string, addressLookupTableAccounts: AddressLookupTableAccount[], payerPubkey: PublicKey, ixs: TransactionInstruction[]): VersionedTransaction;
59
+ export declare function sendVersionedTransaction(connection: Connection, tx: VersionedTransaction, blockhash: string, lastValidBlockHeight: number, simulateTransactions: boolean): Promise<TransactionSignature>;
60
+ export declare function prepareVersionedTxs(connection: Connection, txBatchData: TxBatchData): Promise<VersionedTxs>;
61
+ export declare function sendVersionedTxs(connection: Connection, versionedTxs: VersionedTxs, simulateTransactions?: boolean): Promise<TransactionSignature[][]>;
62
+ export declare function signVersionedTxs(wallet: Wallet, versionedTxs: VersionedTxs): Promise<VersionedTxs>;
63
+ export declare function signTxPayloadBatchSequence(wallet: Wallet, txPayloadBatchSequence: TxPayloadBatchSequence): Promise<TxPayloadBatchSequence>;
64
+ export declare function sendTxPayloadBatchSequence(connection: Connection, txPayloadBatchSequence: TxPayloadBatchSequence, simulateTransactions?: boolean): Promise<TransactionSignature[][]>;
65
+ export {};
@@ -0,0 +1,306 @@
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.wrapWsolIxs = wrapWsolIxs;
13
+ exports.prepareTxPayloadBatchSequence = prepareTxPayloadBatchSequence;
14
+ exports.delay = delay;
15
+ exports.getMultipleAccountsInfoBatched = getMultipleAccountsInfoBatched;
16
+ exports.getAddressLookupTableAccounts = getAddressLookupTableAccounts;
17
+ exports.getMultipleAddressLookupTableAccounts = getMultipleAddressLookupTableAccounts;
18
+ exports.compileVersionedTransaction = compileVersionedTransaction;
19
+ exports.sendVersionedTransaction = sendVersionedTransaction;
20
+ exports.prepareVersionedTxs = prepareVersionedTxs;
21
+ exports.sendVersionedTxs = sendVersionedTxs;
22
+ exports.signVersionedTxs = signVersionedTxs;
23
+ exports.signTxPayloadBatchSequence = signTxPayloadBatchSequence;
24
+ exports.sendTxPayloadBatchSequence = sendTxPayloadBatchSequence;
25
+ const web3_js_1 = require("@solana/web3.js");
26
+ const web3_js_2 = require("@solana/web3.js");
27
+ const pda_1 = require("./instructions/pda");
28
+ const constants_1 = require("./constants");
29
+ const spl_token_1 = require("@solana/spl-token");
30
+ function wrapWsolIxs(connection, wallet, amount) {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ if (amount == 0)
33
+ return [];
34
+ let wsolIxs = [];
35
+ let wsolAta = (0, pda_1.getAta)(wallet, constants_1.MINTS["mainnet"].WSOL);
36
+ let wsolBalance = 0;
37
+ let accountExists = false;
38
+ try {
39
+ let info = yield connection.getTokenAccountBalance(wsolAta);
40
+ wsolBalance = parseInt(info.value.amount);
41
+ accountExists = wsolBalance >= 0;
42
+ }
43
+ catch (_a) { }
44
+ if (!accountExists)
45
+ wsolIxs.push((0, spl_token_1.createAssociatedTokenAccountIdempotentInstruction)(wallet, wsolAta, wallet, constants_1.MINTS["mainnet"].WSOL));
46
+ if (wsolBalance < amount)
47
+ wsolIxs.push(web3_js_1.SystemProgram.transfer({
48
+ fromPubkey: wallet,
49
+ toPubkey: wsolAta,
50
+ lamports: amount - wsolBalance,
51
+ }), (0, spl_token_1.createSyncNativeInstruction)(wsolAta));
52
+ return wsolIxs;
53
+ });
54
+ }
55
+ function prepareTxPayloadBatchSequence(txBatchData, versionedTxs) {
56
+ return {
57
+ batches: txBatchData.batches.map((txDatas, i) => {
58
+ return {
59
+ transactions: txDatas.map((txData, j) => {
60
+ return {
61
+ tx_b64: versionedTxs ? Buffer.from(versionedTxs.batches[i][j].serialize()).toString('base64') : "",
62
+ message_version: versionedTxs ? (versionedTxs.batches[i][j].message.version == 0 ? "0" : "legacy") : "0",
63
+ recent_blockhash: versionedTxs ? versionedTxs.batches[i][j].message.recentBlockhash : "",
64
+ payer: txData.payer.toBase58(),
65
+ lookup_tables: txData.lookupTables.map(lookupTable => lookupTable.toBase58()),
66
+ instructions: txData.instructions.map(instruction => ({
67
+ program_id: instruction.programId.toBase58(),
68
+ accounts: instruction.keys.map(account => ({
69
+ pubkey: account.pubkey.toBase58(),
70
+ is_signer: account.isSigner,
71
+ is_writable: account.isWritable,
72
+ })),
73
+ data: instruction.data.toString('base64'),
74
+ }))
75
+ };
76
+ })
77
+ };
78
+ }),
79
+ };
80
+ }
81
+ function delay(ms) {
82
+ return __awaiter(this, void 0, void 0, function* () {
83
+ return new Promise((resolve) => setTimeout(resolve, ms));
84
+ });
85
+ }
86
+ function getMultipleAccountsInfoBatched(connection, pubkeys) {
87
+ return __awaiter(this, void 0, void 0, function* () {
88
+ let uniquePubkeys = [];
89
+ for (const pubkey of pubkeys) {
90
+ if (uniquePubkeys.find(x => x.equals(pubkey)) === undefined) {
91
+ uniquePubkeys.push(pubkey);
92
+ }
93
+ }
94
+ let chunkSize = 100;
95
+ let promises = [];
96
+ for (let i = 0; i < uniquePubkeys.length; i += chunkSize) {
97
+ let chunk = uniquePubkeys.slice(i, i + chunkSize);
98
+ promises.push(connection.getMultipleAccountsInfo(chunk, "confirmed"));
99
+ }
100
+ let resolve = yield Promise.all(promises);
101
+ let infos = [];
102
+ resolve.forEach(result => {
103
+ infos.push(...result);
104
+ });
105
+ let allResults = new Map();
106
+ infos.forEach((info, idx) => {
107
+ allResults.set(uniquePubkeys[idx].toBase58(), info);
108
+ });
109
+ return allResults;
110
+ });
111
+ }
112
+ function getAddressLookupTableAccounts(connection, keys) {
113
+ return __awaiter(this, void 0, void 0, function* () {
114
+ const addressLookupTableAccountInfos = yield getMultipleAccountsInfoBatched(connection, keys);
115
+ let addressLookupTableAccounts = new Map();
116
+ for (const key of keys) {
117
+ const accountInfo = addressLookupTableAccountInfos.get(key.toBase58());
118
+ if (!key.equals(web3_js_2.PublicKey.default) && accountInfo) {
119
+ const addressLookupTableAccount = new web3_js_2.AddressLookupTableAccount({
120
+ key: new web3_js_2.PublicKey(key),
121
+ state: web3_js_2.AddressLookupTableAccount.deserialize(accountInfo.data),
122
+ });
123
+ addressLookupTableAccounts.set(key.toBase58(), addressLookupTableAccount);
124
+ }
125
+ }
126
+ return addressLookupTableAccounts;
127
+ });
128
+ }
129
+ ;
130
+ function getMultipleAddressLookupTableAccounts(connection, batches) {
131
+ return __awaiter(this, void 0, void 0, function* () {
132
+ let allLuts = [];
133
+ batches.forEach(batch => batch.forEach(luts => luts.forEach(lut => allLuts.push(lut))));
134
+ let addressLookupTableAccounts = yield getAddressLookupTableAccounts(connection, allLuts);
135
+ let result = [];
136
+ for (const batch of batches) {
137
+ let batchLuts = [];
138
+ for (const luts of batch) {
139
+ let batchLut = [];
140
+ for (const lut of luts) {
141
+ batchLut.push(addressLookupTableAccounts.get(lut.toBase58()));
142
+ }
143
+ batchLuts.push(batchLut);
144
+ }
145
+ result.push(batchLuts);
146
+ }
147
+ return result;
148
+ });
149
+ }
150
+ function compileVersionedTransaction(blockhash, addressLookupTableAccounts, payerPubkey, ixs) {
151
+ const txMessage = new web3_js_2.TransactionMessage({
152
+ payerKey: payerPubkey,
153
+ recentBlockhash: blockhash,
154
+ instructions: ixs,
155
+ });
156
+ let versionedTx = new web3_js_2.VersionedTransaction(txMessage.compileToV0Message(addressLookupTableAccounts));
157
+ try {
158
+ let tt = versionedTx.serialize().length;
159
+ if (tt > 1232) {
160
+ throw new Error("Transaction too large");
161
+ }
162
+ }
163
+ catch (e) {
164
+ throw new Error(e.message);
165
+ }
166
+ return versionedTx;
167
+ }
168
+ function sendVersionedTransaction(connection, tx, blockhash, lastValidBlockHeight, simulateTransactions) {
169
+ return __awaiter(this, void 0, void 0, function* () {
170
+ var _a;
171
+ const serializedTx = tx.serialize();
172
+ let txId;
173
+ if (simulateTransactions) {
174
+ txId = yield connection.sendRawTransaction(serializedTx, { preflightCommitment: "confirmed", maxRetries: 0 }).catch(e => {
175
+ console.log(e.message);
176
+ throw new Error("Simulation failed");
177
+ });
178
+ for (let i = 0; i < 4; i++) {
179
+ yield delay(3000).then(() => connection.sendRawTransaction(serializedTx, { preflightCommitment: "confirmed", maxRetries: 0 }).catch(() => { }));
180
+ }
181
+ console.log("Simulation txId:", txId);
182
+ }
183
+ else {
184
+ txId = yield connection.sendRawTransaction(serializedTx, { skipPreflight: true, maxRetries: 0 });
185
+ for (let i = 0; i < 4; i++) {
186
+ yield delay(3000).then(() => connection.sendRawTransaction(serializedTx, { preflightCommitment: "confirmed", maxRetries: 0 }).catch(() => { }));
187
+ }
188
+ console.log("Sending tx:", txId);
189
+ }
190
+ let confirmation = null;
191
+ let result = null;
192
+ connection.confirmTransaction({
193
+ blockhash,
194
+ lastValidBlockHeight,
195
+ signature: txId,
196
+ }, "confirmed").catch(() => null).then((res) => confirmation = res);
197
+ let iterations = 10;
198
+ while (confirmation === null && result === null && iterations > 0) {
199
+ yield delay(1000);
200
+ result = yield connection.getTransaction(txId, {
201
+ commitment: "confirmed",
202
+ maxSupportedTransactionVersion: 0,
203
+ }).catch(() => null);
204
+ if (result && result.meta && ((_a = result.meta) === null || _a === void 0 ? void 0 : _a.err)) {
205
+ console.log(result.meta.err);
206
+ throw new Error(txId);
207
+ }
208
+ iterations--;
209
+ }
210
+ if (result)
211
+ return txId;
212
+ //@ts-ignore
213
+ if (!confirmation || confirmation.value.err) {
214
+ //@ts-ignore
215
+ console.log(confirmation === null || confirmation === void 0 ? void 0 : confirmation.value.err);
216
+ throw new Error(txId);
217
+ }
218
+ return txId;
219
+ });
220
+ }
221
+ function prepareVersionedTxs(connection, txBatchData) {
222
+ return __awaiter(this, void 0, void 0, function* () {
223
+ const { batches } = txBatchData;
224
+ const { blockhash, lastValidBlockHeight } = yield connection.getLatestBlockhash("confirmed");
225
+ let multipleLookupTableAddresses = batches.map(batch => batch.map(txData => txData.lookupTables));
226
+ const multipleAddressLookupTableAccounts = yield getMultipleAddressLookupTableAccounts(connection, multipleLookupTableAddresses);
227
+ const batchTxs = batches.map((batch, batchIndex) => {
228
+ const txs = batch.map((txData, txIndex) => {
229
+ let tx = null;
230
+ try {
231
+ tx = compileVersionedTransaction(blockhash, multipleAddressLookupTableAccounts[batchIndex][txIndex], txData.payer, txData.instructions);
232
+ }
233
+ catch (e) {
234
+ console.log("Error signing tx:", e.message);
235
+ }
236
+ return tx;
237
+ }).filter(tx => tx !== null);
238
+ return txs;
239
+ });
240
+ return {
241
+ blockhash,
242
+ lastValidBlockHeight,
243
+ batches: batchTxs,
244
+ };
245
+ });
246
+ }
247
+ function sendVersionedTxs(connection_1, versionedTxs_1) {
248
+ return __awaiter(this, arguments, void 0, function* (connection, versionedTxs, simulateTransactions = false) {
249
+ const { batches, blockhash, lastValidBlockHeight } = versionedTxs;
250
+ let batchTxIds = [];
251
+ for (const batch of batches) {
252
+ let txIds = yield Promise.all(batch.map(tx => sendVersionedTransaction(connection, tx, blockhash, lastValidBlockHeight, simulateTransactions).catch(e => { console.log("Error sending tx:", e.message); return "Error"; })));
253
+ batchTxIds.push(txIds);
254
+ }
255
+ return batchTxIds;
256
+ });
257
+ }
258
+ function signVersionedTxs(wallet, versionedTxs) {
259
+ return __awaiter(this, void 0, void 0, function* () {
260
+ let txs = [];
261
+ for (const batch of versionedTxs.batches)
262
+ for (const tx of batch)
263
+ txs.push(tx);
264
+ txs = yield wallet.signAllTransactions(txs);
265
+ let pointer = 0;
266
+ for (let batchIndex = 0; batchIndex < versionedTxs.batches.length; batchIndex++)
267
+ for (let txIndex = 0; txIndex < versionedTxs.batches[batchIndex].length; txIndex++) {
268
+ versionedTxs.batches[batchIndex][txIndex] = txs[pointer];
269
+ pointer++;
270
+ }
271
+ return versionedTxs;
272
+ });
273
+ }
274
+ function signTxPayloadBatchSequence(wallet, txPayloadBatchSequence) {
275
+ return __awaiter(this, void 0, void 0, function* () {
276
+ let txs = [];
277
+ for (const batch of txPayloadBatchSequence.batches)
278
+ for (const tx of batch.transactions)
279
+ txs.push(web3_js_2.VersionedTransaction.deserialize(Buffer.from(tx.tx_b64, 'base64')));
280
+ txs = yield wallet.signAllTransactions(txs);
281
+ let pointer = 0;
282
+ for (let batchIndex = 0; batchIndex < txPayloadBatchSequence.batches.length; batchIndex++)
283
+ for (let txIndex = 0; txIndex < txPayloadBatchSequence.batches[batchIndex].transactions.length; txIndex++) {
284
+ txPayloadBatchSequence.batches[batchIndex].transactions[txIndex].tx_b64 = Buffer.from(txs[pointer].serialize()).toString('base64');
285
+ pointer++;
286
+ }
287
+ return txPayloadBatchSequence;
288
+ });
289
+ }
290
+ function sendTxPayloadBatchSequence(connection_1, txPayloadBatchSequence_1) {
291
+ return __awaiter(this, arguments, void 0, function* (connection, txPayloadBatchSequence, simulateTransactions = false) {
292
+ var _a, _b;
293
+ let txs = [];
294
+ for (const batch of txPayloadBatchSequence.batches) {
295
+ let batchTxs = [];
296
+ for (const tx of batch.transactions)
297
+ batchTxs.push(web3_js_2.VersionedTransaction.deserialize(Buffer.from(tx.tx_b64, 'base64')));
298
+ txs.push(batchTxs);
299
+ }
300
+ return yield sendVersionedTxs(connection, {
301
+ blockhash: (_b = (_a = txPayloadBatchSequence.batches[0].transactions[0]) === null || _a === void 0 ? void 0 : _a.recent_blockhash) !== null && _b !== void 0 ? _b : "",
302
+ lastValidBlockHeight: 0,
303
+ batches: txs,
304
+ }, simulateTransactions);
305
+ });
306
+ }
package/dist/test.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};