@xyo-network/evm-call-witness 5.3.1 → 5.3.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.
@@ -1,4 +1,4 @@
1
- import type { Promisable } from '@xylabs/promise';
1
+ import type { Promisable } from '@xylabs/sdk-js';
2
2
  import { AbstractDiviner } from '@xyo-network/diviner-abstract';
3
3
  import type { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model';
4
4
  import type { Payload, Schema } from '@xyo-network/payload-model';
@@ -1 +1 @@
1
- {"version":3,"file":"Diviner.d.ts","sourceRoot":"","sources":["../../src/Diviner.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAGjD,MAAM,MAAM,cAAc,CAAC,OAAO,GAAG,MAAM,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;AAEvI,eAAO,MAAM,0BAA0B;;CAAwD,CAAA;AAC/F,MAAM,MAAM,0BAA0B,GAAG,OAAO,0BAA0B,CAAA;AAE1E,MAAM,MAAM,oBAAoB,GAAG,aAAa,CAAC;IAC/C,MAAM,EAAE,0BAA0B,CAAA;CACnC,CAAC,CAAA;AACF,MAAM,MAAM,oBAAoB,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAA;AAEtE,eAAO,MAAM,oBAAoB;;CAAiD,CAAA;AAClF,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,OAAO,CAClC;IACE,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CACd,MAAM,EACN;QACE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;QAChB,MAAM,EAAE,OAAO,CAAA;KAChB,CACF,CAAA;CACF,EACD,oBAAoB,CACrB,CAAA;AAED,qBAAa,cAAc,CAAC,OAAO,SAAS,oBAAoB,GAAG,oBAAoB,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IACvH,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAuD;IACvG,gBAAyB,mBAAmB,EAAE,MAAM,CAA6B;IACjF,gBAAyB,MAAM,EAAE,oBAAoB,CAA+C;IAEpG,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,GAAG,SAAS;IAKxI,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS;IASzH,SAAS,CAAC,0BAA0B,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,cAAc;cAQzD,aAAa,CAAC,UAAU,GAAE,aAAa,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAyBnG,SAAS,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;CAkB7F"}
1
+ {"version":3,"file":"Diviner.d.ts","sourceRoot":"","sources":["../../src/Diviner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAGjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAGjD,MAAM,MAAM,cAAc,CAAC,OAAO,GAAG,MAAM,EAAE,QAAQ,GAAG,OAAO,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;AAEvI,eAAO,MAAM,0BAA0B;;CAAwD,CAAA;AAC/F,MAAM,MAAM,0BAA0B,GAAG,OAAO,0BAA0B,CAAA;AAE1E,MAAM,MAAM,oBAAoB,GAAG,aAAa,CAAC;IAC/C,MAAM,EAAE,0BAA0B,CAAA;CACnC,CAAC,CAAA;AACF,MAAM,MAAM,oBAAoB,GAAG,aAAa,CAAC,oBAAoB,CAAC,CAAA;AAEtE,eAAO,MAAM,oBAAoB;;CAAiD,CAAA;AAClF,MAAM,MAAM,oBAAoB,GAAG,OAAO,oBAAoB,CAAA;AAE9D,MAAM,MAAM,cAAc,GAAG,OAAO,CAClC;IACE,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CACd,MAAM,EACN;QACE,IAAI,CAAC,EAAE,OAAO,EAAE,CAAA;QAChB,MAAM,EAAE,OAAO,CAAA;KAChB,CACF,CAAA;CACF,EACD,oBAAoB,CACrB,CAAA;AAED,qBAAa,cAAc,CAAC,OAAO,SAAS,oBAAoB,GAAG,oBAAoB,CAAE,SAAQ,eAAe,CAAC,OAAO,CAAC;IACvH,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAuD;IACvG,gBAAyB,mBAAmB,EAAE,MAAM,CAA6B;IACjF,gBAAyB,MAAM,EAAE,oBAAoB,CAA+C;IAEpG,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,GAAG,OAAO,GAAG,SAAS;IAKxI,SAAS,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS;IASzH,SAAS,CAAC,0BAA0B,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,cAAc;cAQzD,aAAa,CAAC,UAAU,GAAE,aAAa,EAAO,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAyBnG,SAAS,CAAC,aAAa,CAAC,WAAW,EAAE,aAAa,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;CAkB7F"}
@@ -1 +1 @@
1
- {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAG1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEtD,OAAO,KAAK,EACV,OAAO,EAAE,aAAa,EAEvB,MAAM,cAAc,CAAA;AAGrB,qBAAa,cAAc,CAAC,OAAO,SAAS,oBAAoB,GAAG,oBAAoB,CAAE,SAAQ,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC;IAClJ,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAuD;IACvG,gBAAyB,mBAAmB,EAAE,MAAM,CAA6B;IAEjF,IAAI,GAAG,IACoD,YAAY,CACtE;cAEwB,cAAc,CAAC,UAAU,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAyD9F"}
1
+ {"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAExD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAA;AAG1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAA;AAEtD,OAAO,KAAK,EACV,OAAO,EAAE,aAAa,EAEvB,MAAM,cAAc,CAAA;AAGrB,qBAAa,cAAc,CAAC,OAAO,SAAS,oBAAoB,GAAG,oBAAoB,CAAE,SAAQ,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC;IAClJ,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAuD;IACvG,gBAAyB,mBAAmB,EAAE,MAAM,CAA6B;IAEjF,IAAI,GAAG,IACoD,YAAY,CACtE;cAEwB,cAAc,CAAC,UAAU,GAAE,OAAO,EAAO,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;CAyD9F"}
@@ -1,5 +1,5 @@
1
1
  // src/Diviner.ts
2
- import { assertEx } from "@xylabs/assert";
2
+ import { assertEx } from "@xylabs/sdk-js";
3
3
  import { AbstractDiviner } from "@xyo-network/diviner-abstract";
4
4
  import { asSchema as asSchema2, isPayloadOfSchemaType as isPayloadOfSchemaType2 } from "@xyo-network/payload-model";
5
5
 
@@ -84,8 +84,11 @@ import { asSchema as asSchema3 } from "@xyo-network/payload-model";
84
84
  var EvmCallWitnessConfigSchema = asSchema3("network.xyo.evm.call.witness.config", true);
85
85
 
86
86
  // src/Witness.ts
87
- import { assertEx as assertEx2 } from "@xylabs/assert";
88
- import { asEthAddress, isHexZero } from "@xylabs/hex";
87
+ import {
88
+ asEthAddress,
89
+ assertEx as assertEx2,
90
+ isHexZero
91
+ } from "@xylabs/sdk-js";
89
92
  import { getErc1822SlotStatus } from "@xyo-network/erc1822-witness";
90
93
  import { getErc1967SlotStatus } from "@xyo-network/erc1967-witness";
91
94
  import { isPayloadOfSchemaType as isPayloadOfSchemaType3 } from "@xyo-network/payload-model";
@@ -1 +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 type { Promisable } from '@xylabs/promise'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport type { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\nimport { EvmCallDivinerLabels } from './Labels.ts'\nimport type { EvmCallResult } from './Payload.ts'\nimport { asEvmCallSuccess, EvmCallResultSchema } from './Payload.ts'\n\nexport type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]\n\nexport const EvmCallDivinerConfigSchema = asSchema('network.xyo.evm.call.diviner.config', true)\nexport type EvmCallDivinerConfigSchema = typeof EvmCallDivinerConfigSchema\n\nexport type EvmCallDivinerConfig = DivinerConfig<{\n schema: EvmCallDivinerConfigSchema\n}>\nexport type EvmCallDivinerParams = DivinerParams<EvmCallDivinerConfig>\n\nexport const EvmCallResultsSchema = asSchema('network.xyo.evm.call.results', true)\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 readonly 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 type { 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 = { 'network.xyo.crypto.contract.info': 'diviner' }\n","import type { Payload } from '@xyo-network/payload-model'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\nexport const EvmCallSchema = asSchema('network.xyo.evm.call', true)\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 = asSchema('network.xyo.evm.call.result', true)\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 { asSchema } from '@xyo-network/payload-model'\nimport type { EvmWitnessConfig, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport type { JsonFragment } from 'ethers'\n\nexport type Abi = string | ReadonlyArray<JsonFragment | string>\n\nexport const EvmCallWitnessConfigSchema = asSchema('network.xyo.evm.call.witness.config', true)\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 { asEthAddress, isHexZero } from '@xylabs/hex'\nimport type { JsonObject } from '@xylabs/object'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport type { Schema } from '@xyo-network/payload-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\nimport type { InterfaceAbi } from 'ethers'\nimport { Contract } from 'ethers'\n\nimport type { EvmCallWitnessParams } from './model.ts'\nimport { EvmCallWitnessConfigSchema } from './model.ts'\nimport type {\n EvmCall, EvmCallResult,\n EvmCallSuccess,\n} from './Payload.ts'\nimport { EvmCallResultSchema, EvmCallSchema } 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') as InterfaceAbi\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 ({\n functionName, args, address, block: payloadBlock,\n }) => {\n const validatedAddress = asEthAddress(assertEx(address ?? this.config.address, () => 'Missing address'), true)\n const validatedFunctionName = assertEx(functionName ?? this.config.functionName, () => 'Missing address')\n const mergedArgs = [...(args ?? this.config.args ?? [])] as JsonObject[]\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":["asSchema","isPayloadOfSchemaType","asSchema","isPayloadOfSchemaType","result","asSchema","assertEx","isPayloadOfSchemaType","assertEx","isPayloadOfSchemaType"]}
1
+ {"version":3,"sources":["../../src/Diviner.ts","../../src/Labels.ts","../../src/Payload.ts","../../src/model.ts","../../src/Witness.ts"],"sourcesContent":["import type { Promisable } from '@xylabs/sdk-js'\nimport { assertEx } from '@xylabs/sdk-js'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport type { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\nimport { EvmCallDivinerLabels } from './Labels.ts'\nimport type { EvmCallResult } from './Payload.ts'\nimport { asEvmCallSuccess, EvmCallResultSchema } from './Payload.ts'\n\nexport type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]\n\nexport const EvmCallDivinerConfigSchema = asSchema('network.xyo.evm.call.diviner.config', true)\nexport type EvmCallDivinerConfigSchema = typeof EvmCallDivinerConfigSchema\n\nexport type EvmCallDivinerConfig = DivinerConfig<{\n schema: EvmCallDivinerConfigSchema\n}>\nexport type EvmCallDivinerParams = DivinerParams<EvmCallDivinerConfig>\n\nexport const EvmCallResultsSchema = asSchema('network.xyo.evm.call.results', true)\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 readonly 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 type { 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 = { 'network.xyo.crypto.contract.info': 'diviner' }\n","import type { Payload } from '@xyo-network/payload-model'\nimport { asSchema, isPayloadOfSchemaType } from '@xyo-network/payload-model'\n\nexport const EvmCallSchema = asSchema('network.xyo.evm.call', true)\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 = asSchema('network.xyo.evm.call.result', true)\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 { asSchema } from '@xyo-network/payload-model'\nimport type { EvmWitnessConfig, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\nimport type { JsonFragment } from 'ethers'\n\nexport type Abi = string | ReadonlyArray<JsonFragment | string>\n\nexport const EvmCallWitnessConfigSchema = asSchema('network.xyo.evm.call.witness.config', true)\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 type { JsonObject } from '@xylabs/sdk-js'\nimport {\n asEthAddress, assertEx, isHexZero,\n} from '@xylabs/sdk-js'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\nimport type { Schema } from '@xyo-network/payload-model'\nimport { isPayloadOfSchemaType } from '@xyo-network/payload-model'\nimport { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'\nimport type { InterfaceAbi } from 'ethers'\nimport { Contract } from 'ethers'\n\nimport type { EvmCallWitnessParams } from './model.ts'\nimport { EvmCallWitnessConfigSchema } from './model.ts'\nimport type {\n EvmCall, EvmCallResult,\n EvmCallSuccess,\n} from './Payload.ts'\nimport { EvmCallResultSchema, EvmCallSchema } 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') as InterfaceAbi\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 ({\n functionName, args, address, block: payloadBlock,\n }) => {\n const validatedAddress = asEthAddress(assertEx(address ?? this.config.address, () => 'Missing address'), true)\n const validatedFunctionName = assertEx(functionName ?? this.config.functionName, () => 'Missing address')\n const mergedArgs = [...(args ?? this.config.args ?? [])] as JsonObject[]\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":["asSchema","isPayloadOfSchemaType","asSchema","isPayloadOfSchemaType","result","asSchema","assertEx","isPayloadOfSchemaType","assertEx","isPayloadOfSchemaType"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/evm-call-witness",
3
- "version": "5.3.1",
3
+ "version": "5.3.3",
4
4
  "description": "Typescript/Javascript Plugins for XYO Platform",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -30,57 +30,61 @@
30
30
  "types": "dist/neutral/index.d.ts",
31
31
  "files": [
32
32
  "dist",
33
- "src",
34
- "!**/*.bench.*",
35
- "!**/*.spec.*",
36
- "!**/*.test.*"
33
+ "README.md"
37
34
  ],
38
35
  "dependencies": {
39
- "@xylabs/assert": "~5.0.64",
40
- "@xylabs/hex": "~5.0.64",
41
- "@xylabs/promise": "~5.0.64",
42
- "@xyo-network/diviner-abstract": "~5.3.2",
43
- "@xyo-network/diviner-model": "~5.3.2",
44
- "@xyo-network/erc1822-witness": "5.3.1",
45
- "@xyo-network/erc1967-witness": "5.3.1",
46
- "@xyo-network/module-model": "~5.3.2",
47
- "@xyo-network/payload-model": "~5.3.2",
48
- "@xyo-network/witness-evm-abstract": "~5.3.2",
49
- "ethers": "^6.16.0"
36
+ "@xyo-network/erc1822-witness": "workspace:^",
37
+ "@xyo-network/erc1967-witness": "workspace:^"
50
38
  },
51
39
  "devDependencies": {
52
- "@xylabs/delay": "~5.0.64",
53
- "@xylabs/object": "~5.0.64",
54
- "@xylabs/profile": "~5.0.64",
55
- "@xylabs/ts-scripts-yarn3": "~7.3.2",
56
- "@xylabs/tsconfig": "~7.3.2",
57
- "@xylabs/vitest-extended": "~5.0.64",
58
- "@xyo-network/archivist-memory": "~5.3.2",
59
- "@xyo-network/crypto-contract-function-read-payload-plugin": "5.3.1",
60
- "@xyo-network/diviner-boundwitness-memory": "~5.3.2",
61
- "@xyo-network/diviner-jsonpatch": "~5.3.2",
62
- "@xyo-network/diviner-jsonpatch-memory": "~5.3.2",
63
- "@xyo-network/diviner-jsonpath-aggregate-memory": "~5.3.2",
64
- "@xyo-network/diviner-payload-generic": "~5.3.2",
65
- "@xyo-network/diviner-payload-model": "~5.3.2",
66
- "@xyo-network/diviner-range": "~5.3.2",
67
- "@xyo-network/diviner-temporal-indexing": "~5.3.2",
68
- "@xyo-network/evm-contract-witness": "5.3.1",
69
- "@xyo-network/evm-nft-id-payload-plugin": "5.3.1",
70
- "@xyo-network/evm-token-interface-diviner": "5.3.1",
71
- "@xyo-network/manifest": "~5.3.2",
72
- "@xyo-network/module-factory-locator": "~5.3.2",
73
- "@xyo-network/node-memory": "~5.3.2",
40
+ "@xylabs/sdk-js": "^5.0.90",
41
+ "@xylabs/ts-scripts-common": "~7.5.10",
42
+ "@xylabs/ts-scripts-yarn3": "~7.5.10",
43
+ "@xylabs/tsconfig": "~7.5.10",
44
+ "@xylabs/vitest-extended": "~5.0.90",
45
+ "@xyo-network/archivist-memory": "~5.3.5",
46
+ "@xyo-network/crypto-contract-function-read-payload-plugin": "5.3.3",
47
+ "@xyo-network/diviner-abstract": "~5.3.5",
48
+ "@xyo-network/diviner-boundwitness-memory": "~5.3.5",
49
+ "@xyo-network/diviner-jsonpatch": "~5.3.5",
50
+ "@xyo-network/diviner-jsonpatch-memory": "~5.3.5",
51
+ "@xyo-network/diviner-jsonpath-aggregate-memory": "~5.3.5",
52
+ "@xyo-network/diviner-model": "~5.3.5",
53
+ "@xyo-network/diviner-payload-generic": "~5.3.5",
54
+ "@xyo-network/diviner-payload-model": "~5.3.5",
55
+ "@xyo-network/diviner-range": "~5.3.5",
56
+ "@xyo-network/diviner-temporal-indexing": "~5.3.5",
57
+ "@xyo-network/evm-contract-witness": "5.3.3",
58
+ "@xyo-network/evm-nft-id-payload-plugin": "5.3.3",
59
+ "@xyo-network/evm-token-interface-diviner": "5.3.3",
60
+ "@xyo-network/module-factory-locator": "~5.3.5",
61
+ "@xyo-network/module-model": "~5.3.5",
62
+ "@xyo-network/node-memory": "~5.3.5",
74
63
  "@xyo-network/open-zeppelin-typechain": "~4.1.1",
75
- "@xyo-network/sentinel-model": "~5.3.2",
76
- "@xyo-network/wallet": "~5.3.2",
77
- "@xyo-network/wallet-model": "~5.3.2",
78
- "@xyo-network/witness-adhoc": "~5.3.2",
79
- "@xyo-network/witness-model": "~5.3.2",
80
- "@xyo-network/witness-timestamp": "~5.3.2",
64
+ "@xyo-network/payload-model": "~5.3.5",
65
+ "@xyo-network/sdk-js": "~5.3.5",
66
+ "@xyo-network/sentinel-model": "~5.3.5",
67
+ "@xyo-network/wallet": "~5.3.5",
68
+ "@xyo-network/wallet-model": "~5.3.5",
69
+ "@xyo-network/witness-adhoc": "~5.3.5",
70
+ "@xyo-network/witness-evm-abstract": "~5.3.5",
71
+ "@xyo-network/witness-model": "~5.3.5",
72
+ "@xyo-network/witness-timestamp": "~5.3.5",
81
73
  "async-mutex": "~0.5.0",
74
+ "ethers": "^6.16.0",
82
75
  "typescript": "~5.9.3",
83
- "vitest": "~4.0.18"
76
+ "vitest": "~4.1.2",
77
+ "zod": "^4.3.6"
78
+ },
79
+ "peerDependencies": {
80
+ "@xylabs/sdk-js": "^5",
81
+ "@xyo-network/diviner-abstract": "^5",
82
+ "@xyo-network/diviner-model": "^5",
83
+ "@xyo-network/module-model": "^5",
84
+ "@xyo-network/payload-model": "^5",
85
+ "@xyo-network/witness-evm-abstract": "^5",
86
+ "ethers": "^6",
87
+ "zod": "^4"
84
88
  },
85
89
  "publishConfig": {
86
90
  "access": "public"
package/src/Diviner.ts DELETED
@@ -1,110 +0,0 @@
1
- import { assertEx } from '@xylabs/assert'
2
- import type { Promisable } from '@xylabs/promise'
3
- import { AbstractDiviner } from '@xyo-network/diviner-abstract'
4
- import type { DivinerConfig, DivinerParams } from '@xyo-network/diviner-model'
5
- import type { Payload, Schema } from '@xyo-network/payload-model'
6
- import { asSchema, isPayloadOfSchemaType } from '@xyo-network/payload-model'
7
-
8
- import { EvmCallDivinerLabels } from './Labels.ts'
9
- import type { EvmCallResult } from './Payload.ts'
10
- import { asEvmCallSuccess, EvmCallResultSchema } from './Payload.ts'
11
-
12
- export type FindCallResult<TResult = string, TPayload = Payload> = [TResult, TPayload] | [undefined, TPayload] | [undefined, undefined]
13
-
14
- export const EvmCallDivinerConfigSchema = asSchema('network.xyo.evm.call.diviner.config', true)
15
- export type EvmCallDivinerConfigSchema = typeof EvmCallDivinerConfigSchema
16
-
17
- export type EvmCallDivinerConfig = DivinerConfig<{
18
- schema: EvmCallDivinerConfigSchema
19
- }>
20
- export type EvmCallDivinerParams = DivinerParams<EvmCallDivinerConfig>
21
-
22
- export const EvmCallResultsSchema = asSchema('network.xyo.evm.call.results', true)
23
- export type EvmCallResultsSchema = typeof EvmCallResultsSchema
24
-
25
- export type EvmCallResults = Payload<
26
- {
27
- address: string
28
- chainId: number
29
- results?: Record<
30
- string,
31
- {
32
- args?: unknown[]
33
- result: unknown
34
- }
35
- >
36
- },
37
- EvmCallResultsSchema
38
- >
39
-
40
- export class EvmCallDiviner<TParams extends EvmCallDivinerParams = EvmCallDivinerParams> extends AbstractDiviner<TParams> {
41
- static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallDivinerConfigSchema]
42
- static override readonly defaultConfigSchema: Schema = EvmCallDivinerConfigSchema
43
- static override readonly labels: EvmCallDivinerLabels = { ...super.labels, ...EvmCallDivinerLabels }
44
-
45
- protected static findCallResult<TResult = string>(address: string, functionName: string, payloads: EvmCallResult[]): TResult | undefined {
46
- const foundPayload = payloads.find(payload => payload.functionName === functionName && payload.address === address)
47
- return asEvmCallSuccess(foundPayload)?.result as TResult | undefined
48
- }
49
-
50
- protected static matchingExistingField<R = string, T extends Payload = Payload>(objs: T[], field: keyof T): R | undefined {
51
- const expectedValue = objs.at(0)?.[field] as R
52
- // eslint-disable-next-line unicorn/no-array-reduce
53
- const didNotMatch = objs.reduce((prev, obj) => {
54
- return prev || obj[field] !== expectedValue
55
- }, false)
56
- return didNotMatch ? undefined : expectedValue
57
- }
58
-
59
- protected contractInfoRequiredFields(callResults: EvmCallResult[]): EvmCallResults {
60
- return {
61
- address: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'address'), () => 'Mismatched address'),
62
- chainId: assertEx(EvmCallDiviner.matchingExistingField(callResults, 'chainId'), () => 'Mismatched chainId'),
63
- schema: EvmCallResultsSchema,
64
- }
65
- }
66
-
67
- protected override async divineHandler(inPayloads: EvmCallResult[] = []): Promise<EvmCallResults[]> {
68
- const callResults = inPayloads.filter(isPayloadOfSchemaType<EvmCallResult>(EvmCallResultSchema))
69
- const addresses = Object.keys(
70
- // eslint-disable-next-line unicorn/no-array-reduce
71
- callResults.reduce<Record<string, boolean>>((prev, result) => {
72
- if (result.address) {
73
- prev[result.address] = true
74
- }
75
- return prev
76
- }, {}),
77
- )
78
- const result = await Promise.all(
79
- addresses.map(async (address) => {
80
- const foundCallResults = callResults.filter(callResult => callResult.address === address)
81
- const results: EvmCallResults = {
82
- results: await this.reduceResults(foundCallResults),
83
- ...this.contractInfoRequiredFields(foundCallResults),
84
- }
85
- return results
86
- }),
87
- )
88
-
89
- return result
90
- }
91
-
92
- protected reduceResults(callResults: EvmCallResult[]): Promisable<EvmCallResults['results']> {
93
- // eslint-disable-next-line unicorn/no-array-reduce
94
- return callResults.reduce<
95
- Record<
96
- string,
97
- {
98
- args?: unknown[]
99
- result: unknown
100
- }
101
- >
102
- >((prev, callResult) => {
103
- const typedCallResult = asEvmCallSuccess(callResult)
104
- if (typedCallResult) {
105
- prev[callResult.functionName] = { args: typedCallResult.args, result: typedCallResult?.result }
106
- }
107
- return prev
108
- }, {})
109
- }
110
- }
package/src/Labels.ts DELETED
@@ -1,13 +0,0 @@
1
- import type { Labels } from '@xyo-network/module-model'
2
-
3
- /**
4
- * Labels for Crypto Contract Diviner components
5
- */
6
- export interface EvmCallDivinerLabels extends Labels {
7
- 'network.xyo.crypto.contract.info': 'diviner'
8
- }
9
-
10
- /**
11
- * Labels for Crypto Contract Diviner components
12
- */
13
- export const EvmCallDivinerLabels: EvmCallDivinerLabels = { 'network.xyo.crypto.contract.info': 'diviner' }
package/src/Payload.ts DELETED
@@ -1,54 +0,0 @@
1
- import type { Payload } from '@xyo-network/payload-model'
2
- import { asSchema, isPayloadOfSchemaType } from '@xyo-network/payload-model'
3
-
4
- export const EvmCallSchema = asSchema('network.xyo.evm.call', true)
5
- export type EvmCallSchema = typeof EvmCallSchema
6
-
7
- export type EvmCall = Payload<
8
- {
9
- address?: string
10
- args?: unknown[]
11
- block?: number
12
- functionName?: string
13
- },
14
- EvmCallSchema
15
- >
16
-
17
- export const EvmCallResultSchema = asSchema('network.xyo.evm.call.result', true)
18
- export type EvmCallResultSchema = typeof EvmCallResultSchema
19
-
20
- export type EvmCallResultBase = Payload<
21
- {
22
- address: string
23
- args: unknown[]
24
- block?: number
25
- chainId: number
26
- functionName: string
27
- implementation?: string
28
- },
29
- EvmCallResultSchema
30
- >
31
-
32
- export type EvmCallSuccess = EvmCallResultBase & {
33
- result: unknown
34
- }
35
-
36
- export type EvmCallFailure = EvmCallResultBase & {
37
- error: string
38
- }
39
-
40
- export type EvmCallResult = EvmCallSuccess | EvmCallFailure
41
-
42
- export const isEvmCallSuccess = (payload?: EvmCallResult): payload is EvmCallSuccess => {
43
- return (payload as EvmCallSuccess | undefined)?.result !== undefined
44
- }
45
-
46
- export const isEvmCallFailure = (payload?: EvmCallResult): payload is EvmCallFailure => {
47
- return (payload as EvmCallFailure | undefined)?.error !== undefined
48
- }
49
-
50
- export const isEvmCallResult = isPayloadOfSchemaType<EvmCallResult>(EvmCallResultSchema)
51
-
52
- export const asEvmCallSuccess = (payload?: EvmCallResult) => (isEvmCallSuccess(payload) ? payload : undefined)
53
-
54
- export const asEvmCallFailure = (payload?: EvmCallResult) => (isEvmCallFailure(payload) ? payload : undefined)
package/src/Witness.ts DELETED
@@ -1,85 +0,0 @@
1
- import { assertEx } from '@xylabs/assert'
2
- import { asEthAddress, isHexZero } from '@xylabs/hex'
3
- import type { JsonObject } from '@xylabs/object'
4
- import { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'
5
- import { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'
6
- import type { Schema } from '@xyo-network/payload-model'
7
- import { isPayloadOfSchemaType } from '@xyo-network/payload-model'
8
- import { AbstractEvmWitness } from '@xyo-network/witness-evm-abstract'
9
- import type { InterfaceAbi } from 'ethers'
10
- import { Contract } from 'ethers'
11
-
12
- import type { EvmCallWitnessParams } from './model.ts'
13
- import { EvmCallWitnessConfigSchema } from './model.ts'
14
- import type {
15
- EvmCall, EvmCallResult,
16
- EvmCallSuccess,
17
- } from './Payload.ts'
18
- import { EvmCallResultSchema, EvmCallSchema } from './Payload.ts'
19
-
20
- export class EvmCallWitness<TParams extends EvmCallWitnessParams = EvmCallWitnessParams> extends AbstractEvmWitness<TParams, EvmCall, EvmCallResult> {
21
- static override readonly configSchemas: Schema[] = [...super.configSchemas, EvmCallWitnessConfigSchema]
22
- static override readonly defaultConfigSchema: Schema = EvmCallWitnessConfigSchema
23
-
24
- get abi() {
25
- return assertEx(this.config.abi, () => 'Missing abi') as InterfaceAbi
26
- }
27
-
28
- protected override async observeHandler(inPayloads: EvmCall[] = []): Promise<EvmCallResult[]> {
29
- await this.started('throw')
30
- // calling it here to make sure we rests the cache
31
- await this.getProviders()
32
- try {
33
- const observations = await Promise.all(
34
- inPayloads.filter(isPayloadOfSchemaType<EvmCall>(EvmCallSchema)).map(async ({
35
- functionName, args, address, block: payloadBlock,
36
- }) => {
37
- const validatedAddress = asEthAddress(assertEx(address ?? this.config.address, () => 'Missing address'), true)
38
- const validatedFunctionName = assertEx(functionName ?? this.config.functionName, () => 'Missing address')
39
- const mergedArgs = [...(args ?? this.config.args ?? [])] as JsonObject[]
40
-
41
- const provider = await this.getProvider(true, true)
42
-
43
- const block = this.config.block ?? payloadBlock ?? (await provider.getBlockNumber())
44
-
45
- // Check if ERC-1967 Upgradeable
46
- const erc1967Status = await getErc1967SlotStatus(provider, validatedAddress, block)
47
-
48
- // Check if ERC-1822 Upgradeable
49
- const erc1822Status = await getErc1822SlotStatus(provider, validatedAddress, block)
50
-
51
- const implementation = isHexZero(erc1967Status.slots.implementation ?? '0x00') ? erc1822Status.implementation : erc1967Status.implementation
52
-
53
- const contract = new Contract(implementation, this.abi, provider)
54
- let transformedResult: unknown
55
- try {
56
- const result = await contract[validatedFunctionName](...mergedArgs)
57
- transformedResult = typeof result === 'bigint' ? `0x${result.toString(16)}` : result
58
- } catch {
59
- // const error = ex as Error & { code: string }
60
- // this.logger.error(`Error [${this.config.name}]: ${error.code} : ${error.message}`)
61
- }
62
- const observation: EvmCallSuccess = {
63
- address: validatedAddress,
64
- args: mergedArgs,
65
- block,
66
- chainId: Number((await provider.getNetwork()).chainId),
67
- functionName: validatedFunctionName,
68
- result: transformedResult,
69
- schema: EvmCallResultSchema,
70
- }
71
- if (implementation !== validatedAddress) {
72
- observation.implementation = implementation
73
- }
74
- // console.log(`observation: ${JSON.stringify(observation, null, 2)}`)
75
- return observation
76
- }),
77
- )
78
- return observations
79
- } catch (ex) {
80
- const error = ex as Error
81
- console.log(`Error [${this.config.name}]: ${error.message}`)
82
- throw error
83
- }
84
- }
85
- }
package/src/index.ts DELETED
@@ -1,5 +0,0 @@
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'
package/src/model.ts DELETED
@@ -1,21 +0,0 @@
1
- import { asSchema } from '@xyo-network/payload-model'
2
- import type { EvmWitnessConfig, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'
3
- import type { JsonFragment } from 'ethers'
4
-
5
- export type Abi = string | ReadonlyArray<JsonFragment | string>
6
-
7
- export const EvmCallWitnessConfigSchema = asSchema('network.xyo.evm.call.witness.config', true)
8
- export type EvmCallWitnessConfigSchema = typeof EvmCallWitnessConfigSchema
9
-
10
- export type EvmCallWitnessConfig = EvmWitnessConfig<
11
- {
12
- abi?: Abi
13
- address?: string
14
- args?: unknown[]
15
- block?: number
16
- functionName?: string
17
- },
18
- EvmCallWitnessConfigSchema
19
- >
20
-
21
- export type EvmCallWitnessParams = EvmWitnessParams<EvmCallWitnessConfig>