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

add minter roles (#600)

This commit is contained in:
Alex Coseru 2021-02-10 19:35:04 +02:00 committed by GitHub
parent 2c32205ede
commit 8cc1ef3e37
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 104 additions and 0 deletions

View File

@ -498,4 +498,82 @@ export class DataTokens {
const topic = this.web3.eth.abi.encodeEventSignature(eventdata as any) const topic = this.web3.eth.abi.encodeEventSignature(eventdata as any)
return topic return topic
} }
/**
* Purpose a new minter
* @param {String} dataTokenAddress
* @param {String} newMinter
* @param {String} address - only current minter can call this
* @return {Promise<string>} transactionId
*/
public async proposeMinter(
dataTokenAddress: string,
newMinterAddress: string,
address: string
): Promise<string> {
const datatoken = new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress, {
from: address
})
const gasLimitDefault = this.GASLIMIT_DEFAULT
let estGas
try {
estGas = await datatoken.methods
.proposeMinter(newMinterAddress)
.estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))
} catch (e) {
estGas = gasLimitDefault
}
try {
const trxReceipt = await datatoken.methods.proposeMinter(newMinterAddress).send({
from: address,
gas: estGas + 1,
gasPrice: await getFairGasPrice(this.web3)
})
return trxReceipt
} catch (e) {
return null
}
}
/**
* Approve minter role
* @param {String} dataTokenAddress
* @param {String} address - only proposad minter can call this
* @return {Promise<string>} transactionId
*/
public async approveMinter(dataTokenAddress: string, address: string): Promise<string> {
const datatoken = new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress, {
from: address
})
const gasLimitDefault = this.GASLIMIT_DEFAULT
let estGas
try {
estGas = await datatoken.methods
.approveMinter()
.estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))
} catch (e) {
estGas = gasLimitDefault
}
try {
const trxReceipt = await datatoken.methods.approveMinter().send({
from: address,
gas: estGas + 1,
gasPrice: await getFairGasPrice(this.web3)
})
return trxReceipt
} catch (e) {
return null
}
}
/** Check if an address has the minter role
* @param {String} dataTokenAddress
* * @param {String} address
* @return {Promise<string>} string
*/
public async isMinter(dataTokenAddress: string, address: string): Promise<boolean> {
const datatoken = new this.web3.eth.Contract(this.datatokensABI, dataTokenAddress)
const trxReceipt = await datatoken.methods.isMinter(address).call()
return trxReceipt
}
} }

View File

@ -11,6 +11,7 @@ const web3 = new Web3('http://127.0.0.1:8545')
describe('DataTokens', () => { describe('DataTokens', () => {
let minter: string let minter: string
let newMinter: string
let spender: string let spender: string
let balance: string let balance: string
let contracts: TestContractHandler let contracts: TestContractHandler
@ -30,6 +31,7 @@ describe('DataTokens', () => {
await contracts.getAccounts() await contracts.getAccounts()
minter = contracts.accounts[0] minter = contracts.accounts[0]
spender = contracts.accounts[1] spender = contracts.accounts[1]
newMinter = contracts.accounts[2]
await contracts.deployContracts(minter) await contracts.deployContracts(minter)
}) })
@ -90,4 +92,28 @@ describe('DataTokens', () => {
balance = await datatoken.balance(tokenAddress, minter) balance = await datatoken.balance(tokenAddress, minter)
assert(balance === tokenAmount) assert(balance === tokenAmount)
}) })
it('should check if it has the minter role', async () => {
const isMinter = await datatoken.isMinter(tokenAddress, minter)
assert(isMinter === true)
})
it('should propose a new minter', async () => {
const tx = await datatoken.proposeMinter(tokenAddress, newMinter, minter)
assert(tx !== null)
})
it('should new minter accept the new role', async () => {
const tx = await datatoken.approveMinter(tokenAddress, newMinter)
assert(tx !== null)
})
it('should check if it does not have the minter role any more', async () => {
const isMinter = await datatoken.isMinter(tokenAddress, minter)
assert(isMinter === false)
})
it('newMinter should check if it has the minter role', async () => {
const isMinter = await datatoken.isMinter(tokenAddress, newMinter)
assert(isMinter === true)
})
}) })