@shyft-to/solana-transaction-parser
Version:
Tool for parsing arbitrary Solana transactions with IDL/custom parsers
332 lines • 13.5 kB
JavaScript
import { StakeInstruction } from "@solana/web3.js";
import { BN } from "bn.js";
export function decodeStakeInstruction(instruction) {
const type = StakeInstruction.decodeInstructionType(instruction);
let parsed;
switch (type) {
case "Initialize": {
const decoded = StakeInstruction.decodeInitialize(instruction);
parsed = {
name: "initialize",
accounts: [
{
name: "stakePubkey",
pubkey: instruction.keys[0].pubkey,
isSigner: instruction.keys[0].isSigner,
isWritable: instruction.keys[0].isWritable,
},
{
name: "clockSysvar",
pubkey: instruction.keys[1].pubkey,
isSigner: instruction.keys[1].isSigner,
isWritable: instruction.keys[1].isWritable,
},
],
args: {
index: 0,
authorized: decoded.authorized,
lockup: decoded.lockup,
},
programId: instruction.programId,
};
break;
}
case "Authorize": {
const decoded = StakeInstruction.decodeAuthorize(instruction);
parsed = {
name: "authorize",
accounts: [
{
name: "stakePubkey",
pubkey: instruction.keys[0].pubkey,
isSigner: instruction.keys[0].isSigner,
isWritable: instruction.keys[0].isWritable,
},
{
name: "clockSysvar",
pubkey: instruction.keys[1].pubkey,
isSigner: instruction.keys[1].isSigner,
isWritable: instruction.keys[1].isWritable,
},
{
name: "authorizedPubkey",
pubkey: instruction.keys[2].pubkey,
isSigner: instruction.keys[2].isSigner,
isWritable: instruction.keys[2].isWritable,
},
{
name: "custodianPubkey",
pubkey: instruction.keys[3].pubkey,
isSigner: instruction.keys[3].isSigner,
isWritable: instruction.keys[3].isWritable,
},
],
args: {
index: 1,
newAuthorized: decoded.newAuthorizedPubkey,
stakeAuthorizationType: decoded.stakeAuthorizationType,
},
programId: instruction.programId,
};
break;
}
case "AuthorizeWithSeed": {
const decoded = StakeInstruction.decodeAuthorizeWithSeed(instruction);
parsed = {
name: "authorizeWithSeed",
accounts: [
{
name: "stakePubkey",
pubkey: instruction.keys[0].pubkey,
isSigner: instruction.keys[0].isSigner,
isWritable: instruction.keys[0].isWritable,
},
{
name: "authorizedPubkey",
pubkey: instruction.keys[1].pubkey,
isSigner: instruction.keys[1].isSigner,
isWritable: instruction.keys[1].isWritable,
},
{
name: "clockSysvar",
pubkey: instruction.keys[2].pubkey,
isSigner: instruction.keys[2].isSigner,
isWritable: instruction.keys[2].isWritable,
},
{
name: "custodianPubkey",
pubkey: instruction.keys[3].pubkey,
isSigner: instruction.keys[3].isSigner,
isWritable: instruction.keys[3].isWritable,
},
],
args: {
index: 2,
newAuthorized: decoded.newAuthorizedPubkey,
stakeAuthorizationType: decoded.stakeAuthorizationType,
},
programId: instruction.programId,
};
break;
}
case "Deactivate": {
const decoded = StakeInstruction.decodeDeactivate(instruction);
parsed = {
name: "deactivate",
accounts: [
{
name: "stakePubkey",
pubkey: instruction.keys[0].pubkey,
isSigner: instruction.keys[0].isSigner,
isWritable: instruction.keys[0].isWritable,
},
{
name: "clockSysvar",
pubkey: instruction.keys[1].pubkey,
isSigner: instruction.keys[1].isSigner,
isWritable: instruction.keys[1].isWritable,
},
{
name: "authorizedPubkey",
pubkey: instruction.keys[2].pubkey,
isSigner: instruction.keys[2].isSigner,
isWritable: instruction.keys[2].isWritable,
},
],
args: {
index: 3,
stakePubkey: decoded.stakePubkey,
authorizedPubkey: decoded.authorizedPubkey,
},
programId: instruction.programId,
};
break;
}
case "Delegate": {
const decoded = StakeInstruction.decodeDelegate(instruction);
parsed = {
name: "delegate",
accounts: [
{
name: "stakePubkey",
pubkey: instruction.keys[0].pubkey,
isSigner: instruction.keys[0].isSigner,
isWritable: instruction.keys[0].isWritable,
},
{
name: "votePubkey",
pubkey: instruction.keys[1].pubkey,
isSigner: instruction.keys[1].isSigner,
isWritable: instruction.keys[1].isWritable,
},
{
name: "clockSysvar",
pubkey: instruction.keys[2].pubkey,
isSigner: instruction.keys[2].isSigner,
isWritable: instruction.keys[2].isWritable,
},
{
name: "sysvarStakeHistory",
pubkey: instruction.keys[3].pubkey,
isSigner: instruction.keys[3].isSigner,
isWritable: instruction.keys[3].isWritable,
},
{
name: "stakeConfig",
pubkey: instruction.keys[4].pubkey,
isSigner: instruction.keys[4].isSigner,
isWritable: instruction.keys[4].isWritable,
},
{
name: "authorizedPubkey",
pubkey: instruction.keys[5].pubkey,
isSigner: instruction.keys[5].isSigner,
isWritable: instruction.keys[5].isWritable,
},
],
args: {
index: 4,
},
programId: instruction.programId,
};
break;
}
case "Merge": {
const decoded = StakeInstruction.decodeMerge(instruction);
parsed = {
name: "merge",
accounts: [
{
name: "stakePubkey",
pubkey: instruction.keys[0].pubkey,
isSigner: instruction.keys[0].isSigner,
isWritable: instruction.keys[0].isWritable,
},
{
name: "sourceStakePubkey",
pubkey: instruction.keys[1].pubkey,
isSigner: instruction.keys[1].isSigner,
isWritable: instruction.keys[1].isWritable,
},
{
name: "clockSysvar",
pubkey: instruction.keys[2].pubkey,
isSigner: instruction.keys[2].isSigner,
isWritable: instruction.keys[2].isWritable,
},
{
name: "sysvarStakeHistory",
pubkey: instruction.keys[3].pubkey,
isSigner: instruction.keys[3].isSigner,
isWritable: instruction.keys[3].isWritable,
},
{
name: "authorizedPubkey",
pubkey: instruction.keys[4].pubkey,
isSigner: instruction.keys[4].isSigner,
isWritable: instruction.keys[4].isWritable,
},
],
args: {
index: 5,
},
programId: instruction.programId,
};
break;
}
case "Split": {
const decoded = StakeInstruction.decodeSplit(instruction);
parsed = {
name: "split",
accounts: [
{
name: "stakePubkey",
pubkey: instruction.keys[0].pubkey,
isSigner: instruction.keys[0].isSigner,
isWritable: instruction.keys[0].isWritable,
},
{
name: "splitStakePubkey",
pubkey: instruction.keys[1].pubkey,
isSigner: instruction.keys[1].isSigner,
isWritable: instruction.keys[1].isWritable,
},
{
name: "authorizedPubkey",
pubkey: instruction.keys[2].pubkey,
isSigner: instruction.keys[2].isSigner,
isWritable: instruction.keys[2].isWritable,
},
],
args: {
index: 6,
lamports: new BN(decoded.lamports),
},
programId: instruction.programId,
};
break;
}
case "Withdraw": {
const decoded = StakeInstruction.decodeWithdraw(instruction);
parsed = {
name: "withdraw",
accounts: [
{
name: "stakePubkey",
pubkey: instruction.keys[0].pubkey,
isSigner: instruction.keys[0].isSigner,
isWritable: instruction.keys[0].isWritable,
},
{
name: "toPubkey",
pubkey: instruction.keys[1].pubkey,
isSigner: instruction.keys[1].isSigner,
isWritable: instruction.keys[1].isWritable,
},
{
name: "clockSysvar",
pubkey: instruction.keys[2].pubkey,
isSigner: instruction.keys[2].isSigner,
isWritable: instruction.keys[2].isWritable,
},
{
name: "sysvarStakeHistory",
pubkey: instruction.keys[3].pubkey,
isSigner: instruction.keys[3].isSigner,
isWritable: instruction.keys[3].isWritable,
},
{
name: "authorizedPubkey",
pubkey: instruction.keys[4].pubkey,
isSigner: instruction.keys[4].isSigner,
isWritable: instruction.keys[4].isWritable,
},
{
name: "custodianPubkey",
pubkey: instruction.keys[5].pubkey,
isSigner: instruction.keys[5].isSigner,
isWritable: instruction.keys[5].isWritable,
},
],
args: {
index: 7,
lamports: new BN(decoded.lamports),
},
programId: instruction.programId,
};
break;
}
default: {
parsed = null;
}
}
return parsed
? parsed
: {
programId: instruction.programId,
name: "unknown",
accounts: instruction.keys,
args: { unknown: instruction.data },
};
}
//# sourceMappingURL=stake.js.map