Skip to content

Commit

Permalink
format
Browse files Browse the repository at this point in the history
  • Loading branch information
HananINouman committed Feb 4, 2025
1 parent 49cef65 commit 8c706e1
Show file tree
Hide file tree
Showing 8 changed files with 185 additions and 165 deletions.
3 changes: 1 addition & 2 deletions src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import {
import * as dotenv from 'dotenv';
dotenv.config();


export const CONFLICT_ERROR_MSG = 'Conflict';

export const EIP712_DOMAIN_NAME = 'Obol';
Expand Down Expand Up @@ -205,4 +204,4 @@ export const PROVIDER_MAP: Record<number, string> = {
17000: `${process.env.RPC_HOLESKY}`, // Holesky
11155111: `${process.env.RPC_SEPOLIA}`, // Sepolia
100: `${process.env.RPC_GNOSIS}`, // Gnosis
};
};
1 change: 0 additions & 1 deletion src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ export * from './types.js';
export * from './services.js';
export * from './verification/signature-validator.js';


/**
* Obol sdk Client can be used for creating, managing and activating distributed validators.
*/
Expand Down
2 changes: 0 additions & 2 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,5 +83,3 @@ export const getProvider = (chainId: number): ethers.Provider => {
}
return new ethers.JsonRpcProvider(rpcUrl);
};


39 changes: 24 additions & 15 deletions src/verification/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -146,8 +146,12 @@ const validatePOSTConfigHashSigner = async (
chainId,
);

return await validateAddressSignature({ address, token: signature, data, chainId })

return await validateAddressSignature({
address,
token: signature,
data,
chainId,
});
} catch (err) {
throw err;
}
Expand All @@ -164,8 +168,12 @@ const validatePUTConfigHashSigner = async (
{ operator_config_hash: configHash },
chainId,
);
return await validateAddressSignature({ address, token: signature, data, chainId })

return await validateAddressSignature({
address,
token: signature,
data,
chainId,
});
} catch (err) {
throw err;
}
Expand All @@ -178,10 +186,14 @@ const validateEnrSigner = async (
chainId: number,
): Promise<boolean> => {
try {

const data = signEnrPayload({ enr: payload }, chainId);

return await validateAddressSignature({ address, token: signature, data, chainId })
return await validateAddressSignature({
address,
token: signature,
data,
chainId,
});
} catch (err) {
throw err;
}
Expand All @@ -207,13 +219,13 @@ const verifyDefinitionSignatures = async (
if (definitionType === DefinitionFlow.Solo) {
return true;
}
return clusterDefinition.operators.every(async (operator) => {
return clusterDefinition.operators.every(async operator => {
const isPUTConfigHashSignerValid = await validatePUTConfigHashSigner(
operator.address,
operator.config_signature as string,
clusterDefinition.config_hash,
FORK_MAPPING[
clusterDefinition.fork_version as keyof typeof FORK_MAPPING
clusterDefinition.fork_version as keyof typeof FORK_MAPPING
],
);

Expand All @@ -222,14 +234,11 @@ const verifyDefinitionSignatures = async (
operator.enr_signature as string,
operator.enr as string,
FORK_MAPPING[
clusterDefinition.fork_version as keyof typeof FORK_MAPPING
clusterDefinition.fork_version as keyof typeof FORK_MAPPING
],
);

if (
!isPUTConfigHashSignerValid ||
!isENRSignerValid
) {
if (!isPUTConfigHashSignerValid || !isENRSignerValid) {
return false;
}
return true;
Expand Down Expand Up @@ -323,8 +332,8 @@ export const verifyDepositData = (
const eth1AddressWithdrawalPrefix = '0x01';
if (
eth1AddressWithdrawalPrefix +
'0'.repeat(22) +
withdrawalAddress.toLowerCase().slice(2) !==
'0'.repeat(22) +
withdrawalAddress.toLowerCase().slice(2) !==
depositData.withdrawal_credentials
) {
return { isValidDepositData: false, depositDataMsg: new Uint8Array(0) };
Expand Down
140 changes: 69 additions & 71 deletions src/verification/signature-validator.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { ethers } from 'ethers';
import {
SignTypedDataVersion,
TypedDataUtils,
TypedMessage,
SignTypedDataVersion,
TypedDataUtils,
TypedMessage,
} from '@metamask/eth-sig-util';
import Safe from '@safe-global/protocol-kit';
import { PROVIDER_MAP } from '../constants';
Expand All @@ -11,87 +11,85 @@ import { EIP712TypedData } from '@safe-global/safe-core-sdk-types';
import { isContractAvailable, getProvider } from '../utils';

export const validateAddressSignature = async ({
address,
token,
data,
chainId,
address,
token,
data,
chainId,
}: {
address: string;
token: string;
data: TypedMessage<any>;
chainId: number;
address: string;
token: string;
data: TypedMessage<any>;
chainId: number;
}): Promise<boolean> => {
try {
const provider = getProvider(chainId);
if (provider) {
const contractAddress = await isContractAvailable(address, provider);
if (contractAddress) {
return await validateSmartContractSignature({
token,
data: data as unknown as EIP712TypedData,
address,
chainId,
});
}
}
return validateEOASignature({ token, data, address });
} catch (error) {
return validateEOASignature({ token, data, address });
try {
const provider = getProvider(chainId);
if (provider) {
const contractAddress = await isContractAvailable(address, provider);
if (contractAddress) {
return await validateSmartContractSignature({
token,
data: data as unknown as EIP712TypedData,
address,
chainId,
});
}
}


return validateEOASignature({ token, data, address });
} catch (error) {
return validateEOASignature({ token, data, address });
}
};

export const validateEOASignature = ({
token,
data,
address,
token,
data,
address,
}: {
token: string;
data: TypedMessage<any>;
address: string;
token: string;
data: TypedMessage<any>;
address: string;
}): boolean => {
try {
const sig = ethers.Signature.from(token);
const digest = TypedDataUtils.eip712Hash(data, SignTypedDataVersion.V4);
try {
const sig = ethers.Signature.from(token);
const digest = TypedDataUtils.eip712Hash(data, SignTypedDataVersion.V4);

return (
ethers.recoverAddress(digest, sig).toLowerCase() ===
address.toLocaleLowerCase()
);
} catch (err) {
console.error(`validate EOA Signature error: ${err}`);
throw err;
}
return (
ethers.recoverAddress(digest, sig).toLowerCase() ===
address.toLocaleLowerCase()
);
} catch (err) {
console.error(`validate EOA Signature error: ${err}`);
throw err;
}
};

export const validateSmartContractSignature = async ({
token,
data,
address,
chainId,
token,
data,
address,
chainId,
}: {
token: string;
data: EIP712TypedData;
address: string;
chainId: number;
token: string;
data: EIP712TypedData;
address: string;
chainId: number;
}): Promise<boolean> => {
try {
const provider = PROVIDER_MAP[chainId];
const protocolKit = await Safe.init({
provider,
safeAddress: address,
});
const messageHash = hashTypedData(data);
const isValidSignature = await protocolKit.isValidSignature(
messageHash,
token,
);
try {
const provider = PROVIDER_MAP[chainId];
const protocolKit = await Safe.init({
provider,
safeAddress: address,
});
const messageHash = hashTypedData(data);
const isValidSignature = await protocolKit.isValidSignature(
messageHash,
token,
);

return isValidSignature;
} catch (err: any) {
throw new Error(
`Error validating smart contract signature: ${err.message}`,
);
}
return isValidSignature;
} catch (err: any) {
throw new Error(
`Error validating smart contract signature: ${err.message}`,
);
}
};
Loading

0 comments on commit 8c706e1

Please sign in to comment.