fix: add getBlock Connection method

This commit is contained in:
Tyera Eulberg 2019-11-12 11:21:19 -05:00 committed by Michael Vines
parent 3382548a79
commit 890f6f4d9d
3 changed files with 47 additions and 1 deletions

View File

@ -4,7 +4,7 @@ declare module 'superstruct' {
union(schema: any): any; union(schema: any): any;
list(schema: any): any; list(schema: any): any;
literal(schema: any): any; literal(schema: any): any;
tuple(schema: any): any;
}; };
declare module.exports: { declare module.exports: {

View File

@ -390,6 +390,18 @@ const GetMinimumBalanceForRentExemptionRpcResult = jsonRpcResult('number');
*/ */
const GetBlocksSinceRpcResult = jsonRpcResult(struct.list(['number'])); const GetBlocksSinceRpcResult = jsonRpcResult(struct.list(['number']));
/**
* Expected JSON RPC response for the "getBlock" message
*/
const GetBlockRpcResult = jsonRpcResult(
struct.list([
struct.tuple([
struct.list(['number']),
struct.union([struct({Ok: 'null'}), struct({Err: 'object'})]),
]),
]),
);
/** /**
* Expected JSON RPC response for the "getRecentBlockhash" message * Expected JSON RPC response for the "getRecentBlockhash" message
*/ */
@ -904,6 +916,25 @@ export class Connection {
return res.result; return res.result;
} }
/**
* Fetch a list of Transactions and transaction statuses from the cluster
*/
async getBlock(
slot: number,
): Promise<
Array<[Transaction, SignatureSuccess] | [Transaction, TransactionError]>,
> {
const unsafeRes = await this._rpcRequest('getBlock', [slot]);
const result = GetBlockRpcResult(unsafeRes);
if (result.error) {
throw new Error(result.error.message);
}
assert(typeof result.result !== 'undefined');
return result.result.map(result => {
return [Transaction.from(result[0]), result[1]];
});
}
/** /**
* Request an allocation of lamports to the specified account * Request an allocation of lamports to the specified account
*/ */

View File

@ -462,6 +462,21 @@ test('get blocks since slot', async () => {
await expect(connection.getBlocksSince(10000)).rejects.toThrow(errorMessage); await expect(connection.getBlocksSince(10000)).rejects.toThrow(errorMessage);
}); });
test('get block', async () => {
if (mockRpcEnabled) {
console.log('non-live test skipped');
return;
}
const connection = new Connection(url);
// These test cases need to be updated when upstream solana RPC api is fleshed out
const zeroTransactions = await connection.getBlock(0);
expect(zeroTransactions.length).toBe(0);
const oneTransaction = await connection.getBlock(1);
expect(oneTransaction.length).toBe(1);
});
test('get recent blockhash', async () => { test('get recent blockhash', async () => {
const connection = new Connection(url); const connection = new Connection(url);