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;
list(schema: any): any;
literal(schema: any): any;
tuple(schema: any): any;
};
declare module.exports: {

View File

@ -390,6 +390,18 @@ const GetMinimumBalanceForRentExemptionRpcResult = jsonRpcResult('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
*/
@ -904,6 +916,25 @@ export class Connection {
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
*/

View File

@ -462,6 +462,21 @@ test('get blocks since slot', async () => {
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 () => {
const connection = new Connection(url);