mirror of
https://github.com/oceanprotocol/ocean.js.git
synced 2024-11-26 20:39:05 +01:00
add initial ERC721Factory class, add initial TestContractHandler
This commit is contained in:
parent
252eca12e4
commit
9cda532da6
@ -1,9 +1,14 @@
|
|||||||
import { Contract } from 'web3-eth-contract'
|
import { Contract } from 'web3-eth-contract'
|
||||||
import Web3 from 'web3'
|
import Web3 from 'web3'
|
||||||
|
import { TransactionReceipt } from 'web3-core'
|
||||||
import { AbiItem } from 'web3-utils'
|
import { AbiItem } from 'web3-utils'
|
||||||
import defaultFactory721ABI from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json'
|
import defaultFactory721ABI from '@oceanprotocol/contracts/artifacts/contracts/ERC721Factory.sol/ERC721Factory.json'
|
||||||
import { Logger, getFairGasPrice, generateDtName } from '../utils'
|
import { Logger, getFairGasPrice, generateDtName } from '../utils'
|
||||||
|
|
||||||
|
interface Template {
|
||||||
|
templateAddress: string
|
||||||
|
isActive: boolean
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Provides an interface for NFT DataTokens
|
* Provides an interface for NFT DataTokens
|
||||||
*/
|
*/
|
||||||
@ -88,4 +93,278 @@ export class NFTFactory {
|
|||||||
}
|
}
|
||||||
return tokenAddress
|
return tokenAddress
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Get Current NFT Count (NFT created)
|
||||||
|
* @return {Promise<number>} Number of NFT created from this factory
|
||||||
|
*/
|
||||||
|
public async getCurrentNFTCount(): Promise<number> {
|
||||||
|
const trxReceipt = await this.factory721.methods.getCurrentNFTCount().call()
|
||||||
|
return trxReceipt
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get Current Datatoken Count
|
||||||
|
* @return {Promise<number>} Number of DTs created from this factory
|
||||||
|
*/
|
||||||
|
public async getCurrentTokenCount(): Promise<number> {
|
||||||
|
const trxReceipt = await this.factory721.methods.getCurrentTokenCount().call()
|
||||||
|
return trxReceipt
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get Factory Owner
|
||||||
|
* @return {Promise<string>} Factory Owner address
|
||||||
|
*/
|
||||||
|
public async getOwner(): Promise<string> {
|
||||||
|
const trxReceipt = await this.factory721.methods.owner().call()
|
||||||
|
return trxReceipt
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get Current NFT Template Count
|
||||||
|
* @return {Promise<number>} Number of NFT Template added to this factory
|
||||||
|
*/
|
||||||
|
public async getCurrentNFTTemplateCount(): Promise<number> {
|
||||||
|
const count = await this.factory721.methods.getCurrentNFTTemplateCount().call()
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get Current Template Datatoken (ERC20) Count
|
||||||
|
* @return {Promise<number>} Number of ERC20 Template added to this factory
|
||||||
|
*/
|
||||||
|
public async getCurrentTokenTemplateCount(): Promise<number> {
|
||||||
|
const count = await this.factory721.methods.getCurrentTokenTemplateCount().call()
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get NFT Template
|
||||||
|
* @param {Number} index Template index
|
||||||
|
* @return {Promise<Template>} Number of Template added to this factory
|
||||||
|
*/
|
||||||
|
public async getNFTTemplate(index: number): Promise<Template> {
|
||||||
|
const template = await this.factory721.methods.getNFTTemplate(index).call()
|
||||||
|
return template
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get Datatoken(erc20) Template
|
||||||
|
* @param {Number} index Template index
|
||||||
|
* @return {Promise<Template>} DT Template info
|
||||||
|
*/
|
||||||
|
public async getTokenTemplate(index: number): Promise<Template> {
|
||||||
|
const template = await this.factory721.methods.getTokenTemplate(index).call()
|
||||||
|
return template
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new erc721 token template - only factory Owner
|
||||||
|
* @param {String} address
|
||||||
|
* @param {String} templateAddress template address to add
|
||||||
|
* @return {Promise<TransactionReceipt>}
|
||||||
|
*/
|
||||||
|
public async addNFTTemplate(
|
||||||
|
address: string,
|
||||||
|
templateAddress: string
|
||||||
|
): Promise<TransactionReceipt> {
|
||||||
|
if ((await this.getOwner()) != address) {
|
||||||
|
throw new Error(`Caller is not Factory Owner`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const gasLimitDefault = this.GASLIMIT_DEFAULT
|
||||||
|
let estGas
|
||||||
|
try {
|
||||||
|
estGas = await this.factory721.methods
|
||||||
|
.add721TokenTemplate(templateAddress)
|
||||||
|
.estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))
|
||||||
|
} catch (e) {
|
||||||
|
estGas = gasLimitDefault
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invoke createToken function of the contract
|
||||||
|
const trxReceipt = await this.factory721.methods
|
||||||
|
.add721TokenTemplate(templateAddress)
|
||||||
|
.send({
|
||||||
|
from: address,
|
||||||
|
gas: estGas + 1,
|
||||||
|
gasPrice: await getFairGasPrice(this.web3)
|
||||||
|
})
|
||||||
|
|
||||||
|
return trxReceipt
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable token template - only factory Owner
|
||||||
|
* @param {String} address
|
||||||
|
* @param {Number} templateIndex index of the template we want to disable
|
||||||
|
* @return {Promise<TransactionReceipt>} current token template count
|
||||||
|
*/
|
||||||
|
public async disableNFTTemplate(
|
||||||
|
address: string,
|
||||||
|
templateIndex: number
|
||||||
|
): Promise<TransactionReceipt> {
|
||||||
|
if ((await this.getOwner()) != address) {
|
||||||
|
throw new Error(`Caller is not Factory Owner`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const gasLimitDefault = this.GASLIMIT_DEFAULT
|
||||||
|
let estGas
|
||||||
|
try {
|
||||||
|
estGas = await this.factory721.methods
|
||||||
|
.disable721TokenTemplate(templateIndex)
|
||||||
|
.estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))
|
||||||
|
} catch (e) {
|
||||||
|
estGas = gasLimitDefault
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invoke createToken function of the contract
|
||||||
|
const trxReceipt = await this.factory721.methods
|
||||||
|
.disable721TokenTemplate(templateIndex)
|
||||||
|
.send({
|
||||||
|
from: address,
|
||||||
|
gas: estGas + 1,
|
||||||
|
gasPrice: await getFairGasPrice(this.web3)
|
||||||
|
})
|
||||||
|
|
||||||
|
return trxReceipt
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reactivate a previously disabled token template - only factory Owner
|
||||||
|
* @param {String} address
|
||||||
|
* @param {Number} templateIndex index of the template we want to reactivate
|
||||||
|
* @return {Promise<TransactionReceipt>} current token template count
|
||||||
|
*/
|
||||||
|
public async reactivateNFTTemplate(
|
||||||
|
address: string,
|
||||||
|
templateIndex: number
|
||||||
|
): Promise<TransactionReceipt> {
|
||||||
|
if ((await this.getOwner()) != address) {
|
||||||
|
throw new Error(`Caller is not Factory Owner`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const gasLimitDefault = this.GASLIMIT_DEFAULT
|
||||||
|
let estGas
|
||||||
|
try {
|
||||||
|
estGas = await this.factory721.methods
|
||||||
|
.reactivate721TokenTemplate(templateIndex)
|
||||||
|
.estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))
|
||||||
|
} catch (e) {
|
||||||
|
estGas = gasLimitDefault
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invoke createToken function of the contract
|
||||||
|
const trxReceipt = await this.factory721.methods
|
||||||
|
.reactivate721TokenTemplate(templateIndex)
|
||||||
|
.send({
|
||||||
|
from: address,
|
||||||
|
gas: estGas + 1,
|
||||||
|
gasPrice: await getFairGasPrice(this.web3)
|
||||||
|
})
|
||||||
|
|
||||||
|
return trxReceipt
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new erc721 token template - only factory Owner
|
||||||
|
* @param {String} address
|
||||||
|
* @param {String} templateAddress template address to add
|
||||||
|
* @return {Promise<TransactionReceipt>}
|
||||||
|
*/
|
||||||
|
public async addTokenTemplate(
|
||||||
|
address: string,
|
||||||
|
templateAddress: string
|
||||||
|
): Promise<TransactionReceipt> {
|
||||||
|
if ((await this.getOwner()) != address) {
|
||||||
|
throw new Error(`Caller is not Factory Owner`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const gasLimitDefault = this.GASLIMIT_DEFAULT
|
||||||
|
let estGas
|
||||||
|
try {
|
||||||
|
estGas = await this.factory721.methods
|
||||||
|
.addTokenTemplate(templateAddress)
|
||||||
|
.estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))
|
||||||
|
} catch (e) {
|
||||||
|
estGas = gasLimitDefault
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invoke createToken function of the contract
|
||||||
|
const trxReceipt = await this.factory721.methods
|
||||||
|
.addTokenTemplate(templateAddress)
|
||||||
|
.send({
|
||||||
|
from: address,
|
||||||
|
gas: estGas + 1,
|
||||||
|
gasPrice: await getFairGasPrice(this.web3)
|
||||||
|
})
|
||||||
|
|
||||||
|
return trxReceipt
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Disable token template - only factory Owner
|
||||||
|
* @param {String} address
|
||||||
|
* @param {Number} templateIndex index of the template we want to disable
|
||||||
|
* @return {Promise<TransactionReceipt>} current token template count
|
||||||
|
*/
|
||||||
|
public async disableTokenTemplate(
|
||||||
|
address: string,
|
||||||
|
templateIndex: number
|
||||||
|
): Promise<TransactionReceipt> {
|
||||||
|
if ((await this.getOwner()) != address) {
|
||||||
|
throw new Error(`Caller is not Factory Owner`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const gasLimitDefault = this.GASLIMIT_DEFAULT
|
||||||
|
let estGas
|
||||||
|
try {
|
||||||
|
estGas = await this.factory721.methods
|
||||||
|
.disableTokenTemplate(templateIndex)
|
||||||
|
.estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))
|
||||||
|
} catch (e) {
|
||||||
|
estGas = gasLimitDefault
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invoke createToken function of the contract
|
||||||
|
const trxReceipt = await this.factory721.methods
|
||||||
|
.disableTokenTemplate(templateIndex)
|
||||||
|
.send({
|
||||||
|
from: address,
|
||||||
|
gas: estGas + 1,
|
||||||
|
gasPrice: await getFairGasPrice(this.web3)
|
||||||
|
})
|
||||||
|
|
||||||
|
return trxReceipt
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reactivate a previously disabled token template - only factory Owner
|
||||||
|
* @param {String} address
|
||||||
|
* @param {Number} templateIndex index of the template we want to reactivate
|
||||||
|
* @return {Promise<TransactionReceipt>} current token template count
|
||||||
|
*/
|
||||||
|
public async reactivateTokenTemplate(
|
||||||
|
address: string,
|
||||||
|
templateIndex: number
|
||||||
|
): Promise<TransactionReceipt> {
|
||||||
|
if ((await this.getOwner()) != address) {
|
||||||
|
throw new Error(`Caller is not Factory Owner`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const gasLimitDefault = this.GASLIMIT_DEFAULT
|
||||||
|
let estGas
|
||||||
|
try {
|
||||||
|
estGas = await this.factory721.methods
|
||||||
|
.reactivateTokenTemplate(templateIndex)
|
||||||
|
.estimateGas({ from: address }, (err, estGas) => (err ? gasLimitDefault : estGas))
|
||||||
|
} catch (e) {
|
||||||
|
estGas = gasLimitDefault
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invoke createToken function of the contract
|
||||||
|
const trxReceipt = await this.factory721.methods
|
||||||
|
.reactivateTokenTemplate(templateIndex)
|
||||||
|
.send({
|
||||||
|
from: address,
|
||||||
|
gas: estGas + 1,
|
||||||
|
gasPrice: await getFairGasPrice(this.web3)
|
||||||
|
})
|
||||||
|
|
||||||
|
return trxReceipt
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
127
test/TestContractHandler.ts
Normal file
127
test/TestContractHandler.ts
Normal file
@ -0,0 +1,127 @@
|
|||||||
|
import Web3 from 'web3'
|
||||||
|
import { Contract } from 'web3-eth-contract'
|
||||||
|
import { AbiItem } from 'web3-utils/types'
|
||||||
|
|
||||||
|
const communityCollector = '0xeE9300b7961e0a01d9f0adb863C7A227A07AaD75'
|
||||||
|
|
||||||
|
export class TestContractHandler {
|
||||||
|
public accounts: string[]
|
||||||
|
public ERC721Factory: Contract
|
||||||
|
public ERC20Template: Contract
|
||||||
|
public ERC721Template: Contract
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
public ERC721FactoryBytecode: string
|
||||||
|
public ERC20TemplateBytecode: string
|
||||||
|
public ERC721TemplateBytecode: string
|
||||||
|
|
||||||
|
public factory721Address: string
|
||||||
|
public template721Address: string
|
||||||
|
public template20Address: string
|
||||||
|
public web3: Web3
|
||||||
|
|
||||||
|
constructor(
|
||||||
|
ERC721FactoryABI: AbiItem | AbiItem[],
|
||||||
|
ERC721TemplateABI: AbiItem | AbiItem[],
|
||||||
|
ERC20TemplateABI: AbiItem | AbiItem[],
|
||||||
|
factory721Bytecode: string,
|
||||||
|
template721Bytecode: string,
|
||||||
|
template20Bytecode: string,
|
||||||
|
web3: Web3
|
||||||
|
) {
|
||||||
|
this.web3 = web3
|
||||||
|
this.ERC721Factory = new this.web3.eth.Contract(ERC721FactoryABI)
|
||||||
|
this.ERC20Template = new this.web3.eth.Contract(ERC20TemplateABI)
|
||||||
|
this.ERC721Template = new this.web3.eth.Contract(ERC721TemplateABI)
|
||||||
|
|
||||||
|
this.ERC721FactoryBytecode = factory721Bytecode
|
||||||
|
this.ERC20TemplateBytecode = template20Bytecode
|
||||||
|
this.ERC721TemplateBytecode = template721Bytecode
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public async getAccounts(): Promise<string[]> {
|
||||||
|
this.accounts = await this.web3.eth.getAccounts()
|
||||||
|
return this.accounts
|
||||||
|
}
|
||||||
|
|
||||||
|
public async deployContracts(minter: string) {
|
||||||
|
let estGas
|
||||||
|
// console.log(this.ERC721TemplateBytecode)
|
||||||
|
// console.log(this.ERC20TemplateBytecode)
|
||||||
|
// DEPLOY ERC20 TEMPLATE
|
||||||
|
// get est gascost
|
||||||
|
estGas = await this.ERC20Template.deploy({
|
||||||
|
data: this.ERC20TemplateBytecode,
|
||||||
|
arguments: []
|
||||||
|
}).estimateGas(function (err, estGas) {
|
||||||
|
if (err) console.log('DeployContracts: ' + err)
|
||||||
|
return estGas
|
||||||
|
})
|
||||||
|
// deploy the contract and get it's address
|
||||||
|
this.template20Address = await this.ERC20Template.deploy({
|
||||||
|
data: this.ERC20TemplateBytecode,
|
||||||
|
arguments: []
|
||||||
|
})
|
||||||
|
.send({
|
||||||
|
from: minter,
|
||||||
|
gas: estGas + 1,
|
||||||
|
gasPrice: '3000000000'
|
||||||
|
})
|
||||||
|
.then(function (contract) {
|
||||||
|
return contract.options.address
|
||||||
|
})
|
||||||
|
|
||||||
|
// DEPLOY ERC721 TEMPLATE
|
||||||
|
// get est gascost
|
||||||
|
estGas = await this.ERC721Template.deploy({
|
||||||
|
data: this.ERC721TemplateBytecode,
|
||||||
|
arguments: []
|
||||||
|
}).estimateGas(function (err, estGas) {
|
||||||
|
if (err) console.log('DeployContracts: ' + err)
|
||||||
|
return estGas
|
||||||
|
})
|
||||||
|
// deploy the contract and get it's address
|
||||||
|
this.template721Address = await this.ERC721Template.deploy({
|
||||||
|
data: this.ERC721TemplateBytecode,
|
||||||
|
arguments: []
|
||||||
|
})
|
||||||
|
.send({
|
||||||
|
from: minter,
|
||||||
|
gas: estGas + 1,
|
||||||
|
gasPrice: '3000000000'
|
||||||
|
})
|
||||||
|
.then(function (contract) {
|
||||||
|
return contract.options.address
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// DEPLOY ERC721 FACTORY
|
||||||
|
estGas = await this.ERC721Factory.deploy({
|
||||||
|
data: this.ERC721FactoryBytecode,
|
||||||
|
arguments: [this.template721Address, communityCollector,this.factory20Address,this.metadataAddress]
|
||||||
|
}).estimateGas(function (err, estGas) {
|
||||||
|
if (err) console.log('DeployContracts: ' + err)
|
||||||
|
return estGas
|
||||||
|
})
|
||||||
|
// deploy the contract and get it's address
|
||||||
|
this.factory721Address = await this.ERC721Factory.deploy({
|
||||||
|
data: this.ERC721FactoryBytecode,
|
||||||
|
arguments: [this.template721Address,communityCollector,this.factory20Address,this.metadataAddress]
|
||||||
|
})
|
||||||
|
.send({
|
||||||
|
from: minter,
|
||||||
|
gas: estGas + 1,
|
||||||
|
gasPrice: '3000000000'
|
||||||
|
})
|
||||||
|
.then(function (contract) {
|
||||||
|
return contract.options.address
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// // TODO: SET ERC721 Factory address in ERC20 Factory
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user