UNPKG

@shyft-to/solana-transaction-parser

Version:

Tool for parsing arbitrary Solana transactions with IDL/custom parsers

184 lines 8.27 kB
import { BN } from "@coral-xyz/anchor"; import { SystemInstruction, SystemProgram } from "@solana/web3.js"; function decodeSystemInstruction(instruction) { const ixType = SystemInstruction.decodeInstructionType(instruction); let parsed; switch (ixType) { case "AdvanceNonceAccount": { const decoded = SystemInstruction.decodeNonceAdvance(instruction); parsed = { name: "advanceNonceAccount", args: { authorized: decoded.authorizedPubkey }, accounts: [ { name: "nonce", isSigner: false, isWritable: true, pubkey: instruction.keys[0].pubkey }, { name: "recentBlockhashes", isSigner: false, isWritable: false, pubkey: instruction.keys[1].pubkey }, { name: "authorized", isSigner: true, isWritable: false, pubkey: instruction.keys[2].pubkey }, ], }; break; } case "Allocate": { const decoded = SystemInstruction.decodeAllocate(instruction); parsed = { name: "allocate", accounts: [{ name: "pubkey", pubkey: decoded.accountPubkey, isSigner: true, isWritable: true }], args: { space: new BN(decoded.space) }, }; break; } case "AllocateWithSeed": { const decoded = SystemInstruction.decodeAllocateWithSeed(instruction); parsed = { name: "allocateWithSeed", accounts: [ { name: "account", pubkey: decoded.accountPubkey, isSigner: false, isWritable: true }, { name: "base", pubkey: decoded.basePubkey, isSigner: true, isWritable: false }, ], args: { seed: decoded.seed, space: new BN(decoded.space), owner: decoded.programId, base: decoded.basePubkey, }, }; break; } case "Assign": { const decoded = SystemInstruction.decodeAssign(instruction); parsed = { name: "assign", accounts: [{ name: "pubkey", pubkey: decoded.accountPubkey, isSigner: true, isWritable: true }], args: { owner: decoded.programId }, }; break; } case "AssignWithSeed": { const decoded = SystemInstruction.decodeAssignWithSeed(instruction); parsed = { name: "assignWithSeed", accounts: [ { name: "account", pubkey: decoded.accountPubkey, isSigner: false, isWritable: true }, { name: "base", pubkey: decoded.basePubkey, isSigner: true, isWritable: false }, ], args: { seed: decoded.seed, owner: decoded.programId, base: decoded.basePubkey, }, }; break; } case "AuthorizeNonceAccount": { const decoded = SystemInstruction.decodeNonceAuthorize(instruction); parsed = { name: "authorizeNonceAccount", accounts: [ { name: "nonce", isSigner: false, isWritable: true, pubkey: decoded.noncePubkey }, { name: "authorized", isSigner: true, isWritable: false, pubkey: decoded.authorizedPubkey }, ], args: { authorized: decoded.newAuthorizedPubkey }, }; break; } case "Create": { const decoded = SystemInstruction.decodeCreateAccount(instruction); parsed = { name: "createAccount", accounts: [ { name: "from", pubkey: decoded.fromPubkey, isSigner: true, isWritable: true }, { name: "to", pubkey: decoded.newAccountPubkey, isSigner: true, isWritable: true }, ], args: { lamports: new BN(decoded.lamports), owner: decoded.programId, space: new BN(decoded.space) }, }; break; } case "CreateWithSeed": { const decoded = SystemInstruction.decodeCreateWithSeed(instruction); parsed = { name: "createAccountWithSeed", accounts: [ { name: "from", pubkey: decoded.fromPubkey, isSigner: true, isWritable: true }, { name: "to", pubkey: decoded.newAccountPubkey, isSigner: false, isWritable: true }, { name: "base", pubkey: decoded.basePubkey, isSigner: true, isWritable: false }, ], args: { lamports: new BN(decoded.lamports), owner: decoded.programId, space: new BN(decoded.space), seed: decoded.seed, base: decoded.basePubkey, }, }; break; } case "InitializeNonceAccount": { const decoded = SystemInstruction.decodeNonceInitialize(instruction); parsed = { name: "initializeNonceAccount", accounts: [ { name: "nonce", pubkey: decoded.noncePubkey, isSigner: true, isWritable: true }, { name: "recentBlockhashes", isSigner: false, isWritable: false, pubkey: instruction.keys[1].pubkey }, { name: "rent", isSigner: false, isWritable: false, pubkey: instruction.keys[2].pubkey }, ], args: { authorized: decoded.authorizedPubkey }, }; break; } case "Transfer": { const decoded = SystemInstruction.decodeTransfer(instruction); parsed = { name: "transfer", accounts: [ { name: "from", pubkey: decoded.fromPubkey, isSigner: true, isWritable: true }, { name: "to", pubkey: decoded.toPubkey, isWritable: true, isSigner: false }, ], args: { lamports: new BN(decoded.lamports.toString()) }, }; break; } case "TransferWithSeed": { const decoded = SystemInstruction.decodeTransferWithSeed(instruction); parsed = { name: "transferWithSeed", accounts: [ { name: "from", pubkey: decoded.fromPubkey, isSigner: false, isWritable: true }, { name: "base", pubkey: decoded.basePubkey, isSigner: true, isWritable: false }, { name: "to", pubkey: decoded.toPubkey, isSigner: false, isWritable: true }, ], args: { owner: decoded.programId, lamports: new BN(decoded.lamports.toString()), seed: decoded.seed }, }; break; } case "WithdrawNonceAccount": { const decoded = SystemInstruction.decodeNonceWithdraw(instruction); parsed = { name: "withdrawNonceAccount", accounts: [ { name: "nonce", pubkey: decoded.noncePubkey, isSigner: false, isWritable: true }, { name: "to", pubkey: decoded.toPubkey, isSigner: false, isWritable: true }, { name: "recentBlockhashes", isSigner: false, isWritable: false, pubkey: instruction.keys[2].pubkey }, { name: "rent", isSigner: false, isWritable: false, pubkey: instruction.keys[3].pubkey }, { name: "authorized", pubkey: decoded.noncePubkey, isSigner: true, isWritable: false }, ], args: { lamports: new BN(decoded.lamports) }, }; break; } default: { parsed = null; } } return parsed ? { ...parsed, programId: SystemProgram.programId, } : { programId: SystemProgram.programId, name: "unknown", accounts: instruction.keys, args: { unknown: instruction.data }, }; } export { decodeSystemInstruction }; //# sourceMappingURL=system.js.map