diff --git a/src/@types/Erc20.ts b/src/@types/Erc20.ts index 9c133ff7..19643b47 100644 --- a/src/@types/Erc20.ts +++ b/src/@types/Erc20.ts @@ -15,3 +15,9 @@ export interface ConsumeMarketFee { consumeMarketFeeToken: string // address of the token marketplace wants to add fee on top consumeMarketFeeAmount: string } + +export interface PublishingMarketFee { + publishMarketFeeAddress: string + publishMarketFeeToken: string + publishMarketFeeAmount: string +} diff --git a/src/tokens/Datatoken.ts b/src/tokens/Datatoken.ts index 152cc498..5c155d5d 100644 --- a/src/tokens/Datatoken.ts +++ b/src/tokens/Datatoken.ts @@ -18,7 +18,8 @@ import { ConsumeMarketFee, FreOrderParams, FreCreationParams, - ProviderFees + ProviderFees, + PublishingMarketFee } from '../@types' import { Nft } from './NFT' import { Config } from '../models/index.js' @@ -1311,4 +1312,102 @@ export class Datatoken { const balance = await dtContract.methods.balanceOf(address).call() return this.web3.utils.fromWei(balance) } + + /** + * @dev estGasSetPublishingMarketFee + * Estimating gas for publishMarketFeeAddress method + * @param {string} datatokenAddress Datatoken adress + * @param {string} publishMarketFeeAddress new publish Market Fee Address + * @param {string} publishMarketFeeToken new publish Market Fee Token + * @param {string} publishMarketFeeAmount new fee amount + * @param {String} address user adress + */ + public async estGasSetPublishingMarketFee( + datatokenAddress: string, + publishMarketFeeAddress: string, + publishMarketFeeToken: string, + publishMarketFeeAmount: string, + address: string + ): Promise { + // Estimate gas cost for publishMarketFeeAddress method + const dtContract = new this.web3.eth.Contract(this.datatokensAbi, datatokenAddress, { + from: address + }) + return estimateGas( + address, + dtContract.methods.setPublishingMarketFee, + publishMarketFeeAddress, + publishMarketFeeToken, + publishMarketFeeAmount + ) + } + + /** + * @dev setPublishingMarketFee + * Only publishMarketFeeAddress can call it + * This function allows to set the fee required by the publisherMarket + * @param {string} datatokenAddress Datatoken adress + * @param {string} publishMarketFeeAddress new publish Market Fee Address + * @param {string} publishMarketFeeToken new publish Market Fee Token + * @param {string} publishMarketFeeAmount new fee amount + * @param {String} address user adress + */ + public async setPublishingMarketFee( + datatokenAddress: string, + publishMarketFeeAddress: string, + publishMarketFeeToken: string, + publishMarketFeeAmount: string, + address: string + ) { + const dtContract = new this.web3.eth.Contract(this.datatokensAbi, datatokenAddress, { + from: address + }) + const mktFeeAddress = (await dtContract.methods.getPublishingMarketFee().call())[0] + if (mktFeeAddress !== address) { + throw new Error(`Caller is not the Publishing Market Fee Address`) + } + const estGas = await this.estGasSetPublishingMarketFee( + datatokenAddress, + publishMarketFeeAddress, + publishMarketFeeToken, + publishMarketFeeAmount, + address + ) + await dtContract.methods + .setPublishingMarketFee( + publishMarketFeeAddress, + publishMarketFeeToken, + publishMarketFeeAmount + ) + .send({ + from: address, + gas: estGas + 1, + gasPrice: await getFairGasPrice(this.web3, this.config) + }) + } + + /** + * @dev getPublishingMarketFee + * Get publishingMarket Fee + * This function allows to get the current fee set by the publishing market + * @param {String} datatokenAddress Datatoken adress + * @param {String} address user adress + * @return {Promise} Current fee set by the publishing market + */ + public async getPublishingMarketFee( + datatokenAddress: string, + address: string + ): Promise { + const dtContract = new this.web3.eth.Contract(this.datatokensAbi, datatokenAddress, { + from: address + }) + + const publishingMarketFee = await dtContract.methods.getPublishingMarketFee().call() + const returnValues = { + publishMarketFeeAddress: publishingMarketFee[0], + publishMarketFeeToken: publishingMarketFee[1], + publishMarketFeeAmount: publishingMarketFee[2] + } + return returnValues + } } diff --git a/test/unit/tokens/Datatoken.test.ts b/test/unit/tokens/Datatoken.test.ts index 78eb9781..261c237b 100644 --- a/test/unit/tokens/Datatoken.test.ts +++ b/test/unit/tokens/Datatoken.test.ts @@ -595,4 +595,66 @@ describe('Datatoken', () => { const key = web3.utils.keccak256(datatokenAddress) assert((await nftDatatoken.getData(nftAddress, key)) === OldData) }) + + it('#setPublishingMarketFee - User should not be able to set the Publishing Market Fee', async () => { + const originalPublishingMarketFee = await datatoken.getPublishingMarketFee( + datatokenAddress, + user1 + ) + try { + await datatoken.setPublishingMarketFee( + datatokenAddress, + user1, + contracts.daiAddress, + web3.utils.toWei('10'), + user1 + ) + } catch (e) { + console.log('Message:', e.message) + assert(e.message === 'Caller is not the Publishing Market Fee Address') + } + const newPublishingMarketFee = await datatoken.getPublishingMarketFee( + datatokenAddress, + user3 + ) + + assert( + newPublishingMarketFee.publishMarketFeeAddress === + originalPublishingMarketFee.publishMarketFeeAddress + ) + assert( + newPublishingMarketFee.publishMarketFeeAmount === + originalPublishingMarketFee.publishMarketFeeAmount + ) + assert( + newPublishingMarketFee.publishMarketFeeToken === + originalPublishingMarketFee.publishMarketFeeToken + ) + }) + it('#setPublishingMarketFee - Marketplace fee address should be able to set the Publishing Market Fee', async () => { + const originalPublishingMarketFee = await datatoken.getPublishingMarketFee( + datatokenAddress, + user2 + ) + try { + await datatoken.setPublishingMarketFee( + datatokenAddress, + user2, + contracts.daiAddress, + web3.utils.toWei('10'), + user2 + ) + } catch (e) { + console.log('Error:', e) + } + const newPublishingMarketFee = await datatoken.getPublishingMarketFee( + datatokenAddress, + user2 + ) + + assert(newPublishingMarketFee !== originalPublishingMarketFee) + assert(newPublishingMarketFee.publishMarketFeeAddress === user2) + assert(newPublishingMarketFee.publishMarketFeeAmount === web3.utils.toWei('10')) + assert(newPublishingMarketFee.publishMarketFeeToken === contracts.daiAddress) + }) })