@raydium-io/raydium-sdk-v2
Version:
An SDK for building applications on top of Raydium.
1,058 lines (907 loc) • 36 kB
text/typescript
import { DEVNET_PROGRAM_ID, METADATA_PROGRAM_ID, RENT_PROGRAM_ID } from "@/common";
import { publicKey, str, struct, u16, u64, u8 } from "@/marshmallow";
import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from "@solana/spl-token";
import { AccountMeta, PublicKey, SystemProgram, TransactionInstruction } from "@solana/web3.js";
import BN from "bn.js";
import { BondingCurveParam } from "./layout";
import { getPdaCpiEvent } from "./pda";
import { CpmmCreatorFeeOn } from "./type";
export const anchorDataBuf = {
initialize: Buffer.from([175, 175, 109, 31, 13, 152, 155, 237]),
initializeV2: Buffer.from([67, 153, 175, 39, 218, 16, 38, 32]),
buyExactIn: Buffer.from([250, 234, 13, 123, 213, 156, 19, 236]),
buyExactOut: Buffer.from([24, 211, 116, 40, 105, 3, 153, 56]),
sellExactIn: Buffer.from([149, 39, 222, 155, 211, 124, 152, 26]),
sellExactOut: Buffer.from([95, 200, 71, 34, 8, 9, 11, 166]),
createVestingAccount: Buffer.from([129, 178, 2, 13, 217, 172, 230, 218]),
claimVestedToken: Buffer.from([49, 33, 104, 30, 189, 157, 79, 35]),
createPlatformConfig: Buffer.from([176, 90, 196, 175, 253, 113, 220, 20]),
claimPlatformFee: Buffer.from([156, 39, 208, 135, 76, 237, 61, 72]),
updatePlaformConfig: Buffer.from([195, 60, 76, 129, 146, 45, 67, 143]),
initializeWithToken2022: Buffer.from([37, 190, 126, 222, 44, 154, 171, 17]),
claimPlatformFeeFromVault: Buffer.from([117, 241, 198, 168, 248, 218, 80, 29]),
claimCreatorFee: Buffer.from([26, 97, 138, 203, 132, 171, 141, 252]),
updatePlatformCurveParam: Buffer.from([138, 144, 138, 250, 220, 128, 4, 57]),
removePlatformCurveParam: Buffer.from([27, 30, 62, 169, 93, 224, 24, 145]),
};
export function initialize(
programId: PublicKey,
payer: PublicKey,
creator: PublicKey,
configId: PublicKey,
platformId: PublicKey,
auth: PublicKey,
poolId: PublicKey,
mintA: PublicKey,
mintB: PublicKey,
vaultA: PublicKey,
vaultB: PublicKey,
metadataId: PublicKey,
decimals: number,
name: string,
symbol: string,
uri: string,
curveParam: ({ type: "ConstantCurve"; totalSellA: BN } | { type: "FixedCurve" } | { type: "LinearCurve" }) & {
migrateType: "amm" | "cpmm";
supply: BN;
totalFundRaisingB: BN;
},
totalLockedAmount: BN,
cliffPeriod: BN,
unlockPeriod: BN,
): TransactionInstruction {
throw new Error("*** launchlab initialize has been deprecated, please use initializeV2 instead! ***");
const dataLyaout1 = struct([u8("decimals"), str("name"), str("symbol"), str("uri")]);
const dataLyaout3 = struct([u64("totalLockedAmount"), u64("cliffPeriod"), u64("unlockPeriod")]);
const dataLayout21 = struct([u8("index"), u64("supply"), u64("totalFundRaisingB"), u8("migrateType")]);
const dataLayout22 = struct([
u8("index"),
u64("supply"),
u64("totalSellA"),
u64("totalFundRaisingB"),
u8("migrateType"),
]);
const keys: Array<AccountMeta> = [
{ pubkey: payer, isSigner: true, isWritable: true },
{ pubkey: creator, isSigner: false, isWritable: false },
{ pubkey: configId, isSigner: false, isWritable: false },
{ pubkey: platformId, isSigner: false, isWritable: false },
{ pubkey: auth, isSigner: false, isWritable: false },
{ pubkey: poolId, isSigner: false, isWritable: true },
{ pubkey: mintA, isSigner: true, isWritable: true },
{ pubkey: mintB, isSigner: false, isWritable: false },
{ pubkey: vaultA, isSigner: false, isWritable: true },
{ pubkey: vaultB, isSigner: false, isWritable: true },
{ pubkey: metadataId, isSigner: false, isWritable: true },
{ pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
{ pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
{ pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false },
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
{ pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },
{ pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },
{ pubkey: programId, isSigner: false, isWritable: false },
];
const data1 = Buffer.alloc(
Buffer.from(name, "utf-8").length +
Buffer.from(symbol, "utf-8").length +
Buffer.from(uri, "utf-8").length +
4 * 3 +
1,
);
const data3 = Buffer.alloc(dataLyaout3.span);
const data2 = Buffer.alloc(curveParam.type === "ConstantCurve" ? dataLayout22.span : dataLayout21.span);
dataLyaout1.encode({ decimals, name, symbol, uri }, data1);
if (curveParam.type === "ConstantCurve") {
// eslint-disable-next-line
// @ts-ignore
dataLayout22.encode({ index: 0, ...curveParam, migrateType: curveParam.migrateType === "amm" ? 0 : 1 }, data2);
} else if (curveParam.type === "FixedCurve") {
dataLayout21.encode({ index: 1, ...curveParam, migrateType: curveParam.migrateType === "amm" ? 0 : 1 }, data2);
} else if (curveParam.type === "LinearCurve") {
dataLayout21.encode({ index: 2, ...curveParam, migrateType: curveParam.migrateType === "amm" ? 0 : 1 }, data2);
}
dataLyaout3.encode({ totalLockedAmount, cliffPeriod, unlockPeriod }, data3);
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.initialize, ...data1, ...data2, ...data3]),
});
}
export function initializeV2(
programId: PublicKey,
payer: PublicKey,
creator: PublicKey,
configId: PublicKey,
platformId: PublicKey,
auth: PublicKey,
poolId: PublicKey,
mintA: PublicKey,
mintB: PublicKey,
vaultA: PublicKey,
vaultB: PublicKey,
metadataId: PublicKey,
decimals: number,
name: string,
symbol: string,
uri: string,
curveParam: ({ type: "ConstantCurve"; totalSellA: BN } | { type: "FixedCurve" } | { type: "LinearCurve" }) & {
migrateType: "amm" | "cpmm";
supply: BN;
totalFundRaisingB: BN;
},
totalLockedAmount: BN,
cliffPeriod: BN,
unlockPeriod: BN,
cpmmCreatorFeeOn: CpmmCreatorFeeOn,
): TransactionInstruction {
const dataLyaout1 = struct([u8("decimals"), str("name"), str("symbol"), str("uri")]);
const dataLyaout3 = struct([
u64("totalLockedAmount"),
u64("cliffPeriod"),
u64("unlockPeriod"),
u8("cpmmCreatorFeeOn"),
]);
const dataLayout21 = struct([u8("index"), u64("supply"), u64("totalFundRaisingB"), u8("migrateType")]);
const dataLayout22 = struct([
u8("index"),
u64("supply"),
u64("totalSellA"),
u64("totalFundRaisingB"),
u8("migrateType"),
]);
const keys: Array<AccountMeta> = [
{ pubkey: payer, isSigner: true, isWritable: true },
{ pubkey: creator, isSigner: false, isWritable: false },
{ pubkey: configId, isSigner: false, isWritable: false },
{ pubkey: platformId, isSigner: false, isWritable: false },
{ pubkey: auth, isSigner: false, isWritable: false },
{ pubkey: poolId, isSigner: false, isWritable: true },
{ pubkey: mintA, isSigner: true, isWritable: true },
{ pubkey: mintB, isSigner: false, isWritable: false },
{ pubkey: vaultA, isSigner: false, isWritable: true },
{ pubkey: vaultB, isSigner: false, isWritable: true },
{ pubkey: metadataId, isSigner: false, isWritable: true },
{ pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
{ pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
{ pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false },
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
{ pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },
{ pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },
{ pubkey: programId, isSigner: false, isWritable: false },
];
const data1 = Buffer.alloc(
Buffer.from(name, "utf-8").length +
Buffer.from(symbol, "utf-8").length +
Buffer.from(uri, "utf-8").length +
4 * 3 +
1,
);
const data3 = Buffer.alloc(dataLyaout3.span);
const data2 = Buffer.alloc(curveParam.type === "ConstantCurve" ? dataLayout22.span : dataLayout21.span);
dataLyaout1.encode({ decimals, name, symbol, uri }, data1);
if (curveParam.type === "ConstantCurve") {
dataLayout22.encode({ index: 0, ...curveParam, migrateType: curveParam.migrateType === "amm" ? 0 : 1 }, data2);
} else if (curveParam.type === "FixedCurve") {
dataLayout21.encode({ index: 1, ...curveParam, migrateType: curveParam.migrateType === "amm" ? 0 : 1 }, data2);
} else if (curveParam.type === "LinearCurve") {
dataLayout21.encode({ index: 2, ...curveParam, migrateType: curveParam.migrateType === "amm" ? 0 : 1 }, data2);
}
dataLyaout3.encode({ totalLockedAmount, cliffPeriod, unlockPeriod, cpmmCreatorFeeOn }, data3);
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.initializeV2, ...data1, ...data2, ...data3]),
});
}
export function initializeWithToken2022(
programId: PublicKey,
payer: PublicKey,
creator: PublicKey,
configId: PublicKey,
platformId: PublicKey,
auth: PublicKey,
poolId: PublicKey,
mintA: PublicKey,
mintB: PublicKey,
vaultA: PublicKey,
vaultB: PublicKey,
decimals: number,
name: string,
symbol: string,
uri: string,
curveParam: ({ type: "ConstantCurve"; totalSellA: BN } | { type: "FixedCurve" } | { type: "LinearCurve" }) & {
migrateType: "amm" | "cpmm";
supply: BN;
totalFundRaisingB: BN;
},
totalLockedAmount: BN,
cliffPeriod: BN,
unlockPeriod: BN,
cpmmCreatorFeeOn: CpmmCreatorFeeOn,
transferFeeExtensionParams?: { transferFeeBasePoints: number; maxinumFee: BN },
): TransactionInstruction {
const dataLyaout1 = struct([u8("decimals"), str("name"), str("symbol"), str("uri")]);
const dataLyaout3 = struct([
u64("totalLockedAmount"),
u64("cliffPeriod"),
u64("unlockPeriod"),
u8("cpmmCreatorFeeOn"),
u8("transferFeeExtensionParamsOption"),
struct([u16("transferFeeBasePoints"), u64("maxinumFee")]).replicate("transferFeeExtensionParams"),
]);
const dataLayout21 = struct([u8("index"), u64("supply"), u64("totalFundRaisingB"), u8("migrateType")]);
const dataLayout22 = struct([
u8("index"),
u64("supply"),
u64("totalSellA"),
u64("totalFundRaisingB"),
u8("migrateType"),
]);
const keys: Array<AccountMeta> = [
{ pubkey: payer, isSigner: true, isWritable: true },
{ pubkey: creator, isSigner: false, isWritable: false },
{ pubkey: configId, isSigner: false, isWritable: false },
{ pubkey: platformId, isSigner: false, isWritable: false },
{ pubkey: auth, isSigner: false, isWritable: false },
{ pubkey: poolId, isSigner: false, isWritable: true },
{ pubkey: mintA, isSigner: true, isWritable: true },
{ pubkey: mintB, isSigner: false, isWritable: false },
{ pubkey: vaultA, isSigner: false, isWritable: true },
{ pubkey: vaultB, isSigner: false, isWritable: true },
{ pubkey: TOKEN_2022_PROGRAM_ID, isSigner: false, isWritable: false },
{ pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
{ pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },
{ pubkey: programId, isSigner: false, isWritable: false },
];
const data1 = Buffer.alloc(
Buffer.from(name, "utf-8").length +
Buffer.from(symbol, "utf-8").length +
Buffer.from(uri, "utf-8").length +
4 * 3 +
1,
);
const data3 = Buffer.alloc(dataLyaout3.span);
const data2 = Buffer.alloc(curveParam.type === "ConstantCurve" ? dataLayout22.span : dataLayout21.span);
dataLyaout1.encode({ decimals, name, symbol, uri }, data1);
if (curveParam.type === "ConstantCurve") {
dataLayout22.encode({ index: 0, ...curveParam, migrateType: curveParam.migrateType === "amm" ? 0 : 1 }, data2);
} else if (curveParam.type === "FixedCurve") {
dataLayout21.encode({ index: 1, ...curveParam, migrateType: curveParam.migrateType === "amm" ? 0 : 1 }, data2);
} else if (curveParam.type === "LinearCurve") {
dataLayout21.encode({ index: 2, ...curveParam, migrateType: curveParam.migrateType === "amm" ? 0 : 1 }, data2);
}
dataLyaout3.encode(
{
totalLockedAmount,
cliffPeriod,
unlockPeriod,
cpmmCreatorFeeOn,
transferFeeExtensionParamsOption: transferFeeExtensionParams ? 1 : 0,
transferFeeExtensionParams: transferFeeExtensionParams ?? { transferFeeBasePoints: 0, maxinumFee: new BN(0) },
},
data3,
);
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.initializeWithToken2022, ...data1, ...data2, ...data3]),
});
}
export function buyExactInInstruction(
programId: PublicKey,
owner: PublicKey,
auth: PublicKey,
configId: PublicKey,
platformId: PublicKey,
poolId: PublicKey,
userTokenAccountA: PublicKey,
userTokenAccountB: PublicKey,
vaultA: PublicKey,
vaultB: PublicKey,
mintA: PublicKey,
mintB: PublicKey,
tokenProgramA: PublicKey,
tokenProgramB: PublicKey,
platformClaimFeeVault: PublicKey,
creatorClaimFeeVault: PublicKey,
amountB: BN,
minAmountA: BN,
shareFeeRate?: BN,
shareFeeReceiver?: PublicKey,
): TransactionInstruction {
const dataLayout = struct([u64("amountB"), u64("minAmountA"), u64("shareFeeRate")]);
const keys: Array<AccountMeta> = [
{ pubkey: owner, isSigner: true, isWritable: true },
{ pubkey: auth, isSigner: false, isWritable: false },
{ pubkey: configId, isSigner: false, isWritable: false },
{ pubkey: platformId, isSigner: false, isWritable: false },
{ pubkey: poolId, isSigner: false, isWritable: true },
{ pubkey: userTokenAccountA, isSigner: false, isWritable: true },
{ pubkey: userTokenAccountB, isSigner: false, isWritable: true },
{ pubkey: vaultA, isSigner: false, isWritable: true },
{ pubkey: vaultB, isSigner: false, isWritable: true },
{ pubkey: mintA, isSigner: false, isWritable: false },
{ pubkey: mintB, isSigner: false, isWritable: false },
{ pubkey: tokenProgramA, isSigner: false, isWritable: false },
{ pubkey: tokenProgramB, isSigner: false, isWritable: false },
{ pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },
{ pubkey: programId, isSigner: false, isWritable: false },
];
if (shareFeeReceiver) {
keys.push({ pubkey: shareFeeReceiver, isSigner: false, isWritable: true });
}
keys.push({ pubkey: SystemProgram.programId, isSigner: false, isWritable: false });
keys.push({ pubkey: platformClaimFeeVault, isSigner: false, isWritable: true });
keys.push({ pubkey: creatorClaimFeeVault, isSigner: false, isWritable: true });
const data = Buffer.alloc(dataLayout.span);
dataLayout.encode(
{
amountB,
minAmountA,
shareFeeRate: shareFeeRate ?? new BN(0),
},
data,
);
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.buyExactIn, ...data]),
});
}
export function buyExactOutInstruction(
programId: PublicKey,
owner: PublicKey,
auth: PublicKey,
configId: PublicKey,
platformId: PublicKey,
poolId: PublicKey,
userTokenAccountA: PublicKey,
userTokenAccountB: PublicKey,
vaultA: PublicKey,
vaultB: PublicKey,
mintA: PublicKey,
mintB: PublicKey,
tokenProgramA: PublicKey,
tokenProgramB: PublicKey,
platformClaimFeeVault: PublicKey,
creatorClaimFeeVault: PublicKey,
amountA: BN,
maxAmountB: BN,
shareFeeRate?: BN,
shareFeeReceiver?: PublicKey,
): TransactionInstruction {
const dataLayout = struct([u64("amountA"), u64("maxAmountB"), u64("shareFeeRate")]);
const keys: Array<AccountMeta> = [
{ pubkey: owner, isSigner: true, isWritable: true },
{ pubkey: auth, isSigner: false, isWritable: false },
{ pubkey: configId, isSigner: false, isWritable: false },
{ pubkey: platformId, isSigner: false, isWritable: false },
{ pubkey: poolId, isSigner: false, isWritable: true },
{ pubkey: userTokenAccountA, isSigner: false, isWritable: true },
{ pubkey: userTokenAccountB, isSigner: false, isWritable: true },
{ pubkey: vaultA, isSigner: false, isWritable: true },
{ pubkey: vaultB, isSigner: false, isWritable: true },
{ pubkey: mintA, isSigner: false, isWritable: false },
{ pubkey: mintB, isSigner: false, isWritable: false },
{ pubkey: tokenProgramA, isSigner: false, isWritable: false },
{ pubkey: tokenProgramB, isSigner: false, isWritable: false },
{ pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },
{ pubkey: programId, isSigner: false, isWritable: false },
];
if (shareFeeReceiver) {
keys.push({ pubkey: shareFeeReceiver, isSigner: false, isWritable: true });
}
keys.push({ pubkey: SystemProgram.programId, isSigner: false, isWritable: false });
keys.push({ pubkey: platformClaimFeeVault, isSigner: false, isWritable: true });
keys.push({ pubkey: creatorClaimFeeVault, isSigner: false, isWritable: true });
const data = Buffer.alloc(dataLayout.span);
dataLayout.encode(
{
amountA,
maxAmountB,
shareFeeRate: shareFeeRate ?? new BN(0),
},
data,
);
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.buyExactOut, ...data]),
});
}
export function sellExactInInstruction(
programId: PublicKey,
owner: PublicKey,
auth: PublicKey,
configId: PublicKey,
platformId: PublicKey,
poolId: PublicKey,
userTokenAccountA: PublicKey,
userTokenAccountB: PublicKey,
vaultA: PublicKey,
vaultB: PublicKey,
mintA: PublicKey,
mintB: PublicKey,
tokenProgramA: PublicKey,
tokenProgramB: PublicKey,
platformClaimFeeVault: PublicKey,
creatorClaimFeeVault: PublicKey,
amountA: BN,
minAmountB: BN,
shareFeeRate?: BN,
shareFeeReceiver?: PublicKey,
): TransactionInstruction {
const dataLayout = struct([u64("amountA"), u64("minAmountB"), u64("shareFeeRate")]);
const keys: Array<AccountMeta> = [
{ pubkey: owner, isSigner: true, isWritable: true },
{ pubkey: auth, isSigner: false, isWritable: false },
{ pubkey: configId, isSigner: false, isWritable: false },
{ pubkey: platformId, isSigner: false, isWritable: false },
{ pubkey: poolId, isSigner: false, isWritable: true },
{ pubkey: userTokenAccountA, isSigner: false, isWritable: true },
{ pubkey: userTokenAccountB, isSigner: false, isWritable: true },
{ pubkey: vaultA, isSigner: false, isWritable: true },
{ pubkey: vaultB, isSigner: false, isWritable: true },
{ pubkey: mintA, isSigner: false, isWritable: false },
{ pubkey: mintB, isSigner: false, isWritable: false },
{ pubkey: tokenProgramA, isSigner: false, isWritable: false },
{ pubkey: tokenProgramB, isSigner: false, isWritable: false },
{ pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },
{ pubkey: programId, isSigner: false, isWritable: false },
];
if (shareFeeReceiver) {
keys.push({ pubkey: shareFeeReceiver, isSigner: false, isWritable: true });
}
keys.push({ pubkey: SystemProgram.programId, isSigner: false, isWritable: false });
keys.push({ pubkey: platformClaimFeeVault, isSigner: false, isWritable: true });
keys.push({ pubkey: creatorClaimFeeVault, isSigner: false, isWritable: true });
const data = Buffer.alloc(dataLayout.span);
dataLayout.encode(
{
amountA,
minAmountB,
shareFeeRate: shareFeeRate ?? new BN(0),
},
data,
);
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.sellExactIn, ...data]),
});
}
export function sellExactOut(
programId: PublicKey,
owner: PublicKey,
auth: PublicKey,
configId: PublicKey,
platformId: PublicKey,
poolId: PublicKey,
userTokenAccountA: PublicKey,
userTokenAccountB: PublicKey,
vaultA: PublicKey,
vaultB: PublicKey,
mintA: PublicKey,
mintB: PublicKey,
tokenProgramA: PublicKey,
tokenProgramB: PublicKey,
platformClaimFeeVault: PublicKey,
creatorClaimFeeVault: PublicKey,
amountB: BN,
maxAmountA: BN,
shareFeeRate?: BN,
shareFeeReceiver?: PublicKey,
): TransactionInstruction {
const dataLayout = struct([u64("amountB"), u64("maxAmountA"), u64("shareFeeRate")]);
const keys: Array<AccountMeta> = [
{ pubkey: owner, isSigner: true, isWritable: true },
{ pubkey: auth, isSigner: false, isWritable: false },
{ pubkey: configId, isSigner: false, isWritable: false },
{ pubkey: platformId, isSigner: false, isWritable: false },
{ pubkey: poolId, isSigner: false, isWritable: true },
{ pubkey: userTokenAccountA, isSigner: false, isWritable: true },
{ pubkey: userTokenAccountB, isSigner: false, isWritable: true },
{ pubkey: vaultA, isSigner: false, isWritable: true },
{ pubkey: vaultB, isSigner: false, isWritable: true },
{ pubkey: mintA, isSigner: false, isWritable: false },
{ pubkey: mintB, isSigner: false, isWritable: false },
{ pubkey: tokenProgramA, isSigner: false, isWritable: false },
{ pubkey: tokenProgramB, isSigner: false, isWritable: false },
{ pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },
{ pubkey: programId, isSigner: false, isWritable: false },
];
if (shareFeeReceiver) {
keys.push({ pubkey: shareFeeReceiver, isSigner: false, isWritable: true });
}
keys.push({ pubkey: SystemProgram.programId, isSigner: false, isWritable: false });
keys.push({ pubkey: platformClaimFeeVault, isSigner: false, isWritable: true });
keys.push({ pubkey: creatorClaimFeeVault, isSigner: false, isWritable: true });
const data = Buffer.alloc(dataLayout.span);
dataLayout.encode(
{
amountB,
maxAmountA,
shareFeeRate: shareFeeRate ?? new BN(0),
},
data,
);
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.sellExactOut, ...data]),
});
}
export function claimVestedToken(
programId: PublicKey,
owner: PublicKey,
auth: PublicKey,
poolId: PublicKey,
vestingRecord: PublicKey,
userTokenAccountA: PublicKey,
vaultA: PublicKey,
mintA: PublicKey,
tokenProgramA: PublicKey,
): TransactionInstruction {
const dataLayout = struct([]);
const keys: Array<AccountMeta> = [
{ pubkey: owner, isSigner: true, isWritable: true },
{ pubkey: auth, isSigner: false, isWritable: false },
{ pubkey: poolId, isSigner: false, isWritable: true },
{ pubkey: vestingRecord, isSigner: false, isWritable: true },
{ pubkey: vaultA, isSigner: false, isWritable: true },
{ pubkey: userTokenAccountA, isSigner: false, isWritable: true },
{ pubkey: mintA, isSigner: false, isWritable: false },
{ pubkey: tokenProgramA, isSigner: false, isWritable: false },
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
{ pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
];
const data = Buffer.alloc(dataLayout.span);
dataLayout.encode({}, data);
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.claimVestedToken, ...data]),
});
}
export function createVestingAccount(
programId: PublicKey,
owner: PublicKey,
beneficiary: PublicKey,
poolId: PublicKey,
vestingRecord: PublicKey,
shareAmount: BN,
): TransactionInstruction {
const dataLayout = struct([u64("shareAmount")]);
const keys: Array<AccountMeta> = [
{ pubkey: owner, isSigner: true, isWritable: true },
{ pubkey: beneficiary, isSigner: false, isWritable: true },
{ pubkey: poolId, isSigner: false, isWritable: true },
{ pubkey: vestingRecord, isSigner: false, isWritable: true },
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
];
const data = Buffer.alloc(dataLayout.span);
dataLayout.encode({ shareAmount }, data);
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.createVestingAccount, ...data]),
});
}
export function claimPlatformFee(
programId: PublicKey,
platformClaimFeeWallet: PublicKey,
auth: PublicKey,
poolId: PublicKey,
platformId: PublicKey,
vaultB: PublicKey,
userTokenAccountB: PublicKey,
mintB: PublicKey,
tokenProgramB: PublicKey,
): TransactionInstruction {
const keys: Array<AccountMeta> = [
{ pubkey: platformClaimFeeWallet, isSigner: true, isWritable: true },
{ pubkey: auth, isSigner: false, isWritable: false },
{ pubkey: poolId, isSigner: false, isWritable: true },
{ pubkey: platformId, isSigner: false, isWritable: true },
{ pubkey: vaultB, isSigner: false, isWritable: true },
{ pubkey: userTokenAccountB, isSigner: false, isWritable: true },
{ pubkey: mintB, isSigner: false, isWritable: true },
{ pubkey: tokenProgramB, isSigner: false, isWritable: true },
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: true },
{ pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: true },
];
return new TransactionInstruction({
keys,
programId,
data: anchorDataBuf.claimPlatformFee,
});
}
export function createPlatformConfig(
programId: PublicKey,
platformAdmin: PublicKey,
platformClaimFeeWallet: PublicKey,
platformLockNftWallet: PublicKey,
platformId: PublicKey,
cpConfigId: PublicKey,
transferFeeExtensionAuth: PublicKey,
migrateCpLockNftScale: {
platformScale: BN;
creatorScale: BN;
burnScale: BN;
},
feeRate: BN,
creatorFeeRate: BN,
name: string,
web: string,
img: string,
): TransactionInstruction {
const dataLayout = struct([
u64("platformScale"),
u64("creatorScale"),
u64("burnScale"),
u64("feeRate"),
str("name"),
str("web"),
str("img"),
u64("creatorFeeRate"),
]);
const keys: Array<AccountMeta> = [
{ pubkey: platformAdmin, isSigner: true, isWritable: true },
{ pubkey: platformClaimFeeWallet, isSigner: false, isWritable: false },
{ pubkey: platformLockNftWallet, isSigner: false, isWritable: false },
{ pubkey: platformId, isSigner: false, isWritable: true },
{ pubkey: cpConfigId, isSigner: false, isWritable: true },
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
{ pubkey: transferFeeExtensionAuth, isSigner: false, isWritable: false },
];
const data = Buffer.alloc(
8 * 5 +
Buffer.from(name, "utf-8").length +
Buffer.from(web, "utf-8").length +
Buffer.from(img, "utf-8").length +
4 * 3,
);
dataLayout.encode(
{
platformScale: migrateCpLockNftScale.platformScale,
creatorScale: migrateCpLockNftScale.creatorScale,
burnScale: migrateCpLockNftScale.burnScale,
feeRate,
name,
web,
img,
creatorFeeRate,
},
data,
);
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.createPlatformConfig, ...data]),
});
}
export function updatePlatformConfig(
programId: PublicKey,
platformAdmin: PublicKey,
platformId: PublicKey,
updateInfo:
| { type: "updateClaimFeeWallet" | "updateLockNftWallet"; value: PublicKey }
| { type: "updateFeeRate"; value: BN }
| { type: "updateName" | "updateImg" | "updateWeb"; value: string }
| { type: "migrateCpLockNftScale"; value: { platformScale: BN; creatorScale: BN; burnScale: BN } }
| { type: "updateCpConfigId"; value: PublicKey }
| {
type: "updateAll";
value: {
platformClaimFeeWallet: PublicKey;
platformLockNftWallet: PublicKey;
cpConfigId: PublicKey;
migrateCpLockNftScale: {
platformScale: BN;
creatorScale: BN;
burnScale: BN;
};
feeRate: BN;
name: string;
web: string;
img: string;
transferFeeExtensionAuth: PublicKey;
creatorFeeRate: BN;
};
},
): TransactionInstruction {
const keys: Array<AccountMeta> = [
{ pubkey: platformAdmin, isSigner: true, isWritable: false },
{ pubkey: platformId, isSigner: false, isWritable: true },
];
let data: Buffer;
if (updateInfo.type === "updateClaimFeeWallet") {
const dataLayout = struct([u8("index"), publicKey("value")]);
data = Buffer.alloc(dataLayout.span);
dataLayout.encode({ index: 0, value: updateInfo.value }, data);
} else if (updateInfo.type === "updateLockNftWallet") {
const dataLayout = struct([u8("index"), publicKey("value")]);
data = Buffer.alloc(dataLayout.span);
dataLayout.encode({ index: 1, value: updateInfo.value }, data);
} else if (updateInfo.type === "migrateCpLockNftScale") {
const dataLayout = struct([u8("index"), u64("platformScale"), u64("creatorScale"), u64("burnScale")]);
data = Buffer.alloc(dataLayout.span);
dataLayout.encode({ index: 2, ...updateInfo.value }, data);
} else if (updateInfo.type === "updateFeeRate") {
const dataLayout = struct([u8("index"), u64("value")]);
data = Buffer.alloc(dataLayout.span);
dataLayout.encode({ index: 3, value: updateInfo.value }, data);
} else if (updateInfo.type === "updateImg" || updateInfo.type === "updateName" || updateInfo.type === "updateWeb") {
const dataLayout = struct([u8("index"), str("value")]);
data = Buffer.alloc(Buffer.from(updateInfo.value, "utf-8").length + 4 + 1 * 1);
if (updateInfo.type === "updateName") dataLayout.encode({ index: 4, value: updateInfo.value }, data);
else if (updateInfo.type === "updateWeb") dataLayout.encode({ index: 5, value: updateInfo.value }, data);
else if (updateInfo.type === "updateImg") dataLayout.encode({ index: 6, value: updateInfo.value }, data);
} else if (updateInfo.type === "updateCpConfigId") {
keys.push({ pubkey: updateInfo.value, isSigner: false, isWritable: false });
const dataLayout = struct([u8("index")]);
data = Buffer.alloc(dataLayout.span);
dataLayout.encode({ index: 7 }, data);
} else if (updateInfo.type === "updateAll") {
keys.push({ pubkey: updateInfo.value.cpConfigId, isSigner: false, isWritable: false });
const dataLayout = struct([
u8("index"),
publicKey("platformClaimFeeWallet"),
publicKey("platformLockNftWallet"),
u64("platformScale"),
u64("creatorScale"),
u64("burnScale"),
u64("feeRate"),
str("name"),
str("web"),
str("img"),
publicKey("transferFeeExtensionAuth"),
u64("creatorFeeRate"),
]);
data = Buffer.alloc(
1 +
32 +
32 +
8 * 4 +
4 * 3 +
Buffer.from(updateInfo.value.name, "utf-8").length +
Buffer.from(updateInfo.value.web, "utf-8").length +
Buffer.from(updateInfo.value.img, "utf-8").length +
32 +
8,
);
dataLayout.encode(
{
index: 8,
platformClaimFeeWallet: updateInfo.value.platformClaimFeeWallet,
platformLockNftWallet: updateInfo.value.platformLockNftWallet,
platformScale: updateInfo.value.migrateCpLockNftScale.platformScale,
creatorScale: updateInfo.value.migrateCpLockNftScale.creatorScale,
burnScale: updateInfo.value.migrateCpLockNftScale.burnScale,
feeRate: updateInfo.value.feeRate,
name: updateInfo.value.name,
web: updateInfo.value.web,
img: updateInfo.value.img,
transferFeeExtensionAuth: updateInfo.value.transferFeeExtensionAuth,
creatorFeeRate: updateInfo.value.creatorFeeRate,
},
data,
);
} else {
throw Error("updateInfo params type error");
}
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.updatePlaformConfig, ...data]),
});
}
export function claimPlatformFeeFromVault(
programId: PublicKey,
platformId: PublicKey,
platformClaimFeeWallet: PublicKey,
platformClaimFeeAuth: PublicKey,
platformClaimFeeVault: PublicKey,
recipientTokenAccount: PublicKey,
mintB: PublicKey,
mintProgramB: PublicKey,
): TransactionInstruction {
const keys: Array<AccountMeta> = [
{ pubkey: platformClaimFeeWallet, isSigner: true, isWritable: true },
{ pubkey: platformClaimFeeAuth, isSigner: false, isWritable: false },
{ pubkey: platformId, isSigner: false, isWritable: false },
{ pubkey: platformClaimFeeVault, isSigner: false, isWritable: true },
{ pubkey: recipientTokenAccount, isSigner: false, isWritable: true },
{ pubkey: mintB, isSigner: false, isWritable: false },
{ pubkey: mintProgramB, isSigner: false, isWritable: false },
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
{ pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
];
return new TransactionInstruction({
keys,
programId,
data: anchorDataBuf.claimPlatformFeeFromVault,
});
}
export function claimCreatorFee(
programId: PublicKey,
creator: PublicKey,
creatorClaimFeeAuth: PublicKey,
creatorClaimFeeVault: PublicKey,
recipientTokenAccount: PublicKey,
mintB: PublicKey,
mintProgramB: PublicKey,
): TransactionInstruction {
const keys: Array<AccountMeta> = [
{ pubkey: creator, isSigner: true, isWritable: true },
{ pubkey: creatorClaimFeeAuth, isSigner: false, isWritable: false },
{ pubkey: creatorClaimFeeVault, isSigner: false, isWritable: true },
{ pubkey: recipientTokenAccount, isSigner: false, isWritable: true },
{ pubkey: mintB, isSigner: false, isWritable: false },
{ pubkey: mintProgramB, isSigner: false, isWritable: false },
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
{ pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },
];
return new TransactionInstruction({
keys,
programId,
data: anchorDataBuf.claimCreatorFee,
});
}
const u8Max = 255;
const u64Max = new BN("18446744073709551615");
export function updatePlatformCurveParamInstruction(
programId: PublicKey,
platformAdmin: PublicKey,
platformId: PublicKey,
configId: PublicKey,
index: number,
params: Partial<ReturnType<typeof BondingCurveParam.decode>>,
): TransactionInstruction {
const keys: Array<AccountMeta> = [
{ pubkey: platformAdmin, isSigner: true, isWritable: true },
{ pubkey: platformId, isSigner: false, isWritable: true },
{ pubkey: configId, isSigner: false, isWritable: false },
{ pubkey: SystemProgram.programId, isSigner: false, isWritable: false },
];
const data = Buffer.alloc(1 * 2 + 8 * 6 + u8().span);
u8().encode(index, data);
BondingCurveParam.encode(
{
migrateType: params.migrateType ? params.migrateType : u8Max,
migrateCpmmFeeOn: params.migrateCpmmFeeOn ? params.migrateCpmmFeeOn : u8Max,
supply: params.supply ? params.supply : new BN(0),
totalSellA: params.totalSellA ? params.totalSellA : new BN(0),
totalFundRaisingB: params.totalFundRaisingB ? params.totalFundRaisingB : new BN(0),
totalLockedAmount: params.totalLockedAmount ? params.totalLockedAmount : u64Max,
cliffPeriod: params.cliffPeriod ? params.cliffPeriod : u64Max,
unlockPeriod: params.unlockPeriod ? params.unlockPeriod : u64Max,
},
data,
1,
);
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.updatePlatformCurveParam, ...data]),
});
}
export function removePlatformCurveParamInstruction(
programId: PublicKey,
platformAdmin: PublicKey,
platformId: PublicKey,
index: number,
): TransactionInstruction {
const keys: Array<AccountMeta> = [
{ pubkey: platformAdmin, isSigner: true, isWritable: false },
{ pubkey: platformId, isSigner: false, isWritable: true },
];
const data = Buffer.alloc(u8().span);
u8().encode(index, data);
return new TransactionInstruction({
keys,
programId,
data: Buffer.from([...anchorDataBuf.removePlatformCurveParam, ...data, 1, 2]),
});
}