@subql/node-starknet 6.1.0 → 6.1.1-0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/.tsbuildinfo +1 -1
- package/dist/blockchain.service.js.map +1 -1
- package/dist/indexer/types.js +1 -1
- package/dist/indexer/types.js.map +1 -1
- package/dist/starknet/api.starknet.d.ts +3 -3
- package/dist/starknet/api.starknet.js +3 -4
- package/dist/starknet/api.starknet.js.map +1 -1
- package/dist/starknet/decodeCalldata.d.ts +1 -1
- package/dist/starknet/decodeCalldata.js.map +1 -1
- package/dist/starknet/finalized.block.starknet.d.ts +1 -1
- package/dist/starknet/finalized.block.starknet.js.map +1 -1
- package/dist/starknet/safe-api.d.ts +3 -2
- package/dist/starknet/safe-api.js.map +1 -1
- package/dist/starknet/utils.starknet.d.ts +5 -3
- package/dist/starknet/utils.starknet.js +2 -1
- package/dist/starknet/utils.starknet.js.map +1 -1
- package/package.json +6 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blockchain.service.js","sourceRoot":"","sources":["../src/blockchain.service.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject } from '@nestjs/common';\nimport { BLOCK_WITH_TX_HASHES } from '@starknet-io/starknet-types-
|
|
1
|
+
{"version":3,"file":"blockchain.service.js","sourceRoot":"","sources":["../src/blockchain.service.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Inject } from '@nestjs/common';\nimport { BLOCK_WITH_TX_HASHES } from '@starknet-io/starknet-types-09';\nimport {\n isCustomDs,\n isRuntimeDs,\n StarknetRuntimeDataSourceImpl,\n} from '@subql/common-starknet';\nimport {\n DatasourceParams,\n Header,\n IBlock,\n IBlockchainService,\n} from '@subql/node-core';\nimport {\n LightStarknetBlock,\n StarknetBlock,\n StarknetCustomDatasource,\n StarknetHandlerKind,\n SubqlDatasource,\n} from '@subql/types-starknet';\nimport { plainToClass } from 'class-transformer';\nimport { validateSync } from 'class-validator';\nimport { SubqueryProject } from './configure/SubqueryProject';\nimport { BlockContent, getBlockSize } from './indexer/types';\nimport { IIndexerWorker } from './indexer/worker/worker';\nimport { StarknetApiService } from './starknet';\nimport SafeStarknetProvider from './starknet/safe-api';\nimport {\n calcInterval,\n getBlockTimestamp,\n starknetBlockHeaderToHeader,\n} from './starknet/utils.starknet';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../package.json');\n\nconst BLOCK_TIME_VARIANCE = 5000;\n\nconst INTERVAL_PERCENT = 0.9;\n\nexport class BlockchainService\n implements\n IBlockchainService<\n SubqlDatasource,\n StarknetCustomDatasource,\n SubqueryProject,\n SafeStarknetProvider,\n LightStarknetBlock,\n StarknetBlock,\n IIndexerWorker\n >\n{\n blockHandlerKind = StarknetHandlerKind.Block;\n isCustomDs = isCustomDs;\n isRuntimeDs = isRuntimeDs;\n packageVersion = packageVersion;\n\n constructor(@Inject('APIService') private apiService: StarknetApiService) {}\n\n async fetchBlocks(\n blockNums: number[],\n ): Promise<IBlock<LightStarknetBlock>[] | IBlock<StarknetBlock>[]> {\n return this.apiService.fetchBlocks(blockNums);\n }\n\n async fetchBlockWorker(\n worker: IIndexerWorker,\n blockNum: number,\n context: { workers: IIndexerWorker[] },\n ): Promise<Header> {\n return worker.fetchBlock(blockNum, 0);\n }\n\n getBlockSize(block: IBlock<BlockContent>): number {\n return getBlockSize(block.block);\n }\n\n async getFinalizedHeader(): Promise<Header> {\n const blockHeader = await this.apiService.api.getFinalizedBlock();\n return starknetBlockHeaderToHeader(blockHeader);\n }\n\n async getBestHeight(): Promise<number> {\n return this.apiService.api.getBestBlockHeight();\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getChainInterval(): Promise<number> {\n const CHAIN_INTERVAL = calcInterval(this.apiService.api) * INTERVAL_PERCENT;\n\n return Math.min(BLOCK_TIME_VARIANCE, CHAIN_INTERVAL);\n }\n\n async getHeaderForHash(hash: string): Promise<Header> {\n const block = await this.apiService.api.fetchLightBlock(hash);\n return block.getHeader();\n }\n\n async getHeaderForHeight(height: number): Promise<Header> {\n const block = await this.apiService.api.fetchLightBlock(height);\n return block.getHeader();\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async updateDynamicDs(\n params: DatasourceParams,\n dsObj: SubqlDatasource | StarknetCustomDatasource,\n ): Promise<void> {\n if (isCustomDs(dsObj)) {\n dsObj.processor.options = {\n ...dsObj.processor.options,\n ...params.args,\n };\n // await this.dsProcessorService.validateCustomDs([dsObj]);\n } else if (isRuntimeDs(dsObj)) {\n dsObj.options = {\n ...dsObj.options,\n ...params.args,\n };\n\n const parsedDs = plainToClass(StarknetRuntimeDataSourceImpl, dsObj);\n\n const errors = validateSync(parsedDs, {\n whitelist: true,\n forbidNonWhitelisted: false,\n });\n if (errors.length) {\n throw new Error(\n `Dynamic ds is invalid\\n${errors\n .map((e) => e.toString())\n .join('\\n')}`,\n );\n }\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async getSafeApi(block: BlockContent): Promise<SafeStarknetProvider> {\n return this.apiService.safeApi(block.blockNumber);\n }\n\n onProjectChange(project: SubqueryProject): Promise<void> | void {\n this.apiService.updateBlockFetching();\n }\n\n async getBlockTimestamp(height: number): Promise<Date> {\n const block = (await this.apiService.unsafeApi.api.getBlock(\n height,\n )) as BLOCK_WITH_TX_HASHES;\n\n return getBlockTimestamp(block);\n }\n}\n"]}
|
package/dist/indexer/types.js
CHANGED
|
@@ -7,7 +7,7 @@ const block_starknet_1 = require("../starknet/block.starknet");
|
|
|
7
7
|
function getBlockSize(block) {
|
|
8
8
|
return (0, block_starknet_1.isFullBlock)(block)
|
|
9
9
|
? block.transactions
|
|
10
|
-
.map((
|
|
10
|
+
.map(({ receipt: { execution_resources } }) => execution_resources.l1_data_gas + execution_resources.l1_gas)
|
|
11
11
|
.reduce((sum, steps) => (sum ?? 0) + (steps ?? 0), 0) ?? 0
|
|
12
12
|
: block.transactions.length;
|
|
13
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAOnC,
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/indexer/types.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAOnC,oCASC;AAbD,+DAAyD;AAIzD,SAAgB,YAAY,CAAC,KAAmB;IAC9C,OAAO,IAAA,4BAAW,EAAC,KAAK,CAAC;QACvB,CAAC,CAAC,KAAK,CAAC,YAAY;aACf,GAAG,CACF,CAAC,EAAE,OAAO,EAAE,EAAE,mBAAmB,EAAE,EAAE,EAAE,EAAE,CACvC,mBAAmB,CAAC,WAAW,GAAG,mBAAmB,CAAC,MAAM,CAC/D;aACA,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;QAC9D,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC;AAChC,CAAC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { StarknetBlock, LightStarknetBlock } from '@subql/types-starknet';\nimport { isFullBlock } from '../starknet/block.starknet';\n\nexport type BlockContent = StarknetBlock | LightStarknetBlock;\n\nexport function getBlockSize(block: BlockContent): number {\n return isFullBlock(block)\n ? block.transactions\n .map(\n ({ receipt: { execution_resources } }) =>\n execution_resources.l1_data_gas + execution_resources.l1_gas,\n )\n .reduce((sum, steps) => (sum ?? 0) + (steps ?? 0), 0) ?? 0\n : block.transactions.length;\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
2
|
-
import * as SPEC from '@starknet-io/starknet-types-
|
|
2
|
+
import * as SPEC from '@starknet-io/starknet-types-09';
|
|
3
3
|
import { IBlock } from '@subql/node-core';
|
|
4
4
|
import { ApiWrapper, StarknetBlock, StarknetRuntimeDatasource, IStarknetEndpointConfig, LightStarknetBlock, StarknetResult, StarknetTransaction, StarknetLog, StarknetContractCall } from '@subql/types-starknet';
|
|
5
|
-
import { RpcProvider, Abi, BlockIdentifier } from 'starknet';
|
|
5
|
+
import { RpcProvider, Abi, BlockIdentifier, CallResult } from 'starknet';
|
|
6
6
|
import { HEADER_WITH_STATUS } from './finalized.block.starknet';
|
|
7
7
|
import SafeStarknetProvider from './safe-api';
|
|
8
8
|
export declare class StarknetApi implements ApiWrapper {
|
|
@@ -45,7 +45,7 @@ export declare class StarknetApi implements ApiWrapper {
|
|
|
45
45
|
parseLog<T extends StarknetResult = StarknetResult>(log: StarknetLog, ds: StarknetRuntimeDatasource): Promise<StarknetLog | StarknetLog<T>>;
|
|
46
46
|
parseTransaction<T extends StarknetResult = StarknetResult>(transaction: StarknetTransaction, ds: StarknetRuntimeDatasource): Promise<StarknetTransaction>;
|
|
47
47
|
private handleDecodedCallsArgs;
|
|
48
|
-
static DecodeCallDataWithAbi(iAbi: Abi, call: StarknetContractCall):
|
|
48
|
+
static DecodeCallDataWithAbi(iAbi: Abi, call: StarknetContractCall): Record<string, CallResult>;
|
|
49
49
|
connect(): Promise<void>;
|
|
50
50
|
disconnect(): Promise<void>;
|
|
51
51
|
handleError(e: Error): Error;
|
|
@@ -215,7 +215,8 @@ class StarknetApi {
|
|
|
215
215
|
const abiEvents = starknet_1.events.getAbiEvents(iAbi);
|
|
216
216
|
const abiStructs = starknet_1.CallData.getAbiStruct(iAbi);
|
|
217
217
|
const abiEnums = starknet_1.CallData.getAbiEnum(iAbi);
|
|
218
|
-
const
|
|
218
|
+
const abiParser = (0, starknet_1.createAbiParser)(iAbi);
|
|
219
|
+
const [parsed] = starknet_1.events.parseEvents([emittedEvent], abiEvents, abiStructs, abiEnums, abiParser);
|
|
219
220
|
log.args = parsed;
|
|
220
221
|
return log;
|
|
221
222
|
}
|
|
@@ -277,9 +278,7 @@ class StarknetApi {
|
|
|
277
278
|
const { inputs } = callData.parser
|
|
278
279
|
.getLegacyFormat()
|
|
279
280
|
.find((abiItem) => (0, utils_starknet_1.encodeSelectorToHex)(abiItem.name) === call.selector);
|
|
280
|
-
const inputsTypes = inputs.map((inp) =>
|
|
281
|
-
return inp.type;
|
|
282
|
-
});
|
|
281
|
+
const inputsTypes = inputs.map((inp) => inp.type);
|
|
283
282
|
const res = callData.decodeParameters(inputsTypes, call.calldata);
|
|
284
283
|
const result = inputs.reduce((acc, item, index) => {
|
|
285
284
|
acc[item.name] = res[index];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.starknet.js","sourceRoot":"","sources":["../../src/starknet/api.starknet.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport assert from 'assert';\nimport fs from 'fs';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport { BlockWithTxs } from '@starknet-io/starknet-types-07';\nimport * as SPEC from '@starknet-io/starknet-types-08';\nimport { getLogger, IBlock } from '@subql/node-core';\nimport {\n ApiWrapper,\n StarknetBlock,\n StarknetRuntimeDatasource,\n IStarknetEndpointConfig,\n LightStarknetBlock,\n StarknetResult,\n StarknetTransaction,\n StarknetLog,\n StarknetContractCall,\n} from '@subql/types-starknet';\nimport {\n ProviderInterface,\n RpcProvider,\n RpcProviderOptions,\n events,\n CallData,\n Abi,\n AbiEntry,\n FunctionAbi,\n BlockIdentifier,\n} from 'starknet';\nimport {\n FinalizedBlockService,\n HEADER_WITH_STATUS,\n} from './finalized.block.starknet';\nimport SafeStarknetProvider from './safe-api';\nimport {\n hexEq,\n encodeSelectorToHex,\n fetchAbiFromContractAddress,\n formatBlock,\n formatBlockUtil,\n formatLog,\n formatTransaction,\n reverseToRawLog,\n isFinalizedBlock,\n} from './utils.starknet';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../../package.json');\n\nconst logger = getLogger('api.starknet');\n\nasync function loadAssets(\n ds: StarknetRuntimeDatasource,\n): Promise<Record<string, string>> {\n if (!ds.assets) {\n return {};\n }\n const res: Record<string, string> = {};\n\n for (const [name, { file }] of ds.assets.entries()) {\n try {\n res[name] = await fs.promises.readFile(file, { encoding: 'utf8' });\n } catch (e) {\n throw new Error(`Failed to load datasource asset ${file}`);\n }\n }\n\n return res;\n}\n\nexport class StarknetApi implements ApiWrapper {\n private client: RpcProvider;\n\n // This is used within the sandbox when HTTP is used\n private nonBatchClient?: SafeStarknetProvider;\n private _genesisBlock?: Record<string, any>;\n private contractInterfaces: Record<string, Abi> = {};\n private chainId?: string;\n private specVersion?: string;\n private finalizedBlockService: FinalizedBlockService;\n\n // Starknet POS\n private _supportsFinalization = true;\n\n get supportsFinalization(): boolean {\n return this._supportsFinalization;\n }\n\n /**\n * @param {string} endpoint - The endpoint of the RPC provider\n * @param {object} eventEmitter - Used to monitor the number of RPC requests\n */\n constructor(\n private endpoint: string,\n private eventEmitter: EventEmitter2,\n private config?: IStarknetEndpointConfig,\n ) {\n const { hostname, protocol } = new URL(endpoint);\n\n const protocolStr = protocol.replace(':', '');\n\n logger.info(`Api host: ${hostname}, method: ${protocolStr}`);\n\n if (protocolStr !== 'https' && protocolStr !== 'http') {\n throw new Error(`Unsupported protocol: ${protocol}`);\n }\n const connection: RpcProviderOptions | ProviderInterface = {\n nodeUrl: this.endpoint,\n headers: {\n 'User-Agent': `Subquery-Node ${packageVersion}`,\n ...config?.headers,\n },\n batch: this.config?.batchSize ?? false,\n };\n this.client = new RpcProvider(connection);\n this.finalizedBlockService = new FinalizedBlockService(\n this.getBlockByHeightOrHash.bind(this),\n logger,\n );\n }\n\n private get genesisBlock(): Record<string, any> {\n if (!this._genesisBlock) {\n throw new Error('Genesis block is not available');\n }\n return this._genesisBlock;\n }\n\n async init(): Promise<void> {\n try {\n this._genesisBlock = await this.getGenesisBlock();\n this.chainId = await this.client.getChainId();\n this.specVersion = await this.client.getSpecVersion();\n } catch (e) {\n if ((e as Error).message.startsWith('Invalid response')) {\n if (!this.nonBatchClient) {\n throw new Error('No suitable client found');\n }\n\n logger.warn(\n `The RPC Node at ${this.endpoint} cannot process batch requests. ` +\n `Switching to non-batch mode for subsequent requests. Please consider checking if batch processing is supported on the RPC node.`,\n );\n\n return this.init();\n }\n\n throw e;\n }\n }\n\n private async getGenesisBlock(): Promise<BlockWithTxs> {\n const block = await this.client.getBlockWithTxs(1);\n if (block === null) {\n throw new Error(`Getting genesis block returned null from block 1`);\n }\n return block;\n }\n\n /***\n * Get the latest block (with its header)\n * @returns {Promise<BLOCK_HEADER>}\n */\n async getFinalizedBlock(): Promise<HEADER_WITH_STATUS> {\n const block = await this.finalizedBlockService.getFinalizedBlock();\n return block;\n }\n\n async getBestBlockHeight(): Promise<number> {\n return (await this.client.getBlockLatestAccepted()).block_number;\n }\n\n getChainId(): string {\n assert(this.chainId, 'Api has not been initialised');\n return this.chainId;\n }\n\n getGenesisHash(): string {\n return this.genesisBlock.block_hash;\n }\n\n getSpecVersion(): string {\n assert(this.specVersion, 'Api has not been initialised');\n return this.specVersion;\n }\n\n async getBlockByHeightOrHash(\n heightOrHash: number | string,\n ): Promise<SPEC.BLOCK_WITH_RECEIPTS> {\n const block = await this.client.getBlockWithReceipts(heightOrHash);\n if (!isFinalizedBlock(block)) {\n throw `Block ${block} is not a fulfilled block, its parent is ${block.parent_hash}`;\n }\n return block;\n }\n\n async fetchBlock(blockNumber: number): Promise<IBlock<StarknetBlock>> {\n try {\n const rawBlock = await this.getBlockByHeightOrHash(blockNumber);\n const formattedBlock = formatBlock(rawBlock);\n\n const formattedTransactions = rawBlock.transactions.map((tx, index) => {\n const formattedTransaction = formatTransaction(\n tx,\n formattedBlock,\n index,\n );\n return {\n ...formattedTransaction,\n logs: tx.receipt.events.map((l, logIndex) =>\n formatLog(l, logIndex, formattedTransaction, formattedBlock),\n ),\n };\n });\n\n const logs: StarknetLog[] = formattedTransactions.flatMap((tx) =>\n tx.logs.map((l) => ({\n ...l,\n transaction: tx,\n })),\n );\n\n const block: StarknetBlock = {\n ...formattedBlock,\n transactions: formattedTransactions,\n logs,\n };\n\n this.eventEmitter.emit('fetchBlock');\n return formatBlockUtil(block);\n } catch (e: any) {\n throw this.handleError(e);\n }\n }\n\n async fetchLightBlock(\n blockNumber: BlockIdentifier,\n ): Promise<IBlock<LightStarknetBlock>> {\n // Cast to remove PENDING_BLOCK_WITH_TX_HASHES type\n const block = (await this.client.getBlockWithTxHashes(\n blockNumber,\n )) as SPEC.BLOCK_WITH_TX_HASHES;\n const lightBlock: LightStarknetBlock = {\n ...block,\n blockHash: block.block_hash,\n blockNumber: block.block_number,\n parentHash: block.parent_hash,\n newRoot: block.new_root,\n sequencerAddress: block.sequencer_address,\n l1GasPrice: block.l1_gas_price,\n starknetVersion: block.starknet_version,\n logs: [],\n };\n return formatBlockUtil<LightStarknetBlock>(lightBlock);\n }\n\n async fetchBlocks(bufferBlocks: number[]): Promise<IBlock<StarknetBlock>[]> {\n return Promise.all(bufferBlocks.map(async (num) => this.fetchBlock(num)));\n }\n\n async fetchBlocksLight(\n bufferBlocks: number[],\n ): Promise<IBlock<LightStarknetBlock>[]> {\n return Promise.all(\n bufferBlocks.map(async (num) => this.fetchLightBlock(num)),\n );\n }\n\n get api(): RpcProvider {\n return this.client;\n }\n\n private buildInterface(abiName: string, assets: Record<string, string>): Abi {\n if (!assets[abiName]) {\n throw new Error(`ABI named \"${abiName}\" not referenced in assets`);\n }\n\n // This assumes that all datasources have a different abi name or they are the same abi\n if (!this.contractInterfaces[abiName]) {\n // Constructing the interface validates the ABI\n try {\n const abiObj = JSON.parse(assets[abiName]);\n\n this.contractInterfaces[abiName] = abiObj;\n } catch (e: any) {\n logger.error(`Unable to parse ABI: ${e.message}`);\n throw new Error('ABI is invalid');\n }\n }\n\n return this.contractInterfaces[abiName];\n }\n\n async parseLog<T extends StarknetResult = StarknetResult>(\n log: StarknetLog,\n ds: StarknetRuntimeDatasource,\n ): Promise<StarknetLog | StarknetLog<T>> {\n try {\n if (!ds?.options?.abi) {\n logger.warn('No ABI provided for datasource');\n return log;\n }\n const emittedEvent = reverseToRawLog(log);\n const assets = await loadAssets(ds);\n const iAbi = this.buildInterface(ds.options.abi, assets);\n const abiEvents = events.getAbiEvents(iAbi);\n const abiStructs = CallData.getAbiStruct(iAbi);\n const abiEnums = CallData.getAbiEnum(iAbi);\n const [parsed] = events.parseEvents(\n [emittedEvent],\n abiEvents,\n abiStructs,\n abiEnums,\n );\n log.args = parsed as T;\n return log;\n } catch (e: any) {\n logger.warn(`Failed to parse log data: ${e.message}`);\n return log;\n }\n }\n\n async parseTransaction<T extends StarknetResult = StarknetResult>(\n transaction: StarknetTransaction,\n ds: StarknetRuntimeDatasource,\n ): Promise<StarknetTransaction> {\n try {\n const assets = await loadAssets(ds);\n // If decoded calls not exist, try to parse first\n if (!transaction.decodedCalls) {\n transaction.decodedCalls = transaction.parseCallData();\n }\n if (transaction.decodedCalls && transaction.decodedCalls.length > 0) {\n await this.handleDecodedCallsArgs(transaction.decodedCalls, ds, assets);\n } else {\n logger.warn(\n `No decoded calls found in transaction, will skip decode call data for this transaction ${transaction.hash}`,\n );\n }\n transaction.logs =\n transaction.logs &&\n ((await Promise.all(\n transaction.logs.map(async (log) => this.parseLog(log, ds)),\n )) as Array<StarknetLog | StarknetLog<T>>);\n\n return transaction;\n } catch (e: any) {\n logger.warn(`Failed to parse transaction data: ${e.message}`);\n return transaction;\n }\n }\n\n private async handleDecodedCallsArgs(\n decodedCalls: StarknetContractCall[],\n ds: StarknetRuntimeDatasource,\n assets: Record<string, string>,\n ): Promise<void> {\n await Promise.all(\n decodedCalls.map(async (call) => {\n let iAbi: Abi;\n try {\n if (\n ds.options?.address &&\n hexEq(ds.options.address, call.to) &&\n ds.options.abi\n ) {\n iAbi = this.buildInterface(ds.options.abi, assets);\n } else {\n //We could register this abi in memory improve performance, maybe just record with address instead of abi name here\n if (!this.contractInterfaces[call.to]) {\n iAbi = await fetchAbiFromContractAddress(this.client, call.to);\n } else {\n iAbi = this.contractInterfaces[call.to];\n }\n }\n call.decodedArgs = StarknetApi.DecodeCallDataWithAbi(iAbi, call);\n } catch (e: any) {\n logger.warn(\n `Could not decode call data with contract address ${call.to}: ${e.message}`,\n );\n }\n }),\n );\n }\n\n static DecodeCallDataWithAbi(iAbi: Abi, call: StarknetContractCall): any {\n const callData = new CallData(iAbi);\n const { inputs } = callData.parser\n .getLegacyFormat()\n .find(\n (abiItem: AbiEntry) =>\n encodeSelectorToHex(abiItem.name) === call.selector,\n ) as FunctionAbi;\n const inputsTypes = inputs.map((inp: any) => {\n return inp.type as string;\n });\n const res = callData.decodeParameters(inputsTypes, call.calldata);\n const result = inputs.reduce((acc, item, index) => {\n acc[item.name] = res[index];\n return acc;\n }, {});\n return result;\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async connect(): Promise<void> {\n logger.error('Starknet API connect is not implemented');\n throw new Error('Not implemented');\n }\n\n //TODO\n async disconnect(): Promise<void> {\n return Promise.resolve();\n }\n\n handleError(e: Error): Error {\n if ((e as any)?.status === 429) {\n const { hostname } = new URL(this.endpoint);\n return new Error(`Rate Limited at endpoint: ${hostname}`);\n }\n\n return e;\n }\n\n getSafeApi(height: number): SafeStarknetProvider {\n return new SafeStarknetProvider(this.client, height);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"api.starknet.js","sourceRoot":"","sources":["../../src/starknet/api.starknet.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport assert from 'assert';\nimport fs from 'fs';\nimport { EventEmitter2 } from '@nestjs/event-emitter';\nimport * as RPCSPEC08 from '@starknet-io/starknet-types-08';\nimport * as SPEC from '@starknet-io/starknet-types-09';\nimport { getLogger, IBlock } from '@subql/node-core';\nimport {\n ApiWrapper,\n StarknetBlock,\n StarknetRuntimeDatasource,\n IStarknetEndpointConfig,\n LightStarknetBlock,\n StarknetResult,\n StarknetTransaction,\n StarknetLog,\n StarknetContractCall,\n} from '@subql/types-starknet';\nimport {\n ProviderInterface,\n RpcProvider,\n RpcProviderOptions,\n events,\n CallData,\n Abi,\n AbiEntry,\n FunctionAbi,\n BlockIdentifier,\n CallResult,\n createAbiParser,\n} from 'starknet';\nimport {\n FinalizedBlockService,\n HEADER_WITH_STATUS,\n} from './finalized.block.starknet';\nimport SafeStarknetProvider from './safe-api';\nimport {\n hexEq,\n encodeSelectorToHex,\n fetchAbiFromContractAddress,\n formatBlock,\n formatBlockUtil,\n formatLog,\n formatTransaction,\n reverseToRawLog,\n isFinalizedBlock,\n} from './utils.starknet';\n\n// eslint-disable-next-line @typescript-eslint/no-var-requires\nconst { version: packageVersion } = require('../../package.json');\n\nconst logger = getLogger('api.starknet');\n\nasync function loadAssets(\n ds: StarknetRuntimeDatasource,\n): Promise<Record<string, string>> {\n if (!ds.assets) {\n return {};\n }\n const res: Record<string, string> = {};\n\n for (const [name, { file }] of ds.assets.entries()) {\n try {\n res[name] = await fs.promises.readFile(file, { encoding: 'utf8' });\n } catch (e) {\n throw new Error(`Failed to load datasource asset ${file}`);\n }\n }\n\n return res;\n}\n\nexport class StarknetApi implements ApiWrapper {\n private client: RpcProvider;\n\n // This is used within the sandbox when HTTP is used\n private nonBatchClient?: SafeStarknetProvider;\n private _genesisBlock?: Record<string, any>;\n private contractInterfaces: Record<string, Abi> = {};\n private chainId?: string;\n private specVersion?: string;\n private finalizedBlockService: FinalizedBlockService;\n\n // Starknet POS\n private _supportsFinalization = true;\n\n get supportsFinalization(): boolean {\n return this._supportsFinalization;\n }\n\n /**\n * @param {string} endpoint - The endpoint of the RPC provider\n * @param {object} eventEmitter - Used to monitor the number of RPC requests\n */\n constructor(\n private endpoint: string,\n private eventEmitter: EventEmitter2,\n private config?: IStarknetEndpointConfig,\n ) {\n const { hostname, protocol } = new URL(endpoint);\n\n const protocolStr = protocol.replace(':', '');\n\n logger.info(`Api host: ${hostname}, method: ${protocolStr}`);\n\n if (protocolStr !== 'https' && protocolStr !== 'http') {\n throw new Error(`Unsupported protocol: ${protocol}`);\n }\n const connection: RpcProviderOptions | ProviderInterface = {\n nodeUrl: this.endpoint,\n headers: {\n 'User-Agent': `Subquery-Node ${packageVersion}`,\n ...config?.headers,\n },\n batch: this.config?.batchSize ?? false,\n };\n this.client = new RpcProvider(connection);\n this.finalizedBlockService = new FinalizedBlockService(\n this.getBlockByHeightOrHash.bind(this),\n logger,\n );\n }\n\n private get genesisBlock(): Record<string, any> {\n if (!this._genesisBlock) {\n throw new Error('Genesis block is not available');\n }\n return this._genesisBlock;\n }\n\n async init(): Promise<void> {\n try {\n this._genesisBlock = await this.getGenesisBlock();\n this.chainId = await this.client.getChainId();\n this.specVersion = await this.client.getSpecVersion();\n } catch (e) {\n if ((e as Error).message.startsWith('Invalid response')) {\n if (!this.nonBatchClient) {\n throw new Error('No suitable client found');\n }\n\n logger.warn(\n `The RPC Node at ${this.endpoint} cannot process batch requests. ` +\n `Switching to non-batch mode for subsequent requests. Please consider checking if batch processing is supported on the RPC node.`,\n );\n\n return this.init();\n }\n\n throw e;\n }\n }\n\n private async getGenesisBlock(): Promise<\n SPEC.BlockWithTxs | RPCSPEC08.BlockWithTxs\n > {\n const block = await this.client.getBlockWithTxs(1);\n if (block === null) {\n throw new Error(`Getting genesis block returned null from block 1`);\n }\n return block;\n }\n\n /***\n * Get the latest block (with its header)\n * @returns {Promise<BLOCK_HEADER>}\n */\n async getFinalizedBlock(): Promise<HEADER_WITH_STATUS> {\n const block = await this.finalizedBlockService.getFinalizedBlock();\n return block;\n }\n\n async getBestBlockHeight(): Promise<number> {\n return (await this.client.getBlockLatestAccepted()).block_number;\n }\n\n getChainId(): string {\n assert(this.chainId, 'Api has not been initialised');\n return this.chainId;\n }\n\n getGenesisHash(): string {\n return this.genesisBlock.block_hash;\n }\n\n getSpecVersion(): string {\n assert(this.specVersion, 'Api has not been initialised');\n return this.specVersion;\n }\n\n async getBlockByHeightOrHash(\n heightOrHash: number | string,\n ): Promise<SPEC.BLOCK_WITH_RECEIPTS> {\n const block = await this.client.getBlockWithReceipts(heightOrHash);\n if (!isFinalizedBlock(block)) {\n throw `Block ${block} is not a fulfilled block, its parent is ${block.parent_hash}`;\n }\n return block;\n }\n\n async fetchBlock(blockNumber: number): Promise<IBlock<StarknetBlock>> {\n try {\n const rawBlock = await this.getBlockByHeightOrHash(blockNumber);\n const formattedBlock = formatBlock(rawBlock);\n\n const formattedTransactions = rawBlock.transactions.map((tx, index) => {\n const formattedTransaction = formatTransaction(\n tx,\n formattedBlock,\n index,\n );\n return {\n ...formattedTransaction,\n logs: tx.receipt.events.map((l, logIndex) =>\n formatLog(l, logIndex, formattedTransaction, formattedBlock),\n ),\n };\n });\n\n const logs: StarknetLog[] = formattedTransactions.flatMap((tx) =>\n tx.logs.map((l) => ({\n ...l,\n transaction: tx,\n })),\n );\n\n const block: StarknetBlock = {\n ...formattedBlock,\n transactions: formattedTransactions,\n logs,\n };\n\n this.eventEmitter.emit('fetchBlock');\n return formatBlockUtil(block);\n } catch (e: any) {\n throw this.handleError(e);\n }\n }\n\n async fetchLightBlock(\n blockNumber: BlockIdentifier,\n ): Promise<IBlock<LightStarknetBlock>> {\n // Cast to remove PENDING_BLOCK_WITH_TX_HASHES type\n const block = (await this.client.getBlockWithTxHashes(\n blockNumber,\n )) as SPEC.BLOCK_WITH_TX_HASHES;\n const lightBlock: LightStarknetBlock = {\n ...block,\n blockHash: block.block_hash,\n blockNumber: block.block_number,\n parentHash: block.parent_hash,\n newRoot: block.new_root,\n sequencerAddress: block.sequencer_address,\n l1GasPrice: block.l1_gas_price,\n starknetVersion: block.starknet_version,\n logs: [],\n };\n return formatBlockUtil<LightStarknetBlock>(lightBlock);\n }\n\n async fetchBlocks(bufferBlocks: number[]): Promise<IBlock<StarknetBlock>[]> {\n return Promise.all(bufferBlocks.map(async (num) => this.fetchBlock(num)));\n }\n\n async fetchBlocksLight(\n bufferBlocks: number[],\n ): Promise<IBlock<LightStarknetBlock>[]> {\n return Promise.all(\n bufferBlocks.map(async (num) => this.fetchLightBlock(num)),\n );\n }\n\n get api(): RpcProvider {\n return this.client;\n }\n\n private buildInterface(abiName: string, assets: Record<string, string>): Abi {\n if (!assets[abiName]) {\n throw new Error(`ABI named \"${abiName}\" not referenced in assets`);\n }\n\n // This assumes that all datasources have a different abi name or they are the same abi\n if (!this.contractInterfaces[abiName]) {\n // Constructing the interface validates the ABI\n try {\n const abiObj = JSON.parse(assets[abiName]);\n\n this.contractInterfaces[abiName] = abiObj;\n } catch (e: any) {\n logger.error(`Unable to parse ABI: ${e.message}`);\n throw new Error('ABI is invalid');\n }\n }\n\n return this.contractInterfaces[abiName];\n }\n\n async parseLog<T extends StarknetResult = StarknetResult>(\n log: StarknetLog,\n ds: StarknetRuntimeDatasource,\n ): Promise<StarknetLog | StarknetLog<T>> {\n try {\n if (!ds?.options?.abi) {\n logger.warn('No ABI provided for datasource');\n return log;\n }\n const emittedEvent = reverseToRawLog(log);\n const assets = await loadAssets(ds);\n const iAbi = this.buildInterface(ds.options.abi, assets);\n const abiEvents = events.getAbiEvents(iAbi);\n const abiStructs = CallData.getAbiStruct(iAbi);\n const abiEnums = CallData.getAbiEnum(iAbi);\n const abiParser = createAbiParser(iAbi);\n const [parsed] = events.parseEvents(\n [emittedEvent],\n abiEvents,\n abiStructs,\n abiEnums,\n abiParser,\n );\n log.args = parsed as T;\n return log;\n } catch (e: any) {\n logger.warn(`Failed to parse log data: ${e.message}`);\n return log;\n }\n }\n\n async parseTransaction<T extends StarknetResult = StarknetResult>(\n transaction: StarknetTransaction,\n ds: StarknetRuntimeDatasource,\n ): Promise<StarknetTransaction> {\n try {\n const assets = await loadAssets(ds);\n // If decoded calls not exist, try to parse first\n if (!transaction.decodedCalls) {\n transaction.decodedCalls = transaction.parseCallData();\n }\n if (transaction.decodedCalls && transaction.decodedCalls.length > 0) {\n await this.handleDecodedCallsArgs(transaction.decodedCalls, ds, assets);\n } else {\n logger.warn(\n `No decoded calls found in transaction, will skip decode call data for this transaction ${transaction.hash}`,\n );\n }\n transaction.logs =\n transaction.logs &&\n ((await Promise.all(\n transaction.logs.map(async (log) => this.parseLog(log, ds)),\n )) as Array<StarknetLog | StarknetLog<T>>);\n\n return transaction;\n } catch (e: any) {\n logger.warn(`Failed to parse transaction data: ${e.message}`);\n return transaction;\n }\n }\n\n private async handleDecodedCallsArgs(\n decodedCalls: StarknetContractCall[],\n ds: StarknetRuntimeDatasource,\n assets: Record<string, string>,\n ): Promise<void> {\n await Promise.all(\n decodedCalls.map(async (call) => {\n let iAbi: Abi;\n try {\n if (\n ds.options?.address &&\n hexEq(ds.options.address, call.to) &&\n ds.options.abi\n ) {\n iAbi = this.buildInterface(ds.options.abi, assets);\n } else {\n //We could register this abi in memory improve performance, maybe just record with address instead of abi name here\n if (!this.contractInterfaces[call.to]) {\n iAbi = await fetchAbiFromContractAddress(this.client, call.to);\n } else {\n iAbi = this.contractInterfaces[call.to];\n }\n }\n call.decodedArgs = StarknetApi.DecodeCallDataWithAbi(iAbi, call);\n } catch (e: any) {\n logger.warn(\n `Could not decode call data with contract address ${call.to}: ${e.message}`,\n );\n }\n }),\n );\n }\n\n static DecodeCallDataWithAbi(\n iAbi: Abi,\n call: StarknetContractCall,\n ): Record<string, CallResult> {\n const callData = new CallData(iAbi);\n const { inputs } = callData.parser\n .getLegacyFormat()\n .find(\n (abiItem: AbiEntry) =>\n encodeSelectorToHex(abiItem.name) === call.selector,\n ) as FunctionAbi;\n const inputsTypes = inputs.map((inp) => inp.type);\n const res = callData.decodeParameters(inputsTypes, call.calldata);\n const result = inputs.reduce((acc, item, index) => {\n acc[item.name] = res[index];\n return acc;\n }, {});\n return result;\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async connect(): Promise<void> {\n logger.error('Starknet API connect is not implemented');\n throw new Error('Not implemented');\n }\n\n //TODO\n async disconnect(): Promise<void> {\n return Promise.resolve();\n }\n\n handleError(e: Error): Error {\n if ((e as any)?.status === 429) {\n const { hostname } = new URL(this.endpoint);\n return new Error(`Rate Limited at endpoint: ${hostname}`);\n }\n\n return e;\n }\n\n getSafeApi(height: number): SafeStarknetProvider {\n return new SafeStarknetProvider(this.client, height);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decodeCalldata.js","sourceRoot":"","sources":["../../src/starknet/decodeCalldata.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Felt } from '@starknet-io/starknet-types-
|
|
1
|
+
{"version":3,"file":"decodeCalldata.js","sourceRoot":"","sources":["../../src/starknet/decodeCalldata.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport { Felt } from '@starknet-io/starknet-types-09';\nimport { StarknetContractCall } from '@subql/types-starknet';\n\nexport class DecodeCalldataError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'Decode Calldata Error';\n }\n}\n\n/***\n * Decode the calldata for a generic contract call, like INVOKE V0 type or L1 contract call\n * @param contractAddress\n * @param selector\n * @param calldata\n */\nexport function decodeGenericCalldata(\n contractAddress: Felt,\n selector: Felt,\n calldata: Felt[],\n): StarknetContractCall {\n return {\n to: contractAddress,\n selector: selector,\n calldata: calldata,\n };\n}\n\n/***\n * Decode the INVOKE v2 & v3 calldata in contract call\n * This been rewritten from rust version https://github.com/9oelM/decode-starknet-calldata/blob/main/src/lib.rs\n *\n * @param calldata\n */\nexport function decodeInvokeCalldata(calldata: Felt[]): StarknetContractCall[] {\n try {\n return decodeLegacy(calldata);\n } catch {\n return decodeNew(calldata);\n }\n}\n\nfunction decodeLegacy(calldata: Felt[]): StarknetContractCall[] {\n const calls: StarknetContractCall[] = [];\n const callsLength = parseBigInt(calldata[0]);\n\n let offset = 1;\n const callBuilders: {\n to: Felt;\n selector: Felt;\n dataOffset: number;\n dataLen: number;\n }[] = [];\n\n for (let i = 0; i < callsLength; i++) {\n const to = calldata[offset];\n const selector = calldata[offset + 1];\n const dataOffset = calldata[offset + 2];\n const dataLen = calldata[offset + 3];\n\n callBuilders.push({\n to,\n selector,\n dataOffset: Number(dataOffset),\n dataLen: Number(dataLen),\n });\n offset += 4;\n }\n\n const calldataLen = parseBigInt(calldata[offset]);\n const expectedCalldataLen = callBuilders.reduce(\n (acc, builder) => acc + builder.dataLen,\n 0,\n );\n if (calldataLen !== BigInt(expectedCalldataLen)) {\n throw new DecodeCalldataError(\n `Unexpected calldata length: expected ${expectedCalldataLen}, got ${calldataLen}`,\n );\n }\n\n offset += 1;\n\n for (const builder of callBuilders) {\n const data = calldata.slice(\n offset + builder.dataOffset,\n offset + builder.dataOffset + builder.dataLen,\n );\n calls.push({ to: builder.to, selector: builder.selector, calldata: data });\n }\n\n return calls;\n}\n\nfunction decodeNew(calldata: Felt[]): StarknetContractCall[] {\n const calls: StarknetContractCall[] = [];\n const callsLength = parseBigInt(calldata[0]);\n\n let offset = 1;\n for (let i = 0; i < callsLength; i++) {\n const to = calldata[offset];\n const selector = calldata[offset + 1];\n const calldataLen = parseBigInt(calldata[offset + 2]);\n const data = calldata.slice(offset + 3, offset + 3 + Number(calldataLen));\n\n if (data.length !== Number(calldataLen)) {\n throw new DecodeCalldataError(\n 'Unexpected calldata length in `decodeNew`',\n );\n }\n\n calls.push({ to, selector, calldata: data });\n offset += 3 + Number(calldataLen);\n }\n\n return calls;\n}\n\nfunction parseBigInt(value: Felt): bigint {\n try {\n return BigInt(value);\n } catch {\n throw new DecodeCalldataError(`Invalid FieldElement: ${value}`);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"finalized.block.starknet.js","sourceRoot":"","sources":["../../src/starknet/finalized.block.starknet.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport * as SPEC from '@starknet-io/starknet-types-
|
|
1
|
+
{"version":3,"file":"finalized.block.starknet.js","sourceRoot":"","sources":["../../src/starknet/finalized.block.starknet.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport * as SPEC from '@starknet-io/starknet-types-09';\nimport { profiler } from '@subql/node-core';\nimport P from 'pino';\n\nconst INIT_BINARY_JUMP = 1000;\n\n// Use a subset type so that BLOCK_WITH_TX_HASHES | BLOCK_WITH_TX | BLOCK_WITH_RECEIPTS could be used\nexport type HEADER_WITH_STATUS = {\n status: SPEC.BLOCK_STATUS;\n} & SPEC.BLOCK_HEADER;\n\n/***\n\n Due to the current limitations of Starknet's RPC methods, there is no direct way to retrieve the latest ACCEPTED_ON_L1 block (which we consider as the finalized block).\n\n To address this, we use a binary search approach to efficiently find the latest finalized block by searching backward. The number of blocks between the best head and the finalized head is typically around 1,671.\n\n Depending on the RPC response time, this implementation can find the finalized block within approximately 15 RPC calls and 4 seconds.\n\n Since block statuses do not change frequently, we implement caching to improve performance and further reduce the number of RPC calls.\n ***/\nexport class FinalizedBlockService {\n private latestAcceptedBlock?: HEADER_WITH_STATUS; // cache latest ACCEPTED_ON_L1\n\n constructor(\n private getBlock: (\n heightOrHash: number | string,\n ) => Promise<HEADER_WITH_STATUS>,\n private logger: P.Logger,\n ) {}\n\n // **Jump from latest to left side, from a block with Accepted on layer 1, as a start point**\n private async findFirstAcceptedOnL1(): Promise<\n HEADER_WITH_STATUS | undefined\n > {\n let currentBlockNumber = -1;\n\n do {\n // Use latest initially (if -1 which is the default value)\n const tag = currentBlockNumber < 0 ? 'latest' : currentBlockNumber;\n const blockInfo = await this.getBlock(tag);\n\n if (blockInfo.status === 'ACCEPTED_ON_L1') {\n return blockInfo;\n }\n\n // If the block height is 1 then there are no finalized blocks. This likely means its a devnet\n if (blockInfo.block_number === 0) {\n this.logger.info('First block is not finalized on L1.');\n return blockInfo;\n }\n\n // Ensure we never go below zero\n currentBlockNumber = Math.max(0, currentBlockNumber - INIT_BINARY_JUMP);\n } while (currentBlockNumber >= 0);\n\n return undefined;\n }\n\n private async binarySearchAcceptedOnL1(\n low: number,\n high: number,\n ): Promise<HEADER_WITH_STATUS> {\n let latestAcceptedBlock: HEADER_WITH_STATUS;\n\n while (low <= high) {\n const mid = Math.floor((low + high) / 2);\n const blockInfo = await this.getBlock(mid);\n if (blockInfo.status === 'ACCEPTED_ON_L1') {\n latestAcceptedBlock = blockInfo;\n low = mid + 1; // Move to higher blocks\n } else {\n high = mid - 1; // Move to lower blocks\n }\n }\n\n return latestAcceptedBlock!;\n }\n\n @profiler()\n async getFinalizedBlock(): Promise<HEADER_WITH_STATUS> {\n this.latestAcceptedBlock ??= await this.findFirstAcceptedOnL1();\n if (!this.latestAcceptedBlock) {\n throw new Error('No ACCEPTED_ON_L1 blocks found.');\n }\n\n const nextBlockNumber = this.latestAcceptedBlock.block_number + 1;\n const nextBlockInfo = await this.getBlock(nextBlockNumber);\n\n // Return cached block if no update is detected\n if (nextBlockInfo.status === 'ACCEPTED_ON_L2') {\n return this.latestAcceptedBlock;\n }\n\n // If next block changed to ACCEPTED_ON_L1, perform binary search\n if (nextBlockInfo.status === 'ACCEPTED_ON_L1') {\n const latestBlockNumber = (await this.getBlock('latest')).block_number;\n this.latestAcceptedBlock = await this.binarySearchAcceptedOnL1(\n nextBlockNumber,\n latestBlockNumber,\n );\n }\n\n this.logger.debug(\n `Finalized Block Found: Block Number: ${this.latestAcceptedBlock.block_number}, Block Hash: ${this.latestAcceptedBlock.block_hash}`,\n );\n\n return this.latestAcceptedBlock;\n }\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as RPCSPEC08 from '@starknet-io/starknet-types-08';
|
|
2
|
+
import * as SPEC from '@starknet-io/starknet-types-09';
|
|
2
3
|
import { BigNumberish, BlockIdentifier, Call, CompiledSierra, GetTransactionReceiptResponse, LegacyContractClass, RpcProvider, waitForTransactionOptions } from 'starknet';
|
|
3
4
|
export default class SafeStarknetProvider extends RpcProvider {
|
|
4
5
|
private baseApi;
|
|
@@ -7,7 +8,7 @@ export default class SafeStarknetProvider extends RpcProvider {
|
|
|
7
8
|
getStorageAt(contractAddress: BigNumberish, key: BigNumberish, blockIdentifier?: BlockIdentifier): Promise<string>;
|
|
8
9
|
getClass(classHash: BigNumberish, blockIdentifier?: BlockIdentifier): Promise<LegacyContractClass | CompiledSierra>;
|
|
9
10
|
getClassAt(contractAddress: BigNumberish, blockIdentifier?: BlockIdentifier): Promise<LegacyContractClass | CompiledSierra>;
|
|
10
|
-
estimateMessageFee(message: SPEC.L1Message, blockIdentifier?: BlockIdentifier): Promise<SPEC.
|
|
11
|
+
estimateMessageFee(message: SPEC.L1Message, blockIdentifier?: BlockIdentifier): Promise<SPEC.MESSAGE_FEE_ESTIMATE | RPCSPEC08.FEE_ESTIMATE>;
|
|
11
12
|
callContract(call: Call, blockIdentifier?: BlockIdentifier): Promise<string[]>;
|
|
12
13
|
getBlockWithTxs(blockHashOrBlockTag: BlockIdentifier): Promise<SPEC.BlockWithTxs>;
|
|
13
14
|
getBlockWithTxHashes(blockHashOrBlockTag: BlockIdentifier): Promise<SPEC.BlockWithTxHashes>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-api.js","sourceRoot":"","sources":["../../src/starknet/safe-api.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;
|
|
1
|
+
{"version":3,"file":"safe-api.js","sourceRoot":"","sources":["../../src/starknet/safe-api.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,mCAAmC;;AAInC,gDAA6C;AAC7C,uCASkB;AAElB,MAAM,MAAM,GAAG,IAAA,qBAAS,EAAC,mBAAmB,CAAC,CAAC;AAE9C,MAAqB,oBAAqB,SAAQ,sBAAW;IACvC;IAA8B;IAAlD,YAAoB,OAAoB,EAAU,WAAmB;QACnE,KAAK,EAAE,CAAC;QADU,YAAO,GAAP,OAAO,CAAa;QAAU,gBAAW,GAAX,WAAW,CAAQ;IAErE,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,eAA6B,EAC7B,GAAiB,EACjB,eAAiC;QAEjC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,eAAe,EAAE,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3E,CAAC;IACD,KAAK,CAAC,QAAQ,CACZ,SAAuB,EACvB,eAAiC;QAEjC,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5D,CAAC;IACD,KAAK,CAAC,UAAU,CACd,eAA6B,EAC7B,eAAiC;QAEjC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,OAAuB,EACvB,eAAiC;QAEjC,aAAa;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,IAAU,EACV,eAAiC;QAEjC,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC3D,CAAC;IAED,qEAAqE;IACrE,eAAe,CACb,mBAAoC;QAEpC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,qEAAqE;IACrE,oBAAoB,CAClB,mBAAoC;QAEpC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,qEAAqE;IACrE,qBAAqB,CACnB,eAAuB;QAEvB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,qEAAqE;IACrE,SAAS,CAAC,MAAM;QACd,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACvD,CAAC;IACD,qEAAqE;IACrE,cAAc;QACZ,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IACD,qEAAqE;IACrE,aAAa;QACX,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,qEAAqE;IACrE,kBAAkB,CAChB,MAAoB,EACpB,OAAmC;QAEnC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;IACD,qEAAqE;IACrE,WAAW,CAAC,IAA8B;QACxC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IACzD,CAAC;IACD,qEAAqE;IACrE,aAAa,CAAC,OAAiC;QAC7C,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;CACF;AAxFD,uCAwFC","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport * as RPCSPEC08 from '@starknet-io/starknet-types-08';\nimport * as SPEC from '@starknet-io/starknet-types-09';\nimport { getLogger } from '@subql/node-core';\nimport {\n BigNumberish,\n BlockIdentifier,\n Call,\n CompiledSierra,\n GetTransactionReceiptResponse,\n LegacyContractClass,\n RpcProvider,\n waitForTransactionOptions,\n} from 'starknet';\n\nconst logger = getLogger('safe.api.starknet');\n\nexport default class SafeStarknetProvider extends RpcProvider {\n constructor(private baseApi: RpcProvider, private blockHeight: number) {\n super();\n }\n\n async getStorageAt(\n contractAddress: BigNumberish,\n key: BigNumberish,\n blockIdentifier?: BlockIdentifier,\n ): Promise<string> {\n return this.baseApi.getStorageAt(contractAddress, key, this.blockHeight);\n }\n async getClass(\n classHash: BigNumberish,\n blockIdentifier?: BlockIdentifier,\n ): Promise<LegacyContractClass | CompiledSierra> {\n return this.baseApi.getClass(classHash, this.blockHeight);\n }\n async getClassAt(\n contractAddress: BigNumberish,\n blockIdentifier?: BlockIdentifier,\n ): Promise<LegacyContractClass | CompiledSierra> {\n return this.baseApi.getClassAt(contractAddress, this.blockHeight);\n }\n\n async estimateMessageFee(\n message: SPEC.L1Message,\n blockIdentifier?: BlockIdentifier,\n ): Promise<SPEC.MESSAGE_FEE_ESTIMATE | RPCSPEC08.FEE_ESTIMATE> {\n // @ts-ignore\n return this.baseApi.estimateMessageFee(message, this.blockHeight);\n }\n\n async callContract(\n call: Call,\n blockIdentifier?: BlockIdentifier,\n ): Promise<string[]> {\n return this.baseApi.callContract(call, this.blockHeight);\n }\n\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n getBlockWithTxs(\n blockHashOrBlockTag: BlockIdentifier,\n ): Promise<SPEC.BlockWithTxs> {\n throw new Error('Method `getBlockWithTransactions` not supported.');\n }\n\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n getBlockWithTxHashes(\n blockHashOrBlockTag: BlockIdentifier,\n ): Promise<SPEC.BlockWithTxHashes> {\n throw new Error('Method `getBlock` not supported.');\n }\n\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n getTransactionReceipt(\n transactionHash: string,\n ): Promise<GetTransactionReceiptResponse> {\n throw new Error('Method `getTransactionReceipt` not supported.');\n }\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n getEvents(filter): Promise<SPEC.EVENTS_CHUNK> {\n throw new Error('Method `getEvents` not supported.');\n }\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n getBlockNumber(): Promise<number> {\n throw new Error('Method `getBlockNumber` not supported.');\n }\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n getL1GasPrice(): Promise<string> {\n throw new Error('Method `getL1GasPrice` not supported.');\n }\n\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n waitForTransaction(\n txHash: BigNumberish,\n options?: waitForTransactionOptions,\n ): Promise<GetTransactionReceiptResponse> {\n throw new Error('Method `waitForTransaction` not supported.');\n }\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n resolveName(name: string | Promise<string>): Promise<string | null> {\n throw new Error('Method `resolveName` not supported.');\n }\n // eslint-disable-next-line @typescript-eslint/promise-function-async\n lookupAddress(address: string | Promise<string>): Promise<string | null> {\n throw new Error('Method `lookupAddress` not supported.');\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import * as
|
|
2
|
-
import * as SPEC from '@starknet-io/starknet-types-
|
|
1
|
+
import * as RPCSPEC08 from '@starknet-io/starknet-types-08';
|
|
2
|
+
import * as SPEC from '@starknet-io/starknet-types-09';
|
|
3
3
|
import { Header, IBlock } from '@subql/node-core';
|
|
4
4
|
import { ApiWrapper, LightStarknetBlock, StarknetBlock, StarknetLog, StarknetLogRaw, StarknetTransaction, StarknetTransactionRaw } from '@subql/types-starknet';
|
|
5
5
|
import { Abi, RpcProvider, TransactionReceipt } from 'starknet';
|
|
@@ -52,4 +52,6 @@ export declare function fetchAbiFromContractAddress(provider: RpcProvider, contr
|
|
|
52
52
|
export declare function encodeSelectorToHex(eventName: string): string;
|
|
53
53
|
export declare function encodeEventKey(eventName: string): string;
|
|
54
54
|
export declare function hexEq(a: string, b: string): boolean;
|
|
55
|
-
export declare function isFinalizedBlock(block:
|
|
55
|
+
export declare function isFinalizedBlock(block: {
|
|
56
|
+
status?: SPEC.BLOCK_STATUS | RPCSPEC08.BLOCK_STATUS;
|
|
57
|
+
}): block is SPEC.BLOCK_WITH_RECEIPTS;
|
|
@@ -211,6 +211,7 @@ function hexEq(a, b) {
|
|
|
211
211
|
function isFinalizedBlock(block) {
|
|
212
212
|
return ('status' in block &&
|
|
213
213
|
block.status !== 'PENDING' &&
|
|
214
|
-
block.status !== 'REJECTED'
|
|
214
|
+
block.status !== 'REJECTED' &&
|
|
215
|
+
block.status !== 'PRE_CONFIRMED');
|
|
215
216
|
}
|
|
216
217
|
//# sourceMappingURL=utils.starknet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.starknet.js","sourceRoot":"","sources":["../../src/starknet/utils.starknet.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport * as SPEC07 from '@starknet-io/starknet-types-07';\nimport * as SPEC from '@starknet-io/starknet-types-08';\nimport { Header, IBlock } from '@subql/node-core';\nimport {\n ApiWrapper,\n LightStarknetBlock,\n StarknetBlock,\n StarknetContractCall,\n StarknetLog,\n StarknetLogRaw,\n StarknetTransaction,\n StarknetTransactionRaw,\n} from '@subql/types-starknet';\nimport { omit } from 'lodash';\nimport {\n Abi,\n hash,\n num,\n RpcProvider,\n TransactionReceipt,\n validateAndParseAddress,\n} from 'starknet';\nimport { BlockContent } from '../indexer/types';\nimport { decodeGenericCalldata, decodeInvokeCalldata } from './decodeCalldata';\n\nexport function getBlockTimestamp(\n block: BlockContent | SPEC.BLOCK_HEADER,\n): Date {\n return new Date(block.timestamp * 1000);\n}\n\nexport function calcInterval(api: ApiWrapper): number {\n // TODO find a way to get this from the blockchain\n return 6000;\n}\n\nexport function formatBlock(\n block: SPEC.BLOCK_WITH_RECEIPTS | SPEC.BLOCK_WITH_TX_HASHES,\n): Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n} {\n return {\n blockHash: block.block_hash,\n parentHash: block.parent_hash,\n blockNumber: block.block_number,\n newRoot: block.new_root,\n sequencerAddress: block.sequencer_address,\n l1GasPrice: block.l1_gas_price,\n starknetVersion: block.starknet_version,\n timestamp: block.timestamp,\n status: block.status,\n logs: [], // Filled in at starknetBlockWrapped constructor\n transactions: block.transactions, // Transaction still raw here, will format in fetchBlock\n };\n}\n\nexport function formatBlockUtil<\n B extends StarknetBlock | LightStarknetBlock = StarknetBlock,\n>(block: B): IBlock<B> {\n return {\n block,\n getHeader: () => starknetBlockToHeader(block),\n };\n}\n\nexport function formatLog(\n log: StarknetLogRaw,\n logIndex: number,\n tx: StarknetTransaction,\n block: Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n },\n): StarknetLog {\n const formattedLog = {\n address: log.from_address,\n topics: log.keys,\n blockNumber: block.blockNumber,\n blockHash: block.blockHash,\n transactionHash: tx.hash,\n data: log.data,\n logIndex: logIndex,\n block: block,\n transaction: tx,\n transactionIndex: tx.transactionIndex,\n toJSON(): string {\n return JSON.stringify(omit(this, ['transaction', 'block', 'toJSON']));\n },\n };\n return formattedLog as unknown as StarknetLog;\n}\n\n/***\n * @param tx\n * @param block\n * @param txIndex\n * Explanation for from, to, selector, calldata with different tx type\n * When apply filter please refer to the following:\n *\n * 1. L1_HANDLER\n * from is the Contract Address (contract been called)\n * entryPointSelector (method)\n * within decodedCalls, to is same as from, selector is the entryPointSelector\n * 2. DEPLOY_ACCOUNT\n * from is the contract_address, also is the new account address\n * 3. DECLARE\n * from is the sender_address\n * 4. DEPLOY\n * from is the sender_address\n * 5. INVOKE V1 and V3\n * from is the sender_address\n * within decodedCalls, to is the contract been called, selector is the method\n * 6. INVOKE V0\n * from is the Contract Address (contract been called)\n * entryPointSelector is the method been called\n */\nexport function formatTransaction(\n tx: {\n transaction: SPEC.TXN;\n receipt: SPEC.TXN_RECEIPT;\n },\n block:\n | StarknetBlock\n | (Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n }),\n txIndex: number,\n): StarknetTransaction {\n // Any type specific properties are cast here, this should hopefully find any types issues int he future.\n const transaction = {\n ...tx.transaction,\n hash: tx.receipt.transaction_hash,\n type: tx.transaction.type,\n version: tx.transaction.version,\n nonce: (\n tx.transaction as Exclude<\n SPEC.TXN,\n SPEC.DECLARE_TXN_V0 | SPEC.INVOKE_TXN_V0 | SPEC.DEPLOY_TXN\n >\n ).nonce,\n maxFee: (\n tx.transaction as Exclude<\n SPEC.TXN,\n | SPEC.DECLARE_TXN_V3\n | SPEC.INVOKE_TXN_V3\n | SPEC.BROADCASTED_DECLARE_TXN_V3\n | SPEC.DEPLOY_ACCOUNT_TXN_V3\n | SPEC.L1_HANDLER_TXN\n | SPEC.DEPLOY_TXN\n >\n ).max_fee,\n from: getTxContractAddress(tx.transaction),\n calldata: (tx.transaction as SPEC.INVOKE_TXN).calldata ?? [],\n blockHash: block.blockHash,\n blockNumber: block.blockNumber,\n blockTimestamp: block.timestamp,\n transactionIndex: txIndex,\n entryPointSelector: (tx.transaction as SPEC.INVOKE_TXN_V0)\n .entry_point_selector,\n contractAddress: (tx.transaction as SPEC.INVOKE_TXN_V0).contract_address,\n receipt: formatReceipt(tx.receipt),\n parseCallData(): StarknetContractCall[] | undefined {\n if (this.decodedCalls) {\n return this.decodedCalls;\n }\n\n // Handle \"INVOKE V1 and V3\"\n if (\n transaction.type === 'INVOKE' &&\n transaction.version !== '0x0' &&\n transaction.version !== '0x100000000000000000000000000000000'\n ) {\n return decodeInvokeCalldata(transaction.calldata);\n }\n // Handle \"L1_HANDLER\" and \"INVOKE V0\"\n else if (\n transaction.contractAddress &&\n transaction.entryPointSelector &&\n transaction.calldata\n ) {\n return [\n decodeGenericCalldata(\n transaction.contractAddress,\n transaction.entryPointSelector,\n transaction.calldata,\n ),\n ];\n }\n return;\n },\n toJSON(): string {\n return JSON.stringify(omit(this, ['receipt', 'toJSON']));\n },\n } satisfies StarknetTransaction & { toJSON: () => string };\n return transaction;\n}\n\nexport function getTxContractAddress(tx: SPEC.TXN): string {\n if (tx.type === 'DEPLOY' || tx.type === 'DEPLOY_ACCOUNT') {\n const result = hash.calculateContractAddressFromHash(\n tx.contract_address_salt,\n tx.class_hash,\n tx.constructor_calldata,\n 0,\n );\n return result;\n }\n return (\n (tx as SPEC.INVOKE_TXN_V0 | SPEC.L1_HANDLER_TXN).contract_address ??\n (\n tx as Exclude<\n SPEC.TXN,\n | SPEC.INVOKE_TXN_V0\n | SPEC.L1_HANDLER_TXN\n | SPEC.DEPLOY_TXN\n | SPEC.DEPLOY_ACCOUNT_TXN\n >\n ).sender_address\n );\n}\n\nexport function formatReceipt(receipt: SPEC.TXN_RECEIPT): TransactionReceipt {\n return {\n ...receipt,\n toJSON(): string {\n return JSON.stringify(omit(this, ['toJSON']));\n },\n } as unknown as TransactionReceipt;\n}\n\nexport function starknetBlockToHeader(block: BlockContent): Header {\n return {\n blockHeight: block.blockNumber,\n blockHash: block.blockHash,\n parentHash: block.parentHash,\n timestamp: getBlockTimestamp(block),\n };\n}\n\nexport function starknetBlockHeaderToHeader(block: SPEC.BLOCK_HEADER): Header {\n return {\n blockHeight: block.block_number,\n blockHash: block.block_hash,\n parentHash: block.parent_hash,\n timestamp: getBlockTimestamp(block),\n };\n}\n\n//TODO, only used to phrase abi event\nexport function reverseToRawLog(log: StarknetLog): SPEC.EMITTED_EVENT {\n // Strip the block and transaction properties\n const { block, transaction, ...rest } = log;\n const emittedEvent = {\n block_hash: log.blockHash,\n keys: [...log.topics],\n from_address: log.address,\n transaction_hash: log.transactionHash,\n block_number: log.blockNumber,\n ...rest,\n };\n\n // log also has a toJSON method, which we don't want to include in the raw log\n delete (emittedEvent as any).toJSON;\n\n return emittedEvent;\n}\n\n// This is used when user abi not provided, or decode call in tx\nexport async function fetchAbiFromContractAddress(\n provider: RpcProvider,\n contractAddress: string,\n): Promise<Abi> {\n const { abi: remoteAbi } = await provider.getClassAt(contractAddress);\n if (remoteAbi === undefined) {\n throw new Error('no abi.');\n }\n return remoteAbi;\n}\n\nexport function encodeSelectorToHex(eventName: string): string {\n return hash.getSelector(eventName);\n}\n\nexport function encodeEventKey(eventName: string): string {\n return num.toHex(hash.starknetKeccak(eventName));\n}\n\n// Check address or selector hex string are equal\nexport function hexEq(a: string, b: string): boolean {\n try {\n return validateAndParseAddress(a) === validateAndParseAddress(b);\n } catch (e) {\n return false;\n }\n}\n\n// check if block is finalized\nexport function isFinalizedBlock(\n block:\n | SPEC07.SPEC.BLOCK_WITH_RECEIPTS\n | SPEC07.SPEC.PENDING_BLOCK_WITH_RECEIPTS\n | SPEC.BLOCK_WITH_RECEIPTS\n | SPEC.PENDING_BLOCK_WITH_RECEIPTS,\n): block is SPEC.BLOCK_WITH_RECEIPTS {\n return (\n 'status' in block &&\n block.status !== 'PENDING' &&\n block.status !== 'REJECTED'\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.starknet.js","sourceRoot":"","sources":["../../src/starknet/utils.starknet.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2020-2025 SubQuery Pte Ltd authors & contributors\n// SPDX-License-Identifier: GPL-3.0\n\nimport * as RPCSPEC08 from '@starknet-io/starknet-types-08';\nimport * as SPEC from '@starknet-io/starknet-types-09';\nimport { Header, IBlock } from '@subql/node-core';\nimport {\n ApiWrapper,\n LightStarknetBlock,\n StarknetBlock,\n StarknetContractCall,\n StarknetLog,\n StarknetLogRaw,\n StarknetTransaction,\n StarknetTransactionRaw,\n} from '@subql/types-starknet';\nimport { omit } from 'lodash';\nimport {\n Abi,\n hash,\n num,\n RpcProvider,\n TransactionReceipt,\n validateAndParseAddress,\n} from 'starknet';\nimport { BlockContent } from '../indexer/types';\nimport { decodeGenericCalldata, decodeInvokeCalldata } from './decodeCalldata';\n\nexport function getBlockTimestamp(\n block: BlockContent | SPEC.BLOCK_HEADER,\n): Date {\n return new Date(block.timestamp * 1000);\n}\n\nexport function calcInterval(api: ApiWrapper): number {\n // TODO find a way to get this from the blockchain\n return 6000;\n}\n\nexport function formatBlock(\n block: SPEC.BLOCK_WITH_RECEIPTS | SPEC.BLOCK_WITH_TX_HASHES,\n): Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n} {\n return {\n blockHash: block.block_hash,\n parentHash: block.parent_hash,\n blockNumber: block.block_number,\n newRoot: block.new_root,\n sequencerAddress: block.sequencer_address,\n l1GasPrice: block.l1_gas_price,\n starknetVersion: block.starknet_version,\n timestamp: block.timestamp,\n status: block.status,\n logs: [], // Filled in at starknetBlockWrapped constructor\n transactions: block.transactions, // Transaction still raw here, will format in fetchBlock\n };\n}\n\nexport function formatBlockUtil<\n B extends StarknetBlock | LightStarknetBlock = StarknetBlock,\n>(block: B): IBlock<B> {\n return {\n block,\n getHeader: () => starknetBlockToHeader(block),\n };\n}\n\nexport function formatLog(\n log: StarknetLogRaw,\n logIndex: number,\n tx: StarknetTransaction,\n block: Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n },\n): StarknetLog {\n const formattedLog = {\n address: log.from_address,\n topics: log.keys,\n blockNumber: block.blockNumber,\n blockHash: block.blockHash,\n transactionHash: tx.hash,\n data: log.data,\n logIndex: logIndex,\n block: block,\n transaction: tx,\n transactionIndex: tx.transactionIndex,\n toJSON(): string {\n return JSON.stringify(omit(this, ['transaction', 'block', 'toJSON']));\n },\n };\n return formattedLog as unknown as StarknetLog;\n}\n\n/***\n * @param tx\n * @param block\n * @param txIndex\n * Explanation for from, to, selector, calldata with different tx type\n * When apply filter please refer to the following:\n *\n * 1. L1_HANDLER\n * from is the Contract Address (contract been called)\n * entryPointSelector (method)\n * within decodedCalls, to is same as from, selector is the entryPointSelector\n * 2. DEPLOY_ACCOUNT\n * from is the contract_address, also is the new account address\n * 3. DECLARE\n * from is the sender_address\n * 4. DEPLOY\n * from is the sender_address\n * 5. INVOKE V1 and V3\n * from is the sender_address\n * within decodedCalls, to is the contract been called, selector is the method\n * 6. INVOKE V0\n * from is the Contract Address (contract been called)\n * entryPointSelector is the method been called\n */\nexport function formatTransaction(\n tx: {\n transaction: SPEC.TXN;\n receipt: SPEC.TXN_RECEIPT;\n },\n block:\n | StarknetBlock\n | (Omit<StarknetBlock, 'transactions'> & {\n transactions: StarknetTransactionRaw[];\n }),\n txIndex: number,\n): StarknetTransaction {\n // Any type specific properties are cast here, this should hopefully find any types issues int he future.\n const transaction = {\n ...tx.transaction,\n hash: tx.receipt.transaction_hash,\n type: tx.transaction.type,\n version: tx.transaction.version,\n nonce: (\n tx.transaction as Exclude<\n SPEC.TXN,\n SPEC.DECLARE_TXN_V0 | SPEC.INVOKE_TXN_V0 | SPEC.DEPLOY_TXN\n >\n ).nonce,\n maxFee: (\n tx.transaction as Exclude<\n SPEC.TXN,\n | SPEC.DECLARE_TXN_V3\n | SPEC.INVOKE_TXN_V3\n | SPEC.BROADCASTED_DECLARE_TXN_V3\n | SPEC.DEPLOY_ACCOUNT_TXN_V3\n | SPEC.L1_HANDLER_TXN\n | SPEC.DEPLOY_TXN\n >\n ).max_fee,\n from: getTxContractAddress(tx.transaction),\n calldata: (tx.transaction as SPEC.INVOKE_TXN).calldata ?? [],\n blockHash: block.blockHash,\n blockNumber: block.blockNumber,\n blockTimestamp: block.timestamp,\n transactionIndex: txIndex,\n entryPointSelector: (tx.transaction as SPEC.INVOKE_TXN_V0)\n .entry_point_selector,\n contractAddress: (tx.transaction as SPEC.INVOKE_TXN_V0).contract_address,\n receipt: formatReceipt(tx.receipt),\n parseCallData(): StarknetContractCall[] | undefined {\n if (this.decodedCalls) {\n return this.decodedCalls;\n }\n\n // Handle \"INVOKE V1 and V3\"\n if (\n transaction.type === 'INVOKE' &&\n transaction.version !== '0x0' &&\n transaction.version !== '0x100000000000000000000000000000000'\n ) {\n return decodeInvokeCalldata(transaction.calldata);\n }\n // Handle \"L1_HANDLER\" and \"INVOKE V0\"\n else if (\n transaction.contractAddress &&\n transaction.entryPointSelector &&\n transaction.calldata\n ) {\n return [\n decodeGenericCalldata(\n transaction.contractAddress,\n transaction.entryPointSelector,\n transaction.calldata,\n ),\n ];\n }\n return;\n },\n toJSON(): string {\n return JSON.stringify(omit(this, ['receipt', 'toJSON']));\n },\n } satisfies StarknetTransaction & { toJSON: () => string };\n return transaction;\n}\n\nexport function getTxContractAddress(tx: SPEC.TXN): string {\n if (tx.type === 'DEPLOY' || tx.type === 'DEPLOY_ACCOUNT') {\n const result = hash.calculateContractAddressFromHash(\n tx.contract_address_salt,\n tx.class_hash,\n tx.constructor_calldata,\n 0,\n );\n return result;\n }\n return (\n (tx as SPEC.INVOKE_TXN_V0 | SPEC.L1_HANDLER_TXN).contract_address ??\n (\n tx as Exclude<\n SPEC.TXN,\n | SPEC.INVOKE_TXN_V0\n | SPEC.L1_HANDLER_TXN\n | SPEC.DEPLOY_TXN\n | SPEC.DEPLOY_ACCOUNT_TXN\n >\n ).sender_address\n );\n}\n\nexport function formatReceipt(receipt: SPEC.TXN_RECEIPT): TransactionReceipt {\n return {\n ...receipt,\n toJSON(): string {\n return JSON.stringify(omit(this, ['toJSON']));\n },\n } as unknown as TransactionReceipt;\n}\n\nexport function starknetBlockToHeader(block: BlockContent): Header {\n return {\n blockHeight: block.blockNumber,\n blockHash: block.blockHash,\n parentHash: block.parentHash,\n timestamp: getBlockTimestamp(block),\n };\n}\n\nexport function starknetBlockHeaderToHeader(block: SPEC.BLOCK_HEADER): Header {\n return {\n blockHeight: block.block_number,\n blockHash: block.block_hash,\n parentHash: block.parent_hash,\n timestamp: getBlockTimestamp(block),\n };\n}\n\n//TODO, only used to phrase abi event\nexport function reverseToRawLog(log: StarknetLog): SPEC.EMITTED_EVENT {\n // Strip the block and transaction properties\n const { block, transaction, ...rest } = log;\n const emittedEvent = {\n block_hash: log.blockHash,\n keys: [...log.topics],\n from_address: log.address,\n transaction_hash: log.transactionHash,\n block_number: log.blockNumber,\n ...rest,\n };\n\n // log also has a toJSON method, which we don't want to include in the raw log\n delete (emittedEvent as any).toJSON;\n\n return emittedEvent;\n}\n\n// This is used when user abi not provided, or decode call in tx\nexport async function fetchAbiFromContractAddress(\n provider: RpcProvider,\n contractAddress: string,\n): Promise<Abi> {\n const { abi: remoteAbi } = await provider.getClassAt(contractAddress);\n if (remoteAbi === undefined) {\n throw new Error('no abi.');\n }\n return remoteAbi;\n}\n\nexport function encodeSelectorToHex(eventName: string): string {\n return hash.getSelector(eventName);\n}\n\nexport function encodeEventKey(eventName: string): string {\n return num.toHex(hash.starknetKeccak(eventName));\n}\n\n// Check address or selector hex string are equal\nexport function hexEq(a: string, b: string): boolean {\n try {\n return validateAndParseAddress(a) === validateAndParseAddress(b);\n } catch (e) {\n return false;\n }\n}\n\ntype BlockWithHashesResponse = Awaited<\n ReturnType<RpcProvider['getBlockWithTxHashes']>\n>;\n\n// check if block is finalized\nexport function isFinalizedBlock(block: {\n status?: SPEC.BLOCK_STATUS | RPCSPEC08.BLOCK_STATUS;\n}): block is SPEC.BLOCK_WITH_RECEIPTS {\n return (\n 'status' in block &&\n block.status !== 'PENDING' &&\n block.status !== 'REJECTED' &&\n block.status !== 'PRE_CONFIRMED'\n );\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@subql/node-starknet",
|
|
3
|
-
"version": "6.1.0",
|
|
3
|
+
"version": "6.1.1-0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"author": "Jay Ji",
|
|
6
6
|
"license": "GPL-3.0",
|
|
@@ -24,17 +24,17 @@
|
|
|
24
24
|
"@nestjs/event-emitter": "^3.0.1",
|
|
25
25
|
"@nestjs/platform-express": "^11.0.10",
|
|
26
26
|
"@nestjs/schedule": "^5.0.1",
|
|
27
|
-
"@subql/common-starknet": "1.3.0",
|
|
27
|
+
"@subql/common-starknet": "1.3.1-0",
|
|
28
28
|
"@subql/node-core": "^18.2.1",
|
|
29
29
|
"@subql/testing": "^2.2.2",
|
|
30
|
-
"@subql/types-starknet": "1.3.0",
|
|
30
|
+
"@subql/types-starknet": "1.3.1-0",
|
|
31
31
|
"cacheable-lookup": "6",
|
|
32
32
|
"eventemitter2": "^6.4.5",
|
|
33
33
|
"json5": "^2.2.3",
|
|
34
34
|
"lodash": "^4.17.21",
|
|
35
35
|
"reflect-metadata": "^0.1.13",
|
|
36
36
|
"rimraf": "^3.0.2",
|
|
37
|
-
"starknet": "^
|
|
37
|
+
"starknet": "^8.6.0",
|
|
38
38
|
"yargs": "^16.2.0"
|
|
39
39
|
},
|
|
40
40
|
"peerDependencies": {
|
|
@@ -68,5 +68,6 @@
|
|
|
68
68
|
"README.md",
|
|
69
69
|
"CHANGELOG.md",
|
|
70
70
|
"LICENSE"
|
|
71
|
-
]
|
|
71
|
+
],
|
|
72
|
+
"stableVersion": "6.1.0"
|
|
72
73
|
}
|