fix: update getConfirmedBlock json-rpc formatting

This commit is contained in:
Tyera Eulberg 2020-01-13 16:17:32 -07:00 committed by Michael Vines
parent 3265f3bfa0
commit fc007b02ae
3 changed files with 32 additions and 37 deletions

View File

@ -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([

View File

@ -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<Array<number>>,
accounts: Array<Array<number>>,
signatures: Array<string>,
accounts: Array<string>,
instructions: Array<any>,
recentBlockhash: Array<number>,
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]]);

View File

@ -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();