Skip to content

Commit

Permalink
Merge pull request #51 from renproject/deployment
Browse files Browse the repository at this point in the history
Changes for deployment
  • Loading branch information
vinceau committed May 8, 2019
2 parents b6fc2de + 08ed225 commit d34bb9d
Show file tree
Hide file tree
Showing 7 changed files with 88 additions and 67 deletions.
12 changes: 6 additions & 6 deletions contracts/DarknodePayment/DarknodePayment.sol
Original file line number Diff line number Diff line change
Expand Up @@ -146,17 +146,17 @@ contract DarknodePayment is Ownable {
/// @param _darknodeRegistry The address of the DarknodeRegistry contract
/// @param _darknodePaymentStore The address of the DarknodePaymentStore
/// contract
/// @param _cycleDurationSecs The minimum time before a new cycle can occur in seconds
/// @param _cycleDurationSeconds The minimum time before a new cycle can occur in seconds
constructor(
string memory _VERSION,
DarknodeRegistry _darknodeRegistry,
DarknodePaymentStore _darknodePaymentStore,
uint256 _cycleDurationSecs
uint256 _cycleDurationSeconds
) public {
VERSION = _VERSION;
darknodeRegistry = _darknodeRegistry;
store = _darknodePaymentStore;
cycleDuration = _cycleDurationSecs;
cycleDuration = _cycleDurationSeconds;
// Default the blacklister to owner
blacklister = msg.sender;

Expand Down Expand Up @@ -312,11 +312,11 @@ contract DarknodePayment is Ownable {

/// @notice Updates cycle duration
///
/// @param _durationSecs The amount of time (in seconds) that should have
/// @param _durationSeconds The amount of time (in seconds) that should have
/// passed before a new cycle can be called.
function updateCycleDuration(uint256 _durationSecs) external onlyOwner {
function updateCycleDuration(uint256 _durationSeconds) external onlyOwner {
uint256 oldDuration = cycleDuration;
cycleDuration = _durationSecs;
cycleDuration = _durationSeconds;
emit LogCycleDurationChanged(cycleDuration, oldDuration);
}

Expand Down
34 changes: 25 additions & 9 deletions migrations/1_deploy_contracts.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,40 @@ const DarknodeSlasher = artifacts.require("DarknodeSlasher");

const config = require("./config.js");

module.exports = async function (deployer, network, accounts) {
module.exports = async function (deployer, network) {
deployer.logger.log(`Deploying to ${network}...`);

const VERSION_STRING = `${network}-${config.VERSION}`;

let tokens = new Map();

if (network.match("kovan")) {
if (network.match("mainnet")) {

// MAINNET!
RenToken.address = "0x408e41876cCCDC0F92210600ef50372656052a38";
DarknodeSlasher.address = "0x0000000000000000000000000000000000000000";
DarknodeRegistry.address = "0x34bd421C7948Bc16f826Fd99f9B785929b121633";
DarknodeRegistryStore.address = "0x06df0657ba5e8f5339e742212669f6e7ee3c5057";
DarknodePaymentStore.address = "0x731Ea4Ba77fF184d89dBeB160A0078274Acbe9D2";
DarknodePayment.address = "0x5a7802E66b067cB1770ee5b1165AA201690A8B6a";
tokens = new Map()
.set("DAI", "0x89d24A6b4CcB1B6fAA2625fE562bDD9a23260359")
.set("ETH", "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE");

} else if (network.match("kovan")) {

RenToken.address = "0x2cd647668494c1b15743ab283a0f980d90a87394";
DarknodeSlasher.address = "0x0000000000000000000000000000000000000000";
DarknodeRegistry.address = "0x1C6309618338D0EDf9a7Ea8eA18E060fD323020D";
DarknodeRegistryStore.address = "0x88e4477e4fdd677aee2dc9376471d45c198669fa";
DarknodePayment.address = "0xba8d77a48d24866be4b775e732f6f8d198f7ba26";
DarknodePaymentStore.address = "0xA9411C3AD1fBE168fd119A3B32fB481a0b9877A9";
DarknodePayment.address = "0x8E11B87547f4072CC8A094F2888201CAF4EA0B9e";
tokens = new Map()
.set("DAI", "0xc4375b7de8af5a38a93548eb8453a498222c4ff2")
.set("ETH", "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE")
.set("zBTC", "0x2a8368d2a983a0aeae8da0ebc5b7c03a0ea66b37")
.set("zZEC", "0xd67256552f93b39ac30083b4b679718a061feae6");

} else {
RenToken.address = "";
DarknodeSlasher.address = "";
Expand Down Expand Up @@ -131,11 +147,11 @@ module.exports = async function (deployer, network, accounts) {
deployer.logger.log("Linking DarknodePaymentStore and DarknodePayment")
// Initiate ownership transfer of DarknodePaymentStore

if (accounts.indexOf(currentOwner) >= 0) {
try {
await darknodePaymentStore.transferOwnership(DarknodePayment.address, {
from: currentOwner
});
} else {
} catch (error) {
const oldDarknodePayment = await DarknodePayment.at(currentOwner);
await oldDarknodePayment.transferStoreOwnership(DarknodePayment.address);
}
Expand All @@ -144,14 +160,14 @@ module.exports = async function (deployer, network, accounts) {
await darknodePayment.claimStoreOwnership();
}

if (new BN(await darknodePayment.cycleDuration()).toNumber() !== config.DARKNODE_PAYMENT_CYCLE_DURATION_SECS) {
deployer.logger.log(`Updating cycle duration to ${config.DARKNODE_PAYMENT_CYCLE_DURATION_SECS}`);
await darknodePayment.updateCycleDuration(config.DARKNODE_PAYMENT_CYCLE_DURATION_SECS);
if (new BN(await darknodePayment.cycleDuration()).toNumber() !== config.DARKNODE_PAYMENT_CYCLE_DURATION_SECONDS) {
deployer.logger.log(`Updating cycle duration to ${config.DARKNODE_PAYMENT_CYCLE_DURATION_SECONDS}`);
await darknodePayment.updateCycleDuration(config.DARKNODE_PAYMENT_CYCLE_DURATION_SECONDS);
}

if (changeCycle) {
try {
deployer.logger.log("Calling darknodePayment.changeCycle()");
deployer.logger.log("Attempting to change cycle");
await darknodePayment.changeCycle();
} catch (error) {
console.error("Unable to call darknodePayment.changeCycle()");
Expand Down
2 changes: 1 addition & 1 deletion migrations/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ module.exports = {
MINIMUM_BOND: new BN(100000).mul(new BN(10).pow(new BN(18))),
MINIMUM_POD_SIZE: 3, // 24 in production
MINIMUM_EPOCH_INTERVAL: 2, // 14400 in production
DARKNODE_PAYMENT_CYCLE_DURATION_SECS: 300, // (5 minutes in secs), 2628000 in production (1 month in secs)
DARKNODE_PAYMENT_CYCLE_DURATION_SECONDS: 300, // 300 for testnet (5 minutes in seconds), 86400 in mainnet testing (1 day), 2628000 in production (1 month in seconds)
}
14 changes: 8 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
"coverage:ts": "trap \"yarn run clean\" INT TERM; (yarn run bindings:ts && tsc && solidity-coverage) && yarn run clean",
"bindings:ts": "truffle compile && abi-gen --abis 'build/contracts/*.json' --output ./test-ts/typings/bindings --template './test-ts/typings/bindings/templates/contract.handlebars' --partials './test-ts/typings/bindings/templates/partials/*.handlebars' 1> /dev/null",
"bindings:go": "solc --allow-paths . --combined-json bin,abi,userdoc,devdoc,metadata contracts/**/*.sol | abigen -pkg bindings --out bindings.go --abi -",
"deployToKovan": "truffle migrate --network kovan && yarn run merge .merged/kovan",
"deployToKovan": "truffle migrate --skipDryRun --network kovan && yarn run merge .merged/kovan",
"deployToMainnet": "truffle migrate --skipDryRun --network mainnet && yarn run merge .merged/mainnet",
"coveralls": "cat ./coverage/lcov.info | coveralls"
},
"dependencies": {
Expand All @@ -24,7 +25,7 @@
"@types/chai-as-promised": "^7.1.0",
"@types/crypto-js": "^3.1.43",
"@types/mocha": "^5.2.6",
"@types/node": "^11.13.7",
"@types/node": "^12.0.0",
"any-promise": "^1.3.0",
"bignumber.js": "^8.1.1",
"bn.js": "^4.11.8",
Expand All @@ -33,14 +34,15 @@
"chai-bignumber": "git://github.com/negaex/chai-bignumber.git#master",
"coveralls": "^3.0.3",
"crypto-js": "^3.1.9-1",
"dotenv": "^7.0.0",
"eth-gas-reporter": "^0.1.12",
"dotenv": "^8.0.0",
"eth-gas-reporter": "^0.2.0",
"ganache-cli": "^6.4.3",
"js-sha3": "^0.8.0",
"postinstall-postinstall": "^2.0.0",
"sol-merger": "^0.1.3",
"solc": "^0.5.8",
"solidity-coverage": "github:rotcivegaf/solidity-coverage#5875f5b7bc74d447f3312c9c0e9fc7814b482477",
"truffle": "5.0.14",
"truffle": "5.0.15",
"truffle-hdwallet-provider": "1.0.8",
"tslint": "^5.16.0",
"typescript": "^3.4.5",
Expand All @@ -53,4 +55,4 @@
"resolutions": {
"solc": "^0.5.8"
}
}
}
26 changes: 13 additions & 13 deletions test-ts/DarknodePayment.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { ERC20Artifact, ERC20Contract } from "./typings/bindings/erc20";
import { RenTokenArtifact, RenTokenContract } from "./typings/bindings/ren_token";
import { SelfDestructingTokenArtifact } from "./typings/bindings/self_destructing_token";

import { DARKNODE_PAYMENT_CYCLE_DURATION_SECS } from "../migrations/config";
import { DARKNODE_PAYMENT_CYCLE_DURATION_SECONDS } from "../migrations/config";

const CycleChanger = artifacts.require("CycleChanger") as CycleChangerArtifact;
const RenToken = artifacts.require("RenToken") as RenTokenArtifact;
Expand Down Expand Up @@ -558,7 +558,7 @@ contract("DarknodePayment", (accounts: string[]) => {
describe("Changing cycles", async () => {

it("cannot change cycle if insufficient time has passed", async () => {
await waitForCycle(DARKNODE_PAYMENT_CYCLE_DURATION_SECS / 4).should.eventually.be.rejectedWith(null, /cannot cycle yet: too early/);
await waitForCycle(DARKNODE_PAYMENT_CYCLE_DURATION_SECONDS / 4).should.eventually.be.rejectedWith(null, /cannot cycle yet: too early/);
});

it("should disallow unauthorized changes to cycle duration", async () => {
Expand All @@ -575,7 +575,7 @@ contract("DarknodePayment", (accounts: string[]) => {
await changeCycleDuration(0);
await cc.changeCycle().should.eventually.be.rejectedWith(null, /no new block/);
// Reset the duration back to normal
await changeCycleDuration(DARKNODE_PAYMENT_CYCLE_DURATION_SECS);
await changeCycleDuration(DARKNODE_PAYMENT_CYCLE_DURATION_SECONDS);
});

});
Expand Down Expand Up @@ -711,29 +711,29 @@ contract("DarknodePayment", (accounts: string[]) => {
(await dnp.currentCycleRewardPool(dai.address)).should.bignumber.equal(previousBalance.add(amountBN));
}

const changeCycleDuration = async (timeInSecs: number) => {
const currentCycleDurationInSecs = new BN(await dnp.cycleDuration()).toNumber();
const changeCycleDuration = async (timeInSeconds: number) => {
const currentCycleDurationInSeconds = new BN(await dnp.cycleDuration()).toNumber();

await dnp.updateCycleDuration(timeInSecs);
(await dnp.cycleDuration()).should.bignumber.equal(timeInSecs);
await dnp.updateCycleDuration(timeInSeconds);
(await dnp.cycleDuration()).should.bignumber.equal(timeInSeconds);

// put into effect the new cycle duration
await increaseTime(currentCycleDurationInSecs);
await increaseTime(currentCycleDurationInSeconds);
await dnp.changeCycle().should.not.eventually.be.rejectedWith(null, /cannot cycle yet: too early/);
if (timeInSecs == 0) {
if (timeInSeconds == 0) {
await dnp.changeCycle().should.not.eventually.be.rejectedWith(null, /cannot cycle yet: too early/);
return;
}

await dnp.changeCycle().should.eventually.be.rejectedWith(null, /cannot cycle yet: too early/);

if (timeInSecs < currentCycleDurationInSecs) {
await increaseTime(timeInSecs);
if (timeInSeconds < currentCycleDurationInSeconds) {
await increaseTime(timeInSeconds);
await dnp.changeCycle().should.not.eventually.be.rejected; // With(null, /cannot cycle yet: too early/);
} else {
await increaseTime(currentCycleDurationInSecs);
await increaseTime(currentCycleDurationInSeconds);
await dnp.changeCycle().should.eventually.be.rejected; //With(null, /cannot cycle yet: too early/);
await increaseTime(timeInSecs - currentCycleDurationInSecs);
await increaseTime(timeInSeconds - currentCycleDurationInSeconds);
await dnp.changeCycle().should.not.eventually.be.rejected; // With(null, /cannot cycle yet: too early/);
}
}
Expand Down
14 changes: 11 additions & 3 deletions truffle.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,17 @@ module.exports = {
networks: {
kovan: {
// @ts-ignore
provider: () => new HDWalletProvider(process.env.MNEMONIC, `https://kovan.infura.io/v3/${process.env.INFURA_KEY}`),
provider: () => new HDWalletProvider(process.env.MNEMONIC_KOVAN, `https://kovan.infura.io/v3/${process.env.INFURA_KEY}`),
network_id: 42,
gas: 6721975,
gasPrice: 10 * GWEI,
gasPrice: 6.5 * GWEI,
},
mainnet: {
// @ts-ignore
provider: () => new HDWalletProvider(process.env.MNEMONIC_MAINNET, `https://mainnet.infura.io/v3/${process.env.INFURA_KEY}`),
network_id: 1,
gas: 6721975,
gasPrice: 6.5 * GWEI,
},
development: {
host: "localhost",
Expand All @@ -34,11 +41,12 @@ module.exports = {
solc: {
version: "0.5.8",
settings: {
evmVersion: "petersburg",
optimizer: {
enabled: true,
runs: 200,
}
}
}
}
};
};
53 changes: 24 additions & 29 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.6.tgz#b8622d50557dd155e9f2f634b7d68fd38de5e94b"
integrity sha512-1axi39YdtBI7z957vdqXI4Ac25e7YihYQtJa+Clnxg1zTJEaIRbndt71O3sP4GAMgiAm0pY26/b9BrY4MR/PMw==

"@types/node@*":
"@types/node@*", "@types/node@^12.0.0":
version "12.0.0"
resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.0.tgz#d11813b9c0ff8aaca29f04cbc12817f4c7d656e5"
integrity sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==
Expand All @@ -135,11 +135,6 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.14.6.tgz#9cbfcb62c50947217f4d88d4d274cc40c22625a9"
integrity sha512-Fvm24+u85lGmV4hT5G++aht2C5I4Z4dYlWZIh62FAfFO/TfzXtPpoLI6I7AuBWkIFqZCnhFOoTT7RjjaIL5Fjg==

"@types/node@^11.13.7":
version "11.13.10"
resolved "https://registry.yarnpkg.com/@types/node/-/node-11.13.10.tgz#4df59e5966b56f512bac98898bcbee5067411f0f"
integrity sha512-leUNzbFTMX94TWaIKz8N15Chu55F9QSH+INKayQr5xpkasBQBRF3qQXfo3/dOnMU/dEIit+Y/SU8HyOjq++GwA==

"@types/node@^8.0.0":
version "8.10.48"
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.48.tgz#e385073561643a9ba6199a1985ffc03530f90781"
Expand Down Expand Up @@ -173,7 +168,7 @@ abbrev@1.0.x:
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU=

abi-decoder@^1.0.8:
abi-decoder@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/abi-decoder/-/abi-decoder-1.2.0.tgz#c42882dbb91b444805f0cd203a87a5cc3c22f4a8"
integrity sha512-y2OKSEW4gf2838Eavc56vQY9V46zaXkf3Jl1WpTfUBbzAVrXSr4JRZAAWv55Tv9s5WNz1rVgBgz5d2aJIL1QCg==
Expand Down Expand Up @@ -1047,10 +1042,10 @@ dom-walk@^0.1.0:
resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018"
integrity sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=

dotenv@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-7.0.0.tgz#a2be3cd52736673206e8a85fb5210eea29628e7c"
integrity sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==
dotenv@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.0.0.tgz#ed310c165b4e8a97bb745b0a9d99c31bda566440"
integrity sha512-30xVGqjLjiUOArT4+M5q9sYdvuR4riM6yK9wMcas9Vbp6zZa+ocC9dp6QoftuhTPhFAiLK/0C5Ni2nou/Bk8lg==

drbg.js@^1.0.1:
version "1.0.1"
Expand Down Expand Up @@ -1240,22 +1235,22 @@ eth-ens-namehash@2.0.8:
idna-uts46-hx "^2.3.1"
js-sha3 "^0.5.7"

eth-gas-reporter@^0.1.12:
version "0.1.12"
resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.1.12.tgz#6b761e05c33ae85be47840dd07468ab51d473dd8"
integrity sha512-Ao5uiXSA5Ep5fi/YvGCsFJMelMKj0fMJkAvWYzPVe1h3Mg9Z7X3Rs51ovG9izFZH7wSqnqydiC6SKDhZWpxK2g==
eth-gas-reporter@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/eth-gas-reporter/-/eth-gas-reporter-0.2.0.tgz#3f4093a007495d959683590275c995d4c6394b63"
integrity sha512-uQzHz+omKTktYe9ZvwF+nVfLGvYJAtz5bGfLW7DzU2J44o2cocxiEZIf6quobxQ0cyY4MEqp0uyuL8x75QRoIQ==
dependencies:
abi-decoder "^1.0.8"
abi-decoder "^1.2.0"
cli-table3 "^0.5.0"
colors "^1.1.2"
lodash "^4.17.4"
lodash "^4.17.11"
mocha "^4.1.0"
req-cwd "^2.0.0"
request "^2.83.0"
request "^2.88.0"
request-promise-native "^1.0.5"
sha1 "^1.1.1"
shelljs "^0.7.8"
solidity-parser-antlr "^0.2.10"
solidity-parser-antlr "^0.4.2"
sync-request "^6.0.0"

eth-lib@0.1.27, eth-lib@^0.1.26:
Expand Down Expand Up @@ -2280,7 +2275,7 @@ lodash.assign@^4.0.3, lodash.assign@^4.0.6:
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=

lodash@^4.17.11, lodash@^4.17.4:
lodash@^4.17.11:
version "4.17.11"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d"
integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==
Expand Down Expand Up @@ -3081,7 +3076,7 @@ request-promise-native@^1.0.5:
stealthy-require "^1.1.1"
tough-cookie "^2.3.3"

request@^2.79.0, request@^2.83.0, request@^2.86.0:
request@^2.79.0, request@^2.86.0, request@^2.88.0:
version "2.88.0"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef"
integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==
Expand Down Expand Up @@ -3428,10 +3423,10 @@ solc@0.5.0, solc@^0.5.8:
tree-kill "^1.2.0"
web3 "^0.20.6"

solidity-parser-antlr@^0.2.10:
version "0.2.15"
resolved "https://registry.yarnpkg.com/solidity-parser-antlr/-/solidity-parser-antlr-0.2.15.tgz#4be687a0a53da268c6a07398e0cfb3168896d610"
integrity sha512-EzRI8/TR/ljTXkZAyAjb0w4G20wH2XM7pcNf87ifdV825AbUv7DkY7HmiZCTj6NeKtIx8Y1s0NZWPbj+JTp8Zw==
solidity-parser-antlr@^0.4.2:
version "0.4.2"
resolved "https://registry.yarnpkg.com/solidity-parser-antlr/-/solidity-parser-antlr-0.4.2.tgz#b862eba5936e7a90b4f5f1c8eb1d33fe86650f78"
integrity sha512-0OKT2YKZAqPe14HN7Nbo24hjmnyUYh92UjyZG0Zz2rpQhl/w8asX8qHb+ASSXfayQaiW8g9zGIupXEE355tOQQ==

solidity-parser-sc@maxsam4/solidity-parser#solidity-0.5:
version "0.4.12"
Expand Down Expand Up @@ -3844,10 +3839,10 @@ truffle-hdwallet-provider@1.0.8:
web3 "1.0.0-beta.37"
websocket "^1.0.28"

truffle@5.0.14:
version "5.0.14"
resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.0.14.tgz#589e301f64aac1b22481c5e41b31aa08bbcd8fea"
integrity sha512-Mlf4S58NMyR8YZFvQLAzA+7eCaDZw6ZSa92NWXDQjy1RbUfpl08/VPa06KLT+LosQuOPZr/NSH9f0u2qxfo/Qw==
truffle@5.0.15:
version "5.0.15"
resolved "https://registry.yarnpkg.com/truffle/-/truffle-5.0.15.tgz#b0b87829766cce6be072a6f09794cf038930070b"
integrity sha512-/FAabG/+xv4mADQvm4YXTMWThXrc9Z4MsMCqWixrd6DlQMPBQIV5F86DeYHgkKbp8hRM3oGUdBVfpWRaha6YKg==
dependencies:
app-module-path "^2.2.0"
mocha "^4.1.0"
Expand Down

0 comments on commit d34bb9d

Please sign in to comment.