From add4900ad86f40390b68f6f2158cfbb588fe21d6 Mon Sep 17 00:00:00 2001 From: ivpavici Date: Wed, 31 Aug 2022 17:44:42 +0200 Subject: [PATCH] feat: getNonce endpoint for sequencer --- __tests__/defaultProvider.test.ts | 5 +++++ __tests__/sequencerProvider.test.ts | 18 ++++++++++-------- src/provider/default.ts | 4 ++++ src/provider/interface.ts | 8 ++++++++ src/provider/sequencer.ts | 4 ++++ src/types/api/rpc.ts | 2 +- src/types/api/sequencer.ts | 7 +++++++ 7 files changed, 39 insertions(+), 9 deletions(-) diff --git a/__tests__/defaultProvider.test.ts b/__tests__/defaultProvider.test.ts index 8e4d68025..428ebb987 100644 --- a/__tests__/defaultProvider.test.ts +++ b/__tests__/defaultProvider.test.ts @@ -62,6 +62,11 @@ describe('defaultProvider', () => { return expect(block).toHaveProperty('block_number'); }); + test('getNonce()', async () => { + const nonce = await testProvider.getNonce(exampleContractAddress); + return expect(nonce).toEqual('0x0'); + }); + describe('getStorageAt', () => { test('with "key" type of number', () => { return expect(testProvider.getStorageAt(exampleContractAddress, 0)).resolves.not.toThrow(); diff --git a/__tests__/sequencerProvider.test.ts b/__tests__/sequencerProvider.test.ts index c5a153673..19d1bc941 100644 --- a/__tests__/sequencerProvider.test.ts +++ b/__tests__/sequencerProvider.test.ts @@ -9,12 +9,12 @@ import { // Run only if Devnet Sequencer describeIfSequencer('SequencerProvider', () => { - let provider: SequencerProvider; + let sequencerProvider: SequencerProvider; let customSequencerProvider: Provider; let exampleContractAddress: string; beforeAll(async () => { - provider = getTestProvider() as SequencerProvider; + sequencerProvider = getTestProvider() as SequencerProvider; customSequencerProvider = new Provider({ sequencer: { baseUrl: 'https://alpha4.starknet.io', @@ -28,32 +28,34 @@ describeIfSequencer('SequencerProvider', () => { let exampleTransactionHash: string; beforeAll(async () => { - const { transaction_hash, contract_address } = await provider.deployContract({ + const { transaction_hash, contract_address } = await sequencerProvider.deployContract({ contract: compiledErc20, }); - await provider.waitForTransaction(transaction_hash); + await sequencerProvider.waitForTransaction(transaction_hash); exampleTransactionHash = transaction_hash; exampleContractAddress = contract_address; }); test('getTransactionStatus()', async () => { - return expect(provider.getTransactionStatus(exampleTransactionHash)).resolves.not.toThrow(); + return expect( + sequencerProvider.getTransactionStatus(exampleTransactionHash) + ).resolves.not.toThrow(); }); test('transaction trace', async () => { - const transactionTrace = await provider.getTransactionTrace(exampleTransactionHash); + const transactionTrace = await sequencerProvider.getTransactionTrace(exampleTransactionHash); expect(transactionTrace).toHaveProperty('function_invocation'); expect(transactionTrace).toHaveProperty('signature'); }); test('getCode() -> { bytecode }', async () => { - const code = await provider.getCode(exampleContractAddress); + const code = await sequencerProvider.getCode(exampleContractAddress); return expect(Array.isArray(code.bytecode)).toBe(true); }); describeIfNotDevnet('which are not available on devnet', () => { test('getContractAddresses()', async () => { - const { GpsStatementVerifier, Starknet } = await provider.getContractAddresses(); + const { GpsStatementVerifier, Starknet } = await sequencerProvider.getContractAddresses(); expect(typeof GpsStatementVerifier).toBe('string'); expect(typeof Starknet).toBe('string'); }); diff --git a/src/provider/default.ts b/src/provider/default.ts index 6cde791c2..5ba5b2363 100644 --- a/src/provider/default.ts +++ b/src/provider/default.ts @@ -65,6 +65,10 @@ export class Provider implements ProviderInterface { return this.provider.getEstimateFee(invocation, blockIdentifier, invocationDetails); } + public async getNonce(contractAddress: string): Promise { + return this.provider.getNonce(contractAddress); + } + public async getStorageAt( contractAddress: string, key: BigNumberish, diff --git a/src/provider/interface.ts b/src/provider/interface.ts index fc56e88ad..0a183c4da 100644 --- a/src/provider/interface.ts +++ b/src/provider/interface.ts @@ -62,6 +62,14 @@ export abstract class ProviderInterface { blockIdentifier?: BlockIdentifier ): Promise; + /** + * Gets the nonce of a contract with respect to a specific block + * + * @param contractAddress - contract address + * @returns the hex nonce + */ + public abstract getNonce(contractAddress: string): Promise; + /** * Gets the contract's storage variable at a specific key. * diff --git a/src/provider/sequencer.ts b/src/provider/sequencer.ts index 032b4894a..5716d711f 100644 --- a/src/provider/sequencer.ts +++ b/src/provider/sequencer.ts @@ -229,6 +229,10 @@ export class SequencerProvider implements ProviderInterface { ); } + public async getNonce(contractAddress: string): Promise { + return this.fetchEndpoint('get_nonce', { contractAddress }); + } + public async getStorageAt( contractAddress: string, key: BigNumberish, diff --git a/src/types/api/rpc.ts b/src/types/api/rpc.ts index 9caa34181..85a063c39 100644 --- a/src/types/api/rpc.ts +++ b/src/types/api/rpc.ts @@ -143,7 +143,7 @@ export namespace RPC { starknet_getNonce: { QUERY: never; REQUEST: any[]; - RESPONSE: string; + RESPONSE: any; }; starknet_getStorageAt: { QUERY: never; diff --git a/src/types/api/sequencer.ts b/src/types/api/sequencer.ts index 4bf867f38..efb459a8c 100644 --- a/src/types/api/sequencer.ts +++ b/src/types/api/sequencer.ts @@ -259,6 +259,13 @@ export namespace Sequencer { REQUEST: never; RESPONSE: TransactionReceiptResponse; }; + get_nonce: { + QUERY: { + contractAddress: string; + }; + REQUEST: never; + RESPONSE: any; + }; get_storage_at: { QUERY: { contractAddress: string;