1
0
mirror of https://github.com/oceanprotocol/ocean.js.git synced 2024-11-26 20:39:05 +01:00

Add setMetaDataAndTokenURI method (#1234)

* add support for setMetaDataAndTokenURI and added test

* delete logs

* fix lint

* fix naming
This commit is contained in:
Bogdan Fazakas 2022-01-25 16:02:00 +02:00 committed by GitHub
parent b880bee007
commit 5b73daad7e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 128 additions and 12 deletions

View File

@ -32,7 +32,7 @@
"test:pool": "npm run mocha -- 'test/unit/pools/balancer/Pool.test.ts'",
"test:dispenser": "npm run mocha -- 'test/unit/pools/dispenser/Dispenser.test.ts'",
"test:dt": "npm run mocha -- 'test/unit/tokens/Datatoken.test.ts'",
"test:nftDt": "npm run mocha -- 'test/unit/Nft.test.ts'",
"test:nftDt": "npm run mocha -- 'test/unit/tokens/Nft.test.ts'",
"test:factory": "npm run mocha -- 'test/unit/NftFactory.test.ts'",
"test:router": "npm run mocha -- 'test/unit/pools/Router.test.ts'",
"test:publishAll": "npm run mocha -- 'test/integration/PublishFlows.test.ts'",

View File

@ -0,0 +1,13 @@
import { MetadataProof } from '../@types'
export interface MetadataAndTokenURI {
metaDataState: number
metaDataDecryptorUrl: string
metaDataDecryptorAddress: string
flags: string
data: string
metaDataHash: string
tokenId: number
tokenURI: string
metadataProofs: MetadataProof[]
}

View File

@ -12,6 +12,7 @@ import {
import { Contract } from 'web3-eth-contract'
import { MetadataProof } from '../../src/@types'
import { Config } from '../models/index.js'
import { MetadataAndTokenURI } from '../interfaces/Erc721Interface'
/**
* ERC721 ROLES
@ -991,7 +992,7 @@ export class Nft {
* @param {String} nftAddress erc721 contract adress
* @param {String} metadataUpdater metadataUpdater address
* @param {Number} metadataState User which will receive the NFT, will also be set as Manager
* @param {String} metaDataDecryptorUrl
* @param {String} metadataDecryptorUrl
* @param {Number} tokenId The id of the token to be transfered
* @param {Contract} nftContract optional contract instance
* @return {Promise<any>}
@ -1000,8 +1001,8 @@ export class Nft {
nftAddress: string,
metadataUpdater: string,
metadataState: number,
metaDataDecryptorUrl: string,
metaDataDecryptorAddress: string,
metadataDecryptorUrl: string,
metadataDecryptorAddress: string,
flags: string,
data: string,
metadataHash: string,
@ -1021,8 +1022,8 @@ export class Nft {
estGas = await nftContract.methods
.setMetaData(
metadataState,
metaDataDecryptorUrl,
metaDataDecryptorAddress,
metadataDecryptorUrl,
metadataDecryptorAddress,
flags,
data,
metadataHash,
@ -1049,8 +1050,8 @@ export class Nft {
nftAddress: string,
address: string,
metadataState: number,
metaDataDecryptorUrl: string,
metaDataDecryptorAddress: string,
metadataDecryptorUrl: string,
metadataDecryptorAddress: string,
flags: string,
data: string,
metadataHash: string,
@ -1068,8 +1069,8 @@ export class Nft {
nftAddress,
address,
metadataState,
metaDataDecryptorUrl,
metaDataDecryptorAddress,
metadataDecryptorUrl,
metadataDecryptorAddress,
flags,
data,
metadataHash,
@ -1079,8 +1080,8 @@ export class Nft {
const trxReceipt = await nftContract.methods
.setMetaData(
metadataState,
metaDataDecryptorUrl,
metaDataDecryptorAddress,
metadataDecryptorUrl,
metadataDecryptorAddress,
flags,
data,
metadataHash,
@ -1095,6 +1096,77 @@ export class Nft {
return trxReceipt
}
/**
* Estimate gas cost for setMetadata method
* @param {String} nftAddress erc721 contract adress
* @param {String} metadataUpdater metadataUpdater address
* @param {MetaDataAndTokenURI} metadataAndTokenURI metaDataAndTokenURI object
* @param {Contract} nftContract optional contract instance
* @return {Promise<any>}
*/
public async estGasSetMetadataAndTokenURI(
nftAddress: string,
metadataUpdater: string,
metadataAndTokenURI: MetadataAndTokenURI,
contractInstance?: Contract
): Promise<any> {
const nftContract =
contractInstance ||
setContractDefaults(
new this.web3.eth.Contract(this.nftAbi, nftAddress),
this.config
)
const gasLimitDefault = this.GASLIMIT_DEFAULT
let estGas
try {
estGas = await nftContract.methods
.setMetaDataAndTokenURI(metadataAndTokenURI)
.estimateGas({ from: metadataUpdater }, (err, estGas) =>
err ? gasLimitDefault : estGas
)
} catch (e) {
estGas = gasLimitDefault
}
return estGas
}
/**
* Helper function to improve UX sets both MetaData & TokenURI in one tx
* @param {String} nftAddress erc721 contract adress
* @param {String} address Caller address
* @param {MetadataAndTokenURI} metadataAndTokenURI metaDataAndTokenURI object
* @return {Promise<TransactionReceipt>} trxReceipt
*/
public async setMetadataAndTokenURI(
nftAddress: string,
metadataUpdater: string,
metadataAndTokenURI: MetadataAndTokenURI
): Promise<TransactionReceipt> {
const nftContract = setContractDefaults(
new this.web3.eth.Contract(this.nftAbi, nftAddress),
this.config
)
if (!(await this.getNftPermissions(nftAddress, metadataUpdater)).updateMetadata) {
throw new Error(`Caller is not Metadata updater`)
}
const estGas = await this.estGasSetMetadataAndTokenURI(
nftAddress,
metadataUpdater,
metadataAndTokenURI,
nftContract
)
const trxReceipt = await nftContract.methods
.setMetaDataAndTokenURI(metadataAndTokenURI)
.send({
from: metadataUpdater,
gas: estGas + 1,
gasPrice: await getFairGasPrice(this.web3, this.config)
})
return trxReceipt
}
/**
* Estimate gas cost for setMetadataState method
* @param {String} nftAddress erc721 contract adress

View File

@ -14,6 +14,7 @@ import { NftFactory, NftCreateData } from '../../../src/factories/NFTFactory'
import { Nft } from '../../../src/tokens/NFT'
import { AbiItem } from 'web3-utils'
import sha256 from 'crypto-js/sha256'
import { MetadataAndTokenURI } from '../../../src/interfaces/Erc721Interface'
const web3 = new Web3('http://127.0.0.1:8545')
@ -418,4 +419,34 @@ describe('NFT', () => {
const tx = await nftDatatoken.setTokenURI(nftAddress, user1, 'test')
assert(tx.events.TokenURIUpdate)
})
it('#setMetaDataAndTokenURI - should update tokenURI and set metadata', async () => {
const data = web3.utils.asciiToHex(user2)
const metadataAndTokenURI: MetadataAndTokenURI = {
metaDataState: 1,
metaDataDecryptorUrl: 'http://myprovider:8030',
metaDataDecryptorAddress: '0x123',
flags: web3.utils.asciiToHex(user1),
data: web3.utils.asciiToHex(user1),
metaDataHash: '0x' + sha256(data).toString(),
tokenId: 1,
tokenURI: 'https://anothernewurl.com/nft/',
metadataProofs: []
}
assert(
(await nftDatatoken.getNftPermissions(nftAddress, user1)).updateMetadata === true
)
const tx = await nftDatatoken.setMetadataAndTokenURI(
nftAddress,
user1,
metadataAndTokenURI
)
assert(tx.events.TokenURIUpdate)
assert(tx.events.MetadataUpdated)
const metadata = await nftDatatoken.getMetadata(nftAddress)
assert(metadata[0] === 'http://myprovider:8030')
assert(metadata[1] === '0x123')
})
})