@xyo-network/evm-call-witness 2.99.4 → 2.99.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.
- package/dist/browser/Diviner.d.cts +2 -2
- package/dist/browser/Diviner.d.mts +2 -2
- package/dist/browser/Diviner.d.ts +2 -2
- package/dist/browser/Witness.d.cts +2 -2
- package/dist/browser/Witness.d.mts +2 -2
- package/dist/browser/Witness.d.ts +2 -2
- package/dist/browser/index.cjs +69 -52
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.cts +5 -5
- package/dist/browser/index.d.mts +5 -5
- package/dist/browser/index.d.ts +5 -5
- package/dist/browser/{index.js → index.mjs} +72 -53
- package/dist/browser/index.mjs.map +1 -0
- package/dist/neutral/Diviner.d.cts +2 -2
- package/dist/neutral/Diviner.d.mts +2 -2
- package/dist/neutral/Diviner.d.ts +2 -2
- package/dist/neutral/Witness.d.cts +2 -2
- package/dist/neutral/Witness.d.mts +2 -2
- package/dist/neutral/Witness.d.ts +2 -2
- package/dist/neutral/index.cjs +69 -52
- package/dist/neutral/index.cjs.map +1 -1
- package/dist/neutral/index.d.cts +5 -5
- package/dist/neutral/index.d.mts +5 -5
- package/dist/neutral/index.d.ts +5 -5
- package/dist/neutral/{index.js → index.mjs} +72 -53
- package/dist/neutral/index.mjs.map +1 -0
- package/dist/node/Diviner.d.cts +2 -2
- package/dist/node/Diviner.d.mts +2 -2
- package/dist/node/Diviner.d.ts +2 -2
- package/dist/node/Witness.d.cts +2 -2
- package/dist/node/Witness.d.mts +2 -2
- package/dist/node/Witness.d.ts +2 -2
- package/dist/node/index.cjs +76 -56
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +5 -5
- package/dist/node/index.d.mts +5 -5
- package/dist/node/index.d.ts +5 -5
- package/dist/node/index.mjs +184 -0
- package/dist/node/index.mjs.map +1 -0
- package/package.json +42 -42
- package/src/Diviner.ts +4 -4
- package/src/Witness.ts +8 -8
- package/src/index.ts +5 -5
- package/dist/browser/index.js.map +0 -1
- package/dist/neutral/index.js.map +0 -1
- package/dist/node/index.js +0 -162
- package/dist/node/index.js.map +0 -1
package/dist/node/index.cjs
CHANGED
|
@@ -2,7 +2,11 @@
|
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
5
6
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __reflectGet = Reflect.get;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
10
|
var __export = (target, all) => {
|
|
7
11
|
for (var name in all)
|
|
8
12
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -16,6 +20,8 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
16
20
|
return to;
|
|
17
21
|
};
|
|
18
22
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
23
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
24
|
+
var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
|
|
19
25
|
|
|
20
26
|
// src/index.ts
|
|
21
27
|
var src_exports = {};
|
|
@@ -50,23 +56,20 @@ var EvmCallDivinerLabels = {
|
|
|
50
56
|
var import_payload_model = require("@xyo-network/payload-model");
|
|
51
57
|
var EvmCallSchema = "network.xyo.evm.call";
|
|
52
58
|
var EvmCallResultSchema = "network.xyo.evm.call.result";
|
|
53
|
-
var isEvmCallSuccess = (payload) => {
|
|
59
|
+
var isEvmCallSuccess = /* @__PURE__ */ __name((payload) => {
|
|
54
60
|
return (payload == null ? void 0 : payload.result) !== void 0;
|
|
55
|
-
};
|
|
56
|
-
var isEvmCallFailure = (payload) => {
|
|
61
|
+
}, "isEvmCallSuccess");
|
|
62
|
+
var isEvmCallFailure = /* @__PURE__ */ __name((payload) => {
|
|
57
63
|
return (payload == null ? void 0 : payload.error) !== void 0;
|
|
58
|
-
};
|
|
64
|
+
}, "isEvmCallFailure");
|
|
59
65
|
var isEvmCallResult = (0, import_payload_model.isPayloadOfSchemaType)(EvmCallResultSchema);
|
|
60
|
-
var asEvmCallSuccess = (payload) => isEvmCallSuccess(payload) ? payload : void 0;
|
|
61
|
-
var asEvmCallFailure = (payload) => isEvmCallFailure(payload) ? payload : void 0;
|
|
66
|
+
var asEvmCallSuccess = /* @__PURE__ */ __name((payload) => isEvmCallSuccess(payload) ? payload : void 0, "asEvmCallSuccess");
|
|
67
|
+
var asEvmCallFailure = /* @__PURE__ */ __name((payload) => isEvmCallFailure(payload) ? payload : void 0, "asEvmCallFailure");
|
|
62
68
|
|
|
63
69
|
// src/Diviner.ts
|
|
64
70
|
var EvmCallDivinerConfigSchema = "network.xyo.evm.call.diviner.config";
|
|
65
71
|
var EvmCallResultsSchema = "network.xyo.evm.call.results";
|
|
66
|
-
var
|
|
67
|
-
static configSchemas = [...super.configSchemas, EvmCallDivinerConfigSchema];
|
|
68
|
-
static defaultConfigSchema = EvmCallDivinerConfigSchema;
|
|
69
|
-
static labels = { ...super.labels, ...EvmCallDivinerLabels };
|
|
72
|
+
var _EvmCallDiviner = class _EvmCallDiviner extends import_diviner_abstract.AbstractDiviner {
|
|
70
73
|
static findCallResult(address, functionName, payloads) {
|
|
71
74
|
var _a;
|
|
72
75
|
const foundPayload = payloads.find((payload) => payload.functionName === functionName && payload.address === address);
|
|
@@ -98,28 +101,40 @@ var EvmCallDiviner = class _EvmCallDiviner extends import_diviner_abstract.Abstr
|
|
|
98
101
|
return prev;
|
|
99
102
|
}, {})
|
|
100
103
|
);
|
|
101
|
-
const result = await Promise.all(
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
})
|
|
110
|
-
);
|
|
104
|
+
const result = await Promise.all(addresses.map(async (address) => {
|
|
105
|
+
const foundCallResults = callResults.filter((callResult) => callResult.address === address);
|
|
106
|
+
const results = {
|
|
107
|
+
results: await this.reduceResults(foundCallResults),
|
|
108
|
+
...this.contractInfoRequiredFields(foundCallResults)
|
|
109
|
+
};
|
|
110
|
+
return results;
|
|
111
|
+
}));
|
|
111
112
|
return result;
|
|
112
113
|
}
|
|
113
114
|
reduceResults(callResults) {
|
|
114
115
|
return callResults.reduce((prev, callResult) => {
|
|
115
116
|
const typedCallResult = asEvmCallSuccess(callResult);
|
|
116
117
|
if (typedCallResult) {
|
|
117
|
-
prev[callResult.functionName] = {
|
|
118
|
+
prev[callResult.functionName] = {
|
|
119
|
+
args: typedCallResult.args,
|
|
120
|
+
result: typedCallResult == null ? void 0 : typedCallResult.result
|
|
121
|
+
};
|
|
118
122
|
}
|
|
119
123
|
return prev;
|
|
120
124
|
}, {});
|
|
121
125
|
}
|
|
122
126
|
};
|
|
127
|
+
__name(_EvmCallDiviner, "EvmCallDiviner");
|
|
128
|
+
__publicField(_EvmCallDiviner, "configSchemas", [
|
|
129
|
+
...__superGet(_EvmCallDiviner, _EvmCallDiviner, "configSchemas"),
|
|
130
|
+
EvmCallDivinerConfigSchema
|
|
131
|
+
]);
|
|
132
|
+
__publicField(_EvmCallDiviner, "defaultConfigSchema", EvmCallDivinerConfigSchema);
|
|
133
|
+
__publicField(_EvmCallDiviner, "labels", {
|
|
134
|
+
...__superGet(_EvmCallDiviner, _EvmCallDiviner, "labels"),
|
|
135
|
+
...EvmCallDivinerLabels
|
|
136
|
+
});
|
|
137
|
+
var EvmCallDiviner = _EvmCallDiviner;
|
|
123
138
|
|
|
124
139
|
// src/model.ts
|
|
125
140
|
var EvmCallWitnessConfigSchema = "network.xyo.evm.call.witness.config";
|
|
@@ -132,9 +147,7 @@ var import_erc1967_witness = require("@xyo-network/erc1967-witness");
|
|
|
132
147
|
var import_payload_model3 = require("@xyo-network/payload-model");
|
|
133
148
|
var import_witness_evm_abstract = require("@xyo-network/witness-evm-abstract");
|
|
134
149
|
var import_ethers = require("ethers");
|
|
135
|
-
var
|
|
136
|
-
static configSchemas = [...super.configSchemas, EvmCallWitnessConfigSchema];
|
|
137
|
-
static defaultConfigSchema = EvmCallWitnessConfigSchema;
|
|
150
|
+
var _EvmCallWitness = class _EvmCallWitness extends import_witness_evm_abstract.AbstractEvmWitness {
|
|
138
151
|
get abi() {
|
|
139
152
|
return (0, import_assert2.assertEx)(this.config.abi, () => "Missing abi");
|
|
140
153
|
}
|
|
@@ -142,38 +155,38 @@ var EvmCallWitness = class extends import_witness_evm_abstract.AbstractEvmWitnes
|
|
|
142
155
|
await this.started("throw");
|
|
143
156
|
await this.getProviders();
|
|
144
157
|
try {
|
|
145
|
-
const observations = await Promise.all(
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
);
|
|
158
|
+
const observations = await Promise.all(inPayloads.filter((0, import_payload_model3.isPayloadOfSchemaType)(EvmCallSchema)).map(async ({ functionName, args, address, block: payloadBlock }) => {
|
|
159
|
+
const validatedAddress = (0, import_assert2.assertEx)(address ?? this.config.address, () => "Missing address");
|
|
160
|
+
const validatedFunctionName = (0, import_assert2.assertEx)(functionName ?? this.config.functionName, () => "Missing address");
|
|
161
|
+
const mergedArgs = [
|
|
162
|
+
...args ?? this.config.args ?? []
|
|
163
|
+
];
|
|
164
|
+
const provider = await this.getProvider(true, true);
|
|
165
|
+
const block = this.config.block ?? payloadBlock ?? await provider.getBlockNumber();
|
|
166
|
+
const erc1967Status = await (0, import_erc1967_witness.getErc1967SlotStatus)(provider, validatedAddress, block);
|
|
167
|
+
const erc1822Status = await (0, import_erc1822_witness.getErc1822SlotStatus)(provider, validatedAddress, block);
|
|
168
|
+
const implementation = (0, import_hex.isHexZero)(erc1967Status.slots.implementation ?? "0x00") ? erc1822Status.implementation : erc1967Status.implementation;
|
|
169
|
+
const contract = new import_ethers.Contract(implementation, this.abi, provider);
|
|
170
|
+
let transformedResult;
|
|
171
|
+
try {
|
|
172
|
+
const result = await contract[validatedFunctionName](...mergedArgs);
|
|
173
|
+
transformedResult = typeof result === "bigint" ? `0x${result.toString(16)}` : result;
|
|
174
|
+
} catch {
|
|
175
|
+
}
|
|
176
|
+
const observation = {
|
|
177
|
+
address: validatedAddress,
|
|
178
|
+
args: mergedArgs,
|
|
179
|
+
block,
|
|
180
|
+
chainId: Number((await provider.getNetwork()).chainId),
|
|
181
|
+
functionName: validatedFunctionName,
|
|
182
|
+
result: transformedResult,
|
|
183
|
+
schema: EvmCallResultSchema
|
|
184
|
+
};
|
|
185
|
+
if (implementation !== validatedAddress) {
|
|
186
|
+
observation.implementation = implementation;
|
|
187
|
+
}
|
|
188
|
+
return observation;
|
|
189
|
+
}));
|
|
177
190
|
return observations;
|
|
178
191
|
} catch (ex) {
|
|
179
192
|
const error = ex;
|
|
@@ -182,6 +195,13 @@ var EvmCallWitness = class extends import_witness_evm_abstract.AbstractEvmWitnes
|
|
|
182
195
|
}
|
|
183
196
|
}
|
|
184
197
|
};
|
|
198
|
+
__name(_EvmCallWitness, "EvmCallWitness");
|
|
199
|
+
__publicField(_EvmCallWitness, "configSchemas", [
|
|
200
|
+
...__superGet(_EvmCallWitness, _EvmCallWitness, "configSchemas"),
|
|
201
|
+
EvmCallWitnessConfigSchema
|
|
202
|
+
]);
|
|
203
|
+
__publicField(_EvmCallWitness, "defaultConfigSchema", EvmCallWitnessConfigSchema);
|
|
204
|
+
var EvmCallWitness = _EvmCallWitness;
|
|
185
205
|
// Annotate the CommonJS export names for ESM import in node:
|
|
186
206
|
0 && (module.exports = {
|
|
187
207
|
EvmCallDiviner,
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/Diviner.ts","../../src/Labels.ts","../../src/Payload.ts","../../src/model.ts","../../src/Witness.ts"],"sourcesContent":["export * from './Diviner.js'\nexport * from './Labels.js'\nexport * from './model.js'\nexport * from './Payload.js'\nexport * from './Witness.js'\n","import { assertEx } from '@xylabs/assert'\nimport { Promisable } from '@xylabs/promise'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model'\nimport { isPayloadOfSchemaType, Payload, Schema } from '@xyo-network/payload-model'\n\nimport { EvmCallDivinerLabels } from './Labels.js'\nimport { asEvmCallSuccess, EvmCallResult, EvmCallResultSchema } from './Payload.js'\n\nexport type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]\n\nexport const EvmCallDivinerConfigSchema = 'network.xyo.evm.call.diviner.config'\nexport type EvmCallDivinerConfigSchema = typeof EvmCallDivinerConfigSchema\n\nexport type EvmCallDivinerConfig = DivinerConfig<{\n schema: EvmCallDivinerConfigSchema\n}>\nexport type EvmCallDivinerParams = DivinerParams<EvmCallDivinerConfig>\n\nexport const EvmCallResultsSchema = 'network.xyo.evm.call.results'\nexport type EvmCallResultsSchema = typeof EvmCallResultsSchema\n\nexport type EvmCallResults = Payload<\n {\n address: string\n chainId: number\n results?: Record<\n string,\n {\n args?: unknown[]\n result: unknown\n }\n >\n },\n EvmCallResultsSchema\n>\n\nexport class EvmCallDiviner<TParams extends EvmCallDivinerParams = EvmCallDivinerParams> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallDivinerConfigSchema\n static override labels: EvmCallDivinerLabels = { ...super.labels, ...EvmCallDivinerLabels }\n\n protected static findCallResult<TResult = string>(address: string, functionName: string, payloads: EvmCallResult[]): TResult | undefined {\n const foundPayload = payloads.find((payload) => payload.functionName === functionName && payload.address === address)\n return asEvmCallSuccess(foundPayload)?.result as TResult | undefined\n }\n\n protected static matchingExistingField<R = string, T extends Payload = Payload>(objs: T[], field: keyof T): R | undefined {\n const expectedValue = objs.at(0)?.[field] as R\n // eslint-disable-next-line unicorn/no-array-reduce\n const didNotMatch = objs.reduce((prev, obj) => {\n return prev || obj[field] !== expectedValue\n }, false)\n return didNotMatch ? undefined : expectedValue\n }\n\n protected contractInfoRequiredFields(callResults: EvmCallResult[]): EvmCallResults {\n return {\n address: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'address'), () => 'Mismatched address'),\n chainId: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'chainId'), () => 'Mismatched chainId'),\n schema: EvmCallResultsSchema,\n }\n }\n\n protected override async divineHandler(inPayloads: EvmCallResult[] = []): Promise<EvmCallResults[]> {\n const callResults = inPayloads.filter(isPayloadOfSchemaType<EvmCallResult>(EvmCallResultSchema))\n const addresses = Object.keys(\n // eslint-disable-next-line unicorn/no-array-reduce\n callResults.reduce<Record<string, boolean>>((prev, result) => {\n if (result.address) {\n prev[result.address] = true\n }\n return prev\n }, {}),\n )\n const result = await Promise.all(\n addresses.map(async (address) => {\n const foundCallResults = callResults.filter((callResult) => callResult.address === address)\n const results: EvmCallResults = {\n results: await this.reduceResults(foundCallResults),\n ...this.contractInfoRequiredFields(foundCallResults),\n }\n return results\n }),\n )\n\n return result\n }\n\n protected reduceResults(callResults: EvmCallResult[]): Promisable<EvmCallResults['results']> {\n // eslint-disable-next-line unicorn/no-array-reduce\n return callResults.reduce<\n Record<\n string,\n {\n args?: unknown[]\n result: unknown\n }\n >\n >((prev, callResult) => {\n const typedCallResult = asEvmCallSuccess(callResult)\n if (typedCallResult) {\n prev[callResult.functionName] = { args: typedCallResult.args, result: typedCallResult?.result }\n }\n return prev\n }, {})\n }\n}\n","import { Labels } from '@xyo-network/module-model'\n\n/**\n * Labels for Crypto Contract Diviner components\n */\nexport interface EvmCallDivinerLabels extends Labels {\n 'network.xyo.crypto.contract.info': 'diviner'\n}\n\n/**\n * Labels for Crypto Contract Diviner components\n */\nexport const EvmCallDivinerLabels: EvmCallDivinerLabels = {\n 'network.xyo.crypto.contract.info': 'diviner',\n}\n","import { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'\n\nexport const EvmCallSchema = 'network.xyo.evm.call'\nexport type EvmCallSchema = typeof EvmCallSchema\n\nexport type EvmCall = Payload<\n {\n address?: string\n args?: unknown[]\n block?: number\n functionName?: string\n },\n EvmCallSchema\n>\n\nexport const EvmCallResultSchema = 'network.xyo.evm.call.result'\nexport type EvmCallResultSchema = typeof EvmCallResultSchema\n\nexport type EvmCallResultBase = Payload<\n {\n address: string\n args: unknown[]\n block?: number\n chainId: number\n functionName: string\n implementation?: string\n },\n EvmCallResultSchema\n>\n\nexport type EvmCallSuccess = EvmCallResultBase & {\n result: unknown\n}\n\nexport type EvmCallFailure = EvmCallResultBase & {\n error: string\n}\n\nexport type EvmCallResult = EvmCallSuccess | EvmCallFailure\n\nexport const isEvmCallSuccess = (payload?: EvmCallResult): payload is EvmCallSuccess => {\n return (payload as EvmCallSuccess | undefined)?.result !== undefined\n}\n\nexport const isEvmCallFailure = (payload?: EvmCallResult): payload is EvmCallFailure => {\n return (payload as EvmCallFailure | undefined)?.error !== undefined\n}\n\nexport const isEvmCallResult = isPayloadOfSchemaType<EvmCallResult>(EvmCallResultSchema)\n\nexport const asEvmCallSuccess = (payload?: EvmCallResult) => (isEvmCallSuccess(payload) ? payload : undefined)\n\nexport const asEvmCallFailure = (payload?: EvmCallResult) => (isEvmCallFailure(payload) ? payload : undefined)\n","import { EvmWitnessConfig, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport { JsonFragment } from 'ethers'\n\nexport type Abi = string | ReadonlyArray<JsonFragment | string>\n\nexport const EvmCallWitnessConfigSchema = 'network.xyo.evm.call.witness.config'\nexport type EvmCallWitnessConfigSchema = typeof EvmCallWitnessConfigSchema\n\nexport type EvmCallWitnessConfig = EvmWitnessConfig<\n {\n abi?: Abi\n address?: string\n args?: unknown[]\n block?: number\n functionName?: string\n },\n EvmCallWitnessConfigSchema\n>\n\nexport type EvmCallWitnessParams = EvmWitnessParams<EvmCallWitnessConfig>\n","import { assertEx } from '@xylabs/assert'\nimport { isHexZero } from '@xylabs/hex'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport { isPayloadOfSchemaType, Schema } from '@xyo-network/payload-model'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\nimport { Contract } from 'ethers'\n\nimport { EvmCallWitnessConfigSchema, EvmCallWitnessParams } from './model.js'\nimport { EvmCall, EvmCallResult, EvmCallResultSchema, EvmCallSchema, EvmCallSuccess } from './Payload.js'\n\nexport class EvmCallWitness<TParams extends EvmCallWitnessParams = EvmCallWitnessParams> extends AbstractEvmWitness<TParams, EvmCall, EvmCallResult> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallWitnessConfigSchema\n\n get abi() {\n return assertEx(this.config.abi, () => 'Missing abi')\n }\n\n protected override async observeHandler(inPayloads: EvmCall[] = []): Promise<EvmCallResult[]> {\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 = await Promise.all(\n inPayloads.filter(isPayloadOfSchemaType<EvmCall>(EvmCallSchema)).map(async ({ functionName, args, address, block: payloadBlock }) => {\n const validatedAddress = assertEx(address ?? this.config.address, () => 'Missing address')\n const validatedFunctionName = assertEx(functionName ?? this.config.functionName, () => 'Missing address')\n const mergedArgs = [...(args ?? this.config.args ?? [])]\n\n const provider = await this.getProvider(true, true)\n\n const block = this.config.block ?? payloadBlock ?? (await provider.getBlockNumber())\n\n //Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, validatedAddress, block)\n\n //Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, validatedAddress, block)\n\n const implementation = isHexZero(erc1967Status.slots.implementation ?? '0x00') ? erc1822Status.implementation : erc1967Status.implementation\n\n const contract = new Contract(implementation, this.abi, provider)\n let transformedResult: unknown\n try {\n const result = await contract[validatedFunctionName](...mergedArgs)\n transformedResult = typeof result === 'bigint' ? `0x${result.toString(16)}` : result\n } catch {\n //const error = ex as Error & { code: string }\n //this.logger.error(`Error [${this.config.name}]: ${error.code} : ${error.message}`)\n }\n const observation: EvmCallSuccess = {\n address: validatedAddress,\n args: mergedArgs,\n block,\n chainId: Number((await provider.getNetwork()).chainId),\n functionName: validatedFunctionName,\n result: transformedResult,\n schema: EvmCallResultSchema,\n }\n if (implementation !== validatedAddress) {\n observation.implementation = implementation\n }\n //console.log(`observation: ${JSON.stringify(observation, null, 2)}`)\n return observation\n }),\n )\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":"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","names":["import_payload_model","result","import_assert","import_payload_model"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/Diviner.ts","../../src/Labels.ts","../../src/Payload.ts","../../src/model.ts","../../src/Witness.ts"],"sourcesContent":["export * from './Diviner.ts'\nexport * from './Labels.ts'\nexport * from './model.ts'\nexport * from './Payload.ts'\nexport * from './Witness.ts'\n","import { assertEx } from '@xylabs/assert'\nimport { Promisable } from '@xylabs/promise'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model'\nimport { isPayloadOfSchemaType, Payload, Schema } from '@xyo-network/payload-model'\n\nimport { EvmCallDivinerLabels } from './Labels.ts'\nimport { asEvmCallSuccess, EvmCallResult, EvmCallResultSchema } from './Payload.ts'\n\nexport type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]\n\nexport const EvmCallDivinerConfigSchema = 'network.xyo.evm.call.diviner.config'\nexport type EvmCallDivinerConfigSchema = typeof EvmCallDivinerConfigSchema\n\nexport type EvmCallDivinerConfig = DivinerConfig<{\n schema: EvmCallDivinerConfigSchema\n}>\nexport type EvmCallDivinerParams = DivinerParams<EvmCallDivinerConfig>\n\nexport const EvmCallResultsSchema = 'network.xyo.evm.call.results'\nexport type EvmCallResultsSchema = typeof EvmCallResultsSchema\n\nexport type EvmCallResults = Payload<\n {\n address: string\n chainId: number\n results?: Record<\n string,\n {\n args?: unknown[]\n result: unknown\n }\n >\n },\n EvmCallResultsSchema\n>\n\nexport class EvmCallDiviner<TParams extends EvmCallDivinerParams = EvmCallDivinerParams> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallDivinerConfigSchema\n static override labels: EvmCallDivinerLabels = { ...super.labels, ...EvmCallDivinerLabels }\n\n protected static findCallResult<TResult = string>(address: string, functionName: string, payloads: EvmCallResult[]): TResult | undefined {\n const foundPayload = payloads.find(payload => payload.functionName === functionName && payload.address === address)\n return asEvmCallSuccess(foundPayload)?.result as TResult | undefined\n }\n\n protected static matchingExistingField<R = string, T extends Payload = Payload>(objs: T[], field: keyof T): R | undefined {\n const expectedValue = objs.at(0)?.[field] as R\n // eslint-disable-next-line unicorn/no-array-reduce\n const didNotMatch = objs.reduce((prev, obj) => {\n return prev || obj[field] !== expectedValue\n }, false)\n return didNotMatch ? undefined : expectedValue\n }\n\n protected contractInfoRequiredFields(callResults: EvmCallResult[]): EvmCallResults {\n return {\n address: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'address'), () => 'Mismatched address'),\n chainId: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'chainId'), () => 'Mismatched chainId'),\n schema: EvmCallResultsSchema,\n }\n }\n\n protected override async divineHandler(inPayloads: EvmCallResult[] = []): Promise<EvmCallResults[]> {\n const callResults = inPayloads.filter(isPayloadOfSchemaType<EvmCallResult>(EvmCallResultSchema))\n const addresses = Object.keys(\n // eslint-disable-next-line unicorn/no-array-reduce\n callResults.reduce<Record<string, boolean>>((prev, result) => {\n if (result.address) {\n prev[result.address] = true\n }\n return prev\n }, {}),\n )\n const result = await Promise.all(\n addresses.map(async (address) => {\n const foundCallResults = callResults.filter(callResult => callResult.address === address)\n const results: EvmCallResults = {\n results: await this.reduceResults(foundCallResults),\n ...this.contractInfoRequiredFields(foundCallResults),\n }\n return results\n }),\n )\n\n return result\n }\n\n protected reduceResults(callResults: EvmCallResult[]): Promisable<EvmCallResults['results']> {\n // eslint-disable-next-line unicorn/no-array-reduce\n return callResults.reduce<\n Record<\n string,\n {\n args?: unknown[]\n result: unknown\n }\n >\n >((prev, callResult) => {\n const typedCallResult = asEvmCallSuccess(callResult)\n if (typedCallResult) {\n prev[callResult.functionName] = { args: typedCallResult.args, result: typedCallResult?.result }\n }\n return prev\n }, {})\n }\n}\n","import { Labels } from '@xyo-network/module-model'\n\n/**\n * Labels for Crypto Contract Diviner components\n */\nexport interface EvmCallDivinerLabels extends Labels {\n 'network.xyo.crypto.contract.info': 'diviner'\n}\n\n/**\n * Labels for Crypto Contract Diviner components\n */\nexport const EvmCallDivinerLabels: EvmCallDivinerLabels = {\n 'network.xyo.crypto.contract.info': 'diviner',\n}\n","import { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'\n\nexport const EvmCallSchema = 'network.xyo.evm.call'\nexport type EvmCallSchema = typeof EvmCallSchema\n\nexport type EvmCall = Payload<\n {\n address?: string\n args?: unknown[]\n block?: number\n functionName?: string\n },\n EvmCallSchema\n>\n\nexport const EvmCallResultSchema = 'network.xyo.evm.call.result'\nexport type EvmCallResultSchema = typeof EvmCallResultSchema\n\nexport type EvmCallResultBase = Payload<\n {\n address: string\n args: unknown[]\n block?: number\n chainId: number\n functionName: string\n implementation?: string\n },\n EvmCallResultSchema\n>\n\nexport type EvmCallSuccess = EvmCallResultBase & {\n result: unknown\n}\n\nexport type EvmCallFailure = EvmCallResultBase & {\n error: string\n}\n\nexport type EvmCallResult = EvmCallSuccess | EvmCallFailure\n\nexport const isEvmCallSuccess = (payload?: EvmCallResult): payload is EvmCallSuccess => {\n return (payload as EvmCallSuccess | undefined)?.result !== undefined\n}\n\nexport const isEvmCallFailure = (payload?: EvmCallResult): payload is EvmCallFailure => {\n return (payload as EvmCallFailure | undefined)?.error !== undefined\n}\n\nexport const isEvmCallResult = isPayloadOfSchemaType<EvmCallResult>(EvmCallResultSchema)\n\nexport const asEvmCallSuccess = (payload?: EvmCallResult) => (isEvmCallSuccess(payload) ? payload : undefined)\n\nexport const asEvmCallFailure = (payload?: EvmCallResult) => (isEvmCallFailure(payload) ? payload : undefined)\n","import { EvmWitnessConfig, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport { JsonFragment } from 'ethers'\n\nexport type Abi = string | ReadonlyArray<JsonFragment | string>\n\nexport const EvmCallWitnessConfigSchema = 'network.xyo.evm.call.witness.config'\nexport type EvmCallWitnessConfigSchema = typeof EvmCallWitnessConfigSchema\n\nexport type EvmCallWitnessConfig = EvmWitnessConfig<\n {\n abi?: Abi\n address?: string\n args?: unknown[]\n block?: number\n functionName?: string\n },\n EvmCallWitnessConfigSchema\n>\n\nexport type EvmCallWitnessParams = EvmWitnessParams<EvmCallWitnessConfig>\n","import { assertEx } from '@xylabs/assert'\nimport { isHexZero } from '@xylabs/hex'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport { isPayloadOfSchemaType, Schema } from '@xyo-network/payload-model'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\nimport { Contract } from 'ethers'\n\nimport { EvmCallWitnessConfigSchema, EvmCallWitnessParams } from './model.ts'\nimport { EvmCall, EvmCallResult, EvmCallResultSchema, EvmCallSchema, EvmCallSuccess } from './Payload.ts'\n\nexport class EvmCallWitness<TParams extends EvmCallWitnessParams = EvmCallWitnessParams> extends AbstractEvmWitness<TParams, EvmCall, EvmCallResult> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallWitnessConfigSchema\n\n get abi() {\n return assertEx(this.config.abi, () => 'Missing abi')\n }\n\n protected override async observeHandler(inPayloads: EvmCall[] = []): Promise<EvmCallResult[]> {\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 = await Promise.all(\n inPayloads.filter(isPayloadOfSchemaType<EvmCall>(EvmCallSchema)).map(async ({ functionName, args, address, block: payloadBlock }) => {\n const validatedAddress = assertEx(address ?? this.config.address, () => 'Missing address')\n const validatedFunctionName = assertEx(functionName ?? this.config.functionName, () => 'Missing address')\n const mergedArgs = [...(args ?? this.config.args ?? [])]\n\n const provider = await this.getProvider(true, true)\n\n const block = this.config.block ?? payloadBlock ?? (await provider.getBlockNumber())\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, validatedAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, validatedAddress, block)\n\n const implementation = isHexZero(erc1967Status.slots.implementation ?? '0x00') ? erc1822Status.implementation : erc1967Status.implementation\n\n const contract = new Contract(implementation, this.abi, provider)\n let transformedResult: unknown\n try {\n const result = await contract[validatedFunctionName](...mergedArgs)\n transformedResult = typeof result === 'bigint' ? `0x${result.toString(16)}` : result\n } catch {\n // const error = ex as Error & { code: string }\n // this.logger.error(`Error [${this.config.name}]: ${error.code} : ${error.message}`)\n }\n const observation: EvmCallSuccess = {\n address: validatedAddress,\n args: mergedArgs,\n block,\n chainId: Number((await provider.getNetwork()).chainId),\n functionName: validatedFunctionName,\n result: transformedResult,\n schema: EvmCallResultSchema,\n }\n if (implementation !== validatedAddress) {\n observation.implementation = implementation\n }\n // console.log(`observation: ${JSON.stringify(observation, null, 2)}`)\n return observation\n }),\n )\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":"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","names":["import_payload_model","EvmCallDivinerLabels","EvmCallSchema","EvmCallResultSchema","isEvmCallSuccess","payload","result","undefined","isEvmCallFailure","error","isEvmCallResult","isPayloadOfSchemaType","asEvmCallSuccess","asEvmCallFailure","EvmCallDivinerConfigSchema","EvmCallResultsSchema","EvmCallDiviner","AbstractDiviner","findCallResult","address","functionName","payloads","foundPayload","find","payload","asEvmCallSuccess","result","matchingExistingField","objs","field","expectedValue","at","didNotMatch","reduce","prev","obj","undefined","contractInfoRequiredFields","callResults","assertEx","chainId","schema","divineHandler","inPayloads","filter","isPayloadOfSchemaType","EvmCallResultSchema","addresses","Object","keys","Promise","all","map","foundCallResults","callResult","results","reduceResults","typedCallResult","args","configSchemas","defaultConfigSchema","labels","EvmCallDivinerLabels","EvmCallWitnessConfigSchema","import_assert","import_payload_model","EvmCallWitness","AbstractEvmWitness","abi","assertEx","config","observeHandler","inPayloads","started","getProviders","observations","Promise","all","filter","isPayloadOfSchemaType","EvmCallSchema","map","functionName","args","address","block","payloadBlock","validatedAddress","validatedFunctionName","mergedArgs","provider","getProvider","getBlockNumber","erc1967Status","getErc1967SlotStatus","erc1822Status","getErc1822SlotStatus","implementation","isHexZero","slots","contract","Contract","transformedResult","result","toString","observation","chainId","Number","getNetwork","schema","EvmCallResultSchema","ex","error","console","log","name","message","configSchemas","EvmCallWitnessConfigSchema","defaultConfigSchema"]}
|
package/dist/node/index.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export * from './Diviner.
|
|
2
|
-
export * from './Labels.
|
|
3
|
-
export * from './model.
|
|
4
|
-
export * from './Payload.
|
|
5
|
-
export * from './Witness.
|
|
1
|
+
export * from './Diviner.ts';
|
|
2
|
+
export * from './Labels.ts';
|
|
3
|
+
export * from './model.ts';
|
|
4
|
+
export * from './Payload.ts';
|
|
5
|
+
export * from './Witness.ts';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/node/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export * from './Diviner.
|
|
2
|
-
export * from './Labels.
|
|
3
|
-
export * from './model.
|
|
4
|
-
export * from './Payload.
|
|
5
|
-
export * from './Witness.
|
|
1
|
+
export * from './Diviner.ts';
|
|
2
|
+
export * from './Labels.ts';
|
|
3
|
+
export * from './model.ts';
|
|
4
|
+
export * from './Payload.ts';
|
|
5
|
+
export * from './Witness.ts';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/node/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export * from './Diviner.
|
|
2
|
-
export * from './Labels.
|
|
3
|
-
export * from './model.
|
|
4
|
-
export * from './Payload.
|
|
5
|
-
export * from './Witness.
|
|
1
|
+
export * from './Diviner.ts';
|
|
2
|
+
export * from './Labels.ts';
|
|
3
|
+
export * from './model.ts';
|
|
4
|
+
export * from './Payload.ts';
|
|
5
|
+
export * from './Witness.ts';
|
|
6
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
3
|
+
var __reflectGet = Reflect.get;
|
|
4
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
5
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
6
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
7
|
+
var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
|
|
8
|
+
|
|
9
|
+
// src/Diviner.ts
|
|
10
|
+
import { assertEx } from "@xylabs/assert";
|
|
11
|
+
import { AbstractDiviner } from "@xyo-network/diviner-abstract";
|
|
12
|
+
import { isPayloadOfSchemaType as isPayloadOfSchemaType2 } from "@xyo-network/payload-model";
|
|
13
|
+
|
|
14
|
+
// src/Labels.ts
|
|
15
|
+
var EvmCallDivinerLabels = {
|
|
16
|
+
"network.xyo.crypto.contract.info": "diviner"
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// src/Payload.ts
|
|
20
|
+
import { isPayloadOfSchemaType } from "@xyo-network/payload-model";
|
|
21
|
+
var EvmCallSchema = "network.xyo.evm.call";
|
|
22
|
+
var EvmCallResultSchema = "network.xyo.evm.call.result";
|
|
23
|
+
var isEvmCallSuccess = /* @__PURE__ */ __name((payload) => {
|
|
24
|
+
return (payload == null ? void 0 : payload.result) !== void 0;
|
|
25
|
+
}, "isEvmCallSuccess");
|
|
26
|
+
var isEvmCallFailure = /* @__PURE__ */ __name((payload) => {
|
|
27
|
+
return (payload == null ? void 0 : payload.error) !== void 0;
|
|
28
|
+
}, "isEvmCallFailure");
|
|
29
|
+
var isEvmCallResult = isPayloadOfSchemaType(EvmCallResultSchema);
|
|
30
|
+
var asEvmCallSuccess = /* @__PURE__ */ __name((payload) => isEvmCallSuccess(payload) ? payload : void 0, "asEvmCallSuccess");
|
|
31
|
+
var asEvmCallFailure = /* @__PURE__ */ __name((payload) => isEvmCallFailure(payload) ? payload : void 0, "asEvmCallFailure");
|
|
32
|
+
|
|
33
|
+
// src/Diviner.ts
|
|
34
|
+
var EvmCallDivinerConfigSchema = "network.xyo.evm.call.diviner.config";
|
|
35
|
+
var EvmCallResultsSchema = "network.xyo.evm.call.results";
|
|
36
|
+
var _EvmCallDiviner = class _EvmCallDiviner extends AbstractDiviner {
|
|
37
|
+
static findCallResult(address, functionName, payloads) {
|
|
38
|
+
var _a;
|
|
39
|
+
const foundPayload = payloads.find((payload) => payload.functionName === functionName && payload.address === address);
|
|
40
|
+
return (_a = asEvmCallSuccess(foundPayload)) == null ? void 0 : _a.result;
|
|
41
|
+
}
|
|
42
|
+
static matchingExistingField(objs, field) {
|
|
43
|
+
var _a;
|
|
44
|
+
const expectedValue = (_a = objs.at(0)) == null ? void 0 : _a[field];
|
|
45
|
+
const didNotMatch = objs.reduce((prev, obj) => {
|
|
46
|
+
return prev || obj[field] !== expectedValue;
|
|
47
|
+
}, false);
|
|
48
|
+
return didNotMatch ? void 0 : expectedValue;
|
|
49
|
+
}
|
|
50
|
+
contractInfoRequiredFields(callResults) {
|
|
51
|
+
return {
|
|
52
|
+
address: assertEx(_EvmCallDiviner.matchingExistingField(callResults, "address"), () => "Mismatched address"),
|
|
53
|
+
chainId: assertEx(_EvmCallDiviner.matchingExistingField(callResults, "chainId"), () => "Mismatched chainId"),
|
|
54
|
+
schema: EvmCallResultsSchema
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
async divineHandler(inPayloads = []) {
|
|
58
|
+
const callResults = inPayloads.filter(isPayloadOfSchemaType2(EvmCallResultSchema));
|
|
59
|
+
const addresses = Object.keys(
|
|
60
|
+
// eslint-disable-next-line unicorn/no-array-reduce
|
|
61
|
+
callResults.reduce((prev, result2) => {
|
|
62
|
+
if (result2.address) {
|
|
63
|
+
prev[result2.address] = true;
|
|
64
|
+
}
|
|
65
|
+
return prev;
|
|
66
|
+
}, {})
|
|
67
|
+
);
|
|
68
|
+
const result = await Promise.all(addresses.map(async (address) => {
|
|
69
|
+
const foundCallResults = callResults.filter((callResult) => callResult.address === address);
|
|
70
|
+
const results = {
|
|
71
|
+
results: await this.reduceResults(foundCallResults),
|
|
72
|
+
...this.contractInfoRequiredFields(foundCallResults)
|
|
73
|
+
};
|
|
74
|
+
return results;
|
|
75
|
+
}));
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
reduceResults(callResults) {
|
|
79
|
+
return callResults.reduce((prev, callResult) => {
|
|
80
|
+
const typedCallResult = asEvmCallSuccess(callResult);
|
|
81
|
+
if (typedCallResult) {
|
|
82
|
+
prev[callResult.functionName] = {
|
|
83
|
+
args: typedCallResult.args,
|
|
84
|
+
result: typedCallResult == null ? void 0 : typedCallResult.result
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return prev;
|
|
88
|
+
}, {});
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
__name(_EvmCallDiviner, "EvmCallDiviner");
|
|
92
|
+
__publicField(_EvmCallDiviner, "configSchemas", [
|
|
93
|
+
...__superGet(_EvmCallDiviner, _EvmCallDiviner, "configSchemas"),
|
|
94
|
+
EvmCallDivinerConfigSchema
|
|
95
|
+
]);
|
|
96
|
+
__publicField(_EvmCallDiviner, "defaultConfigSchema", EvmCallDivinerConfigSchema);
|
|
97
|
+
__publicField(_EvmCallDiviner, "labels", {
|
|
98
|
+
...__superGet(_EvmCallDiviner, _EvmCallDiviner, "labels"),
|
|
99
|
+
...EvmCallDivinerLabels
|
|
100
|
+
});
|
|
101
|
+
var EvmCallDiviner = _EvmCallDiviner;
|
|
102
|
+
|
|
103
|
+
// src/model.ts
|
|
104
|
+
var EvmCallWitnessConfigSchema = "network.xyo.evm.call.witness.config";
|
|
105
|
+
|
|
106
|
+
// src/Witness.ts
|
|
107
|
+
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
108
|
+
import { isHexZero } from "@xylabs/hex";
|
|
109
|
+
import { getErc1822SlotStatus } from "@xyo-network/erc1822-witness";
|
|
110
|
+
import { getErc1967SlotStatus } from "@xyo-network/erc1967-witness";
|
|
111
|
+
import { isPayloadOfSchemaType as isPayloadOfSchemaType3 } from "@xyo-network/payload-model";
|
|
112
|
+
import { AbstractEvmWitness } from "@xyo-network/witness-evm-abstract";
|
|
113
|
+
import { Contract } from "ethers";
|
|
114
|
+
var _EvmCallWitness = class _EvmCallWitness extends AbstractEvmWitness {
|
|
115
|
+
get abi() {
|
|
116
|
+
return assertEx2(this.config.abi, () => "Missing abi");
|
|
117
|
+
}
|
|
118
|
+
async observeHandler(inPayloads = []) {
|
|
119
|
+
await this.started("throw");
|
|
120
|
+
await this.getProviders();
|
|
121
|
+
try {
|
|
122
|
+
const observations = await Promise.all(inPayloads.filter(isPayloadOfSchemaType3(EvmCallSchema)).map(async ({ functionName, args, address, block: payloadBlock }) => {
|
|
123
|
+
const validatedAddress = assertEx2(address ?? this.config.address, () => "Missing address");
|
|
124
|
+
const validatedFunctionName = assertEx2(functionName ?? this.config.functionName, () => "Missing address");
|
|
125
|
+
const mergedArgs = [
|
|
126
|
+
...args ?? this.config.args ?? []
|
|
127
|
+
];
|
|
128
|
+
const provider = await this.getProvider(true, true);
|
|
129
|
+
const block = this.config.block ?? payloadBlock ?? await provider.getBlockNumber();
|
|
130
|
+
const erc1967Status = await getErc1967SlotStatus(provider, validatedAddress, block);
|
|
131
|
+
const erc1822Status = await getErc1822SlotStatus(provider, validatedAddress, block);
|
|
132
|
+
const implementation = isHexZero(erc1967Status.slots.implementation ?? "0x00") ? erc1822Status.implementation : erc1967Status.implementation;
|
|
133
|
+
const contract = new Contract(implementation, this.abi, provider);
|
|
134
|
+
let transformedResult;
|
|
135
|
+
try {
|
|
136
|
+
const result = await contract[validatedFunctionName](...mergedArgs);
|
|
137
|
+
transformedResult = typeof result === "bigint" ? `0x${result.toString(16)}` : result;
|
|
138
|
+
} catch {
|
|
139
|
+
}
|
|
140
|
+
const observation = {
|
|
141
|
+
address: validatedAddress,
|
|
142
|
+
args: mergedArgs,
|
|
143
|
+
block,
|
|
144
|
+
chainId: Number((await provider.getNetwork()).chainId),
|
|
145
|
+
functionName: validatedFunctionName,
|
|
146
|
+
result: transformedResult,
|
|
147
|
+
schema: EvmCallResultSchema
|
|
148
|
+
};
|
|
149
|
+
if (implementation !== validatedAddress) {
|
|
150
|
+
observation.implementation = implementation;
|
|
151
|
+
}
|
|
152
|
+
return observation;
|
|
153
|
+
}));
|
|
154
|
+
return observations;
|
|
155
|
+
} catch (ex) {
|
|
156
|
+
const error = ex;
|
|
157
|
+
console.log(`Error [${this.config.name}]: ${error.message}`);
|
|
158
|
+
throw error;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
};
|
|
162
|
+
__name(_EvmCallWitness, "EvmCallWitness");
|
|
163
|
+
__publicField(_EvmCallWitness, "configSchemas", [
|
|
164
|
+
...__superGet(_EvmCallWitness, _EvmCallWitness, "configSchemas"),
|
|
165
|
+
EvmCallWitnessConfigSchema
|
|
166
|
+
]);
|
|
167
|
+
__publicField(_EvmCallWitness, "defaultConfigSchema", EvmCallWitnessConfigSchema);
|
|
168
|
+
var EvmCallWitness = _EvmCallWitness;
|
|
169
|
+
export {
|
|
170
|
+
EvmCallDiviner,
|
|
171
|
+
EvmCallDivinerConfigSchema,
|
|
172
|
+
EvmCallDivinerLabels,
|
|
173
|
+
EvmCallResultSchema,
|
|
174
|
+
EvmCallResultsSchema,
|
|
175
|
+
EvmCallSchema,
|
|
176
|
+
EvmCallWitness,
|
|
177
|
+
EvmCallWitnessConfigSchema,
|
|
178
|
+
asEvmCallFailure,
|
|
179
|
+
asEvmCallSuccess,
|
|
180
|
+
isEvmCallFailure,
|
|
181
|
+
isEvmCallResult,
|
|
182
|
+
isEvmCallSuccess
|
|
183
|
+
};
|
|
184
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/Diviner.ts","../../src/Labels.ts","../../src/Payload.ts","../../src/model.ts","../../src/Witness.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Promisable } from '@xylabs/promise'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model'\nimport { isPayloadOfSchemaType, Payload, Schema } from '@xyo-network/payload-model'\n\nimport { EvmCallDivinerLabels } from './Labels.ts'\nimport { asEvmCallSuccess, EvmCallResult, EvmCallResultSchema } from './Payload.ts'\n\nexport type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]\n\nexport const EvmCallDivinerConfigSchema = 'network.xyo.evm.call.diviner.config'\nexport type EvmCallDivinerConfigSchema = typeof EvmCallDivinerConfigSchema\n\nexport type EvmCallDivinerConfig = DivinerConfig<{\n schema: EvmCallDivinerConfigSchema\n}>\nexport type EvmCallDivinerParams = DivinerParams<EvmCallDivinerConfig>\n\nexport const EvmCallResultsSchema = 'network.xyo.evm.call.results'\nexport type EvmCallResultsSchema = typeof EvmCallResultsSchema\n\nexport type EvmCallResults = Payload<\n {\n address: string\n chainId: number\n results?: Record<\n string,\n {\n args?: unknown[]\n result: unknown\n }\n >\n },\n EvmCallResultsSchema\n>\n\nexport class EvmCallDiviner<TParams extends EvmCallDivinerParams = EvmCallDivinerParams> extends AbstractDiviner<TParams> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallDivinerConfigSchema\n static override labels: EvmCallDivinerLabels = { ...super.labels, ...EvmCallDivinerLabels }\n\n protected static findCallResult<TResult = string>(address: string, functionName: string, payloads: EvmCallResult[]): TResult | undefined {\n const foundPayload = payloads.find(payload => payload.functionName === functionName && payload.address === address)\n return asEvmCallSuccess(foundPayload)?.result as TResult | undefined\n }\n\n protected static matchingExistingField<R = string, T extends Payload = Payload>(objs: T[], field: keyof T): R | undefined {\n const expectedValue = objs.at(0)?.[field] as R\n // eslint-disable-next-line unicorn/no-array-reduce\n const didNotMatch = objs.reduce((prev, obj) => {\n return prev || obj[field] !== expectedValue\n }, false)\n return didNotMatch ? undefined : expectedValue\n }\n\n protected contractInfoRequiredFields(callResults: EvmCallResult[]): EvmCallResults {\n return {\n address: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'address'), () => 'Mismatched address'),\n chainId: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'chainId'), () => 'Mismatched chainId'),\n schema: EvmCallResultsSchema,\n }\n }\n\n protected override async divineHandler(inPayloads: EvmCallResult[] = []): Promise<EvmCallResults[]> {\n const callResults = inPayloads.filter(isPayloadOfSchemaType<EvmCallResult>(EvmCallResultSchema))\n const addresses = Object.keys(\n // eslint-disable-next-line unicorn/no-array-reduce\n callResults.reduce<Record<string, boolean>>((prev, result) => {\n if (result.address) {\n prev[result.address] = true\n }\n return prev\n }, {}),\n )\n const result = await Promise.all(\n addresses.map(async (address) => {\n const foundCallResults = callResults.filter(callResult => callResult.address === address)\n const results: EvmCallResults = {\n results: await this.reduceResults(foundCallResults),\n ...this.contractInfoRequiredFields(foundCallResults),\n }\n return results\n }),\n )\n\n return result\n }\n\n protected reduceResults(callResults: EvmCallResult[]): Promisable<EvmCallResults['results']> {\n // eslint-disable-next-line unicorn/no-array-reduce\n return callResults.reduce<\n Record<\n string,\n {\n args?: unknown[]\n result: unknown\n }\n >\n >((prev, callResult) => {\n const typedCallResult = asEvmCallSuccess(callResult)\n if (typedCallResult) {\n prev[callResult.functionName] = { args: typedCallResult.args, result: typedCallResult?.result }\n }\n return prev\n }, {})\n }\n}\n","import { Labels } from '@xyo-network/module-model'\n\n/**\n * Labels for Crypto Contract Diviner components\n */\nexport interface EvmCallDivinerLabels extends Labels {\n 'network.xyo.crypto.contract.info': 'diviner'\n}\n\n/**\n * Labels for Crypto Contract Diviner components\n */\nexport const EvmCallDivinerLabels: EvmCallDivinerLabels = {\n 'network.xyo.crypto.contract.info': 'diviner',\n}\n","import { isPayloadOfSchemaType, Payload } from '@xyo-network/payload-model'\n\nexport const EvmCallSchema = 'network.xyo.evm.call'\nexport type EvmCallSchema = typeof EvmCallSchema\n\nexport type EvmCall = Payload<\n {\n address?: string\n args?: unknown[]\n block?: number\n functionName?: string\n },\n EvmCallSchema\n>\n\nexport const EvmCallResultSchema = 'network.xyo.evm.call.result'\nexport type EvmCallResultSchema = typeof EvmCallResultSchema\n\nexport type EvmCallResultBase = Payload<\n {\n address: string\n args: unknown[]\n block?: number\n chainId: number\n functionName: string\n implementation?: string\n },\n EvmCallResultSchema\n>\n\nexport type EvmCallSuccess = EvmCallResultBase & {\n result: unknown\n}\n\nexport type EvmCallFailure = EvmCallResultBase & {\n error: string\n}\n\nexport type EvmCallResult = EvmCallSuccess | EvmCallFailure\n\nexport const isEvmCallSuccess = (payload?: EvmCallResult): payload is EvmCallSuccess => {\n return (payload as EvmCallSuccess | undefined)?.result !== undefined\n}\n\nexport const isEvmCallFailure = (payload?: EvmCallResult): payload is EvmCallFailure => {\n return (payload as EvmCallFailure | undefined)?.error !== undefined\n}\n\nexport const isEvmCallResult = isPayloadOfSchemaType<EvmCallResult>(EvmCallResultSchema)\n\nexport const asEvmCallSuccess = (payload?: EvmCallResult) => (isEvmCallSuccess(payload) ? payload : undefined)\n\nexport const asEvmCallFailure = (payload?: EvmCallResult) => (isEvmCallFailure(payload) ? payload : undefined)\n","import { EvmWitnessConfig, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport { JsonFragment } from 'ethers'\n\nexport type Abi = string | ReadonlyArray<JsonFragment | string>\n\nexport const EvmCallWitnessConfigSchema = 'network.xyo.evm.call.witness.config'\nexport type EvmCallWitnessConfigSchema = typeof EvmCallWitnessConfigSchema\n\nexport type EvmCallWitnessConfig = EvmWitnessConfig<\n {\n abi?: Abi\n address?: string\n args?: unknown[]\n block?: number\n functionName?: string\n },\n EvmCallWitnessConfigSchema\n>\n\nexport type EvmCallWitnessParams = EvmWitnessParams<EvmCallWitnessConfig>\n","import { assertEx } from '@xylabs/assert'\nimport { isHexZero } from '@xylabs/hex'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport { isPayloadOfSchemaType, Schema } from '@xyo-network/payload-model'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\nimport { Contract } from 'ethers'\n\nimport { EvmCallWitnessConfigSchema, EvmCallWitnessParams } from './model.ts'\nimport { EvmCall, EvmCallResult, EvmCallResultSchema, EvmCallSchema, EvmCallSuccess } from './Payload.ts'\n\nexport class EvmCallWitness<TParams extends EvmCallWitnessParams = EvmCallWitnessParams> extends AbstractEvmWitness<TParams, EvmCall, EvmCallResult> {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = EvmCallWitnessConfigSchema\n\n get abi() {\n return assertEx(this.config.abi, () => 'Missing abi')\n }\n\n protected override async observeHandler(inPayloads: EvmCall[] = []): Promise<EvmCallResult[]> {\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 = await Promise.all(\n inPayloads.filter(isPayloadOfSchemaType<EvmCall>(EvmCallSchema)).map(async ({ functionName, args, address, block: payloadBlock }) => {\n const validatedAddress = assertEx(address ?? this.config.address, () => 'Missing address')\n const validatedFunctionName = assertEx(functionName ?? this.config.functionName, () => 'Missing address')\n const mergedArgs = [...(args ?? this.config.args ?? [])]\n\n const provider = await this.getProvider(true, true)\n\n const block = this.config.block ?? payloadBlock ?? (await provider.getBlockNumber())\n\n // Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967SlotStatus(provider, validatedAddress, block)\n\n // Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822SlotStatus(provider, validatedAddress, block)\n\n const implementation = isHexZero(erc1967Status.slots.implementation ?? '0x00') ? erc1822Status.implementation : erc1967Status.implementation\n\n const contract = new Contract(implementation, this.abi, provider)\n let transformedResult: unknown\n try {\n const result = await contract[validatedFunctionName](...mergedArgs)\n transformedResult = typeof result === 'bigint' ? `0x${result.toString(16)}` : result\n } catch {\n // const error = ex as Error & { code: string }\n // this.logger.error(`Error [${this.config.name}]: ${error.code} : ${error.message}`)\n }\n const observation: EvmCallSuccess = {\n address: validatedAddress,\n args: mergedArgs,\n block,\n chainId: Number((await provider.getNetwork()).chainId),\n functionName: validatedFunctionName,\n result: transformedResult,\n schema: EvmCallResultSchema,\n }\n if (implementation !== validatedAddress) {\n observation.implementation = implementation\n }\n // console.log(`observation: ${JSON.stringify(observation, null, 2)}`)\n return observation\n }),\n )\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":"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","names":["assertEx","AbstractDiviner","isPayloadOfSchemaType","EvmCallDivinerLabels","isPayloadOfSchemaType","EvmCallSchema","EvmCallResultSchema","isEvmCallSuccess","payload","result","undefined","isEvmCallFailure","error","isEvmCallResult","isPayloadOfSchemaType","asEvmCallSuccess","asEvmCallFailure","EvmCallDivinerConfigSchema","EvmCallResultsSchema","EvmCallDiviner","AbstractDiviner","findCallResult","address","functionName","payloads","foundPayload","find","payload","asEvmCallSuccess","result","matchingExistingField","objs","field","expectedValue","at","didNotMatch","reduce","prev","obj","undefined","contractInfoRequiredFields","callResults","assertEx","chainId","schema","divineHandler","inPayloads","filter","isPayloadOfSchemaType","EvmCallResultSchema","addresses","Object","keys","Promise","all","map","foundCallResults","callResult","results","reduceResults","typedCallResult","args","configSchemas","defaultConfigSchema","labels","EvmCallDivinerLabels","EvmCallWitnessConfigSchema","assertEx","isHexZero","getErc1822SlotStatus","getErc1967SlotStatus","isPayloadOfSchemaType","AbstractEvmWitness","Contract","EvmCallWitness","AbstractEvmWitness","abi","assertEx","config","observeHandler","inPayloads","started","getProviders","observations","Promise","all","filter","isPayloadOfSchemaType","EvmCallSchema","map","functionName","args","address","block","payloadBlock","validatedAddress","validatedFunctionName","mergedArgs","provider","getProvider","getBlockNumber","erc1967Status","getErc1967SlotStatus","erc1822Status","getErc1822SlotStatus","implementation","isHexZero","slots","contract","Contract","transformedResult","result","toString","observation","chainId","Number","getNetwork","schema","EvmCallResultSchema","ex","error","console","log","name","message","configSchemas","EvmCallWitnessConfigSchema","defaultConfigSchema"]}
|