diff --git a/web3.js/src/connection.js b/web3.js/src/connection.js index 1c435ca011..6ab7cf5fea 100644 --- a/web3.js/src/connection.js +++ b/web3.js/src/connection.js @@ -437,15 +437,15 @@ const GetMinimumBalanceForRentExemptionRpcResult = jsonRpcResult('number'); */ export const GetConfirmedBlockRpcResult = jsonRpcResult( struct({ - blockhash: struct.list(['number']), - previousBlockhash: struct.list(['number']), + blockhash: 'string', + previousBlockhash: 'string', parentSlot: 'number', transactions: struct.list([ struct.tuple([ struct({ - signatures: struct.list([struct.list(['number'])]), + signatures: struct.list(['string']), message: struct({ - accountKeys: struct.list([struct.list(['number'])]), + accountKeys: struct.list(['string']), header: struct({ numRequiredSignatures: 'number', numReadonlySignedAccounts: 'number', @@ -455,17 +455,13 @@ export const GetConfirmedBlockRpcResult = jsonRpcResult( struct.union([ struct.list(['number']), struct({ - accounts: struct.list([ - struct.union([struct.list(['number']), 'number']), - ]), - data: struct.list([ - struct.union([struct.list(['number']), 'number']), - ]), + accounts: struct.list(['number']), + data: 'string', programIdIndex: 'number', }), ]), ]), - recentBlockhash: struct.list(['number']), + recentBlockhash: 'string', }), }), struct.union([ diff --git a/web3.js/src/transaction.js b/web3.js/src/transaction.js index fb6edd7979..46797d282f 100644 --- a/web3.js/src/transaction.js +++ b/web3.js/src/transaction.js @@ -21,7 +21,7 @@ export type TransactionSignature = string; * * Signatures are 64 bytes in length */ -const DEFAULT_SIGNATURE = Array(64).fill(0); +const DEFAULT_SIGNATURE = Buffer.alloc(64).fill(0); /** * Maximum over-the-wire size of a Transaction @@ -489,7 +489,7 @@ export class Transaction { for (let i = 0; i < signatureCount; i++) { const signature = byteArray.slice(0, SIGNATURE_LENGTH); byteArray = byteArray.slice(SIGNATURE_LENGTH); - signatures.push(signature); + signatures.push(bs58.encode(Buffer.from(signature))); } const numRequiredSignatures = byteArray.shift(); @@ -504,7 +504,7 @@ export class Transaction { for (let i = 0; i < accountCount; i++) { const account = byteArray.slice(0, PUBKEY_LENGTH); byteArray = byteArray.slice(PUBKEY_LENGTH); - accounts.push(account); + accounts.push(bs58.encode(Buffer.from(account))); } const recentBlockhash = byteArray.slice(0, PUBKEY_LENGTH); @@ -519,7 +519,8 @@ export class Transaction { instruction.accounts = byteArray.slice(0, accountCount); byteArray = byteArray.slice(accountCount); const dataLength = shortvec.decodeLength(byteArray); - instruction.data = byteArray.slice(0, dataLength); + const data = byteArray.slice(0, dataLength); + instruction.data = bs58.encode(Buffer.from(data)); byteArray = byteArray.slice(dataLength); instructions.push(instruction); } @@ -539,13 +540,9 @@ export class Transaction { * Parse an RPC result into a Transaction object. */ static fromRpcResult(rpcResult: any): Transaction { - const signatures = rpcResult.signatures.slice(1); - const accounts = rpcResult.message.accountKeys.slice(1); - const instructions = rpcResult.message.instructions.slice(1).map(ix => { - ix.accounts.shift(); - ix.data.shift(); - return ix; - }); + const signatures = rpcResult.signatures; + const accounts = rpcResult.message.accountKeys; + const instructions = rpcResult.message.instructions; const recentBlockhash = rpcResult.message.recentBlockhash; const numRequiredSignatures = rpcResult.message.header.numRequiredSignatures; @@ -569,8 +566,8 @@ export class Transaction { * @private */ static _populate( - signatures: Array>, - accounts: Array>, + signatures: Array, + accounts: Array, instructions: Array, recentBlockhash: Array, numRequiredSignatures: number, @@ -596,9 +593,9 @@ export class Transaction { for (let i = 0; i < signatures.length; i++) { const sigPubkeyPair = { signature: - signatures[i].toString() == DEFAULT_SIGNATURE.toString() + signatures[i] == bs58.encode(DEFAULT_SIGNATURE) ? null - : Buffer.from(signatures[i]), + : bs58.decode(signatures[i]), publicKey: new PublicKey(accounts[i]), }; transaction.signatures.push(sigPubkeyPair); @@ -607,7 +604,7 @@ export class Transaction { let instructionData = { keys: [], programId: new PublicKey(accounts[instructions[i].programIndex]), - data: Buffer.from(instructions[i].data), + data: bs58.decode(instructions[i].data), }; for (let j = 0; j < instructions[i].accounts.length; j++) { const pubkey = new PublicKey(accounts[instructions[i].accounts[j]]); diff --git a/web3.js/test/transaction.test.js b/web3.js/test/transaction.test.js index e3f99678f3..dd87106469 100644 --- a/web3.js/test/transaction.test.js +++ b/web3.js/test/transaction.test.js @@ -1,4 +1,5 @@ // @flow +import bs58 from 'bs58'; import nacl from 'tweetnacl'; import {Account} from '../src/account'; @@ -155,12 +156,11 @@ test('transaction from rpc result', () => { const rpcResult = { message: { accountKeys: [ - [5], - new PublicKey(1).toBuffer(), - new PublicKey(2).toBuffer(), - new PublicKey(3).toBuffer(), - new PublicKey(4).toBuffer(), - new PublicKey(5).toBuffer(), + new PublicKey(1).toString(), + new PublicKey(2).toString(), + new PublicKey(3).toString(), + new PublicKey(4).toString(), + new PublicKey(5).toString(), ], header: { num_ReadonlySignedAccounts: 0, @@ -168,16 +168,18 @@ test('transaction from rpc result', () => { numRequiredSignatures: 2, }, instructions: [ - [1], { - accounts: [[3], 1, 2, 3], - data: [[1], 0], + accounts: [1, 2, 3], + data: bs58.encode(Buffer.alloc(5).fill(9)), programIdIndex: 4, }, ], recentBlockhash: rawBlockhash, }, - signatures: [[2], Array(64).fill(1), Array(64).fill(2)], + signatures: [ + bs58.encode(Buffer.alloc(64).fill(1)), + bs58.encode(Buffer.alloc(64).fill(2)), + ], }; const recentBlockhash = new PublicKey(rawBlockhash).toBase58();