From b5a2a642712b597c10840ae80e5af8c3c94f20e9 Mon Sep 17 00:00:00 2001 From: paulo-ocean Date: Thu, 12 Sep 2024 18:59:06 +0100 Subject: [PATCH] added changes for access lists --- src/@types/Datatoken.ts | 3 +++ src/config/Config.ts | 1 + src/config/ConfigHelper.ts | 17 ++++++++----- src/contracts/NFTFactory.ts | 6 ++++- src/utils/Assets.ts | 49 ++++++++++++++++++++++++++++++++++++- 5 files changed, 68 insertions(+), 8 deletions(-) diff --git a/src/@types/Datatoken.ts b/src/@types/Datatoken.ts index de2a199f..16c09f7c 100644 --- a/src/@types/Datatoken.ts +++ b/src/@types/Datatoken.ts @@ -11,6 +11,9 @@ export interface DatatokenCreateParams { name?: string symbol?: string filesObject?: any // file object for template 4 + accessListFactory?: string // access list factory address + allowAccessList?: string // Allow List Contract (if any) + denyAccessList?: string // Deny List Contract (if any) } export interface ConsumeMarketFee { diff --git a/src/config/Config.ts b/src/config/Config.ts index 904c6cb9..8a33bc79 100644 --- a/src/config/Config.ts +++ b/src/config/Config.ts @@ -182,4 +182,5 @@ export class Config { // is confidential evm confidentialEVM?: boolean + accessListFactory?: string } diff --git a/src/config/ConfigHelper.ts b/src/config/ConfigHelper.ts index 55f5eb7a..9598a0fe 100644 --- a/src/config/ConfigHelper.ts +++ b/src/config/ConfigHelper.ts @@ -154,8 +154,7 @@ export const configHelperNetworks: Config[] = [ nodeUri: 'https://sapphire.oasis.io', subgraphUri: 'https://v4.subgraph.sapphire-mainnet.oceanprotocol.com/', explorerUri: 'https://explorer.oasis.io/mainnet/sapphire/', - gasFeeMultiplier: 1, - confidentialEVM: true + gasFeeMultiplier: 1 }, { ...configHelperNetworksBase, @@ -165,8 +164,7 @@ export const configHelperNetworks: Config[] = [ subgraphUri: 'https://v4.subgraph.sapphire-testnet.oceanprotocol.com/subgraphs/name/oceanprotocol/ocean-subgraph', explorerUri: 'https://explorer.oasis.io/testnet/sapphire/', - gasFeeMultiplier: 1, - confidentialEVM: true + gasFeeMultiplier: 1 }, { ...configHelperNetworksBase, @@ -207,7 +205,8 @@ export class ConfigHelper { veDelegationProxy, DFRewards, DFStrategyV1, - veFeeEstimate + veFeeEstimate, + AccessListFactory } = customAddresses[network] configAddresses = { nftFactoryAddress: ERC721Factory, @@ -225,6 +224,7 @@ export class ConfigHelper { DFRewards, DFStrategyV1, veFeeEstimate, + accessListFactory: AccessListFactory, ...(process.env.AQUARIUS_URL && { metadataCacheUri: process.env.AQUARIUS_URL }), ...(process.env.PROVIDER_URL && { providerUri: process.env.PROVIDER_URL }) } @@ -246,7 +246,8 @@ export class ConfigHelper { veDelegationProxy, DFRewards, DFStrategyV1, - veFeeEstimate + veFeeEstimate, + AccessListFactory } = DefaultContractsAddresses[network] configAddresses = { nftFactoryAddress: ERC721Factory, @@ -264,6 +265,7 @@ export class ConfigHelper { DFRewards, DFStrategyV1, veFeeEstimate, + accessListFactory: AccessListFactory, ...(process.env.AQUARIUS_URL && { metadataCacheUri: process.env.AQUARIUS_URL }), ...(process.env.PROVIDER_URL && { providerUri: process.env.PROVIDER_URL }) } @@ -313,6 +315,9 @@ export class ConfigHelper { filterBy === 'chainId' ? KNOWN_CONFIDENTIAL_EVMS.includes(Number(network)) : network.toString().includes('oasis_sap') + if (config.confidentialEVM) { + config.accessListFactory = contractAddressesConfig.accessListFactory + } config = { ...config, ...contractAddressesConfig } diff --git a/src/contracts/NFTFactory.ts b/src/contracts/NFTFactory.ts index 3cd16f2f..731f4008 100644 --- a/src/contracts/NFTFactory.ts +++ b/src/contracts/NFTFactory.ts @@ -577,7 +577,11 @@ export class NftFactory extends SmartContractWithAddress { dtParams.minter, dtParams.paymentCollector, dtParams.mpFeeAddress, - dtParams.feeToken + dtParams.feeToken, + // template 4 only, ignored for others + dtParams.accessListFactory, + dtParams.allowAccessList, + dtParams.denyAccessList ], uints: [ await this.amountToUnits(null, dtParams.cap, 18), diff --git a/src/utils/Assets.ts b/src/utils/Assets.ts index ab3bb9bd..9882a0e3 100644 --- a/src/utils/Assets.ts +++ b/src/utils/Assets.ts @@ -19,6 +19,7 @@ import { getEventFromTx } from './ContractUtils' import { ProviderInstance } from '../services/Provider' // eslint-disable-next-line import/no-named-default import ERC20Template from '@oceanprotocol/contracts/artifacts/contracts/interfaces/IERC20Template.sol/IERC20Template.json' +import AccessListFactory from '@oceanprotocol/contracts/artifacts/contracts/accesslists/AccessListFactory.sol/AccessListFactory.json' // import * as hre from 'hardhat' @@ -126,6 +127,8 @@ export async function calculateActiveTemplateIndex( * @param providerFeeToken the provider fee token * @param nftContractAddress the nft contract address * @param aquariusInstance aquarius, could be node instance url + * @param allowAccessList?: string, + * @param denyAccessList?: string * @returns ddo id as string */ export async function createAsset( @@ -139,7 +142,10 @@ export async function createAsset( providerUrl: string, providerFeeToken: string, aquariusInstance: Aquarius, - nftContractAddress?: string // addresses.ERC721Factory, + nftContractAddress?: string, // addresses.ERC721Factory, + accessListFactory?: string, // access list factory address + allowAccessList?: string, // allow list address + denyAccessList?: string // deny list address ): Promise { const isAddress = typeof templateIDorAddress === 'string' const isTemplateIndex = typeof templateIDorAddress === 'number' @@ -196,7 +202,14 @@ export async function createAsset( // include fileObject in the DT constructor if (config.confidentialEVM) { + // const accessListAddress = await createAccessListFactory( + // config.accessListFactory, + // owner + // ) datatokenParams.filesObject = assetUrl + datatokenParams.accessListFactory = accessListFactory || config.accessListFactory + datatokenParams.allowAccessList = allowAccessList + datatokenParams.denyAccessList = denyAccessList } let bundleNFT @@ -292,3 +305,37 @@ export async function createAsset( ) return ddo.id } + +/** + * deploy new access list factory if needed + * @param accessListFactory accessListFactory address + * @param owner owner account + * @param addressesList list of addresses to deploy + * @returns accessListFactory address + */ +export async function createAccessListFactory( + accessListFactory: string, + owner: Signer, + addressesList?: string[] +): Promise { + const factory = new ethers.Contract(accessListFactory, AccessListFactory.abi, owner) + const ownerAccount = await owner.getAddress() + try { + const accessListTx = await factory.deployAccessListContract( + 'AllowList', + 'ALLOW', + true, + ownerAccount, + addressesList || [ownerAccount], + ['https://oceanprotocol.com/nft/'] + ) + if (accessListTx && accessListTx.wait) { + const trxReceipt = await accessListTx.wait() + const events = getEventFromTx(trxReceipt, 'NewAccessList') + return events.args[0] + } + } catch (error) { + console.log('ERROR createAccessListFactory(): ', error) + } + return null +}