diff --git a/src/contracts/tokens/NFT.ts b/src/contracts/tokens/NFT.ts index 90f918dc..69b19574 100644 --- a/src/contracts/tokens/NFT.ts +++ b/src/contracts/tokens/NFT.ts @@ -26,7 +26,7 @@ export class Nft extends SmartContract { * @param {Number} templateIndex NFT template index * @return {Promise} ERC20 Datatoken address */ - public async createDatatoken( + public async createDatatoken( nftAddress: string, address: string, minter: string, @@ -37,8 +37,9 @@ export class Nft extends SmartContract { cap: string, name?: string, symbol?: string, - templateIndex?: number - ): Promise { + templateIndex?: number, + estimateGas?: G + ): Promise { if ((await this.getNftPermissions(nftAddress, address)).deployERC20 !== true) { throw new Error(`Caller is not DatatokenDeployer`) } @@ -61,6 +62,7 @@ export class Nft extends SmartContract { [this.web3.utils.toWei(cap), this.web3.utils.toWei(feeAmount)], [] ) + if (estimateGas) return estGas // Call createERC20 token function of the contract const trxReceipt = await nftContract.methods @@ -93,7 +95,12 @@ export class Nft extends SmartContract { * @param {String} manager User adress which is going to be assing manager * @return {Promise} trxReceipt */ - public async addManager(nftAddress: string, address: string, manager: string) { + public async addManager( + nftAddress: string, + address: string, + manager: string, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if ((await this.getNftOwner(nftAddress)) !== address) { @@ -105,6 +112,7 @@ export class Nft extends SmartContract { nftContract.methods.addManager, manager ) + if (estimateGas) return estGas // Invoke addManager function of the contract const trxReceipt = await nftContract.methods.addManager(manager).send({ @@ -123,7 +131,12 @@ export class Nft extends SmartContract { * @param {String} manager User adress which is going to be removed as manager * @return {Promise} trxReceipt */ - public async removeManager(nftAddress: string, address: string, manager: string) { + public async removeManager( + nftAddress: string, + address: string, + manager: string, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if ((await this.getNftOwner(nftAddress)) !== address) { @@ -135,6 +148,7 @@ export class Nft extends SmartContract { nftContract.methods.removeManager, manager ) + if (estimateGas) return estGas // Invoke removeManager function of the contract const trxReceipt = await nftContract.methods.removeManager(manager).send({ @@ -153,11 +167,12 @@ export class Nft extends SmartContract { * @param {String} datatokenDeployer User adress which is going to have DatatokenDeployer permission * @return {Promise} trxReceipt */ - public async addDatatokenDeployer( + public async addDatatokenDeployer( nftAddress: string, address: string, - datatokenDeployer: string - ): Promise { + datatokenDeployer: string, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if ((await this.getNftPermissions(nftAddress, address)).manager !== true) { @@ -170,6 +185,7 @@ export class Nft extends SmartContract { nftContract.methods.addToCreateERC20List, datatokenDeployer ) + if (estimateGas) return estGas // Invoke addToCreateERC20List function of the contract const trxReceipt = await nftContract.methods @@ -190,11 +206,12 @@ export class Nft extends SmartContract { * @param {String} datatokenDeployer Address of the user to be revoked DatatokenDeployer Permission * @return {Promise} trxReceipt */ - public async removeDatatokenDeployer( + public async removeDatatokenDeployer( nftAddress: string, address: string, - datatokenDeployer: string - ): Promise { + datatokenDeployer: string, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if ( @@ -209,6 +226,7 @@ export class Nft extends SmartContract { nftContract.methods.removeFromCreateERC20List, datatokenDeployer ) + if (estimateGas) return estGas // Call removeFromCreateERC20List function of the contract const trxReceipt = await nftContract.methods @@ -229,11 +247,12 @@ export class Nft extends SmartContract { * @param {String} metadataUpdater User adress which is going to have Metadata Updater permission * @return {Promise} trxReceipt */ - public async addMetadataUpdater( + public async addMetadataUpdater( nftAddress: string, address: string, - metadataUpdater: string - ): Promise { + metadataUpdater: string, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if ((await this.getNftPermissions(nftAddress, address)).manager !== true) { @@ -245,6 +264,7 @@ export class Nft extends SmartContract { nftContract.methods.addToMetadataList, metadataUpdater ) + if (estimateGas) return estGas // Call addToMetadataList function of the contract const trxReceipt = await nftContract.methods.addToMetadataList(metadataUpdater).send({ @@ -256,29 +276,6 @@ export class Nft extends SmartContract { return trxReceipt } - /** - * Estimate gas cost for removeFromMetadataList method - * @param {String} nftAddress NFT contract address - * @param {String} address NFT Manager adress - * @param {String} metadataUpdater Address of the user to be revoked Metadata updater Permission - * @param {Contract} nftContract optional contract instance - * @return {Promise} - */ - public async esGasRemoveMetadataUpdater( - nftAddress: string, - address: string, - metadataUpdater: string, - contractInstance?: Contract - ): Promise { - const nftContract = contractInstance || this.getContract(nftAddress) - - return calculateEstimatedGas( - address, - nftContract.methods.removeFromMetadataList, - metadataUpdater - ) - } - /** * Remove Metadata Updater permission - only Manager can succeed * @param {String} nftAddress NFT contract address @@ -286,11 +283,12 @@ export class Nft extends SmartContract { * @param {String} metadataUpdater Address of the user to be revoked Metadata updater Permission * @return {Promise} trxReceipt */ - public async removeMetadataUpdater( + public async removeMetadataUpdater( nftAddress: string, address: string, - metadataUpdater: string - ): Promise { + metadataUpdater: string, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if ( @@ -301,12 +299,12 @@ export class Nft extends SmartContract { throw new Error(`Caller is not Manager nor Metadata Updater`) } - const estGas = await this.esGasRemoveMetadataUpdater( - nftAddress, + const estGas = await calculateEstimatedGas( address, - metadataUpdater, - nftContract + nftContract.methods.removeFromMetadataList, + metadataUpdater ) + if (estimateGas) return estGas // Call removeFromMetadataList function of the contract const trxReceipt = await nftContract.methods @@ -327,11 +325,12 @@ export class Nft extends SmartContract { * @param {String} storeUpdater User adress which is going to have Store Updater permission * @return {Promise} trxReceipt */ - public async addStoreUpdater( + public async addStoreUpdater( nftAddress: string, address: string, - storeUpdater: string - ): Promise { + storeUpdater: string, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if ((await this.getNftPermissions(nftAddress, address)).manager !== true) { @@ -343,6 +342,7 @@ export class Nft extends SmartContract { nftContract.methods.addTo725StoreList, storeUpdater ) + if (estimateGas) return estGas // Call addTo725StoreList function of the contract const trxReceipt = await nftContract.methods.addTo725StoreList(storeUpdater).send({ @@ -361,11 +361,12 @@ export class Nft extends SmartContract { * @param {String} storeUpdater Address of the user to be revoked Store Updater Permission * @return {Promise} trxReceipt */ - public async removeStoreUpdater( + public async removeStoreUpdater( nftAddress: string, address: string, - storeUpdater: string - ): Promise { + storeUpdater: string, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if ( @@ -381,6 +382,7 @@ export class Nft extends SmartContract { nftContract.methods.removeFrom725StoreList, storeUpdater ) + if (estimateGas) return estGas // Call removeFrom725StoreList function of the contract const trxReceipt = await nftContract.methods @@ -404,10 +406,11 @@ export class Nft extends SmartContract { * @return {Promise} trxReceipt */ - public async cleanPermissions( + public async cleanPermissions( nftAddress: string, - address: string - ): Promise { + address: string, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if ((await this.getNftOwner(nftAddress)) !== address) { @@ -418,6 +421,7 @@ export class Nft extends SmartContract { address, nftContract.methods.cleanPermissions ) + if (estimateGas) return estGas // Call cleanPermissions function of the contract const trxReceipt = await nftContract.methods.cleanPermissions().send({ @@ -438,12 +442,13 @@ export class Nft extends SmartContract { * @param {Number} tokenId The id of the token to be transfered * @return {Promise} trxReceipt */ - public async transferNft( + public async transferNft( nftAddress: string, nftOwner: string, nftReceiver: string, - tokenId?: number - ): Promise { + tokenId?: number, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if ((await this.getNftOwner(nftAddress)) !== nftOwner) { @@ -459,6 +464,7 @@ export class Nft extends SmartContract { nftReceiver, tokenIdentifier ) + if (estimateGas) return estGas // Call transferFrom function of the contract const trxReceipt = await nftContract.methods @@ -481,12 +487,13 @@ export class Nft extends SmartContract { * @param {Number} tokenId The id of the token to be transfered * @return {Promise} trxReceipt */ - public async safeTransferNft( + public async safeTransferNft( nftAddress: string, nftOwner: string, nftReceiver: string, - tokenId?: number - ): Promise { + tokenId?: number, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if ((await this.getNftOwner(nftAddress)) !== nftOwner) { @@ -502,6 +509,7 @@ export class Nft extends SmartContract { nftReceiver, tokenIdentifier ) + if (estimateGas) return estGas // Call transferFrom function of the contract const trxReceipt = await nftContract.methods @@ -522,7 +530,7 @@ export class Nft extends SmartContract { * @param {String} address Caller address NFT Owner adress * @return {Promise} trxReceipt */ - public async setMetadata( + public async setMetadata( nftAddress: string, address: string, metadataState: number, @@ -531,8 +539,9 @@ export class Nft extends SmartContract { flags: string, data: string, metadataHash: string, - metadataProofs?: MetadataProof[] - ): Promise { + metadataProofs?: MetadataProof[], + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if (!metadataProofs) metadataProofs = [] if (!(await this.getNftPermissions(nftAddress, address)).updateMetadata) { @@ -549,6 +558,8 @@ export class Nft extends SmartContract { metadataHash, metadataProofs ) + if (estimateGas) return estGas + const trxReceipt = await nftContract.methods .setMetaData( metadataState, @@ -575,11 +586,12 @@ export class Nft extends SmartContract { * @param {MetadataAndTokenURI} metadataAndTokenURI metaDataAndTokenURI object * @return {Promise} trxReceipt */ - public async setMetadataAndTokenURI( + public async setMetadataAndTokenURI( nftAddress: string, metadataUpdater: string, - metadataAndTokenURI: MetadataAndTokenURI - ): Promise { + metadataAndTokenURI: MetadataAndTokenURI, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if (!(await this.getNftPermissions(nftAddress, metadataUpdater)).updateMetadata) { throw new Error(`Caller is not Metadata updater`) @@ -593,6 +605,8 @@ export class Nft extends SmartContract { nftContract.methods.setMetaDataAndTokenURI, sanitizedMetadataAndTokenURI ) + if (estimateGas) return estGas + const trxReceipt = await nftContract.methods .setMetaDataAndTokenURI(sanitizedMetadataAndTokenURI) .send({ @@ -611,11 +625,12 @@ export class Nft extends SmartContract { * @param {Number} metadataState new metadata state * @return {Promise} trxReceipt */ - public async setMetadataState( + public async setMetadataState( nftAddress: string, address: string, - metadataState: number - ): Promise { + metadataState: number, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) if (!(await this.getNftPermissions(nftAddress, address)).updateMetadata) { @@ -627,6 +642,7 @@ export class Nft extends SmartContract { nftContract.methods.setMetaDataState, metadataState ) + if (estimateGas) return estGas // Call transferFrom function of the contract const trxReceipt = await nftContract.methods.setMetaDataState(metadataState).send({ @@ -644,11 +660,12 @@ export class Nft extends SmartContract { * @param data input data for TokenURI * @return {Promise} transaction receipt */ - public async setTokenURI( + public async setTokenURI( nftAddress: string, address: string, - data: string - ): Promise { + data: string, + estimateGas?: G + ): Promise { const nftContract = this.getContract(nftAddress) const estGas = await calculateEstimatedGas( @@ -657,6 +674,8 @@ export class Nft extends SmartContract { '1', data ) + if (estimateGas) return estGas + const trxReceipt = await nftContract.methods.setTokenURI('1', data).send({ from: address, gas: estGas + 1,