feat: update getSignatureStatus methods

This commit is contained in:
Justin Starry
2020-04-06 17:56:26 +08:00
committed by Michael Vines
parent ae10f1ecab
commit 3a2fe7fdbc
7 changed files with 57 additions and 23 deletions

9
web3.js/module.d.ts vendored
View File

@ -48,6 +48,10 @@ declare module '@solana/web3.js' {
export type Commitment = 'max' | 'recent'; export type Commitment = 'max' | 'recent';
export type SignatureStatusConfig = {
searchTransactionHistory: boolean;
};
export type SignatureStatus = { export type SignatureStatus = {
slot: number; slot: number;
err: TransactionError | null; err: TransactionError | null;
@ -160,6 +164,7 @@ declare module '@solana/web3.js' {
export class Connection { export class Connection {
constructor(endpoint: string, commitment?: Commitment); constructor(endpoint: string, commitment?: Commitment);
commitment?: Commitment;
getAccountInfoAndContext( getAccountInfoAndContext(
publicKey: PublicKey, publicKey: PublicKey,
commitment?: Commitment, commitment?: Commitment,
@ -192,11 +197,11 @@ declare module '@solana/web3.js' {
getSlotLeader(commitment?: Commitment): Promise<string>; getSlotLeader(commitment?: Commitment): Promise<string>;
getSignatureStatus( getSignatureStatus(
signature: TransactionSignature, signature: TransactionSignature,
commitment?: Commitment, config?: SignatureStatusConfig,
): Promise<RpcResponseAndContext<SignatureStatus | null>>; ): Promise<RpcResponseAndContext<SignatureStatus | null>>;
getSignatureStatuses( getSignatureStatuses(
signatures: Array<TransactionSignature>, signatures: Array<TransactionSignature>,
commitment?: Commitment, config?: SignatureStatusConfig,
): Promise<RpcResponseAndContext<Array<SignatureStatus | null>>>; ): Promise<RpcResponseAndContext<Array<SignatureStatus | null>>>;
getTransactionCount(commitment?: Commitment): Promise<number>; getTransactionCount(commitment?: Commitment): Promise<number>;
getTotalSupply(commitment?: Commitment): Promise<number>; getTotalSupply(commitment?: Commitment): Promise<number>;

View File

@ -61,6 +61,10 @@ declare module '@solana/web3.js' {
declare export type Commitment = 'max' | 'recent'; declare export type Commitment = 'max' | 'recent';
declare export type SignatureStatusConfig = {
searchTransactionHistory: boolean,
};
declare export type SignatureStatus = { declare export type SignatureStatus = {
slot: number, slot: number,
err: TransactionError | null, err: TransactionError | null,
@ -173,6 +177,7 @@ declare module '@solana/web3.js' {
declare export class Connection { declare export class Connection {
constructor(endpoint: string, commitment: ?Commitment): Connection; constructor(endpoint: string, commitment: ?Commitment): Connection;
commitment: ?Commitment;
getAccountInfoAndContext( getAccountInfoAndContext(
publicKey: PublicKey, publicKey: PublicKey,
commitment: ?Commitment, commitment: ?Commitment,
@ -205,11 +210,11 @@ declare module '@solana/web3.js' {
getSlotLeader(commitment: ?Commitment): Promise<string>; getSlotLeader(commitment: ?Commitment): Promise<string>;
getSignatureStatus( getSignatureStatus(
signature: TransactionSignature, signature: TransactionSignature,
commitment: ?Commitment, config: ?SignatureStatusConfig,
): Promise<RpcResponseAndContext<SignatureStatus | null>>; ): Promise<RpcResponseAndContext<SignatureStatus | null>>;
getSignatureStatuses( getSignatureStatuses(
signatures: Array<TransactionSignature>, signatures: Array<TransactionSignature>,
commitment: ?Commitment, config: ?SignatureStatusConfig,
): Promise<RpcResponseAndContext<Array<SignatureStatus | null>>>; ): Promise<RpcResponseAndContext<Array<SignatureStatus | null>>>;
getTransactionCount(commitment: ?Commitment): Promise<number>; getTransactionCount(commitment: ?Commitment): Promise<number>;
getTotalSupply(commitment: ?Commitment): Promise<number>; getTotalSupply(commitment: ?Commitment): Promise<number>;

View File

@ -96,6 +96,16 @@ function notificationResultAndContext(resultDescription: any) {
*/ */
export type Commitment = 'max' | 'recent'; export type Commitment = 'max' | 'recent';
/**
* Configuration object for changing query behavior
*
* @typedef {Object} SignatureStatusConfig
* @property {boolean} searchTransactionHistory enable searching status history, not needed for recent transactions
*/
export type SignatureStatusConfig = {
searchTransactionHistory: boolean,
};
/** /**
* Information describing a cluster node * Information describing a cluster node
* *
@ -829,6 +839,13 @@ export class Connection {
); );
} }
/**
* The default commitment used for requests
*/
get commitment(): ?Commitment {
return this._commitment;
}
/** /**
* Fetch the balance for the specified public key, return with context * Fetch the balance for the specified public key, return with context
*/ */
@ -1033,25 +1050,28 @@ export class Connection {
*/ */
async getSignatureStatus( async getSignatureStatus(
signature: TransactionSignature, signature: TransactionSignature,
commitment: ?Commitment, config: ?SignatureStatusConfig,
): Promise<RpcResponseAndContext<SignatureStatus | null>> { ): Promise<RpcResponseAndContext<SignatureStatus | null>> {
const {context, value} = await this.getSignatureStatuses( const {context, value} = await this.getSignatureStatuses(
[signature], [signature],
commitment, config,
); );
assert(value.length === 1); assert(value.length === 1);
return {context, value: value[0]}; return {context, value: value[0]};
} }
/** /**
* Fetch the current status of a signature * Fetch the current statuses of a batch of signatures
*/ */
async getSignatureStatuses( async getSignatureStatuses(
signatures: Array<TransactionSignature>, signatures: Array<TransactionSignature>,
commitment: ?Commitment, config: ?SignatureStatusConfig,
): Promise<RpcResponseAndContext<Array<SignatureStatus | null>>> { ): Promise<RpcResponseAndContext<Array<SignatureStatus | null>>> {
const args = this._argsWithCommitment([signatures], commitment); const params = [signatures];
const unsafeRes = await this._rpcRequest('getSignatureStatuses', args); if (config) {
params.push(config);
}
const unsafeRes = await this._rpcRequest('getSignatureStatuses', params);
const res = GetSignatureStatusesRpcResult(unsafeRes); const res = GetSignatureStatusesRpcResult(unsafeRes);
if (res.error) { if (res.error) {
throw new Error(res.error.message); throw new Error(res.error.message);

View File

@ -15,15 +15,20 @@ export async function sendAndConfirmRawTransaction(
commitment: ?Commitment, commitment: ?Commitment,
): Promise<TransactionSignature> { ): Promise<TransactionSignature> {
const start = Date.now(); const start = Date.now();
const statusCommitment = commitment || connection.commitment || 'max';
let signature = await connection.sendRawTransaction(rawTransaction); let signature = await connection.sendRawTransaction(rawTransaction);
// Wait up to a couple slots for a confirmation // Wait up to a couple slots for a confirmation
let status = null; let status = null;
let statusRetries = 6; let statusRetries = 6;
for (;;) { for (;;) {
status = (await connection.getSignatureStatus(signature, commitment)).value; status = (await connection.getSignatureStatus(signature)).value;
if (status) { if (status) {
break; if (statusCommitment === 'max' && status.confirmations === null) {
break;
} else if (statusCommitment === 'recent') {
break;
}
} }
// Sleep for approximately half a slot // Sleep for approximately half a slot

View File

@ -43,8 +43,11 @@ async function _sendAndConfirmTransaction(
signers: Array<Account>, signers: Array<Account>,
commitment: ?Commitment, commitment: ?Commitment,
): Promise<TransactionSignature> { ): Promise<TransactionSignature> {
const statusCommitment = commitment || connection.commitment || 'max';
let sendRetries = 10; let sendRetries = 10;
let signature; let signature;
for (;;) { for (;;) {
const start = Date.now(); const start = Date.now();
signature = await connection.sendTransaction(transaction, ...signers); signature = await connection.sendTransaction(transaction, ...signers);
@ -53,10 +56,13 @@ async function _sendAndConfirmTransaction(
let status = null; let status = null;
let statusRetries = 6; let statusRetries = 6;
for (;;) { for (;;) {
status = (await connection.getSignatureStatus(signature, commitment)) status = (await connection.getSignatureStatus(signature)).value;
.value;
if (status) { if (status) {
break; if (statusCommitment === 'max' && status.confirmations === null) {
break;
} else if (statusCommitment === 'recent') {
break;
}
} }
if (--statusRetries <= 0) { if (--statusRetries <= 0) {

View File

@ -109,7 +109,6 @@ test('get program accounts', async () => {
[ [
'3WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk', '3WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
], ],
{commitment: 'recent'},
], ],
}, },
{ {
@ -154,7 +153,6 @@ test('get program accounts', async () => {
[ [
'3WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk', '3WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
], ],
{commitment: 'recent'},
], ],
}, },
{ {
@ -905,7 +903,6 @@ test('request airdrop - max commitment', async () => {
[ [
'1WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk', '1WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
], ],
{commitment: 'recent'},
], ],
}, },
{ {
@ -926,7 +923,7 @@ test('request airdrop - max commitment', async () => {
}, },
]); ]);
const {value} = await connection.getSignatureStatus(signature, 'recent'); const {value} = await connection.getSignatureStatus(signature);
if (value === null) { if (value === null) {
expect(value).not.toBeNull(); expect(value).not.toBeNull();
return; return;
@ -1050,7 +1047,6 @@ test('transaction failure', async () => {
[ [
'3WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk', '3WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
], ],
{commitment: 'recent'},
], ],
}, },
{ {
@ -1249,7 +1245,6 @@ test('transaction', async () => {
[ [
'3WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk', '3WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
], ],
{commitment: 'recent'},
], ],
}, },
{ {
@ -1297,7 +1292,6 @@ test('transaction', async () => {
'3WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk', '3WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
unprocessedSignature, unprocessedSignature,
], ],
{commitment: 'recent'},
], ],
}, },
{ {

View File

@ -151,7 +151,6 @@ test('transaction-payer', async () => {
[ [
'3WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk', '3WE5w4B7v59x6qjyC4FbG2FEKYKQfvsJwqSxNVmtMjT8TQ31hsZieDHcSgqzxiAoTL56n2w5TncjqEKjLhtF4Vk',
], ],
{commitment: 'recent'},
], ],
}, },
{ {