mirror of
https://github.com/oceanprotocol/ocean.js.git
synced 2024-11-26 20:39:05 +01:00
Merge pull request #1558 from oceanprotocol/issue-1556-add-nft-setData()-function
Issue-#1556: Add nft.setData() function
This commit is contained in:
commit
b83872bc7c
@ -1168,10 +1168,12 @@ export class Datatoken {
|
|||||||
this.config
|
this.config
|
||||||
)
|
)
|
||||||
|
|
||||||
const estGas = await estimateGas(address, dtContract.methods.setData, value)
|
const valueHex = this.web3.utils.asciiToHex(value)
|
||||||
|
|
||||||
|
const estGas = await estimateGas(address, dtContract.methods.setData, valueHex)
|
||||||
|
|
||||||
// Call setData function of the contract
|
// Call setData function of the contract
|
||||||
const trxReceipt = await dtContract.methods.setData(value).send({
|
const trxReceipt = await dtContract.methods.setData(valueHex).send({
|
||||||
from: address,
|
from: address,
|
||||||
gas: estGas + 1,
|
gas: estGas + 1,
|
||||||
gasPrice: await getFairGasPrice(this.web3, this.config)
|
gasPrice: await getFairGasPrice(this.web3, this.config)
|
||||||
|
@ -1159,6 +1159,50 @@ export class Nft {
|
|||||||
return trxReceipt
|
return trxReceipt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** setData
|
||||||
|
* This function allows to store data with a preset key (keccak256(ERC20Address)) into NFT 725 Store
|
||||||
|
* only ERC20Deployer can succeed
|
||||||
|
* @param nftAddress erc721 contract adress
|
||||||
|
* @param address user adress
|
||||||
|
* @param key Key of the data to be stored into 725Y standard
|
||||||
|
* @param value Data to be stored into 725Y standard
|
||||||
|
* @return {Promise<TransactionReceipt>} transactionId
|
||||||
|
*/
|
||||||
|
public async setData(
|
||||||
|
nftAddress: string,
|
||||||
|
address: string,
|
||||||
|
key: string,
|
||||||
|
value: string
|
||||||
|
): Promise<TransactionReceipt> {
|
||||||
|
if ((await this.getNftPermissions(nftAddress, address)).store !== true) {
|
||||||
|
throw new Error(`User is not ERC20 store updater`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const nftContract = setContractDefaults(
|
||||||
|
new this.web3.eth.Contract(this.nftAbi, nftAddress),
|
||||||
|
this.config
|
||||||
|
)
|
||||||
|
|
||||||
|
const keyHash = this.web3.utils.keccak256(key)
|
||||||
|
const valueHex = this.web3.utils.asciiToHex(value)
|
||||||
|
|
||||||
|
const estGas = await estimateGas(
|
||||||
|
address,
|
||||||
|
nftContract.methods.setNewData,
|
||||||
|
keyHash,
|
||||||
|
valueHex
|
||||||
|
)
|
||||||
|
|
||||||
|
// Call setData function of the contract
|
||||||
|
const trxReceipt = await nftContract.methods.setNewData(keyHash, valueHex).send({
|
||||||
|
from: address,
|
||||||
|
gas: estGas + 1,
|
||||||
|
gasPrice: await getFairGasPrice(this.web3, this.config)
|
||||||
|
})
|
||||||
|
|
||||||
|
return trxReceipt
|
||||||
|
}
|
||||||
|
|
||||||
/** Get Owner
|
/** Get Owner
|
||||||
* @param {String} nftAddress erc721 contract adress
|
* @param {String} nftAddress erc721 contract adress
|
||||||
* @return {Promise<string>} string
|
* @return {Promise<string>} string
|
||||||
@ -1222,8 +1266,9 @@ export class Nft {
|
|||||||
new this.web3.eth.Contract(this.nftAbi, nftAddress),
|
new this.web3.eth.Contract(this.nftAbi, nftAddress),
|
||||||
this.config
|
this.config
|
||||||
)
|
)
|
||||||
const data = await nftContract.methods.getData(key).call()
|
const keyHash = this.web3.utils.keccak256(key)
|
||||||
return data
|
const data = await nftContract.methods.getData(keyHash).call()
|
||||||
|
return data ? this.web3.utils.hexToAscii(data) : null
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Gets data at a given `key`
|
/** Gets data at a given `key`
|
||||||
|
@ -549,19 +549,18 @@ describe('Datatoken', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('#setData - should set a value into 725Y standard, if Caller has ERC20Deployer permission', async () => {
|
it('#setData - should set a value into 725Y standard, if Caller has ERC20Deployer permission', async () => {
|
||||||
const data = web3.utils.asciiToHex('SomeData')
|
const data = 'SomeData'
|
||||||
|
|
||||||
assert((await nftDatatoken.isErc20Deployer(nftAddress, nftOwner)) === true)
|
assert((await nftDatatoken.isErc20Deployer(nftAddress, nftOwner)) === true)
|
||||||
|
|
||||||
await datatoken.setData(datatokenAddress, nftOwner, data)
|
await datatoken.setData(datatokenAddress, nftOwner, data)
|
||||||
|
|
||||||
const key = web3.utils.keccak256(datatokenAddress)
|
assert((await nftDatatoken.getData(nftAddress, datatokenAddress)) === data)
|
||||||
assert((await nftDatatoken.getData(nftAddress, key)) === data)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('#setData - should FAIL to set a value into 725Y standard, if Caller has NOT ERC20Deployer permission', async () => {
|
it('#setData - should FAIL to set a value into 725Y standard, if Caller has NOT ERC20Deployer permission', async () => {
|
||||||
const data = web3.utils.asciiToHex('NewData')
|
const data = 'NewData'
|
||||||
const OldData = web3.utils.asciiToHex('SomeData')
|
const OldData = 'SomeData'
|
||||||
assert((await nftDatatoken.isErc20Deployer(nftAddress, user1)) === false)
|
assert((await nftDatatoken.isErc20Deployer(nftAddress, user1)) === false)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@ -570,8 +569,7 @@ describe('Datatoken', () => {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
assert(e.message === 'User is not ERC20 Deployer')
|
assert(e.message === 'User is not ERC20 Deployer')
|
||||||
}
|
}
|
||||||
const key = web3.utils.keccak256(datatokenAddress)
|
assert((await nftDatatoken.getData(nftAddress, datatokenAddress)) === OldData)
|
||||||
assert((await nftDatatoken.getData(nftAddress, key)) === OldData)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
it('#getDecimals - should return the number of decimals of the datatoken', async () => {
|
it('#getDecimals - should return the number of decimals of the datatoken', async () => {
|
||||||
|
@ -433,4 +433,31 @@ describe('NFT', () => {
|
|||||||
assert(metadata[0] === metadataAndTokenURI.metaDataDecryptorUrl)
|
assert(metadata[0] === metadataAndTokenURI.metaDataDecryptorUrl)
|
||||||
assert(metadata[1] === metadataAndTokenURI.metaDataDecryptorAddress)
|
assert(metadata[1] === metadataAndTokenURI.metaDataDecryptorAddress)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('#setData - should FAIL to set a value into 725Y standard, if Caller has NOT store updater permission', async () => {
|
||||||
|
const key = 'KEY'
|
||||||
|
const data = 'NewData'
|
||||||
|
assert((await nftDatatoken.getNftPermissions(nftAddress, user1)).store === false)
|
||||||
|
|
||||||
|
try {
|
||||||
|
await nftDatatoken.setData(nftAddress, user1, key, data)
|
||||||
|
assert(false)
|
||||||
|
} catch (e) {
|
||||||
|
assert(e.message === 'User is not ERC20 store updater')
|
||||||
|
}
|
||||||
|
assert((await nftDatatoken.getData(nftAddress, key)) === null)
|
||||||
|
})
|
||||||
|
|
||||||
|
it('#setData - should set a value into 725Y standard, if Caller has store updater permission', async () => {
|
||||||
|
const key = 'KEY'
|
||||||
|
const data = 'NewData'
|
||||||
|
|
||||||
|
// add store updater permission
|
||||||
|
await nftDatatoken.addStoreUpdater(nftAddress, user1, user1)
|
||||||
|
assert((await nftDatatoken.getNftPermissions(nftAddress, user1)).store === true)
|
||||||
|
|
||||||
|
await nftDatatoken.setData(nftAddress, user1, key, data)
|
||||||
|
|
||||||
|
assert((await nftDatatoken.getData(nftAddress, key)) === data)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
Loading…
x
Reference in New Issue
Block a user