feat: return null when account info not found
This commit is contained in:
committed by
Michael Vines
parent
0fcb1f6f56
commit
7989c10b7a
4
web3.js/module.d.ts
vendored
4
web3.js/module.d.ts
vendored
@ -163,11 +163,11 @@ declare module '@solana/web3.js' {
|
|||||||
getAccountInfoAndContext(
|
getAccountInfoAndContext(
|
||||||
publicKey: PublicKey,
|
publicKey: PublicKey,
|
||||||
commitment?: Commitment,
|
commitment?: Commitment,
|
||||||
): Promise<RpcResponseAndContext<AccountInfo>>;
|
): Promise<RpcResponseAndContext<AccountInfo | null>>;
|
||||||
getAccountInfo(
|
getAccountInfo(
|
||||||
publicKey: PublicKey,
|
publicKey: PublicKey,
|
||||||
commitment?: Commitment,
|
commitment?: Commitment,
|
||||||
): Promise<AccountInfo>;
|
): Promise<AccountInfo | null>;
|
||||||
getProgramAccounts(
|
getProgramAccounts(
|
||||||
programId: PublicKey,
|
programId: PublicKey,
|
||||||
commitment?: Commitment,
|
commitment?: Commitment,
|
||||||
|
@ -176,11 +176,11 @@ declare module '@solana/web3.js' {
|
|||||||
getAccountInfoAndContext(
|
getAccountInfoAndContext(
|
||||||
publicKey: PublicKey,
|
publicKey: PublicKey,
|
||||||
commitment: ?Commitment,
|
commitment: ?Commitment,
|
||||||
): Promise<RpcResponseAndContext<AccountInfo>>;
|
): Promise<RpcResponseAndContext<AccountInfo | null>>;
|
||||||
getAccountInfo(
|
getAccountInfo(
|
||||||
publicKey: PublicKey,
|
publicKey: PublicKey,
|
||||||
commitment: ?Commitment,
|
commitment: ?Commitment,
|
||||||
): Promise<AccountInfo>;
|
): Promise<AccountInfo | null>;
|
||||||
getProgramAccounts(
|
getProgramAccounts(
|
||||||
programId: PublicKey,
|
programId: PublicKey,
|
||||||
commitment: ?Commitment,
|
commitment: ?Commitment,
|
||||||
|
@ -866,7 +866,7 @@ export class Connection {
|
|||||||
async getAccountInfoAndContext(
|
async getAccountInfoAndContext(
|
||||||
publicKey: PublicKey,
|
publicKey: PublicKey,
|
||||||
commitment: ?Commitment,
|
commitment: ?Commitment,
|
||||||
): Promise<RpcResponseAndContext<AccountInfo>> {
|
): Promise<RpcResponseAndContext<AccountInfo | null>> {
|
||||||
const args = this._argsWithCommitment([publicKey.toBase58()], commitment);
|
const args = this._argsWithCommitment([publicKey.toBase58()], commitment);
|
||||||
const unsafeRes = await this._rpcRequest('getAccountInfo', args);
|
const unsafeRes = await this._rpcRequest('getAccountInfo', args);
|
||||||
const res = GetAccountInfoAndContextRpcResult(unsafeRes);
|
const res = GetAccountInfoAndContextRpcResult(unsafeRes);
|
||||||
@ -875,18 +875,17 @@ export class Connection {
|
|||||||
}
|
}
|
||||||
assert(typeof res.result !== 'undefined');
|
assert(typeof res.result !== 'undefined');
|
||||||
|
|
||||||
if (!res.result.value) {
|
let value = null;
|
||||||
throw new Error('Invalid request');
|
if (res.result.value) {
|
||||||
|
const {executable, owner, lamports, data} = res.result.value;
|
||||||
|
value = {
|
||||||
|
executable,
|
||||||
|
owner: new PublicKey(owner),
|
||||||
|
lamports,
|
||||||
|
data: bs58.decode(data),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const {executable, owner, lamports, data} = res.result.value;
|
|
||||||
const value = {
|
|
||||||
executable,
|
|
||||||
owner: new PublicKey(owner),
|
|
||||||
lamports,
|
|
||||||
data: bs58.decode(data),
|
|
||||||
};
|
|
||||||
|
|
||||||
return {
|
return {
|
||||||
context: {
|
context: {
|
||||||
slot: res.result.context.slot,
|
slot: res.result.context.slot,
|
||||||
@ -901,7 +900,7 @@ export class Connection {
|
|||||||
async getAccountInfo(
|
async getAccountInfo(
|
||||||
publicKey: PublicKey,
|
publicKey: PublicKey,
|
||||||
commitment: ?Commitment,
|
commitment: ?Commitment,
|
||||||
): Promise<AccountInfo> {
|
): Promise<AccountInfo | null> {
|
||||||
return await this.getAccountInfoAndContext(publicKey, commitment)
|
return await this.getAccountInfoAndContext(publicKey, commitment)
|
||||||
.then(x => x.value)
|
.then(x => x.value)
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
@ -1235,29 +1234,19 @@ export class Connection {
|
|||||||
async getNonceAndContext(
|
async getNonceAndContext(
|
||||||
nonceAccount: PublicKey,
|
nonceAccount: PublicKey,
|
||||||
commitment: ?Commitment,
|
commitment: ?Commitment,
|
||||||
): Promise<RpcResponseAndContext<NonceAccount>> {
|
): Promise<RpcResponseAndContext<NonceAccount | null>> {
|
||||||
const args = this._argsWithCommitment(
|
const {context, value: accountInfo} = await this.getAccountInfoAndContext(
|
||||||
[nonceAccount.toBase58()],
|
nonceAccount,
|
||||||
commitment,
|
commitment,
|
||||||
);
|
);
|
||||||
const unsafeRes = await this._rpcRequest('getAccountInfo', args);
|
|
||||||
const res = GetAccountInfoAndContextRpcResult(unsafeRes);
|
|
||||||
if (res.error) {
|
|
||||||
throw new Error(res.error.message);
|
|
||||||
}
|
|
||||||
assert(typeof res.result !== 'undefined');
|
|
||||||
if (!res.result.value) {
|
|
||||||
throw new Error('Invalid request');
|
|
||||||
}
|
|
||||||
|
|
||||||
const value = NonceAccount.fromAccountData(
|
let value = null;
|
||||||
bs58.decode(res.result.value.data),
|
if (accountInfo !== null) {
|
||||||
);
|
value = NonceAccount.fromAccountData(accountInfo.data);
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
context: {
|
context,
|
||||||
slot: res.result.context.slot,
|
|
||||||
},
|
|
||||||
value,
|
value,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@ -1268,7 +1257,7 @@ export class Connection {
|
|||||||
async getNonce(
|
async getNonce(
|
||||||
nonceAccount: PublicKey,
|
nonceAccount: PublicKey,
|
||||||
commitment: ?Commitment,
|
commitment: ?Commitment,
|
||||||
): Promise<NonceAccount> {
|
): Promise<NonceAccount | null> {
|
||||||
return await this.getNonceAndContext(nonceAccount, commitment)
|
return await this.getNonceAndContext(nonceAccount, commitment)
|
||||||
.then(x => x.value)
|
.then(x => x.value)
|
||||||
.catch(e => {
|
.catch(e => {
|
||||||
|
@ -25,7 +25,7 @@ const errorResponse = {
|
|||||||
result: undefined,
|
result: undefined,
|
||||||
};
|
};
|
||||||
|
|
||||||
test('get account info - error', () => {
|
test('get account info - not found', async () => {
|
||||||
const account = new Account();
|
const account = new Account();
|
||||||
const connection = new Connection(url);
|
const connection = new Connection(url);
|
||||||
|
|
||||||
@ -35,12 +35,18 @@ test('get account info - error', () => {
|
|||||||
method: 'getAccountInfo',
|
method: 'getAccountInfo',
|
||||||
params: [account.publicKey.toBase58()],
|
params: [account.publicKey.toBase58()],
|
||||||
},
|
},
|
||||||
errorResponse,
|
{
|
||||||
|
error: null,
|
||||||
|
result: {
|
||||||
|
context: {
|
||||||
|
slot: 11,
|
||||||
|
},
|
||||||
|
value: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return expect(connection.getAccountInfo(account.publicKey)).rejects.toThrow(
|
expect(await connection.getAccountInfo(account.publicKey)).toBeNull();
|
||||||
errorMessage,
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
test('get program accounts', async () => {
|
test('get program accounts', async () => {
|
||||||
@ -820,6 +826,10 @@ test('request airdrop', async () => {
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
const accountInfo = await connection.getAccountInfo(account.publicKey);
|
const accountInfo = await connection.getAccountInfo(account.publicKey);
|
||||||
|
if (accountInfo === null) {
|
||||||
|
expect(accountInfo).not.toBeNull();
|
||||||
|
return;
|
||||||
|
}
|
||||||
expect(accountInfo.lamports).toBe(minimumAmount + 42);
|
expect(accountInfo.lamports).toBe(minimumAmount + 42);
|
||||||
expect(accountInfo.data).toHaveLength(0);
|
expect(accountInfo.data).toHaveLength(0);
|
||||||
expect(accountInfo.owner).toEqual(SystemProgram.programId);
|
expect(accountInfo.owner).toEqual(SystemProgram.programId);
|
||||||
|
@ -129,6 +129,10 @@ test('create and query nonce account', async () => {
|
|||||||
nonceAccount.publicKey,
|
nonceAccount.publicKey,
|
||||||
'recent',
|
'recent',
|
||||||
);
|
);
|
||||||
|
if (nonceAccountData === null) {
|
||||||
|
expect(nonceAccountData).not.toBeNull();
|
||||||
|
return;
|
||||||
|
}
|
||||||
expect(nonceAccountData.authorizedPubkey).toEqual(from.publicKey);
|
expect(nonceAccountData.authorizedPubkey).toEqual(from.publicKey);
|
||||||
expect(bs58.decode(nonceAccountData.nonce).length).toBeGreaterThan(30);
|
expect(bs58.decode(nonceAccountData.nonce).length).toBeGreaterThan(30);
|
||||||
});
|
});
|
||||||
|
@ -224,7 +224,17 @@ test('live Nonce actions', async () => {
|
|||||||
expect(nonceBalance).toEqual(minimumAmount);
|
expect(nonceBalance).toEqual(minimumAmount);
|
||||||
|
|
||||||
const nonceQuery1 = await connection.getNonce(nonceAccount.publicKey);
|
const nonceQuery1 = await connection.getNonce(nonceAccount.publicKey);
|
||||||
|
if (nonceQuery1 === null) {
|
||||||
|
expect(nonceQuery1).not.toBeNull();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const nonceQuery2 = await connection.getNonce(nonceAccount.publicKey);
|
const nonceQuery2 = await connection.getNonce(nonceAccount.publicKey);
|
||||||
|
if (nonceQuery2 === null) {
|
||||||
|
expect(nonceQuery2).not.toBeNull();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
expect(nonceQuery1.nonce).toEqual(nonceQuery2.nonce);
|
expect(nonceQuery1.nonce).toEqual(nonceQuery2.nonce);
|
||||||
|
|
||||||
// Wait for blockhash to advance
|
// Wait for blockhash to advance
|
||||||
@ -238,6 +248,10 @@ test('live Nonce actions', async () => {
|
|||||||
);
|
);
|
||||||
await sendAndConfirmRecentTransaction(connection, advanceNonce, from);
|
await sendAndConfirmRecentTransaction(connection, advanceNonce, from);
|
||||||
const nonceQuery3 = await connection.getNonce(nonceAccount.publicKey);
|
const nonceQuery3 = await connection.getNonce(nonceAccount.publicKey);
|
||||||
|
if (nonceQuery3 === null) {
|
||||||
|
expect(nonceQuery3).not.toBeNull();
|
||||||
|
return;
|
||||||
|
}
|
||||||
expect(nonceQuery1.nonce).not.toEqual(nonceQuery3.nonce);
|
expect(nonceQuery1.nonce).not.toEqual(nonceQuery3.nonce);
|
||||||
const nonce = nonceQuery3.nonce;
|
const nonce = nonceQuery3.nonce;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user