diff --git a/src/tokens/Datatoken.ts b/src/tokens/Datatoken.ts index 4b0e9aed..701bb302 100644 --- a/src/tokens/Datatoken.ts +++ b/src/tokens/Datatoken.ts @@ -782,8 +782,15 @@ export class Datatoken { new this.web3.eth.Contract(this.datatokensAbi, dtAddress), this.config ) - if ((await this.getDTPermissions(dtAddress, address)).paymentManager !== true) { - throw new Error(`Caller is not Fee Manager`) + const isPaymentManager = (await this.getDTPermissions(dtAddress, address)) + .paymentManager + const nftAddress = !isPaymentManager && (await this.getNFTAddress(dtAddress)) + const isNftOwner = nftAddress && (await this.nft.getNftOwner(nftAddress)) === address + const nftPermissions = + nftAddress && !isNftOwner && (await this.nft.getNftPermissions(nftAddress, address)) + const isErc20Deployer = nftPermissions?.deployERC20 + if (!isPaymentManager && !isNftOwner && !isErc20Deployer) { + throw new Error(`Caller is not Fee Manager, owner or erc20 Deployer`) } const estGas = await this.estGasSetPaymentCollector( diff --git a/test/unit/tokens/Datatoken.test.ts b/test/unit/tokens/Datatoken.test.ts index 713effd1..8c84e8b0 100644 --- a/test/unit/tokens/Datatoken.test.ts +++ b/test/unit/tokens/Datatoken.test.ts @@ -24,6 +24,7 @@ describe('Datatoken', () => { let user1: string let user2: string let user3: string + let erc20DeployerUser: string let contracts: Addresses let nftDatatoken: Nft let datatoken: Datatoken @@ -42,6 +43,7 @@ describe('Datatoken', () => { user1 = accounts[1] user2 = accounts[2] user3 = accounts[3] + erc20DeployerUser = accounts[4] }) it('should deploy contracts', async () => { @@ -76,7 +78,7 @@ describe('Datatoken', () => { }) it('#createERC20 - should create a new ERC20 DT from NFT contract', async () => { - // await nftDatatoken.addERC20Deployer(nftAddress, nftOwner, nftOwner) + await nftDatatoken.addErc20Deployer(nftAddress, nftOwner, erc20DeployerUser) datatokenAddress = await nftDatatoken.createErc20( nftAddress, nftOwner, @@ -287,7 +289,7 @@ describe('Datatoken', () => { ) }) - it('#setPaymentCollector - should fail to set a new paymentCollector, if NOT PAYMENT Manager', async () => { + it('#setPaymentCollector - should fail to set a new paymentCollector, if NOT PAYMENT Manager, NFT OWNER OR ERC 20 DEPLOYER', async () => { assert( (await datatoken.getDTPermissions(datatokenAddress, user2)).paymentManager === false ) @@ -295,7 +297,7 @@ describe('Datatoken', () => { try { await datatoken.setPaymentCollector(datatokenAddress, user1, user2) } catch (e) { - assert(e.message === 'Caller is not Fee Manager') + assert(e.message === 'Caller is not Fee Manager, owner or erc20 Deployer') } }) @@ -313,6 +315,25 @@ describe('Datatoken', () => { assert((await datatoken.getPaymentCollector(datatokenAddress)) === user3) }) + it('#setPaymentCollector - should set a new paymentCollector, if NFT OWNER', async () => { + assert((await nftDatatoken.getNftOwner(nftAddress)) === nftOwner) + + await datatoken.setPaymentCollector(datatokenAddress, nftOwner, user2) + + assert((await datatoken.getPaymentCollector(datatokenAddress)) === user2) + }) + + it('#setPaymentCollector - should set a new paymentCollector, if ERC 20 DEPLOYER', async () => { + assert( + (await nftDatatoken.getNftPermissions(nftAddress, erc20DeployerUser)) + .deployERC20 === true + ) + + await datatoken.setPaymentCollector(datatokenAddress, erc20DeployerUser, user3) + + assert((await datatoken.getPaymentCollector(datatokenAddress)) === user3) + }) + it('#startOrder- user2 should create an order for DT ', async () => { assert( (await datatoken.balance(datatokenAddress, user1)) === '10',