feat: return null when account info not found
This commit is contained in:
		
				
					committed by
					
						 Michael Vines
						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