@lidofinance/lido-csm-sdk 2.0.0-alpha.72 → 2.0.0-alpha.73
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/core-sdk/core-sdk.d.cts +2 -2
- package/dist/core-sdk/core-sdk.d.mts +2 -2
- package/dist/deposit-data-sdk/deposit-data-sdk.cjs +2 -1
- package/dist/deposit-data-sdk/deposit-data-sdk.cjs.map +1 -1
- package/dist/deposit-data-sdk/deposit-data-sdk.d.cts +1 -0
- package/dist/deposit-data-sdk/deposit-data-sdk.d.cts.map +1 -1
- package/dist/deposit-data-sdk/deposit-data-sdk.d.mts +1 -0
- package/dist/deposit-data-sdk/deposit-data-sdk.d.mts.map +1 -1
- package/dist/deposit-data-sdk/deposit-data-sdk.mjs +2 -1
- package/dist/deposit-data-sdk/deposit-data-sdk.mjs.map +1 -1
- package/dist/deposit-data-sdk/types.cjs.map +1 -1
- package/dist/deposit-data-sdk/types.d.cts +1 -0
- package/dist/deposit-data-sdk/types.d.cts.map +1 -1
- package/dist/deposit-data-sdk/types.d.mts +1 -0
- package/dist/deposit-data-sdk/types.d.mts.map +1 -1
- package/dist/deposit-data-sdk/types.mjs.map +1 -1
- package/dist/deposit-data-sdk/validator.cjs +1 -0
- package/dist/deposit-data-sdk/validator.cjs.map +1 -1
- package/dist/deposit-data-sdk/validator.mjs +1 -0
- package/dist/deposit-data-sdk/validator.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -7888,7 +7888,6 @@ declare class CoreSDK extends CsmSDKCacheable {
|
|
|
7888
7888
|
[x: `address[${string}]`]: undefined;
|
|
7889
7889
|
[x: `bool[${string}]`]: undefined;
|
|
7890
7890
|
[x: `bytes[${string}]`]: undefined;
|
|
7891
|
-
[x: `bytes10[${string}]`]: undefined;
|
|
7892
7891
|
[x: `bytes1[${string}]`]: undefined;
|
|
7893
7892
|
[x: `bytes2[${string}]`]: undefined;
|
|
7894
7893
|
[x: `bytes3[${string}]`]: undefined;
|
|
@@ -7898,6 +7897,7 @@ declare class CoreSDK extends CsmSDKCacheable {
|
|
|
7898
7897
|
[x: `bytes7[${string}]`]: undefined;
|
|
7899
7898
|
[x: `bytes8[${string}]`]: undefined;
|
|
7900
7899
|
[x: `bytes9[${string}]`]: undefined;
|
|
7900
|
+
[x: `bytes10[${string}]`]: undefined;
|
|
7901
7901
|
[x: `bytes11[${string}]`]: undefined;
|
|
7902
7902
|
[x: `bytes12[${string}]`]: undefined;
|
|
7903
7903
|
[x: `bytes13[${string}]`]: undefined;
|
|
@@ -7990,7 +7990,6 @@ declare class CoreSDK extends CsmSDKCacheable {
|
|
|
7990
7990
|
address?: undefined;
|
|
7991
7991
|
bool?: undefined;
|
|
7992
7992
|
bytes?: undefined;
|
|
7993
|
-
bytes10?: undefined;
|
|
7994
7993
|
bytes1?: undefined;
|
|
7995
7994
|
bytes2?: undefined;
|
|
7996
7995
|
bytes3?: undefined;
|
|
@@ -8000,6 +7999,7 @@ declare class CoreSDK extends CsmSDKCacheable {
|
|
|
8000
7999
|
bytes7?: undefined;
|
|
8001
8000
|
bytes8?: undefined;
|
|
8002
8001
|
bytes9?: undefined;
|
|
8002
|
+
bytes10?: undefined;
|
|
8003
8003
|
bytes11?: undefined;
|
|
8004
8004
|
bytes12?: undefined;
|
|
8005
8005
|
bytes13?: undefined;
|
|
@@ -7888,7 +7888,6 @@ declare class CoreSDK extends CsmSDKCacheable {
|
|
|
7888
7888
|
[x: `address[${string}]`]: undefined;
|
|
7889
7889
|
[x: `bool[${string}]`]: undefined;
|
|
7890
7890
|
[x: `bytes[${string}]`]: undefined;
|
|
7891
|
-
[x: `bytes10[${string}]`]: undefined;
|
|
7892
7891
|
[x: `bytes1[${string}]`]: undefined;
|
|
7893
7892
|
[x: `bytes2[${string}]`]: undefined;
|
|
7894
7893
|
[x: `bytes3[${string}]`]: undefined;
|
|
@@ -7898,6 +7897,7 @@ declare class CoreSDK extends CsmSDKCacheable {
|
|
|
7898
7897
|
[x: `bytes7[${string}]`]: undefined;
|
|
7899
7898
|
[x: `bytes8[${string}]`]: undefined;
|
|
7900
7899
|
[x: `bytes9[${string}]`]: undefined;
|
|
7900
|
+
[x: `bytes10[${string}]`]: undefined;
|
|
7901
7901
|
[x: `bytes11[${string}]`]: undefined;
|
|
7902
7902
|
[x: `bytes12[${string}]`]: undefined;
|
|
7903
7903
|
[x: `bytes13[${string}]`]: undefined;
|
|
@@ -7990,7 +7990,6 @@ declare class CoreSDK extends CsmSDKCacheable {
|
|
|
7990
7990
|
address?: undefined;
|
|
7991
7991
|
bool?: undefined;
|
|
7992
7992
|
bytes?: undefined;
|
|
7993
|
-
bytes10?: undefined;
|
|
7994
7993
|
bytes1?: undefined;
|
|
7995
7994
|
bytes2?: undefined;
|
|
7996
7995
|
bytes3?: undefined;
|
|
@@ -8000,6 +7999,7 @@ declare class CoreSDK extends CsmSDKCacheable {
|
|
|
8000
7999
|
bytes7?: undefined;
|
|
8001
8000
|
bytes8?: undefined;
|
|
8002
8001
|
bytes9?: undefined;
|
|
8002
|
+
bytes10?: undefined;
|
|
8003
8003
|
bytes11?: undefined;
|
|
8004
8004
|
bytes12?: undefined;
|
|
8005
8005
|
bytes13?: undefined;
|
|
@@ -119,7 +119,8 @@ var DepositDataSDK = class extends (_a = require_csm_sdk_module.CsmSDKModule, _p
|
|
|
119
119
|
chainId,
|
|
120
120
|
withdrawalCredentials: wc,
|
|
121
121
|
wcPrefix,
|
|
122
|
-
currentBlockNumber: Number(blockNumber)
|
|
122
|
+
currentBlockNumber: Number(blockNumber),
|
|
123
|
+
skipSignature: options?.skipSignature
|
|
123
124
|
});
|
|
124
125
|
if (errors.length) return [...errors];
|
|
125
126
|
const pubkeys = depositData.map((data) => data.pubkey);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deposit-data-sdk.cjs","names":[],"sources":["../../src/deposit-data-sdk/deposit-data-sdk.ts"],"sourcesContent":["import { Hex } from 'viem';\nimport { CsmSDKModule } from '../common/class-primitives/csm-sdk-module';\nimport { Cache, ErrorHandler, Logger } from '../common/decorators/index';\nimport { CACHE_MID, CONTRACT_NAMES } from '../common/index';\nimport {\n compareLowercase,\n isHexadecimalString,\n toHexString,\n} from '../common/utils/index';\nimport { KeysCacheSDK } from '../keys-cache-sdk/keys-cache-sdk';\nimport { KeyCacheStatus } from '../keys-cache-sdk/types';\nimport { KeysWithStatusSDK } from '../keys-with-status-sdk/keys-with-status-sdk';\nimport { ModuleSDK } from '../module-sdk/module-sdk';\nimport { PUBKEY_LENGTH } from './constants';\nimport { parseDepositData, removeKey } from './parser';\nimport {\n DepositData,\n ParseResult,\n RemoveKeyResult,\n ValidationError,\n ValidationErrorCode,\n} from './types';\nimport { validateDepositData } from './validator';\n\nexport class DepositDataSDK extends CsmSDKModule<{\n module: ModuleSDK;\n keysWithStatus?: KeysWithStatusSDK;\n keysCache?: KeysCacheSDK;\n}> {\n @Logger('Utils:')\n public parseDepositData(json: string): ParseResult {\n return parseDepositData(json);\n }\n\n @Logger('Utils:')\n public removeKey(json: string, index: number): RemoveKeyResult {\n return removeKey(json, index);\n }\n\n @Logger('Utils:')\n private async getWcPrefix(): Promise<string> {\n const wcType = await this.bus.module.getWithdrawalCredentialsType();\n return wcType.toString(16).padStart(2, '0').padEnd(24, '0');\n }\n\n @Logger('Utils:')\n public async validateDepositData(\n depositData: DepositData[],\n options?: { skipPending?: boolean },\n ): Promise<ValidationError[]> {\n const chainId = this.core.chainId;\n const wc = this.core.getContractAddress(CONTRACT_NAMES.withdrawalVault);\n const [blockNumber, wcPrefix] = await Promise.all([\n this.core.publicClient.getBlockNumber(),\n this.getWcPrefix(),\n ]);\n\n const errors = await validateDepositData(depositData, {\n chainId,\n withdrawalCredentials: wc,\n wcPrefix,\n currentBlockNumber: Number(blockNumber),\n });\n\n if (errors.length) {\n return [...errors];\n }\n\n const pubkeys = depositData.map((data) => data.pubkey);\n\n const duplicateErrors = this.checkCachedKeys(pubkeys, options);\n const uploadedDuplicateErrors = await this.checkUploadedKeys(pubkeys);\n const clErrors = await this.checkClKeys(pubkeys.map(toHexString));\n\n return [\n ...errors,\n ...duplicateErrors,\n ...uploadedDuplicateErrors,\n ...clErrors,\n ];\n }\n\n @Logger('API:')\n @ErrorHandler()\n @Cache(CACHE_MID)\n public async checkUploadedKeys(pubkeys: Hex[]): Promise<ValidationError[]> {\n const keys = await this.bus.keysWithStatus?.getApiKeys(pubkeys);\n const errors: ValidationError[] = [];\n\n if (!keys) return errors;\n\n pubkeys.forEach((pubkey, index) => {\n const isUploaded = keys.find((key) => compareLowercase(key.key, pubkey));\n\n if (isUploaded) {\n errors.push({\n index,\n message: `pubkey was previously submitted`,\n field: 'pubkey',\n code: ValidationErrorCode.PREVIOUSLY_SUBMITTED,\n });\n }\n });\n\n return errors;\n }\n\n @Logger('Utils:')\n @ErrorHandler()\n public checkCachedKeys(\n pubkeys: Hex[],\n options?: { skipPending?: boolean },\n ): ValidationError[] {\n const keysCache = this.bus.keysCache;\n const errors: ValidationError[] = [];\n\n if (!keysCache) return errors;\n\n pubkeys.forEach((pubkey, index) => {\n const status = keysCache.getCacheStatus(pubkey);\n if (!status) return;\n if (status === KeyCacheStatus.PENDING && options?.skipPending) return;\n\n errors.push({\n index,\n field: 'pubkey',\n message: `pubkey already submitted`,\n code:\n status === KeyCacheStatus.CONFIRMED\n ? ValidationErrorCode.CACHED_PUBKEY_CONFIRMED\n : ValidationErrorCode.CACHED_PUBKEY_PENDING,\n });\n });\n\n return errors;\n }\n\n @Logger('API:')\n @ErrorHandler()\n public async checkClKeys(pubkeys: Hex[]): Promise<ValidationError[]> {\n const validPubkeys = pubkeys.filter((p) =>\n isHexadecimalString(p, PUBKEY_LENGTH),\n );\n const clKeys = await this.bus.keysWithStatus?.getClKeys(validPubkeys);\n const errors: ValidationError[] = [];\n\n if (!clKeys) return errors;\n\n pubkeys.forEach((pubkey, index) => {\n const exists = clKeys.find((k) => compareLowercase(k.pubkey, pubkey));\n if (exists) {\n errors.push({\n index,\n message: `pubkey already exists as a validator on CL`,\n field: 'pubkey',\n code: ValidationErrorCode.VALIDATOR_EXISTS,\n });\n }\n });\n\n return errors;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,kBAAA,sBAAA,wBAAA,0BAAA,kBAAA,gBAAA,uBAAA,IAAA;AAwBO,IAAM,iBAAN,eAA6B,KAAA,uBAAA,cAKlC,wBAAA,CAAC,eAAA,OAAO,SAAQ,CAAA,EAKhB,iBAAA,CAAC,eAAA,OAAO,SAAQ,CAAA,EAKhB,mBAAA,CAAC,eAAA,OAAO,SAAQ,CAAA,EAMhB,2BAAA,CAAC,eAAA,OAAO,SAAQ,CAAA,
|
|
1
|
+
{"version":3,"file":"deposit-data-sdk.cjs","names":[],"sources":["../../src/deposit-data-sdk/deposit-data-sdk.ts"],"sourcesContent":["import { Hex } from 'viem';\nimport { CsmSDKModule } from '../common/class-primitives/csm-sdk-module';\nimport { Cache, ErrorHandler, Logger } from '../common/decorators/index';\nimport { CACHE_MID, CONTRACT_NAMES } from '../common/index';\nimport {\n compareLowercase,\n isHexadecimalString,\n toHexString,\n} from '../common/utils/index';\nimport { KeysCacheSDK } from '../keys-cache-sdk/keys-cache-sdk';\nimport { KeyCacheStatus } from '../keys-cache-sdk/types';\nimport { KeysWithStatusSDK } from '../keys-with-status-sdk/keys-with-status-sdk';\nimport { ModuleSDK } from '../module-sdk/module-sdk';\nimport { PUBKEY_LENGTH } from './constants';\nimport { parseDepositData, removeKey } from './parser';\nimport {\n DepositData,\n ParseResult,\n RemoveKeyResult,\n ValidationError,\n ValidationErrorCode,\n} from './types';\nimport { validateDepositData } from './validator';\n\nexport class DepositDataSDK extends CsmSDKModule<{\n module: ModuleSDK;\n keysWithStatus?: KeysWithStatusSDK;\n keysCache?: KeysCacheSDK;\n}> {\n @Logger('Utils:')\n public parseDepositData(json: string): ParseResult {\n return parseDepositData(json);\n }\n\n @Logger('Utils:')\n public removeKey(json: string, index: number): RemoveKeyResult {\n return removeKey(json, index);\n }\n\n @Logger('Utils:')\n private async getWcPrefix(): Promise<string> {\n const wcType = await this.bus.module.getWithdrawalCredentialsType();\n return wcType.toString(16).padStart(2, '0').padEnd(24, '0');\n }\n\n @Logger('Utils:')\n public async validateDepositData(\n depositData: DepositData[],\n options?: { skipPending?: boolean; skipSignature?: boolean },\n ): Promise<ValidationError[]> {\n const chainId = this.core.chainId;\n const wc = this.core.getContractAddress(CONTRACT_NAMES.withdrawalVault);\n const [blockNumber, wcPrefix] = await Promise.all([\n this.core.publicClient.getBlockNumber(),\n this.getWcPrefix(),\n ]);\n\n const errors = await validateDepositData(depositData, {\n chainId,\n withdrawalCredentials: wc,\n wcPrefix,\n currentBlockNumber: Number(blockNumber),\n skipSignature: options?.skipSignature,\n });\n\n if (errors.length) {\n return [...errors];\n }\n\n const pubkeys = depositData.map((data) => data.pubkey);\n\n const duplicateErrors = this.checkCachedKeys(pubkeys, options);\n const uploadedDuplicateErrors = await this.checkUploadedKeys(pubkeys);\n const clErrors = await this.checkClKeys(pubkeys.map(toHexString));\n\n return [\n ...errors,\n ...duplicateErrors,\n ...uploadedDuplicateErrors,\n ...clErrors,\n ];\n }\n\n @Logger('API:')\n @ErrorHandler()\n @Cache(CACHE_MID)\n public async checkUploadedKeys(pubkeys: Hex[]): Promise<ValidationError[]> {\n const keys = await this.bus.keysWithStatus?.getApiKeys(pubkeys);\n const errors: ValidationError[] = [];\n\n if (!keys) return errors;\n\n pubkeys.forEach((pubkey, index) => {\n const isUploaded = keys.find((key) => compareLowercase(key.key, pubkey));\n\n if (isUploaded) {\n errors.push({\n index,\n message: `pubkey was previously submitted`,\n field: 'pubkey',\n code: ValidationErrorCode.PREVIOUSLY_SUBMITTED,\n });\n }\n });\n\n return errors;\n }\n\n @Logger('Utils:')\n @ErrorHandler()\n public checkCachedKeys(\n pubkeys: Hex[],\n options?: { skipPending?: boolean },\n ): ValidationError[] {\n const keysCache = this.bus.keysCache;\n const errors: ValidationError[] = [];\n\n if (!keysCache) return errors;\n\n pubkeys.forEach((pubkey, index) => {\n const status = keysCache.getCacheStatus(pubkey);\n if (!status) return;\n if (status === KeyCacheStatus.PENDING && options?.skipPending) return;\n\n errors.push({\n index,\n field: 'pubkey',\n message: `pubkey already submitted`,\n code:\n status === KeyCacheStatus.CONFIRMED\n ? ValidationErrorCode.CACHED_PUBKEY_CONFIRMED\n : ValidationErrorCode.CACHED_PUBKEY_PENDING,\n });\n });\n\n return errors;\n }\n\n @Logger('API:')\n @ErrorHandler()\n public async checkClKeys(pubkeys: Hex[]): Promise<ValidationError[]> {\n const validPubkeys = pubkeys.filter((p) =>\n isHexadecimalString(p, PUBKEY_LENGTH),\n );\n const clKeys = await this.bus.keysWithStatus?.getClKeys(validPubkeys);\n const errors: ValidationError[] = [];\n\n if (!clKeys) return errors;\n\n pubkeys.forEach((pubkey, index) => {\n const exists = clKeys.find((k) => compareLowercase(k.pubkey, pubkey));\n if (exists) {\n errors.push({\n index,\n message: `pubkey already exists as a validator on CL`,\n field: 'pubkey',\n code: ValidationErrorCode.VALIDATOR_EXISTS,\n });\n }\n });\n\n return errors;\n }\n}\n"],"mappings":"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"}
|
|
@@ -16,6 +16,7 @@ declare class DepositDataSDK extends CsmSDKModule<{
|
|
|
16
16
|
private getWcPrefix;
|
|
17
17
|
validateDepositData(depositData: DepositData[], options?: {
|
|
18
18
|
skipPending?: boolean;
|
|
19
|
+
skipSignature?: boolean;
|
|
19
20
|
}): Promise<ValidationError[]>;
|
|
20
21
|
checkUploadedKeys(pubkeys: Hex[]): Promise<ValidationError[]>;
|
|
21
22
|
checkCachedKeys(pubkeys: Hex[], options?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deposit-data-sdk.d.cts","names":[],"sources":["../../src/deposit-data-sdk/deposit-data-sdk.ts"],"mappings":";;;;;;;;cAwBa,cAAA,SAAuB,YAAA;EAClC,MAAA,EAAQ,SAAA;EACR,cAAA,GAAiB,iBAAA;EACjB,SAAA,GAAY,YAAA;AAAA;EAGL,gBAAA,CAAiB,IAAA,WAAe,WAAA;EAKhC,SAAA,CAAU,IAAA,UAAc,KAAA,WAAgB,eAAA;EAAA,QAKjC,WAAA;EAMD,mBAAA,CACX,WAAA,EAAa,WAAA,IACb,OAAA;IAAY,WAAA;EAAA,
|
|
1
|
+
{"version":3,"file":"deposit-data-sdk.d.cts","names":[],"sources":["../../src/deposit-data-sdk/deposit-data-sdk.ts"],"mappings":";;;;;;;;cAwBa,cAAA,SAAuB,YAAA;EAClC,MAAA,EAAQ,SAAA;EACR,cAAA,GAAiB,iBAAA;EACjB,SAAA,GAAY,YAAA;AAAA;EAGL,gBAAA,CAAiB,IAAA,WAAe,WAAA;EAKhC,SAAA,CAAU,IAAA,UAAc,KAAA,WAAgB,eAAA;EAAA,QAKjC,WAAA;EAMD,mBAAA,CACX,WAAA,EAAa,WAAA,IACb,OAAA;IAAY,WAAA;IAAuB,aAAA;EAAA,IAClC,OAAA,CAAQ,eAAA;EAqCE,iBAAA,CAAkB,OAAA,EAAS,GAAA,KAAQ,OAAA,CAAQ,eAAA;EAwBjD,eAAA,CACL,OAAA,EAAS,GAAA,IACT,OAAA;IAAY,WAAA;EAAA,IACX,eAAA;EA2BU,WAAA,CAAY,OAAA,EAAS,GAAA,KAAQ,OAAA,CAAQ,eAAA;AAAA"}
|
|
@@ -16,6 +16,7 @@ declare class DepositDataSDK extends CsmSDKModule<{
|
|
|
16
16
|
private getWcPrefix;
|
|
17
17
|
validateDepositData(depositData: DepositData[], options?: {
|
|
18
18
|
skipPending?: boolean;
|
|
19
|
+
skipSignature?: boolean;
|
|
19
20
|
}): Promise<ValidationError[]>;
|
|
20
21
|
checkUploadedKeys(pubkeys: Hex[]): Promise<ValidationError[]>;
|
|
21
22
|
checkCachedKeys(pubkeys: Hex[], options?: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deposit-data-sdk.d.mts","names":[],"sources":["../../src/deposit-data-sdk/deposit-data-sdk.ts"],"mappings":";;;;;;;;cAwBa,cAAA,SAAuB,YAAA;EAClC,MAAA,EAAQ,SAAA;EACR,cAAA,GAAiB,iBAAA;EACjB,SAAA,GAAY,YAAA;AAAA;EAGL,gBAAA,CAAiB,IAAA,WAAe,WAAA;EAKhC,SAAA,CAAU,IAAA,UAAc,KAAA,WAAgB,eAAA;EAAA,QAKjC,WAAA;EAMD,mBAAA,CACX,WAAA,EAAa,WAAA,IACb,OAAA;IAAY,WAAA;EAAA,
|
|
1
|
+
{"version":3,"file":"deposit-data-sdk.d.mts","names":[],"sources":["../../src/deposit-data-sdk/deposit-data-sdk.ts"],"mappings":";;;;;;;;cAwBa,cAAA,SAAuB,YAAA;EAClC,MAAA,EAAQ,SAAA;EACR,cAAA,GAAiB,iBAAA;EACjB,SAAA,GAAY,YAAA;AAAA;EAGL,gBAAA,CAAiB,IAAA,WAAe,WAAA;EAKhC,SAAA,CAAU,IAAA,UAAc,KAAA,WAAgB,eAAA;EAAA,QAKjC,WAAA;EAMD,mBAAA,CACX,WAAA,EAAa,WAAA,IACb,OAAA;IAAY,WAAA;IAAuB,aAAA;EAAA,IAClC,OAAA,CAAQ,eAAA;EAqCE,iBAAA,CAAkB,OAAA,EAAS,GAAA,KAAQ,OAAA,CAAQ,eAAA;EAwBjD,eAAA,CACL,OAAA,EAAS,GAAA,IACT,OAAA;IAAY,WAAA;EAAA,IACX,eAAA;EA2BU,WAAA,CAAY,OAAA,EAAS,GAAA,KAAQ,OAAA,CAAQ,eAAA;AAAA"}
|
|
@@ -119,7 +119,8 @@ var DepositDataSDK = class extends (_a = CsmSDKModule, _parseDepositData_dec = [
|
|
|
119
119
|
chainId,
|
|
120
120
|
withdrawalCredentials: wc,
|
|
121
121
|
wcPrefix,
|
|
122
|
-
currentBlockNumber: Number(blockNumber)
|
|
122
|
+
currentBlockNumber: Number(blockNumber),
|
|
123
|
+
skipSignature: options?.skipSignature
|
|
123
124
|
});
|
|
124
125
|
if (errors.length) return [...errors];
|
|
125
126
|
const pubkeys = depositData.map((data) => data.pubkey);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deposit-data-sdk.mjs","names":[],"sources":["../../src/deposit-data-sdk/deposit-data-sdk.ts"],"sourcesContent":["import { Hex } from 'viem';\nimport { CsmSDKModule } from '../common/class-primitives/csm-sdk-module';\nimport { Cache, ErrorHandler, Logger } from '../common/decorators/index';\nimport { CACHE_MID, CONTRACT_NAMES } from '../common/index';\nimport {\n compareLowercase,\n isHexadecimalString,\n toHexString,\n} from '../common/utils/index';\nimport { KeysCacheSDK } from '../keys-cache-sdk/keys-cache-sdk';\nimport { KeyCacheStatus } from '../keys-cache-sdk/types';\nimport { KeysWithStatusSDK } from '../keys-with-status-sdk/keys-with-status-sdk';\nimport { ModuleSDK } from '../module-sdk/module-sdk';\nimport { PUBKEY_LENGTH } from './constants';\nimport { parseDepositData, removeKey } from './parser';\nimport {\n DepositData,\n ParseResult,\n RemoveKeyResult,\n ValidationError,\n ValidationErrorCode,\n} from './types';\nimport { validateDepositData } from './validator';\n\nexport class DepositDataSDK extends CsmSDKModule<{\n module: ModuleSDK;\n keysWithStatus?: KeysWithStatusSDK;\n keysCache?: KeysCacheSDK;\n}> {\n @Logger('Utils:')\n public parseDepositData(json: string): ParseResult {\n return parseDepositData(json);\n }\n\n @Logger('Utils:')\n public removeKey(json: string, index: number): RemoveKeyResult {\n return removeKey(json, index);\n }\n\n @Logger('Utils:')\n private async getWcPrefix(): Promise<string> {\n const wcType = await this.bus.module.getWithdrawalCredentialsType();\n return wcType.toString(16).padStart(2, '0').padEnd(24, '0');\n }\n\n @Logger('Utils:')\n public async validateDepositData(\n depositData: DepositData[],\n options?: { skipPending?: boolean },\n ): Promise<ValidationError[]> {\n const chainId = this.core.chainId;\n const wc = this.core.getContractAddress(CONTRACT_NAMES.withdrawalVault);\n const [blockNumber, wcPrefix] = await Promise.all([\n this.core.publicClient.getBlockNumber(),\n this.getWcPrefix(),\n ]);\n\n const errors = await validateDepositData(depositData, {\n chainId,\n withdrawalCredentials: wc,\n wcPrefix,\n currentBlockNumber: Number(blockNumber),\n });\n\n if (errors.length) {\n return [...errors];\n }\n\n const pubkeys = depositData.map((data) => data.pubkey);\n\n const duplicateErrors = this.checkCachedKeys(pubkeys, options);\n const uploadedDuplicateErrors = await this.checkUploadedKeys(pubkeys);\n const clErrors = await this.checkClKeys(pubkeys.map(toHexString));\n\n return [\n ...errors,\n ...duplicateErrors,\n ...uploadedDuplicateErrors,\n ...clErrors,\n ];\n }\n\n @Logger('API:')\n @ErrorHandler()\n @Cache(CACHE_MID)\n public async checkUploadedKeys(pubkeys: Hex[]): Promise<ValidationError[]> {\n const keys = await this.bus.keysWithStatus?.getApiKeys(pubkeys);\n const errors: ValidationError[] = [];\n\n if (!keys) return errors;\n\n pubkeys.forEach((pubkey, index) => {\n const isUploaded = keys.find((key) => compareLowercase(key.key, pubkey));\n\n if (isUploaded) {\n errors.push({\n index,\n message: `pubkey was previously submitted`,\n field: 'pubkey',\n code: ValidationErrorCode.PREVIOUSLY_SUBMITTED,\n });\n }\n });\n\n return errors;\n }\n\n @Logger('Utils:')\n @ErrorHandler()\n public checkCachedKeys(\n pubkeys: Hex[],\n options?: { skipPending?: boolean },\n ): ValidationError[] {\n const keysCache = this.bus.keysCache;\n const errors: ValidationError[] = [];\n\n if (!keysCache) return errors;\n\n pubkeys.forEach((pubkey, index) => {\n const status = keysCache.getCacheStatus(pubkey);\n if (!status) return;\n if (status === KeyCacheStatus.PENDING && options?.skipPending) return;\n\n errors.push({\n index,\n field: 'pubkey',\n message: `pubkey already submitted`,\n code:\n status === KeyCacheStatus.CONFIRMED\n ? ValidationErrorCode.CACHED_PUBKEY_CONFIRMED\n : ValidationErrorCode.CACHED_PUBKEY_PENDING,\n });\n });\n\n return errors;\n }\n\n @Logger('API:')\n @ErrorHandler()\n public async checkClKeys(pubkeys: Hex[]): Promise<ValidationError[]> {\n const validPubkeys = pubkeys.filter((p) =>\n isHexadecimalString(p, PUBKEY_LENGTH),\n );\n const clKeys = await this.bus.keysWithStatus?.getClKeys(validPubkeys);\n const errors: ValidationError[] = [];\n\n if (!clKeys) return errors;\n\n pubkeys.forEach((pubkey, index) => {\n const exists = clKeys.find((k) => compareLowercase(k.pubkey, pubkey));\n if (exists) {\n errors.push({\n index,\n message: `pubkey already exists as a validator on CL`,\n field: 'pubkey',\n code: ValidationErrorCode.VALIDATOR_EXISTS,\n });\n }\n });\n\n return errors;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,kBAAA,sBAAA,wBAAA,0BAAA,kBAAA,gBAAA,uBAAA,IAAA;AAwBO,IAAM,iBAAN,eAA6B,KAAA,cAKlC,wBAAA,CAAC,OAAO,SAAQ,CAAA,EAKhB,iBAAA,CAAC,OAAO,SAAQ,CAAA,EAKhB,mBAAA,CAAC,OAAO,SAAQ,CAAA,EAMhB,2BAAA,CAAC,OAAO,SAAQ,CAAA,
|
|
1
|
+
{"version":3,"file":"deposit-data-sdk.mjs","names":[],"sources":["../../src/deposit-data-sdk/deposit-data-sdk.ts"],"sourcesContent":["import { Hex } from 'viem';\nimport { CsmSDKModule } from '../common/class-primitives/csm-sdk-module';\nimport { Cache, ErrorHandler, Logger } from '../common/decorators/index';\nimport { CACHE_MID, CONTRACT_NAMES } from '../common/index';\nimport {\n compareLowercase,\n isHexadecimalString,\n toHexString,\n} from '../common/utils/index';\nimport { KeysCacheSDK } from '../keys-cache-sdk/keys-cache-sdk';\nimport { KeyCacheStatus } from '../keys-cache-sdk/types';\nimport { KeysWithStatusSDK } from '../keys-with-status-sdk/keys-with-status-sdk';\nimport { ModuleSDK } from '../module-sdk/module-sdk';\nimport { PUBKEY_LENGTH } from './constants';\nimport { parseDepositData, removeKey } from './parser';\nimport {\n DepositData,\n ParseResult,\n RemoveKeyResult,\n ValidationError,\n ValidationErrorCode,\n} from './types';\nimport { validateDepositData } from './validator';\n\nexport class DepositDataSDK extends CsmSDKModule<{\n module: ModuleSDK;\n keysWithStatus?: KeysWithStatusSDK;\n keysCache?: KeysCacheSDK;\n}> {\n @Logger('Utils:')\n public parseDepositData(json: string): ParseResult {\n return parseDepositData(json);\n }\n\n @Logger('Utils:')\n public removeKey(json: string, index: number): RemoveKeyResult {\n return removeKey(json, index);\n }\n\n @Logger('Utils:')\n private async getWcPrefix(): Promise<string> {\n const wcType = await this.bus.module.getWithdrawalCredentialsType();\n return wcType.toString(16).padStart(2, '0').padEnd(24, '0');\n }\n\n @Logger('Utils:')\n public async validateDepositData(\n depositData: DepositData[],\n options?: { skipPending?: boolean; skipSignature?: boolean },\n ): Promise<ValidationError[]> {\n const chainId = this.core.chainId;\n const wc = this.core.getContractAddress(CONTRACT_NAMES.withdrawalVault);\n const [blockNumber, wcPrefix] = await Promise.all([\n this.core.publicClient.getBlockNumber(),\n this.getWcPrefix(),\n ]);\n\n const errors = await validateDepositData(depositData, {\n chainId,\n withdrawalCredentials: wc,\n wcPrefix,\n currentBlockNumber: Number(blockNumber),\n skipSignature: options?.skipSignature,\n });\n\n if (errors.length) {\n return [...errors];\n }\n\n const pubkeys = depositData.map((data) => data.pubkey);\n\n const duplicateErrors = this.checkCachedKeys(pubkeys, options);\n const uploadedDuplicateErrors = await this.checkUploadedKeys(pubkeys);\n const clErrors = await this.checkClKeys(pubkeys.map(toHexString));\n\n return [\n ...errors,\n ...duplicateErrors,\n ...uploadedDuplicateErrors,\n ...clErrors,\n ];\n }\n\n @Logger('API:')\n @ErrorHandler()\n @Cache(CACHE_MID)\n public async checkUploadedKeys(pubkeys: Hex[]): Promise<ValidationError[]> {\n const keys = await this.bus.keysWithStatus?.getApiKeys(pubkeys);\n const errors: ValidationError[] = [];\n\n if (!keys) return errors;\n\n pubkeys.forEach((pubkey, index) => {\n const isUploaded = keys.find((key) => compareLowercase(key.key, pubkey));\n\n if (isUploaded) {\n errors.push({\n index,\n message: `pubkey was previously submitted`,\n field: 'pubkey',\n code: ValidationErrorCode.PREVIOUSLY_SUBMITTED,\n });\n }\n });\n\n return errors;\n }\n\n @Logger('Utils:')\n @ErrorHandler()\n public checkCachedKeys(\n pubkeys: Hex[],\n options?: { skipPending?: boolean },\n ): ValidationError[] {\n const keysCache = this.bus.keysCache;\n const errors: ValidationError[] = [];\n\n if (!keysCache) return errors;\n\n pubkeys.forEach((pubkey, index) => {\n const status = keysCache.getCacheStatus(pubkey);\n if (!status) return;\n if (status === KeyCacheStatus.PENDING && options?.skipPending) return;\n\n errors.push({\n index,\n field: 'pubkey',\n message: `pubkey already submitted`,\n code:\n status === KeyCacheStatus.CONFIRMED\n ? ValidationErrorCode.CACHED_PUBKEY_CONFIRMED\n : ValidationErrorCode.CACHED_PUBKEY_PENDING,\n });\n });\n\n return errors;\n }\n\n @Logger('API:')\n @ErrorHandler()\n public async checkClKeys(pubkeys: Hex[]): Promise<ValidationError[]> {\n const validPubkeys = pubkeys.filter((p) =>\n isHexadecimalString(p, PUBKEY_LENGTH),\n );\n const clKeys = await this.bus.keysWithStatus?.getClKeys(validPubkeys);\n const errors: ValidationError[] = [];\n\n if (!clKeys) return errors;\n\n pubkeys.forEach((pubkey, index) => {\n const exists = clKeys.find((k) => compareLowercase(k.pubkey, pubkey));\n if (exists) {\n errors.push({\n index,\n message: `pubkey already exists as a validator on CL`,\n field: 'pubkey',\n code: ValidationErrorCode.VALIDATOR_EXISTS,\n });\n }\n });\n\n return errors;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.cjs","names":["ValidationErrorCode"],"sources":["../../src/deposit-data-sdk/types.ts"],"sourcesContent":["import { Hex } from 'viem';\nimport { SUPPORTED_CHAINS } from '../common/index';\n\nexport type DepositData = {\n pubkey: Hex;\n withdrawal_credentials: Hex;\n amount: number;\n signature: Hex;\n deposit_message_root: Hex;\n deposit_data_root: Hex;\n fork_version: Hex;\n network_name: string;\n deposit_cli_version: string;\n};\n\nexport enum ValidationErrorCode {\n INVALID_PUBKEY = 'INVALID_PUBKEY',\n INVALID_SIGNATURE = 'INVALID_SIGNATURE',\n INVALID_WITHDRAWAL_CREDENTIALS = 'INVALID_WITHDRAWAL_CREDENTIALS',\n UNSUPPORTED_WC_TYPE = 'UNSUPPORTED_WC_TYPE',\n INVALID_AMOUNT = 'INVALID_AMOUNT',\n INVALID_NETWORK = 'INVALID_NETWORK',\n INVALID_FORK_VERSION = 'INVALID_FORK_VERSION',\n INVALID_DEPOSIT_ROOT = 'INVALID_DEPOSIT_ROOT',\n DUPLICATE_PUBKEY = 'DUPLICATE_PUBKEY',\n CACHED_PUBKEY_CONFIRMED = 'CACHED_PUBKEY_CONFIRMED',\n CACHED_PUBKEY_PENDING = 'CACHED_PUBKEY_PENDING',\n PREVIOUSLY_SUBMITTED = 'PREVIOUSLY_SUBMITTED',\n INVALID_BLS_SIGNATURE = 'INVALID_BLS_SIGNATURE',\n MISSING_FIELD = 'MISSING_FIELD',\n INVALID_FORMAT = 'INVALID_FORMAT',\n VALIDATOR_EXISTS = 'VALIDATOR_EXISTS',\n}\n\nexport type ValidationError = {\n index: number;\n field?: string;\n message: string;\n code: ValidationErrorCode;\n};\n\nexport type RemoveKeyResult = {\n success: boolean;\n data?: DepositData[];\n json?: string;\n error?: string;\n};\n\nexport type ParseResult = {\n success: boolean;\n data?: DepositData[];\n error?: string;\n};\n\nexport type ValidationProps = {\n chainId: SUPPORTED_CHAINS;\n withdrawalCredentials: string;\n wcPrefix: string;\n};\n\nexport type ValidationExtendedProps = ValidationProps & {\n currentBlockNumber?: number;\n};\n\nexport type DuplicateProcessingConfig = {\n pubkey: Hex;\n index: number;\n pubkeyMap: Map<Hex, number[]>;\n errors: ValidationError[];\n};\n"],"mappings":";AAeO,IAAK,sBAAL,kBAAKA,yBAAL;AACLA,sBAAA,oBAAiB;AACjBA,sBAAA,uBAAoB;AACpBA,sBAAA,oCAAiC;AACjCA,sBAAA,yBAAsB;AACtBA,sBAAA,oBAAiB;AACjBA,sBAAA,qBAAkB;AAClBA,sBAAA,0BAAuB;AACvBA,sBAAA,0BAAuB;AACvBA,sBAAA,sBAAmB;AACnBA,sBAAA,6BAA0B;AAC1BA,sBAAA,2BAAwB;AACxBA,sBAAA,0BAAuB;AACvBA,sBAAA,2BAAwB;AACxBA,sBAAA,mBAAgB;AAChBA,sBAAA,oBAAiB;AACjBA,sBAAA,sBAAmB;AAhBT,QAAAA;GAAA,uBAAA,EAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"types.cjs","names":["ValidationErrorCode"],"sources":["../../src/deposit-data-sdk/types.ts"],"sourcesContent":["import { Hex } from 'viem';\nimport { SUPPORTED_CHAINS } from '../common/index';\n\nexport type DepositData = {\n pubkey: Hex;\n withdrawal_credentials: Hex;\n amount: number;\n signature: Hex;\n deposit_message_root: Hex;\n deposit_data_root: Hex;\n fork_version: Hex;\n network_name: string;\n deposit_cli_version: string;\n};\n\nexport enum ValidationErrorCode {\n INVALID_PUBKEY = 'INVALID_PUBKEY',\n INVALID_SIGNATURE = 'INVALID_SIGNATURE',\n INVALID_WITHDRAWAL_CREDENTIALS = 'INVALID_WITHDRAWAL_CREDENTIALS',\n UNSUPPORTED_WC_TYPE = 'UNSUPPORTED_WC_TYPE',\n INVALID_AMOUNT = 'INVALID_AMOUNT',\n INVALID_NETWORK = 'INVALID_NETWORK',\n INVALID_FORK_VERSION = 'INVALID_FORK_VERSION',\n INVALID_DEPOSIT_ROOT = 'INVALID_DEPOSIT_ROOT',\n DUPLICATE_PUBKEY = 'DUPLICATE_PUBKEY',\n CACHED_PUBKEY_CONFIRMED = 'CACHED_PUBKEY_CONFIRMED',\n CACHED_PUBKEY_PENDING = 'CACHED_PUBKEY_PENDING',\n PREVIOUSLY_SUBMITTED = 'PREVIOUSLY_SUBMITTED',\n INVALID_BLS_SIGNATURE = 'INVALID_BLS_SIGNATURE',\n MISSING_FIELD = 'MISSING_FIELD',\n INVALID_FORMAT = 'INVALID_FORMAT',\n VALIDATOR_EXISTS = 'VALIDATOR_EXISTS',\n}\n\nexport type ValidationError = {\n index: number;\n field?: string;\n message: string;\n code: ValidationErrorCode;\n};\n\nexport type RemoveKeyResult = {\n success: boolean;\n data?: DepositData[];\n json?: string;\n error?: string;\n};\n\nexport type ParseResult = {\n success: boolean;\n data?: DepositData[];\n error?: string;\n};\n\nexport type ValidationProps = {\n chainId: SUPPORTED_CHAINS;\n withdrawalCredentials: string;\n wcPrefix: string;\n};\n\nexport type ValidationExtendedProps = ValidationProps & {\n currentBlockNumber?: number;\n skipSignature?: boolean;\n};\n\nexport type DuplicateProcessingConfig = {\n pubkey: Hex;\n index: number;\n pubkeyMap: Map<Hex, number[]>;\n errors: ValidationError[];\n};\n"],"mappings":";AAeO,IAAK,sBAAL,kBAAKA,yBAAL;AACLA,sBAAA,oBAAiB;AACjBA,sBAAA,uBAAoB;AACpBA,sBAAA,oCAAiC;AACjCA,sBAAA,yBAAsB;AACtBA,sBAAA,oBAAiB;AACjBA,sBAAA,qBAAkB;AAClBA,sBAAA,0BAAuB;AACvBA,sBAAA,0BAAuB;AACvBA,sBAAA,sBAAmB;AACnBA,sBAAA,6BAA0B;AAC1BA,sBAAA,2BAAwB;AACxBA,sBAAA,0BAAuB;AACvBA,sBAAA,2BAAwB;AACxBA,sBAAA,mBAAgB;AAChBA,sBAAA,oBAAiB;AACjBA,sBAAA,sBAAmB;AAhBT,QAAAA;GAAA,uBAAA,EAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/deposit-data-sdk/types.ts"],"mappings":";;;;KAGY,WAAA;EACV,MAAA,EAAQ,GAAA;EACR,sBAAA,EAAwB,GAAA;EACxB,MAAA;EACA,SAAA,EAAW,GAAA;EACX,oBAAA,EAAsB,GAAA;EACtB,iBAAA,EAAmB,GAAA;EACnB,YAAA,EAAc,GAAA;EACd,YAAA;EACA,mBAAA;AAAA;AAAA,aAGU,mBAAA;EACV,cAAA;EACA,iBAAA;EACA,8BAAA;EACA,mBAAA;EACA,cAAA;EACA,eAAA;EACA,oBAAA;EACA,oBAAA;EACA,gBAAA;EACA,uBAAA;EACA,qBAAA;EACA,oBAAA;EACA,qBAAA;EACA,aAAA;EACA,cAAA;EACA,gBAAA;AAAA;AAAA,KAGU,eAAA;EACV,KAAA;EACA,KAAA;EACA,OAAA;EACA,IAAA,EAAM,mBAAA;AAAA;AAAA,KAGI,eAAA;EACV,OAAA;EACA,IAAA,GAAO,WAAA;EACP,IAAA;EACA,KAAA;AAAA;AAAA,KAGU,WAAA;EACV,OAAA;EACA,IAAA,GAAO,WAAA;EACP,KAAA;AAAA;AAAA,KAGU,eAAA;EACV,OAAA,EAAS,gBAAA;EACT,qBAAA;EACA,QAAA;AAAA;AAAA,KAGU,uBAAA,GAA0B,eAAA;EACpC,kBAAA;AAAA;AAAA,KAGU,yBAAA;EACV,MAAA,EAAQ,GAAA;EACR,KAAA;EACA,SAAA,EAAW,GAAA,CAAI,GAAA;EACf,MAAA,EAAQ,eAAA;AAAA"}
|
|
1
|
+
{"version":3,"file":"types.d.cts","names":[],"sources":["../../src/deposit-data-sdk/types.ts"],"mappings":";;;;KAGY,WAAA;EACV,MAAA,EAAQ,GAAA;EACR,sBAAA,EAAwB,GAAA;EACxB,MAAA;EACA,SAAA,EAAW,GAAA;EACX,oBAAA,EAAsB,GAAA;EACtB,iBAAA,EAAmB,GAAA;EACnB,YAAA,EAAc,GAAA;EACd,YAAA;EACA,mBAAA;AAAA;AAAA,aAGU,mBAAA;EACV,cAAA;EACA,iBAAA;EACA,8BAAA;EACA,mBAAA;EACA,cAAA;EACA,eAAA;EACA,oBAAA;EACA,oBAAA;EACA,gBAAA;EACA,uBAAA;EACA,qBAAA;EACA,oBAAA;EACA,qBAAA;EACA,aAAA;EACA,cAAA;EACA,gBAAA;AAAA;AAAA,KAGU,eAAA;EACV,KAAA;EACA,KAAA;EACA,OAAA;EACA,IAAA,EAAM,mBAAA;AAAA;AAAA,KAGI,eAAA;EACV,OAAA;EACA,IAAA,GAAO,WAAA;EACP,IAAA;EACA,KAAA;AAAA;AAAA,KAGU,WAAA;EACV,OAAA;EACA,IAAA,GAAO,WAAA;EACP,KAAA;AAAA;AAAA,KAGU,eAAA;EACV,OAAA,EAAS,gBAAA;EACT,qBAAA;EACA,QAAA;AAAA;AAAA,KAGU,uBAAA,GAA0B,eAAA;EACpC,kBAAA;EACA,aAAA;AAAA;AAAA,KAGU,yBAAA;EACV,MAAA,EAAQ,GAAA;EACR,KAAA;EACA,SAAA,EAAW,GAAA,CAAI,GAAA;EACf,MAAA,EAAQ,eAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/deposit-data-sdk/types.ts"],"mappings":";;;;KAGY,WAAA;EACV,MAAA,EAAQ,GAAA;EACR,sBAAA,EAAwB,GAAA;EACxB,MAAA;EACA,SAAA,EAAW,GAAA;EACX,oBAAA,EAAsB,GAAA;EACtB,iBAAA,EAAmB,GAAA;EACnB,YAAA,EAAc,GAAA;EACd,YAAA;EACA,mBAAA;AAAA;AAAA,aAGU,mBAAA;EACV,cAAA;EACA,iBAAA;EACA,8BAAA;EACA,mBAAA;EACA,cAAA;EACA,eAAA;EACA,oBAAA;EACA,oBAAA;EACA,gBAAA;EACA,uBAAA;EACA,qBAAA;EACA,oBAAA;EACA,qBAAA;EACA,aAAA;EACA,cAAA;EACA,gBAAA;AAAA;AAAA,KAGU,eAAA;EACV,KAAA;EACA,KAAA;EACA,OAAA;EACA,IAAA,EAAM,mBAAA;AAAA;AAAA,KAGI,eAAA;EACV,OAAA;EACA,IAAA,GAAO,WAAA;EACP,IAAA;EACA,KAAA;AAAA;AAAA,KAGU,WAAA;EACV,OAAA;EACA,IAAA,GAAO,WAAA;EACP,KAAA;AAAA;AAAA,KAGU,eAAA;EACV,OAAA,EAAS,gBAAA;EACT,qBAAA;EACA,QAAA;AAAA;AAAA,KAGU,uBAAA,GAA0B,eAAA;EACpC,kBAAA;AAAA;AAAA,KAGU,yBAAA;EACV,MAAA,EAAQ,GAAA;EACR,KAAA;EACA,SAAA,EAAW,GAAA,CAAI,GAAA;EACf,MAAA,EAAQ,eAAA;AAAA"}
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/deposit-data-sdk/types.ts"],"mappings":";;;;KAGY,WAAA;EACV,MAAA,EAAQ,GAAA;EACR,sBAAA,EAAwB,GAAA;EACxB,MAAA;EACA,SAAA,EAAW,GAAA;EACX,oBAAA,EAAsB,GAAA;EACtB,iBAAA,EAAmB,GAAA;EACnB,YAAA,EAAc,GAAA;EACd,YAAA;EACA,mBAAA;AAAA;AAAA,aAGU,mBAAA;EACV,cAAA;EACA,iBAAA;EACA,8BAAA;EACA,mBAAA;EACA,cAAA;EACA,eAAA;EACA,oBAAA;EACA,oBAAA;EACA,gBAAA;EACA,uBAAA;EACA,qBAAA;EACA,oBAAA;EACA,qBAAA;EACA,aAAA;EACA,cAAA;EACA,gBAAA;AAAA;AAAA,KAGU,eAAA;EACV,KAAA;EACA,KAAA;EACA,OAAA;EACA,IAAA,EAAM,mBAAA;AAAA;AAAA,KAGI,eAAA;EACV,OAAA;EACA,IAAA,GAAO,WAAA;EACP,IAAA;EACA,KAAA;AAAA;AAAA,KAGU,WAAA;EACV,OAAA;EACA,IAAA,GAAO,WAAA;EACP,KAAA;AAAA;AAAA,KAGU,eAAA;EACV,OAAA,EAAS,gBAAA;EACT,qBAAA;EACA,QAAA;AAAA;AAAA,KAGU,uBAAA,GAA0B,eAAA;EACpC,kBAAA;EACA,aAAA;AAAA;AAAA,KAGU,yBAAA;EACV,MAAA,EAAQ,GAAA;EACR,KAAA;EACA,SAAA,EAAW,GAAA,CAAI,GAAA;EACf,MAAA,EAAQ,eAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.mjs","names":["ValidationErrorCode"],"sources":["../../src/deposit-data-sdk/types.ts"],"sourcesContent":["import { Hex } from 'viem';\nimport { SUPPORTED_CHAINS } from '../common/index';\n\nexport type DepositData = {\n pubkey: Hex;\n withdrawal_credentials: Hex;\n amount: number;\n signature: Hex;\n deposit_message_root: Hex;\n deposit_data_root: Hex;\n fork_version: Hex;\n network_name: string;\n deposit_cli_version: string;\n};\n\nexport enum ValidationErrorCode {\n INVALID_PUBKEY = 'INVALID_PUBKEY',\n INVALID_SIGNATURE = 'INVALID_SIGNATURE',\n INVALID_WITHDRAWAL_CREDENTIALS = 'INVALID_WITHDRAWAL_CREDENTIALS',\n UNSUPPORTED_WC_TYPE = 'UNSUPPORTED_WC_TYPE',\n INVALID_AMOUNT = 'INVALID_AMOUNT',\n INVALID_NETWORK = 'INVALID_NETWORK',\n INVALID_FORK_VERSION = 'INVALID_FORK_VERSION',\n INVALID_DEPOSIT_ROOT = 'INVALID_DEPOSIT_ROOT',\n DUPLICATE_PUBKEY = 'DUPLICATE_PUBKEY',\n CACHED_PUBKEY_CONFIRMED = 'CACHED_PUBKEY_CONFIRMED',\n CACHED_PUBKEY_PENDING = 'CACHED_PUBKEY_PENDING',\n PREVIOUSLY_SUBMITTED = 'PREVIOUSLY_SUBMITTED',\n INVALID_BLS_SIGNATURE = 'INVALID_BLS_SIGNATURE',\n MISSING_FIELD = 'MISSING_FIELD',\n INVALID_FORMAT = 'INVALID_FORMAT',\n VALIDATOR_EXISTS = 'VALIDATOR_EXISTS',\n}\n\nexport type ValidationError = {\n index: number;\n field?: string;\n message: string;\n code: ValidationErrorCode;\n};\n\nexport type RemoveKeyResult = {\n success: boolean;\n data?: DepositData[];\n json?: string;\n error?: string;\n};\n\nexport type ParseResult = {\n success: boolean;\n data?: DepositData[];\n error?: string;\n};\n\nexport type ValidationProps = {\n chainId: SUPPORTED_CHAINS;\n withdrawalCredentials: string;\n wcPrefix: string;\n};\n\nexport type ValidationExtendedProps = ValidationProps & {\n currentBlockNumber?: number;\n};\n\nexport type DuplicateProcessingConfig = {\n pubkey: Hex;\n index: number;\n pubkeyMap: Map<Hex, number[]>;\n errors: ValidationError[];\n};\n"],"mappings":";AAeO,IAAK,sBAAL,kBAAKA,yBAAL;AACLA,sBAAA,oBAAiB;AACjBA,sBAAA,uBAAoB;AACpBA,sBAAA,oCAAiC;AACjCA,sBAAA,yBAAsB;AACtBA,sBAAA,oBAAiB;AACjBA,sBAAA,qBAAkB;AAClBA,sBAAA,0BAAuB;AACvBA,sBAAA,0BAAuB;AACvBA,sBAAA,sBAAmB;AACnBA,sBAAA,6BAA0B;AAC1BA,sBAAA,2BAAwB;AACxBA,sBAAA,0BAAuB;AACvBA,sBAAA,2BAAwB;AACxBA,sBAAA,mBAAgB;AAChBA,sBAAA,oBAAiB;AACjBA,sBAAA,sBAAmB;AAhBT,QAAAA;GAAA,uBAAA,EAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"types.mjs","names":["ValidationErrorCode"],"sources":["../../src/deposit-data-sdk/types.ts"],"sourcesContent":["import { Hex } from 'viem';\nimport { SUPPORTED_CHAINS } from '../common/index';\n\nexport type DepositData = {\n pubkey: Hex;\n withdrawal_credentials: Hex;\n amount: number;\n signature: Hex;\n deposit_message_root: Hex;\n deposit_data_root: Hex;\n fork_version: Hex;\n network_name: string;\n deposit_cli_version: string;\n};\n\nexport enum ValidationErrorCode {\n INVALID_PUBKEY = 'INVALID_PUBKEY',\n INVALID_SIGNATURE = 'INVALID_SIGNATURE',\n INVALID_WITHDRAWAL_CREDENTIALS = 'INVALID_WITHDRAWAL_CREDENTIALS',\n UNSUPPORTED_WC_TYPE = 'UNSUPPORTED_WC_TYPE',\n INVALID_AMOUNT = 'INVALID_AMOUNT',\n INVALID_NETWORK = 'INVALID_NETWORK',\n INVALID_FORK_VERSION = 'INVALID_FORK_VERSION',\n INVALID_DEPOSIT_ROOT = 'INVALID_DEPOSIT_ROOT',\n DUPLICATE_PUBKEY = 'DUPLICATE_PUBKEY',\n CACHED_PUBKEY_CONFIRMED = 'CACHED_PUBKEY_CONFIRMED',\n CACHED_PUBKEY_PENDING = 'CACHED_PUBKEY_PENDING',\n PREVIOUSLY_SUBMITTED = 'PREVIOUSLY_SUBMITTED',\n INVALID_BLS_SIGNATURE = 'INVALID_BLS_SIGNATURE',\n MISSING_FIELD = 'MISSING_FIELD',\n INVALID_FORMAT = 'INVALID_FORMAT',\n VALIDATOR_EXISTS = 'VALIDATOR_EXISTS',\n}\n\nexport type ValidationError = {\n index: number;\n field?: string;\n message: string;\n code: ValidationErrorCode;\n};\n\nexport type RemoveKeyResult = {\n success: boolean;\n data?: DepositData[];\n json?: string;\n error?: string;\n};\n\nexport type ParseResult = {\n success: boolean;\n data?: DepositData[];\n error?: string;\n};\n\nexport type ValidationProps = {\n chainId: SUPPORTED_CHAINS;\n withdrawalCredentials: string;\n wcPrefix: string;\n};\n\nexport type ValidationExtendedProps = ValidationProps & {\n currentBlockNumber?: number;\n skipSignature?: boolean;\n};\n\nexport type DuplicateProcessingConfig = {\n pubkey: Hex;\n index: number;\n pubkeyMap: Map<Hex, number[]>;\n errors: ValidationError[];\n};\n"],"mappings":";AAeO,IAAK,sBAAL,kBAAKA,yBAAL;AACLA,sBAAA,oBAAiB;AACjBA,sBAAA,uBAAoB;AACpBA,sBAAA,oCAAiC;AACjCA,sBAAA,yBAAsB;AACtBA,sBAAA,oBAAiB;AACjBA,sBAAA,qBAAkB;AAClBA,sBAAA,0BAAuB;AACvBA,sBAAA,0BAAuB;AACvBA,sBAAA,sBAAmB;AACnBA,sBAAA,6BAA0B;AAC1BA,sBAAA,2BAAwB;AACxBA,sBAAA,0BAAuB;AACvBA,sBAAA,2BAAwB;AACxBA,sBAAA,mBAAgB;AAChBA,sBAAA,oBAAiB;AACjBA,sBAAA,sBAAmB;AAhBT,QAAAA;GAAA,uBAAA,EAAA,CAAA"}
|
|
@@ -122,6 +122,7 @@ const validateDepositData = async (depositData, options) => {
|
|
|
122
122
|
withdrawalCredentials: options.withdrawalCredentials,
|
|
123
123
|
wcPrefix: options.wcPrefix
|
|
124
124
|
});
|
|
125
|
+
if (options.skipSignature) return errors;
|
|
125
126
|
const signatureVerificationPromises = depositData.map((data, index) => {
|
|
126
127
|
if (!data) return Promise.resolve({
|
|
127
128
|
index,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.cjs","names":[],"sources":["../../src/deposit-data-sdk/validator.ts"],"sourcesContent":["import { Hex } from 'viem';\nimport { compareLowercase } from '../common/utils/compare-lowercase';\nimport {\n isHexadecimalString,\n toHexString,\n trimHexPrefix,\n} from '../common/utils/index';\nimport {\n DEPOSIT_ROOT_LENGTH,\n FIXED_AMOUNT,\n FIXED_FORK_VERSION,\n FIXED_NETWORK,\n PUBKEY_LENGTH,\n SIGNATURE_LENGTH,\n WITHDRAWAL_CREDENTIALS_LENGTH,\n} from './constants';\nimport { verifyDepositSignature } from './signature';\nimport {\n DepositData,\n DuplicateProcessingConfig,\n ValidationError,\n ValidationErrorCode,\n ValidationExtendedProps,\n ValidationProps,\n} from './types';\n\nconst validateBasicFields = (\n data: DepositData,\n index: number,\n config: ValidationProps,\n): ValidationError[] => {\n const errors: ValidationError[] = [];\n\n // Validate pubkey\n if (!isHexadecimalString(data.pubkey, PUBKEY_LENGTH)) {\n errors.push({\n index,\n field: 'pubkey',\n message: 'pubkey is not a valid hex string',\n code: ValidationErrorCode.INVALID_PUBKEY,\n });\n }\n\n // Validate signature\n if (!isHexadecimalString(data.signature, SIGNATURE_LENGTH)) {\n errors.push({\n index,\n field: 'signature',\n message: 'signature is not a valid hex string',\n code: ValidationErrorCode.INVALID_SIGNATURE,\n });\n }\n\n // Validate deposit_message_root\n if (!isHexadecimalString(data.deposit_message_root, DEPOSIT_ROOT_LENGTH)) {\n errors.push({\n index,\n field: 'deposit_message_root',\n message: 'deposit_message_root is not a valid hex string',\n code: ValidationErrorCode.INVALID_DEPOSIT_ROOT,\n });\n }\n\n // Validate deposit_data_root\n if (!isHexadecimalString(data.deposit_data_root, DEPOSIT_ROOT_LENGTH)) {\n errors.push({\n index,\n field: 'deposit_data_root',\n message: 'deposit_data_root is not a valid hex string',\n code: ValidationErrorCode.INVALID_DEPOSIT_ROOT,\n });\n }\n\n // Validate withdrawal_credentials\n if (\n !isHexadecimalString(\n data.withdrawal_credentials,\n WITHDRAWAL_CREDENTIALS_LENGTH,\n )\n ) {\n errors.push({\n index,\n field: 'withdrawal_credentials',\n message: 'withdrawal_credentials is not a valid hex string',\n code: ValidationErrorCode.INVALID_WITHDRAWAL_CREDENTIALS,\n });\n } else {\n const wcHex = trimHexPrefix(data.withdrawal_credentials);\n const expectedAddress = trimHexPrefix(config.withdrawalCredentials);\n\n const wcTypeHex = toHexString(config.wcPrefix.replace(/0+$/, ''));\n if (!wcHex.toLowerCase().startsWith(config.wcPrefix.toLowerCase())) {\n errors.push({\n index,\n field: 'withdrawal_credentials',\n message: `wrong key type: only ${wcTypeHex} withdrawal credentials are supported`,\n code: ValidationErrorCode.UNSUPPORTED_WC_TYPE,\n });\n } else if (\n !compareLowercase(wcHex, `${config.wcPrefix}${expectedAddress}`)\n ) {\n errors.push({\n index,\n field: 'withdrawal_credentials',\n message: 'withdrawal_credentials is not the Lido Withdrawal Vault',\n code: ValidationErrorCode.INVALID_WITHDRAWAL_CREDENTIALS,\n });\n }\n }\n\n // Validate amount\n if (data.amount !== FIXED_AMOUNT) {\n errors.push({\n index,\n field: 'amount',\n message: 'amount is not equal to 32 ETH',\n code: ValidationErrorCode.INVALID_AMOUNT,\n });\n }\n\n // Validate network name\n const requiredNetworkName = FIXED_NETWORK[config.chainId];\n const networkName = data.network_name;\n\n if (!(networkName === requiredNetworkName)) {\n errors.push({\n index,\n field: 'network_name',\n message: `network_name is not equal to ${requiredNetworkName}`,\n code: ValidationErrorCode.INVALID_NETWORK,\n });\n }\n\n // Validate fork version\n const forkVersion = FIXED_FORK_VERSION[config.chainId];\n if (\n data.fork_version !== forkVersion &&\n data.fork_version !== toHexString(forkVersion)\n ) {\n errors.push({\n index,\n field: 'fork_version',\n message: `fork_version is not equal to ${forkVersion}`,\n code: ValidationErrorCode.INVALID_FORK_VERSION,\n });\n }\n\n return errors;\n};\n\nconst processDuplicatePubkey = (config: DuplicateProcessingConfig): void => {\n const existingIndices = config.pubkeyMap.get(config.pubkey);\n if (!existingIndices) {\n config.pubkeyMap.set(config.pubkey, [config.index]);\n return;\n }\n\n existingIndices.push(config.index);\n\n existingIndices.forEach((idx) => {\n const hasExistingError = config.errors.some(\n (e) => e.index === idx && e.code === ValidationErrorCode.DUPLICATE_PUBKEY,\n );\n\n if (hasExistingError) {\n return;\n }\n\n config.errors.push({\n index: idx,\n field: 'pubkey',\n message: 'pubkey is duplicated in deposit data',\n code: ValidationErrorCode.DUPLICATE_PUBKEY,\n });\n });\n};\n\nconst performBasicValidation = (\n depositData: DepositData[],\n config: ValidationProps,\n): ValidationError[] => {\n const errors: ValidationError[] = [];\n const pubkeyMap = new Map<Hex, number[]>();\n\n // Single pass: basic validation + duplicate detection\n for (const [i, data] of depositData.entries()) {\n if (!data) {\n errors.push({\n index: i,\n message: 'deposit data item is missing',\n code: ValidationErrorCode.MISSING_FIELD,\n });\n continue;\n }\n\n // Basic field validation\n const basicErrors = validateBasicFields(data, i, config);\n errors.push(...basicErrors);\n\n // Efficient duplicate detection using Map\n const pubkey = data.pubkey?.toLowerCase() as Hex;\n if (pubkey) {\n processDuplicatePubkey({\n pubkey,\n index: i,\n pubkeyMap,\n errors,\n });\n }\n }\n\n return errors;\n};\n\nexport const validateDepositData = async (\n depositData: DepositData[],\n options: ValidationExtendedProps,\n): Promise<ValidationError[]> => {\n const errors = performBasicValidation(depositData, {\n chainId: options.chainId,\n withdrawalCredentials: options.withdrawalCredentials,\n wcPrefix: options.wcPrefix,\n });\n\n // Parallel signature verification for valid items only\n const signatureVerificationPromises = depositData.map((data, index) => {\n if (!data) {\n return Promise.resolve({ index, isValid: false });\n }\n return verifyDepositSignature(data, options.chainId)\n .then((isValid) => ({ index, isValid }))\n .catch(() => ({ index, isValid: false }));\n });\n\n const signatureResults = await Promise.all(signatureVerificationPromises);\n\n // Process signature verification results\n signatureResults.forEach(({ index, isValid }) => {\n if (!isValid) {\n errors.push({\n index,\n field: 'signature',\n message: 'signature failed BLS verification',\n code: ValidationErrorCode.INVALID_BLS_SIGNATURE,\n });\n }\n });\n\n return errors;\n};\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"validator.cjs","names":[],"sources":["../../src/deposit-data-sdk/validator.ts"],"sourcesContent":["import { Hex } from 'viem';\nimport { compareLowercase } from '../common/utils/compare-lowercase';\nimport {\n isHexadecimalString,\n toHexString,\n trimHexPrefix,\n} from '../common/utils/index';\nimport {\n DEPOSIT_ROOT_LENGTH,\n FIXED_AMOUNT,\n FIXED_FORK_VERSION,\n FIXED_NETWORK,\n PUBKEY_LENGTH,\n SIGNATURE_LENGTH,\n WITHDRAWAL_CREDENTIALS_LENGTH,\n} from './constants';\nimport { verifyDepositSignature } from './signature';\nimport {\n DepositData,\n DuplicateProcessingConfig,\n ValidationError,\n ValidationErrorCode,\n ValidationExtendedProps,\n ValidationProps,\n} from './types';\n\nconst validateBasicFields = (\n data: DepositData,\n index: number,\n config: ValidationProps,\n): ValidationError[] => {\n const errors: ValidationError[] = [];\n\n // Validate pubkey\n if (!isHexadecimalString(data.pubkey, PUBKEY_LENGTH)) {\n errors.push({\n index,\n field: 'pubkey',\n message: 'pubkey is not a valid hex string',\n code: ValidationErrorCode.INVALID_PUBKEY,\n });\n }\n\n // Validate signature\n if (!isHexadecimalString(data.signature, SIGNATURE_LENGTH)) {\n errors.push({\n index,\n field: 'signature',\n message: 'signature is not a valid hex string',\n code: ValidationErrorCode.INVALID_SIGNATURE,\n });\n }\n\n // Validate deposit_message_root\n if (!isHexadecimalString(data.deposit_message_root, DEPOSIT_ROOT_LENGTH)) {\n errors.push({\n index,\n field: 'deposit_message_root',\n message: 'deposit_message_root is not a valid hex string',\n code: ValidationErrorCode.INVALID_DEPOSIT_ROOT,\n });\n }\n\n // Validate deposit_data_root\n if (!isHexadecimalString(data.deposit_data_root, DEPOSIT_ROOT_LENGTH)) {\n errors.push({\n index,\n field: 'deposit_data_root',\n message: 'deposit_data_root is not a valid hex string',\n code: ValidationErrorCode.INVALID_DEPOSIT_ROOT,\n });\n }\n\n // Validate withdrawal_credentials\n if (\n !isHexadecimalString(\n data.withdrawal_credentials,\n WITHDRAWAL_CREDENTIALS_LENGTH,\n )\n ) {\n errors.push({\n index,\n field: 'withdrawal_credentials',\n message: 'withdrawal_credentials is not a valid hex string',\n code: ValidationErrorCode.INVALID_WITHDRAWAL_CREDENTIALS,\n });\n } else {\n const wcHex = trimHexPrefix(data.withdrawal_credentials);\n const expectedAddress = trimHexPrefix(config.withdrawalCredentials);\n\n const wcTypeHex = toHexString(config.wcPrefix.replace(/0+$/, ''));\n if (!wcHex.toLowerCase().startsWith(config.wcPrefix.toLowerCase())) {\n errors.push({\n index,\n field: 'withdrawal_credentials',\n message: `wrong key type: only ${wcTypeHex} withdrawal credentials are supported`,\n code: ValidationErrorCode.UNSUPPORTED_WC_TYPE,\n });\n } else if (\n !compareLowercase(wcHex, `${config.wcPrefix}${expectedAddress}`)\n ) {\n errors.push({\n index,\n field: 'withdrawal_credentials',\n message: 'withdrawal_credentials is not the Lido Withdrawal Vault',\n code: ValidationErrorCode.INVALID_WITHDRAWAL_CREDENTIALS,\n });\n }\n }\n\n // Validate amount\n if (data.amount !== FIXED_AMOUNT) {\n errors.push({\n index,\n field: 'amount',\n message: 'amount is not equal to 32 ETH',\n code: ValidationErrorCode.INVALID_AMOUNT,\n });\n }\n\n // Validate network name\n const requiredNetworkName = FIXED_NETWORK[config.chainId];\n const networkName = data.network_name;\n\n if (!(networkName === requiredNetworkName)) {\n errors.push({\n index,\n field: 'network_name',\n message: `network_name is not equal to ${requiredNetworkName}`,\n code: ValidationErrorCode.INVALID_NETWORK,\n });\n }\n\n // Validate fork version\n const forkVersion = FIXED_FORK_VERSION[config.chainId];\n if (\n data.fork_version !== forkVersion &&\n data.fork_version !== toHexString(forkVersion)\n ) {\n errors.push({\n index,\n field: 'fork_version',\n message: `fork_version is not equal to ${forkVersion}`,\n code: ValidationErrorCode.INVALID_FORK_VERSION,\n });\n }\n\n return errors;\n};\n\nconst processDuplicatePubkey = (config: DuplicateProcessingConfig): void => {\n const existingIndices = config.pubkeyMap.get(config.pubkey);\n if (!existingIndices) {\n config.pubkeyMap.set(config.pubkey, [config.index]);\n return;\n }\n\n existingIndices.push(config.index);\n\n existingIndices.forEach((idx) => {\n const hasExistingError = config.errors.some(\n (e) => e.index === idx && e.code === ValidationErrorCode.DUPLICATE_PUBKEY,\n );\n\n if (hasExistingError) {\n return;\n }\n\n config.errors.push({\n index: idx,\n field: 'pubkey',\n message: 'pubkey is duplicated in deposit data',\n code: ValidationErrorCode.DUPLICATE_PUBKEY,\n });\n });\n};\n\nconst performBasicValidation = (\n depositData: DepositData[],\n config: ValidationProps,\n): ValidationError[] => {\n const errors: ValidationError[] = [];\n const pubkeyMap = new Map<Hex, number[]>();\n\n // Single pass: basic validation + duplicate detection\n for (const [i, data] of depositData.entries()) {\n if (!data) {\n errors.push({\n index: i,\n message: 'deposit data item is missing',\n code: ValidationErrorCode.MISSING_FIELD,\n });\n continue;\n }\n\n // Basic field validation\n const basicErrors = validateBasicFields(data, i, config);\n errors.push(...basicErrors);\n\n // Efficient duplicate detection using Map\n const pubkey = data.pubkey?.toLowerCase() as Hex;\n if (pubkey) {\n processDuplicatePubkey({\n pubkey,\n index: i,\n pubkeyMap,\n errors,\n });\n }\n }\n\n return errors;\n};\n\nexport const validateDepositData = async (\n depositData: DepositData[],\n options: ValidationExtendedProps,\n): Promise<ValidationError[]> => {\n const errors = performBasicValidation(depositData, {\n chainId: options.chainId,\n withdrawalCredentials: options.withdrawalCredentials,\n wcPrefix: options.wcPrefix,\n });\n\n if (options.skipSignature) {\n return errors;\n }\n\n // Parallel signature verification for valid items only\n const signatureVerificationPromises = depositData.map((data, index) => {\n if (!data) {\n return Promise.resolve({ index, isValid: false });\n }\n return verifyDepositSignature(data, options.chainId)\n .then((isValid) => ({ index, isValid }))\n .catch(() => ({ index, isValid: false }));\n });\n\n const signatureResults = await Promise.all(signatureVerificationPromises);\n\n // Process signature verification results\n signatureResults.forEach(({ index, isValid }) => {\n if (!isValid) {\n errors.push({\n index,\n field: 'signature',\n message: 'signature failed BLS verification',\n code: ValidationErrorCode.INVALID_BLS_SIGNATURE,\n });\n }\n });\n\n return errors;\n};\n"],"mappings":"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"}
|
|
@@ -122,6 +122,7 @@ const validateDepositData = async (depositData, options) => {
|
|
|
122
122
|
withdrawalCredentials: options.withdrawalCredentials,
|
|
123
123
|
wcPrefix: options.wcPrefix
|
|
124
124
|
});
|
|
125
|
+
if (options.skipSignature) return errors;
|
|
125
126
|
const signatureVerificationPromises = depositData.map((data, index) => {
|
|
126
127
|
if (!data) return Promise.resolve({
|
|
127
128
|
index,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validator.mjs","names":[],"sources":["../../src/deposit-data-sdk/validator.ts"],"sourcesContent":["import { Hex } from 'viem';\nimport { compareLowercase } from '../common/utils/compare-lowercase';\nimport {\n isHexadecimalString,\n toHexString,\n trimHexPrefix,\n} from '../common/utils/index';\nimport {\n DEPOSIT_ROOT_LENGTH,\n FIXED_AMOUNT,\n FIXED_FORK_VERSION,\n FIXED_NETWORK,\n PUBKEY_LENGTH,\n SIGNATURE_LENGTH,\n WITHDRAWAL_CREDENTIALS_LENGTH,\n} from './constants';\nimport { verifyDepositSignature } from './signature';\nimport {\n DepositData,\n DuplicateProcessingConfig,\n ValidationError,\n ValidationErrorCode,\n ValidationExtendedProps,\n ValidationProps,\n} from './types';\n\nconst validateBasicFields = (\n data: DepositData,\n index: number,\n config: ValidationProps,\n): ValidationError[] => {\n const errors: ValidationError[] = [];\n\n // Validate pubkey\n if (!isHexadecimalString(data.pubkey, PUBKEY_LENGTH)) {\n errors.push({\n index,\n field: 'pubkey',\n message: 'pubkey is not a valid hex string',\n code: ValidationErrorCode.INVALID_PUBKEY,\n });\n }\n\n // Validate signature\n if (!isHexadecimalString(data.signature, SIGNATURE_LENGTH)) {\n errors.push({\n index,\n field: 'signature',\n message: 'signature is not a valid hex string',\n code: ValidationErrorCode.INVALID_SIGNATURE,\n });\n }\n\n // Validate deposit_message_root\n if (!isHexadecimalString(data.deposit_message_root, DEPOSIT_ROOT_LENGTH)) {\n errors.push({\n index,\n field: 'deposit_message_root',\n message: 'deposit_message_root is not a valid hex string',\n code: ValidationErrorCode.INVALID_DEPOSIT_ROOT,\n });\n }\n\n // Validate deposit_data_root\n if (!isHexadecimalString(data.deposit_data_root, DEPOSIT_ROOT_LENGTH)) {\n errors.push({\n index,\n field: 'deposit_data_root',\n message: 'deposit_data_root is not a valid hex string',\n code: ValidationErrorCode.INVALID_DEPOSIT_ROOT,\n });\n }\n\n // Validate withdrawal_credentials\n if (\n !isHexadecimalString(\n data.withdrawal_credentials,\n WITHDRAWAL_CREDENTIALS_LENGTH,\n )\n ) {\n errors.push({\n index,\n field: 'withdrawal_credentials',\n message: 'withdrawal_credentials is not a valid hex string',\n code: ValidationErrorCode.INVALID_WITHDRAWAL_CREDENTIALS,\n });\n } else {\n const wcHex = trimHexPrefix(data.withdrawal_credentials);\n const expectedAddress = trimHexPrefix(config.withdrawalCredentials);\n\n const wcTypeHex = toHexString(config.wcPrefix.replace(/0+$/, ''));\n if (!wcHex.toLowerCase().startsWith(config.wcPrefix.toLowerCase())) {\n errors.push({\n index,\n field: 'withdrawal_credentials',\n message: `wrong key type: only ${wcTypeHex} withdrawal credentials are supported`,\n code: ValidationErrorCode.UNSUPPORTED_WC_TYPE,\n });\n } else if (\n !compareLowercase(wcHex, `${config.wcPrefix}${expectedAddress}`)\n ) {\n errors.push({\n index,\n field: 'withdrawal_credentials',\n message: 'withdrawal_credentials is not the Lido Withdrawal Vault',\n code: ValidationErrorCode.INVALID_WITHDRAWAL_CREDENTIALS,\n });\n }\n }\n\n // Validate amount\n if (data.amount !== FIXED_AMOUNT) {\n errors.push({\n index,\n field: 'amount',\n message: 'amount is not equal to 32 ETH',\n code: ValidationErrorCode.INVALID_AMOUNT,\n });\n }\n\n // Validate network name\n const requiredNetworkName = FIXED_NETWORK[config.chainId];\n const networkName = data.network_name;\n\n if (!(networkName === requiredNetworkName)) {\n errors.push({\n index,\n field: 'network_name',\n message: `network_name is not equal to ${requiredNetworkName}`,\n code: ValidationErrorCode.INVALID_NETWORK,\n });\n }\n\n // Validate fork version\n const forkVersion = FIXED_FORK_VERSION[config.chainId];\n if (\n data.fork_version !== forkVersion &&\n data.fork_version !== toHexString(forkVersion)\n ) {\n errors.push({\n index,\n field: 'fork_version',\n message: `fork_version is not equal to ${forkVersion}`,\n code: ValidationErrorCode.INVALID_FORK_VERSION,\n });\n }\n\n return errors;\n};\n\nconst processDuplicatePubkey = (config: DuplicateProcessingConfig): void => {\n const existingIndices = config.pubkeyMap.get(config.pubkey);\n if (!existingIndices) {\n config.pubkeyMap.set(config.pubkey, [config.index]);\n return;\n }\n\n existingIndices.push(config.index);\n\n existingIndices.forEach((idx) => {\n const hasExistingError = config.errors.some(\n (e) => e.index === idx && e.code === ValidationErrorCode.DUPLICATE_PUBKEY,\n );\n\n if (hasExistingError) {\n return;\n }\n\n config.errors.push({\n index: idx,\n field: 'pubkey',\n message: 'pubkey is duplicated in deposit data',\n code: ValidationErrorCode.DUPLICATE_PUBKEY,\n });\n });\n};\n\nconst performBasicValidation = (\n depositData: DepositData[],\n config: ValidationProps,\n): ValidationError[] => {\n const errors: ValidationError[] = [];\n const pubkeyMap = new Map<Hex, number[]>();\n\n // Single pass: basic validation + duplicate detection\n for (const [i, data] of depositData.entries()) {\n if (!data) {\n errors.push({\n index: i,\n message: 'deposit data item is missing',\n code: ValidationErrorCode.MISSING_FIELD,\n });\n continue;\n }\n\n // Basic field validation\n const basicErrors = validateBasicFields(data, i, config);\n errors.push(...basicErrors);\n\n // Efficient duplicate detection using Map\n const pubkey = data.pubkey?.toLowerCase() as Hex;\n if (pubkey) {\n processDuplicatePubkey({\n pubkey,\n index: i,\n pubkeyMap,\n errors,\n });\n }\n }\n\n return errors;\n};\n\nexport const validateDepositData = async (\n depositData: DepositData[],\n options: ValidationExtendedProps,\n): Promise<ValidationError[]> => {\n const errors = performBasicValidation(depositData, {\n chainId: options.chainId,\n withdrawalCredentials: options.withdrawalCredentials,\n wcPrefix: options.wcPrefix,\n });\n\n // Parallel signature verification for valid items only\n const signatureVerificationPromises = depositData.map((data, index) => {\n if (!data) {\n return Promise.resolve({ index, isValid: false });\n }\n return verifyDepositSignature(data, options.chainId)\n .then((isValid) => ({ index, isValid }))\n .catch(() => ({ index, isValid: false }));\n });\n\n const signatureResults = await Promise.all(signatureVerificationPromises);\n\n // Process signature verification results\n signatureResults.forEach(({ index, isValid }) => {\n if (!isValid) {\n errors.push({\n index,\n field: 'signature',\n message: 'signature failed BLS verification',\n code: ValidationErrorCode.INVALID_BLS_SIGNATURE,\n });\n }\n });\n\n return errors;\n};\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"validator.mjs","names":[],"sources":["../../src/deposit-data-sdk/validator.ts"],"sourcesContent":["import { Hex } from 'viem';\nimport { compareLowercase } from '../common/utils/compare-lowercase';\nimport {\n isHexadecimalString,\n toHexString,\n trimHexPrefix,\n} from '../common/utils/index';\nimport {\n DEPOSIT_ROOT_LENGTH,\n FIXED_AMOUNT,\n FIXED_FORK_VERSION,\n FIXED_NETWORK,\n PUBKEY_LENGTH,\n SIGNATURE_LENGTH,\n WITHDRAWAL_CREDENTIALS_LENGTH,\n} from './constants';\nimport { verifyDepositSignature } from './signature';\nimport {\n DepositData,\n DuplicateProcessingConfig,\n ValidationError,\n ValidationErrorCode,\n ValidationExtendedProps,\n ValidationProps,\n} from './types';\n\nconst validateBasicFields = (\n data: DepositData,\n index: number,\n config: ValidationProps,\n): ValidationError[] => {\n const errors: ValidationError[] = [];\n\n // Validate pubkey\n if (!isHexadecimalString(data.pubkey, PUBKEY_LENGTH)) {\n errors.push({\n index,\n field: 'pubkey',\n message: 'pubkey is not a valid hex string',\n code: ValidationErrorCode.INVALID_PUBKEY,\n });\n }\n\n // Validate signature\n if (!isHexadecimalString(data.signature, SIGNATURE_LENGTH)) {\n errors.push({\n index,\n field: 'signature',\n message: 'signature is not a valid hex string',\n code: ValidationErrorCode.INVALID_SIGNATURE,\n });\n }\n\n // Validate deposit_message_root\n if (!isHexadecimalString(data.deposit_message_root, DEPOSIT_ROOT_LENGTH)) {\n errors.push({\n index,\n field: 'deposit_message_root',\n message: 'deposit_message_root is not a valid hex string',\n code: ValidationErrorCode.INVALID_DEPOSIT_ROOT,\n });\n }\n\n // Validate deposit_data_root\n if (!isHexadecimalString(data.deposit_data_root, DEPOSIT_ROOT_LENGTH)) {\n errors.push({\n index,\n field: 'deposit_data_root',\n message: 'deposit_data_root is not a valid hex string',\n code: ValidationErrorCode.INVALID_DEPOSIT_ROOT,\n });\n }\n\n // Validate withdrawal_credentials\n if (\n !isHexadecimalString(\n data.withdrawal_credentials,\n WITHDRAWAL_CREDENTIALS_LENGTH,\n )\n ) {\n errors.push({\n index,\n field: 'withdrawal_credentials',\n message: 'withdrawal_credentials is not a valid hex string',\n code: ValidationErrorCode.INVALID_WITHDRAWAL_CREDENTIALS,\n });\n } else {\n const wcHex = trimHexPrefix(data.withdrawal_credentials);\n const expectedAddress = trimHexPrefix(config.withdrawalCredentials);\n\n const wcTypeHex = toHexString(config.wcPrefix.replace(/0+$/, ''));\n if (!wcHex.toLowerCase().startsWith(config.wcPrefix.toLowerCase())) {\n errors.push({\n index,\n field: 'withdrawal_credentials',\n message: `wrong key type: only ${wcTypeHex} withdrawal credentials are supported`,\n code: ValidationErrorCode.UNSUPPORTED_WC_TYPE,\n });\n } else if (\n !compareLowercase(wcHex, `${config.wcPrefix}${expectedAddress}`)\n ) {\n errors.push({\n index,\n field: 'withdrawal_credentials',\n message: 'withdrawal_credentials is not the Lido Withdrawal Vault',\n code: ValidationErrorCode.INVALID_WITHDRAWAL_CREDENTIALS,\n });\n }\n }\n\n // Validate amount\n if (data.amount !== FIXED_AMOUNT) {\n errors.push({\n index,\n field: 'amount',\n message: 'amount is not equal to 32 ETH',\n code: ValidationErrorCode.INVALID_AMOUNT,\n });\n }\n\n // Validate network name\n const requiredNetworkName = FIXED_NETWORK[config.chainId];\n const networkName = data.network_name;\n\n if (!(networkName === requiredNetworkName)) {\n errors.push({\n index,\n field: 'network_name',\n message: `network_name is not equal to ${requiredNetworkName}`,\n code: ValidationErrorCode.INVALID_NETWORK,\n });\n }\n\n // Validate fork version\n const forkVersion = FIXED_FORK_VERSION[config.chainId];\n if (\n data.fork_version !== forkVersion &&\n data.fork_version !== toHexString(forkVersion)\n ) {\n errors.push({\n index,\n field: 'fork_version',\n message: `fork_version is not equal to ${forkVersion}`,\n code: ValidationErrorCode.INVALID_FORK_VERSION,\n });\n }\n\n return errors;\n};\n\nconst processDuplicatePubkey = (config: DuplicateProcessingConfig): void => {\n const existingIndices = config.pubkeyMap.get(config.pubkey);\n if (!existingIndices) {\n config.pubkeyMap.set(config.pubkey, [config.index]);\n return;\n }\n\n existingIndices.push(config.index);\n\n existingIndices.forEach((idx) => {\n const hasExistingError = config.errors.some(\n (e) => e.index === idx && e.code === ValidationErrorCode.DUPLICATE_PUBKEY,\n );\n\n if (hasExistingError) {\n return;\n }\n\n config.errors.push({\n index: idx,\n field: 'pubkey',\n message: 'pubkey is duplicated in deposit data',\n code: ValidationErrorCode.DUPLICATE_PUBKEY,\n });\n });\n};\n\nconst performBasicValidation = (\n depositData: DepositData[],\n config: ValidationProps,\n): ValidationError[] => {\n const errors: ValidationError[] = [];\n const pubkeyMap = new Map<Hex, number[]>();\n\n // Single pass: basic validation + duplicate detection\n for (const [i, data] of depositData.entries()) {\n if (!data) {\n errors.push({\n index: i,\n message: 'deposit data item is missing',\n code: ValidationErrorCode.MISSING_FIELD,\n });\n continue;\n }\n\n // Basic field validation\n const basicErrors = validateBasicFields(data, i, config);\n errors.push(...basicErrors);\n\n // Efficient duplicate detection using Map\n const pubkey = data.pubkey?.toLowerCase() as Hex;\n if (pubkey) {\n processDuplicatePubkey({\n pubkey,\n index: i,\n pubkeyMap,\n errors,\n });\n }\n }\n\n return errors;\n};\n\nexport const validateDepositData = async (\n depositData: DepositData[],\n options: ValidationExtendedProps,\n): Promise<ValidationError[]> => {\n const errors = performBasicValidation(depositData, {\n chainId: options.chainId,\n withdrawalCredentials: options.withdrawalCredentials,\n wcPrefix: options.wcPrefix,\n });\n\n if (options.skipSignature) {\n return errors;\n }\n\n // Parallel signature verification for valid items only\n const signatureVerificationPromises = depositData.map((data, index) => {\n if (!data) {\n return Promise.resolve({ index, isValid: false });\n }\n return verifyDepositSignature(data, options.chainId)\n .then((isValid) => ({ index, isValid }))\n .catch(() => ({ index, isValid: false }));\n });\n\n const signatureResults = await Promise.all(signatureVerificationPromises);\n\n // Process signature verification results\n signatureResults.forEach(({ index, isValid }) => {\n if (!isValid) {\n errors.push({\n index,\n field: 'signature',\n message: 'signature failed BLS verification',\n code: ValidationErrorCode.INVALID_BLS_SIGNATURE,\n });\n }\n });\n\n return errors;\n};\n"],"mappings":"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"}
|