mango-v4/ts/client/scripts/mm/sequence-enforcer-util.ts

69 lines
1.9 KiB
TypeScript

import { BN } from '@coral-xyz/anchor';
import {
PublicKey,
SystemProgram,
TransactionInstruction,
} from '@solana/web3.js';
import { createHash } from 'crypto';
export const seqEnforcerProgramIds = {
devnet: new PublicKey('FBngRHN4s5cmHagqy3Zd6xcK3zPJBeX5DixtHFbBhyCn'),
testnet: new PublicKey('FThcgpaJM8WiEbK5rw3i31Ptb8Hm4rQ27TrhfzeR1uUy'),
'mainnet-beta': new PublicKey('GDDMwNyyx8uB6zrqwBFHjLLG3TBYk2F8Az4yrQC5RzMp'),
};
export function makeInitSequenceEnforcerAccountIx(
account: PublicKey,
ownerPk: PublicKey,
bump: number,
sym: string,
cluster: string,
): TransactionInstruction {
const keys = [
{ isSigner: false, isWritable: true, pubkey: account },
{ isSigner: true, isWritable: true, pubkey: ownerPk },
{ isSigner: false, isWritable: false, pubkey: SystemProgram.programId },
];
const variant = createHash('sha256')
.update('global:initialize')
.digest()
.slice(0, 8);
const bumpData = new BN(bump).toBuffer('le', 1);
const strLen = new BN(sym.length).toBuffer('le', 4);
const symEncoded = Buffer.from(sym);
const data = Buffer.concat([variant, bumpData, strLen, symEncoded]);
return new TransactionInstruction({
keys,
data,
programId: seqEnforcerProgramIds[cluster],
});
}
export function makeCheckAndSetSequenceNumberIx(
sequenceAccount: PublicKey,
ownerPk: PublicKey,
seqNum: number,
cluster,
): TransactionInstruction {
const keys = [
{ isSigner: false, isWritable: true, pubkey: sequenceAccount },
{ isSigner: true, isWritable: false, pubkey: ownerPk },
];
const variant = createHash('sha256')
.update('global:check_and_set_sequence_number')
.digest()
.slice(0, 8);
const seqNumBuffer = new BN(seqNum).toBuffer('le', 8);
const data = Buffer.concat([variant, seqNumBuffer]);
return new TransactionInstruction({
keys,
data,
programId: seqEnforcerProgramIds[cluster],
});
}