@xyo-network/evm-events-witness 2.84.3

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.
Files changed (65) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +13 -0
  3. package/dist/browser/Payload.d.cts +19 -0
  4. package/dist/browser/Payload.d.cts.map +1 -0
  5. package/dist/browser/Payload.d.mts +19 -0
  6. package/dist/browser/Payload.d.mts.map +1 -0
  7. package/dist/browser/Payload.d.ts +19 -0
  8. package/dist/browser/Payload.d.ts.map +1 -0
  9. package/dist/browser/Witness.d.cts +9 -0
  10. package/dist/browser/Witness.d.cts.map +1 -0
  11. package/dist/browser/Witness.d.mts +9 -0
  12. package/dist/browser/Witness.d.mts.map +1 -0
  13. package/dist/browser/Witness.d.ts +9 -0
  14. package/dist/browser/Witness.d.ts.map +1 -0
  15. package/dist/browser/index.cjs +103 -0
  16. package/dist/browser/index.cjs.map +1 -0
  17. package/dist/browser/index.d.cts +4 -0
  18. package/dist/browser/index.d.cts.map +1 -0
  19. package/dist/browser/index.d.mts +4 -0
  20. package/dist/browser/index.d.mts.map +1 -0
  21. package/dist/browser/index.d.ts +4 -0
  22. package/dist/browser/index.d.ts.map +1 -0
  23. package/dist/browser/index.js +80 -0
  24. package/dist/browser/index.js.map +1 -0
  25. package/dist/browser/model.d.cts +14 -0
  26. package/dist/browser/model.d.cts.map +1 -0
  27. package/dist/browser/model.d.mts +14 -0
  28. package/dist/browser/model.d.mts.map +1 -0
  29. package/dist/browser/model.d.ts +14 -0
  30. package/dist/browser/model.d.ts.map +1 -0
  31. package/dist/node/Payload.d.cts +19 -0
  32. package/dist/node/Payload.d.cts.map +1 -0
  33. package/dist/node/Payload.d.mts +19 -0
  34. package/dist/node/Payload.d.mts.map +1 -0
  35. package/dist/node/Payload.d.ts +19 -0
  36. package/dist/node/Payload.d.ts.map +1 -0
  37. package/dist/node/Witness.d.cts +9 -0
  38. package/dist/node/Witness.d.cts.map +1 -0
  39. package/dist/node/Witness.d.mts +9 -0
  40. package/dist/node/Witness.d.mts.map +1 -0
  41. package/dist/node/Witness.d.ts +9 -0
  42. package/dist/node/Witness.d.ts.map +1 -0
  43. package/dist/node/index.cjs +111 -0
  44. package/dist/node/index.cjs.map +1 -0
  45. package/dist/node/index.d.cts +4 -0
  46. package/dist/node/index.d.cts.map +1 -0
  47. package/dist/node/index.d.mts +4 -0
  48. package/dist/node/index.d.mts.map +1 -0
  49. package/dist/node/index.d.ts +4 -0
  50. package/dist/node/index.d.ts.map +1 -0
  51. package/dist/node/index.js +81 -0
  52. package/dist/node/index.js.map +1 -0
  53. package/dist/node/model.d.cts +14 -0
  54. package/dist/node/model.d.cts.map +1 -0
  55. package/dist/node/model.d.mts +14 -0
  56. package/dist/node/model.d.mts.map +1 -0
  57. package/dist/node/model.d.ts +14 -0
  58. package/dist/node/model.d.ts.map +1 -0
  59. package/package.json +69 -0
  60. package/src/Payload.ts +28 -0
  61. package/src/Witness.ts +101 -0
  62. package/src/index.ts +3 -0
  63. package/src/model.ts +20 -0
  64. package/typedoc.json +5 -0
  65. package/xy.config.ts +14 -0
@@ -0,0 +1,19 @@
1
+ import { Payload } from '@xyo-network/payload-model';
2
+ export declare const EvmEventsSchema = "network.xyo.evm.events";
3
+ export type EvmEventsSchema = typeof EvmEventsSchema;
4
+ export type EvmEvents = Payload<{
5
+ address?: string;
6
+ eventName?: string;
7
+ fromBlock?: number;
8
+ toBlock?: number;
9
+ }, EvmEventsSchema>;
10
+ export declare const EvmEventSchema = "network.xyo.evm.event";
11
+ export type EvmEventSchema = typeof EvmEventSchema;
12
+ export type EvmEvent = Payload<{
13
+ address: string;
14
+ args: Record<string, unknown>;
15
+ block: number;
16
+ chainId: number;
17
+ eventName: string;
18
+ }, EvmEventSchema>;
19
+ //# sourceMappingURL=Payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Payload.d.ts","sourceRoot":"","sources":["../../src/Payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEpD,eAAO,MAAM,eAAe,2BAA2B,CAAA;AACvD,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAA;AAEpD,MAAM,MAAM,SAAS,GAAG,OAAO,CAC7B;IACE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,EACD,eAAe,CAChB,CAAA;AAED,eAAO,MAAM,cAAc,0BAA0B,CAAA;AACrD,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAA;AAElD,MAAM,MAAM,QAAQ,GAAG,OAAO,CAC5B;IACE,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB,EACD,cAAc,CACf,CAAA"}
@@ -0,0 +1,19 @@
1
+ import { Payload } from '@xyo-network/payload-model';
2
+ export declare const EvmEventsSchema = "network.xyo.evm.events";
3
+ export type EvmEventsSchema = typeof EvmEventsSchema;
4
+ export type EvmEvents = Payload<{
5
+ address?: string;
6
+ eventName?: string;
7
+ fromBlock?: number;
8
+ toBlock?: number;
9
+ }, EvmEventsSchema>;
10
+ export declare const EvmEventSchema = "network.xyo.evm.event";
11
+ export type EvmEventSchema = typeof EvmEventSchema;
12
+ export type EvmEvent = Payload<{
13
+ address: string;
14
+ args: Record<string, unknown>;
15
+ block: number;
16
+ chainId: number;
17
+ eventName: string;
18
+ }, EvmEventSchema>;
19
+ //# sourceMappingURL=Payload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Payload.d.ts","sourceRoot":"","sources":["../../src/Payload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEpD,eAAO,MAAM,eAAe,2BAA2B,CAAA;AACvD,MAAM,MAAM,eAAe,GAAG,OAAO,eAAe,CAAA;AAEpD,MAAM,MAAM,SAAS,GAAG,OAAO,CAC7B;IACE,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,EACD,eAAe,CAChB,CAAA;AAED,eAAO,MAAM,cAAc,0BAA0B,CAAA;AACrD,MAAM,MAAM,cAAc,GAAG,OAAO,cAAc,CAAA;AAElD,MAAM,MAAM,QAAQ,GAAG,OAAO,CAC5B;IACE,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB,EACD,cAAc,CACf,CAAA"}
@@ -0,0 +1,9 @@
1
+ import { AbstractBlockchainWitness } from '@xyo-network/witness-blockchain-abstract';
2
+ import { EvmEventsWitnessParams } from './model';
3
+ import { EvmEvent, EvmEvents } from './Payload';
4
+ export declare class EvmEventsWitness<TParams extends EvmEventsWitnessParams = EvmEventsWitnessParams> extends AbstractBlockchainWitness<TParams, EvmEvents, EvmEvent> {
5
+ static configSchemas: string[];
6
+ get abi(): string | readonly (string | import("ethers").JsonFragment)[];
7
+ protected observeHandler(inPayloads?: EvmEvents[]): Promise<EvmEvent[]>;
8
+ }
9
+ //# sourceMappingURL=Witness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAA;AAGpF,OAAO,EAAgC,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAmC,MAAM,WAAW,CAAA;AAWhF,qBAAa,gBAAgB,CAAC,OAAO,SAAS,sBAAsB,GAAG,sBAAsB,CAAE,SAAQ,yBAAyB,CAC9H,OAAO,EACP,SAAS,EACT,QAAQ,CACT;IACC,OAAgB,aAAa,WAAiC;IAE9D,IAAI,GAAG,iEAEN;cAEwB,cAAc,CAAC,UAAU,GAAE,SAAS,EAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;CAsE3F"}
@@ -0,0 +1,9 @@
1
+ import { AbstractBlockchainWitness } from '@xyo-network/witness-blockchain-abstract';
2
+ import { EvmEventsWitnessParams } from './model';
3
+ import { EvmEvent, EvmEvents } from './Payload';
4
+ export declare class EvmEventsWitness<TParams extends EvmEventsWitnessParams = EvmEventsWitnessParams> extends AbstractBlockchainWitness<TParams, EvmEvents, EvmEvent> {
5
+ static configSchemas: string[];
6
+ get abi(): string | readonly (string | import("ethers").JsonFragment)[];
7
+ protected observeHandler(inPayloads?: EvmEvents[]): Promise<EvmEvent[]>;
8
+ }
9
+ //# sourceMappingURL=Witness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAA;AAGpF,OAAO,EAAgC,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAmC,MAAM,WAAW,CAAA;AAWhF,qBAAa,gBAAgB,CAAC,OAAO,SAAS,sBAAsB,GAAG,sBAAsB,CAAE,SAAQ,yBAAyB,CAC9H,OAAO,EACP,SAAS,EACT,QAAQ,CACT;IACC,OAAgB,aAAa,WAAiC;IAE9D,IAAI,GAAG,iEAEN;cAEwB,cAAc,CAAC,UAAU,GAAE,SAAS,EAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;CAsE3F"}
@@ -0,0 +1,9 @@
1
+ import { AbstractBlockchainWitness } from '@xyo-network/witness-blockchain-abstract';
2
+ import { EvmEventsWitnessParams } from './model';
3
+ import { EvmEvent, EvmEvents } from './Payload';
4
+ export declare class EvmEventsWitness<TParams extends EvmEventsWitnessParams = EvmEventsWitnessParams> extends AbstractBlockchainWitness<TParams, EvmEvents, EvmEvent> {
5
+ static configSchemas: string[];
6
+ get abi(): string | readonly (string | import("ethers").JsonFragment)[];
7
+ protected observeHandler(inPayloads?: EvmEvents[]): Promise<EvmEvent[]>;
8
+ }
9
+ //# sourceMappingURL=Witness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0CAA0C,CAAA;AAGpF,OAAO,EAAgC,sBAAsB,EAAE,MAAM,SAAS,CAAA;AAC9E,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAmC,MAAM,WAAW,CAAA;AAWhF,qBAAa,gBAAgB,CAAC,OAAO,SAAS,sBAAsB,GAAG,sBAAsB,CAAE,SAAQ,yBAAyB,CAC9H,OAAO,EACP,SAAS,EACT,QAAQ,CACT;IACC,OAAgB,aAAa,WAAiC;IAE9D,IAAI,GAAG,iEAEN;cAEwB,cAAc,CAAC,UAAU,GAAE,SAAS,EAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;CAsE3F"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ EvmEventSchema: () => EvmEventSchema,
24
+ EvmEventsSchema: () => EvmEventsSchema,
25
+ EvmEventsWitness: () => EvmEventsWitness,
26
+ EvmEventsWitnessConfigSchema: () => EvmEventsWitnessConfigSchema
27
+ });
28
+ module.exports = __toCommonJS(src_exports);
29
+
30
+ // src/model.ts
31
+ var EvmEventsWitnessConfigSchema = "network.xyo.evm.events.witness.config";
32
+
33
+ // src/Payload.ts
34
+ var EvmEventsSchema = "network.xyo.evm.events";
35
+ var EvmEventSchema = "network.xyo.evm.event";
36
+
37
+ // src/Witness.ts
38
+ var import_assert = require("@xylabs/assert");
39
+ var import_exists = require("@xylabs/exists");
40
+ var import_hex = require("@xylabs/hex");
41
+ var import_payload_model = require("@xyo-network/payload-model");
42
+ var import_witness_blockchain_abstract = require("@xyo-network/witness-blockchain-abstract");
43
+ var import_ethers = require("ethers");
44
+ var EvmEventsWitness = class extends import_witness_blockchain_abstract.AbstractBlockchainWitness {
45
+ static configSchemas = [EvmEventsWitnessConfigSchema];
46
+ get abi() {
47
+ return (0, import_assert.assertEx)(this.config.abi, "Missing abi");
48
+ }
49
+ async observeHandler(inPayloads = []) {
50
+ await this.started("throw");
51
+ await this.getProviders();
52
+ try {
53
+ const observations = (await Promise.all(
54
+ inPayloads.filter((0, import_payload_model.isPayloadOfSchemaType)(EvmEventsSchema)).map(async ({ eventName, address, fromBlock: payloadFromBlock, toBlock: payloadToBlock }) => {
55
+ var _a;
56
+ const validatedAddress = (0, import_assert.assertEx)(address ?? this.config.address, "Missing address");
57
+ const validatedEventName = (0, import_assert.assertEx)(eventName ?? this.config.eventName, "Missing eventName");
58
+ const provider = await this.getProvider(true, true);
59
+ const network = await provider.getNetwork();
60
+ const contract = new import_ethers.Contract(validatedAddress, this.abi, provider);
61
+ const abiArray = (0, import_assert.assertEx)(Array.isArray(this.abi) ? this.abi : void 0, "Abi is not an array");
62
+ const abiEvent = (0, import_assert.assertEx)(
63
+ abiArray.find((entry) => entry.type === "event" && entry.name === validatedEventName),
64
+ "Could not find event"
65
+ );
66
+ const fromBlock = this.config.fromBlock ?? payloadFromBlock ?? ((_a = contract.deploymentTransaction()) == null ? void 0 : _a.blockNumber) ?? void 0;
67
+ const toBlock = this.config.toBlock ?? payloadToBlock ?? await provider.getBlockNumber();
68
+ const rawEvents = await contract.queryFilter(contract.filters[validatedEventName], fromBlock, toBlock);
69
+ const observation = rawEvents.map((rawLog) => {
70
+ const rawEvent = rawLog;
71
+ if (rawEvent.args) {
72
+ const argsObject = {};
73
+ abiEvent.inputs.map((input, index) => {
74
+ const value = rawEvent.args[index];
75
+ if (typeof value === "bigint") {
76
+ argsObject[input.name] = (0, import_hex.hexFromBigInt)(value);
77
+ } else {
78
+ argsObject[input.name] = value;
79
+ }
80
+ });
81
+ const eventResult = {
82
+ address: rawEvent.address,
83
+ args: argsObject,
84
+ block: rawEvent.blockNumber,
85
+ chainId: Number(network.chainId),
86
+ eventName: validatedEventName,
87
+ schema: EvmEventSchema
88
+ };
89
+ return eventResult;
90
+ }
91
+ }).filter(import_exists.exists);
92
+ console.log(`observation: ${JSON.stringify(observation, null, 2)}`);
93
+ return observation;
94
+ })
95
+ )).flat();
96
+ return observations;
97
+ } catch (ex) {
98
+ const error = ex;
99
+ console.log(`Error [${this.config.name}]: ${error.message}`);
100
+ throw error;
101
+ }
102
+ }
103
+ };
104
+ // Annotate the CommonJS export names for ESM import in node:
105
+ 0 && (module.exports = {
106
+ EvmEventSchema,
107
+ EvmEventsSchema,
108
+ EvmEventsWitness,
109
+ EvmEventsWitnessConfigSchema
110
+ });
111
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts","../../src/model.ts","../../src/Payload.ts","../../src/Witness.ts"],"sourcesContent":["export * from './model'\nexport * from './Payload'\nexport * from './Witness'\n","import { BlockchainWitnessConfig, BlockchainWitnessParams } from '@xyo-network/witness-blockchain-abstract'\nimport { JsonFragment } from 'ethers'\n\nexport type Abi = string | ReadonlyArray<JsonFragment | string>\n\nexport const EvmEventsWitnessConfigSchema = 'network.xyo.evm.events.witness.config'\nexport type EvmEventsWitnessConfigSchema = typeof EvmEventsWitnessConfigSchema\n\nexport type EvmEventsWitnessConfig = BlockchainWitnessConfig<\n {\n abi?: Abi\n address?: string\n eventName?: string\n fromBlock?: number\n toBlock?: number\n },\n EvmEventsWitnessConfigSchema\n>\n\nexport type EvmEventsWitnessParams = BlockchainWitnessParams<EvmEventsWitnessConfig>\n","import { Payload } from '@xyo-network/payload-model'\n\nexport const EvmEventsSchema = 'network.xyo.evm.events'\nexport type EvmEventsSchema = typeof EvmEventsSchema\n\nexport type EvmEvents = Payload<\n {\n address?: string\n eventName?: string\n fromBlock?: number\n toBlock?: number\n },\n EvmEventsSchema\n>\n\nexport const EvmEventSchema = 'network.xyo.evm.event'\nexport type EvmEventSchema = typeof EvmEventSchema\n\nexport type EvmEvent = Payload<\n {\n address: string\n args: Record<string, unknown>\n block: number\n chainId: number\n eventName: string\n },\n EvmEventSchema\n>\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { hexFromBigInt } from '@xylabs/hex'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\nimport { AbstractBlockchainWitness } from '@xyo-network/witness-blockchain-abstract'\nimport { Contract, EventLog } from 'ethers'\n\nimport { EvmEventsWitnessConfigSchema, EvmEventsWitnessParams } from './model'\nimport { EvmEvent, EvmEvents, EvmEventSchema, EvmEventsSchema } from './Payload'\n\nconst bigIntArrayToHexString = (items: unknown[]) => {\n return items.map((item) => {\n if (typeof item === 'bigint') {\n return hexFromBigInt(item)\n }\n return item\n })\n}\n\nexport class EvmEventsWitness<TParams extends EvmEventsWitnessParams = EvmEventsWitnessParams> extends AbstractBlockchainWitness<\n TParams,\n EvmEvents,\n EvmEvent\n> {\n static override configSchemas = [EvmEventsWitnessConfigSchema]\n\n get abi() {\n return assertEx(this.config.abi, 'Missing abi')\n }\n\n protected override async observeHandler(inPayloads: EvmEvents[] = []): Promise<EvmEvent[]> {\n await this.started('throw')\n //calling it here to make sure we rests the cache\n await this.getProviders()\n try {\n const observations = (\n await Promise.all(\n inPayloads\n .filter(isPayloadOfSchemaType<EvmEvents>(EvmEventsSchema))\n .map(async ({ eventName, address, fromBlock: payloadFromBlock, toBlock: payloadToBlock }) => {\n const validatedAddress = assertEx(address ?? this.config.address, 'Missing address')\n const validatedEventName = assertEx(eventName ?? this.config.eventName, 'Missing eventName')\n\n const provider = await this.getProvider(true, true)\n const network = await provider.getNetwork()\n\n const contract = new Contract(validatedAddress, this.abi, provider)\n\n const abiArray = assertEx(Array.isArray(this.abi) ? this.abi : undefined, 'Abi is not an array')\n\n const abiEvent = assertEx(\n abiArray.find((entry) => entry.type === 'event' && entry.name === validatedEventName),\n 'Could not find event',\n )\n\n const fromBlock = this.config.fromBlock ?? payloadFromBlock ?? contract.deploymentTransaction()?.blockNumber ?? undefined\n const toBlock = this.config.toBlock ?? payloadToBlock ?? (await provider.getBlockNumber())\n\n const rawEvents = await contract.queryFilter(contract.filters[validatedEventName], fromBlock, toBlock)\n\n const observation = rawEvents\n .map((rawLog) => {\n const rawEvent = rawLog as EventLog\n if (rawEvent.args) {\n const argsObject: Record<string, unknown> = {}\n\n abiEvent.inputs.map((input: { name: string }, index: number) => {\n const value = rawEvent.args[index]\n if (typeof value === 'bigint') {\n argsObject[input.name] = hexFromBigInt(value)\n } else {\n argsObject[input.name] = value\n }\n })\n\n const eventResult: EvmEvent = {\n address: rawEvent.address,\n args: argsObject,\n block: rawEvent.blockNumber,\n chainId: Number(network.chainId),\n eventName: validatedEventName,\n schema: EvmEventSchema,\n }\n return eventResult\n }\n })\n .filter(exists)\n\n console.log(`observation: ${JSON.stringify(observation, null, 2)}`)\n return observation\n }),\n )\n ).flat()\n return observations\n } catch (ex) {\n const error = ex as Error\n console.log(`Error [${this.config.name}]: ${error.message}`)\n throw error\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKO,IAAM,+BAA+B;;;ACHrC,IAAM,kBAAkB;AAaxB,IAAM,iBAAiB;;;ACf9B,oBAAyB;AACzB,oBAAuB;AACvB,iBAA8B;AAC9B,2BAAsC;AACtC,yCAA0C;AAC1C,oBAAmC;AAc5B,IAAM,mBAAN,cAAgG,6DAIrG;AAAA,EACA,OAAgB,gBAAgB,CAAC,4BAA4B;AAAA,EAE7D,IAAI,MAAM;AACR,eAAO,wBAAS,KAAK,OAAO,KAAK,aAAa;AAAA,EAChD;AAAA,EAEA,MAAyB,eAAe,aAA0B,CAAC,GAAwB;AACzF,UAAM,KAAK,QAAQ,OAAO;AAE1B,UAAM,KAAK,aAAa;AACxB,QAAI;AACF,YAAM,gBACJ,MAAM,QAAQ;AAAA,QACZ,WACG,WAAO,4CAAiC,eAAe,CAAC,EACxD,IAAI,OAAO,EAAE,WAAW,SAAS,WAAW,kBAAkB,SAAS,eAAe,MAAM;AAvCzG;AAwCc,gBAAM,uBAAmB,wBAAS,WAAW,KAAK,OAAO,SAAS,iBAAiB;AACnF,gBAAM,yBAAqB,wBAAS,aAAa,KAAK,OAAO,WAAW,mBAAmB;AAE3F,gBAAM,WAAW,MAAM,KAAK,YAAY,MAAM,IAAI;AAClD,gBAAM,UAAU,MAAM,SAAS,WAAW;AAE1C,gBAAM,WAAW,IAAI,uBAAS,kBAAkB,KAAK,KAAK,QAAQ;AAElE,gBAAM,eAAW,wBAAS,MAAM,QAAQ,KAAK,GAAG,IAAI,KAAK,MAAM,QAAW,qBAAqB;AAE/F,gBAAM,eAAW;AAAA,YACf,SAAS,KAAK,CAAC,UAAU,MAAM,SAAS,WAAW,MAAM,SAAS,kBAAkB;AAAA,YACpF;AAAA,UACF;AAEA,gBAAM,YAAY,KAAK,OAAO,aAAa,sBAAoB,cAAS,sBAAsB,MAA/B,mBAAkC,gBAAe;AAChH,gBAAM,UAAU,KAAK,OAAO,WAAW,kBAAmB,MAAM,SAAS,eAAe;AAExF,gBAAM,YAAY,MAAM,SAAS,YAAY,SAAS,QAAQ,kBAAkB,GAAG,WAAW,OAAO;AAErG,gBAAM,cAAc,UACjB,IAAI,CAAC,WAAW;AACf,kBAAM,WAAW;AACjB,gBAAI,SAAS,MAAM;AACjB,oBAAM,aAAsC,CAAC;AAE7C,uBAAS,OAAO,IAAI,CAAC,OAAyB,UAAkB;AAC9D,sBAAM,QAAQ,SAAS,KAAK,KAAK;AACjC,oBAAI,OAAO,UAAU,UAAU;AAC7B,6BAAW,MAAM,IAAI,QAAI,0BAAc,KAAK;AAAA,gBAC9C,OAAO;AACL,6BAAW,MAAM,IAAI,IAAI;AAAA,gBAC3B;AAAA,cACF,CAAC;AAED,oBAAM,cAAwB;AAAA,gBAC5B,SAAS,SAAS;AAAA,gBAClB,MAAM;AAAA,gBACN,OAAO,SAAS;AAAA,gBAChB,SAAS,OAAO,QAAQ,OAAO;AAAA,gBAC/B,WAAW;AAAA,gBACX,QAAQ;AAAA,cACV;AACA,qBAAO;AAAA,YACT;AAAA,UACF,CAAC,EACA,OAAO,oBAAM;AAEhB,kBAAQ,IAAI,gBAAgB,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC,EAAE;AAClE,iBAAO;AAAA,QACT,CAAC;AAAA,MACL,GACA,KAAK;AACP,aAAO;AAAA,IACT,SAAS,IAAI;AACX,YAAM,QAAQ;AACd,cAAQ,IAAI,UAAU,KAAK,OAAO,IAAI,MAAM,MAAM,OAAO,EAAE;AAC3D,YAAM;AAAA,IACR;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,4 @@
1
+ export * from './model';
2
+ export * from './Payload';
3
+ export * from './Witness';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './model';
2
+ export * from './Payload';
3
+ export * from './Witness';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './model';
2
+ export * from './Payload';
3
+ export * from './Witness';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA"}
@@ -0,0 +1,81 @@
1
+ // src/model.ts
2
+ var EvmEventsWitnessConfigSchema = "network.xyo.evm.events.witness.config";
3
+
4
+ // src/Payload.ts
5
+ var EvmEventsSchema = "network.xyo.evm.events";
6
+ var EvmEventSchema = "network.xyo.evm.event";
7
+
8
+ // src/Witness.ts
9
+ import { assertEx } from "@xylabs/assert";
10
+ import { exists } from "@xylabs/exists";
11
+ import { hexFromBigInt } from "@xylabs/hex";
12
+ import { isPayloadOfSchemaType } from "@xyo-network/payload-model";
13
+ import { AbstractBlockchainWitness } from "@xyo-network/witness-blockchain-abstract";
14
+ import { Contract } from "ethers";
15
+ var EvmEventsWitness = class extends AbstractBlockchainWitness {
16
+ static configSchemas = [EvmEventsWitnessConfigSchema];
17
+ get abi() {
18
+ return assertEx(this.config.abi, "Missing abi");
19
+ }
20
+ async observeHandler(inPayloads = []) {
21
+ await this.started("throw");
22
+ await this.getProviders();
23
+ try {
24
+ const observations = (await Promise.all(
25
+ inPayloads.filter(isPayloadOfSchemaType(EvmEventsSchema)).map(async ({ eventName, address, fromBlock: payloadFromBlock, toBlock: payloadToBlock }) => {
26
+ var _a;
27
+ const validatedAddress = assertEx(address ?? this.config.address, "Missing address");
28
+ const validatedEventName = assertEx(eventName ?? this.config.eventName, "Missing eventName");
29
+ const provider = await this.getProvider(true, true);
30
+ const network = await provider.getNetwork();
31
+ const contract = new Contract(validatedAddress, this.abi, provider);
32
+ const abiArray = assertEx(Array.isArray(this.abi) ? this.abi : void 0, "Abi is not an array");
33
+ const abiEvent = assertEx(
34
+ abiArray.find((entry) => entry.type === "event" && entry.name === validatedEventName),
35
+ "Could not find event"
36
+ );
37
+ const fromBlock = this.config.fromBlock ?? payloadFromBlock ?? ((_a = contract.deploymentTransaction()) == null ? void 0 : _a.blockNumber) ?? void 0;
38
+ const toBlock = this.config.toBlock ?? payloadToBlock ?? await provider.getBlockNumber();
39
+ const rawEvents = await contract.queryFilter(contract.filters[validatedEventName], fromBlock, toBlock);
40
+ const observation = rawEvents.map((rawLog) => {
41
+ const rawEvent = rawLog;
42
+ if (rawEvent.args) {
43
+ const argsObject = {};
44
+ abiEvent.inputs.map((input, index) => {
45
+ const value = rawEvent.args[index];
46
+ if (typeof value === "bigint") {
47
+ argsObject[input.name] = hexFromBigInt(value);
48
+ } else {
49
+ argsObject[input.name] = value;
50
+ }
51
+ });
52
+ const eventResult = {
53
+ address: rawEvent.address,
54
+ args: argsObject,
55
+ block: rawEvent.blockNumber,
56
+ chainId: Number(network.chainId),
57
+ eventName: validatedEventName,
58
+ schema: EvmEventSchema
59
+ };
60
+ return eventResult;
61
+ }
62
+ }).filter(exists);
63
+ console.log(`observation: ${JSON.stringify(observation, null, 2)}`);
64
+ return observation;
65
+ })
66
+ )).flat();
67
+ return observations;
68
+ } catch (ex) {
69
+ const error = ex;
70
+ console.log(`Error [${this.config.name}]: ${error.message}`);
71
+ throw error;
72
+ }
73
+ }
74
+ };
75
+ export {
76
+ EvmEventSchema,
77
+ EvmEventsSchema,
78
+ EvmEventsWitness,
79
+ EvmEventsWitnessConfigSchema
80
+ };
81
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/model.ts","../../src/Payload.ts","../../src/Witness.ts"],"sourcesContent":["import { BlockchainWitnessConfig, BlockchainWitnessParams } from '@xyo-network/witness-blockchain-abstract'\nimport { JsonFragment } from 'ethers'\n\nexport type Abi = string | ReadonlyArray<JsonFragment | string>\n\nexport const EvmEventsWitnessConfigSchema = 'network.xyo.evm.events.witness.config'\nexport type EvmEventsWitnessConfigSchema = typeof EvmEventsWitnessConfigSchema\n\nexport type EvmEventsWitnessConfig = BlockchainWitnessConfig<\n {\n abi?: Abi\n address?: string\n eventName?: string\n fromBlock?: number\n toBlock?: number\n },\n EvmEventsWitnessConfigSchema\n>\n\nexport type EvmEventsWitnessParams = BlockchainWitnessParams<EvmEventsWitnessConfig>\n","import { Payload } from '@xyo-network/payload-model'\n\nexport const EvmEventsSchema = 'network.xyo.evm.events'\nexport type EvmEventsSchema = typeof EvmEventsSchema\n\nexport type EvmEvents = Payload<\n {\n address?: string\n eventName?: string\n fromBlock?: number\n toBlock?: number\n },\n EvmEventsSchema\n>\n\nexport const EvmEventSchema = 'network.xyo.evm.event'\nexport type EvmEventSchema = typeof EvmEventSchema\n\nexport type EvmEvent = Payload<\n {\n address: string\n args: Record<string, unknown>\n block: number\n chainId: number\n eventName: string\n },\n EvmEventSchema\n>\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { hexFromBigInt } from '@xylabs/hex'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\nimport { AbstractBlockchainWitness } from '@xyo-network/witness-blockchain-abstract'\nimport { Contract, EventLog } from 'ethers'\n\nimport { EvmEventsWitnessConfigSchema, EvmEventsWitnessParams } from './model'\nimport { EvmEvent, EvmEvents, EvmEventSchema, EvmEventsSchema } from './Payload'\n\nconst bigIntArrayToHexString = (items: unknown[]) => {\n return items.map((item) => {\n if (typeof item === 'bigint') {\n return hexFromBigInt(item)\n }\n return item\n })\n}\n\nexport class EvmEventsWitness<TParams extends EvmEventsWitnessParams = EvmEventsWitnessParams> extends AbstractBlockchainWitness<\n TParams,\n EvmEvents,\n EvmEvent\n> {\n static override configSchemas = [EvmEventsWitnessConfigSchema]\n\n get abi() {\n return assertEx(this.config.abi, 'Missing abi')\n }\n\n protected override async observeHandler(inPayloads: EvmEvents[] = []): Promise<EvmEvent[]> {\n await this.started('throw')\n //calling it here to make sure we rests the cache\n await this.getProviders()\n try {\n const observations = (\n await Promise.all(\n inPayloads\n .filter(isPayloadOfSchemaType<EvmEvents>(EvmEventsSchema))\n .map(async ({ eventName, address, fromBlock: payloadFromBlock, toBlock: payloadToBlock }) => {\n const validatedAddress = assertEx(address ?? this.config.address, 'Missing address')\n const validatedEventName = assertEx(eventName ?? this.config.eventName, 'Missing eventName')\n\n const provider = await this.getProvider(true, true)\n const network = await provider.getNetwork()\n\n const contract = new Contract(validatedAddress, this.abi, provider)\n\n const abiArray = assertEx(Array.isArray(this.abi) ? this.abi : undefined, 'Abi is not an array')\n\n const abiEvent = assertEx(\n abiArray.find((entry) => entry.type === 'event' && entry.name === validatedEventName),\n 'Could not find event',\n )\n\n const fromBlock = this.config.fromBlock ?? payloadFromBlock ?? contract.deploymentTransaction()?.blockNumber ?? undefined\n const toBlock = this.config.toBlock ?? payloadToBlock ?? (await provider.getBlockNumber())\n\n const rawEvents = await contract.queryFilter(contract.filters[validatedEventName], fromBlock, toBlock)\n\n const observation = rawEvents\n .map((rawLog) => {\n const rawEvent = rawLog as EventLog\n if (rawEvent.args) {\n const argsObject: Record<string, unknown> = {}\n\n abiEvent.inputs.map((input: { name: string }, index: number) => {\n const value = rawEvent.args[index]\n if (typeof value === 'bigint') {\n argsObject[input.name] = hexFromBigInt(value)\n } else {\n argsObject[input.name] = value\n }\n })\n\n const eventResult: EvmEvent = {\n address: rawEvent.address,\n args: argsObject,\n block: rawEvent.blockNumber,\n chainId: Number(network.chainId),\n eventName: validatedEventName,\n schema: EvmEventSchema,\n }\n return eventResult\n }\n })\n .filter(exists)\n\n console.log(`observation: ${JSON.stringify(observation, null, 2)}`)\n return observation\n }),\n )\n ).flat()\n return observations\n } catch (ex) {\n const error = ex as Error\n console.log(`Error [${this.config.name}]: ${error.message}`)\n throw error\n }\n }\n}\n"],"mappings":";AAKO,IAAM,+BAA+B;;;ACHrC,IAAM,kBAAkB;AAaxB,IAAM,iBAAiB;;;ACf9B,SAAS,gBAAgB;AACzB,SAAS,cAAc;AACvB,SAAS,qBAAqB;AAC9B,SAAS,6BAA6B;AACtC,SAAS,iCAAiC;AAC1C,SAAS,gBAA0B;AAc5B,IAAM,mBAAN,cAAgG,0BAIrG;AAAA,EACA,OAAgB,gBAAgB,CAAC,4BAA4B;AAAA,EAE7D,IAAI,MAAM;AACR,WAAO,SAAS,KAAK,OAAO,KAAK,aAAa;AAAA,EAChD;AAAA,EAEA,MAAyB,eAAe,aAA0B,CAAC,GAAwB;AACzF,UAAM,KAAK,QAAQ,OAAO;AAE1B,UAAM,KAAK,aAAa;AACxB,QAAI;AACF,YAAM,gBACJ,MAAM,QAAQ;AAAA,QACZ,WACG,OAAO,sBAAiC,eAAe,CAAC,EACxD,IAAI,OAAO,EAAE,WAAW,SAAS,WAAW,kBAAkB,SAAS,eAAe,MAAM;AAvCzG;AAwCc,gBAAM,mBAAmB,SAAS,WAAW,KAAK,OAAO,SAAS,iBAAiB;AACnF,gBAAM,qBAAqB,SAAS,aAAa,KAAK,OAAO,WAAW,mBAAmB;AAE3F,gBAAM,WAAW,MAAM,KAAK,YAAY,MAAM,IAAI;AAClD,gBAAM,UAAU,MAAM,SAAS,WAAW;AAE1C,gBAAM,WAAW,IAAI,SAAS,kBAAkB,KAAK,KAAK,QAAQ;AAElE,gBAAM,WAAW,SAAS,MAAM,QAAQ,KAAK,GAAG,IAAI,KAAK,MAAM,QAAW,qBAAqB;AAE/F,gBAAM,WAAW;AAAA,YACf,SAAS,KAAK,CAAC,UAAU,MAAM,SAAS,WAAW,MAAM,SAAS,kBAAkB;AAAA,YACpF;AAAA,UACF;AAEA,gBAAM,YAAY,KAAK,OAAO,aAAa,sBAAoB,cAAS,sBAAsB,MAA/B,mBAAkC,gBAAe;AAChH,gBAAM,UAAU,KAAK,OAAO,WAAW,kBAAmB,MAAM,SAAS,eAAe;AAExF,gBAAM,YAAY,MAAM,SAAS,YAAY,SAAS,QAAQ,kBAAkB,GAAG,WAAW,OAAO;AAErG,gBAAM,cAAc,UACjB,IAAI,CAAC,WAAW;AACf,kBAAM,WAAW;AACjB,gBAAI,SAAS,MAAM;AACjB,oBAAM,aAAsC,CAAC;AAE7C,uBAAS,OAAO,IAAI,CAAC,OAAyB,UAAkB;AAC9D,sBAAM,QAAQ,SAAS,KAAK,KAAK;AACjC,oBAAI,OAAO,UAAU,UAAU;AAC7B,6BAAW,MAAM,IAAI,IAAI,cAAc,KAAK;AAAA,gBAC9C,OAAO;AACL,6BAAW,MAAM,IAAI,IAAI;AAAA,gBAC3B;AAAA,cACF,CAAC;AAED,oBAAM,cAAwB;AAAA,gBAC5B,SAAS,SAAS;AAAA,gBAClB,MAAM;AAAA,gBACN,OAAO,SAAS;AAAA,gBAChB,SAAS,OAAO,QAAQ,OAAO;AAAA,gBAC/B,WAAW;AAAA,gBACX,QAAQ;AAAA,cACV;AACA,qBAAO;AAAA,YACT;AAAA,UACF,CAAC,EACA,OAAO,MAAM;AAEhB,kBAAQ,IAAI,gBAAgB,KAAK,UAAU,aAAa,MAAM,CAAC,CAAC,EAAE;AAClE,iBAAO;AAAA,QACT,CAAC;AAAA,MACL,GACA,KAAK;AACP,aAAO;AAAA,IACT,SAAS,IAAI;AACX,YAAM,QAAQ;AACd,cAAQ,IAAI,UAAU,KAAK,OAAO,IAAI,MAAM,MAAM,OAAO,EAAE;AAC3D,YAAM;AAAA,IACR;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,14 @@
1
+ import { BlockchainWitnessConfig, BlockchainWitnessParams } from '@xyo-network/witness-blockchain-abstract';
2
+ import { JsonFragment } from 'ethers';
3
+ export type Abi = string | ReadonlyArray<JsonFragment | string>;
4
+ export declare const EvmEventsWitnessConfigSchema = "network.xyo.evm.events.witness.config";
5
+ export type EvmEventsWitnessConfigSchema = typeof EvmEventsWitnessConfigSchema;
6
+ export type EvmEventsWitnessConfig = BlockchainWitnessConfig<{
7
+ abi?: Abi;
8
+ address?: string;
9
+ eventName?: string;
10
+ fromBlock?: number;
11
+ toBlock?: number;
12
+ }, EvmEventsWitnessConfigSchema>;
13
+ export type EvmEventsWitnessParams = BlockchainWitnessParams<EvmEventsWitnessConfig>;
14
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAA;AAC3G,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAErC,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,aAAa,CAAC,YAAY,GAAG,MAAM,CAAC,CAAA;AAE/D,eAAO,MAAM,4BAA4B,0CAA0C,CAAA;AACnF,MAAM,MAAM,4BAA4B,GAAG,OAAO,4BAA4B,CAAA;AAE9E,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,CAC1D;IACE,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,EACD,4BAA4B,CAC7B,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { BlockchainWitnessConfig, BlockchainWitnessParams } from '@xyo-network/witness-blockchain-abstract';
2
+ import { JsonFragment } from 'ethers';
3
+ export type Abi = string | ReadonlyArray<JsonFragment | string>;
4
+ export declare const EvmEventsWitnessConfigSchema = "network.xyo.evm.events.witness.config";
5
+ export type EvmEventsWitnessConfigSchema = typeof EvmEventsWitnessConfigSchema;
6
+ export type EvmEventsWitnessConfig = BlockchainWitnessConfig<{
7
+ abi?: Abi;
8
+ address?: string;
9
+ eventName?: string;
10
+ fromBlock?: number;
11
+ toBlock?: number;
12
+ }, EvmEventsWitnessConfigSchema>;
13
+ export type EvmEventsWitnessParams = BlockchainWitnessParams<EvmEventsWitnessConfig>;
14
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAA;AAC3G,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAErC,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,aAAa,CAAC,YAAY,GAAG,MAAM,CAAC,CAAA;AAE/D,eAAO,MAAM,4BAA4B,0CAA0C,CAAA;AACnF,MAAM,MAAM,4BAA4B,GAAG,OAAO,4BAA4B,CAAA;AAE9E,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,CAC1D;IACE,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,EACD,4BAA4B,CAC7B,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,CAAA"}
@@ -0,0 +1,14 @@
1
+ import { BlockchainWitnessConfig, BlockchainWitnessParams } from '@xyo-network/witness-blockchain-abstract';
2
+ import { JsonFragment } from 'ethers';
3
+ export type Abi = string | ReadonlyArray<JsonFragment | string>;
4
+ export declare const EvmEventsWitnessConfigSchema = "network.xyo.evm.events.witness.config";
5
+ export type EvmEventsWitnessConfigSchema = typeof EvmEventsWitnessConfigSchema;
6
+ export type EvmEventsWitnessConfig = BlockchainWitnessConfig<{
7
+ abi?: Abi;
8
+ address?: string;
9
+ eventName?: string;
10
+ fromBlock?: number;
11
+ toBlock?: number;
12
+ }, EvmEventsWitnessConfigSchema>;
13
+ export type EvmEventsWitnessParams = BlockchainWitnessParams<EvmEventsWitnessConfig>;
14
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,0CAA0C,CAAA;AAC3G,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAErC,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,aAAa,CAAC,YAAY,GAAG,MAAM,CAAC,CAAA;AAE/D,eAAO,MAAM,4BAA4B,0CAA0C,CAAA;AACnF,MAAM,MAAM,4BAA4B,GAAG,OAAO,4BAA4B,CAAA;AAE9E,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,CAC1D;IACE,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,EACD,4BAA4B,CAC7B,CAAA;AAED,MAAM,MAAM,sBAAsB,GAAG,uBAAuB,CAAC,sBAAsB,CAAC,CAAA"}
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "@xyo-network/evm-events-witness",
3
+ "author": {
4
+ "email": "support@xyo.network",
5
+ "name": "XYO Development Team",
6
+ "url": "https://xyo.network"
7
+ },
8
+ "bugs": {
9
+ "email": "support@xyo.network",
10
+ "url": "https://github.com/XYOracleNetwork/plugins/issues"
11
+ },
12
+ "dependencies": {
13
+ "@xylabs/assert": "^2.13.20",
14
+ "@xylabs/exists": "^2.13.20",
15
+ "@xylabs/hex": "^2.13.20",
16
+ "@xyo-network/payload-model": "^2.84.8",
17
+ "@xyo-network/witness-blockchain-abstract": "^2.84.8",
18
+ "ethers": "^6.9.0"
19
+ },
20
+ "devDependencies": {
21
+ "@xylabs/jest-helpers": "^2.13.20",
22
+ "@xylabs/ts-scripts-yarn3": "^3.2.24",
23
+ "@xylabs/tsconfig": "^3.2.24",
24
+ "@xyo-network/open-zeppelin-typechain": "^3.0.5",
25
+ "jest": "^29.7.0",
26
+ "typescript": "^5.3.3"
27
+ },
28
+ "description": "Typescript/Javascript Plugins for XYO Platform",
29
+ "types": "dist/node/index.d.ts",
30
+ "exports": {
31
+ ".": {
32
+ "browser": {
33
+ "require": {
34
+ "types": "./dist/browser/index.d.cts",
35
+ "default": "./dist/browser/index.cjs"
36
+ },
37
+ "import": {
38
+ "types": "./dist/browser/index.d.mts",
39
+ "default": "./dist/browser/index.js"
40
+ }
41
+ },
42
+ "node": {
43
+ "require": {
44
+ "types": "./dist/node/index.d.cts",
45
+ "default": "./dist/node/index.cjs"
46
+ },
47
+ "import": {
48
+ "types": "./dist/node/index.d.mts",
49
+ "default": "./dist/node/index.js"
50
+ }
51
+ }
52
+ },
53
+ "./package.json": "./package.json"
54
+ },
55
+ "main": "dist/node/index.cjs",
56
+ "module": "dist/node/index.js",
57
+ "homepage": "https://xyo.network",
58
+ "license": "LGPL-3.0-only",
59
+ "publishConfig": {
60
+ "access": "public"
61
+ },
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "https://github.com/XYOracleNetwork/plugins.git"
65
+ },
66
+ "sideEffects": false,
67
+ "version": "2.84.3",
68
+ "type": "module"
69
+ }
package/src/Payload.ts ADDED
@@ -0,0 +1,28 @@
1
+ import { Payload } from '@xyo-network/payload-model'
2
+
3
+ export const EvmEventsSchema = 'network.xyo.evm.events'
4
+ export type EvmEventsSchema = typeof EvmEventsSchema
5
+
6
+ export type EvmEvents = Payload<
7
+ {
8
+ address?: string
9
+ eventName?: string
10
+ fromBlock?: number
11
+ toBlock?: number
12
+ },
13
+ EvmEventsSchema
14
+ >
15
+
16
+ export const EvmEventSchema = 'network.xyo.evm.event'
17
+ export type EvmEventSchema = typeof EvmEventSchema
18
+
19
+ export type EvmEvent = Payload<
20
+ {
21
+ address: string
22
+ args: Record<string, unknown>
23
+ block: number
24
+ chainId: number
25
+ eventName: string
26
+ },
27
+ EvmEventSchema
28
+ >
package/src/Witness.ts ADDED
@@ -0,0 +1,101 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+ import { exists } from '@xylabs/exists'
3
+ import { hexFromBigInt } from '@xylabs/hex'
4
+ import { isPayloadOfSchemaType } from '@xyo-network/payload-model'
5
+ import { AbstractBlockchainWitness } from '@xyo-network/witness-blockchain-abstract'
6
+ import { Contract, EventLog } from 'ethers'
7
+
8
+ import { EvmEventsWitnessConfigSchema, EvmEventsWitnessParams } from './model'
9
+ import { EvmEvent, EvmEvents, EvmEventSchema, EvmEventsSchema } from './Payload'
10
+
11
+ const bigIntArrayToHexString = (items: unknown[]) => {
12
+ return items.map((item) => {
13
+ if (typeof item === 'bigint') {
14
+ return hexFromBigInt(item)
15
+ }
16
+ return item
17
+ })
18
+ }
19
+
20
+ export class EvmEventsWitness<TParams extends EvmEventsWitnessParams = EvmEventsWitnessParams> extends AbstractBlockchainWitness<
21
+ TParams,
22
+ EvmEvents,
23
+ EvmEvent
24
+ > {
25
+ static override configSchemas = [EvmEventsWitnessConfigSchema]
26
+
27
+ get abi() {
28
+ return assertEx(this.config.abi, 'Missing abi')
29
+ }
30
+
31
+ protected override async observeHandler(inPayloads: EvmEvents[] = []): Promise<EvmEvent[]> {
32
+ await this.started('throw')
33
+ //calling it here to make sure we rests the cache
34
+ await this.getProviders()
35
+ try {
36
+ const observations = (
37
+ await Promise.all(
38
+ inPayloads
39
+ .filter(isPayloadOfSchemaType<EvmEvents>(EvmEventsSchema))
40
+ .map(async ({ eventName, address, fromBlock: payloadFromBlock, toBlock: payloadToBlock }) => {
41
+ const validatedAddress = assertEx(address ?? this.config.address, 'Missing address')
42
+ const validatedEventName = assertEx(eventName ?? this.config.eventName, 'Missing eventName')
43
+
44
+ const provider = await this.getProvider(true, true)
45
+ const network = await provider.getNetwork()
46
+
47
+ const contract = new Contract(validatedAddress, this.abi, provider)
48
+
49
+ const abiArray = assertEx(Array.isArray(this.abi) ? this.abi : undefined, 'Abi is not an array')
50
+
51
+ const abiEvent = assertEx(
52
+ abiArray.find((entry) => entry.type === 'event' && entry.name === validatedEventName),
53
+ 'Could not find event',
54
+ )
55
+
56
+ const fromBlock = this.config.fromBlock ?? payloadFromBlock ?? contract.deploymentTransaction()?.blockNumber ?? undefined
57
+ const toBlock = this.config.toBlock ?? payloadToBlock ?? (await provider.getBlockNumber())
58
+
59
+ const rawEvents = await contract.queryFilter(contract.filters[validatedEventName], fromBlock, toBlock)
60
+
61
+ const observation = rawEvents
62
+ .map((rawLog) => {
63
+ const rawEvent = rawLog as EventLog
64
+ if (rawEvent.args) {
65
+ const argsObject: Record<string, unknown> = {}
66
+
67
+ abiEvent.inputs.map((input: { name: string }, index: number) => {
68
+ const value = rawEvent.args[index]
69
+ if (typeof value === 'bigint') {
70
+ argsObject[input.name] = hexFromBigInt(value)
71
+ } else {
72
+ argsObject[input.name] = value
73
+ }
74
+ })
75
+
76
+ const eventResult: EvmEvent = {
77
+ address: rawEvent.address,
78
+ args: argsObject,
79
+ block: rawEvent.blockNumber,
80
+ chainId: Number(network.chainId),
81
+ eventName: validatedEventName,
82
+ schema: EvmEventSchema,
83
+ }
84
+ return eventResult
85
+ }
86
+ })
87
+ .filter(exists)
88
+
89
+ console.log(`observation: ${JSON.stringify(observation, null, 2)}`)
90
+ return observation
91
+ }),
92
+ )
93
+ ).flat()
94
+ return observations
95
+ } catch (ex) {
96
+ const error = ex as Error
97
+ console.log(`Error [${this.config.name}]: ${error.message}`)
98
+ throw error
99
+ }
100
+ }
101
+ }
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './model'
2
+ export * from './Payload'
3
+ export * from './Witness'
package/src/model.ts ADDED
@@ -0,0 +1,20 @@
1
+ import { BlockchainWitnessConfig, BlockchainWitnessParams } from '@xyo-network/witness-blockchain-abstract'
2
+ import { JsonFragment } from 'ethers'
3
+
4
+ export type Abi = string | ReadonlyArray<JsonFragment | string>
5
+
6
+ export const EvmEventsWitnessConfigSchema = 'network.xyo.evm.events.witness.config'
7
+ export type EvmEventsWitnessConfigSchema = typeof EvmEventsWitnessConfigSchema
8
+
9
+ export type EvmEventsWitnessConfig = BlockchainWitnessConfig<
10
+ {
11
+ abi?: Abi
12
+ address?: string
13
+ eventName?: string
14
+ fromBlock?: number
15
+ toBlock?: number
16
+ },
17
+ EvmEventsWitnessConfigSchema
18
+ >
19
+
20
+ export type EvmEventsWitnessParams = BlockchainWitnessParams<EvmEventsWitnessConfig>