diff --git a/web3.js/module.d.ts b/web3.js/module.d.ts index 7cc5574ebb..6b1a11702b 100644 --- a/web3.js/module.d.ts +++ b/web3.js/module.d.ts @@ -1,5 +1,4 @@ declare module '@solana/web3.js' { - import {Buffer} from 'buffer'; import * as BufferLayout from 'buffer-layout'; // === src/publickey.js === @@ -138,8 +137,28 @@ declare module '@solana/web3.js' { logs: Array | null; }; + export type CompiledInnerInstruction = { + index: number; + instructions: CompiledInstruction[]; + }; + export type ConfirmedTransactionMeta = { fee: number; + innerInstructions?: CompiledInnerInstruction[]; + preBalances: Array; + postBalances: Array; + logMessages?: Array; + err: TransactionError | null; + }; + + export type ParsedInnerInstruction = { + index: number; + instructions: (ParsedInstruction | PartiallyDecodedInstruction)[]; + }; + + export type ParsedConfirmedTransactionMeta = { + fee: number; + innerInstructions?: ParsedInnerInstruction[]; preBalances: Array; postBalances: Array; logMessages?: Array; @@ -199,7 +218,7 @@ declare module '@solana/web3.js' { export type ParsedConfirmedTransaction = { slot: number; transaction: ParsedTransaction; - meta: ConfirmedTransactionMeta | null; + meta: ParsedConfirmedTransactionMeta | null; }; export type ParsedAccountData = { diff --git a/web3.js/module.flow.js b/web3.js/module.flow.js index 363bde07d8..51b1ee057d 100644 --- a/web3.js/module.flow.js +++ b/web3.js/module.flow.js @@ -152,8 +152,28 @@ declare module '@solana/web3.js' { logs: Array | null, }; + declare export type CompiledInnerInstruction = { + index: number, + instructions: CompiledInstruction[], + }; + declare export type ConfirmedTransactionMeta = { fee: number, + innerInstructions?: CompiledInnerInstruction[], + preBalances: Array, + postBalances: Array, + logMessages?: Array, + err: TransactionError | null, + }; + + declare export type ParsedInnerInstruction = { + index: number, + instructions: (ParsedInstruction | PartiallyDecodedInstruction)[], + }; + + declare export type ParsedConfirmedTransactionMeta = { + fee: number, + innerInstructions?: ParsedInnerInstruction[], preBalances: Array, postBalances: Array, logMessages?: Array, @@ -225,7 +245,7 @@ declare module '@solana/web3.js' { declare export type ParsedConfirmedTransaction = { slot: number, transaction: ParsedTransaction, - meta: ConfirmedTransactionMeta | null, + meta: ParsedConfirmedTransactionMeta | null, }; declare export type KeyedAccountInfo = { diff --git a/web3.js/src/connection.js b/web3.js/src/connection.js index 4aa6b6fa46..0ae653b033 100644 --- a/web3.js/src/connection.js +++ b/web3.js/src/connection.js @@ -367,11 +367,47 @@ const SimulatedTransactionResponseValidator = jsonRpcResultAndContext( }), ); +type PartiallyDecodedInnerInstruction = { + index: number, + instructions: PartiallyDecodedInstruction[], +}; + +type ParsedInnerInstruction = { + index: number, + instructions: (ParsedInstruction | PartiallyDecodedInnerInstruction)[], +}; + +/** + * Metadata for a parsed confirmed transaction on the ledger + * + * @typedef {Object} ParsedConfirmedTransactionMeta + * @property {number} fee The fee charged for processing the transaction + * @property {Array} innerInstructions An array of cross program invoked parsed instructions + * @property {Array} preBalances The balances of the transaction accounts before processing + * @property {Array} postBalances The balances of the transaction accounts after processing + * @property {Array} logMessages An array of program log messages emitted during a transaction + * @property {object|null} err The error result of transaction processing + */ +type ParsedConfirmedTransactionMeta = { + fee: number, + innerInstructions?: ParsedInnerInstruction[], + preBalances: Array, + postBalances: Array, + logMessages?: Array, + err: TransactionError | null, +}; + +type CompiledInnerInstruction = { + index: number, + instructions: CompiledInstruction[], +}; + /** * Metadata for a confirmed transaction on the ledger * * @typedef {Object} ConfirmedTransactionMeta * @property {number} fee The fee charged for processing the transaction + * @property {Array} innerInstructions An array of cross program invoked instructions * @property {Array} preBalances The balances of the transaction accounts before processing * @property {Array} postBalances The balances of the transaction accounts after processing * @property {Array} logMessages An array of program log messages emitted during a transaction @@ -379,6 +415,7 @@ const SimulatedTransactionResponseValidator = jsonRpcResultAndContext( */ type ConfirmedTransactionMeta = { fee: number, + innerInstructions?: CompiledInnerInstruction[], preBalances: Array, postBalances: Array, logMessages?: Array, @@ -478,7 +515,7 @@ type ParsedTransaction = { type ParsedConfirmedTransaction = { slot: number, transaction: ParsedTransaction, - meta: ConfirmedTransactionMeta | null, + meta: ParsedConfirmedTransactionMeta | null, }; /** @@ -1126,6 +1163,58 @@ const ConfirmedTransactionMetaResult = struct.union([ struct.pick({ err: TransactionErrorResult, fee: 'number', + innerInstructions: struct.union( + struct.array([ + struct({ + index: 'number', + instructions: struct.array([ + struct({ + accounts: struct.array(['number']), + data: 'string', + programIdIndex: 'number', + }), + ]), + }), + ]), + 'null', + 'undefined', + ), + preBalances: struct.array(['number']), + postBalances: struct.array(['number']), + logMessages: struct.union([struct.array(['string']), 'null', 'undefined']), + }), +]); +/** + * @private + */ +const ParsedConfirmedTransactionMetaResult = struct.union([ + 'null', + struct.pick({ + err: TransactionErrorResult, + fee: 'number', + innerInstructions: struct.union( + struct.array([ + struct({ + index: 'number', + instructions: struct.array([ + struct.union([ + struct({ + accounts: struct.array(['string']), + data: 'string', + programId: 'string', + }), + struct({ + parsed: 'any', + program: 'string', + programId: 'string', + }), + ]), + ]), + }), + ]), + 'null', + 'undefined', + ), preBalances: struct.array(['number']), postBalances: struct.array(['number']), logMessages: struct.union([struct.array(['string']), 'null', 'undefined']), @@ -1186,7 +1275,7 @@ const GetParsedConfirmedTransactionRpcResult = jsonRpcResult( struct.pick({ slot: 'number', transaction: ParsedConfirmedTransactionResult, - meta: ConfirmedTransactionMetaResult, + meta: ParsedConfirmedTransactionMetaResult, }), ]), );