diff --git a/src/provider/default.ts b/src/provider/default.ts index 1aa110055..7002ca710 100644 --- a/src/provider/default.ts +++ b/src/provider/default.ts @@ -15,7 +15,11 @@ import { InvocationsDetailsWithNonce, InvokeFunctionResponse, } from '../types'; -import { DeclareContractTransaction, DeployAccountContractTransaction } from '../types/lib'; +import { + DeclareContractTransaction, + DeployAccountContractTransaction, + InvocationsDetails, +} from '../types/lib'; import { BigNumberish } from '../utils/number'; import { ProviderInterface } from './interface'; import { RpcProvider, RpcProviderOptions } from './rpc'; @@ -118,8 +122,11 @@ export class Provider implements ProviderInterface { return this.provider.invokeFunction(functionInvocation, details); } - public async deployContract(payload: DeployContractPayload): Promise { - return this.provider.deployContract(payload); + public async deployContract( + payload: DeployContractPayload, + details: InvocationsDetails + ): Promise { + return this.provider.deployContract(payload, details); } public async deployAccountContract( diff --git a/src/provider/interface.ts b/src/provider/interface.ts index adc0cb03c..5ce6dc5bd 100644 --- a/src/provider/interface.ts +++ b/src/provider/interface.ts @@ -19,6 +19,7 @@ import { DeclareContractTransaction, DeployAccountContractPayload, DeployAccountContractTransaction, + InvocationsDetails, } from '../types/lib'; import type { BigNumberish } from '../utils/number'; import { BlockIdentifier } from './utils'; @@ -125,7 +126,10 @@ export abstract class ProviderInterface { * - address salt * @returns a confirmation of sending a transaction on the starknet contract */ - public abstract deployContract(payload: DeployContractPayload): Promise; + public abstract deployContract( + payload: DeployContractPayload, + details?: InvocationsDetails + ): Promise; /** * Deploys a given compiled Account contract (json) to starknet diff --git a/src/provider/rpc.ts b/src/provider/rpc.ts index d9661dad5..8e720c2af 100644 --- a/src/provider/rpc.ts +++ b/src/provider/rpc.ts @@ -16,8 +16,8 @@ import { import { RPC } from '../types/api'; import { DeclareContractTransaction, - DeployAccountContractPayload, DeployAccountContractTransaction, + InvocationsDetails, } from '../types/lib'; import fetch from '../utils/fetchPonyfill'; import { getSelectorFromName } from '../utils/hash'; @@ -316,12 +316,10 @@ export class RpcProvider implements ProviderInterface { }); } - public async deployContract({ - contract, - constructorCalldata, - addressSalt, - details, - }: DeployContractPayload): Promise { + public async deployContract( + { contract, constructorCalldata, addressSalt }: DeployContractPayload, + details: InvocationsDetails + ): Promise { const contractDefinition = parseContract(contract); return this.fetchEndpoint('starknet_addDeployTransaction', { deploy_transaction: { @@ -330,7 +328,7 @@ export class RpcProvider implements ProviderInterface { contract_class: { program: contractDefinition.program, entry_points_by_type: contractDefinition.entry_points_by_type, - abi: contractDefinition.abi, // rpc 2.0 + abi: contractDefinition.abi, }, type: 'DEPLOY', version: toHex(toBN(details.version || 0)), @@ -338,12 +336,10 @@ export class RpcProvider implements ProviderInterface { }); } - public async deployAccountContract({ - classHash, - constructorCalldata, - addressSalt, - details, - }: DeployAccountContractPayload): Promise { + public async deployAccountContract( + { classHash, constructorCalldata, addressSalt, signature }: DeployAccountContractTransaction, + details: InvocationsDetailsWithNonce + ): Promise { return this.fetchEndpoint('starknet_addDeployAccountTransaction', { constructor_calldata: bigNumberishArrayToHexadecimalStringArray(constructorCalldata || []), class_hash: toHex(toBN(classHash)), @@ -351,7 +347,7 @@ export class RpcProvider implements ProviderInterface { type: 'DEPLOY', max_fee: toHex(toBN(details.maxFee || 0)), version: toHex(toBN(details.version || 0)), - signature: bigNumberishArrayToHexadecimalStringArray(details.signature || []), + signature: bigNumberishArrayToHexadecimalStringArray(signature || []), nonce: toHex(toBN(details.nonce)), }); } diff --git a/src/types/api/openrpc.ts b/src/types/api/openrpc.ts index 8f556fc46..c184248e5 100644 --- a/src/types/api/openrpc.ts +++ b/src/types/api/openrpc.ts @@ -1,9 +1,9 @@ /** - * Starknet RPC version 0.1.0 + * Starknet RPC version 0.2.0 * - * StarkNet Node API 0.31.0 - * StarkNet Node Write API 0.3.0 - * StarkNet Trace API 0.3.0 + * StarkNet Node API 0.45.0 - rpc 0.2.1 + * StarkNet Node Write API 0.3.0 - rpc 0.2.1 + * StarkNet Trace API 0.4.0 - rpc 0.2.1 * * TypeScript Representation of OpenRpc protocol types */ @@ -12,7 +12,7 @@ export type FELT = string; export type ADDRESS = FELT; type NUM_AS_HEX = string; type SIGNATURE = Array; -type ETH_ADDRESS = string; +// type ETH_ADDRESS = string; type BLOCK_NUMBER = number; type BLOCK_HASH = FELT; type TXN_HASH = FELT; @@ -34,37 +34,49 @@ type EVENT = { keys: Array; data: Array; }; + type COMMON_RECEIPT_PROPERTIES = { transaction_hash: TXN_HASH; actual_fee: FELT; status: TXN_STATUS; - status_data?: string; - block_hash: BLOCK_HASH; - block_number: BLOCK_NUMBER; -}; -type MSG_TO_L2 = { - from_address: ETH_ADDRESS; - payload: FELT; -}; -type INVOKE_TXN_RECEIPT_PROPERTIES = { - messages_sent: MSG_TO_L1; - l1_origin_message?: MSG_TO_L2; - events: EVENT; + block_hash?: BLOCK_HASH; + block_number?: BLOCK_NUMBER; + type: TXN_TYPE; + messages_sent: Array; + events: Array; }; + type PENDING_COMMON_RECEIPT_PROPERTIES = { transaction_hash: TXN_HASH; actual_fee: FELT; + type?: TXN_TYPE; + messages_sent: Array; + events: Array; }; -type INVOKE_TXN_RECEIPT = COMMON_RECEIPT_PROPERTIES & INVOKE_TXN_RECEIPT_PROPERTIES; + +type INVOKE_TXN_RECEIPT = COMMON_RECEIPT_PROPERTIES; type DECLARE_TXN_RECEIPT = COMMON_RECEIPT_PROPERTIES; -type DEPLOY_TXN_RECEIPT = COMMON_RECEIPT_PROPERTIES; -type PENDING_INVOKE_TXN_RECEIPT = PENDING_COMMON_RECEIPT_PROPERTIES & INVOKE_TXN_RECEIPT_PROPERTIES; -type PENDING_TXN_RECEIPT = PENDING_INVOKE_TXN_RECEIPT | PENDING_COMMON_RECEIPT_PROPERTIES; + +type DEPLOY_TXN_RECEIPT = { + contract_address: FELT; +} & COMMON_RECEIPT_PROPERTIES; + +type L1_HANDLER_TXN_RECEIPT = COMMON_RECEIPT_PROPERTIES; + +type PENDING_DEPLOY_TXN_RECEIPT = { + contract_address: FELT; +} & PENDING_COMMON_RECEIPT_PROPERTIES; + +type PENDING_TXN_RECEIPT = PENDING_DEPLOY_TXN_RECEIPT | PENDING_COMMON_RECEIPT_PROPERTIES; + type TXN_RECEIPT = | INVOKE_TXN_RECEIPT + | L1_HANDLER_TXN_RECEIPT | DECLARE_TXN_RECEIPT | DEPLOY_TXN_RECEIPT + | DEPLOY_ACCOUNT_TXN_RECEIPT | PENDING_TXN_RECEIPT; + type BLOCK_HEADER = { block_hash: BLOCK_HASH; parent_hash: BLOCK_HASH; @@ -77,7 +89,7 @@ type BLOCK_BODY_WITH_TX_HASHES = { transactions: Array; }; type BLOCK_WITH_TX_HASHES = { - status: TXN_STATUS; + status: BLOCK_STATUS; } & BLOCK_HEADER & BLOCK_BODY_WITH_TX_HASHES; type PENDING_BLOCK_WITH_TX_HASHES = BLOCK_BODY_WITH_TX_HASHES & { @@ -88,41 +100,87 @@ type PENDING_BLOCK_WITH_TX_HASHES = BLOCK_BODY_WITH_TX_HASHES & { // transaction_hash, nonce, type optional because of pathfinder not implemented type COMMON_TXN_PROPERTIES = { transaction_hash?: TXN_HASH; - max_fee: FELT; - version: NUM_AS_HEX; - signature: SIGNATURE; - nonce?: FELT; - type?: TXN_TYPE; -}; +} & BROADCASTED_TXN_COMMON_PROPERTIES; type FUNCTION_CALL = { contract_address?: ADDRESS; entry_point_selector?: FELT; calldata?: Array; }; -type INVOKE_TXN = COMMON_TXN_PROPERTIES & FUNCTION_CALL; +type INVOKE_TXN = COMMON_TXN_PROPERTIES & (INVOKE_TXN_V0 | INVOKE_TXN_V1); type DECLARE_TXN = COMMON_TXN_PROPERTIES & { class_hash: FELT; sender_address: ADDRESS; }; -type DEPLOY_ACCOUNT_TXN_REQUEST = COMMON_TXN_PROPERTIES & { +type DEPLOY_TXN = { + transaction_hash: TXN_HASH; class_hash: FELT; +} & DEPLOY_TXN_PROPERTIES; + +type DEPLOY_ACCOUNT_TXN = COMMON_TXN_PROPERTIES & DEPLOY_ACCOUNT_TXN_PROPERTIES; + +type DEPLOY_ACCOUNT_TXN_PROPERTIES = { contract_address_salt: FELT; constructor_calldata: Array; + class_hash: FELT; }; -type DECLARE_TXN_REQUEST = COMMON_TXN_PROPERTIES & { + +type DEPLOY_ACCOUNT_TXN_RECEIPT = DEPLOY_TXN_RECEIPT; + +type TXN = INVOKE_TXN | L1_HANDLER_TXN | DECLARE_TXN | DEPLOY_TXN | DEPLOY_ACCOUNT_TXN; + +enum L1_HANDLER { + 'L1_HANDLER', +} + +type L1_HANDLER_TXN = { + transaction_hash: TXN_HASH; + version: NUM_AS_HEX; + type: L1_HANDLER; + nonce: NUM_AS_HEX; +} & FUNCTION_CALL; + +type BROADCASTED_DEPLOY_ACCOUNT_TXN = BROADCASTED_TXN_COMMON_PROPERTIES & + DEPLOY_ACCOUNT_TXN_PROPERTIES; + +type BROADCASTED_TXN = + | BROADCASTED_INVOKE_TXN + | BROADCASTED_DECLARE_TXN + | BROADCASTED_DEPLOY_TXN + | BROADCASTED_DEPLOY_ACCOUNT_TXN; + +type BROADCASTED_INVOKE_TXN = BROADCASTED_TXN_COMMON_PROPERTIES & (INVOKE_TXN_V0 | INVOKE_TXN_V1); + +type BROADCASTED_TXN_COMMON_PROPERTIES = { + type: TXN_TYPE; + max_fee: FELT; + version: NUM_AS_HEX; + signature: SIGNATURE; + nonce: FELT; +}; + +type BROADCASTED_DECLARE_TXN = { contract_class: CONTRACT_CLASS; sender_address: ADDRESS; -}; -type DEPLOY_TXN = { - transaction_hash: TXN_HASH; - class_hash: FELT; +} & BROADCASTED_TXN_COMMON_PROPERTIES; + +type BROADCASTED_DEPLOY_TXN = { + contract_class: CONTRACT_CLASS; +} & DEPLOY_TXN_PROPERTIES; + +type DEPLOY_TXN_PROPERTIES = { version: NUM_AS_HEX; type: TXN_TYPE; - contract_address: FELT; contract_address_salt: FELT; constructor_calldata: Array; }; -type TXN = INVOKE_TXN | DECLARE_TXN | DEPLOY_TXN; + +type INVOKE_TXN_V0 = FUNCTION_CALL; + +type INVOKE_TXN_V1 = { + sender_address: ADDRESS; + calldata: Array; +}; + type BLOCK_BODY_WITH_TXS = { transactions: Array; }; @@ -137,27 +195,69 @@ type PENDING_BLOCK_WITH_TXS = BLOCK_BODY_WITH_TXS & { }; type CONTRACT_CLASS = { - program: string; // A base64 representation of the compressed program code + program: string; entry_points_by_type: { CONSTRUCTOR: CONTRACT_ENTRY_POINT_LIST; EXTERNAL: CONTRACT_ENTRY_POINT_LIST; L1_HANDLER: CONTRACT_ENTRY_POINT_LIST; }; - abi?: any; // Pathfinder exception from rpc 0.1.0 + abi?: CONTRACT_ABI; +}; + +type CONTRACT_ABI = Array; + +type CONTRACT_ABI_ENTRY = FUNCTION_ABI_ENTRY | EVENT_ABI_ENTRY | STRUCT_ABI_ENTRY; + +enum STRUCT_ABI_TYPE { + 'struct', +} +enum EVENT_ABI_TYPE { + 'event', +} +enum FUNCTION_ABI_TYPE { + 'function', + 'l1_handler', + 'constructor', +} + +type STRUCT_ABI_ENTRY = STRUCT_ABI_TYPE & { + name: string; + size: number; + members: Array; }; + +type STRUCT_MEMBER = { + offset: number; +} & TYPED_PARAMETER; + +type EVENT_ABI_ENTRY = { + name: string; + keys: Array; + data: Array; +} & EVENT_ABI_TYPE; + +type FUNCTION_ABI_ENTRY = { + type: FUNCTION_ABI_TYPE; + name: string; + inputs: Array; + outputs: Array; +}; + +type TYPED_PARAMETER = { + name: string; + type: string; +}; + type CONTRACT_ENTRY_POINT_LIST = Array; type CONTRACT_ENTRY_POINT = { offset: NUM_AS_HEX; selector: FELT; }; -type STORAGE_DIFF_ITEM = { +type CONTRACT_STORAGE_DIFF_ITEM = { address: FELT; - key: FELT; - value: FELT; -}; -type DECLARED_CONTRACT_ITEM = { - class_hash: FELT; + storage_entries: [key: FELT, value: FELT]; }; + type DEPLOYED_CONTRACT_ITEM = { address: FELT; class_hash: FELT; @@ -167,8 +267,8 @@ type STATE_UPDATE = { new_root: FELT; old_root: FELT; state_diff: { - storage_diffs: Array; - declared_contracts: Array; + storage_diffs: Array; + declared_contract_hashes: Array; deployed_contracts: Array; nonces: Array<{ contract_address: ADDRESS; @@ -184,8 +284,8 @@ type EVENT_FILTER = { keys?: Array; }; type RESULT_PAGE_REQUEST = { - page_size: number; - page_number: number; + continuation_token?: string; + chunk_size: number; }; type EMITTED_EVENT = EVENT & { block_hash: BLOCK_HASH; @@ -221,10 +321,12 @@ type FUNCTION_INVOCATION = FUNCTION_CALL & { entry_point_type: ENTRY_POINT_TYPE; call_type: CALL_TYPE; result: FELT; - calls: FUNCTION_INVOCATION; - events: EVENT; + calls: NESTED_CALL; + events: Array; messages: MSG_TO_L1; }; +type NESTED_CALL = FUNCTION_INVOCATION; + type TRACE_ROOT = { nonce: FELT; signature: FELT; @@ -253,8 +355,7 @@ export namespace OPENRPC { export type SyncingStatus = false | SYNC_STATUS; export type Events = { events: Array; - page_number: number; - is_last_page: boolean; + continuation_token: string; }; export type Trace = TRACE_ROOT; export type Traces = Array<{ @@ -274,57 +375,57 @@ export namespace OPENRPC { starknet_getBlockWithTxHashes: { params: { block_id: BLOCK_ID }; result: BlockWithTxHashes; - errors: Errors.INVALID_BLOCK_ID; + errors: Errors.BLOCK_NOT_FOUND; }; starknet_getBlockWithTxs: { params: { block_id: BLOCK_ID }; result: BlockWithTxs; - errors: Errors.INVALID_BLOCK_ID; + errors: Errors.BLOCK_NOT_FOUND; }; starknet_getStateUpdate: { params: { block_id: BLOCK_ID }; result: StateUpdate; - errors: Errors.INVALID_BLOCK_ID; + errors: Errors.BLOCK_NOT_FOUND; }; starknet_getStorageAt: { params: { contract_address: ADDRESS; key: STORAGE_KEY; block_id: BLOCK_ID }; result: Storage; - errors: Errors.CONTRACT_NOT_FOUND | Errors.INVALID_BLOCK_ID; + errors: Errors.CONTRACT_NOT_FOUND | Errors.BLOCK_NOT_FOUND; }; starknet_getTransactionByHash: { params: { transaction_hash: TXN_HASH }; result: Transaction; - errors: Errors.INVALID_TXN_HASH; + errors: Errors.TXN_HASH_NOT_FOUND; }; starknet_getTransactionByBlockIdAndIndex: { params: { block_id: BLOCK_ID; index: number }; result: Transaction; - errors: Errors.INVALID_BLOCK_ID | Errors.INVALID_TXN_INDEX; + errors: Errors.BLOCK_NOT_FOUND | Errors.INVALID_TXN_INDEX; }; starknet_getTransactionReceipt: { params: { transaction_hash: TXN_HASH }; result: TransactionReceipt; - errors: Errors.INVALID_TXN_HASH; + errors: Errors.TXN_HASH_NOT_FOUND; }; starknet_getClass: { - params: { class_hash: FELT }; + params: { block_id: BLOCK_ID; class_hash: FELT }; result: ContractClass; - errors: Errors.INVALID_CONTRACT_CLASS_HASH; + errors: Errors.BLOCK_NOT_FOUND | Errors.CLASS_HASH_NOT_FOUND; }; starknet_getClassHashAt: { params: { block_id: BLOCK_ID; contract_address: ADDRESS }; result: FELT; - errors: Errors.INVALID_BLOCK_ID | Errors.CONTRACT_NOT_FOUND; + errors: Errors.BLOCK_NOT_FOUND | Errors.CONTRACT_NOT_FOUND; }; starknet_getClassAt: { params: { block_id: BLOCK_ID; contract_address: ADDRESS }; result: ContractClass; - errors: Errors.INVALID_BLOCK_ID | Errors.CONTRACT_NOT_FOUND; + errors: Errors.BLOCK_NOT_FOUND | Errors.CONTRACT_NOT_FOUND; }; starknet_getBlockTransactionCount: { params: { block_id: BLOCK_ID }; result: number; - errors: Errors.INVALID_BLOCK_ID; + errors: Errors.BLOCK_NOT_FOUND; }; starknet_call: { params: { request: FUNCTION_CALL; block_id: BLOCK_ID }; @@ -334,20 +435,17 @@ export namespace OPENRPC { | Errors.INVALID_MESSAGE_SELECTOR | Errors.INVALID_CALL_DATA | Errors.CONTRACT_ERROR - | Errors.INVALID_BLOCK_ID; + | Errors.BLOCK_NOT_FOUND; }; starknet_estimateFee: { - params: { - request: INVOKE_TXN | DECLARE_TXN_REQUEST | DEPLOY_ACCOUNT_TXN_REQUEST; - block_id: BLOCK_ID; - }; + params: { request: BROADCASTED_TXN; block_id: BLOCK_ID }; result: FEE_ESTIMATE; errors: | Errors.CONTRACT_NOT_FOUND | Errors.INVALID_MESSAGE_SELECTOR | Errors.INVALID_CALL_DATA | Errors.CONTRACT_ERROR - | Errors.INVALID_BLOCK_ID; + | Errors.BLOCK_NOT_FOUND; }; starknet_blockNumber: { params: {}; @@ -367,6 +465,10 @@ export namespace OPENRPC { params: {}; result: PendingTransactions; }; + starknet_protocolVersion: { + params: {}; + result: ProtocolVersion; + }; starknet_syncing: { params: {}; result: SyncingStatus; @@ -374,55 +476,42 @@ export namespace OPENRPC { starknet_getEvents: { params: { filter: EVENT_FILTER & RESULT_PAGE_REQUEST }; result: Events; - errors: Errors.PAGE_SIZE_TOO_BIG; + errors: Errors.PAGE_SIZE_TOO_BIG | Errors.INVALID_CONTINUATION_TOKEN | Errors.BLOCK_NOT_FOUND; }; - // FROM RPC 0.2.0 Pathfinder exception starknet_getNonce: { - params: { contract_address: ADDRESS; block_id: BLOCK_ID }; + params: { block_id: BLOCK_ID; contract_address: ADDRESS }; result: FELT; - errors: Errors.CONTRACT_NOT_FOUND; + errors: Errors.BLOCK_NOT_FOUND | Errors.CONTRACT_NOT_FOUND; }; // Write API starknet_addInvokeTransaction: { params: { - function_invocation: FUNCTION_CALL; - signature: SIGNATURE; - max_fee: NUM_AS_HEX; - version: NUM_AS_HEX; + invoke_transaction: BROADCASTED_INVOKE_TXN; }; result: InvokedTransaction; }; starknet_addDeclareTransaction: { params: { - contract_class: CONTRACT_CLASS; - sender_address: ADDRESS; - signature: SIGNATURE; - max_fee: NUM_AS_HEX; - version: NUM_AS_HEX; - nonce: FELT; + declare_transaction: BROADCASTED_DECLARE_TXN; }; result: DeclaredTransaction; errors: Errors.INVALID_CONTRACT_CLASS; }; starknet_addDeployTransaction: { params: { - contract_address_salt: FELT; - constructor_calldata: Array; - contract_definition: CONTRACT_CLASS; + deploy_transaction: BROADCASTED_DEPLOY_TXN; }; result: DeployedTransaction; errors: Errors.INVALID_CONTRACT_CLASS; }; - starknet_addDeployAccountTransaction: { - params: { - contract_address_salt: FELT; - constructor_calldata: Array; - class_hash: FELT; + params: BROADCASTED_DEPLOY_ACCOUNT_TXN; + result: { + transaction_hash: TXN_HASH; + contract_address: FELT; }; - result: DeployedTransaction; - errors: Errors.INVALID_CONTRACT_CLASS; + errors: Errors.CLASS_HASH_NOT_FOUND; }; // Trace API @@ -430,10 +519,10 @@ export namespace OPENRPC { params: { transaction_hash: TXN_HASH }; result: Trace; errors: - | Errors.INVALID_TXN_HASH + | Errors.TXN_HASH_NOT_FOUND | Errors.NO_TRACE_AVAILABLE | Errors.INVALID_BLOCK_HASH - | Errors.INVALID_TXN_HASH; + | Errors.TXN_HASH_NOT_FOUND; }; starknet_traceBlockTransactions: { params: { block_hash: BLOCK_HASH }; @@ -464,9 +553,9 @@ export namespace Errors { message: 'Invalid call data'; } - export interface INVALID_BLOCK_ID { + export interface BLOCK_NOT_FOUND { code: 24; - message: 'Invalid block id'; + message: 'Block not found'; } export interface INVALID_TXN_INDEX { @@ -474,9 +563,9 @@ export namespace Errors { message: 'Invalid transaction index in a block'; } - export interface INVALID_CONTRACT_CLASS_HASH { + export interface CLASS_HASH_NOT_FOUND { code: 28; - message: 'The supplied contract class hash is invalid or unknown'; + message: 'Class hash not found'; } export interface PAGE_SIZE_TOO_BIG { @@ -489,6 +578,11 @@ export namespace Errors { message: 'There are no blocks'; } + export interface INVALID_CONTINUATION_TOKEN { + code: 33; + message: 'The supplied continuation token is invalid or unknown'; + } + export interface CONTRACT_ERROR { code: 40; message: 'Contract error'; @@ -512,8 +606,8 @@ export namespace Errors { message: 'Invalid block hash'; } - export interface INVALID_TXN_HASH { + export interface TXN_HASH_NOT_FOUND { code: 25; - message: 'Invalid transaction hash'; + message: 'Transaction hash not found'; } } diff --git a/src/types/api/openrpcv2.ts b/src/types/api/openrpcv2.ts deleted file mode 100644 index c184248e5..000000000 --- a/src/types/api/openrpcv2.ts +++ /dev/null @@ -1,613 +0,0 @@ -/** - * Starknet RPC version 0.2.0 - * - * StarkNet Node API 0.45.0 - rpc 0.2.1 - * StarkNet Node Write API 0.3.0 - rpc 0.2.1 - * StarkNet Trace API 0.4.0 - rpc 0.2.1 - * - * TypeScript Representation of OpenRpc protocol types - */ - -export type FELT = string; -export type ADDRESS = FELT; -type NUM_AS_HEX = string; -type SIGNATURE = Array; -// type ETH_ADDRESS = string; -type BLOCK_NUMBER = number; -type BLOCK_HASH = FELT; -type TXN_HASH = FELT; -type PROTOCOL_VERSION = string; -type TXN_STATUS = 'PENDING' | 'ACCEPTED_ON_L2' | 'ACCEPTED_ON_L1' | 'REJECTED'; -type TXN_TYPE = 'DECLARE' | 'DEPLOY' | 'DEPLOY_ACCOUNT' | 'INVOKE' | 'L1_HANDLER'; -type BLOCK_STATUS = 'PENDING' | 'ACCEPTED_ON_L2' | 'ACCEPTED_ON_L1' | 'REJECTED'; -enum BLOCK_TAG { - 'latest', - 'pending', -} -type BLOCK_ID = { block_hash: BLOCK_HASH } | { block_number: BLOCK_NUMBER } | BLOCK_TAG; -type MSG_TO_L1 = { - to_address: FELT; - payload: Array; -}; -type EVENT = { - from_address: FELT; - keys: Array; - data: Array; -}; - -type COMMON_RECEIPT_PROPERTIES = { - transaction_hash: TXN_HASH; - actual_fee: FELT; - status: TXN_STATUS; - block_hash?: BLOCK_HASH; - block_number?: BLOCK_NUMBER; - type: TXN_TYPE; - messages_sent: Array; - events: Array; -}; - -type PENDING_COMMON_RECEIPT_PROPERTIES = { - transaction_hash: TXN_HASH; - actual_fee: FELT; - type?: TXN_TYPE; - messages_sent: Array; - events: Array; -}; - -type INVOKE_TXN_RECEIPT = COMMON_RECEIPT_PROPERTIES; -type DECLARE_TXN_RECEIPT = COMMON_RECEIPT_PROPERTIES; - -type DEPLOY_TXN_RECEIPT = { - contract_address: FELT; -} & COMMON_RECEIPT_PROPERTIES; - -type L1_HANDLER_TXN_RECEIPT = COMMON_RECEIPT_PROPERTIES; - -type PENDING_DEPLOY_TXN_RECEIPT = { - contract_address: FELT; -} & PENDING_COMMON_RECEIPT_PROPERTIES; - -type PENDING_TXN_RECEIPT = PENDING_DEPLOY_TXN_RECEIPT | PENDING_COMMON_RECEIPT_PROPERTIES; - -type TXN_RECEIPT = - | INVOKE_TXN_RECEIPT - | L1_HANDLER_TXN_RECEIPT - | DECLARE_TXN_RECEIPT - | DEPLOY_TXN_RECEIPT - | DEPLOY_ACCOUNT_TXN_RECEIPT - | PENDING_TXN_RECEIPT; - -type BLOCK_HEADER = { - block_hash: BLOCK_HASH; - parent_hash: BLOCK_HASH; - block_number: BLOCK_NUMBER; - new_root: FELT; - timestamp: number; - sequencer_address: FELT; -}; -type BLOCK_BODY_WITH_TX_HASHES = { - transactions: Array; -}; -type BLOCK_WITH_TX_HASHES = { - status: BLOCK_STATUS; -} & BLOCK_HEADER & - BLOCK_BODY_WITH_TX_HASHES; -type PENDING_BLOCK_WITH_TX_HASHES = BLOCK_BODY_WITH_TX_HASHES & { - timestamp: number; - sequencer_address: FELT; - parent_hash: BLOCK_HASH; -}; -// transaction_hash, nonce, type optional because of pathfinder not implemented -type COMMON_TXN_PROPERTIES = { - transaction_hash?: TXN_HASH; -} & BROADCASTED_TXN_COMMON_PROPERTIES; -type FUNCTION_CALL = { - contract_address?: ADDRESS; - entry_point_selector?: FELT; - calldata?: Array; -}; -type INVOKE_TXN = COMMON_TXN_PROPERTIES & (INVOKE_TXN_V0 | INVOKE_TXN_V1); -type DECLARE_TXN = COMMON_TXN_PROPERTIES & { - class_hash: FELT; - sender_address: ADDRESS; -}; -type DEPLOY_TXN = { - transaction_hash: TXN_HASH; - class_hash: FELT; -} & DEPLOY_TXN_PROPERTIES; - -type DEPLOY_ACCOUNT_TXN = COMMON_TXN_PROPERTIES & DEPLOY_ACCOUNT_TXN_PROPERTIES; - -type DEPLOY_ACCOUNT_TXN_PROPERTIES = { - contract_address_salt: FELT; - constructor_calldata: Array; - class_hash: FELT; -}; - -type DEPLOY_ACCOUNT_TXN_RECEIPT = DEPLOY_TXN_RECEIPT; - -type TXN = INVOKE_TXN | L1_HANDLER_TXN | DECLARE_TXN | DEPLOY_TXN | DEPLOY_ACCOUNT_TXN; - -enum L1_HANDLER { - 'L1_HANDLER', -} - -type L1_HANDLER_TXN = { - transaction_hash: TXN_HASH; - version: NUM_AS_HEX; - type: L1_HANDLER; - nonce: NUM_AS_HEX; -} & FUNCTION_CALL; - -type BROADCASTED_DEPLOY_ACCOUNT_TXN = BROADCASTED_TXN_COMMON_PROPERTIES & - DEPLOY_ACCOUNT_TXN_PROPERTIES; - -type BROADCASTED_TXN = - | BROADCASTED_INVOKE_TXN - | BROADCASTED_DECLARE_TXN - | BROADCASTED_DEPLOY_TXN - | BROADCASTED_DEPLOY_ACCOUNT_TXN; - -type BROADCASTED_INVOKE_TXN = BROADCASTED_TXN_COMMON_PROPERTIES & (INVOKE_TXN_V0 | INVOKE_TXN_V1); - -type BROADCASTED_TXN_COMMON_PROPERTIES = { - type: TXN_TYPE; - max_fee: FELT; - version: NUM_AS_HEX; - signature: SIGNATURE; - nonce: FELT; -}; - -type BROADCASTED_DECLARE_TXN = { - contract_class: CONTRACT_CLASS; - sender_address: ADDRESS; -} & BROADCASTED_TXN_COMMON_PROPERTIES; - -type BROADCASTED_DEPLOY_TXN = { - contract_class: CONTRACT_CLASS; -} & DEPLOY_TXN_PROPERTIES; - -type DEPLOY_TXN_PROPERTIES = { - version: NUM_AS_HEX; - type: TXN_TYPE; - contract_address_salt: FELT; - constructor_calldata: Array; -}; - -type INVOKE_TXN_V0 = FUNCTION_CALL; - -type INVOKE_TXN_V1 = { - sender_address: ADDRESS; - calldata: Array; -}; - -type BLOCK_BODY_WITH_TXS = { - transactions: Array; -}; -type BLOCK_WITH_TXS = { - status: BLOCK_STATUS; -} & BLOCK_HEADER & - BLOCK_BODY_WITH_TXS; -type PENDING_BLOCK_WITH_TXS = BLOCK_BODY_WITH_TXS & { - timestamp: number; - sequencer_address: FELT; - parent_hash: BLOCK_HASH; -}; - -type CONTRACT_CLASS = { - program: string; - entry_points_by_type: { - CONSTRUCTOR: CONTRACT_ENTRY_POINT_LIST; - EXTERNAL: CONTRACT_ENTRY_POINT_LIST; - L1_HANDLER: CONTRACT_ENTRY_POINT_LIST; - }; - abi?: CONTRACT_ABI; -}; - -type CONTRACT_ABI = Array; - -type CONTRACT_ABI_ENTRY = FUNCTION_ABI_ENTRY | EVENT_ABI_ENTRY | STRUCT_ABI_ENTRY; - -enum STRUCT_ABI_TYPE { - 'struct', -} -enum EVENT_ABI_TYPE { - 'event', -} -enum FUNCTION_ABI_TYPE { - 'function', - 'l1_handler', - 'constructor', -} - -type STRUCT_ABI_ENTRY = STRUCT_ABI_TYPE & { - name: string; - size: number; - members: Array; -}; - -type STRUCT_MEMBER = { - offset: number; -} & TYPED_PARAMETER; - -type EVENT_ABI_ENTRY = { - name: string; - keys: Array; - data: Array; -} & EVENT_ABI_TYPE; - -type FUNCTION_ABI_ENTRY = { - type: FUNCTION_ABI_TYPE; - name: string; - inputs: Array; - outputs: Array; -}; - -type TYPED_PARAMETER = { - name: string; - type: string; -}; - -type CONTRACT_ENTRY_POINT_LIST = Array; -type CONTRACT_ENTRY_POINT = { - offset: NUM_AS_HEX; - selector: FELT; -}; -type CONTRACT_STORAGE_DIFF_ITEM = { - address: FELT; - storage_entries: [key: FELT, value: FELT]; -}; - -type DEPLOYED_CONTRACT_ITEM = { - address: FELT; - class_hash: FELT; -}; -type STATE_UPDATE = { - block_hash: BLOCK_HASH; - new_root: FELT; - old_root: FELT; - state_diff: { - storage_diffs: Array; - declared_contract_hashes: Array; - deployed_contracts: Array; - nonces: Array<{ - contract_address: ADDRESS; - nonce: FELT; - }>; - }; -}; -type STORAGE_KEY = string; -type EVENT_FILTER = { - from_block?: BLOCK_ID; - to_block?: BLOCK_ID; - address?: ADDRESS; - keys?: Array; -}; -type RESULT_PAGE_REQUEST = { - continuation_token?: string; - chunk_size: number; -}; -type EMITTED_EVENT = EVENT & { - block_hash: BLOCK_HASH; - block_number: BLOCK_NUMBER; - transaction_hash: TXN_HASH; -}; -type SYNC_STATUS = { - starting_block_hash: BLOCK_HASH; - starting_block_num: NUM_AS_HEX; - current_block_hash: BLOCK_HASH; - current_block_num: NUM_AS_HEX; - highest_block_hash: BLOCK_HASH; - highest_block_num: NUM_AS_HEX; -}; -type FEE_ESTIMATE = { - gas_consumed: NUM_AS_HEX; - gas_price: NUM_AS_HEX; - overall_fee: NUM_AS_HEX; -}; - -enum CALL_TYPE { - 'DELEGATE', - 'CALL', -} -enum ENTRY_POINT_TYPE { - 'EXTERNAL', - 'L1_HANDLER', - 'CONSTRUCTOR', -} -type FUNCTION_INVOCATION = FUNCTION_CALL & { - caller_address: FELT; - code_address: FELT; - entry_point_type: ENTRY_POINT_TYPE; - call_type: CALL_TYPE; - result: FELT; - calls: NESTED_CALL; - events: Array; - messages: MSG_TO_L1; -}; -type NESTED_CALL = FUNCTION_INVOCATION; - -type TRACE_ROOT = { - nonce: FELT; - signature: FELT; - function_invocation: FUNCTION_INVOCATION; -}; - -export namespace OPENRPC { - export type Nonce = FELT; - export type BlockWithTxHashes = BLOCK_WITH_TX_HASHES | PENDING_BLOCK_WITH_TX_HASHES; - export type BlockWithTxs = BLOCK_WITH_TXS | PENDING_BLOCK_WITH_TXS; - export type StateUpdate = STATE_UPDATE; - export type Storage = FELT; - export type Transaction = TXN; - export type TransactionReceipt = TXN_RECEIPT; - export type ContractClass = CONTRACT_CLASS; - export type CallResponse = Array; - export type EstimatedFee = FEE_ESTIMATE; - export type BlockNumber = BLOCK_NUMBER; - export type BlockHashAndNumber = { - block_hash: BLOCK_HASH; - block_number: BLOCK_NUMBER; - }; - export type CHAIN_ID = string; - export type PendingTransactions = Array; - export type ProtocolVersion = PROTOCOL_VERSION; - export type SyncingStatus = false | SYNC_STATUS; - export type Events = { - events: Array; - continuation_token: string; - }; - export type Trace = TRACE_ROOT; - export type Traces = Array<{ - transaction_hash: FELT; - trace_root: TRACE_ROOT; - }>; - export type TransactionHash = TXN_HASH; - export type BlockHash = BLOCK_HASH; - export type EventFilter = EVENT_FILTER & RESULT_PAGE_REQUEST; - export type InvokedTransaction = { transaction_hash: TXN_HASH }; - export type DeclaredTransaction = { transaction_hash: TXN_HASH; class_hash: FELT }; - export type DeployedTransaction = { transaction_hash: TXN_HASH; contract_address: FELT }; - - // Final Methods - export type Methods = { - // Read API - starknet_getBlockWithTxHashes: { - params: { block_id: BLOCK_ID }; - result: BlockWithTxHashes; - errors: Errors.BLOCK_NOT_FOUND; - }; - starknet_getBlockWithTxs: { - params: { block_id: BLOCK_ID }; - result: BlockWithTxs; - errors: Errors.BLOCK_NOT_FOUND; - }; - starknet_getStateUpdate: { - params: { block_id: BLOCK_ID }; - result: StateUpdate; - errors: Errors.BLOCK_NOT_FOUND; - }; - starknet_getStorageAt: { - params: { contract_address: ADDRESS; key: STORAGE_KEY; block_id: BLOCK_ID }; - result: Storage; - errors: Errors.CONTRACT_NOT_FOUND | Errors.BLOCK_NOT_FOUND; - }; - starknet_getTransactionByHash: { - params: { transaction_hash: TXN_HASH }; - result: Transaction; - errors: Errors.TXN_HASH_NOT_FOUND; - }; - starknet_getTransactionByBlockIdAndIndex: { - params: { block_id: BLOCK_ID; index: number }; - result: Transaction; - errors: Errors.BLOCK_NOT_FOUND | Errors.INVALID_TXN_INDEX; - }; - starknet_getTransactionReceipt: { - params: { transaction_hash: TXN_HASH }; - result: TransactionReceipt; - errors: Errors.TXN_HASH_NOT_FOUND; - }; - starknet_getClass: { - params: { block_id: BLOCK_ID; class_hash: FELT }; - result: ContractClass; - errors: Errors.BLOCK_NOT_FOUND | Errors.CLASS_HASH_NOT_FOUND; - }; - starknet_getClassHashAt: { - params: { block_id: BLOCK_ID; contract_address: ADDRESS }; - result: FELT; - errors: Errors.BLOCK_NOT_FOUND | Errors.CONTRACT_NOT_FOUND; - }; - starknet_getClassAt: { - params: { block_id: BLOCK_ID; contract_address: ADDRESS }; - result: ContractClass; - errors: Errors.BLOCK_NOT_FOUND | Errors.CONTRACT_NOT_FOUND; - }; - starknet_getBlockTransactionCount: { - params: { block_id: BLOCK_ID }; - result: number; - errors: Errors.BLOCK_NOT_FOUND; - }; - starknet_call: { - params: { request: FUNCTION_CALL; block_id: BLOCK_ID }; - result: Array; - errors: - | Errors.CONTRACT_NOT_FOUND - | Errors.INVALID_MESSAGE_SELECTOR - | Errors.INVALID_CALL_DATA - | Errors.CONTRACT_ERROR - | Errors.BLOCK_NOT_FOUND; - }; - starknet_estimateFee: { - params: { request: BROADCASTED_TXN; block_id: BLOCK_ID }; - result: FEE_ESTIMATE; - errors: - | Errors.CONTRACT_NOT_FOUND - | Errors.INVALID_MESSAGE_SELECTOR - | Errors.INVALID_CALL_DATA - | Errors.CONTRACT_ERROR - | Errors.BLOCK_NOT_FOUND; - }; - starknet_blockNumber: { - params: {}; - result: BLOCK_NUMBER; - errors: Errors.NO_BLOCKS; - }; - starknet_blockHashAndNumber: { - params: {}; - result: BLOCK_HASH & BLOCK_NUMBER; - errors: Errors.NO_BLOCKS; - }; - starknet_chainId: { - params: {}; - result: CHAIN_ID; - }; - starknet_pendingTransactions: { - params: {}; - result: PendingTransactions; - }; - starknet_protocolVersion: { - params: {}; - result: ProtocolVersion; - }; - starknet_syncing: { - params: {}; - result: SyncingStatus; - }; - starknet_getEvents: { - params: { filter: EVENT_FILTER & RESULT_PAGE_REQUEST }; - result: Events; - errors: Errors.PAGE_SIZE_TOO_BIG | Errors.INVALID_CONTINUATION_TOKEN | Errors.BLOCK_NOT_FOUND; - }; - starknet_getNonce: { - params: { block_id: BLOCK_ID; contract_address: ADDRESS }; - result: FELT; - errors: Errors.BLOCK_NOT_FOUND | Errors.CONTRACT_NOT_FOUND; - }; - - // Write API - starknet_addInvokeTransaction: { - params: { - invoke_transaction: BROADCASTED_INVOKE_TXN; - }; - result: InvokedTransaction; - }; - starknet_addDeclareTransaction: { - params: { - declare_transaction: BROADCASTED_DECLARE_TXN; - }; - result: DeclaredTransaction; - errors: Errors.INVALID_CONTRACT_CLASS; - }; - starknet_addDeployTransaction: { - params: { - deploy_transaction: BROADCASTED_DEPLOY_TXN; - }; - result: DeployedTransaction; - errors: Errors.INVALID_CONTRACT_CLASS; - }; - starknet_addDeployAccountTransaction: { - params: BROADCASTED_DEPLOY_ACCOUNT_TXN; - result: { - transaction_hash: TXN_HASH; - contract_address: FELT; - }; - errors: Errors.CLASS_HASH_NOT_FOUND; - }; - - // Trace API - starknet_traceTransaction: { - params: { transaction_hash: TXN_HASH }; - result: Trace; - errors: - | Errors.TXN_HASH_NOT_FOUND - | Errors.NO_TRACE_AVAILABLE - | Errors.INVALID_BLOCK_HASH - | Errors.TXN_HASH_NOT_FOUND; - }; - starknet_traceBlockTransactions: { - params: { block_hash: BLOCK_HASH }; - result: Traces; - errors: Errors.INVALID_BLOCK_HASH; - }; - }; -} - -export namespace Errors { - export interface FAILED_TO_RECEIVE_TXN { - code: 1; - message: 'Failed to write transaction'; - } - - export interface CONTRACT_NOT_FOUND { - code: 20; - message: 'Contract not found'; - } - - export interface INVALID_MESSAGE_SELECTOR { - code: 21; - message: 'Invalid message selector'; - } - - export interface INVALID_CALL_DATA { - code: 22; - message: 'Invalid call data'; - } - - export interface BLOCK_NOT_FOUND { - code: 24; - message: 'Block not found'; - } - - export interface INVALID_TXN_INDEX { - code: 27; - message: 'Invalid transaction index in a block'; - } - - export interface CLASS_HASH_NOT_FOUND { - code: 28; - message: 'Class hash not found'; - } - - export interface PAGE_SIZE_TOO_BIG { - code: 31; - message: 'Requested page size is too big'; - } - - export interface NO_BLOCKS { - code: 32; - message: 'There are no blocks'; - } - - export interface INVALID_CONTINUATION_TOKEN { - code: 33; - message: 'The supplied continuation token is invalid or unknown'; - } - - export interface CONTRACT_ERROR { - code: 40; - message: 'Contract error'; - } - - export interface INVALID_CONTRACT_CLASS { - code: 50; - message: 'Invalid contract class'; - } - - export interface NO_TRACE_AVAILABLE { - code: 10; - message: 'No trace available for transaction'; - data: { - status: 'RECEIVED' | 'REJECTED'; - }; - } - - export interface INVALID_BLOCK_HASH { - code: 24; - message: 'Invalid block hash'; - } - - export interface TXN_HASH_NOT_FOUND { - code: 25; - message: 'Transaction hash not found'; - } -} diff --git a/src/types/api/rpc.ts b/src/types/api/rpc.ts index 3e9929e71..9f7a28696 100644 --- a/src/types/api/rpc.ts +++ b/src/types/api/rpc.ts @@ -1,4 +1,4 @@ -import { ADDRESS, FELT, OPENRPC } from './openrpcv2'; +import { ADDRESS, FELT, OPENRPC } from './openrpc'; export namespace RPC { export type Response = {