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:
parent
b880bee007
commit
5b73daad7e
@ -32,7 +32,7 @@
|
|||||||
"test:pool": "npm run mocha -- 'test/unit/pools/balancer/Pool.test.ts'",
|
"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:dispenser": "npm run mocha -- 'test/unit/pools/dispenser/Dispenser.test.ts'",
|
||||||
"test:dt": "npm run mocha -- 'test/unit/tokens/Datatoken.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:factory": "npm run mocha -- 'test/unit/NftFactory.test.ts'",
|
||||||
"test:router": "npm run mocha -- 'test/unit/pools/Router.test.ts'",
|
"test:router": "npm run mocha -- 'test/unit/pools/Router.test.ts'",
|
||||||
"test:publishAll": "npm run mocha -- 'test/integration/PublishFlows.test.ts'",
|
"test:publishAll": "npm run mocha -- 'test/integration/PublishFlows.test.ts'",
|
||||||
|
13
src/interfaces/Erc721Interface.ts
Normal file
13
src/interfaces/Erc721Interface.ts
Normal 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[]
|
||||||
|
}
|
@ -12,6 +12,7 @@ import {
|
|||||||
import { Contract } from 'web3-eth-contract'
|
import { Contract } from 'web3-eth-contract'
|
||||||
import { MetadataProof } from '../../src/@types'
|
import { MetadataProof } from '../../src/@types'
|
||||||
import { Config } from '../models/index.js'
|
import { Config } from '../models/index.js'
|
||||||
|
import { MetadataAndTokenURI } from '../interfaces/Erc721Interface'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ERC721 ROLES
|
* ERC721 ROLES
|
||||||
@ -991,7 +992,7 @@ export class Nft {
|
|||||||
* @param {String} nftAddress erc721 contract adress
|
* @param {String} nftAddress erc721 contract adress
|
||||||
* @param {String} metadataUpdater metadataUpdater address
|
* @param {String} metadataUpdater metadataUpdater address
|
||||||
* @param {Number} metadataState User which will receive the NFT, will also be set as Manager
|
* @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 {Number} tokenId The id of the token to be transfered
|
||||||
* @param {Contract} nftContract optional contract instance
|
* @param {Contract} nftContract optional contract instance
|
||||||
* @return {Promise<any>}
|
* @return {Promise<any>}
|
||||||
@ -1000,8 +1001,8 @@ export class Nft {
|
|||||||
nftAddress: string,
|
nftAddress: string,
|
||||||
metadataUpdater: string,
|
metadataUpdater: string,
|
||||||
metadataState: number,
|
metadataState: number,
|
||||||
metaDataDecryptorUrl: string,
|
metadataDecryptorUrl: string,
|
||||||
metaDataDecryptorAddress: string,
|
metadataDecryptorAddress: string,
|
||||||
flags: string,
|
flags: string,
|
||||||
data: string,
|
data: string,
|
||||||
metadataHash: string,
|
metadataHash: string,
|
||||||
@ -1021,8 +1022,8 @@ export class Nft {
|
|||||||
estGas = await nftContract.methods
|
estGas = await nftContract.methods
|
||||||
.setMetaData(
|
.setMetaData(
|
||||||
metadataState,
|
metadataState,
|
||||||
metaDataDecryptorUrl,
|
metadataDecryptorUrl,
|
||||||
metaDataDecryptorAddress,
|
metadataDecryptorAddress,
|
||||||
flags,
|
flags,
|
||||||
data,
|
data,
|
||||||
metadataHash,
|
metadataHash,
|
||||||
@ -1049,8 +1050,8 @@ export class Nft {
|
|||||||
nftAddress: string,
|
nftAddress: string,
|
||||||
address: string,
|
address: string,
|
||||||
metadataState: number,
|
metadataState: number,
|
||||||
metaDataDecryptorUrl: string,
|
metadataDecryptorUrl: string,
|
||||||
metaDataDecryptorAddress: string,
|
metadataDecryptorAddress: string,
|
||||||
flags: string,
|
flags: string,
|
||||||
data: string,
|
data: string,
|
||||||
metadataHash: string,
|
metadataHash: string,
|
||||||
@ -1068,8 +1069,8 @@ export class Nft {
|
|||||||
nftAddress,
|
nftAddress,
|
||||||
address,
|
address,
|
||||||
metadataState,
|
metadataState,
|
||||||
metaDataDecryptorUrl,
|
metadataDecryptorUrl,
|
||||||
metaDataDecryptorAddress,
|
metadataDecryptorAddress,
|
||||||
flags,
|
flags,
|
||||||
data,
|
data,
|
||||||
metadataHash,
|
metadataHash,
|
||||||
@ -1079,8 +1080,8 @@ export class Nft {
|
|||||||
const trxReceipt = await nftContract.methods
|
const trxReceipt = await nftContract.methods
|
||||||
.setMetaData(
|
.setMetaData(
|
||||||
metadataState,
|
metadataState,
|
||||||
metaDataDecryptorUrl,
|
metadataDecryptorUrl,
|
||||||
metaDataDecryptorAddress,
|
metadataDecryptorAddress,
|
||||||
flags,
|
flags,
|
||||||
data,
|
data,
|
||||||
metadataHash,
|
metadataHash,
|
||||||
@ -1095,6 +1096,77 @@ export class Nft {
|
|||||||
return trxReceipt
|
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
|
* Estimate gas cost for setMetadataState method
|
||||||
* @param {String} nftAddress erc721 contract adress
|
* @param {String} nftAddress erc721 contract adress
|
||||||
|
@ -14,6 +14,7 @@ import { NftFactory, NftCreateData } from '../../../src/factories/NFTFactory'
|
|||||||
import { Nft } from '../../../src/tokens/NFT'
|
import { Nft } from '../../../src/tokens/NFT'
|
||||||
import { AbiItem } from 'web3-utils'
|
import { AbiItem } from 'web3-utils'
|
||||||
import sha256 from 'crypto-js/sha256'
|
import sha256 from 'crypto-js/sha256'
|
||||||
|
import { MetadataAndTokenURI } from '../../../src/interfaces/Erc721Interface'
|
||||||
|
|
||||||
const web3 = new Web3('http://127.0.0.1:8545')
|
const web3 = new Web3('http://127.0.0.1:8545')
|
||||||
|
|
||||||
@ -418,4 +419,34 @@ describe('NFT', () => {
|
|||||||
const tx = await nftDatatoken.setTokenURI(nftAddress, user1, 'test')
|
const tx = await nftDatatoken.setTokenURI(nftAddress, user1, 'test')
|
||||||
assert(tx.events.TokenURIUpdate)
|
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')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user