diff --git a/src/@types/C2D/C2D.ts b/src/@types/C2D/C2D.ts index 503813268..5b52751fd 100644 --- a/src/@types/C2D/C2D.ts +++ b/src/@types/C2D/C2D.ts @@ -82,7 +82,7 @@ export interface RunningPlatform { export interface ComputeAccessList { addresses: string[] - accessLists: { [chainId: string]: string[] } + accessLists: { [chainId: string]: string[] }[] | null } export interface ComputeEnvironmentFreeOptions { diff --git a/src/components/core/compute/startCompute.ts b/src/components/core/compute/startCompute.ts index 9d00b28d6..34b7de766 100644 --- a/src/components/core/compute/startCompute.ts +++ b/src/components/core/compute/startCompute.ts @@ -982,7 +982,7 @@ async function validateAccess( if ( !access.accessLists || - (Object.keys(access.accessLists).length === 0 && access.addresses.length === 0) + (access.accessLists.length === 0 && access.addresses.length === 0) ) { return true } @@ -993,33 +993,36 @@ async function validateAccess( const config = await getConfiguration() const { supportedNetworks } = config - for (const chain of Object.keys(access.accessLists)) { - const { chainId } = supportedNetworks[chain] - try { - const blockchain = oceanNode.getBlockchain(chainId) - if (!blockchain) { + for (const accessListMap of access.accessLists) { + if (!accessListMap) continue + for (const chain of Object.keys(accessListMap)) { + const { chainId } = supportedNetworks[chain] + try { + const blockchain = oceanNode.getBlockchain(chainId) + if (!blockchain) { + CORE_LOGGER.logMessage( + `Blockchain instance not available for chain ${chainId}, skipping access list check`, + true + ) + continue + } + const signer = await blockchain.getSigner() + for (const accessListAddress of accessListMap[chain]) { + const hasAccess = await checkAddressOnAccessList( + accessListAddress, + consumerAddress, + signer + ) + if (hasAccess) { + return true + } + } + } catch (error) { CORE_LOGGER.logMessage( - `Blockchain instance not available for chain ${chainId}, skipping access list check`, + `Failed to check access lists on chain ${chain}: ${error.message}`, true ) - continue - } - const signer = await blockchain.getSigner() - for (const accessListAddress of access.accessLists[chain]) { - const hasAccess = await checkAddressOnAccessList( - accessListAddress, - consumerAddress, - signer - ) - if (hasAccess) { - return true - } } - } catch (error) { - CORE_LOGGER.logMessage( - `Failed to check access lists on chain ${chain}: ${error.message}`, - true - ) } } diff --git a/src/test/integration/compute.test.ts b/src/test/integration/compute.test.ts index 1414d1770..17eb1a989 100644 --- a/src/test/integration/compute.test.ts +++ b/src/test/integration/compute.test.ts @@ -2280,9 +2280,7 @@ describe('Compute Access Restrictions', () => { minJobDuration: 60, access: { addresses: [], - accessLists: { - [DEVELOPMENT_CHAIN_ID]: [accessListAddress] - } + accessLists: [{ [DEVELOPMENT_CHAIN_ID]: [accessListAddress] }] }, fees: { [DEVELOPMENT_CHAIN_ID]: [ @@ -2298,9 +2296,7 @@ describe('Compute Access Restrictions', () => { maxJobs: 3, access: { addresses: [], - accessLists: { - DEVELOPMENT_CHAIN_ID: [accessListAddress] - } + accessLists: [{ [DEVELOPMENT_CHAIN_ID]: [accessListAddress] }] }, resources: [ { id: 'cpu', max: 1 }, @@ -2357,7 +2353,9 @@ describe('Compute Access Restrictions', () => { firstEnv = computeEnvironments[0] assert(firstEnv.access, 'Access control should exist') assert( - firstEnv.access.accessLists[DEVELOPMENT_CHAIN_ID].includes(accessListAddress), + firstEnv.access.accessLists?.some((map) => + map?.[DEVELOPMENT_CHAIN_ID]?.includes(accessListAddress) + ), 'Should have access list address' ) }) diff --git a/src/utils/config/schemas.ts b/src/utils/config/schemas.ts index 36ef1526a..15671d9c7 100644 --- a/src/utils/config/schemas.ts +++ b/src/utils/config/schemas.ts @@ -138,7 +138,10 @@ export const ComputeEnvironmentFreeOptionsSchema = z.object({ access: z .object({ addresses: z.array(z.string()), - accessLists: z.array(z.string()) + accessLists: z + .array(z.record(z.string(), z.array(z.string()))) + .nullable() + .optional() }) .optional() }) @@ -160,7 +163,10 @@ export const C2DDockerConfigSchema = z.array( access: z .object({ addresses: z.array(z.string()), - accessLists: z.array(z.string()) + accessLists: z + .array(z.record(z.string(), z.array(z.string()))) + .nullable() + .optional() }) .optional(), fees: z.record(z.string(), z.array(ComputeEnvFeesSchema)).optional(),