feat: support commitment in getConfirmed methods

This commit is contained in:
Tyera Eulberg 2021-04-09 12:58:08 -06:00 committed by Tyera Eulberg
parent a99ee15a85
commit 30c95d38a5
2 changed files with 67 additions and 17 deletions

View File

@ -2596,8 +2596,12 @@ export class Connection {
* Fetch a list of Transactions and transaction statuses from the cluster * Fetch a list of Transactions and transaction statuses from the cluster
* for a confirmed block * for a confirmed block
*/ */
async getConfirmedBlock(slot: number): Promise<ConfirmedBlock> { async getConfirmedBlock(
const unsafeRes = await this._rpcRequest('getConfirmedBlock', [slot]); slot: number,
commitment?: Finality,
): Promise<ConfirmedBlock> {
const args = this._buildArgsAtLeastConfirmed([slot], commitment);
const unsafeRes = await this._rpcRequest('getConfirmedBlock', args);
const res = create(unsafeRes, GetConfirmedBlockRpcResult); const res = create(unsafeRes, GetConfirmedBlockRpcResult);
if ('error' in res) { if ('error' in res) {
throw new Error('failed to get confirmed block: ' + res.error.message); throw new Error('failed to get confirmed block: ' + res.error.message);
@ -2614,11 +2618,18 @@ export class Connection {
*/ */
async getConfirmedBlockSignatures( async getConfirmedBlockSignatures(
slot: number, slot: number,
commitment?: Finality,
): Promise<ConfirmedBlockSignatures> { ): Promise<ConfirmedBlockSignatures> {
const unsafeRes = await this._rpcRequest('getConfirmedBlock', [ const args = this._buildArgsAtLeastConfirmed(
slot, [slot],
{transactionDetails: 'signatures', rewards: false}, commitment,
]); undefined,
{
transactionDetails: 'signatures',
rewards: false,
},
);
const unsafeRes = await this._rpcRequest('getConfirmedBlock', args);
const res = create(unsafeRes, GetConfirmedBlockSignaturesRpcResult); const res = create(unsafeRes, GetConfirmedBlockSignaturesRpcResult);
if ('error' in res) { if ('error' in res) {
throw new Error('failed to get confirmed block: ' + res.error.message); throw new Error('failed to get confirmed block: ' + res.error.message);
@ -2635,10 +2646,10 @@ export class Connection {
*/ */
async getConfirmedTransaction( async getConfirmedTransaction(
signature: TransactionSignature, signature: TransactionSignature,
commitment?: Finality,
): Promise<ConfirmedTransaction | null> { ): Promise<ConfirmedTransaction | null> {
const unsafeRes = await this._rpcRequest('getConfirmedTransaction', [ const args = this._buildArgsAtLeastConfirmed([signature], commitment);
signature, const unsafeRes = await this._rpcRequest('getConfirmedTransaction', args);
]);
const res = create(unsafeRes, GetConfirmedTransactionRpcResult); const res = create(unsafeRes, GetConfirmedTransactionRpcResult);
if ('error' in res) { if ('error' in res) {
throw new Error( throw new Error(
@ -2653,11 +2664,14 @@ export class Connection {
*/ */
async getParsedConfirmedTransaction( async getParsedConfirmedTransaction(
signature: TransactionSignature, signature: TransactionSignature,
commitment?: Finality,
): Promise<ParsedConfirmedTransaction | null> { ): Promise<ParsedConfirmedTransaction | null> {
const unsafeRes = await this._rpcRequest('getConfirmedTransaction', [ const args = this._buildArgsAtLeastConfirmed(
signature, [signature],
commitment,
'jsonParsed', 'jsonParsed',
]); );
const unsafeRes = await this._rpcRequest('getConfirmedTransaction', args);
const res = create(unsafeRes, GetParsedConfirmedTransactionRpcResult); const res = create(unsafeRes, GetParsedConfirmedTransactionRpcResult);
if ('error' in res) { if ('error' in res) {
throw new Error( throw new Error(
@ -2672,11 +2686,17 @@ export class Connection {
*/ */
async getParsedConfirmedTransactions( async getParsedConfirmedTransactions(
signatures: TransactionSignature[], signatures: TransactionSignature[],
commitment?: Finality,
): Promise<(ParsedConfirmedTransaction | null)[]> { ): Promise<(ParsedConfirmedTransaction | null)[]> {
const batch = signatures.map(signature => { const batch = signatures.map(signature => {
const args = this._buildArgsAtLeastConfirmed(
[signature],
commitment,
'jsonParsed',
);
return { return {
methodName: 'getConfirmedTransaction', methodName: 'getConfirmedTransaction',
args: [signature, 'jsonParsed'], args,
}; };
}); });
@ -2718,7 +2738,10 @@ export class Connection {
} }
try { try {
const block = await this.getConfirmedBlockSignatures(startSlot); const block = await this.getConfirmedBlockSignatures(
startSlot,
'finalized',
);
if (block.signatures.length > 0) { if (block.signatures.length > 0) {
options.until = block.signatures[ options.until = block.signatures[
block.signatures.length - 1 block.signatures.length - 1
@ -2774,10 +2797,17 @@ export class Connection {
async getConfirmedSignaturesForAddress2( async getConfirmedSignaturesForAddress2(
address: PublicKey, address: PublicKey,
options?: ConfirmedSignaturesForAddress2Options, options?: ConfirmedSignaturesForAddress2Options,
commitment?: Finality,
): Promise<Array<ConfirmedSignatureInfo>> { ): Promise<Array<ConfirmedSignatureInfo>> {
const args = this._buildArgsAtLeastConfirmed(
[address.toBase58()],
commitment,
undefined,
options,
);
const unsafeRes = await this._rpcRequest( const unsafeRes = await this._rpcRequest(
'getConfirmedSignaturesForAddress2', 'getConfirmedSignaturesForAddress2',
[address.toBase58(), options], args,
); );
const res = create(unsafeRes, GetConfirmedSignaturesForAddress2RpcResult); const res = create(unsafeRes, GetConfirmedSignaturesForAddress2RpcResult);
if ('error' in res) { if ('error' in res) {
@ -3485,6 +3515,26 @@ export class Connection {
return args; return args;
} }
/**
* @internal
*/
_buildArgsAtLeastConfirmed(
args: Array<any>,
override?: Finality,
encoding?: 'jsonParsed' | 'base64',
extra?: any,
): Array<any> {
const commitment = override || this._commitment;
if (commitment && !['confirmed', 'finalized'].includes(commitment)) {
throw new Error(
'Using Connection with default commitment: `' +
this._commitment +
'`, but method requires at least `confirmed`',
);
}
return this._buildArgs(args, override, encoding, extra);
}
/** /**
* @internal * @internal
*/ */

View File

@ -1408,7 +1408,7 @@ describe('Connection', () => {
await mockRpcResponse({ await mockRpcResponse({
method: 'getConfirmedTransaction', method: 'getConfirmedTransaction',
params: [confirmedTransaction, 'jsonParsed'], params: [confirmedTransaction, {encoding: 'jsonParsed'}],
value: getMockData({ value: getMockData({
parsed: {}, parsed: {},
program: 'spl-token', program: 'spl-token',
@ -1428,7 +1428,7 @@ describe('Connection', () => {
await mockRpcResponse({ await mockRpcResponse({
method: 'getConfirmedTransaction', method: 'getConfirmedTransaction',
params: [confirmedTransaction, 'jsonParsed'], params: [confirmedTransaction, {encoding: 'jsonParsed'}],
value: getMockData({ value: getMockData({
accounts: [ accounts: [
'EeJqWk5pczNjsqqY3jia9xfFNG1dD68te4s8gsdCuEk7', 'EeJqWk5pczNjsqqY3jia9xfFNG1dD68te4s8gsdCuEk7',