UNPKG

@raydium-io/raydium-sdk-v2

Version:

An SDK for building applications on top of Raydium.

1 lines 672 kB
{"version":3,"sources":["../../../src/raydium/launchpad/instrument.ts","../../../src/marshmallow/index.ts","../../../src/marshmallow/buffer-layout.ts","../../../src/common/accountInfo.ts","../../../src/common/logger.ts","../../../src/common/bignumber.ts","../../../node_modules/decimal.js/decimal.mjs","../../../src/module/amount.ts","../../../src/module/formatter.ts","../../../src/module/fraction.ts","../../../src/common/constant.ts","../../../src/raydium/token/constant.ts","../../../src/module/token.ts","../../../src/common/pubKey.ts","../../../src/module/currency.ts","../../../src/module/percent.ts","../../../src/module/price.ts","../../../src/common/utility.ts","../../../src/common/pda.ts","../../../src/common/txTool/txUtils.ts","../../../src/common/programId.ts","../../../src/common/transfer.ts","../../../src/common/txTool/lookupTable.ts","../../../src/common/txTool/txTool.ts","../../../src/common/fee.ts","../../../src/raydium/clmm/clmm.ts","../../../src/raydium/token/utils.ts","../../../src/raydium/clmm/instrument.ts","../../../src/raydium/clmm/utils/tick.ts","../../../src/raydium/clmm/utils/constants.ts","../../../src/raydium/clmm/utils/math.ts","../../../src/raydium/clmm/utils/pda.ts","../../../src/raydium/clmm/utils/pool.ts","../../../src/raydium/clmm/utils/position.ts","../../../src/raydium/clmm/utils/tickarrayBitmap.ts","../../../src/raydium/clmm/layout.ts","../../../src/raydium/launchpad/pad.ts"],"sourcesContent":["import { PublicKey, SystemProgram, TransactionInstruction, AccountMeta } from \"@solana/web3.js\";\nimport { ASSOCIATED_TOKEN_PROGRAM_ID } from \"@solana/spl-token\";\nimport BN from \"bn.js\";\nimport { publicKey, str, struct, u64, u8 } from \"@/marshmallow\";\nimport { RENT_PROGRAM_ID, METADATA_PROGRAM_ID } from \"@/common\";\nimport { getPdaCpiEvent } from \"./pad\";\nexport const anchorDataBuf = {\n initialize: Buffer.from([175, 175, 109, 31, 13, 152, 155, 237]),\n buyExactIn: Buffer.from([250, 234, 13, 123, 213, 156, 19, 236]),\n buyExactOut: Buffer.from([24, 211, 116, 40, 105, 3, 153, 56]),\n sellExactIn: Buffer.from([149, 39, 222, 155, 211, 124, 152, 26]),\n sellExactOut: Buffer.from([95, 200, 71, 34, 8, 9, 11, 166]),\n createVestingAccount: Buffer.from([129, 178, 2, 13, 217, 172, 230, 218]),\n claimVestedToken: Buffer.from([49, 33, 104, 30, 189, 157, 79, 35]),\n\n createPlatformConfig: Buffer.from([176, 90, 196, 175, 253, 113, 220, 20]),\n claimPlatformFee: Buffer.from([156, 39, 208, 135, 76, 237, 61, 72]),\n updatePlaformConfig: Buffer.from([195, 60, 76, 129, 146, 45, 67, 143]),\n};\n\nexport function initialize(\n programId: PublicKey,\n\n payer: PublicKey,\n creator: PublicKey,\n configId: PublicKey,\n platformId: PublicKey,\n auth: PublicKey,\n poolId: PublicKey,\n mintA: PublicKey,\n mintB: PublicKey,\n vaultA: PublicKey,\n vaultB: PublicKey,\n metadataId: PublicKey,\n tokenProgramA: PublicKey,\n tokenProgramB: PublicKey,\n\n decimals: number,\n name: string,\n symbol: string,\n uri: string,\n\n curveParam: ({ type: \"ConstantCurve\"; totalSellA: BN } | { type: \"FixedCurve\" } | { type: \"LinearCurve\" }) & {\n migrateType: \"amm\" | \"cpmm\";\n supply: BN;\n totalFundRaisingB: BN;\n },\n\n totalLockedAmount: BN,\n cliffPeriod: BN,\n unlockPeriod: BN,\n): TransactionInstruction {\n const dataLayout1 = struct([u8(\"decimals\"), str(\"name\"), str(\"symbol\"), str(\"uri\")]);\n const dataLayout3 = struct([u64(\"totalLockedAmount\"), u64(\"cliffPeriod\"), u64(\"unlockPeriod\")]);\n\n const dataLayout21 = struct([u8(\"index\"), u64(\"supply\"), u64(\"totalFundRaisingB\"), u8(\"migrateType\")]);\n const dataLayout22 = struct([\n u8(\"index\"),\n u64(\"supply\"),\n u64(\"totalSellA\"),\n u64(\"totalFundRaisingB\"),\n u8(\"migrateType\"),\n ]);\n\n const keys: Array<AccountMeta> = [\n { pubkey: payer, isSigner: true, isWritable: false },\n { pubkey: creator, isSigner: false, isWritable: false },\n { pubkey: configId, isSigner: false, isWritable: false },\n { pubkey: platformId, isSigner: false, isWritable: false },\n { pubkey: auth, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: mintA, isSigner: true, isWritable: true },\n { pubkey: mintB, isSigner: false, isWritable: false },\n { pubkey: vaultA, isSigner: false, isWritable: true },\n { pubkey: vaultB, isSigner: false, isWritable: true },\n { pubkey: metadataId, isSigner: false, isWritable: true },\n\n { pubkey: tokenProgramA, isSigner: false, isWritable: false },\n { pubkey: tokenProgramB, isSigner: false, isWritable: false },\n { pubkey: METADATA_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: RENT_PROGRAM_ID, isSigner: false, isWritable: false },\n { pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },\n { pubkey: programId, isSigner: false, isWritable: false },\n ];\n\n const data1 = Buffer.alloc(\n Buffer.from(name, \"utf-8\").length +\n Buffer.from(symbol, \"utf-8\").length +\n Buffer.from(uri, \"utf-8\").length +\n 4 * 3 +\n 1,\n );\n const data3 = Buffer.alloc(dataLayout3.span);\n const data2 = Buffer.alloc(curveParam.type === \"ConstantCurve\" ? dataLayout22.span : dataLayout21.span);\n\n dataLayout1.encode({ decimals, name, symbol, uri }, data1);\n if (curveParam.type === \"ConstantCurve\") {\n dataLayout22.encode({ index: 0, ...curveParam, migrateType: curveParam.migrateType === \"amm\" ? 0 : 1 }, data2);\n } else if (curveParam.type === \"FixedCurve\") {\n dataLayout21.encode({ index: 1, ...curveParam, migrateType: curveParam.migrateType === \"amm\" ? 0 : 1 }, data2);\n } else if (curveParam.type === \"LinearCurve\") {\n dataLayout21.encode({ index: 2, ...curveParam, migrateType: curveParam.migrateType === \"amm\" ? 0 : 1 }, data2);\n }\n\n dataLayout3.encode({ totalLockedAmount, cliffPeriod, unlockPeriod }, data3);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.initialize, ...data1, ...data2, ...data3]),\n });\n}\nexport function buyExactInInstruction(\n programId: PublicKey,\n\n owner: PublicKey,\n auth: PublicKey,\n configId: PublicKey,\n platformId: PublicKey,\n poolId: PublicKey,\n userTokenAccountA: PublicKey,\n userTokenAccountB: PublicKey,\n vaultA: PublicKey,\n vaultB: PublicKey,\n mintA: PublicKey,\n mintB: PublicKey,\n tokenProgramA: PublicKey,\n tokenProgramB: PublicKey,\n\n amountB: BN,\n minAmountA: BN,\n shareFeeRate?: BN,\n\n shareFeeReceiver?: PublicKey,\n): TransactionInstruction {\n const dataLayout = struct([u64(\"amountB\"), u64(\"minAmountA\"), u64(\"shareFeeRate\")]);\n const keys: Array<AccountMeta> = [\n { pubkey: owner, isSigner: true, isWritable: false },\n { pubkey: auth, isSigner: false, isWritable: false },\n { pubkey: configId, isSigner: false, isWritable: false },\n { pubkey: platformId, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n\n { pubkey: userTokenAccountA, isSigner: false, isWritable: true },\n { pubkey: userTokenAccountB, isSigner: false, isWritable: true },\n { pubkey: vaultA, isSigner: false, isWritable: true },\n { pubkey: vaultB, isSigner: false, isWritable: true },\n { pubkey: mintA, isSigner: false, isWritable: false },\n { pubkey: mintB, isSigner: false, isWritable: false },\n\n { pubkey: tokenProgramA, isSigner: false, isWritable: false },\n { pubkey: tokenProgramB, isSigner: false, isWritable: false },\n { pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },\n { pubkey: programId, isSigner: false, isWritable: false },\n ];\n\n if (shareFeeReceiver) {\n keys.push({ pubkey: shareFeeReceiver, isSigner: false, isWritable: true });\n }\n console.log({\n amountB: amountB.toString(),\n minAmountA: minAmountA.toString(),\n });\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n amountB,\n minAmountA,\n shareFeeRate: shareFeeRate ?? new BN(0),\n },\n data,\n );\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.buyExactIn, ...data]),\n });\n}\n\nexport function buyExactOutInstruction(\n programId: PublicKey,\n\n owner: PublicKey,\n auth: PublicKey,\n configId: PublicKey,\n platformId: PublicKey,\n poolId: PublicKey,\n userTokenAccountA: PublicKey,\n userTokenAccountB: PublicKey,\n vaultA: PublicKey,\n vaultB: PublicKey,\n mintA: PublicKey,\n mintB: PublicKey,\n tokenProgramA: PublicKey,\n tokenProgramB: PublicKey,\n\n amountA: BN,\n maxAmountB: BN,\n shareFeeRate?: BN,\n\n shareFeeReceiver?: PublicKey,\n): TransactionInstruction {\n const dataLayout = struct([u64(\"amountA\"), u64(\"maxAmountB\"), u64(\"shareFeeRate\")]);\n\n const keys: Array<AccountMeta> = [\n { pubkey: owner, isSigner: true, isWritable: false },\n { pubkey: auth, isSigner: false, isWritable: false },\n { pubkey: configId, isSigner: false, isWritable: false },\n { pubkey: platformId, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n\n { pubkey: userTokenAccountA, isSigner: false, isWritable: true },\n { pubkey: userTokenAccountB, isSigner: false, isWritable: true },\n { pubkey: vaultA, isSigner: false, isWritable: true },\n { pubkey: vaultB, isSigner: false, isWritable: true },\n { pubkey: mintA, isSigner: false, isWritable: false },\n { pubkey: mintB, isSigner: false, isWritable: false },\n\n { pubkey: tokenProgramA, isSigner: false, isWritable: false },\n { pubkey: tokenProgramB, isSigner: false, isWritable: false },\n\n { pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },\n { pubkey: programId, isSigner: false, isWritable: false },\n ];\n\n if (shareFeeReceiver) {\n keys.push({ pubkey: shareFeeReceiver, isSigner: false, isWritable: true });\n }\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n amountA,\n maxAmountB,\n shareFeeRate: shareFeeRate ?? new BN(0),\n },\n data,\n );\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.buyExactOut, ...data]),\n });\n}\n\nexport function sellExactInInstruction(\n programId: PublicKey,\n\n owner: PublicKey,\n auth: PublicKey,\n configId: PublicKey,\n platformId: PublicKey,\n poolId: PublicKey,\n userTokenAccountA: PublicKey,\n userTokenAccountB: PublicKey,\n vaultA: PublicKey,\n vaultB: PublicKey,\n mintA: PublicKey,\n mintB: PublicKey,\n tokenProgramA: PublicKey,\n tokenProgramB: PublicKey,\n\n amountA: BN,\n minAmountB: BN,\n shareFeeRate?: BN,\n\n shareFeeReceiver?: PublicKey,\n): TransactionInstruction {\n const dataLayout = struct([u64(\"amountA\"), u64(\"minAmountB\"), u64(\"shareFeeRate\")]);\n const keys: Array<AccountMeta> = [\n { pubkey: owner, isSigner: true, isWritable: false },\n { pubkey: auth, isSigner: false, isWritable: false },\n { pubkey: configId, isSigner: false, isWritable: false },\n { pubkey: platformId, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n\n { pubkey: userTokenAccountA, isSigner: false, isWritable: true },\n { pubkey: userTokenAccountB, isSigner: false, isWritable: true },\n { pubkey: vaultA, isSigner: false, isWritable: true },\n { pubkey: vaultB, isSigner: false, isWritable: true },\n { pubkey: mintA, isSigner: false, isWritable: false },\n { pubkey: mintB, isSigner: false, isWritable: false },\n\n { pubkey: tokenProgramA, isSigner: false, isWritable: false },\n { pubkey: tokenProgramB, isSigner: false, isWritable: false },\n { pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },\n { pubkey: programId, isSigner: false, isWritable: false },\n ];\n\n if (shareFeeReceiver) {\n keys.push({ pubkey: shareFeeReceiver, isSigner: false, isWritable: true });\n }\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n amountA,\n minAmountB,\n shareFeeRate: shareFeeRate ?? new BN(0),\n },\n data,\n );\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.sellExactIn, ...data]),\n });\n}\n\nexport function sellExactOut(\n programId: PublicKey,\n\n owner: PublicKey,\n auth: PublicKey,\n configId: PublicKey,\n platformId: PublicKey,\n poolId: PublicKey,\n userTokenAccountA: PublicKey,\n userTokenAccountB: PublicKey,\n vaultA: PublicKey,\n vaultB: PublicKey,\n mintA: PublicKey,\n mintB: PublicKey,\n tokenProgramA: PublicKey,\n tokenProgramB: PublicKey,\n\n amountB: BN,\n maxAmountA: BN,\n shareFeeRate?: BN,\n\n shareFeeReceiver?: PublicKey,\n): TransactionInstruction {\n const dataLayout = struct([u64(\"amountB\"), u64(\"maxAmountA\"), u64(\"shareFeeRate\")]);\n\n const keys: Array<AccountMeta> = [\n { pubkey: owner, isSigner: true, isWritable: false },\n { pubkey: auth, isSigner: false, isWritable: false },\n { pubkey: configId, isSigner: false, isWritable: false },\n { pubkey: platformId, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n\n { pubkey: userTokenAccountA, isSigner: false, isWritable: true },\n { pubkey: userTokenAccountB, isSigner: false, isWritable: true },\n { pubkey: vaultA, isSigner: false, isWritable: true },\n { pubkey: vaultB, isSigner: false, isWritable: true },\n { pubkey: mintA, isSigner: false, isWritable: false },\n { pubkey: mintB, isSigner: false, isWritable: false },\n\n { pubkey: tokenProgramA, isSigner: false, isWritable: false },\n { pubkey: tokenProgramB, isSigner: false, isWritable: false },\n\n { pubkey: getPdaCpiEvent(programId).publicKey, isSigner: false, isWritable: false },\n { pubkey: programId, isSigner: false, isWritable: false },\n ];\n\n if (shareFeeReceiver) {\n keys.push({ pubkey: shareFeeReceiver, isSigner: false, isWritable: true });\n }\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode(\n {\n amountB,\n maxAmountA,\n shareFeeRate: shareFeeRate ?? new BN(0),\n },\n data,\n );\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.sellExactOut, ...data]),\n });\n}\n\nexport function claimVestedToken(\n programId: PublicKey,\n\n owner: PublicKey,\n auth: PublicKey,\n poolId: PublicKey,\n\n vestingRecord: PublicKey,\n\n userTokenAccountA: PublicKey,\n vaultA: PublicKey,\n mintA: PublicKey,\n tokenProgramA: PublicKey,\n): TransactionInstruction {\n const dataLayout = struct([]);\n\n const keys: Array<AccountMeta> = [\n { pubkey: owner, isSigner: true, isWritable: false },\n { pubkey: auth, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n\n { pubkey: vestingRecord, isSigner: false, isWritable: true },\n\n { pubkey: userTokenAccountA, isSigner: false, isWritable: true },\n { pubkey: vaultA, isSigner: false, isWritable: true },\n { pubkey: mintA, isSigner: false, isWritable: false },\n { pubkey: tokenProgramA, isSigner: false, isWritable: false },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode({}, data);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.claimVestedToken, ...data]),\n });\n}\n\nexport function createVestingAccount(\n programId: PublicKey,\n\n owner: PublicKey,\n beneficiary: PublicKey,\n poolId: PublicKey,\n\n vestingRecord: PublicKey,\n shareAmount: BN,\n): TransactionInstruction {\n const dataLayout = struct([u64(\"shareAmount\")]);\n\n const keys: Array<AccountMeta> = [\n { pubkey: owner, isSigner: true, isWritable: false },\n { pubkey: beneficiary, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n\n { pubkey: vestingRecord, isSigner: false, isWritable: true },\n\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n ];\n\n const data = Buffer.alloc(dataLayout.span);\n dataLayout.encode({ shareAmount }, data);\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.createVestingAccount, ...data]),\n });\n}\n\nexport function claimPlatformFee(\n programId: PublicKey,\n platformClaimFeeWallet: PublicKey,\n auth: PublicKey,\n poolId: PublicKey,\n platformId: PublicKey,\n vaultB: PublicKey,\n userTokenAccountB: PublicKey,\n mintB: PublicKey,\n tokenProgramB: PublicKey,\n): TransactionInstruction {\n const keys: Array<AccountMeta> = [\n { pubkey: platformClaimFeeWallet, isSigner: true, isWritable: false },\n { pubkey: auth, isSigner: false, isWritable: false },\n { pubkey: poolId, isSigner: false, isWritable: true },\n { pubkey: platformId, isSigner: false, isWritable: true },\n { pubkey: vaultB, isSigner: false, isWritable: true },\n { pubkey: userTokenAccountB, isSigner: false, isWritable: true },\n { pubkey: mintB, isSigner: false, isWritable: true },\n { pubkey: tokenProgramB, isSigner: false, isWritable: true },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: true },\n { pubkey: ASSOCIATED_TOKEN_PROGRAM_ID, isSigner: false, isWritable: true },\n ];\n\n return new TransactionInstruction({\n keys,\n programId,\n data: anchorDataBuf.claimPlatformFee,\n });\n}\n\nexport function createPlatformConfig(\n programId: PublicKey,\n\n platformAdmin: PublicKey,\n platformClaimFeeWallet: PublicKey,\n platformLockNftWallet: PublicKey,\n platformId: PublicKey,\n\n migrateCpLockNftScale: {\n platformScale: BN;\n creatorScale: BN;\n burnScale: BN;\n },\n feeRate: BN,\n name: string,\n web: string,\n img: string,\n): TransactionInstruction {\n const dataLayout = struct([\n u64(\"platformScale\"),\n u64(\"creatorScale\"),\n u64(\"burnScale\"),\n\n u64(\"feeRate\"),\n str(\"name\"),\n str(\"web\"),\n str(\"img\"),\n ]);\n\n const keys: Array<AccountMeta> = [\n { pubkey: platformAdmin, isSigner: true, isWritable: true },\n { pubkey: platformClaimFeeWallet, isSigner: false, isWritable: false },\n { pubkey: platformLockNftWallet, isSigner: false, isWritable: false },\n { pubkey: platformId, isSigner: false, isWritable: true },\n { pubkey: SystemProgram.programId, isSigner: false, isWritable: false },\n ];\n\n const data = Buffer.alloc(\n 8 * 4 +\n Buffer.from(name, \"utf-8\").length +\n Buffer.from(web, \"utf-8\").length +\n Buffer.from(img, \"utf-8\").length +\n 4 * 3,\n );\n dataLayout.encode(\n {\n platformScale: migrateCpLockNftScale.platformScale,\n creatorScale: migrateCpLockNftScale.creatorScale,\n burnScale: migrateCpLockNftScale.burnScale,\n feeRate,\n name,\n web,\n img,\n },\n data,\n );\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.createPlatformConfig, ...data]),\n });\n}\n\nexport function updatePlatformConfig(\n programId: PublicKey,\n\n platformAdmin: PublicKey,\n platformId: PublicKey,\n\n updateInfo:\n | { type: \"updateClaimFeeWallet\" | \"updateLockNftWallet\"; value: PublicKey }\n | { type: \"updateFeeRate\"; value: BN }\n | { type: \"updateName\" | \"updateImg\" | \"updateWeb\"; value: string }\n | { type: \"migrateCpLockNftScale\"; value: { platformScale: BN; creatorScale: BN; burnScale: BN } },\n): TransactionInstruction {\n const keys: Array<AccountMeta> = [\n { pubkey: platformAdmin, isSigner: true, isWritable: false },\n { pubkey: platformId, isSigner: false, isWritable: true },\n ];\n\n let data: Buffer;\n if (updateInfo.type === \"updateClaimFeeWallet\") {\n const dataLayout = struct([u8(\"index\"), publicKey(\"value\")]);\n data = Buffer.alloc(dataLayout.span);\n dataLayout.encode({ index: 0, value: updateInfo.value }, data);\n } else if (updateInfo.type === \"updateLockNftWallet\") {\n const dataLayout = struct([u8(\"index\"), publicKey(\"value\")]);\n data = Buffer.alloc(dataLayout.span);\n dataLayout.encode({ index: 1, value: updateInfo.value }, data);\n } else if (updateInfo.type === \"migrateCpLockNftScale\") {\n const dataLayout = struct([u8(\"index\"), u64(\"platformScale\"), u64(\"creatorScale\"), u64(\"burnScale\")]);\n data = Buffer.alloc(dataLayout.span);\n dataLayout.encode({ index: 2, ...updateInfo.value }, data);\n } else if (updateInfo.type === \"updateFeeRate\") {\n const dataLayout = struct([u8(\"index\"), u64(\"value\")]);\n data = Buffer.alloc(dataLayout.span);\n dataLayout.encode({ index: 3, value: updateInfo.value }, data);\n } else if (updateInfo.type === \"updateImg\" || updateInfo.type === \"updateName\" || updateInfo.type === \"updateWeb\") {\n const dataLayout = struct([u8(\"index\"), str(\"value\")]);\n data = Buffer.alloc(dataLayout.span);\n if (updateInfo.type === \"updateName\") dataLayout.encode({ index: 4, value: updateInfo.value }, data);\n else if (updateInfo.type === \"updateWeb\") dataLayout.encode({ index: 5, value: updateInfo.value }, data);\n else if (updateInfo.type === \"updateImg\") dataLayout.encode({ index: 6, value: updateInfo.value }, data);\n } else {\n throw Error(\"updateInfo params type error\");\n }\n\n return new TransactionInstruction({\n keys,\n programId,\n data: Buffer.from([...anchorDataBuf.updatePlaformConfig, ...data]),\n });\n}\n","import { PublicKey } from \"@solana/web3.js\";\nimport BN, { isBN } from \"bn.js\";\n\nimport {\n bits,\n blob,\n Blob,\n Layout,\n offset as _offset,\n seq as _seq,\n Structure as _Structure,\n u32 as _u32,\n u8 as _u8,\n UInt,\n union as _union,\n Union as _Union,\n} from \"./buffer-layout\";\n\nexport * from \"./buffer-layout\";\nexport { blob };\n\nexport class BNLayout<P extends string = \"\"> extends Layout<BN, P> {\n blob: Layout<Buffer>;\n signed: boolean;\n\n constructor(span: number, signed: boolean, property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends, but it desn't matter\n super(span, property);\n this.blob = blob(span);\n this.signed = signed;\n }\n\n /** @override */\n decode(b: Buffer, offset = 0): BN {\n const num = new BN(this.blob.decode(b, offset), 10, \"le\");\n if (this.signed) {\n return num.fromTwos(this.span * 8).clone();\n }\n return num;\n }\n\n /** @override */\n encode(src: BN, b: Buffer, offset = 0): number {\n if (typeof src === \"number\") src = new BN(src); // src will pass a number accidently in union\n if (this.signed) {\n src = src.toTwos(this.span * 8);\n }\n return this.blob.encode(src.toArrayLike(Buffer, \"le\", this.span), b, offset);\n }\n}\n\nexport class WideBits<P extends string = \"\"> extends Layout<Record<string, boolean>, P> {\n _lower: any;\n _upper: any;\n // TODO: unknown\n constructor(property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n super(8, property);\n this._lower = bits(_u32(), false);\n this._upper = bits(_u32(), false);\n }\n\n addBoolean(property: string): void {\n if (this._lower.fields.length < 32) {\n this._lower.addBoolean(property);\n } else {\n this._upper.addBoolean(property);\n }\n }\n\n decode(b: Buffer, offset = 0): Record<string, boolean> {\n const lowerDecoded = this._lower.decode(b, offset);\n const upperDecoded = this._upper.decode(b, offset + this._lower.span);\n return { ...lowerDecoded, ...upperDecoded };\n }\n\n encode(src: any /* TEMP */, b: Buffer, offset = 0): any {\n return this._lower.encode(src, b, offset) + this._upper.encode(src, b, offset + this._lower.span);\n }\n}\n\nexport function u8<P extends string = \"\">(property?: P): UInt<number, P> {\n return new UInt(1, property);\n}\n\nexport function u32<P extends string = \"\">(property?: P): UInt<number, P> {\n return new UInt(4, property);\n}\n\nexport function u64<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(8, false, property);\n}\n\nexport function u128<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(16, false, property);\n}\n\nexport function i8<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(1, true, property);\n}\n\nexport function i64<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(8, true, property);\n}\n\nexport function i128<P extends string = \"\">(property?: P): BNLayout<P> {\n return new BNLayout(16, true, property);\n}\n\nexport class WrappedLayout<T, U, P extends string = \"\"> extends Layout<U, P> {\n layout: Layout<T>;\n decoder: (data: T) => U;\n encoder: (src: U) => T;\n\n constructor(layout: Layout<T>, decoder: (data: T) => U, encoder: (src: U) => T, property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n super(layout.span, property);\n this.layout = layout;\n this.decoder = decoder;\n this.encoder = encoder;\n }\n\n decode(b: Buffer, offset?: number): U {\n return this.decoder(this.layout.decode(b, offset));\n }\n\n encode(src: U, b: Buffer, offset?: number): number {\n return this.layout.encode(this.encoder(src), b, offset);\n }\n\n getSpan(b: Buffer, offset?: number): number {\n return this.layout.getSpan(b, offset);\n }\n}\n\nexport function publicKey<P extends string = \"\">(property?: P): Layout<PublicKey, P> {\n return new WrappedLayout(\n blob(32),\n (b: Buffer) => new PublicKey(b),\n (key: PublicKey) => key.toBuffer(),\n property,\n );\n}\n\nexport class OptionLayout<T, P> extends Layout<T | null, P> {\n layout: Layout<T>;\n discriminator: Layout<number>;\n\n constructor(layout: Layout<T>, property?: P) {\n //@ts-expect-error type wrong for super()'s type different from extends , but it desn't matter\n super(-1, property);\n this.layout = layout;\n this.discriminator = _u8();\n }\n\n encode(src: T | null, b: Buffer, offset = 0): number {\n if (src === null || src === undefined) {\n return this.discriminator.encode(0, b, offset);\n }\n this.discriminator.encode(1, b, offset);\n return this.layout.encode(src, b, offset + 1) + 1;\n }\n\n decode(b: Buffer, offset = 0): T | null {\n const discriminator = this.discriminator.decode(b, offset);\n if (discriminator === 0) {\n return null;\n } else if (discriminator === 1) {\n return this.layout.decode(b, offset + 1);\n }\n throw new Error(\"Invalid option \" + this.property);\n }\n\n getSpan(b: Buffer, offset = 0): number {\n const discriminator = this.discriminator.decode(b, offset);\n if (discriminator === 0) {\n return 1;\n } else if (discriminator === 1) {\n return this.layout.getSpan(b, offset + 1) + 1;\n }\n throw new Error(\"Invalid option \" + this.property);\n }\n}\n\nexport function option<T, P extends string = \"\">(layout: Layout<T>, property?: P): Layout<T | null, P> {\n return new OptionLayout<T, P>(layout, property);\n}\n\nexport function bool<P extends string = \"\">(property?: P): Layout<boolean, P> {\n return new WrappedLayout(_u8(), decodeBool, encodeBool, property);\n}\n\nexport function decodeBool(value: number): boolean {\n if (value === 0) {\n return false;\n } else if (value === 1) {\n return true;\n }\n throw new Error(\"Invalid bool: \" + value);\n}\n\nexport function encodeBool(value: boolean): number {\n return value ? 1 : 0;\n}\n\nexport function vec<T, P extends string = \"\">(elementLayout: Layout<T>, property?: P): Layout<T[], P> {\n const length = _u32(\"length\");\n const layout: Layout<{ values: T[] }> = struct([\n length,\n seq(elementLayout, _offset(length, -length.span), \"values\"),\n ]) as any; // Something I don't know\n return new WrappedLayout(\n layout,\n ({ values }) => values,\n (values) => ({ values }),\n property,\n );\n}\n\nexport function tagged<T, P extends string = \"\">(tag: BN, layout: Layout<T>, property?: P): Layout<T, P> {\n const wrappedLayout: Layout<{ tag: BN; data: T }> = struct([u64(\"tag\"), layout.replicate(\"data\")]) as any; // Something I don't know\n\n function decodeTag({ tag: receivedTag, data }: { tag: BN; data: T }): T {\n if (!receivedTag.eq(tag)) {\n throw new Error(\"Invalid tag, expected: \" + tag.toString(\"hex\") + \", got: \" + receivedTag.toString(\"hex\"));\n }\n return data;\n }\n\n return new WrappedLayout(wrappedLayout, decodeTag, (data) => ({ tag, data }), property);\n}\n\nexport function vecU8<P extends string = \"\">(property?: P): Layout<Buffer, P> {\n const length = _u32(\"length\");\n const layout: Layout<{ data: Buffer }> = struct([length, blob(_offset(length, -length.span), \"data\")]) as any; // Something I don't know\n return new WrappedLayout(\n layout,\n ({ data }) => data,\n (data) => ({ data }),\n property,\n );\n}\n\nexport function str<P extends string = \"\">(property?: P): Layout<string, P> {\n return new WrappedLayout(\n vecU8(),\n (data) => data.toString(\"utf-8\"),\n (s) => Buffer.from(s, \"utf-8\"),\n property,\n );\n}\n\nexport interface EnumLayout<T, P extends string = \"\"> extends Layout<T, P> {\n registry: Record<string, Layout<any>>;\n}\n\nexport function rustEnum<T, P extends string = \"\">(variants: Layout<any>[], property?: P): EnumLayout<T, P> {\n const unionLayout = _union(_u8(), property);\n variants.forEach((variant, index) => unionLayout.addVariant(index, variant, variant.property));\n return unionLayout as any; // ?why use UnionLayout? This must be a fault\n}\n\nexport function array<T, P extends string = \"\">(\n elementLayout: Layout<T>,\n length: number,\n property?: P,\n): Layout<T[], P> {\n const layout = struct([seq(elementLayout, length, \"values\")]) as any as Layout<{ values: T[] }>; // Something I don't know\n return new WrappedLayout(\n layout,\n ({ values }) => values,\n (values) => ({ values }),\n property,\n );\n}\n\nexport class Structure<T, P, D extends { [key: string]: any; }> extends _Structure<T, P, D> {\n /** @override */\n decode(b: Buffer, offset?: number): D {\n return super.decode(b, offset);\n }\n}\n\nexport function struct<T, P extends string = \"\">(\n fields: T,\n property?: P,\n decodePrefixes?: boolean,\n): T extends Layout<infer Value, infer Property>[]\n ? Structure<\n Value,\n P,\n {\n [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n ? V\n : any;\n }\n >\n : any {\n //@ts-expect-error this type is not quite satisfied the define, but, never no need to worry about.\n return new Structure(fields, property, decodePrefixes);\n}\n\nexport type GetLayoutSchemaFromStructure<T extends Structure<any, any, any>> = T extends Structure<any, any, infer S>\n ? S\n : any;\nexport type GetStructureFromLayoutSchema<S extends { [key: string]: any; }> = Structure<any, any, S>;\n\nexport class Union<Schema extends { [key: string]: any; }> extends _Union<Schema> {\n encodeInstruction(instruction: any): Buffer {\n const instructionMaxSpan = Math.max(...Object.values(this.registry).map((r) => r.span));\n const b = Buffer.alloc(instructionMaxSpan);\n return b.slice(0, this.encode(instruction, b));\n }\n\n decodeInstruction(instruction: any): Partial<Schema> {\n return this.decode(instruction);\n }\n}\nexport function union<UnionSchema extends { [key: string]: any } = any>(\n discr: any,\n defaultLayout?: any,\n property?: string,\n): Union<UnionSchema> {\n return new Union(discr, defaultLayout, property);\n}\n\nclass Zeros extends Blob {\n decode(b: Buffer, offset: number): Buffer {\n const slice = super.decode(b, offset);\n if (!slice.every((v) => v === 0)) {\n throw new Error(\"nonzero padding bytes\");\n }\n return slice;\n }\n}\n\nexport function zeros(length: number): Zeros {\n return new Zeros(length);\n}\n\nexport function seq<T, P extends string = \"\", AnotherP extends string = \"\">(\n elementLayout: Layout<T, P>,\n count: number | BN | Layout<BN | number, P>,\n property?: AnotherP,\n): Layout<T[], AnotherP> {\n let parsedCount: number;\n const superCount =\n typeof count === \"number\"\n ? count\n : isBN(count)\n ? count.toNumber()\n : new Proxy(count as unknown as Layout<number> /* pretend to be Layout<number> */, {\n get(target, property): any {\n if (!parsedCount) {\n // get count in targetLayout. note that count may be BN\n const countProperty = Reflect.get(target, \"count\");\n\n // let targetLayout's property:count be a number\n parsedCount = isBN(countProperty) ? countProperty.toNumber() : countProperty;\n\n // record the count\n Reflect.set(target, \"count\", parsedCount);\n }\n return Reflect.get(target, property);\n },\n set(target, property, value): any {\n if (property === \"count\") {\n parsedCount = value;\n }\n return Reflect.set(target, property, value);\n },\n });\n\n // @ts-expect-error force type\n return _seq(elementLayout, superCount, property);\n}\n","import {\n bits as _bits,\n BitStructure as _BitStructure,\n blob as _blob,\n Blob as _Blob,\n cstr as _cstr,\n f32 as _f32,\n f32be as _f32be,\n f64 as _f64,\n f64be as _f64be,\n greedy as _greedy,\n Layout as _Layout,\n ns64 as _ns64,\n ns64be as _ns64be,\n nu64 as _nu64,\n nu64be as _nu64be,\n offset as _offset,\n s16 as _s16,\n s16be as _s16be,\n s24 as _s24,\n s24be as _s24be,\n s32 as _s32,\n s32be as _s32be,\n s40 as _s40,\n s40be as _s40be,\n s48 as _s48,\n s48be as _s48be,\n s8 as _s8,\n seq as _seq,\n struct as _struct,\n Structure as _Structure,\n u16 as _u16,\n u16be as _u16be,\n u24 as _u24,\n u24be as _u24be,\n u32 as _u32,\n u32be as _u32be,\n u40 as _u40,\n u40be as _u40be,\n u48 as _u48,\n u48be as _u48be,\n u8 as _u8,\n UInt as _UInt,\n union as _union,\n Union as _Union,\n unionLayoutDiscriminator as _unionLayoutDiscriminator,\n utf8 as _utf8,\n} from \"@solana/buffer-layout\";\n\n//#region ------------------- Layout -------------------\nexport interface Layout<T = any, P = \"\"> {\n span: number;\n property?: P;\n decode(b: Buffer, offset?: number): T;\n encode(src: T, b: Buffer, offset?: number): number;\n getSpan(b: Buffer, offset?: number): number;\n replicate<AP extends string>(name: AP): Layout<T, AP>;\n}\nexport interface LayoutConstructor {\n new <T, P>(): Layout<T, P>; // for class extends syntex\n new <T, P>(span?: T, property?: P): Layout<T, P>;\n readonly prototype: Layout;\n}\nexport const Layout = _Layout as unknown as LayoutConstructor;\n//#endregion\n\n//#region ------------------- Structure -------------------\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nexport interface Structure<T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>\n extends Layout<DecodeSchema, P> {\n span: number;\n decode(b: Buffer, offset?: number): DecodeSchema;\n layoutFor<AP extends string>(property: AP): Layout<DecodeSchema[AP]>;\n offsetOf<AP extends string>(property: AP): number;\n}\ninterface StructureConstructor {\n new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(): Structure<T, P, DecodeSchema>;\n new <T = any, P = \"\", DecodeSchema extends { [key: string]: any } = any>(\n fields: T,\n property?: P,\n decodePrefixes?: boolean,\n ): Structure<T, P, DecodeSchema>;\n}\nexport const Structure = _Structure as unknown as StructureConstructor;\n//#endregion\n\n//#region ------------------- Union -------------------\nexport interface Union<UnionSchema extends { [key: string]: any } = any> extends Layout {\n registry: object;\n decode(b: Buffer, offset?: number): Partial<UnionSchema>;\n addVariant(\n variant: number,\n layout: Structure<any, any, Partial<UnionSchema>> | Layout<any, keyof UnionSchema>,\n property?: string,\n ): any /* TEMP: code in Layout.js 1809 */;\n}\ninterface UnionConstructor {\n new <UnionSchema extends { [key: string]: any } = any>(): Union<UnionSchema>;\n new <UnionSchema extends { [key: string]: any } = any>(\n discr: Layout<any, any>,\n defaultLayout: Layout<any, any>,\n property?: string,\n ): Union<UnionSchema>;\n}\nexport const Union = _Union as unknown as UnionConstructor;\n//#endregion\n\n//#region ------------------- BitStructure -------------------\nexport type BitStructure<T = unknown /* TEMP */, P = \"\"> = Layout<T, P>;\ninterface BitStructureConstructor {\n new (...params: any[]): BitStructure;\n}\nexport const BitStructure = _BitStructure as BitStructureConstructor;\n//#endregion\n\n//#region ------------------- UInt -------------------\nexport type UInt<T = any, P = \"\"> = Layout<T, P>;\ninterface UIntConstructor {\n new <T, P>(span?: T, property?: P): UInt<T, P>;\n}\nexport const UInt = _UInt as UIntConstructor;\n//#endregion\n\n//#region ------------------- Blob -------------------\nexport type Blob<P extends string = \"\"> = Layout<Buffer, P>;\ninterface BlobConstructor {\n new (...params: ConstructorParameters<LayoutConstructor>): Blob;\n}\nexport const Blob = _Blob as unknown as BlobConstructor;\n//#endregion\n\nexport const greedy = _greedy as <P extends string = \"\">(elementSpan?: number, property?: P) => Layout<number, P>;\nexport const u8 = _u8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16 = _u16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24 = _u24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32 = _u32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40 = _u40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48 = _u48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64 = _nu64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u16be = _u16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u24be = _u24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u32be = _u32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u40be = _u40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const u48be = _u48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const nu64be = _nu64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s8 = _s8 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16 = _s16 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24 = _s24 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32 = _s32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40 = _s40 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48 = _s48 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64 = _ns64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s16be = _s16be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s24be = _s24be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s32be = _s32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s40be = _s40be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const s48be = _s48be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const ns64be = _ns64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32 = _f32 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f32be = _f32be as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64 = _f64 as <P extends string = \"\">(property?: P) => Layout<number, P>;\nexport const f64be = _f64be as <P extends string = \"\">(property?: P) => Layout<number, P>;\n\nexport const struct = _struct as <T, P extends string = \"\">(\n fields: T,\n property?: P,\n decodePrefixes?: boolean,\n) => T extends Layout<infer Value, infer Property>[]\n ? Structure<\n Value,\n P,\n {\n [K in Exclude<Extract<Property, string>, \"\">]: Extract<T[number], Layout<any, K>> extends Layout<infer V, any>\n ? V\n : any;\n }\n >\n : any;\n\nexport const seq = _seq as unknown as <T, P>(\n elementLayout: Layout<T, string>,\n count: number | Layout<number, string>,\n property?: P,\n) => Layout<T[]>;\nexport const union = _union as <UnionSchema extends { [key: string]: any } = any>(\n discr: Layout<any, any>,\n defaultLayout?: any,\n property?: string,\n) => Union<UnionSchema>;\nexport const unionLayoutDiscriminator = _unionLayoutDiscriminator as <P extends string = \"\">(\n layout: Layout<any, P>,\n property?: P,\n) => any;\nexport const blob = _blob as unknown as <P extends string = \"\">(\n length: number | Layout<number, P>,\n property?: P,\n) => Blob<P>;\nexport const cstr = _cstr as <P extends string = \"\">(property?: P) => Layout<string, P>;\nexport const utf8 = _utf8 as <P extends string = \"\">(maxSpan: number, property?: P) => Layout<string, P>;\nexport const bits = _bits as unknown as <T, P extends string = \"\">(\n word: Layout<T>,\n msb?: boolean,\n property?: P,\n) => BitStructure<T, P>; // TODO: not quite sure\nexport const offset = _offset as unknown as <T, P extends string = \"\">(\n layout: Layout<T, P>,\n offset?: number,\n property?: P,\n) => Layout<T, P>;\n\nexport type GetStructureSchema<T extends Structure> = T extends Structure<any, any, infer S> ? S : unknown;\n","import { AccountInfo, Commitment, Connection, PublicKey } from \"@solana/web3.js\";\nimport { ReturnTypeFetchMultipleMintInfos } from \"../raydium/type\";\nimport { WSOLMint, chunkArray, solToWSol } from \"./\";\nimport { createLogger } from \"./logger\";\nimport { MINT_SIZE, TOKEN_PROGRAM_ID, getTransferFeeConfig, unpackMint } from \"@solana/spl-token\";\n\ninterface MultipleAccountsJsonRpcResponse {\n jsonrpc: string;\n id: string;\n error?: {\n code: number;\n message: string;\n };\n result: {\n context: { slot: number };\n value: { data: Array<string>; executable: boolean; lamports: number; owner: string; rentEpoch: number }[];\n };\n}\n\nexport interface GetMultipleAccountsInfoConfig {\n batchRequest?: boolean;\n commitment?: Commitment;\n chunkCount?: number;\n}\n\nconst logger = createLogger(\"Raydium_accountInfo_util\");\n\nexport async function getMultipleAccountsInfo(\n connection: Connection,\n publicKeys: PublicKey[],\n config?: GetMultipleAccountsInfoConfig,\n): Promise<(AccountInfo<Buffer> | null)[]> {\n const {\n batchRequest,\n commitment = \"confirmed\",\n chunkCount = 100,\n } = {\n batchRequest: false,\n ...config,\n };\n\n const chunkedKeys = chunkArray(publicKeys, chunkCount);\n let results: (AccountInfo<Buffer> | null)[][] = new Array(chunkedKeys.length).fill([]);\n\n if (batchRequest) {\n const batch = chunkedKeys.map((keys) => {\n const args = connection._buildArgs([keys.map((key) => key.toBase58())], commitment, \"base64\");\n return {\n methodName: \"getMultipleAccounts\",\n args,\n };\n });\n\n const _batch = chunkArray(batch, 10);\n\n const unsafeResponse: MultipleAccountsJsonRpcResponse[] = await (\n await Promise.all(_batch.map(async (i) => await (connection as any)._rpcBatchRequest(i)))\n ).flat();\n results = unsafeResponse.map((unsafeRes: MultipleAccountsJsonRpcResponse) => {\n if (unsafeRes.error)\n logger.logWithError(`failed to get info for multiple accounts, RPC_ERROR, ${unsafeRes.error.message}`);\n\n return unsafeRes.result.value.map((accountInfo) => {\n if (accountInfo) {\n const { data, executable, lamports, owner, rentEpoch } = accountInfo;\n\n if (data.length !== 2 && data[1] !== \"base64\") logger.logWithError(`info must be base64 encoded, RPC_ERROR`);\n\n return {\n data: Buffer.from(data[0], \"base64\"),\n executable,\n lamports,\n owner: new PublicKey(owner),\n rentEpoch,\n };\n }\n return null;\n });\n });\n } else {\n try {\n results = (await Promise.all(\n chunkedKeys.map((keys) => connection.getMultipleAccountsInfo(keys, commitment)),\n )) as (AccountInfo<Buffer> | null)[][];\n } catch (error) {\n if (error instanceof Error) {\n logger.logWithError(`failed to get info for multiple accounts, RPC_ERROR, ${error.message}`);\n }\n }\n }\n\n return results.flat();\n}\n\nexport async function getMultipleAccountsInfoWithCustomFlags<T extends { pubkey: PublicKey }>(\n connection: Connection,\n publicKeysWithCustomFlag: T[],\n config?: GetMultipleAccountsInfoConfig,\n): Promise<({ accountInfo: AccountInfo<Buffer> | null } & T)[]> {\n const multipleAccountsInfo = await getMultipleAccountsInfo(\n connection,\n publicKeysWithCustomFlag.map((o) => o.pubkey),\n config,\n );\n\n return publicKeysWithCustomFlag.map((o, idx) => ({ ...o, accountInfo: multipleAccountsInfo[idx] }));\n}\n\nexport enum AccountType {\n Uninitialized,\n Mint,\n Account,\n}\nexport const ACCOUNT_TYPE_SIZE = 1;\n\nexport async function fetchMultipleMintInfos({\n connection,\n mints,\n config,\n}: {\n connection: Connection;\n mints: PublicKey[];\n config?: { batchRequest?: boolean };\n}): Promise<ReturnTypeFetchMultipleMintInfos> {\n if (mints.length === 0) return {};\n const mintInfos = await getMultipleAccountsInfoWithCustomFlags(\n connection,\n mints.map((i) => ({ pubkey: solToWSol(i) })),\n config,\n );\n\n const mintK: ReturnTypeFetchMultipleMintInfos = {};\n for (const i of mintInfos) {\n if (!i.accountInfo || i.accountInfo.data.length < MINT_SIZE) {\n console.log(\"invalid mint account\", i.pubkey.toBase58());\n continue;\n }\n const t = unpackMint(i.pubkey, i.accountInfo, i.accountInfo?.owner);\n mintK[i.pubkey.toString()] = {\n ...t,\n programId: i.accountInfo?.owner || TOKEN_PROGRAM_ID,\n feeConfig: getTransferFeeConfig(t) ?? undefined,\n };\n }\n mintK[PublicKey.default.toBase58()] = mintK[WSOLMint.toBase58()];\n\n return mintK;\n}\n","import { get, set } from \"lodash\";\n\nexport type ModuleName = \"Common.Api\";\n\nexport enum LogLevel {\n Error,\n Warning,\n Info,\n Debug,\n}\nexport class Logger {\n private logLevel: LogLevel;\n private name: string;\n constructor(params: { name: string; logLevel?: LogLevel }) {\n this.logLevel = params.logLevel !== undefined ? params.logLevel : LogLevel.Error;\n this.name = params.name;\n }\n\n set level(logLevel: LogLevel) {\n this.logLevel = logLevel;\n }\n get time(): string {\n return Date.now().toString();\n }\n get moduleName(): string {\n return this.name;\n }\n\n private isLogLevel(level: LogLevel): boolean {\n return level <= this.logLevel;\n }\n\n public error(...props): Logger {\n if (!this.isLogLevel(LogLevel.Error)) return this;\n console.error(this.time, this.name, \"sdk logger error\", ...props);\n return this;\n }\n\n public logWithError(...props): Logger {\n // this.error(...props)\n const msg = props.map((arg) => (typeof arg === \"object\" ? JSON.stringify(arg) : arg)).join(\", \");\n throw new Error(msg);\n }\n\n public warning(...props): Logger {\n if (!this.isLogLevel(LogLevel.Warning)) return this;\n console.warn(this.time, this.name, \"sdk logger warning\", ...props);\n return this;\n }\n\n public info(...props): Logger {\n if (!this.isLogLevel(LogLevel.Info)) return this;\n console.info(this.time, this.name, \"sdk logger info\", ...props);\n return this;\n }\n\n public debug(...props): Logger {\n if (!this.isLogLevel(LogLevel.Debug)) return this;\n console.debug(this.time, this.name, \"sdk logger debug\", ...props);\n return this;\n }\n}\n\nconst moduleLoggers: { [key in ModuleName]?: Logger } = {};\nconst moduleLevels: { [key in ModuleName]?: LogLevel } = {};\n\nexport function createLogger(moduleName: string): Logger {\n let logger = get(moduleLoggers, moduleName);\n if (!logger) {\n // default level is error\n const logLevel = get(moduleLevels, moduleName);\n\n logger = new Logger({ name: moduleName, logLevel });\n set(moduleLoggers, moduleName, logger);\n }\n\n return logger;\n}\n\nexport function setLoggerLevel(moduleName: string, level: LogLevel): void {\n set(moduleLevels, moduleName, level);\n\n const logger = get(moduleLoggers, moduleName);\n if (logger) logger.level = level;\n}\n","import BN from \"bn.js\";\nimport Decimal from \"decimal.js\";\nimport { CurrencyAmount, TokenAmount } from \"../module/amount\";\nimport { Currency } from \"../module/currency\";\nimport { Fraction } from \"../module/fraction\";\nimport { Percent } from