2018-11-07 14:33:56 +01:00
|
|
|
import Contract from "web3-eth-contract"
|
|
|
|
import ContractHandler from "../../src/keeper/ContractHandler"
|
|
|
|
import Web3Provider from "../../src/keeper/Web3Provider"
|
|
|
|
import Logger from "../../src/utils/Logger"
|
2019-03-21 02:56:58 +01:00
|
|
|
import config from "../config"
|
2018-11-07 14:33:56 +01:00
|
|
|
|
|
|
|
export default class TestContractHandler extends ContractHandler {
|
|
|
|
|
2019-03-21 02:56:58 +01:00
|
|
|
private static networkId: number
|
2018-11-07 14:33:56 +01:00
|
|
|
|
2019-03-21 02:56:58 +01:00
|
|
|
public static async prepareContracts() {
|
|
|
|
const web3 = Web3Provider.getWeb3(config)
|
2018-11-07 14:33:56 +01:00
|
|
|
const deployerAddress = (await web3.eth.getAccounts())[0]
|
2019-03-21 02:56:58 +01:00
|
|
|
this.networkId = await web3.eth.net.getId()
|
2018-11-07 14:33:56 +01:00
|
|
|
|
|
|
|
// deploy contracts
|
|
|
|
await TestContractHandler.deployContracts(deployerAddress)
|
|
|
|
}
|
|
|
|
|
|
|
|
private static async deployContracts(deployerAddress: string) {
|
|
|
|
Logger.log("Trying to deploy contracts")
|
|
|
|
|
2019-03-06 15:33:10 +01:00
|
|
|
// Libraries
|
|
|
|
const epochLibrary = await TestContractHandler.deployContract("EpochLibrary", deployerAddress)
|
|
|
|
const didRegistryLibrary = await TestContractHandler.deployContract("DIDRegistryLibrary", deployerAddress)
|
|
|
|
|
|
|
|
// Contracts
|
2019-03-07 15:52:40 +01:00
|
|
|
const token = await TestContractHandler.deployContract("OceanToken", deployerAddress, [deployerAddress, deployerAddress])
|
2019-01-30 11:26:24 +01:00
|
|
|
|
|
|
|
const dispenser = await TestContractHandler.deployContract("Dispenser", deployerAddress, [token.options.address, deployerAddress])
|
|
|
|
|
|
|
|
// Add dispenser as Token minter
|
2019-03-07 15:52:40 +01:00
|
|
|
if (!token.$initialized) {
|
|
|
|
await token.methods.addMinter(dispenser.options.address)
|
|
|
|
.send({from: deployerAddress})
|
|
|
|
}
|
2019-03-06 15:33:10 +01:00
|
|
|
|
|
|
|
const didRegistry = await TestContractHandler.deployContract("DIDRegistry", deployerAddress, [deployerAddress], {
|
|
|
|
DIDRegistryLibrary: didRegistryLibrary.options.address,
|
|
|
|
})
|
|
|
|
|
|
|
|
// Managers
|
|
|
|
const templateStoreManager = await TestContractHandler.deployContract("TemplateStoreManager", deployerAddress, [
|
|
|
|
deployerAddress,
|
|
|
|
])
|
|
|
|
const conditionStoreManager = await TestContractHandler.deployContract("ConditionStoreManager", deployerAddress, [
|
|
|
|
deployerAddress,
|
|
|
|
], {
|
|
|
|
EpochLibrary: epochLibrary.options.address,
|
|
|
|
})
|
|
|
|
const agreementStoreManager = await TestContractHandler.deployContract("AgreementStoreManager", deployerAddress, [
|
|
|
|
deployerAddress, conditionStoreManager.options.address, templateStoreManager.options.address, didRegistry.options.address,
|
|
|
|
])
|
|
|
|
|
|
|
|
// Conditions
|
|
|
|
const lockRewardCondition = await TestContractHandler.deployContract("LockRewardCondition", deployerAddress, [
|
|
|
|
deployerAddress, conditionStoreManager.options.address, token.options.address,
|
|
|
|
])
|
|
|
|
const accessSecretStoreCondition = await TestContractHandler.deployContract("AccessSecretStoreCondition", deployerAddress, [
|
|
|
|
deployerAddress, conditionStoreManager.options.address, agreementStoreManager.options.address,
|
|
|
|
])
|
|
|
|
|
|
|
|
// Conditions rewards
|
|
|
|
const escrowReward = await TestContractHandler.deployContract("EscrowReward", deployerAddress, [
|
|
|
|
deployerAddress, conditionStoreManager.options.address, token.options.address,
|
|
|
|
])
|
|
|
|
|
|
|
|
// Templates
|
|
|
|
await TestContractHandler.deployContract("EscrowAccessSecretStoreTemplate", deployerAddress, [
|
|
|
|
deployerAddress,
|
|
|
|
agreementStoreManager.options.address,
|
|
|
|
didRegistry.options.address,
|
|
|
|
accessSecretStoreCondition.options.address,
|
|
|
|
lockRewardCondition.options.address,
|
|
|
|
escrowReward.options.address,
|
|
|
|
])
|
2018-11-07 14:33:56 +01:00
|
|
|
}
|
|
|
|
|
2019-03-06 15:33:10 +01:00
|
|
|
private static async deployContract(
|
|
|
|
name: string,
|
|
|
|
from: string,
|
|
|
|
args: any[] = [],
|
|
|
|
tokens: {[name: string]: string} = {},
|
2019-03-07 15:52:40 +01:00
|
|
|
): Promise<Contract & {$initialized: boolean}> {
|
2019-03-21 02:56:58 +01:00
|
|
|
const where = this.networkId
|
2018-11-07 14:33:56 +01:00
|
|
|
|
|
|
|
// dont redeploy if there is already something loaded
|
2019-03-21 02:56:58 +01:00
|
|
|
if (TestContractHandler.hasContract(name, where)) {
|
|
|
|
const contract = await ContractHandler.getContract(name, where)
|
|
|
|
if (contract.testContract) {
|
|
|
|
return {...contract, $initialized: true}
|
|
|
|
}
|
2018-11-07 14:33:56 +01:00
|
|
|
}
|
|
|
|
|
2019-03-21 02:56:58 +01:00
|
|
|
const web3 = Web3Provider.getWeb3(config)
|
2018-11-07 14:33:56 +01:00
|
|
|
|
|
|
|
let contractInstance: Contract
|
|
|
|
try {
|
|
|
|
Logger.log("Deploying", name)
|
2019-01-30 11:26:24 +01:00
|
|
|
const sendConfig = {
|
2018-11-07 14:33:56 +01:00
|
|
|
from,
|
|
|
|
gas: 3000000,
|
|
|
|
gasPrice: 10000000000,
|
2019-01-30 11:26:24 +01:00
|
|
|
}
|
|
|
|
const artifact = require(`@oceanprotocol/keeper-contracts/artifacts/${name}.development.json`)
|
|
|
|
const tempContract = new web3.eth.Contract(artifact.abi, artifact.address)
|
|
|
|
const isZos = !!tempContract.methods.initialize
|
2019-03-06 15:33:10 +01:00
|
|
|
|
|
|
|
Logger.debug({
|
|
|
|
name, from, isZos, args,
|
|
|
|
libraries: artifact.bytecode
|
|
|
|
.replace(/(0x)?[a-f0-9]{8}/gi, "")
|
|
|
|
.replace(/__([^_]+)_*[0-9a-f]{2}/g, "|$1")
|
|
|
|
.split("|")
|
|
|
|
.splice(1),
|
|
|
|
})
|
|
|
|
|
2019-01-30 11:26:24 +01:00
|
|
|
contractInstance = await tempContract
|
|
|
|
.deploy({
|
2019-03-06 15:33:10 +01:00
|
|
|
data: TestContractHandler.replaceTokens(artifact.bytecode.toString(), tokens),
|
2019-01-30 11:26:24 +01:00
|
|
|
arguments: isZos ? undefined : args,
|
|
|
|
})
|
|
|
|
.send(sendConfig)
|
|
|
|
if (isZos) {
|
|
|
|
await contractInstance.methods.initialize(...args).send(sendConfig)
|
|
|
|
}
|
2019-03-21 02:56:58 +01:00
|
|
|
contractInstance.testContract = true
|
|
|
|
ContractHandler.setContract(name, where, contractInstance)
|
2018-11-07 14:33:56 +01:00
|
|
|
// Logger.log("Deployed", name, "at", contractInstance.options.address);
|
|
|
|
} catch (err) {
|
2019-01-30 11:26:24 +01:00
|
|
|
Logger.error("Deployment failed for", name, "with args", JSON.stringify(args, null, 2), err.message)
|
2018-11-07 14:33:56 +01:00
|
|
|
throw err
|
|
|
|
}
|
|
|
|
|
|
|
|
return contractInstance
|
|
|
|
}
|
2019-03-06 15:33:10 +01:00
|
|
|
|
|
|
|
private static replaceTokens(bytecode: string, tokens: {[name: string]: string}): string {
|
|
|
|
return Object.entries(tokens)
|
|
|
|
.reduce(
|
|
|
|
(acc, [token, address]) => acc.replace(new RegExp(`_+${token}_+`, "g"), address.substr(2)),
|
|
|
|
bytecode,
|
|
|
|
)
|
|
|
|
}
|
2018-11-07 14:33:56 +01:00
|
|
|
}
|