@sentio/sdk 2.10.0-rc.3 → 2.10.0-rc.5

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.
@@ -16,7 +16,7 @@ export declare class EventsHandler {
16
16
  fetchConfig: EthFetchConfig;
17
17
  }
18
18
  export declare class TraceHandler {
19
- signature: string;
19
+ signatures: string[];
20
20
  handler: (trace: Data_EthTrace) => Promise<ProcessResult>;
21
21
  fetchConfig: EthFetchConfig;
22
22
  }
@@ -44,7 +44,8 @@ export declare abstract class BaseProcessor<TContract extends BaseContract, TBou
44
44
  onBlockInterval(handler: (block: BlockParams, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid, blockInterval?: number, backfillBlockInterval?: number): this;
45
45
  onTimeInterval(handler: (block: BlockParams, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid, timeIntervalInMinutes?: number, backfillTimeIntervalInMinutes?: number): this;
46
46
  onInterval(handler: (block: BlockParams, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid, timeInterval: HandleInterval | undefined, blockInterval: HandleInterval | undefined): this;
47
- onAllEvents(handler: (event: EthEvent, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid): this;
48
- onTrace(signature: string, handler: (trace: Trace, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid, fetchConfig?: Partial<EthFetchConfig>): this;
47
+ onAllEvents(handler: (event: EthEvent, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid, fetchConfig?: Partial<EthFetchConfig>): this;
48
+ onTrace(signatures: string | string[], handler: (trace: Trace, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid, fetchConfig?: Partial<EthFetchConfig>): this;
49
+ onAllTraces(handler: (event: Trace, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid, fetchConfig?: Partial<EthFetchConfig>): this;
49
50
  }
50
51
  export {};
@@ -4,13 +4,14 @@ import { ServerError, Status } from 'nice-grpc';
4
4
  import { fixEmptyKey, formatEthData } from './eth.js';
5
5
  import * as console from 'console';
6
6
  import { getNetworkFromCtxOrNetworkish } from './provider.js';
7
+ import sha3 from 'js-sha3';
7
8
  export class EventsHandler {
8
9
  filters;
9
10
  handler;
10
11
  fetchConfig;
11
12
  }
12
13
  export class TraceHandler {
13
- signature;
14
+ signatures;
14
15
  handler;
15
16
  fetchConfig;
16
17
  }
@@ -110,7 +111,7 @@ export class BaseProcessor {
110
111
  });
111
112
  return this;
112
113
  }
113
- onAllEvents(handler) {
114
+ onAllEvents(handler, fetchConfig) {
114
115
  const _filters = [];
115
116
  const tmpContract = this.CreateBoundContractView();
116
117
  for (const fragment of tmpContract.rawContract.interface.fragments) {
@@ -121,23 +122,32 @@ export class BaseProcessor {
121
122
  }
122
123
  return this.onEvent(function (log, ctx) {
123
124
  return handler(log, ctx);
124
- }, _filters);
125
+ }, _filters, fetchConfig);
125
126
  }
126
- onTrace(signature, handler, fetchConfig) {
127
+ onTrace(signatures, handler, fetchConfig) {
127
128
  const chainId = this.getChainId();
128
129
  const contractName = this.config.name;
129
130
  const processor = this;
131
+ if (typeof signatures === 'string') {
132
+ signatures = [signatures];
133
+ }
130
134
  this.traceHandlers.push({
131
- signature,
135
+ signatures,
132
136
  fetchConfig: EthFetchConfig.fromPartial(fetchConfig || {}),
133
137
  handler: async function (data) {
134
138
  const contractView = processor.CreateBoundContractView();
135
139
  const contractInterface = contractView.rawContract.interface;
136
- const fragment = contractInterface.getFunction(signature);
137
140
  const { trace, block, transaction, transactionReceipt } = formatEthData(data);
141
+ const sighash = trace?.action.input?.slice(0, 10);
142
+ if (!sighash) {
143
+ throw new ServerError(Status.INVALID_ARGUMENT, 'trace has no sighash');
144
+ }
145
+ const fragment = contractInterface.getFunction(sighash);
138
146
  if (!trace || !fragment) {
139
147
  throw new ServerError(Status.INVALID_ARGUMENT, 'trace is null');
140
148
  }
149
+ trace.name = fragment.name;
150
+ trace.functionSignature = fragment.format();
141
151
  // const trace = data.trace as Trace
142
152
  if (!trace?.action.input) {
143
153
  return ProcessResult.fromPartial({});
@@ -159,5 +169,20 @@ export class BaseProcessor {
159
169
  });
160
170
  return this;
161
171
  }
172
+ onAllTraces(handler, fetchConfig) {
173
+ const tmpContract = this.CreateBoundContractView();
174
+ const sighashes = [];
175
+ for (const fragment of tmpContract.rawContract.interface.fragments) {
176
+ if (fragment.type === 'function') {
177
+ const signature = fragment.format();
178
+ const test = new TextEncoder().encode(signature);
179
+ const sighash = '0x' + sha3.keccak_256(test).substring(0, 8);
180
+ sighashes.push(sighash);
181
+ }
182
+ }
183
+ return this.onTrace(sighashes, function (trace, ctx) {
184
+ return handler(trace, ctx);
185
+ }, fetchConfig);
186
+ }
162
187
  }
163
188
  //# sourceMappingURL=base-processor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-processor.js","sourceRoot":"","sources":["../../src/eth/base-processor.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseContract, DeferredTopicFilter } from 'ethers'\nimport { BlockParams, Network } from 'ethers/providers'\n\nimport { BoundContractView, ContractContext, ContractView } from './context.js'\nimport {\n AddressType,\n Data_EthBlock,\n Data_EthLog,\n Data_EthTrace,\n EthFetchConfig,\n HandleInterval,\n ProcessResult,\n} from '@sentio/protos'\nimport { BindOptions } from './bind-options.js'\nimport { PromiseOrVoid } from '../promise-or-void.js'\nimport { Trace } from './trace.js'\nimport { ServerError, Status } from 'nice-grpc'\nimport { fixEmptyKey, EthEvent, formatEthData } from './eth.js'\nimport * as console from 'console'\nimport { getNetworkFromCtxOrNetworkish } from './provider.js'\n\nexport interface AddressOrTypeEventFilter extends DeferredTopicFilter {\n addressType?: AddressType\n address?: string\n}\n\nexport class EventsHandler {\n filters: AddressOrTypeEventFilter[]\n handler: (event: Data_EthLog) => Promise<ProcessResult>\n fetchConfig: EthFetchConfig\n}\n\nexport class TraceHandler {\n signature: string\n handler: (trace: Data_EthTrace) => Promise<ProcessResult>\n fetchConfig: EthFetchConfig\n}\n\nexport class BlockHandlder {\n blockInterval?: HandleInterval\n timeIntervalInMinutes?: HandleInterval\n handler: (block: Data_EthBlock) => Promise<ProcessResult>\n}\n\nclass BindInternalOptions {\n address: string\n network: Network\n name: string\n startBlock: bigint\n endBlock?: bigint\n}\n\nexport abstract class BaseProcessor<\n TContract extends BaseContract,\n TBoundContractView extends BoundContractView<TContract, ContractView<TContract>>\n> {\n blockHandlers: BlockHandlder[] = []\n eventHandlers: EventsHandler[] = []\n traceHandlers: TraceHandler[] = []\n\n config: BindInternalOptions\n\n constructor(config: BindOptions) {\n this.config = {\n address: config.address,\n name: config.name || '',\n network: getNetworkFromCtxOrNetworkish(config.network),\n startBlock: 0n,\n }\n if (config.startBlock) {\n this.config.startBlock = BigInt(config.startBlock)\n }\n if (config.endBlock) {\n this.config.endBlock = BigInt(config.endBlock)\n }\n }\n\n protected abstract CreateBoundContractView(): TBoundContractView\n\n public getChainId(): number {\n return Number(this.config.network.chainId)\n }\n\n public onEvent(\n handler: (event: EthEvent, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,\n filter: DeferredTopicFilter | DeferredTopicFilter[],\n fetchConfig?: Partial<EthFetchConfig>\n ): this {\n const chainId = this.getChainId()\n let _filters: DeferredTopicFilter[] = []\n\n if (Array.isArray(filter)) {\n _filters = filter\n } else {\n _filters.push(filter)\n }\n\n const contractName = this.config.name\n const processor = this\n this.eventHandlers.push({\n filters: _filters,\n fetchConfig: EthFetchConfig.fromPartial(fetchConfig || {}),\n handler: async function (data: Data_EthLog) {\n const { log, block, transaction, transactionReceipt } = formatEthData(data)\n if (!log) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Log is empty')\n }\n const contractView = processor.CreateBoundContractView()\n\n const ctx = new ContractContext<TContract, TBoundContractView>(\n contractName,\n contractView,\n chainId,\n data.timestamp,\n block,\n log,\n undefined,\n transaction,\n transactionReceipt\n )\n const logParam = log as any as { topics: Array<string>; data: string }\n\n const parsed = contractView.rawContract.interface.parseLog(logParam)\n\n if (parsed) {\n const event: EthEvent = { ...log, name: parsed.name, args: fixEmptyKey(parsed) }\n await handler(event, ctx)\n return ctx.getProcessResult()\n }\n return ProcessResult.fromPartial({})\n },\n })\n return this\n }\n\n public onBlockInterval(\n handler: (block: BlockParams, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,\n blockInterval = 250,\n backfillBlockInterval = 1000\n ): this {\n return this.onInterval(handler, undefined, {\n recentInterval: blockInterval,\n backfillInterval: backfillBlockInterval,\n })\n }\n\n public onTimeInterval(\n handler: (block: BlockParams, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,\n timeIntervalInMinutes = 60,\n backfillTimeIntervalInMinutes = 240\n ): this {\n return this.onInterval(\n handler,\n { recentInterval: timeIntervalInMinutes, backfillInterval: backfillTimeIntervalInMinutes },\n undefined\n )\n }\n\n public onInterval(\n handler: (block: BlockParams, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,\n timeInterval: HandleInterval | undefined,\n blockInterval: HandleInterval | undefined\n ): this {\n const chainId = this.getChainId()\n const processor = this\n const contractName = this.config.name\n\n this.blockHandlers.push({\n handler: async function (data: Data_EthBlock) {\n const { block } = formatEthData(data)\n\n if (!block) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Block is empty')\n }\n\n const contractView = processor.CreateBoundContractView()\n\n const ctx = new ContractContext<TContract, TBoundContractView>(\n contractName,\n contractView,\n chainId,\n new Date(block.timestamp * 1000),\n block,\n undefined,\n undefined\n )\n await handler(block, ctx)\n return ctx.getProcessResult()\n },\n timeIntervalInMinutes: timeInterval,\n blockInterval: blockInterval,\n })\n return this\n }\n\n public onAllEvents(\n handler: (event: EthEvent, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid\n ): this {\n const _filters: DeferredTopicFilter[] = []\n const tmpContract = this.CreateBoundContractView()\n\n for (const fragment of tmpContract.rawContract.interface.fragments) {\n if (fragment.type === 'event') {\n const filter = tmpContract.rawContract.filters[fragment.format()]\n _filters.push(filter())\n }\n }\n return this.onEvent(function (log, ctx) {\n return handler(log, ctx)\n }, _filters)\n }\n\n public onTrace(\n signature: string,\n handler: (trace: Trace, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,\n fetchConfig?: Partial<EthFetchConfig>\n ): this {\n const chainId = this.getChainId()\n const contractName = this.config.name\n const processor = this\n\n this.traceHandlers.push({\n signature,\n fetchConfig: EthFetchConfig.fromPartial(fetchConfig || {}),\n handler: async function (data: Data_EthTrace) {\n const contractView = processor.CreateBoundContractView()\n const contractInterface = contractView.rawContract.interface\n const fragment = contractInterface.getFunction(signature)\n const { trace, block, transaction, transactionReceipt } = formatEthData(data)\n if (!trace || !fragment) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'trace is null')\n }\n // const trace = data.trace as Trace\n if (!trace?.action.input) {\n return ProcessResult.fromPartial({})\n }\n const traceData = '0x' + trace.action.input.slice(10)\n try {\n trace.args = contractInterface.getAbiCoder().decode(fragment.inputs, traceData, true)\n } catch (e) {\n if (!trace.error) {\n throw e\n }\n console.error('Failed to decode successful trace', e)\n }\n const ctx = new ContractContext<TContract, TBoundContractView>(\n contractName,\n contractView,\n chainId,\n data.timestamp,\n block,\n undefined,\n trace,\n transaction,\n transactionReceipt\n )\n await handler(trace, ctx)\n return ctx.getProcessResult()\n },\n })\n return this\n }\n}\n"]}
1
+ {"version":3,"file":"base-processor.js","sourceRoot":"","sources":["../../src/eth/base-processor.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseContract, DeferredTopicFilter } from 'ethers'\nimport { BlockParams, Network } from 'ethers/providers'\n\nimport { BoundContractView, ContractContext, ContractView } from './context.js'\nimport {\n AddressType,\n Data_EthBlock,\n Data_EthLog,\n Data_EthTrace,\n EthFetchConfig,\n HandleInterval,\n ProcessResult,\n} from '@sentio/protos'\nimport { BindOptions } from './bind-options.js'\nimport { PromiseOrVoid } from '../promise-or-void.js'\nimport { Trace } from './trace.js'\nimport { ServerError, Status } from 'nice-grpc'\nimport { fixEmptyKey, EthEvent, formatEthData } from './eth.js'\nimport * as console from 'console'\nimport { getNetworkFromCtxOrNetworkish } from './provider.js'\nimport sha3 from 'js-sha3'\n\nexport interface AddressOrTypeEventFilter extends DeferredTopicFilter {\n addressType?: AddressType\n address?: string\n}\n\nexport class EventsHandler {\n filters: AddressOrTypeEventFilter[]\n handler: (event: Data_EthLog) => Promise<ProcessResult>\n fetchConfig: EthFetchConfig\n}\n\nexport class TraceHandler {\n signatures: string[]\n handler: (trace: Data_EthTrace) => Promise<ProcessResult>\n fetchConfig: EthFetchConfig\n}\n\nexport class BlockHandlder {\n blockInterval?: HandleInterval\n timeIntervalInMinutes?: HandleInterval\n handler: (block: Data_EthBlock) => Promise<ProcessResult>\n}\n\nclass BindInternalOptions {\n address: string\n network: Network\n name: string\n startBlock: bigint\n endBlock?: bigint\n}\n\nexport abstract class BaseProcessor<\n TContract extends BaseContract,\n TBoundContractView extends BoundContractView<TContract, ContractView<TContract>>\n> {\n blockHandlers: BlockHandlder[] = []\n eventHandlers: EventsHandler[] = []\n traceHandlers: TraceHandler[] = []\n\n config: BindInternalOptions\n\n constructor(config: BindOptions) {\n this.config = {\n address: config.address,\n name: config.name || '',\n network: getNetworkFromCtxOrNetworkish(config.network),\n startBlock: 0n,\n }\n if (config.startBlock) {\n this.config.startBlock = BigInt(config.startBlock)\n }\n if (config.endBlock) {\n this.config.endBlock = BigInt(config.endBlock)\n }\n }\n\n protected abstract CreateBoundContractView(): TBoundContractView\n\n public getChainId(): number {\n return Number(this.config.network.chainId)\n }\n\n public onEvent(\n handler: (event: EthEvent, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,\n filter: DeferredTopicFilter | DeferredTopicFilter[],\n fetchConfig?: Partial<EthFetchConfig>\n ): this {\n const chainId = this.getChainId()\n let _filters: DeferredTopicFilter[] = []\n\n if (Array.isArray(filter)) {\n _filters = filter\n } else {\n _filters.push(filter)\n }\n\n const contractName = this.config.name\n const processor = this\n this.eventHandlers.push({\n filters: _filters,\n fetchConfig: EthFetchConfig.fromPartial(fetchConfig || {}),\n handler: async function (data: Data_EthLog) {\n const { log, block, transaction, transactionReceipt } = formatEthData(data)\n if (!log) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Log is empty')\n }\n const contractView = processor.CreateBoundContractView()\n\n const ctx = new ContractContext<TContract, TBoundContractView>(\n contractName,\n contractView,\n chainId,\n data.timestamp,\n block,\n log,\n undefined,\n transaction,\n transactionReceipt\n )\n const logParam = log as any as { topics: Array<string>; data: string }\n\n const parsed = contractView.rawContract.interface.parseLog(logParam)\n\n if (parsed) {\n const event: EthEvent = { ...log, name: parsed.name, args: fixEmptyKey(parsed) }\n await handler(event, ctx)\n return ctx.getProcessResult()\n }\n return ProcessResult.fromPartial({})\n },\n })\n return this\n }\n\n public onBlockInterval(\n handler: (block: BlockParams, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,\n blockInterval = 250,\n backfillBlockInterval = 1000\n ): this {\n return this.onInterval(handler, undefined, {\n recentInterval: blockInterval,\n backfillInterval: backfillBlockInterval,\n })\n }\n\n public onTimeInterval(\n handler: (block: BlockParams, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,\n timeIntervalInMinutes = 60,\n backfillTimeIntervalInMinutes = 240\n ): this {\n return this.onInterval(\n handler,\n { recentInterval: timeIntervalInMinutes, backfillInterval: backfillTimeIntervalInMinutes },\n undefined\n )\n }\n\n public onInterval(\n handler: (block: BlockParams, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,\n timeInterval: HandleInterval | undefined,\n blockInterval: HandleInterval | undefined\n ): this {\n const chainId = this.getChainId()\n const processor = this\n const contractName = this.config.name\n\n this.blockHandlers.push({\n handler: async function (data: Data_EthBlock) {\n const { block } = formatEthData(data)\n\n if (!block) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Block is empty')\n }\n\n const contractView = processor.CreateBoundContractView()\n\n const ctx = new ContractContext<TContract, TBoundContractView>(\n contractName,\n contractView,\n chainId,\n new Date(block.timestamp * 1000),\n block,\n undefined,\n undefined\n )\n await handler(block, ctx)\n return ctx.getProcessResult()\n },\n timeIntervalInMinutes: timeInterval,\n blockInterval: blockInterval,\n })\n return this\n }\n\n public onAllEvents(\n handler: (event: EthEvent, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,\n fetchConfig?: Partial<EthFetchConfig>\n ): this {\n const _filters: DeferredTopicFilter[] = []\n const tmpContract = this.CreateBoundContractView()\n\n for (const fragment of tmpContract.rawContract.interface.fragments) {\n if (fragment.type === 'event') {\n const filter = tmpContract.rawContract.filters[fragment.format()]\n _filters.push(filter())\n }\n }\n return this.onEvent(\n function (log, ctx) {\n return handler(log, ctx)\n },\n _filters,\n fetchConfig\n )\n }\n\n public onTrace(\n signatures: string | string[],\n handler: (trace: Trace, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,\n fetchConfig?: Partial<EthFetchConfig>\n ): this {\n const chainId = this.getChainId()\n const contractName = this.config.name\n const processor = this\n if (typeof signatures === 'string') {\n signatures = [signatures]\n }\n\n this.traceHandlers.push({\n signatures,\n fetchConfig: EthFetchConfig.fromPartial(fetchConfig || {}),\n handler: async function (data: Data_EthTrace) {\n const contractView = processor.CreateBoundContractView()\n const contractInterface = contractView.rawContract.interface\n const { trace, block, transaction, transactionReceipt } = formatEthData(data)\n const sighash = trace?.action.input?.slice(0, 10)\n if (!sighash) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'trace has no sighash')\n }\n const fragment = contractInterface.getFunction(sighash)\n\n if (!trace || !fragment) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'trace is null')\n }\n trace.name = fragment.name\n trace.functionSignature = fragment.format()\n // const trace = data.trace as Trace\n if (!trace?.action.input) {\n return ProcessResult.fromPartial({})\n }\n const traceData = '0x' + trace.action.input.slice(10)\n try {\n trace.args = contractInterface.getAbiCoder().decode(fragment.inputs, traceData, true)\n } catch (e) {\n if (!trace.error) {\n throw e\n }\n console.error('Failed to decode successful trace', e)\n }\n const ctx = new ContractContext<TContract, TBoundContractView>(\n contractName,\n contractView,\n chainId,\n data.timestamp,\n block,\n undefined,\n trace,\n transaction,\n transactionReceipt\n )\n await handler(trace, ctx)\n return ctx.getProcessResult()\n },\n })\n return this\n }\n\n public onAllTraces(\n handler: (event: Trace, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,\n fetchConfig?: Partial<EthFetchConfig>\n ): this {\n const tmpContract = this.CreateBoundContractView()\n const sighashes = []\n\n for (const fragment of tmpContract.rawContract.interface.fragments) {\n if (fragment.type === 'function') {\n const signature = fragment.format()\n const test = new TextEncoder().encode(signature)\n const sighash = '0x' + sha3.keccak_256(test).substring(0, 8)\n sighashes.push(sighash)\n }\n }\n return this.onTrace(\n sighashes,\n function (trace, ctx) {\n return handler(trace, ctx)\n },\n fetchConfig\n )\n }\n}\n"]}
@@ -85,7 +85,15 @@ ${contract.name}Processor.bind({ address: '${contract.address}', network: ${cont
85
85
  ctx.eventLogger.emit(evt.name, {
86
86
  ...evt.args.toObject(),
87
87
  })
88
- })`;
88
+ })
89
+ .onAllTraces(function (trace, ctx) {
90
+ ctx.meter.Counter('trace_count').add(1, { name: trace.name })
91
+ ctx.eventLogger.emit(trace.name, {
92
+ distinctId: trace.action.from,
93
+ ...trace.args.toObject(),
94
+ })
95
+ })
96
+ `;
89
97
  exampleContent += content;
90
98
  }
91
99
  files.push({
@@ -1 +1 @@
1
- {"version":3,"file":"ethers-sentio.js","sourceRoot":"","sources":["../../../src/eth/codegen/ethers-sentio.ts"],"names":[],"mappings":"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","sourcesContent":["import Ethers from '@sentio/ethers-v6'\nimport {\n Config,\n extractAbi,\n extractDocumentation,\n FileDescription,\n parse,\n shortenFullJsonFilePath,\n Contract,\n} from 'typechain'\nimport { dirname, join, relative } from 'path'\nimport { codeGenIndex, codeGenSentioFile, codeGenTestUtilsFile } from './file.js'\nimport { YamlContractConfig } from '../../core/yaml-contract-config.js'\n\nexport interface SentioEthersConfig extends Config {\n contractsToGenExample: YamlContractConfig[]\n}\n\nexport default class EthersSentio extends Ethers.default {\n constructor(config: SentioEthersConfig) {\n if (!config.outDir) {\n throw new Error('Out put path not specificed')\n }\n super(config)\n }\n\n private processedABIs: Contract[] = []\n\n // TODO(pc): also have to override transformBinFile, transformFile\n override transformAbiOrFullJsonFile(file: FileDescription): FileDescription[] | void {\n const abi = extractAbi(file.contents)\n if (abi.length === 0) {\n return\n }\n\n const documentation = extractDocumentation(file.contents)\n\n const jsonPath = relative(this.cfg.inputDir, shortenFullJsonFilePath(file.path, this.cfg.allFiles))\n const contract = parse(abi, jsonPath, documentation)\n const files = super.transformAbiOrFullJsonFile(file)\n this.processedABIs.push(contract)\n\n if (files !== undefined) {\n // files.forEach(this.transformFilePath)\n // for (const file of files) {\n // this.transformFilePath(file)\n // }\n\n return [\n ...files,\n {\n path: join(dirname(files[0].path), `${contract.name.toLowerCase()}-processor.ts`),\n contents: codeGenSentioFile(contract),\n },\n {\n path: join(dirname(files[0].path), '..', `${contract.name.toLowerCase()}.ts`),\n contents: codeGenIndex(contract),\n },\n {\n path: join(dirname(files[0].path), `${contract.name.toLowerCase()}-test-utils.ts`),\n contents: codeGenTestUtilsFile(contract),\n },\n ]\n }\n }\n\n override afterRun() {\n const files = super.afterRun()\n for (const [idx, file] of files.entries()) {\n if (file.path.endsWith('__factory.ts')) {\n file.contents = '// @ts-nocheck\\n' + file.contents\n } else if (file.path.endsWith('factories/index.ts')) {\n file.contents = file.contents.replaceAll(\"__factory'\", \"__factory.js'\")\n } else if (file.path.endsWith('_processor.ts')) {\n }\n }\n let indexContent = ''\n for (const contract of this.processedABIs) {\n const content = `\n export * as ${contract.name.toLowerCase().replaceAll('-', '_')} from './${contract.name.toLowerCase()}.js'\n export { ${contract.name}Processor, ${\n contract.name\n }ProcessorTemplate } from './${contract.name.toLowerCase()}.js'\n `\n indexContent += content\n }\n files.push({\n path: join(dirname(files[0].path), '../index.ts'),\n contents: indexContent,\n })\n\n const rootDir = join(dirname(files[0].path), '../../..')\n\n const contractsToGenExample = (this.cfg as SentioEthersConfig).contractsToGenExample\n if (contractsToGenExample.length > 0) {\n const processors = this.processedABIs.map((abi) => `${abi.name}Processor`).join(',')\n let exampleContent = `import { ${processors} } from './types/eth/index.js'`\n\n for (const contract of contractsToGenExample) {\n const chainId = parseInt(contract.chain)\n if (isNaN(chainId) || !isFinite(chainId)) {\n continue\n }\n\n const content = `\n\n${contract.name}Processor.bind({ address: '${contract.address}', network: ${contract.chain} })\n .onAllEvents((evt, ctx) => {\n ctx.meter.Counter('event_count').add(1, { name: evt.name })\n ctx.eventLogger.emit(evt.name, {\n ...evt.args.toObject(),\n })\n})`\n exampleContent += content\n }\n\n files.push({\n path: join(rootDir, 'processor.eth.example.ts'),\n contents: exampleContent,\n })\n }\n return files\n }\n}\n"]}
1
+ {"version":3,"file":"ethers-sentio.js","sourceRoot":"","sources":["../../../src/eth/codegen/ethers-sentio.ts"],"names":[],"mappings":"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","sourcesContent":["import Ethers from '@sentio/ethers-v6'\nimport {\n Config,\n extractAbi,\n extractDocumentation,\n FileDescription,\n parse,\n shortenFullJsonFilePath,\n Contract,\n} from 'typechain'\nimport { dirname, join, relative } from 'path'\nimport { codeGenIndex, codeGenSentioFile, codeGenTestUtilsFile } from './file.js'\nimport { YamlContractConfig } from '../../core/yaml-contract-config.js'\n\nexport interface SentioEthersConfig extends Config {\n contractsToGenExample: YamlContractConfig[]\n}\n\nexport default class EthersSentio extends Ethers.default {\n constructor(config: SentioEthersConfig) {\n if (!config.outDir) {\n throw new Error('Out put path not specificed')\n }\n super(config)\n }\n\n private processedABIs: Contract[] = []\n\n // TODO(pc): also have to override transformBinFile, transformFile\n override transformAbiOrFullJsonFile(file: FileDescription): FileDescription[] | void {\n const abi = extractAbi(file.contents)\n if (abi.length === 0) {\n return\n }\n\n const documentation = extractDocumentation(file.contents)\n\n const jsonPath = relative(this.cfg.inputDir, shortenFullJsonFilePath(file.path, this.cfg.allFiles))\n const contract = parse(abi, jsonPath, documentation)\n const files = super.transformAbiOrFullJsonFile(file)\n this.processedABIs.push(contract)\n\n if (files !== undefined) {\n // files.forEach(this.transformFilePath)\n // for (const file of files) {\n // this.transformFilePath(file)\n // }\n\n return [\n ...files,\n {\n path: join(dirname(files[0].path), `${contract.name.toLowerCase()}-processor.ts`),\n contents: codeGenSentioFile(contract),\n },\n {\n path: join(dirname(files[0].path), '..', `${contract.name.toLowerCase()}.ts`),\n contents: codeGenIndex(contract),\n },\n {\n path: join(dirname(files[0].path), `${contract.name.toLowerCase()}-test-utils.ts`),\n contents: codeGenTestUtilsFile(contract),\n },\n ]\n }\n }\n\n override afterRun() {\n const files = super.afterRun()\n for (const [idx, file] of files.entries()) {\n if (file.path.endsWith('__factory.ts')) {\n file.contents = '// @ts-nocheck\\n' + file.contents\n } else if (file.path.endsWith('factories/index.ts')) {\n file.contents = file.contents.replaceAll(\"__factory'\", \"__factory.js'\")\n } else if (file.path.endsWith('_processor.ts')) {\n }\n }\n let indexContent = ''\n for (const contract of this.processedABIs) {\n const content = `\n export * as ${contract.name.toLowerCase().replaceAll('-', '_')} from './${contract.name.toLowerCase()}.js'\n export { ${contract.name}Processor, ${\n contract.name\n }ProcessorTemplate } from './${contract.name.toLowerCase()}.js'\n `\n indexContent += content\n }\n files.push({\n path: join(dirname(files[0].path), '../index.ts'),\n contents: indexContent,\n })\n\n const rootDir = join(dirname(files[0].path), '../../..')\n\n const contractsToGenExample = (this.cfg as SentioEthersConfig).contractsToGenExample\n if (contractsToGenExample.length > 0) {\n const processors = this.processedABIs.map((abi) => `${abi.name}Processor`).join(',')\n let exampleContent = `import { ${processors} } from './types/eth/index.js'`\n\n for (const contract of contractsToGenExample) {\n const chainId = parseInt(contract.chain)\n if (isNaN(chainId) || !isFinite(chainId)) {\n continue\n }\n\n const content = `\n\n${contract.name}Processor.bind({ address: '${contract.address}', network: ${contract.chain} })\n .onAllEvents((evt, ctx) => {\n ctx.meter.Counter('event_count').add(1, { name: evt.name })\n ctx.eventLogger.emit(evt.name, {\n ...evt.args.toObject(),\n })\n})\n .onAllTraces(function (trace, ctx) {\n ctx.meter.Counter('trace_count').add(1, { name: trace.name })\n ctx.eventLogger.emit(trace.name, {\n distinctId: trace.action.from,\n ...trace.args.toObject(),\n })\n })\n`\n exampleContent += content\n }\n\n files.push({\n path: join(rootDir, 'processor.eth.example.ts'),\n contents: exampleContent,\n })\n }\n return files\n }\n}\n"]}
@@ -28,7 +28,6 @@ function codegenCallTraceType(fn, overloadedName) {
28
28
  }
29
29
  function generateCallHandler(fn, contractName, overloadedName) {
30
30
  const signature = getSignatureForFn(fn);
31
- // utils.toUtf8Bytes(signature))
32
31
  const test = new TextEncoder().encode(signature);
33
32
  const sighash = '0x' + sha3.keccak_256(test).substring(0, 8);
34
33
  return `
@@ -1 +1 @@
1
- {"version":3,"file":"functions-handler.js","sourceRoot":"","sources":["../../../src/eth/codegen/functions-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,yCAAyC,CAAA;AAChD,OAAO,IAAI,MAAM,SAAS,CAAA;AAC1B,OAAO,EAAuB,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClE,OAAO,EAAE,mCAAmC,EAAE,MAAM,YAAY,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,MAAM,UAAU,oBAAoB,CAAC,GAA0B,EAAE,YAAoB;IACnF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;QACpB,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAA;KACjD;IAED,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,mCAAmC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACnH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAA0B;IAC9D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;QACpB,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;KACpC;IAED,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,mCAAmC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACtG,CAAC;AAED,SAAS,oBAAoB,CAAC,EAAuB,EAAE,cAAuB;IAC5E,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;IAExD,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAChH,MAAM,WAAW,GAAG,gCAAgC,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;IACtF,MAAM,YAAY,GAAG,kCAAkC,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAA;IAEjG,OAAO;qBACY,UAAU,cAAc,YAAY;;gBAEzC,UAAU,8BAA8B,WAAW,KAAK,UAAU;GAC/E,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAuB,EAAE,YAAoB,EAAE,cAAuB;IACjG,MAAM,SAAS,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAA;IACvC,gCAAgC;IAEhC,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAChD,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAE5D,OAAO;UACC,UAAU,CAAC,cAAc,IAAI,EAAE,CAAC,IAAI,CAAC;sBACzB,UAAU,CAAC,cAAc,IAAI,EAAE,CAAC,IAAI,CAAC,mBAAmB,YAAY;;;4BAG9D,OAAO;;CAElC,CAAA;AACD,CAAC","sourcesContent":["import {\n generateOutputComplexTypeAsArray,\n generateOutputComplexTypesAsObject,\n} from '@sentio/ethers-v6/dist/codegen/types.js'\nimport sha3 from 'js-sha3'\nimport { FunctionDeclaration, getSignatureForFn } from 'typechain'\nimport { getFullSignatureAsSymbolForFunction } from './types.js'\nimport { upperFirst } from 'lodash-es'\n\nexport function generateCallHandlers(fns: FunctionDeclaration[], contractName: string): string {\n if (fns.length === 1) {\n return generateCallHandler(fns[0], contractName)\n }\n\n return fns.map((fn) => generateCallHandler(fn, contractName, getFullSignatureAsSymbolForFunction(fn))).join('\\n')\n}\n\nexport function codegenCallTraceTypes(fns: FunctionDeclaration[]): string {\n if (fns.length === 1) {\n return codegenCallTraceType(fns[0])\n }\n\n return fns.map((fn) => codegenCallTraceType(fn, getFullSignatureAsSymbolForFunction(fn))).join('\\n')\n}\n\nfunction codegenCallTraceType(fn: FunctionDeclaration, overloadedName?: string): string {\n const identifier = upperFirst(overloadedName ?? fn.name)\n\n const components = fn.inputs.map((input, i) => ({ name: input.name ?? `arg${i.toString()}`, type: input.type }))\n const arrayOutput = generateOutputComplexTypeAsArray(components, { useStructs: true })\n const objectOutput = generateOutputComplexTypesAsObject(components, { useStructs: true }) || '{}'\n\n return `\n export interface ${identifier}CallObject ${objectOutput}\n \n export type ${identifier}CallTrace = TypedCallTrace<${arrayOutput}, ${identifier}CallObject> & Trace\n `\n}\n\nfunction generateCallHandler(fn: FunctionDeclaration, contractName: string, overloadedName?: string): string {\n const signature = getSignatureForFn(fn)\n // utils.toUtf8Bytes(signature))\n\n const test = new TextEncoder().encode(signature)\n const sighash = '0x' + sha3.keccak_256(test).substring(0, 8)\n\n return `\n onCall${upperFirst(overloadedName ?? fn.name)}(\n handler: (call: ${upperFirst(overloadedName ?? fn.name)}CallTrace, ctx: ${contractName}Context) => void,\n fetchConfig?: Partial<EthFetchConfig>\n ): this {\n return super.onTrace(\"${sighash}\", handler, fetchConfig);\n }\n`\n}\n"]}
1
+ {"version":3,"file":"functions-handler.js","sourceRoot":"","sources":["../../../src/eth/codegen/functions-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,yCAAyC,CAAA;AAChD,OAAO,IAAI,MAAM,SAAS,CAAA;AAC1B,OAAO,EAAuB,iBAAiB,EAAE,MAAM,WAAW,CAAA;AAClE,OAAO,EAAE,mCAAmC,EAAE,MAAM,YAAY,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAA;AAEtC,MAAM,UAAU,oBAAoB,CAAC,GAA0B,EAAE,YAAoB;IACnF,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;QACpB,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAA;KACjD;IAED,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,EAAE,EAAE,YAAY,EAAE,mCAAmC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACnH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAA0B;IAC9D,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE;QACpB,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;KACpC;IAED,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,EAAE,mCAAmC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACtG,CAAC;AAED,SAAS,oBAAoB,CAAC,EAAuB,EAAE,cAAuB;IAC5E,MAAM,UAAU,GAAG,UAAU,CAAC,cAAc,IAAI,EAAE,CAAC,IAAI,CAAC,CAAA;IAExD,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;IAChH,MAAM,WAAW,GAAG,gCAAgC,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;IACtF,MAAM,YAAY,GAAG,kCAAkC,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,IAAI,IAAI,CAAA;IAEjG,OAAO;qBACY,UAAU,cAAc,YAAY;;gBAEzC,UAAU,8BAA8B,WAAW,KAAK,UAAU;GAC/E,CAAA;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,EAAuB,EAAE,YAAoB,EAAE,cAAuB;IACjG,MAAM,SAAS,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAChD,MAAM,OAAO,GAAG,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;IAE5D,OAAO;UACC,UAAU,CAAC,cAAc,IAAI,EAAE,CAAC,IAAI,CAAC;sBACzB,UAAU,CAAC,cAAc,IAAI,EAAE,CAAC,IAAI,CAAC,mBAAmB,YAAY;;;4BAG9D,OAAO;;CAElC,CAAA;AACD,CAAC","sourcesContent":["import {\n generateOutputComplexTypeAsArray,\n generateOutputComplexTypesAsObject,\n} from '@sentio/ethers-v6/dist/codegen/types.js'\nimport sha3 from 'js-sha3'\nimport { FunctionDeclaration, getSignatureForFn } from 'typechain'\nimport { getFullSignatureAsSymbolForFunction } from './types.js'\nimport { upperFirst } from 'lodash-es'\n\nexport function generateCallHandlers(fns: FunctionDeclaration[], contractName: string): string {\n if (fns.length === 1) {\n return generateCallHandler(fns[0], contractName)\n }\n\n return fns.map((fn) => generateCallHandler(fn, contractName, getFullSignatureAsSymbolForFunction(fn))).join('\\n')\n}\n\nexport function codegenCallTraceTypes(fns: FunctionDeclaration[]): string {\n if (fns.length === 1) {\n return codegenCallTraceType(fns[0])\n }\n\n return fns.map((fn) => codegenCallTraceType(fn, getFullSignatureAsSymbolForFunction(fn))).join('\\n')\n}\n\nfunction codegenCallTraceType(fn: FunctionDeclaration, overloadedName?: string): string {\n const identifier = upperFirst(overloadedName ?? fn.name)\n\n const components = fn.inputs.map((input, i) => ({ name: input.name ?? `arg${i.toString()}`, type: input.type }))\n const arrayOutput = generateOutputComplexTypeAsArray(components, { useStructs: true })\n const objectOutput = generateOutputComplexTypesAsObject(components, { useStructs: true }) || '{}'\n\n return `\n export interface ${identifier}CallObject ${objectOutput}\n \n export type ${identifier}CallTrace = TypedCallTrace<${arrayOutput}, ${identifier}CallObject> & Trace\n `\n}\n\nfunction generateCallHandler(fn: FunctionDeclaration, contractName: string, overloadedName?: string): string {\n const signature = getSignatureForFn(fn)\n const test = new TextEncoder().encode(signature)\n const sighash = '0x' + sha3.keccak_256(test).substring(0, 8)\n\n return `\n onCall${upperFirst(overloadedName ?? fn.name)}(\n handler: (call: ${upperFirst(overloadedName ?? fn.name)}CallTrace, ctx: ${contractName}Context) => void,\n fetchConfig?: Partial<EthFetchConfig>\n ): this {\n return super.onTrace(\"${sighash}\", handler, fetchConfig);\n }\n`\n}\n"]}
@@ -43,11 +43,13 @@ export class EthPlugin extends Plugin {
43
43
  // Step 2. Prepare all trace handlers
44
44
  for (const traceHandler of processor.traceHandlers) {
45
45
  const handlerId = this.traceHandlers.push(traceHandler.handler) - 1;
46
- contractConfig.traceConfigs.push({
47
- signature: traceHandler.signature,
48
- handlerId: handlerId,
49
- fetchConfig: traceHandler.fetchConfig,
50
- });
46
+ for (const signature of traceHandler.signatures) {
47
+ contractConfig.traceConfigs.push({
48
+ signature: signature,
49
+ handlerId: handlerId,
50
+ fetchConfig: traceHandler.fetchConfig,
51
+ });
52
+ }
51
53
  }
52
54
  // Step 3. Prepare all the event handlers
53
55
  for (const eventsHandler of processor.eventHandlers) {
@@ -1 +1 @@
1
- {"version":3,"file":"eth-plugin.js","sourceRoot":"","sources":["../../src/eth/eth-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["import { Plugin, PluginManager, errorString, mergeProcessResults, USER_PROCESSOR } from '@sentio/runtime'\nimport {\n AccountConfig,\n ContractConfig,\n Data_EthBlock,\n Data_EthLog,\n Data_EthTrace,\n DataBinding,\n HandlerType,\n LogFilter,\n LogHandlerConfig,\n ProcessConfigResponse,\n ProcessResult,\n StartRequest,\n} from '@sentio/protos'\n\nimport { ServerError, Status } from 'nice-grpc'\nimport { ProcessorState } from './binds.js'\nimport { AccountProcessorState } from './account-processor-state.js'\nimport { ProcessorTemplateProcessorState, TemplateInstanceState } from './base-processor-template.js'\n\nexport class EthPlugin extends Plugin {\n name: string = 'EthPlugin'\n\n private eventHandlers: ((event: Data_EthLog) => Promise<ProcessResult>)[] = []\n private traceHandlers: ((trace: Data_EthTrace) => Promise<ProcessResult>)[] = []\n private blockHandlers: ((block: Data_EthBlock) => Promise<ProcessResult>)[] = []\n\n async configure(config: ProcessConfigResponse) {\n // This syntax is to copy values instead of using references\n config.templateInstances = [...TemplateInstanceState.INSTANCE.getValues()]\n\n for (const processor of ProcessorState.INSTANCE.getValues()) {\n // If server favor incremental update this need to change\n // Start basic config for contract\n const chainId = processor.getChainId()\n // this.processorsByChainId.set(chainId, processor)\n\n const contractConfig = ContractConfig.fromPartial({\n processorType: USER_PROCESSOR,\n contract: {\n name: processor.config.name,\n chainId: chainId.toString(),\n address: processor.config.address,\n abi: '',\n },\n startBlock: processor.config.startBlock,\n endBlock: processor.config.endBlock,\n })\n\n // Step 1. Prepare all the block handlers\n for (const blockHandler of processor.blockHandlers) {\n const handlerId = this.blockHandlers.push(blockHandler.handler) - 1\n // TODO wrap the block handler into one\n\n contractConfig.intervalConfigs.push({\n slot: 0,\n slotInterval: blockHandler.blockInterval,\n minutes: 0,\n minutesInterval: blockHandler.timeIntervalInMinutes,\n handlerId: handlerId,\n })\n }\n\n // Step 2. Prepare all trace handlers\n for (const traceHandler of processor.traceHandlers) {\n const handlerId = this.traceHandlers.push(traceHandler.handler) - 1\n contractConfig.traceConfigs.push({\n signature: traceHandler.signature,\n handlerId: handlerId,\n fetchConfig: traceHandler.fetchConfig,\n })\n }\n\n // Step 3. Prepare all the event handlers\n for (const eventsHandler of processor.eventHandlers) {\n // associate id with filter\n const handlerId = this.eventHandlers.push(eventsHandler.handler) - 1\n const logConfig: LogHandlerConfig = {\n handlerId: handlerId,\n filters: [],\n fetchConfig: eventsHandler.fetchConfig,\n }\n\n for (const filter of eventsHandler.filters) {\n const topics = await filter.getTopicFilter()\n\n // if (!filter.topics) {\n // throw new ServerError(Status.INVALID_ARGUMENT, 'Topic should not be null')\n // }\n const logFilter: LogFilter = {\n addressType: undefined,\n address: contractConfig.contract?.address,\n topics: [],\n }\n\n for (const ts of topics) {\n let hashes: string[] = []\n if (Array.isArray(ts)) {\n hashes = hashes.concat(ts)\n } else if (ts) {\n hashes.push(ts)\n }\n logFilter.topics.push({ hashes: hashes })\n }\n logConfig.filters.push(logFilter)\n }\n contractConfig.logConfigs.push(logConfig)\n }\n\n // Finish up a contract\n config.contractConfigs.push(contractConfig)\n }\n\n // part 1.b prepare EVM account processors\n for (const processor of AccountProcessorState.INSTANCE.getValues()) {\n const accountConfig = AccountConfig.fromPartial({\n address: processor.config.address,\n chainId: processor.getChainId().toString(),\n startBlock: processor.config.startBlock ? BigInt(processor.config.startBlock) : 0n,\n })\n // TODO add interval\n for (const eventsHandler of processor.eventHandlers) {\n // associate id with filter\n const handlerId = this.eventHandlers.push(eventsHandler.handler) - 1\n const logConfig: LogHandlerConfig = {\n handlerId: handlerId,\n filters: [],\n fetchConfig: eventsHandler.fetchConfig,\n }\n\n for (const filter of eventsHandler.filters) {\n const topics = await filter.getTopicFilter()\n // if (!filter.topics) {\n // throw new ServerError(Status.INVALID_ARGUMENT, 'Topic should not be null')\n // }\n let address = undefined\n if (filter.address) {\n address = filter.address.toString()\n }\n const logFilter: LogFilter = {\n addressType: filter.addressType,\n address,\n topics: [],\n }\n\n for (const ts of topics) {\n let hashes: string[] = []\n if (Array.isArray(ts)) {\n hashes = hashes.concat(ts)\n } else if (ts) {\n hashes.push(ts)\n }\n logFilter.topics.push({ hashes: hashes })\n }\n logConfig.filters.push(logFilter)\n }\n accountConfig.logConfigs.push(logConfig)\n }\n\n config.accountConfigs.push(accountConfig)\n }\n }\n\n supportedHandlers = [HandlerType.ETH_LOG, HandlerType.ETH_BLOCK, HandlerType.ETH_TRACE]\n\n processBinding(request: DataBinding): Promise<ProcessResult> {\n // return Promise.resolve(undefined);\n switch (request.handlerType) {\n case HandlerType.ETH_LOG:\n return this.processLog(request)\n case HandlerType.ETH_TRACE:\n return this.processTrace(request)\n case HandlerType.ETH_BLOCK:\n return this.processBlock(request)\n default:\n throw new ServerError(Status.INVALID_ARGUMENT, 'No handle type registered ' + request.handlerType)\n }\n }\n\n async start(request: StartRequest) {\n for (const instance of request.templateInstances) {\n const template = ProcessorTemplateProcessorState.INSTANCE.getValues()[instance.templateId]\n if (!template) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Invalid template contract:' + instance)\n }\n if (!instance.contract) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Contract Empty from:' + instance)\n }\n template.bind({\n name: instance.contract.name,\n address: instance.contract.address,\n network: Number(instance.contract.chainId),\n startBlock: instance.startBlock,\n endBlock: instance.endBlock,\n })\n }\n }\n\n stateDiff(config: ProcessConfigResponse): boolean {\n return TemplateInstanceState.INSTANCE.getValues().length !== config.templateInstances.length\n }\n\n async processLog(request: DataBinding): Promise<ProcessResult> {\n if (!request.data?.ethLog?.log) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"Log can't be null\")\n }\n const ethLog = request.data.ethLog\n\n const promises: Promise<ProcessResult>[] = []\n for (const handlerId of request.handlerIds) {\n const handler = this.eventHandlers[handlerId]\n promises.push(\n handler(ethLog).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing log: ' + JSON.stringify(ethLog.log) + '\\n' + errorString(e)\n )\n })\n )\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n\n async processTrace(binding: DataBinding): Promise<ProcessResult> {\n if (!binding.data?.ethTrace?.trace) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"Trace can't be null\")\n }\n const ethTrace = binding.data.ethTrace\n\n const promises: Promise<ProcessResult>[] = []\n\n for (const handlerId of binding.handlerIds) {\n promises.push(\n this.traceHandlers[handlerId](ethTrace).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing trace: ' + JSON.stringify(ethTrace.trace) + '\\n' + errorString(e)\n )\n })\n )\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n\n async processBlock(binding: DataBinding): Promise<ProcessResult> {\n if (!binding.data?.ethBlock?.block) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"Block can't be empty\")\n }\n const ethBlock = binding.data.ethBlock\n\n const promises: Promise<ProcessResult>[] = []\n for (const handlerId of binding.handlerIds) {\n promises.push(\n this.blockHandlers[handlerId](ethBlock).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing block: ' + ethBlock.block?.number + '\\n' + errorString(e)\n )\n })\n )\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n}\n\nPluginManager.INSTANCE.register(new EthPlugin())\n"]}
1
+ {"version":3,"file":"eth-plugin.js","sourceRoot":"","sources":["../../src/eth/eth-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,WAAW,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACzG,OAAO,EACL,aAAa,EACb,cAAc,EAKd,WAAW,GAMZ,MAAM,gBAAgB,CAAA;AAEvB,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,EAAE,+BAA+B,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAErG,MAAM,OAAO,SAAU,SAAQ,MAAM;IACnC,IAAI,GAAW,WAAW,CAAA;IAElB,aAAa,GAAuD,EAAE,CAAA;IACtE,aAAa,GAAyD,EAAE,CAAA;IACxE,aAAa,GAAyD,EAAE,CAAA;IAEhF,KAAK,CAAC,SAAS,CAAC,MAA6B;QAC3C,4DAA4D;QAC5D,MAAM,CAAC,iBAAiB,GAAG,CAAC,GAAG,qBAAqB,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAA;QAE1E,KAAK,MAAM,SAAS,IAAI,cAAc,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE;YAC3D,yDAAyD;YACzD,kCAAkC;YAClC,MAAM,OAAO,GAAG,SAAS,CAAC,UAAU,EAAE,CAAA;YACtC,mDAAmD;YAEnD,MAAM,cAAc,GAAG,cAAc,CAAC,WAAW,CAAC;gBAChD,aAAa,EAAE,cAAc;gBAC7B,QAAQ,EAAE;oBACR,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,IAAI;oBAC3B,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;oBAC3B,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO;oBACjC,GAAG,EAAE,EAAE;iBACR;gBACD,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU;gBACvC,QAAQ,EAAE,SAAS,CAAC,MAAM,CAAC,QAAQ;aACpC,CAAC,CAAA;YAEF,yCAAyC;YACzC,KAAK,MAAM,YAAY,IAAI,SAAS,CAAC,aAAa,EAAE;gBAClD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBACnE,uCAAuC;gBAEvC,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC;oBAClC,IAAI,EAAE,CAAC;oBACP,YAAY,EAAE,YAAY,CAAC,aAAa;oBACxC,OAAO,EAAE,CAAC;oBACV,eAAe,EAAE,YAAY,CAAC,qBAAqB;oBACnD,SAAS,EAAE,SAAS;iBACrB,CAAC,CAAA;aACH;YAED,qCAAqC;YACrC,KAAK,MAAM,YAAY,IAAI,SAAS,CAAC,aAAa,EAAE;gBAClD,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBACnE,KAAK,MAAM,SAAS,IAAI,YAAY,CAAC,UAAU,EAAE;oBAC/C,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC;wBAC/B,SAAS,EAAE,SAAS;wBACpB,SAAS,EAAE,SAAS;wBACpB,WAAW,EAAE,YAAY,CAAC,WAAW;qBACtC,CAAC,CAAA;iBACH;aACF;YAED,yCAAyC;YACzC,KAAK,MAAM,aAAa,IAAI,SAAS,CAAC,aAAa,EAAE;gBACnD,2BAA2B;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBACpE,MAAM,SAAS,GAAqB;oBAClC,SAAS,EAAE,SAAS;oBACpB,OAAO,EAAE,EAAE;oBACX,WAAW,EAAE,aAAa,CAAC,WAAW;iBACvC,CAAA;gBAED,KAAK,MAAM,MAAM,IAAI,aAAa,CAAC,OAAO,EAAE;oBAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAA;oBAE5C,wBAAwB;oBACxB,+EAA+E;oBAC/E,IAAI;oBACJ,MAAM,SAAS,GAAc;wBAC3B,WAAW,EAAE,SAAS;wBACtB,OAAO,EAAE,cAAc,CAAC,QAAQ,EAAE,OAAO;wBACzC,MAAM,EAAE,EAAE;qBACX,CAAA;oBAED,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE;wBACvB,IAAI,MAAM,GAAa,EAAE,CAAA;wBACzB,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;4BACrB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;yBAC3B;6BAAM,IAAI,EAAE,EAAE;4BACb,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;yBAChB;wBACD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;qBAC1C;oBACD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;iBAClC;gBACD,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;aAC1C;YAED,uBAAuB;YACvB,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;SAC5C;QAED,0CAA0C;QAC1C,KAAK,MAAM,SAAS,IAAI,qBAAqB,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE;YAClE,MAAM,aAAa,GAAG,aAAa,CAAC,WAAW,CAAC;gBAC9C,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO;gBACjC,OAAO,EAAE,SAAS,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE;gBAC1C,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE;aACnF,CAAC,CAAA;YACF,oBAAoB;YACpB,KAAK,MAAM,aAAa,IAAI,SAAS,CAAC,aAAa,EAAE;gBACnD,2BAA2B;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBACpE,MAAM,SAAS,GAAqB;oBAClC,SAAS,EAAE,SAAS;oBACpB,OAAO,EAAE,EAAE;oBACX,WAAW,EAAE,aAAa,CAAC,WAAW;iBACvC,CAAA;gBAED,KAAK,MAAM,MAAM,IAAI,aAAa,CAAC,OAAO,EAAE;oBAC1C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,EAAE,CAAA;oBAC5C,wBAAwB;oBACxB,+EAA+E;oBAC/E,IAAI;oBACJ,IAAI,OAAO,GAAG,SAAS,CAAA;oBACvB,IAAI,MAAM,CAAC,OAAO,EAAE;wBAClB,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA;qBACpC;oBACD,MAAM,SAAS,GAAc;wBAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;wBAC/B,OAAO;wBACP,MAAM,EAAE,EAAE;qBACX,CAAA;oBAED,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE;wBACvB,IAAI,MAAM,GAAa,EAAE,CAAA;wBACzB,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;4BACrB,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;yBAC3B;6BAAM,IAAI,EAAE,EAAE;4BACb,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;yBAChB;wBACD,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;qBAC1C;oBACD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;iBAClC;gBACD,aAAa,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;aACzC;YAED,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;SAC1C;IACH,CAAC;IAED,iBAAiB,GAAG,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC,CAAA;IAEvF,cAAc,CAAC,OAAoB;QACjC,qCAAqC;QACrC,QAAQ,OAAO,CAAC,WAAW,EAAE;YAC3B,KAAK,WAAW,CAAC,OAAO;gBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;YACjC,KAAK,WAAW,CAAC,SAAS;gBACxB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;YACnC,KAAK,WAAW,CAAC,SAAS;gBACxB,OAAO,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;YACnC;gBACE,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,gBAAgB,EAAE,4BAA4B,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;SACrG;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAqB;QAC/B,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE;YAChD,MAAM,QAAQ,GAAG,+BAA+B,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;YAC1F,IAAI,CAAC,QAAQ,EAAE;gBACb,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,gBAAgB,EAAE,4BAA4B,GAAG,QAAQ,CAAC,CAAA;aACxF;YACD,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;gBACtB,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,QAAQ,CAAC,CAAA;aAClF;YACD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;gBAC5B,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO;gBAClC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC1C,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,QAAQ,EAAE,QAAQ,CAAC,QAAQ;aAC5B,CAAC,CAAA;SACH;IACH,CAAC;IAED,SAAS,CAAC,MAA6B;QACrC,OAAO,qBAAqB,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,MAAM,KAAK,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAA;IAC9F,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAoB;QACnC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE;YAC9B,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,CAAA;SACpE;QACD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAA;QAElC,MAAM,QAAQ,GAA6B,EAAE,CAAA;QAC7C,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE;YAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAA;YAC7C,QAAQ,CAAC,IAAI,CACX,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC1B,MAAM,IAAI,WAAW,CACnB,MAAM,CAAC,QAAQ,EACf,wBAAwB,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAC9E,CAAA;YACH,CAAC,CAAC,CACH,CAAA;SACF;QACD,OAAO,mBAAmB,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IACzD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAoB;QACrC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;YAClC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,CAAA;SACtE;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAA;QAEtC,MAAM,QAAQ,GAA6B,EAAE,CAAA;QAE7C,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE;YAC1C,QAAQ,CAAC,IAAI,CACX,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBAClD,MAAM,IAAI,WAAW,CACnB,MAAM,CAAC,QAAQ,EACf,0BAA0B,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CACpF,CAAA;YACH,CAAC,CAAC,CACH,CAAA;SACF;QACD,OAAO,mBAAmB,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IACzD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAoB;QACrC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE;YAClC,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC,CAAA;SACvE;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAA;QAEtC,MAAM,QAAQ,GAA6B,EAAE,CAAA;QAC7C,KAAK,MAAM,SAAS,IAAI,OAAO,CAAC,UAAU,EAAE;YAC1C,QAAQ,CAAC,IAAI,CACX,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBAClD,MAAM,IAAI,WAAW,CACnB,MAAM,CAAC,QAAQ,EACf,0BAA0B,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAC5E,CAAA;YACH,CAAC,CAAC,CACH,CAAA;SACF;QACD,OAAO,mBAAmB,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAA;IACzD,CAAC;CACF;AAED,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,EAAE,CAAC,CAAA","sourcesContent":["import { Plugin, PluginManager, errorString, mergeProcessResults, USER_PROCESSOR } from '@sentio/runtime'\nimport {\n AccountConfig,\n ContractConfig,\n Data_EthBlock,\n Data_EthLog,\n Data_EthTrace,\n DataBinding,\n HandlerType,\n LogFilter,\n LogHandlerConfig,\n ProcessConfigResponse,\n ProcessResult,\n StartRequest,\n} from '@sentio/protos'\n\nimport { ServerError, Status } from 'nice-grpc'\nimport { ProcessorState } from './binds.js'\nimport { AccountProcessorState } from './account-processor-state.js'\nimport { ProcessorTemplateProcessorState, TemplateInstanceState } from './base-processor-template.js'\n\nexport class EthPlugin extends Plugin {\n name: string = 'EthPlugin'\n\n private eventHandlers: ((event: Data_EthLog) => Promise<ProcessResult>)[] = []\n private traceHandlers: ((trace: Data_EthTrace) => Promise<ProcessResult>)[] = []\n private blockHandlers: ((block: Data_EthBlock) => Promise<ProcessResult>)[] = []\n\n async configure(config: ProcessConfigResponse) {\n // This syntax is to copy values instead of using references\n config.templateInstances = [...TemplateInstanceState.INSTANCE.getValues()]\n\n for (const processor of ProcessorState.INSTANCE.getValues()) {\n // If server favor incremental update this need to change\n // Start basic config for contract\n const chainId = processor.getChainId()\n // this.processorsByChainId.set(chainId, processor)\n\n const contractConfig = ContractConfig.fromPartial({\n processorType: USER_PROCESSOR,\n contract: {\n name: processor.config.name,\n chainId: chainId.toString(),\n address: processor.config.address,\n abi: '',\n },\n startBlock: processor.config.startBlock,\n endBlock: processor.config.endBlock,\n })\n\n // Step 1. Prepare all the block handlers\n for (const blockHandler of processor.blockHandlers) {\n const handlerId = this.blockHandlers.push(blockHandler.handler) - 1\n // TODO wrap the block handler into one\n\n contractConfig.intervalConfigs.push({\n slot: 0,\n slotInterval: blockHandler.blockInterval,\n minutes: 0,\n minutesInterval: blockHandler.timeIntervalInMinutes,\n handlerId: handlerId,\n })\n }\n\n // Step 2. Prepare all trace handlers\n for (const traceHandler of processor.traceHandlers) {\n const handlerId = this.traceHandlers.push(traceHandler.handler) - 1\n for (const signature of traceHandler.signatures) {\n contractConfig.traceConfigs.push({\n signature: signature,\n handlerId: handlerId,\n fetchConfig: traceHandler.fetchConfig,\n })\n }\n }\n\n // Step 3. Prepare all the event handlers\n for (const eventsHandler of processor.eventHandlers) {\n // associate id with filter\n const handlerId = this.eventHandlers.push(eventsHandler.handler) - 1\n const logConfig: LogHandlerConfig = {\n handlerId: handlerId,\n filters: [],\n fetchConfig: eventsHandler.fetchConfig,\n }\n\n for (const filter of eventsHandler.filters) {\n const topics = await filter.getTopicFilter()\n\n // if (!filter.topics) {\n // throw new ServerError(Status.INVALID_ARGUMENT, 'Topic should not be null')\n // }\n const logFilter: LogFilter = {\n addressType: undefined,\n address: contractConfig.contract?.address,\n topics: [],\n }\n\n for (const ts of topics) {\n let hashes: string[] = []\n if (Array.isArray(ts)) {\n hashes = hashes.concat(ts)\n } else if (ts) {\n hashes.push(ts)\n }\n logFilter.topics.push({ hashes: hashes })\n }\n logConfig.filters.push(logFilter)\n }\n contractConfig.logConfigs.push(logConfig)\n }\n\n // Finish up a contract\n config.contractConfigs.push(contractConfig)\n }\n\n // part 1.b prepare EVM account processors\n for (const processor of AccountProcessorState.INSTANCE.getValues()) {\n const accountConfig = AccountConfig.fromPartial({\n address: processor.config.address,\n chainId: processor.getChainId().toString(),\n startBlock: processor.config.startBlock ? BigInt(processor.config.startBlock) : 0n,\n })\n // TODO add interval\n for (const eventsHandler of processor.eventHandlers) {\n // associate id with filter\n const handlerId = this.eventHandlers.push(eventsHandler.handler) - 1\n const logConfig: LogHandlerConfig = {\n handlerId: handlerId,\n filters: [],\n fetchConfig: eventsHandler.fetchConfig,\n }\n\n for (const filter of eventsHandler.filters) {\n const topics = await filter.getTopicFilter()\n // if (!filter.topics) {\n // throw new ServerError(Status.INVALID_ARGUMENT, 'Topic should not be null')\n // }\n let address = undefined\n if (filter.address) {\n address = filter.address.toString()\n }\n const logFilter: LogFilter = {\n addressType: filter.addressType,\n address,\n topics: [],\n }\n\n for (const ts of topics) {\n let hashes: string[] = []\n if (Array.isArray(ts)) {\n hashes = hashes.concat(ts)\n } else if (ts) {\n hashes.push(ts)\n }\n logFilter.topics.push({ hashes: hashes })\n }\n logConfig.filters.push(logFilter)\n }\n accountConfig.logConfigs.push(logConfig)\n }\n\n config.accountConfigs.push(accountConfig)\n }\n }\n\n supportedHandlers = [HandlerType.ETH_LOG, HandlerType.ETH_BLOCK, HandlerType.ETH_TRACE]\n\n processBinding(request: DataBinding): Promise<ProcessResult> {\n // return Promise.resolve(undefined);\n switch (request.handlerType) {\n case HandlerType.ETH_LOG:\n return this.processLog(request)\n case HandlerType.ETH_TRACE:\n return this.processTrace(request)\n case HandlerType.ETH_BLOCK:\n return this.processBlock(request)\n default:\n throw new ServerError(Status.INVALID_ARGUMENT, 'No handle type registered ' + request.handlerType)\n }\n }\n\n async start(request: StartRequest) {\n for (const instance of request.templateInstances) {\n const template = ProcessorTemplateProcessorState.INSTANCE.getValues()[instance.templateId]\n if (!template) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Invalid template contract:' + instance)\n }\n if (!instance.contract) {\n throw new ServerError(Status.INVALID_ARGUMENT, 'Contract Empty from:' + instance)\n }\n template.bind({\n name: instance.contract.name,\n address: instance.contract.address,\n network: Number(instance.contract.chainId),\n startBlock: instance.startBlock,\n endBlock: instance.endBlock,\n })\n }\n }\n\n stateDiff(config: ProcessConfigResponse): boolean {\n return TemplateInstanceState.INSTANCE.getValues().length !== config.templateInstances.length\n }\n\n async processLog(request: DataBinding): Promise<ProcessResult> {\n if (!request.data?.ethLog?.log) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"Log can't be null\")\n }\n const ethLog = request.data.ethLog\n\n const promises: Promise<ProcessResult>[] = []\n for (const handlerId of request.handlerIds) {\n const handler = this.eventHandlers[handlerId]\n promises.push(\n handler(ethLog).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing log: ' + JSON.stringify(ethLog.log) + '\\n' + errorString(e)\n )\n })\n )\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n\n async processTrace(binding: DataBinding): Promise<ProcessResult> {\n if (!binding.data?.ethTrace?.trace) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"Trace can't be null\")\n }\n const ethTrace = binding.data.ethTrace\n\n const promises: Promise<ProcessResult>[] = []\n\n for (const handlerId of binding.handlerIds) {\n promises.push(\n this.traceHandlers[handlerId](ethTrace).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing trace: ' + JSON.stringify(ethTrace.trace) + '\\n' + errorString(e)\n )\n })\n )\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n\n async processBlock(binding: DataBinding): Promise<ProcessResult> {\n if (!binding.data?.ethBlock?.block) {\n throw new ServerError(Status.INVALID_ARGUMENT, \"Block can't be empty\")\n }\n const ethBlock = binding.data.ethBlock\n\n const promises: Promise<ProcessResult>[] = []\n for (const handlerId of binding.handlerIds) {\n promises.push(\n this.blockHandlers[handlerId](ethBlock).catch((e) => {\n throw new ServerError(\n Status.INTERNAL,\n 'error processing block: ' + ethBlock.block?.number + '\\n' + errorString(e)\n )\n })\n )\n }\n return mergeProcessResults(await Promise.all(promises))\n }\n}\n\nPluginManager.INSTANCE.register(new EthPlugin())\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"generic-processor.test.js","sourceRoot":"","sources":["../../src/eth/generic-processor.test.ts"],"names":[],"mappings":"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","sourcesContent":["// TODO move out of this package\n\nimport { expect } from 'chai'\n\nimport { HandlerType } from '@sentio/protos'\n\nimport { GenericProcessor } from '@sentio/sdk/eth'\nimport { TestProcessorServer, firstCounterValue } from '../testing/index.js'\n\ndescribe('Test Generic Processor', () => {\n const service = new TestProcessorServer(async () => {\n GenericProcessor.bind(\n [\n 'event Transfer(address indexed from, address indexed to, uint256 value)',\n 'event Approval(address indexed from, address indexed to, uint256 value)',\n ],\n { address: '0x1E4EDE388cbc9F4b5c79681B7f94d36a11ABEBC9' }\n ).onAllEvents(function (log, ctx) {\n ctx.meter.Counter('event_num').add(1)\n })\n\n GenericProcessor.bind('event WalletCreated(address wallet, address owner)', {\n address: '0x57E037F4d2c8BEa011Ad8a9A5AF4AaEEd508650f',\n }).onAllEvents(function (log, ctx) {\n ctx.meter.Counter('wallet').add(1)\n })\n })\n\n beforeAll(async () => {\n await service.start()\n })\n\n test('check configuration', async () => {\n const config = await service.getConfig({})\n expect(config.contractConfigs).length(2)\n expect(config.contractConfigs?.[0].contract?.name).equals('Generic')\n })\n\n test('Check log dispatch', async () => {\n const res = await service.eth.testLogs([logData, logData])\n const counters = res.result?.counters\n expect(counters).length(2)\n expect(firstCounterValue(res.result, 'event_num')).equals(1)\n expect(counters?.[0].runtimeInfo?.from).equals(HandlerType.ETH_LOG)\n })\n\n test('Check log dispatch no buffer over rune', async () => {\n const logStr =\n '{\"address\":\"0x57e037f4d2c8bea011ad8a9a5af4aaeed508650f\",\"topics\":[\"0x5b03bfed1c14a02bdeceb5fa582eb1a5765fc0bc64ca0e6af4c20afc9487f081\"],\"data\":\"0x00000000000000000000000093269483a70c68d5c5bb63aac1e8f4ac59f498800000000000000000000000000c520e51c055cf63bab075715c1b860b2e9b8e24\",\"blockNumber\":\"0xc9d6d7\",\"transactionHash\":\"0x208af3250499672c2f07138b9aa236153c65c78ae4341b23c2763017afdd61a2\",\"transactionIndex\":\"0xf3\",\"blockHash\":\"0x6e3b100c34b510049e922fbe1c1dab1b0793be3d1229b632688e6a518cdd11b6\",\"logIndex\":\"0x14b\",\"removed\":false}'\n const res = await service.eth.testLog(JSON.parse(logStr))\n console.log(JSON.stringify(res))\n })\n\n const logData = {\n index: 0,\n blockNumber: 14213252,\n blockHash: '0x83d646fac9350b281def8c4c37626f9d8efc95df801287b848c719edf35cdbaf',\n transactionIndex: 347,\n removed: false,\n address: '0x1E4EDE388cbc9F4b5c79681B7f94d36a11ABEBC9',\n data: '0x00000000000000000000000000000000000000000000009a71db64810aaa0000',\n topics: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n '0x0000000000000000000000000000000000000000000000000000000000000000',\n '0x000000000000000000000000b329e39ebefd16f40d38f07643652ce17ca5bac1',\n ],\n transactionHash: '0x93355e0cb2c3490cb8a747029ff2dc8cdbde2407025b8391398436955afae303',\n logIndex: 428,\n }\n})\n"]}
1
+ {"version":3,"file":"generic-processor.test.js","sourceRoot":"","sources":["../../src/eth/generic-processor.test.ts"],"names":[],"mappings":"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","sourcesContent":["// TODO move out of this package\n\nimport { expect } from 'chai'\n\nimport { HandlerType } from '@sentio/protos'\n\nimport { GenericProcessor } from '@sentio/sdk/eth'\nimport { TestProcessorServer, firstCounterValue } from '../testing/index.js'\n\ndescribe('Test Generic Processor', () => {\n const service = new TestProcessorServer(async () => {\n GenericProcessor.bind(\n [\n 'event Transfer(address indexed from, address indexed to, uint256 value)',\n 'event Approval(address indexed from, address indexed to, uint256 value)',\n 'function transferFrom(address from, address to, uint value)',\n 'function balanceOf(address owner) view returns (uint balance)',\n ],\n { address: '0x1E4EDE388cbc9F4b5c79681B7f94d36a11ABEBC9' }\n )\n .onAllEvents(function (log, ctx) {\n ctx.meter.Counter('event_num').add(1)\n })\n .onAllTraces(function (trace, ctx) {\n ctx.meter.Counter('trace_count').add(1, { name: trace.name })\n ctx.eventLogger.emit(trace.name, {\n distinctId: trace.action.from,\n ...trace.args.toObject(),\n })\n })\n\n GenericProcessor.bind('event WalletCreated(address wallet, address owner)', {\n address: '0x57E037F4d2c8BEa011Ad8a9A5AF4AaEEd508650f',\n }).onAllEvents(function (log, ctx) {\n ctx.meter.Counter('wallet').add(1)\n })\n })\n\n beforeAll(async () => {\n await service.start()\n })\n\n test('check configuration', async () => {\n const config = await service.getConfig({})\n expect(config.contractConfigs).length(2)\n expect(config.contractConfigs?.[0].contract?.name).equals('Generic')\n const traceConfigs = config.contractConfigs?.[0].traceConfigs\n expect(traceConfigs.length).equals(2)\n })\n\n test('Check log dispatch', async () => {\n const res = await service.eth.testLogs([logData, logData])\n const counters = res.result?.counters\n expect(counters).length(2)\n expect(firstCounterValue(res.result, 'event_num')).equals(1)\n expect(counters?.[0].runtimeInfo?.from).equals(HandlerType.ETH_LOG)\n })\n\n test('Check log dispatch no buffer over rune', async () => {\n const logStr =\n '{\"address\":\"0x57e037f4d2c8bea011ad8a9a5af4aaeed508650f\",\"topics\":[\"0x5b03bfed1c14a02bdeceb5fa582eb1a5765fc0bc64ca0e6af4c20afc9487f081\"],\"data\":\"0x00000000000000000000000093269483a70c68d5c5bb63aac1e8f4ac59f498800000000000000000000000000c520e51c055cf63bab075715c1b860b2e9b8e24\",\"blockNumber\":\"0xc9d6d7\",\"transactionHash\":\"0x208af3250499672c2f07138b9aa236153c65c78ae4341b23c2763017afdd61a2\",\"transactionIndex\":\"0xf3\",\"blockHash\":\"0x6e3b100c34b510049e922fbe1c1dab1b0793be3d1229b632688e6a518cdd11b6\",\"logIndex\":\"0x14b\",\"removed\":false}'\n const res = await service.eth.testLog(JSON.parse(logStr))\n console.log(JSON.stringify(res))\n })\n\n const logData = {\n index: 0,\n blockNumber: 14213252,\n blockHash: '0x83d646fac9350b281def8c4c37626f9d8efc95df801287b848c719edf35cdbaf',\n transactionIndex: 347,\n removed: false,\n address: '0x1E4EDE388cbc9F4b5c79681B7f94d36a11ABEBC9',\n data: '0x00000000000000000000000000000000000000000000009a71db64810aaa0000',\n topics: [\n '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',\n '0x0000000000000000000000000000000000000000000000000000000000000000',\n '0x000000000000000000000000b329e39ebefd16f40d38f07643652ce17ca5bac1',\n ],\n transactionHash: '0x93355e0cb2c3490cb8a747029ff2dc8cdbde2407025b8391398436955afae303',\n logIndex: 428,\n }\n})\n"]}
@@ -3,7 +3,9 @@ export interface TypedCallTrace<TArgsArray extends Array<any> = any, TArgsObject
3
3
  args: TArgsArray & TArgsObject;
4
4
  }
5
5
  export interface Trace {
6
- args?: Result;
6
+ args: Result;
7
+ name: string;
8
+ functionSignature: string;
7
9
  action: TraceAction;
8
10
  blockHash: string;
9
11
  blockNumber: number;
@@ -1 +1 @@
1
- {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/eth/trace.ts"],"names":[],"mappings":";AA4CA,yBAAyB;AACzB,cAAc;AACd,0DAA0D;AAC1D,wBAAwB;AACxB,oBAAoB;AACpB,aAAa;AACb,sZAAsZ;AACtZ,wDAAwD;AACxD,gCAAgC;AAChC,OAAO;AACP,qFAAqF;AACrF,2BAA2B;AAC3B,gDAAgD;AAChD,kBAAkB;AAClB,sBAAsB;AACtB,2FAA2F;AAC3F,6BAA6B;AAC7B,kBAAkB;AAClB,IAAI;AAEJ,uBAAuB;AACvB,QAAQ;AACR,oBAAoB;AACpB,gEAAgE;AAChE,2BAA2B;AAC3B,0qLAA0qL;AAC1qL,uBAAuB;AACvB,WAAW;AACX,2FAA2F;AAC3F,gCAAgC;AAChC,oBAAoB;AACpB,mEAAmE;AACnE,4yIAA4yI;AAC5yI,6BAA6B;AAC7B,WAAW;AACX,wBAAwB;AACxB,4BAA4B;AAC5B,iGAAiG;AACjG,mCAAmC;AACnC,yBAAyB;AACzB,QAAQ","sourcesContent":["// https://github.com/openethereum/parity-ethereum/blob/55c90d4016505317034e3e98f699af07f5404b63/rpc/src/v1/types/trace.rs#L482\nimport { Result } from 'ethers'\n\nexport interface TypedCallTrace<TArgsArray extends Array<any> = any, TArgsObject = any> {\n args: TArgsArray & TArgsObject\n}\n\nexport interface Trace {\n args?: Result\n action: TraceAction\n blockHash: string\n blockNumber: number\n result: TraceResult\n subtraces: number\n traceAddress: number[]\n transactionHash: string\n transactionPosition: number\n type: string\n error?: string\n}\n// export type CallType = \"call\" | \"callcode\" | \"delegatecall\" | \"staticcall\"\n\nexport interface TraceAction {\n from: string\n to?: string\n value: number\n gas: number\n input?: string\n callType?: string\n\n init?: string\n address?: string\n balance?: string\n refundAddress?: string\n}\n\n// TODO are more field missing for FailedCall, FailedCreate\nexport interface TraceResult {\n gasUsed: number\n output?: string\n address?: string\n code?: string\n}\n\n// const TRACE: Trace = {\n// action: {\n// from: '0xd771111cbfa2bbdafbf9f0e58b49b3f827da31f5',\n// callType: 'call',\n// gas: 0x12154,\n// input:\n// '0xb1a417f4000000000000000000000000d771111cbfa2bbdafbf9f0e58b49b3f827da31f5000000000000000000000000d771111cbfa2bbdafbf9f0e58b49b3f827da31f500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131888b5aaf000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000',\n// to: '0x0baba1ad5be3a5c0a66e7ac838a129bf948f1ea4',\n// value: 0x131888b5aaf0000,\n// },\n// blockHash: '0x5451711bc530a7c04128fedbe149eb359c10eccd44a83909d448c5244c7eea26',\n// blockNumber: 15533908,\n// result: { gasUsed: 0x114c1, output: '0x' },\n// subtraces: 1,\n// traceAddress: [],\n// transactionHash: '0x66dce11d6217042ed709a38e507e7762c93b1bde4a0447ae7a243493bbdffc0e',\n// transactionPosition: 73,\n// type: 'call',\n// }\n\n// const trac2: Trace =\n// {\n// \"action\": {\n// \"from\": \"0x95ba4cf87d6723ad9c0db21737d862be80e93911\",\n// \"gas\": 0x630d0b,\n// \"init\": \"0x608060405234801561001057600080fd5b50604051602080610b2983398101806040528101908080519060200190929190505050808060405180807f6f72672e7a657070656c696e6f732e70726f78792e696d706c656d656e74617481526020017f696f6e000000000000000000000000000000000000000000000000000000000081525060230190506040518091039020600019167f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3600102600019161415156100c657fe5b6100de81610169640100000000026401000000009004565b5060405180807f6f72672e7a657070656c696e6f732e70726f78792e61646d696e000000000000815250601a0190506040518091039020600019167f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b6001026000191614151561014a57fe5b6101623361024e640100000000026401000000009004565b5050610290565b60006101878261027d6401000000000261084b176401000000009004565b1515610221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001807f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f81526020017f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000081525060400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c360010290508181555050565b60007f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b60010290508181555050565b600080823b905060008111915050919050565b61088a8061029f6000396000f30060806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633659cfe6146100775780634f1ef286146100ba5780635c60da1b146101085780638f2839701461015f578063f851a440146101a2575b6100756101f9565b005b34801561008357600080fd5b506100b8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610213565b005b610106600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390505050610268565b005b34801561011457600080fd5b5061011d610308565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561016b57600080fd5b506101a0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610360565b005b3480156101ae57600080fd5b506101b761051e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610201610576565b61021161020c610651565b610682565b565b61021b6106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561025c57610257816106d9565b610265565b6102646101f9565b5b50565b6102706106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102fa576102ac836106d9565b3073ffffffffffffffffffffffffffffffffffffffff163483836040518083838082843782019150509250505060006040518083038185875af19250505015156102f557600080fd5b610303565b6103026101f9565b5b505050565b60006103126106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156103545761034d610651565b905061035d565b61035c6101f9565b5b90565b6103686106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561051257600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610466576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001807f43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f81526020017f787920746f20746865207a65726f20616464726573730000000000000000000081525060400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61048f6106a8565b82604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a161050d81610748565b61051b565b61051a6101f9565b5b50565b60006105286106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561056a576105636106a8565b9050610573565b6105726101f9565b5b90565b61057e6106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515610647576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e20667281526020017f6f6d207468652070726f78792061646d696e000000000000000000000000000081525060400191505060405180910390fd5b61064f610777565b565b6000807f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c36001029050805491505090565b3660008037600080366000845af43d6000803e80600081146106a3573d6000f35b3d6000fd5b6000807f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b6001029050805491505090565b6106e281610779565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b60010290508181555050565b565b60006107848261084b565b151561081e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001807f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f81526020017f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000081525060400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c360010290508181555050565b600080823b9050600081119150509190505600a165627a7a72305820a4a547cfc7202c5acaaae74d428e988bc62ad5024eb0165532d3a8f91db4ed2400290000000000000000000000000882477e7895bdc5cea7cb1552ed914ab157fe56\",\n// \"value\": 0x0\n// },\n// \"blockHash\": \"0xb2f6986457f5a24ff088a0beb5567c8c1fe2da02687c78e743507ee7c982b977\",\n// \"blockNumber\": 6082465,\n// \"result\": {\n// \"address\": \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n// \"code\": \"0x60806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633659cfe6146100775780634f1ef286146100ba5780635c60da1b146101085780638f2839701461015f578063f851a440146101a2575b6100756101f9565b005b34801561008357600080fd5b506100b8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610213565b005b610106600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390505050610268565b005b34801561011457600080fd5b5061011d610308565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561016b57600080fd5b506101a0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610360565b005b3480156101ae57600080fd5b506101b761051e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610201610576565b61021161020c610651565b610682565b565b61021b6106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561025c57610257816106d9565b610265565b6102646101f9565b5b50565b6102706106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102fa576102ac836106d9565b3073ffffffffffffffffffffffffffffffffffffffff163483836040518083838082843782019150509250505060006040518083038185875af19250505015156102f557600080fd5b610303565b6103026101f9565b5b505050565b60006103126106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156103545761034d610651565b905061035d565b61035c6101f9565b5b90565b6103686106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561051257600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610466576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001807f43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f81526020017f787920746f20746865207a65726f20616464726573730000000000000000000081525060400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61048f6106a8565b82604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a161050d81610748565b61051b565b61051a6101f9565b5b50565b60006105286106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561056a576105636106a8565b9050610573565b6105726101f9565b5b90565b61057e6106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515610647576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e20667281526020017f6f6d207468652070726f78792061646d696e000000000000000000000000000081525060400191505060405180910390fd5b61064f610777565b565b6000807f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c36001029050805491505090565b3660008037600080366000845af43d6000803e80600081146106a3573d6000f35b3d6000fd5b6000807f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b6001029050805491505090565b6106e281610779565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b60010290508181555050565b565b60006107848261084b565b151561081e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001807f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f81526020017f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000081525060400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c360010290508181555050565b600080823b9050600081119150509190505600a165627a7a72305820a4a547cfc7202c5acaaae74d428e988bc62ad5024eb0165532d3a8f91db4ed240029\",\n// \"gasUsed\": 0x74f42\n// },\n// \"subtraces\": 0,\n// \"traceAddress\": [],\n// \"transactionHash\": \"0xe7e0fe390354509cd08c9a0168536938600ddc552b3f7cb96030ebef62e75895\",\n// \"transactionPosition\": 22,\n// \"type\": \"create\"\n// }\n"]}
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/eth/trace.ts"],"names":[],"mappings":";AA+CA,yBAAyB;AACzB,cAAc;AACd,0DAA0D;AAC1D,wBAAwB;AACxB,oBAAoB;AACpB,aAAa;AACb,sZAAsZ;AACtZ,wDAAwD;AACxD,gCAAgC;AAChC,OAAO;AACP,qFAAqF;AACrF,2BAA2B;AAC3B,gDAAgD;AAChD,kBAAkB;AAClB,sBAAsB;AACtB,2FAA2F;AAC3F,6BAA6B;AAC7B,kBAAkB;AAClB,IAAI;AAEJ,uBAAuB;AACvB,QAAQ;AACR,oBAAoB;AACpB,gEAAgE;AAChE,2BAA2B;AAC3B,0qLAA0qL;AAC1qL,uBAAuB;AACvB,WAAW;AACX,2FAA2F;AAC3F,gCAAgC;AAChC,oBAAoB;AACpB,mEAAmE;AACnE,4yIAA4yI;AAC5yI,6BAA6B;AAC7B,WAAW;AACX,wBAAwB;AACxB,4BAA4B;AAC5B,iGAAiG;AACjG,mCAAmC;AACnC,yBAAyB;AACzB,QAAQ","sourcesContent":["// https://github.com/openethereum/parity-ethereum/blob/55c90d4016505317034e3e98f699af07f5404b63/rpc/src/v1/types/trace.rs#L482\nimport { Result } from 'ethers'\n\nexport interface TypedCallTrace<TArgsArray extends Array<any> = any, TArgsObject = any> {\n args: TArgsArray & TArgsObject\n}\n\nexport interface Trace {\n args: Result\n name: string\n functionSignature: string\n\n action: TraceAction\n blockHash: string\n blockNumber: number\n result: TraceResult\n subtraces: number\n traceAddress: number[]\n transactionHash: string\n transactionPosition: number\n type: string\n error?: string\n}\n// export type CallType = \"call\" | \"callcode\" | \"delegatecall\" | \"staticcall\"\n\nexport interface TraceAction {\n from: string\n to?: string\n value: number\n gas: number\n input?: string\n callType?: string\n\n init?: string\n address?: string\n balance?: string\n refundAddress?: string\n}\n\n// TODO are more field missing for FailedCall, FailedCreate\nexport interface TraceResult {\n gasUsed: number\n output?: string\n address?: string\n code?: string\n}\n\n// const TRACE: Trace = {\n// action: {\n// from: '0xd771111cbfa2bbdafbf9f0e58b49b3f827da31f5',\n// callType: 'call',\n// gas: 0x12154,\n// input:\n// '0xb1a417f4000000000000000000000000d771111cbfa2bbdafbf9f0e58b49b3f827da31f5000000000000000000000000d771111cbfa2bbdafbf9f0e58b49b3f827da31f500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000131888b5aaf000000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000',\n// to: '0x0baba1ad5be3a5c0a66e7ac838a129bf948f1ea4',\n// value: 0x131888b5aaf0000,\n// },\n// blockHash: '0x5451711bc530a7c04128fedbe149eb359c10eccd44a83909d448c5244c7eea26',\n// blockNumber: 15533908,\n// result: { gasUsed: 0x114c1, output: '0x' },\n// subtraces: 1,\n// traceAddress: [],\n// transactionHash: '0x66dce11d6217042ed709a38e507e7762c93b1bde4a0447ae7a243493bbdffc0e',\n// transactionPosition: 73,\n// type: 'call',\n// }\n\n// const trac2: Trace =\n// {\n// \"action\": {\n// \"from\": \"0x95ba4cf87d6723ad9c0db21737d862be80e93911\",\n// \"gas\": 0x630d0b,\n// \"init\": \"0x608060405234801561001057600080fd5b50604051602080610b2983398101806040528101908080519060200190929190505050808060405180807f6f72672e7a657070656c696e6f732e70726f78792e696d706c656d656e74617481526020017f696f6e000000000000000000000000000000000000000000000000000000000081525060230190506040518091039020600019167f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3600102600019161415156100c657fe5b6100de81610169640100000000026401000000009004565b5060405180807f6f72672e7a657070656c696e6f732e70726f78792e61646d696e000000000000815250601a0190506040518091039020600019167f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b6001026000191614151561014a57fe5b6101623361024e640100000000026401000000009004565b5050610290565b60006101878261027d6401000000000261084b176401000000009004565b1515610221576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001807f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f81526020017f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000081525060400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c360010290508181555050565b60007f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b60010290508181555050565b600080823b905060008111915050919050565b61088a8061029f6000396000f30060806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633659cfe6146100775780634f1ef286146100ba5780635c60da1b146101085780638f2839701461015f578063f851a440146101a2575b6100756101f9565b005b34801561008357600080fd5b506100b8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610213565b005b610106600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390505050610268565b005b34801561011457600080fd5b5061011d610308565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561016b57600080fd5b506101a0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610360565b005b3480156101ae57600080fd5b506101b761051e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610201610576565b61021161020c610651565b610682565b565b61021b6106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561025c57610257816106d9565b610265565b6102646101f9565b5b50565b6102706106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102fa576102ac836106d9565b3073ffffffffffffffffffffffffffffffffffffffff163483836040518083838082843782019150509250505060006040518083038185875af19250505015156102f557600080fd5b610303565b6103026101f9565b5b505050565b60006103126106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156103545761034d610651565b905061035d565b61035c6101f9565b5b90565b6103686106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561051257600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610466576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001807f43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f81526020017f787920746f20746865207a65726f20616464726573730000000000000000000081525060400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61048f6106a8565b82604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a161050d81610748565b61051b565b61051a6101f9565b5b50565b60006105286106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561056a576105636106a8565b9050610573565b6105726101f9565b5b90565b61057e6106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515610647576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e20667281526020017f6f6d207468652070726f78792061646d696e000000000000000000000000000081525060400191505060405180910390fd5b61064f610777565b565b6000807f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c36001029050805491505090565b3660008037600080366000845af43d6000803e80600081146106a3573d6000f35b3d6000fd5b6000807f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b6001029050805491505090565b6106e281610779565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b60010290508181555050565b565b60006107848261084b565b151561081e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001807f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f81526020017f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000081525060400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c360010290508181555050565b600080823b9050600081119150509190505600a165627a7a72305820a4a547cfc7202c5acaaae74d428e988bc62ad5024eb0165532d3a8f91db4ed2400290000000000000000000000000882477e7895bdc5cea7cb1552ed914ab157fe56\",\n// \"value\": 0x0\n// },\n// \"blockHash\": \"0xb2f6986457f5a24ff088a0beb5567c8c1fe2da02687c78e743507ee7c982b977\",\n// \"blockNumber\": 6082465,\n// \"result\": {\n// \"address\": \"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48\",\n// \"code\": \"0x60806040526004361061006d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633659cfe6146100775780634f1ef286146100ba5780635c60da1b146101085780638f2839701461015f578063f851a440146101a2575b6100756101f9565b005b34801561008357600080fd5b506100b8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610213565b005b610106600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001908201803590602001919091929391929390505050610268565b005b34801561011457600080fd5b5061011d610308565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561016b57600080fd5b506101a0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610360565b005b3480156101ae57600080fd5b506101b761051e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610201610576565b61021161020c610651565b610682565b565b61021b6106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561025c57610257816106d9565b610265565b6102646101f9565b5b50565b6102706106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156102fa576102ac836106d9565b3073ffffffffffffffffffffffffffffffffffffffff163483836040518083838082843782019150509250505060006040518083038185875af19250505015156102f557600080fd5b610303565b6103026101f9565b5b505050565b60006103126106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156103545761034d610651565b905061035d565b61035c6101f9565b5b90565b6103686106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561051257600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610466576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001807f43616e6e6f74206368616e6765207468652061646d696e206f6620612070726f81526020017f787920746f20746865207a65726f20616464726573730000000000000000000081525060400191505060405180910390fd5b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f61048f6106a8565b82604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a161050d81610748565b61051b565b61051a6101f9565b5b50565b60006105286106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561056a576105636106a8565b9050610573565b6105726101f9565b5b90565b61057e6106a8565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151515610647576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001807f43616e6e6f742063616c6c2066616c6c6261636b2066756e6374696f6e20667281526020017f6f6d207468652070726f78792061646d696e000000000000000000000000000081525060400191505060405180910390fd5b61064f610777565b565b6000807f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c36001029050805491505090565b3660008037600080366000845af43d6000803e80600081146106a3573d6000f35b3d6000fd5b6000807f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b6001029050805491505090565b6106e281610779565b7fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b81604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60007f10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b60010290508181555050565b565b60006107848261084b565b151561081e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b8152602001807f43616e6e6f742073657420612070726f787920696d706c656d656e746174696f81526020017f6e20746f2061206e6f6e2d636f6e74726163742061646472657373000000000081525060400191505060405180910390fd5b7f7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c360010290508181555050565b600080823b9050600081119150509190505600a165627a7a72305820a4a547cfc7202c5acaaae74d428e988bc62ad5024eb0165532d3a8f91db4ed240029\",\n// \"gasUsed\": 0x74f42\n// },\n// \"subtraces\": 0,\n// \"traceAddress\": [],\n// \"transactionHash\": \"0xe7e0fe390354509cd08c9a0168536938600ddc552b3f7cb96030ebef62e75895\",\n// \"transactionPosition\": 22,\n// \"type\": \"create\"\n// }\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sentio/sdk",
3
3
  "license": "Apache-2.0",
4
- "version": "2.10.0-rc.3",
4
+ "version": "2.10.0-rc.5",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "compile": "tsc && cp src/utils/*.csv lib/utils && cp src/tsup.config.ts lib",
@@ -23,8 +23,8 @@
23
23
  "@project-serum/anchor": "^0.26.0",
24
24
  "@sentio/bigdecimal": "^9.1.1-patch.3",
25
25
  "@sentio/ethers-v6": "^1.0.25",
26
- "@sentio/protos": "^2.10.0-rc.3",
27
- "@sentio/runtime": "^2.10.0-rc.3",
26
+ "@sentio/protos": "^2.10.0-rc.5",
27
+ "@sentio/runtime": "^2.10.0-rc.5",
28
28
  "@solana/web3.js": "^1.73.2",
29
29
  "@types/prettier": "^2.7.2",
30
30
  "aptos-sdk": "npm:aptos@^1.7.1",
@@ -81,5 +81,5 @@
81
81
  "engines": {
82
82
  "node": ">=16"
83
83
  },
84
- "gitHead": "9a4e23dc97f62e94916a97762492a78d05cbb0b8"
84
+ "gitHead": "c271178b7286f51283e91c8c7a61b32a32b1c7e1"
85
85
  }
@@ -18,6 +18,7 @@ import { ServerError, Status } from 'nice-grpc'
18
18
  import { fixEmptyKey, EthEvent, formatEthData } from './eth.js'
19
19
  import * as console from 'console'
20
20
  import { getNetworkFromCtxOrNetworkish } from './provider.js'
21
+ import sha3 from 'js-sha3'
21
22
 
22
23
  export interface AddressOrTypeEventFilter extends DeferredTopicFilter {
23
24
  addressType?: AddressType
@@ -31,7 +32,7 @@ export class EventsHandler {
31
32
  }
32
33
 
33
34
  export class TraceHandler {
34
- signature: string
35
+ signatures: string[]
35
36
  handler: (trace: Data_EthTrace) => Promise<ProcessResult>
36
37
  fetchConfig: EthFetchConfig
37
38
  }
@@ -194,7 +195,8 @@ export abstract class BaseProcessor<
194
195
  }
195
196
 
196
197
  public onAllEvents(
197
- handler: (event: EthEvent, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid
198
+ handler: (event: EthEvent, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,
199
+ fetchConfig?: Partial<EthFetchConfig>
198
200
  ): this {
199
201
  const _filters: DeferredTopicFilter[] = []
200
202
  const tmpContract = this.CreateBoundContractView()
@@ -205,31 +207,45 @@ export abstract class BaseProcessor<
205
207
  _filters.push(filter())
206
208
  }
207
209
  }
208
- return this.onEvent(function (log, ctx) {
209
- return handler(log, ctx)
210
- }, _filters)
210
+ return this.onEvent(
211
+ function (log, ctx) {
212
+ return handler(log, ctx)
213
+ },
214
+ _filters,
215
+ fetchConfig
216
+ )
211
217
  }
212
218
 
213
219
  public onTrace(
214
- signature: string,
220
+ signatures: string | string[],
215
221
  handler: (trace: Trace, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,
216
222
  fetchConfig?: Partial<EthFetchConfig>
217
223
  ): this {
218
224
  const chainId = this.getChainId()
219
225
  const contractName = this.config.name
220
226
  const processor = this
227
+ if (typeof signatures === 'string') {
228
+ signatures = [signatures]
229
+ }
221
230
 
222
231
  this.traceHandlers.push({
223
- signature,
232
+ signatures,
224
233
  fetchConfig: EthFetchConfig.fromPartial(fetchConfig || {}),
225
234
  handler: async function (data: Data_EthTrace) {
226
235
  const contractView = processor.CreateBoundContractView()
227
236
  const contractInterface = contractView.rawContract.interface
228
- const fragment = contractInterface.getFunction(signature)
229
237
  const { trace, block, transaction, transactionReceipt } = formatEthData(data)
238
+ const sighash = trace?.action.input?.slice(0, 10)
239
+ if (!sighash) {
240
+ throw new ServerError(Status.INVALID_ARGUMENT, 'trace has no sighash')
241
+ }
242
+ const fragment = contractInterface.getFunction(sighash)
243
+
230
244
  if (!trace || !fragment) {
231
245
  throw new ServerError(Status.INVALID_ARGUMENT, 'trace is null')
232
246
  }
247
+ trace.name = fragment.name
248
+ trace.functionSignature = fragment.format()
233
249
  // const trace = data.trace as Trace
234
250
  if (!trace?.action.input) {
235
251
  return ProcessResult.fromPartial({})
@@ -260,4 +276,28 @@ export abstract class BaseProcessor<
260
276
  })
261
277
  return this
262
278
  }
279
+
280
+ public onAllTraces(
281
+ handler: (event: Trace, ctx: ContractContext<TContract, TBoundContractView>) => PromiseOrVoid,
282
+ fetchConfig?: Partial<EthFetchConfig>
283
+ ): this {
284
+ const tmpContract = this.CreateBoundContractView()
285
+ const sighashes = []
286
+
287
+ for (const fragment of tmpContract.rawContract.interface.fragments) {
288
+ if (fragment.type === 'function') {
289
+ const signature = fragment.format()
290
+ const test = new TextEncoder().encode(signature)
291
+ const sighash = '0x' + sha3.keccak_256(test).substring(0, 8)
292
+ sighashes.push(sighash)
293
+ }
294
+ }
295
+ return this.onTrace(
296
+ sighashes,
297
+ function (trace, ctx) {
298
+ return handler(trace, ctx)
299
+ },
300
+ fetchConfig
301
+ )
302
+ }
263
303
  }
@@ -110,7 +110,15 @@ ${contract.name}Processor.bind({ address: '${contract.address}', network: ${cont
110
110
  ctx.eventLogger.emit(evt.name, {
111
111
  ...evt.args.toObject(),
112
112
  })
113
- })`
113
+ })
114
+ .onAllTraces(function (trace, ctx) {
115
+ ctx.meter.Counter('trace_count').add(1, { name: trace.name })
116
+ ctx.eventLogger.emit(trace.name, {
117
+ distinctId: trace.action.from,
118
+ ...trace.args.toObject(),
119
+ })
120
+ })
121
+ `
114
122
  exampleContent += content
115
123
  }
116
124
 
@@ -39,8 +39,6 @@ function codegenCallTraceType(fn: FunctionDeclaration, overloadedName?: string):
39
39
 
40
40
  function generateCallHandler(fn: FunctionDeclaration, contractName: string, overloadedName?: string): string {
41
41
  const signature = getSignatureForFn(fn)
42
- // utils.toUtf8Bytes(signature))
43
-
44
42
  const test = new TextEncoder().encode(signature)
45
43
  const sighash = '0x' + sha3.keccak_256(test).substring(0, 8)
46
44
 
@@ -65,11 +65,13 @@ export class EthPlugin extends Plugin {
65
65
  // Step 2. Prepare all trace handlers
66
66
  for (const traceHandler of processor.traceHandlers) {
67
67
  const handlerId = this.traceHandlers.push(traceHandler.handler) - 1
68
- contractConfig.traceConfigs.push({
69
- signature: traceHandler.signature,
70
- handlerId: handlerId,
71
- fetchConfig: traceHandler.fetchConfig,
72
- })
68
+ for (const signature of traceHandler.signatures) {
69
+ contractConfig.traceConfigs.push({
70
+ signature: signature,
71
+ handlerId: handlerId,
72
+ fetchConfig: traceHandler.fetchConfig,
73
+ })
74
+ }
73
75
  }
74
76
 
75
77
  // Step 3. Prepare all the event handlers
package/src/eth/trace.ts CHANGED
@@ -6,7 +6,10 @@ export interface TypedCallTrace<TArgsArray extends Array<any> = any, TArgsObject
6
6
  }
7
7
 
8
8
  export interface Trace {
9
- args?: Result
9
+ args: Result
10
+ name: string
11
+ functionSignature: string
12
+
10
13
  action: TraceAction
11
14
  blockHash: string
12
15
  blockNumber: number