@melonproject/protocol
Version:
Technology Regulated and Operated Investment Funds
228 lines (227 loc) • 11.3 kB
JavaScript
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const Environment_1 = require("../../../utils/environment/Environment");
const getContract_1 = require("../../../utils/solidity/getContract");
const deployContract_1 = require("../../../utils/solidity/deployContract");
const Contracts_1 = require("../../../Contracts");
/* eslint no-bitwise: ["error", { "allow": ["&"] }] */
function bytesToHex(byteArray) {
const strNum = Array.from(byteArray, (byte) => `0${(byte & 0xff).toString(16)}`.slice(-2)).join('');
const num = `0x${strNum}`;
return num;
}
exports.deployKyberEnvironment = (environment, tokens) => __awaiter(this, void 0, void 0, function* () {
const debug = environment.logger('melon:protocol:exchanges:deploy-kyber', Environment_1.LogLevels.DEBUG);
const deployer = environment.wallet.address.toString();
// const address = await deployContract(
// 'KyberNetwork.sol',
// [],
// environment,
// );
// return address;
// const opts = {
// from: deployer,
// gas: 8000000,
// gasPrice: 10,
// };
const [mlnToken, eurToken] = tokens;
const minimalRecordResolution = 2;
const maxPerBlockImbalance = new bignumber_js_1.default(Math.pow(10, 29)).toFixed();
const validRateDurationInBlocks = 500;
const precisionUnits = new bignumber_js_1.default(10).pow(18).toFixed();
const maxTotalImbalance = new bignumber_js_1.default(maxPerBlockImbalance)
.mul(12)
.toFixed();
// base buy and sell rates (prices)
const baseBuyRate1 = [];
const baseSellRate1 = [];
// compact data.
const sells = [bytesToHex(0)];
const buys = [bytesToHex(0)];
const indices = [0];
const conversionRates = getContract_1.getContract(environment, Contracts_1.Contracts.ConversionRates, yield deployContract_1.deployContract(environment, Contracts_1.Contracts.ConversionRates, [deployer]));
const kgtTokenAddress = yield deployContract_1.deployContract(environment, 'TestToken', [
'KGT',
'KGT',
18,
]);
const kyberNetworkContract = getContract_1.getContract(environment, Contracts_1.Contracts.KyberNetwork, yield deployContract_1.deployContract(environment, Contracts_1.Contracts.KyberNetwork, [deployer]));
yield conversionRates.methods
.setValidRateDurationInBlocks(validRateDurationInBlocks)
.send({ from: deployer, gas: 8000000 });
yield conversionRates.methods
.addToken(mlnToken.address)
.send({ from: deployer, gas: 8000000 });
yield conversionRates.methods
.setTokenControlInfo(mlnToken.address, minimalRecordResolution, maxPerBlockImbalance, maxTotalImbalance)
.send({ from: deployer, gas: 8000000 });
yield conversionRates.methods
.enableTokenTrade(mlnToken.address)
.send({ from: deployer, gas: 8000000 });
const kyberReserveContract = getContract_1.getContract(environment, Contracts_1.Contracts.KyberReserve, yield deployContract_1.deployContract(environment, Contracts_1.Contracts.KyberReserve, [
kyberNetworkContract.options.address,
conversionRates.options.address,
deployer,
]));
yield conversionRates.methods
.setReserveAddress(kyberReserveContract.options.address)
.send({ from: deployer, gas: 8000000 });
yield kyberNetworkContract.methods
.addReserve(kyberReserveContract.options.address, true)
.send({ from: deployer, gas: 8000000 });
yield kyberReserveContract.methods
.approveWithdrawAddress(mlnToken.address, deployer, true)
.send({ from: deployer, gas: 8000000 });
yield kyberReserveContract.methods
.enableTrade()
.send({ from: deployer, gas: 8000000 });
const mlnTokenContract = getContract_1.getContract(environment, Contracts_1.Contracts.PreminedToken, mlnToken.address);
// Set pricing for Token
yield mlnTokenContract.methods
.transfer(kyberReserveContract.options.address, new bignumber_js_1.default(Math.pow(10, 23)).toFixed())
.send({ from: deployer, gas: 8000000 });
const mlnPrice = new bignumber_js_1.default(Math.pow(10, 18)); // Arbritrary for now
const ethersPerToken = mlnPrice.toFixed();
const tokensPerEther = new bignumber_js_1.default(precisionUnits)
.mul(precisionUnits)
.div(ethersPerToken)
.toFixed(0);
baseBuyRate1.push(tokensPerEther);
baseSellRate1.push(ethersPerToken);
const currentBlock = yield environment.eth.getBlockNumber();
yield conversionRates.methods
.addOperator(deployer)
.send({ from: deployer, gas: 8000000 });
debug('setBaseRate', [
[mlnToken.address],
baseBuyRate1,
baseSellRate1,
buys,
sells,
currentBlock,
indices,
]);
yield conversionRates.methods
.setBaseRate([mlnToken.address], baseBuyRate1, baseSellRate1, buys, sells, currentBlock, indices)
.send({ from: deployer, gas: 8000000 });
yield conversionRates.methods
.setQtyStepFunction(mlnToken.address, [0], [0], [0], [0])
.send({ from: deployer, gas: 8000000 });
yield conversionRates.methods
.setImbalanceStepFunction(mlnToken.address, [0], [0], [0], [0])
.send({ from: deployer, gas: 8000000 });
const kyberWhiteListContract = getContract_1.getContract(environment, Contracts_1.Contracts.KyberWhiteList, yield deployContract_1.deployContract(environment, Contracts_1.Contracts.KyberWhiteList, [
deployer,
kgtTokenAddress.toString(),
]));
yield kyberWhiteListContract.methods
.addOperator(deployer)
.send({ from: deployer, gas: 8000000 });
yield kyberWhiteListContract.methods
.setCategoryCap(0, new bignumber_js_1.default(Math.pow(10, 28)).toFixed())
.send({ from: deployer, gas: 8000000 });
yield kyberWhiteListContract.methods
.setSgdToEthRate(30000)
.send({ from: deployer, gas: 8000000 });
const feeBurnerAddress = yield deployContract_1.deployContract(environment, 'FeeBurner', [
deployer,
mlnToken.address,
kyberNetworkContract.options.address,
]);
const expectedRateAddress = yield deployContract_1.deployContract(environment, 'ExpectedRate', [kyberNetworkContract.options.address, deployer]);
yield environment.eth.sendTransaction({
from: deployer,
to: kyberReserveContract.options.address,
value: new bignumber_js_1.default(Math.pow(10, 22)),
});
yield kyberReserveContract.methods
.setContracts(kyberNetworkContract.options.address, conversionRates.options.address, '0x0000000000000000000000000000000000000000')
.send({ from: deployer, gas: 8000000 });
const kyberNetworkProxyContract = getContract_1.getContract(environment, Contracts_1.Contracts.KyberNetworkProxy, yield deployContract_1.deployContract(environment, Contracts_1.Contracts.KyberNetworkProxy, [deployer]));
yield kyberNetworkProxyContract.methods
.setKyberNetworkContract(kyberNetworkContract.options.address)
.send({ from: deployer, gas: 8000000 });
yield kyberNetworkContract.methods
.setWhiteList(kyberWhiteListContract.options.address)
.send({ from: deployer, gas: 8000000 });
yield kyberNetworkContract.methods
.setExpectedRate(expectedRateAddress.toString())
.send({ from: deployer, gas: 8000000 });
yield kyberNetworkContract.methods
.setFeeBurner(feeBurnerAddress.toString())
.send({ from: deployer, gas: 8000000 });
yield kyberNetworkContract.methods
.setKyberProxy(kyberNetworkProxyContract.options.address)
.send({ from: deployer, gas: 8000000 });
yield kyberNetworkContract.methods
.setEnable(true)
.send({ from: deployer, gas: 8000000 });
yield kyberNetworkContract.methods
.listPairForReserve(kyberReserveContract.options.address, mlnToken.address.toString(), true, true, true)
.send({ from: deployer, gas: 8000000 });
// // Add Eur Token
const eurTokenContract = getContract_1.getContract(environment, Contracts_1.Contracts.PreminedToken, eurToken.address);
yield conversionRates.methods
.addToken(eurToken.address)
.send({ from: deployer, gas: 8000000 });
yield conversionRates.methods
.setTokenControlInfo(eurToken.address, minimalRecordResolution, maxPerBlockImbalance, maxTotalImbalance)
.send({ from: deployer, gas: 8000000 });
yield conversionRates.methods
.enableTokenTrade(eurToken.address)
.send({ from: deployer, gas: 8000000 });
yield kyberReserveContract.methods
.approveWithdrawAddress(eurToken.address, deployer, true)
.send({ from: deployer, gas: 8000000 });
yield eurTokenContract.methods
.transfer(kyberReserveContract.options.address, new bignumber_js_1.default(Math.pow(10, 23)).toFixed())
.send({ from: deployer, gas: 8000000 });
const eurPrice = new bignumber_js_1.default(Math.pow(10, 18)); // Arbritrary for now
const ethersPerEurToken = eurPrice.toFixed();
const eurTokensPerEther = new bignumber_js_1.default(precisionUnits)
.mul(precisionUnits)
.div(ethersPerEurToken)
.toFixed(0);
yield conversionRates.methods
.setBaseRate([eurToken.address], [eurTokensPerEther], [ethersPerEurToken], buys, sells, currentBlock, indices)
.send({ from: deployer, gas: 8000000 });
yield conversionRates.methods
.setQtyStepFunction(eurToken.address, [0], [0], [0], [0])
.send({ from: deployer, gas: 8000000 });
yield conversionRates.methods
.setImbalanceStepFunction(eurToken.address, [0], [0], [0], [0])
.send({ from: deployer, gas: 8000000 });
yield kyberNetworkContract.methods
.listPairForReserve(kyberReserveContract.options.address, eurToken.address, true, true, true)
.send({ from: deployer, gas: 8000000 });
// TODO
// await governanceAction(
// { from: deployer },
// Governance,
// canonicalPriceFeed,
// "registerExchange",
// [
// KyberNetworkProxy.options.address,
// KyberAdapter.options.address,
// true,
// [takeOrderSignature],
// ],
// );
return {
conversionRates: conversionRates.options.address,
kyberNetwork: kyberNetworkContract.options.address,
kyberNetworkProxy: kyberNetworkProxyContract.options.address,
};
});