@symmetry-hq/temp-v3-sdk 0.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.
- package/dist/idl/idl.d.ts +8 -0
- package/dist/idl/idl.js +4958 -0
- package/dist/idl/types.d.ts +4955 -0
- package/dist/idl/types.js +2 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +60 -0
- package/dist/layouts/basket.d.ts +42 -0
- package/dist/layouts/basket.js +43 -0
- package/dist/layouts/config.d.ts +97 -0
- package/dist/layouts/config.js +102 -0
- package/dist/layouts/fraction.d.ts +6 -0
- package/dist/layouts/fraction.js +9 -0
- package/dist/layouts/oracle.d.ts +36 -0
- package/dist/layouts/oracle.js +37 -0
- package/dist/src/constants.d.ts +15 -0
- package/dist/src/constants.js +19 -0
- package/dist/src/idl/idl.d.ts +8 -0
- package/dist/src/idl/idl.js +4958 -0
- package/dist/src/idl/types.d.ts +4955 -0
- package/dist/src/idl/types.js +2 -0
- package/dist/src/index.d.ts +53 -0
- package/dist/src/index.js +199 -0
- package/dist/src/instructions/accounts.d.ts +27 -0
- package/dist/src/instructions/accounts.js +110 -0
- package/dist/src/instructions/auction.d.ts +7 -0
- package/dist/src/instructions/auction.js +43 -0
- package/dist/src/instructions/automation/auction.d.ts +6 -0
- package/dist/src/instructions/automation/auction.js +40 -0
- package/dist/src/instructions/automation/claimBounty.d.ts +12 -0
- package/dist/src/instructions/automation/claimBounty.js +44 -0
- package/dist/src/instructions/automation/priceUpdate.d.ts +15 -0
- package/dist/src/instructions/automation/priceUpdate.js +47 -0
- package/dist/src/instructions/automation/rebalanceSwap.d.ts +10 -0
- package/dist/src/instructions/automation/rebalanceSwap.js +42 -0
- package/dist/src/instructions/basket.d.ts +120 -0
- package/dist/src/instructions/basket.js +622 -0
- package/dist/src/instructions/bounty.d.ts +18 -0
- package/dist/src/instructions/bounty.js +81 -0
- package/dist/src/instructions/fee.d.ts +8 -0
- package/dist/src/instructions/fee.js +46 -0
- package/dist/src/instructions/globalConfig.d.ts +11 -0
- package/dist/src/instructions/globalConfig.js +43 -0
- package/dist/src/instructions/luts.d.ts +33 -0
- package/dist/src/instructions/luts.js +91 -0
- package/dist/src/instructions/management/addBounty.d.ts +7 -0
- package/dist/src/instructions/management/addBounty.js +39 -0
- package/dist/src/instructions/management/admin.d.ts +9 -0
- package/dist/src/instructions/management/admin.js +43 -0
- package/dist/src/instructions/management/claimFees.d.ts +7 -0
- package/dist/src/instructions/management/claimFees.js +47 -0
- package/dist/src/instructions/management/createBasket.d.ts +22 -0
- package/dist/src/instructions/management/createBasket.js +101 -0
- package/dist/src/instructions/management/edit.d.ts +34 -0
- package/dist/src/instructions/management/edit.js +192 -0
- package/dist/src/instructions/management/luts.d.ts +29 -0
- package/dist/src/instructions/management/luts.js +88 -0
- package/dist/src/instructions/pda.d.ts +26 -0
- package/dist/src/instructions/pda.js +110 -0
- package/dist/src/instructions/price.d.ts +17 -0
- package/dist/src/instructions/price.js +47 -0
- package/dist/src/instructions/user/deposit.d.ts +32 -0
- package/dist/src/instructions/user/deposit.js +168 -0
- package/dist/src/instructions/user/withdraw.d.ts +16 -0
- package/dist/src/instructions/user/withdraw.js +82 -0
- package/dist/src/layouts/basket.d.ts +41 -0
- package/dist/src/layouts/basket.js +43 -0
- package/dist/src/layouts/config.d.ts +133 -0
- package/dist/src/layouts/config.js +137 -0
- package/dist/src/layouts/fraction.d.ts +6 -0
- package/dist/src/layouts/fraction.js +9 -0
- package/dist/src/layouts/intents/bounty.d.ts +18 -0
- package/dist/src/layouts/intents/bounty.js +19 -0
- package/dist/src/layouts/intents/intent.d.ts +101 -0
- package/dist/src/layouts/intents/intent.js +113 -0
- package/dist/src/layouts/intents/rebalanceIntent.d.ts +56 -0
- package/dist/src/layouts/intents/rebalanceIntent.js +63 -0
- package/dist/src/layouts/lookupTable.d.ts +7 -0
- package/dist/src/layouts/lookupTable.js +10 -0
- package/dist/src/layouts/oracle.d.ts +42 -0
- package/dist/src/layouts/oracle.js +43 -0
- package/dist/src/states/basket.d.ts +8 -0
- package/dist/src/states/basket.js +54 -0
- package/dist/src/states/intents/intent.d.ts +14 -0
- package/dist/src/states/intents/intent.js +90 -0
- package/dist/src/states/intents/rebalanceIntent.d.ts +8 -0
- package/dist/src/states/intents/rebalanceIntent.js +54 -0
- package/dist/src/states/oracles/clmm_oracle.d.ts +178 -0
- package/dist/src/states/oracles/clmm_oracle.js +546 -0
- package/dist/src/states/oracles/constants.d.ts +8 -0
- package/dist/src/states/oracles/constants.js +12 -0
- package/dist/src/states/oracles/oracle.d.ts +60 -0
- package/dist/src/states/oracles/oracle.js +237 -0
- package/dist/src/states/oracles/pythOracle.d.ts +39 -0
- package/dist/src/states/oracles/pythOracle.js +202 -0
- package/dist/src/states/oracles/pyth_oracle.d.ts +39 -0
- package/dist/src/states/oracles/pyth_oracle.js +202 -0
- package/dist/src/states/oracles/raydiumClmmOracle.d.ts +178 -0
- package/dist/src/states/oracles/raydiumClmmOracle.js +546 -0
- package/dist/src/states/oracles/raydiumCpmmOracle.d.ts +139 -0
- package/dist/src/states/oracles/raydiumCpmmOracle.js +420 -0
- package/dist/src/states/oracles/raydium_cpmm_oracle.d.ts +139 -0
- package/dist/src/states/oracles/raydium_cpmm_oracle.js +420 -0
- package/dist/src/states/oracles/switchboardOracle.d.ts +0 -0
- package/dist/src/states/oracles/switchboardOracle.js +1 -0
- package/dist/src/states/oracles/switchboard_oracle.d.ts +0 -0
- package/dist/src/states/oracles/switchboard_oracle.js +1 -0
- package/dist/src/txUtils.d.ts +26 -0
- package/dist/src/txUtils.js +183 -0
- package/dist/states/basket.d.ts +8 -0
- package/dist/states/basket.js +57 -0
- package/dist/test.d.ts +1 -0
- package/dist/test.js +39 -0
- package/package.json +30 -0
- package/src/constants.ts +24 -0
- package/src/index.ts +260 -0
- package/src/instructions/automation/auction.ts +55 -0
- package/src/instructions/automation/claimBounty.ts +69 -0
- package/src/instructions/automation/priceUpdate.ts +73 -0
- package/src/instructions/automation/rebalanceSwap.ts +60 -0
- package/src/instructions/management/addBounty.ts +56 -0
- package/src/instructions/management/admin.ts +65 -0
- package/src/instructions/management/claimFees.ts +59 -0
- package/src/instructions/management/createBasket.ts +148 -0
- package/src/instructions/management/edit.ts +255 -0
- package/src/instructions/management/luts.ts +134 -0
- package/src/instructions/pda.ts +160 -0
- package/src/instructions/user/deposit.ts +237 -0
- package/src/instructions/user/withdraw.ts +130 -0
- package/src/layouts/basket.ts +82 -0
- package/src/layouts/config.ts +301 -0
- package/src/layouts/fraction.ts +12 -0
- package/src/layouts/intents/bounty.ts +35 -0
- package/src/layouts/intents/intent.ts +204 -0
- package/src/layouts/intents/rebalanceIntent.ts +111 -0
- package/src/layouts/lookupTable.ts +14 -0
- package/src/layouts/oracle.ts +96 -0
- package/src/states/basket.ts +56 -0
- package/src/states/intents/intent.ts +107 -0
- package/src/states/intents/rebalanceIntent.ts +57 -0
- package/src/states/oracles/constants.ts +13 -0
- package/src/states/oracles/oracle.ts +260 -0
- package/src/states/oracles/pythOracle.ts +270 -0
- package/src/states/oracles/raydiumClmmOracle.ts +812 -0
- package/src/states/oracles/raydiumCpmmOracle.ts +614 -0
- package/src/states/oracles/switchboardOracle.ts +0 -0
- package/src/txUtils.ts +250 -0
- package/test.ts +30 -0
- package/tsconfig.json +101 -0
|
@@ -0,0 +1,57 @@
|
|
|
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.fetchBasket = fetchBasket;
|
|
13
|
+
exports.fetchBaskets = fetchBaskets;
|
|
14
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
15
|
+
const basket_1 = require("../layouts/basket");
|
|
16
|
+
const idl_1 = require("../idl/idl");
|
|
17
|
+
function fetchBasket(connection, basketAddress) {
|
|
18
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
19
|
+
const basket = yield connection.getAccountInfo(basketAddress);
|
|
20
|
+
if (!basket) {
|
|
21
|
+
throw new Error("Basket not found");
|
|
22
|
+
}
|
|
23
|
+
return basket_1.BasketLayout.decode(basket.data);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function fetchBaskets(connection, filters) {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
console.log(basket_1.BasketLayout.getSpan());
|
|
29
|
+
console.log(basket_1.LookupTablesLayout.getSpan());
|
|
30
|
+
console.log(basket_1.AssetLayout.getSpan());
|
|
31
|
+
let accountFilters = [
|
|
32
|
+
{ dataSize: 8 + basket_1.BasketLayout.getSpan() },
|
|
33
|
+
];
|
|
34
|
+
for (const filter of filters) {
|
|
35
|
+
if (filter.filterType === "host") {
|
|
36
|
+
accountFilters.push({ memcmp: {
|
|
37
|
+
offset: 8 + 1 + 16 + 32 + 32 + 8 + 16 + 8,
|
|
38
|
+
bytes: filter.filterValue.toBase58()
|
|
39
|
+
} });
|
|
40
|
+
}
|
|
41
|
+
else if (filter.filterType === "creator") {
|
|
42
|
+
accountFilters.push({ memcmp: {
|
|
43
|
+
offset: 8 + 1 + 16 + 32 + 32 + 8 + 16 + 8 + 32,
|
|
44
|
+
bytes: filter.filterValue.toBase58()
|
|
45
|
+
} });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const accounts = yield connection
|
|
49
|
+
.getProgramAccounts(new web3_js_1.PublicKey(idl_1.IDL.address), {
|
|
50
|
+
commitment: "confirmed",
|
|
51
|
+
filters: accountFilters,
|
|
52
|
+
encoding: 'base64'
|
|
53
|
+
});
|
|
54
|
+
const baskets = accounts.map(account => basket_1.BasketLayout.decode(account.account.data.slice(8)));
|
|
55
|
+
return baskets;
|
|
56
|
+
});
|
|
57
|
+
}
|
package/dist/test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/test.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
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
|
+
const web3_js_1 = require("@solana/web3.js");
|
|
13
|
+
const src_1 = require("./src");
|
|
14
|
+
const anchor_1 = require("@coral-xyz/anchor");
|
|
15
|
+
let connection = new web3_js_1.Connection("https://api.devnet.solana.com");
|
|
16
|
+
function testStates() {
|
|
17
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
18
|
+
let sdk = new src_1.BasketsSdk({
|
|
19
|
+
connection: connection,
|
|
20
|
+
});
|
|
21
|
+
console.log("SDK created");
|
|
22
|
+
let x = yield sdk.createBasketTx({
|
|
23
|
+
creator: web3_js_1.PublicKey.default,
|
|
24
|
+
host: web3_js_1.PublicKey.default,
|
|
25
|
+
startPrice: { exponent: new anchor_1.BN(1), numerator: new anchor_1.BN(1) },
|
|
26
|
+
hostFees: { hostDepositFeeBps: 0, hostManagementFeeBps: 0, hostPerformanceFeeBps: 0 },
|
|
27
|
+
metadataParams: { name: "Test Basket", symbol: "TB", uri: "https://test.com" },
|
|
28
|
+
metadataModificationDelay: new anchor_1.BN(0),
|
|
29
|
+
});
|
|
30
|
+
console.log(x);
|
|
31
|
+
let baskets = yield sdk.fetchAllBaskets();
|
|
32
|
+
console.log(baskets.map(basket => basket.ownAddress.toBase58()));
|
|
33
|
+
let intents = yield sdk.fetchAllIntents();
|
|
34
|
+
console.log(intents.map(intent => intent.manager.toBase58()));
|
|
35
|
+
let rebalanceIntents = yield sdk.fetchAllRebalanceIntents();
|
|
36
|
+
console.log(rebalanceIntents.map(rebalanceIntent => rebalanceIntent.owner.toBase58()));
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
testStates();
|
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@symmetry-hq/temp-v3-sdk",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Symmetry Baskets V3 SDK",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"prepare": "npm run build",
|
|
9
|
+
"build": "tsc",
|
|
10
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"symmetry",
|
|
14
|
+
"baskets",
|
|
15
|
+
"sdk"
|
|
16
|
+
],
|
|
17
|
+
"author": "Sandstorm",
|
|
18
|
+
"license": "ISC",
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"@coral-xyz/anchor": "^0.31.1",
|
|
21
|
+
"@coral-xyz/borsh": "^0.31.1",
|
|
22
|
+
"@metaplex-foundation/js": "^0.20.1",
|
|
23
|
+
"@pythnetwork/hermes-client": "^2.1.0",
|
|
24
|
+
"@pythnetwork/pyth-solana-receiver": "^0.13.0",
|
|
25
|
+
"@solana/spl-token": "^0.4.14",
|
|
26
|
+
"@solana/web3.js": "^1.98.4",
|
|
27
|
+
"decimal.js": "^10.6.0",
|
|
28
|
+
"uuid": "^13.0.0"
|
|
29
|
+
}
|
|
30
|
+
}
|
package/src/constants.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { BN } from '@coral-xyz/anchor';
|
|
2
|
+
import { PublicKey } from '@solana/web3.js';
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
export const BASKETS_V3_PROGRAM_ID = new PublicKey("BASKT7aKd8n7ibpUbwLP3Wiyxyi3yoiXsxBk4Hpumate");
|
|
6
|
+
|
|
7
|
+
export const METADATA_PROGRAM_ID = new PublicKey("metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s");
|
|
8
|
+
export const ADDRESS_LOOKUP_TABLE_PROGRAM_ID = new PublicKey("AddressLookupTab1e1111111111111111111111111");
|
|
9
|
+
export const RENT_SYSVAR_ID = new PublicKey("SysvarRent111111111111111111111111111111111");
|
|
10
|
+
|
|
11
|
+
export const WSOL_MINT = new PublicKey("So11111111111111111111111111111111111111112");
|
|
12
|
+
// export const USDC_MINT = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");
|
|
13
|
+
export const USDC_MINT = new PublicKey("USDCoctVLVnvTXBEuP9s8hntucdJokbo17RwHuNXemT");
|
|
14
|
+
export const PYTH_SOL_ACCOUNT = new PublicKey("7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE");
|
|
15
|
+
export const PYTH_USDC_ACCOUNT = new PublicKey("Dpw1EAVrSB1ibxiDQyTAW6Zip3J4Btk2x4SgApQCeFbX");
|
|
16
|
+
|
|
17
|
+
export const BOUNTY_MINT = new PublicKey("49hY35FvJ8KimFrkGL1X89GSve1C1ZVoLPeQBUHXCouy");
|
|
18
|
+
|
|
19
|
+
export const INTENT_TASK_DATA_SIZE = 600;
|
|
20
|
+
export const MAX_MANAGERS_PER_BASKET = 10;
|
|
21
|
+
|
|
22
|
+
export const MAX_SUPPORTED_TOKENS_PER_BASKET: number = 100;
|
|
23
|
+
export const MAX_ORACLES_PER_TOKEN: number = 4;
|
|
24
|
+
export const MAX_EXTRA_DATA_PER_ORACLE: number = 4;
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { AnchorProvider, BN, Program, Wallet } from '@coral-xyz/anchor';
|
|
2
|
+
import { Connection, Keypair, PublicKey, TransactionSignature } from '@solana/web3.js';
|
|
3
|
+
|
|
4
|
+
import { BOUNTY_MINT } from './constants';
|
|
5
|
+
import {
|
|
6
|
+
createBasketIx, createBasketStateAccountIx, resizeBasketStateIx
|
|
7
|
+
} from './instructions/management/createBasket';
|
|
8
|
+
import { createEditBasketIntentIx, editBasketIx } from './instructions/management/edit';
|
|
9
|
+
import {
|
|
10
|
+
getBasketState, getBasketTokenMintPda, getIntentPda, getLookupTableAccount, getMetadataAccount,
|
|
11
|
+
getRandomSeed
|
|
12
|
+
} from './instructions/pda';
|
|
13
|
+
import { Basket } from './layouts/basket';
|
|
14
|
+
import { Fraction } from './layouts/fraction';
|
|
15
|
+
import { EditData, HostFees, Intent, MetadataParams, TaskType } from './layouts/intents/intent';
|
|
16
|
+
import { RebalanceIntent } from './layouts/intents/rebalanceIntent';
|
|
17
|
+
import { fetchBasket, fetchBaskets } from './states/basket';
|
|
18
|
+
import { fetchIntents } from './states/intents/intent';
|
|
19
|
+
import { fetchRebalanceIntents } from './states/intents/rebalanceIntent';
|
|
20
|
+
import { prepareV0Transactions, sendV0Transactions, VersionedTxs } from './txUtils';
|
|
21
|
+
|
|
22
|
+
export const COMPUTE_UNITS = 1_000_000;
|
|
23
|
+
export const PRIORITY_FEE = 100_000;
|
|
24
|
+
export const JUPITER_API_KEY = "https://quote-api.jup.ag/v6/";
|
|
25
|
+
export const MAX_JUPITER_ACCOUNTS = 35;
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
export class BasketsSdk {
|
|
29
|
+
|
|
30
|
+
private sdkParams: {
|
|
31
|
+
payer: PublicKey,
|
|
32
|
+
connection: Connection,
|
|
33
|
+
priorityFee: number,
|
|
34
|
+
jupiterApiKey: string;
|
|
35
|
+
maxAllowedAccounts: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
constructor(params: {
|
|
39
|
+
connection: Connection,
|
|
40
|
+
payer?: PublicKey,
|
|
41
|
+
priorityFee?: number,
|
|
42
|
+
jupiterApiKey?: string,
|
|
43
|
+
maxAllowedAccounts?: number,
|
|
44
|
+
}) {
|
|
45
|
+
this.sdkParams = {
|
|
46
|
+
connection: params.connection,
|
|
47
|
+
payer: params.payer ?? Keypair.generate().publicKey,
|
|
48
|
+
priorityFee: params.priorityFee ?? PRIORITY_FEE,
|
|
49
|
+
jupiterApiKey: params.jupiterApiKey ?? JUPITER_API_KEY,
|
|
50
|
+
maxAllowedAccounts: params.maxAllowedAccounts ?? MAX_JUPITER_ACCOUNTS,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
async setPayer(payer: PublicKey) {
|
|
55
|
+
this.sdkParams.payer = payer;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async getBasket(params: {
|
|
59
|
+
basket: PublicKey;
|
|
60
|
+
}): Promise<Basket> {
|
|
61
|
+
const basketState = await fetchBasket(this.sdkParams.connection, params.basket);
|
|
62
|
+
return basketState;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async fetchAllBaskets(): Promise<Basket[]> {
|
|
66
|
+
const baskets = await fetchBaskets(this.sdkParams.connection, []);
|
|
67
|
+
return baskets;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async fetchAllIntents(): Promise<Intent[]> {
|
|
71
|
+
const intents = await fetchIntents(this.sdkParams.connection, []);
|
|
72
|
+
return intents;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async fetchAllRebalanceIntents(): Promise<RebalanceIntent[]> {
|
|
76
|
+
const rebalanceIntents = await fetchRebalanceIntents(this.sdkParams.connection, []);
|
|
77
|
+
return rebalanceIntents;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async createBasketTx(params: {
|
|
81
|
+
creator: PublicKey,
|
|
82
|
+
host: PublicKey,
|
|
83
|
+
startPrice: Fraction,
|
|
84
|
+
hostFees: HostFees,
|
|
85
|
+
metadataParams: MetadataParams,
|
|
86
|
+
metadataModificationDelay: BN,
|
|
87
|
+
}): Promise<VersionedTxs> {
|
|
88
|
+
const {
|
|
89
|
+
creator,
|
|
90
|
+
host,
|
|
91
|
+
startPrice,
|
|
92
|
+
hostFees,
|
|
93
|
+
metadataParams,
|
|
94
|
+
metadataModificationDelay
|
|
95
|
+
} = params;
|
|
96
|
+
|
|
97
|
+
// generate random seed
|
|
98
|
+
const basketSeeds = getRandomSeed();
|
|
99
|
+
let basket = getBasketState(basketSeeds);
|
|
100
|
+
const slot = await this.sdkParams.connection.getSlot();
|
|
101
|
+
|
|
102
|
+
let ix = createBasketIx({
|
|
103
|
+
basket,
|
|
104
|
+
seed: basketSeeds,
|
|
105
|
+
slot,
|
|
106
|
+
creator,
|
|
107
|
+
host,
|
|
108
|
+
startPrice,
|
|
109
|
+
hostFees,
|
|
110
|
+
metadataParams,
|
|
111
|
+
metadataModificationDelay
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
let preIx = createBasketStateAccountIx({
|
|
115
|
+
creator,
|
|
116
|
+
seed: basketSeeds,
|
|
117
|
+
basket
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
let preIx2 = resizeBasketStateIx({
|
|
121
|
+
basket
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
let vtxs = await prepareV0Transactions({
|
|
125
|
+
connection: this.sdkParams.connection,
|
|
126
|
+
payer: creator,
|
|
127
|
+
priorityFee: this.sdkParams.priorityFee ?? 1000000,
|
|
128
|
+
multipleIxs: [[preIx, preIx2, preIx2, ix]],
|
|
129
|
+
multipleLookupTableAddresses: [],
|
|
130
|
+
signers: [[]],
|
|
131
|
+
batches: [1],
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
return vtxs;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
async createEditBasketIntentTx(params: {
|
|
139
|
+
manager: PublicKey,
|
|
140
|
+
basket: Basket,
|
|
141
|
+
editType: TaskType,
|
|
142
|
+
editData: EditData,
|
|
143
|
+
useBounty: number,
|
|
144
|
+
}): Promise<VersionedTxs>{
|
|
145
|
+
const {
|
|
146
|
+
manager,
|
|
147
|
+
basket,
|
|
148
|
+
editType,
|
|
149
|
+
editData,
|
|
150
|
+
useBounty
|
|
151
|
+
} = params;
|
|
152
|
+
|
|
153
|
+
let ix = createEditBasketIntentIx({
|
|
154
|
+
manager,
|
|
155
|
+
basket: basket.ownAddress,
|
|
156
|
+
bountyMint: BOUNTY_MINT,
|
|
157
|
+
editType,
|
|
158
|
+
editData,
|
|
159
|
+
useBounty
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
let ix2 = null;
|
|
163
|
+
let modificationDelay;
|
|
164
|
+
|
|
165
|
+
switch(editType) {
|
|
166
|
+
case 1: modificationDelay = basket.settings.schedule.modificationDelay;
|
|
167
|
+
case 2: modificationDelay = basket.settings.feeSettings.modificationDelay;
|
|
168
|
+
case 3: modificationDelay = basket.settings.managerSettings.modificationDelay;
|
|
169
|
+
case 4: modificationDelay = basket.settings.automationSettings.modificationDelay;
|
|
170
|
+
case 5: modificationDelay = basket.settings.lpSettings.modificationDelay;
|
|
171
|
+
case 6: modificationDelay = basket.settings.metadataSettings.modificationDelay;
|
|
172
|
+
case 7: modificationDelay = basket.settings.addTokenDelay;
|
|
173
|
+
case 8: modificationDelay = basket.settings.updateWeightsDelay;
|
|
174
|
+
case 9: modificationDelay = basket.settings.addTokenDelay;
|
|
175
|
+
case 10: modificationDelay = basket.settings.updateWeightsDelay;
|
|
176
|
+
case 11: modificationDelay = basket.settings.makeDirectSwapDelay;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if(modificationDelay.eq(new BN(0))){
|
|
180
|
+
let intent = getIntentPda(basket.ownAddress, manager, editType);
|
|
181
|
+
let basketTokenMint = getBasketTokenMintPda(basket.ownAddress);
|
|
182
|
+
let metadataAccount = getMetadataAccount(basketTokenMint);
|
|
183
|
+
ix2 = editBasketIx({
|
|
184
|
+
keeper: manager,
|
|
185
|
+
basket: basket.ownAddress,
|
|
186
|
+
intent,
|
|
187
|
+
bountyMint: BOUNTY_MINT,
|
|
188
|
+
manager,
|
|
189
|
+
editType,
|
|
190
|
+
metadataAccount
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
let ixs = [];
|
|
195
|
+
if(ix2 === null)
|
|
196
|
+
ixs = [[ix]];
|
|
197
|
+
else ixs = [[ix, ix2]];
|
|
198
|
+
const signers = ixs.map(() => []);
|
|
199
|
+
let vtxs = await prepareV0Transactions({
|
|
200
|
+
connection: this.sdkParams.connection,
|
|
201
|
+
payer: manager,
|
|
202
|
+
priorityFee: this.sdkParams.priorityFee,
|
|
203
|
+
multipleIxs: ixs,
|
|
204
|
+
multipleLookupTableAddresses: [],
|
|
205
|
+
signers,
|
|
206
|
+
batches: [1],
|
|
207
|
+
});
|
|
208
|
+
|
|
209
|
+
return vtxs;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
async createEditBasketTx(params: {
|
|
213
|
+
keeper: PublicKey,
|
|
214
|
+
basket: PublicKey,
|
|
215
|
+
manager: PublicKey,
|
|
216
|
+
editType: TaskType,
|
|
217
|
+
}): Promise<VersionedTxs> {
|
|
218
|
+
const {
|
|
219
|
+
keeper,
|
|
220
|
+
basket,
|
|
221
|
+
manager,
|
|
222
|
+
editType
|
|
223
|
+
} = params;
|
|
224
|
+
let intent = getIntentPda(basket, manager, editType);
|
|
225
|
+
let basketTokenMint = getBasketTokenMintPda(basket);
|
|
226
|
+
let metadataAccount = getMetadataAccount(basketTokenMint);
|
|
227
|
+
|
|
228
|
+
let ix = editBasketIx({
|
|
229
|
+
keeper,
|
|
230
|
+
basket,
|
|
231
|
+
intent,
|
|
232
|
+
bountyMint: BOUNTY_MINT,
|
|
233
|
+
manager,
|
|
234
|
+
editType,
|
|
235
|
+
metadataAccount
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
let vtxs = await prepareV0Transactions({
|
|
239
|
+
connection: this.sdkParams.connection,
|
|
240
|
+
payer: manager,
|
|
241
|
+
priorityFee: this.sdkParams.priorityFee,
|
|
242
|
+
multipleIxs: [[ix]],
|
|
243
|
+
multipleLookupTableAddresses: [],
|
|
244
|
+
signers: [[]],
|
|
245
|
+
batches: [1],
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
return vtxs;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
async signAndSendVersionedTxs(params: {
|
|
252
|
+
vtxs: VersionedTxs,
|
|
253
|
+
wallet: Wallet,
|
|
254
|
+
}): Promise<TransactionSignature[]> {
|
|
255
|
+
const { vtxs, wallet } = params;
|
|
256
|
+
vtxs.versionedTxs = await wallet.signAllTransactions(vtxs.versionedTxs);
|
|
257
|
+
return await sendV0Transactions(this.sdkParams.connection, vtxs, false);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ASSOCIATED_TOKEN_PROGRAM_ID,
|
|
3
|
+
TOKEN_2022_PROGRAM_ID,
|
|
4
|
+
TOKEN_PROGRAM_ID
|
|
5
|
+
} from '@solana/spl-token';
|
|
6
|
+
import { PublicKey, TransactionInstruction } from '@solana/web3.js';
|
|
7
|
+
import { BASKETS_V3_PROGRAM_ID } from '../../constants';
|
|
8
|
+
import { SystemProgram } from '@solana/web3.js';
|
|
9
|
+
import { getAta, getBountyVaultPda, getGlobalConfigPda, getRebalanceIntentPda, getRentPayerPda } from '../pda';
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
const CREATE_AUCTION_DISCRIMINATOR = Buffer.from([50, 37, 7, 103, 80, 100, 162, 13]);
|
|
13
|
+
|
|
14
|
+
export function createAuctionIx(params: {
|
|
15
|
+
keeper: PublicKey,
|
|
16
|
+
basket: PublicKey,
|
|
17
|
+
bountyMint: PublicKey,
|
|
18
|
+
}): TransactionInstruction {
|
|
19
|
+
const { keeper, basket, bountyMint } = params;
|
|
20
|
+
let bountyVault = getBountyVaultPda();
|
|
21
|
+
|
|
22
|
+
let bountyVaultAta = getAta(bountyMint, bountyVault);
|
|
23
|
+
let rebalanceIntent = getRebalanceIntentPda(basket, basket);
|
|
24
|
+
|
|
25
|
+
let rentPayerPda = getRentPayerPda();
|
|
26
|
+
|
|
27
|
+
let globalConfig = getGlobalConfigPda();
|
|
28
|
+
|
|
29
|
+
let keeperBountyATA = getAta(keeper, bountyMint);
|
|
30
|
+
|
|
31
|
+
const data = CREATE_AUCTION_DISCRIMINATOR;
|
|
32
|
+
|
|
33
|
+
const keys = [
|
|
34
|
+
{ pubkey: keeper, isWritable: true, isSigner: true },
|
|
35
|
+
{ pubkey: basket, isWritable: true, isSigner: false },
|
|
36
|
+
{ pubkey: rebalanceIntent, isWritable: true, isSigner: false },
|
|
37
|
+
{ pubkey: rentPayerPda, isWritable: true, isSigner: false },
|
|
38
|
+
{ pubkey: globalConfig, isWritable: false, isSigner: false },
|
|
39
|
+
{ pubkey: bountyMint, isWritable: false, isSigner: false },
|
|
40
|
+
{ pubkey: keeperBountyATA, isWritable: true, isSigner: false },
|
|
41
|
+
{ pubkey: bountyVault, isWritable: true, isSigner: false },
|
|
42
|
+
{ pubkey: bountyVaultAta, isWritable: true, isSigner: false },
|
|
43
|
+
{ pubkey: SystemProgram.programId, isWritable: false, isSigner: false },
|
|
44
|
+
{ pubkey: TOKEN_PROGRAM_ID, isWritable: false, isSigner: false },
|
|
45
|
+
{ pubkey: TOKEN_2022_PROGRAM_ID, isWritable: false, isSigner: false },
|
|
46
|
+
{ pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isWritable: false, isSigner: false },
|
|
47
|
+
{ pubkey: rebalanceIntent, isWritable: true, isSigner: false }
|
|
48
|
+
];
|
|
49
|
+
|
|
50
|
+
return new TransactionInstruction({
|
|
51
|
+
keys,
|
|
52
|
+
programId: BASKETS_V3_PROGRAM_ID,
|
|
53
|
+
data,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { TOKEN_PROGRAM_ID } from "@solana/spl-token";
|
|
2
|
+
import { SystemProgram, TransactionInstruction } from "@solana/web3.js";
|
|
3
|
+
import { PublicKey } from "@solana/web3.js";
|
|
4
|
+
import { getAta, getBountyVaultPda, getGlobalConfigPda } from "../pda";
|
|
5
|
+
import { BASKETS_V3_PROGRAM_ID } from "../../constants";
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
export const CLAIM_BOUNTY_HANDLER_DISCRIMINATOR = Buffer.from([13, 252, 98, 119, 169, 40, 250, 254]);
|
|
9
|
+
|
|
10
|
+
export function claimBountyIx(params: {
|
|
11
|
+
keeper: PublicKey;
|
|
12
|
+
basket: PublicKey;
|
|
13
|
+
intent: PublicKey;
|
|
14
|
+
bountyMint: PublicKey;
|
|
15
|
+
bountyDepositor: PublicKey;
|
|
16
|
+
rentPayer: PublicKey;
|
|
17
|
+
keepers: PublicKey[];
|
|
18
|
+
}): TransactionInstruction {
|
|
19
|
+
const {
|
|
20
|
+
keeper,
|
|
21
|
+
basket,
|
|
22
|
+
intent,
|
|
23
|
+
bountyMint,
|
|
24
|
+
bountyDepositor,
|
|
25
|
+
rentPayer,
|
|
26
|
+
keepers
|
|
27
|
+
} = params;
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
let bountyVault = getBountyVaultPda();
|
|
31
|
+
|
|
32
|
+
let globalConfig = getGlobalConfigPda();
|
|
33
|
+
|
|
34
|
+
let keeperBountyAta = getAta(keeper, bountyMint);
|
|
35
|
+
let basketBountyAta = getAta(basket, bountyMint);
|
|
36
|
+
|
|
37
|
+
let bountyVaultAta = getAta(bountyVault, bountyMint);
|
|
38
|
+
let bountyDepositorAta = getAta(bountyDepositor, bountyMint);
|
|
39
|
+
|
|
40
|
+
const data = CLAIM_BOUNTY_HANDLER_DISCRIMINATOR;
|
|
41
|
+
|
|
42
|
+
const keys = [
|
|
43
|
+
{ pubkey: keeper, isSigner: true, isWritable: true },
|
|
44
|
+
{ pubkey: basket, isSigner: false, isWritable: true },
|
|
45
|
+
{ pubkey: intent, isSigner: false, isWritable: true },
|
|
46
|
+
{ pubkey: bountyMint, isSigner: false, isWritable: false },
|
|
47
|
+
{ pubkey: keeperBountyAta, isSigner: false, isWritable: true },
|
|
48
|
+
{ pubkey: basketBountyAta, isSigner: false, isWritable: true },
|
|
49
|
+
{ pubkey: bountyVault, isSigner: false, isWritable: true },
|
|
50
|
+
{ pubkey: bountyVaultAta, isSigner: false, isWritable: true },
|
|
51
|
+
{ pubkey: bountyDepositorAta, isSigner: false, isWritable: true },
|
|
52
|
+
{ pubkey: rentPayer, isSigner: false, isWritable: true },
|
|
53
|
+
{ pubkey: globalConfig, isSigner: false, isWritable: false },
|
|
54
|
+
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
|
|
55
|
+
{ pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
|
|
56
|
+
];
|
|
57
|
+
|
|
58
|
+
keepers.forEach((keeperPubkey) => {
|
|
59
|
+
keys.push({ pubkey: keeperPubkey, isWritable: true, isSigner: false });
|
|
60
|
+
const remKeeperATA = getAta(keeperPubkey, bountyMint);
|
|
61
|
+
keys.push({ pubkey: remKeeperATA, isWritable: true, isSigner: false });
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
return new TransactionInstruction({
|
|
65
|
+
keys,
|
|
66
|
+
programId: BASKETS_V3_PROGRAM_ID,
|
|
67
|
+
data,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { PublicKey, TransactionInstruction } from '@solana/web3.js';
|
|
2
|
+
|
|
3
|
+
import { BASKETS_V3_PROGRAM_ID, PYTH_SOL_ACCOUNT, PYTH_USDC_ACCOUNT } from '../../constants';
|
|
4
|
+
import { getGlobalConfigPda } from '../pda';
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
const START_PRICE_UPDATES_DISCRIMINATOR = Buffer.from([240, 67, 241, 88, 0, 32, 224, 184]);
|
|
8
|
+
const UPDATE_TOKEN_PRICES_DISCRIMINATOR = Buffer.from([147, 87, 140, 33, 214, 189, 181, 242]);
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
export function startPriceUpdatesIx(params: {
|
|
13
|
+
keeper: PublicKey,
|
|
14
|
+
basket: PublicKey,
|
|
15
|
+
rebalanceIntent: PublicKey
|
|
16
|
+
}): TransactionInstruction {
|
|
17
|
+
|
|
18
|
+
const keys = [
|
|
19
|
+
{ pubkey: params.keeper, isSigner: true, isWritable: true },
|
|
20
|
+
{ pubkey: params.basket, isSigner: false, isWritable: false },
|
|
21
|
+
{ pubkey: params.rebalanceIntent, isSigner: false, isWritable: true },
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const data = START_PRICE_UPDATES_DISCRIMINATOR;
|
|
25
|
+
|
|
26
|
+
return new TransactionInstruction({
|
|
27
|
+
keys,
|
|
28
|
+
programId: BASKETS_V3_PROGRAM_ID,
|
|
29
|
+
data,
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
export function updateTokenPricesIx(params: {
|
|
36
|
+
keeper: PublicKey,
|
|
37
|
+
basket: PublicKey,
|
|
38
|
+
rebalanceIntent: PublicKey,
|
|
39
|
+
lookupTable0: PublicKey,
|
|
40
|
+
lookupTable1: PublicKey,
|
|
41
|
+
tokenIndices: number[], // length 20
|
|
42
|
+
additionalOracleAccounts: PublicKey[]
|
|
43
|
+
}): TransactionInstruction {
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
let globalConfig = getGlobalConfigPda();
|
|
47
|
+
|
|
48
|
+
const data = Buffer.concat([
|
|
49
|
+
Buffer.from(UPDATE_TOKEN_PRICES_DISCRIMINATOR), // 8 bytes
|
|
50
|
+
Buffer.from(params.tokenIndices)
|
|
51
|
+
]);
|
|
52
|
+
|
|
53
|
+
const keys = [
|
|
54
|
+
{ pubkey: params.keeper, isSigner: true, isWritable: true },
|
|
55
|
+
{ pubkey: params.basket, isSigner: false, isWritable: true },
|
|
56
|
+
{ pubkey: params.rebalanceIntent, isSigner: false, isWritable: true },
|
|
57
|
+
{ pubkey: globalConfig, isSigner: false, isWritable: false },
|
|
58
|
+
{ pubkey: PYTH_SOL_ACCOUNT, isSigner: false, isWritable: true },
|
|
59
|
+
{ pubkey: PYTH_USDC_ACCOUNT, isSigner: false, isWritable: true },
|
|
60
|
+
{ pubkey: params.lookupTable0, isSigner: false, isWritable: true },
|
|
61
|
+
{ pubkey: params.lookupTable1, isSigner: false, isWritable: true },
|
|
62
|
+
];
|
|
63
|
+
|
|
64
|
+
// remaining accounts
|
|
65
|
+
|
|
66
|
+
keys.push(...params.additionalOracleAccounts.map((pubkey) => ({ pubkey, isSigner: false, isWritable: false })));
|
|
67
|
+
|
|
68
|
+
return new TransactionInstruction({
|
|
69
|
+
keys,
|
|
70
|
+
programId: BASKETS_V3_PROGRAM_ID,
|
|
71
|
+
data
|
|
72
|
+
});
|
|
73
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { TransactionInstruction } from "@solana/web3.js";
|
|
2
|
+
import { PublicKey } from "@solana/web3.js";
|
|
3
|
+
import { getAta, getRebalanceIntentPda } from "../pda";
|
|
4
|
+
import { SYSTEM_PROGRAM_ID } from "@coral-xyz/anchor/dist/cjs/native/system";
|
|
5
|
+
import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from "@solana/spl-token";
|
|
6
|
+
import { BN } from "@coral-xyz/anchor";
|
|
7
|
+
import { BASKETS_V3_PROGRAM_ID } from "../../constants";
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
const REBALANCE_SWAP_DISCRIMINATOR = Buffer.from([101, 122, 61, 201, 21, 165, 177, 213]);
|
|
12
|
+
|
|
13
|
+
export function rebalanceSwapIx(
|
|
14
|
+
params: {
|
|
15
|
+
keeper: PublicKey;
|
|
16
|
+
basket: PublicKey;
|
|
17
|
+
mintFrom: PublicKey;
|
|
18
|
+
mintTo: PublicKey;
|
|
19
|
+
amount: number;
|
|
20
|
+
side: number; // 0 or 1
|
|
21
|
+
}): TransactionInstruction {
|
|
22
|
+
|
|
23
|
+
const { keeper, basket, mintFrom, mintTo, amount, side } = params;
|
|
24
|
+
|
|
25
|
+
let rebalanceIntent = getRebalanceIntentPda(basket, keeper);
|
|
26
|
+
let keeperFromATA = getAta(keeper, mintFrom);
|
|
27
|
+
let keeperToATA = getAta(keeper, mintTo);
|
|
28
|
+
let basketFromATA = getAta(basket, mintFrom);
|
|
29
|
+
let basketToATA = getAta(basket, mintTo);
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
const keys = [
|
|
33
|
+
{ pubkey: params.keeper, isWritable: true, isSigner: true },
|
|
34
|
+
{ pubkey: params.basket, isWritable: true, isSigner: false },
|
|
35
|
+
{ pubkey: rebalanceIntent, isWritable: true, isSigner: false },
|
|
36
|
+
{ pubkey: params.mintFrom, isWritable: false, isSigner: false },
|
|
37
|
+
{ pubkey: params.mintTo, isWritable: false, isSigner: false },
|
|
38
|
+
{ pubkey: keeperFromATA, isWritable: true, isSigner: false },
|
|
39
|
+
{ pubkey: keeperToATA, isWritable: true, isSigner: false },
|
|
40
|
+
{ pubkey: basketFromATA, isWritable: true, isSigner: false },
|
|
41
|
+
{ pubkey: basketToATA, isWritable: true, isSigner: false },
|
|
42
|
+
{ pubkey: SYSTEM_PROGRAM_ID, isWritable: false, isSigner: false },
|
|
43
|
+
{ pubkey: TOKEN_PROGRAM_ID, isWritable: false, isSigner: false },
|
|
44
|
+
{ pubkey: TOKEN_2022_PROGRAM_ID, isWritable: false, isSigner: false },
|
|
45
|
+
{ pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isWritable: false, isSigner: false },
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
const discriminator = REBALANCE_SWAP_DISCRIMINATOR;
|
|
49
|
+
|
|
50
|
+
const amountBuffer = Buffer.from(new BN(amount).toArray("le", 8));
|
|
51
|
+
const sideBuffer = Buffer.from([side]);
|
|
52
|
+
|
|
53
|
+
const data = Buffer.concat([discriminator, amountBuffer, sideBuffer]);
|
|
54
|
+
|
|
55
|
+
return new TransactionInstruction({
|
|
56
|
+
keys,
|
|
57
|
+
programId: BASKETS_V3_PROGRAM_ID,
|
|
58
|
+
data,
|
|
59
|
+
});
|
|
60
|
+
}
|