From c3d19d5ce06e054ad9d646addac22a16179fb89e Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Mon, 17 Jun 2019 13:16:16 +0700 Subject: [PATCH 01/15] Set vote result set event amount to curr threshold --- contracts/event/MultipleResultsEvent.sol | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contracts/event/MultipleResultsEvent.sol b/contracts/event/MultipleResultsEvent.sol index 8eaec4a..2308170 100644 --- a/contracts/event/MultipleResultsEvent.sol +++ b/contracts/event/MultipleResultsEvent.sol @@ -490,6 +490,7 @@ contract MultipleResultsEvent is NRC223Receiver, Ownable { private { // Calculate next consensus threshold + uint currThreshold = _eventRounds[_currentRound].consensusThreshold; uint nextThreshold = getNextThreshold(_eventRounds[_currentRound].consensusThreshold); uint8 previousRound = _currentRound; @@ -517,7 +518,7 @@ contract MultipleResultsEvent is NRC223Receiver, Ownable { } // Emit events - emit VoteResultSet(address(this), from, resultIndex, value, + emit VoteResultSet(address(this), from, resultIndex, currThreshold, previousRound, nextThreshold, arbitrationEndTime); } From e8c99224a5854d7a94f99dcfd00ff532c3acf3ee Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Mon, 17 Jun 2019 13:17:00 +0700 Subject: [PATCH 02/15] Change version --- contracts/event/EventFactory.sol | 2 +- contracts/event/MultipleResultsEvent.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/event/EventFactory.sol b/contracts/event/EventFactory.sol index 14b9d0f..45a1a29 100644 --- a/contracts/event/EventFactory.sol +++ b/contracts/event/EventFactory.sol @@ -16,7 +16,7 @@ contract EventFactory is NRC223Receiver { uint amount; } - uint16 private constant VERSION = 5; + uint16 private constant VERSION = 6; address private _configManager; address private _bodhiTokenAddress; diff --git a/contracts/event/MultipleResultsEvent.sol b/contracts/event/MultipleResultsEvent.sol index 2308170..e48a7e8 100644 --- a/contracts/event/MultipleResultsEvent.sol +++ b/contracts/event/MultipleResultsEvent.sol @@ -22,7 +22,7 @@ contract MultipleResultsEvent is NRC223Receiver, Ownable { uint arbitrationEndTime; } - uint16 private constant VERSION = 5; + uint16 private constant VERSION = 6; uint8 private constant INVALID_RESULT_INDEX = 255; uint8 private _numOfResults; From 6a20c393ae5a0b6c55d6c4e6755b490fadba730d Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Mon, 17 Jun 2019 13:19:36 +0700 Subject: [PATCH 03/15] Fix test for version num --- test/event/multiple-results-event.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/event/multiple-results-event.js b/test/event/multiple-results-event.js index 71596e1..6617a34 100644 --- a/test/event/multiple-results-event.js +++ b/test/event/multiple-results-event.js @@ -254,7 +254,7 @@ contract('MultipleResultsEvent', (accounts) => { assert.equal(await eventMethods.owner().call(), OWNER) const eventMeta = await eventMethods.eventMetadata().call() - assert.equal(eventMeta[0], 5) + assert.equal(eventMeta[0], 6) assert.equal(eventMeta[1], 'Test Event 1') assert.equal(web3.utils.toUtf8(eventMeta[2][0]), RESULT_INVALID) assert.equal(web3.utils.toUtf8(eventMeta[2][1]), 'A') From 5131bbffc0ddea445cecbb999fb431d71632ff82 Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Tue, 18 Jun 2019 10:29:04 +0700 Subject: [PATCH 04/15] Remove betStartTime constructor param in event --- contracts/event/MultipleResultsEvent.sol | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/contracts/event/MultipleResultsEvent.sol b/contracts/event/MultipleResultsEvent.sol index e48a7e8..6edfdb2 100644 --- a/contracts/event/MultipleResultsEvent.sol +++ b/contracts/event/MultipleResultsEvent.sol @@ -101,7 +101,6 @@ contract MultipleResultsEvent is NRC223Receiver, Ownable { /// @param eventName Question or statement prediction. /// @param eventResults Possible results. /// @param numOfResults Number of results. - /// @param betStartTime Unix time when betting will start. /// @param betEndTime Unix time when betting will end. /// @param resultSetStartTime Unix time when the CentralizedOracle can set the result. /// @param resultSetEndTime Unix time when anyone can set the result. @@ -114,7 +113,6 @@ contract MultipleResultsEvent is NRC223Receiver, Ownable { string memory eventName, bytes32[4] memory eventResults, uint8 numOfResults, - uint betStartTime, uint betEndTime, uint resultSetStartTime, uint resultSetEndTime, @@ -131,7 +129,7 @@ contract MultipleResultsEvent is NRC223Receiver, Ownable { require(eventNameBytes.length > 0, "Event name cannot be empty"); require(!eventResults[1].isEmpty(), "First event result cannot be empty"); require(!eventResults[2].isEmpty(), "Second event result cannot be empty"); - require(betEndTime > betStartTime, "betEndTime should be > betStartTime"); + require(betEndTime > block.timestamp, "betEndTime should be > current time"); require( resultSetStartTime >= betEndTime, "resultSetStartTime should be >= betEndTime"); @@ -148,7 +146,7 @@ contract MultipleResultsEvent is NRC223Receiver, Ownable { _eventName = eventName; _eventResults = eventResults; _numOfResults = numOfResults; - _betStartTime = betStartTime; + _betStartTime = block.timestamp; _betEndTime = betEndTime; _resultSetStartTime = resultSetStartTime; _resultSetEndTime = resultSetEndTime; From 1b0a927ca491ab72fa5e183ce07d2341e99ecefb Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Tue, 18 Jun 2019 10:31:22 +0700 Subject: [PATCH 05/15] Remove bet start time from event factory --- contracts/event/EventFactory.sol | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/contracts/event/EventFactory.sol b/contracts/event/EventFactory.sol index 45a1a29..0138265 100644 --- a/contracts/event/EventFactory.sol +++ b/contracts/event/EventFactory.sol @@ -92,14 +92,14 @@ contract EventFactory is NRC223Receiver { returns (MultipleResultsEvent) { (string memory eventName, bytes32[3] memory eventResults, - uint betStartTime, uint betEndTime, uint resultSetStartTime, - uint resultSetEndTime, address centralizedOracle, - uint8 arbitrationOptionIndex, uint arbitrationRewardPercentage) = + uint betEndTime, uint resultSetStartTime, uint resultSetEndTime, + address centralizedOracle, uint8 arbitrationOptionIndex, + uint arbitrationRewardPercentage) = abi.decode(params, (string, bytes32[3], uint, uint, uint, uint, address, uint8, uint)); return createMultipleResultsEvent(from, value, eventName, eventResults, - betStartTime, betEndTime, resultSetStartTime, resultSetEndTime, - centralizedOracle, arbitrationOptionIndex, arbitrationRewardPercentage); + betEndTime, resultSetStartTime, resultSetEndTime, centralizedOracle, + arbitrationOptionIndex, arbitrationRewardPercentage); } /// @dev Creates a new MultipleResultsEvent. Only tokenFallback can call this. @@ -107,7 +107,6 @@ contract EventFactory is NRC223Receiver { /// @param escrowDeposited Amount of escrow deposited to create the event. /// @param eventName Question or statement prediction. /// @param eventResults Possible results. - /// @param betStartTime Unix time when betting will start. /// @param betEndTime Unix time when betting will end. /// @param resultSetStartTime Unix time when the CentralizedOracle can set the result. /// @param resultSetEndTime Unix time when anyone can set the result. @@ -120,7 +119,6 @@ contract EventFactory is NRC223Receiver { uint escrowDeposited, string memory eventName, bytes32[3] memory eventResults, - uint betStartTime, uint betEndTime, uint resultSetStartTime, uint resultSetEndTime, @@ -152,8 +150,8 @@ contract EventFactory is NRC223Receiver { // Create event MultipleResultsEvent mrEvent = new MultipleResultsEvent( - creator, eventName, results, numOfResults, betStartTime, - betEndTime, resultSetStartTime, resultSetEndTime, centralizedOracle, + creator, eventName, results, numOfResults, betEndTime, + resultSetStartTime, resultSetEndTime, centralizedOracle, arbitrationOptionIndex, arbitrationRewardPercentage, _configManager); // Store escrow info From 23a745dddaaa38945b11818082fe317058ca29c1 Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Tue, 18 Jun 2019 10:37:21 +0700 Subject: [PATCH 06/15] Remove unused util methods --- test/event/multiple-results-event.js | 2 - test/util/contract_helper.js | 102 --------------------------- test/util/index.js | 21 ------ 3 files changed, 125 deletions(-) delete mode 100644 test/util/contract_helper.js diff --git a/test/event/multiple-results-event.js b/test/event/multiple-results-event.js index 6617a34..61180af 100644 --- a/test/event/multiple-results-event.js +++ b/test/event/multiple-results-event.js @@ -5,9 +5,7 @@ const { isNumber } = require('lodash') const getConstants = require('../constants') const { toSatoshi, - bigNumberFloor, currentBlockTime, - paddedHexToAddress, constructTransfer223Data, decodeEvent, } = require('../util') diff --git a/test/util/contract_helper.js b/test/util/contract_helper.js deleted file mode 100644 index 0711f9a..0000000 --- a/test/util/contract_helper.js +++ /dev/null @@ -1,102 +0,0 @@ -// const Web3Beta = require('web3'); -// const Qweb3Utils = require('qweb3').Utils; -// const Encoder = require('qweb3').Encoder; - -// const AddressManager = artifacts.require('./storage/AddressManager.sol'); -// const BodhiEthereum = artifacts.require('./token/BodhiEthereum.sol'); -// const EventFactory = artifacts.require('./event/EventFactory.sol'); -// const OracleFactory = artifacts.require('./oracle/OracleFactory.sol'); - -// const Utils = require('.'); -// const Abi = require('./abi'); - -// const web3 = new Web3Beta(global.web3.currentProvider); - -// const BOT_DECIMALS = 8; -// const BODHI_TOKENS_BALANCE = Utils.toDenomination(100000, BOT_DECIMALS); - -// module.exports = class ContractHelper { -// static async initBaseContracts(admin, accounts) { -// const addressManager = await AddressManager.deployed({ from: admin }); - -// const bodhiToken = await ContractHelper.mintBodhiTokens(admin, accounts); -// await addressManager.setBodhiTokenAddress(bodhiToken.address, { from: admin }); -// assert.equal(await addressManager.bodhiTokenAddress.call(), bodhiToken.address); - -// const eventFactory = await EventFactory.deployed(addressManager.address, { from: admin }); -// await addressManager.setEventFactoryAddress(eventFactory.address, { from: admin }); -// assert.equal(await addressManager.eventFactoryVersionToAddress.call(0), eventFactory.address); - -// const oracleFactory = await OracleFactory.deployed(addressManager.address, { from: admin }); -// await addressManager.setOracleFactoryAddress(oracleFactory.address, { from: admin }); -// assert.equal(await addressManager.oracleFactoryVersionToAddress.call(0), oracleFactory.address); - -// return { -// addressManager, -// bodhiToken, -// eventFactory, -// oracleFactory, -// }; -// } - -// static async mintBodhiTokens(admin, accounts) { -// const token = await BodhiEthereum.deployed({ from: admin }); -// const expectedBalance = BODHI_TOKENS_BALANCE.toString(); - -// await token.mint(accounts[0], BODHI_TOKENS_BALANCE, { from: admin }); -// assert.equal((await token.balanceOf(accounts[0])).toString(), expectedBalance); - -// await token.mint(accounts[1], BODHI_TOKENS_BALANCE, { from: admin }); -// assert.equal((await token.balanceOf(accounts[1])).toString(), expectedBalance); - -// await token.mint(accounts[2], BODHI_TOKENS_BALANCE, { from: admin }); -// assert.equal((await token.balanceOf(accounts[2])).toString(), expectedBalance); - -// await token.mint(accounts[3], BODHI_TOKENS_BALANCE, { from: admin }); -// assert.equal((await token.balanceOf(accounts[3])).toString(), expectedBalance); - -// await token.mint(accounts[4], BODHI_TOKENS_BALANCE, { from: admin }); -// assert.equal((await token.balanceOf(accounts[4])).toString(), expectedBalance); - -// await token.mint(accounts[5], BODHI_TOKENS_BALANCE, { from: admin }); -// assert.equal((await token.balanceOf(accounts[5])).toString(), expectedBalance); - -// await token.mint(accounts[6], BODHI_TOKENS_BALANCE, { from: admin }); -// assert.equal((await token.balanceOf(accounts[6])).toString(), expectedBalance); - -// await token.mint(accounts[7], BODHI_TOKENS_BALANCE, { from: admin }); -// assert.equal((await token.balanceOf(accounts[7])).toString(), expectedBalance); - -// await token.mint(accounts[8], BODHI_TOKENS_BALANCE, { from: admin }); -// assert.equal((await token.balanceOf(accounts[8])).toString(), expectedBalance); - -// return token; -// } - -// static async approve(tokenContract, sender, to, amount) { -// await tokenContract.approve(to, amount, { from: sender }); -// assert.equal((await tokenContract.allowance(sender, to)).toString(), amount.toString()); -// } - -// static async transferSetResult(token, event, cOracle, resultSetter, resultIndex, amount) { -// const data = '0x65f4ced1' -// + Qweb3Utils.trimHexPrefix(cOracle.address) -// + Qweb3Utils.trimHexPrefix(resultSetter) -// + Encoder.uintToHex(resultIndex); - -// const tokenWeb3Contract = new web3.eth.Contract(Abi.BodhiEthereum, token.address); -// return await tokenWeb3Contract.methods["transfer(address,uint256,bytes)"](event.address, amount, data) -// .send({ from: resultSetter, gas: 5000000 }); -// } - -// static async transferVote(token, event, dOracle, voter, resultIndex, amount) { -// const data = '0x6f02d1fb' -// + Qweb3Utils.trimHexPrefix(dOracle.address) -// + Qweb3Utils.trimHexPrefix(voter) -// + Encoder.uintToHex(resultIndex); - -// const tokenWeb3Contract = new web3.eth.Contract(Abi.BodhiEthereum, token.address); -// return await tokenWeb3Contract.methods["transfer(address,uint256,bytes)"](event.address, amount, data) -// .send({ from: voter, gas: 5000000 }); -// } -// }; diff --git a/test/util/index.js b/test/util/index.js index 85b0ecd..df79694 100644 --- a/test/util/index.js +++ b/test/util/index.js @@ -47,15 +47,6 @@ module.exports = class Utils { return Utils.toDenomination(amount, 8) } - /* - * Truncates the decimals off the BigNumber and returns a new BigNumber. - * @param number {BigNumber} The number to truncate. - * @retun {BigNumber} The truncated BigNumber. - */ - static bigNumberFloor(bigNumber) { - return web3.toBigNumber(bigNumber.toString().split('.')[0]) - } - // Gets the unix time in seconds of the current block static async currentBlockTime() { const blockNum = await web3.eth.getBlockNumber() @@ -63,18 +54,6 @@ module.exports = class Utils { return block.timestamp } - /* - * Removes the padded zeros in an address hex string. - * eg. 0x0000000000000000000000006b36fdf89d706035dc97b6aa4bc84b2418a452f1 -> 0x6b36fdf89d706035dc97b6aa4bc84b2418a452f1 - * @param hexString {string} The hex string to remove the padding from. - * @return {string} The hex string with the padded zeros removed. - */ - static paddedHexToAddress(hexString) { - const regex = new RegExp(/(0x)(0+)([a-fA-F0-9]{40})/) - const matches = regex.exec(hexString) - return matches && matches[1] + matches[3] - } - static constructTransfer223Data(funcSig, types, params) { const encoded = Utils.removeHexPrefix(web3.eth.abi.encodeParameters(types, params)) return Utils.addHexPrefix(`${funcSig}${encoded}`) From 4764d385c91a0db2ad7e446049a3e07c9a0a989d Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Tue, 18 Jun 2019 11:28:26 +0700 Subject: [PATCH 07/15] Fix tests for removing bet start time --- contracts/event/EventFactory.sol | 4 +- test/event/multiple-results-event.js | 79 +++++++++++----------------- 2 files changed, 32 insertions(+), 51 deletions(-) diff --git a/contracts/event/EventFactory.sol b/contracts/event/EventFactory.sol index 0138265..c300d5d 100644 --- a/contracts/event/EventFactory.sol +++ b/contracts/event/EventFactory.sol @@ -95,8 +95,8 @@ contract EventFactory is NRC223Receiver { uint betEndTime, uint resultSetStartTime, uint resultSetEndTime, address centralizedOracle, uint8 arbitrationOptionIndex, uint arbitrationRewardPercentage) = - abi.decode(params, (string, bytes32[3], uint, uint, uint, uint, - address, uint8, uint)); + abi.decode(params, (string, bytes32[3], uint, uint, uint, address, + uint8, uint)); return createMultipleResultsEvent(from, value, eventName, eventResults, betEndTime, resultSetStartTime, resultSetEndTime, centralizedOracle, arbitrationOptionIndex, arbitrationRewardPercentage); diff --git a/test/event/multiple-results-event.js b/test/event/multiple-results-event.js index 61180af..183a2fa 100644 --- a/test/event/multiple-results-event.js +++ b/test/event/multiple-results-event.js @@ -23,7 +23,6 @@ const SET_RESULT_FUNC_SIG = 'a6b4218b' const VOTE_FUNC_SIG = '1e00eb7f' const RESULT_INVALID = 'Invalid' const RESULT_INDEX_INVALID = 255 -const TOKEN_DECIMALS = 8 const fundUsers = async ({ nbotMethods, accounts }) => { await nbotMethods.transfer(accounts[1], toSatoshi(10000).toString()) @@ -38,8 +37,7 @@ const fundUsers = async ({ nbotMethods, accounts }) => { .send({ from: accounts[0] }) } -const getEventParams = async (cOracle) => { - const currTime = await currentBlockTime() +const getEventParams = async (cOracle, currTime) => { return [ 'Test Event 1', [ @@ -47,7 +45,6 @@ const getEventParams = async (cOracle) => { web3.utils.fromAscii('B'), web3.utils.fromAscii('C'), ], - currTime + 1000, currTime + 3000, currTime + 4000, currTime + 6000, @@ -64,8 +61,8 @@ const createEvent = async ( // Construct data const data = constructTransfer223Data( CREATE_EVENT_FUNC_SIG, - ['string', 'bytes32[3]', 'uint256', 'uint256', 'uint256', 'uint256', - 'address', 'uint8', 'uint256'], + ['string', 'bytes32[3]', 'uint256', 'uint256', 'uint256', 'address', + 'uint8', 'uint256'], eventParams, ) @@ -228,11 +225,11 @@ contract('MultipleResultsEvent', (accounts) => { configManagerMethods.setEventFactory(eventFactoryAddr).send({ from: OWNER }) // Setup event params - eventParams = await getEventParams(OWNER) - betStartTime = eventParams[2] - betEndTime = eventParams[3] - resultSetStartTime = eventParams[4] - resultSetEndTime = eventParams[5] + betStartTime = await currentBlockTime() + eventParams = await getEventParams(OWNER, betStartTime) + betEndTime = eventParams[2] + resultSetStartTime = eventParams[3] + resultSetEndTime = eventParams[4] // NBOT.transfer() -> create event eventAddr = await createEvent({ @@ -261,11 +258,11 @@ contract('MultipleResultsEvent', (accounts) => { assert.equal(eventMeta[3], 4) const centralizedMeta = await eventMethods.centralizedMetadata().call() - assert.equal(centralizedMeta[0], eventParams[6]) - assert.equal(centralizedMeta[1], eventParams[2]) - assert.equal(centralizedMeta[2], eventParams[3]) - assert.equal(centralizedMeta[3], eventParams[4]) - assert.equal(centralizedMeta[4], eventParams[5]) + assert.equal(centralizedMeta[0], eventParams[5]) + assert.equal(centralizedMeta[1], betStartTime) + assert.equal(centralizedMeta[2], betEndTime) + assert.equal(centralizedMeta[3], resultSetStartTime) + assert.equal(centralizedMeta[4], resultSetEndTime) const configMeta = await eventMethods.configMetadata().call() assert.equal(configMeta[0], escrowAmt) @@ -277,12 +274,12 @@ contract('MultipleResultsEvent', (accounts) => { configMeta[2], await configManagerMethods.thresholdPercentIncrease().call(), ) - assert.equal(configMeta[3], eventParams[8]) + assert.equal(configMeta[3], eventParams[7]) }) it('throws if centralizedOracle address is invalid', async () => { try { - const params = await getEventParams(INVALID_ADDR) + const params = await getEventParams(INVALID_ADDR, await currentBlockTime()) params[0] = 'Test Event 2' await createEvent({ nbotMethods, @@ -299,7 +296,7 @@ contract('MultipleResultsEvent', (accounts) => { it('throws if eventName is empty', async () => { try { - const params = await getEventParams(OWNER) + const params = await getEventParams(OWNER, await currentBlockTime()) params[0] = '' await createEvent({ nbotMethods, @@ -316,7 +313,7 @@ contract('MultipleResultsEvent', (accounts) => { it('throws if eventResults 0 or 1 are empty', async () => { try { - const params = await getEventParams(OWNER) + const params = await getEventParams(OWNER, await currentBlockTime()) params[0] = 'Test Event 3' params[1] = [ web3.utils.fromAscii(''), @@ -336,7 +333,7 @@ contract('MultipleResultsEvent', (accounts) => { } try { - const params = await getEventParams(OWNER) + const params = await getEventParams(OWNER, await currentBlockTime()) params[0] = 'Test Event 4' params[1] = [ web3.utils.fromAscii('A'), @@ -358,7 +355,7 @@ contract('MultipleResultsEvent', (accounts) => { it('throws if betEndTime is <= betStartTime', async () => { try { - const params = await getEventParams(OWNER) + const params = await getEventParams(OWNER, await currentBlockTime()) params[0] = 'Test Event 5' params[3] = params[2] await createEvent({ @@ -376,9 +373,9 @@ contract('MultipleResultsEvent', (accounts) => { it('throws if resultSetStartTime is < betEndTime', async () => { try { - const params = await getEventParams(OWNER) + const params = await getEventParams(OWNER, await currentBlockTime()) params[0] = 'Test Event 6' - params[4] = params[3] + params[3] = params[2] await createEvent({ nbotMethods, eventParams: params, @@ -394,9 +391,9 @@ contract('MultipleResultsEvent', (accounts) => { it('throws if resultSetEndTime is <= resultSetStartTime', async () => { try { - const params = await getEventParams(OWNER) + const params = await getEventParams(OWNER, await currentBlockTime()) params[0] = 'Test Event 7' - params[5] = params[4] + params[4] = params[3] await createEvent({ nbotMethods, eventParams: params, @@ -441,9 +438,9 @@ contract('MultipleResultsEvent', (accounts) => { describe('valid time', () => { beforeEach(async () => { const currTime = await currentBlockTime() - await timeMachine.increaseTime(Number(eventParams[2]) - currTime) - assert.isAtLeast(await currentBlockTime(), Number(eventParams[2])) - assert.isBelow(await currentBlockTime(), Number(eventParams[3])) + await timeMachine.increaseTime(betStartTime - currTime) + assert.isAtLeast(await currentBlockTime(), betStartTime) + assert.isBelow(await currentBlockTime(), betEndTime) }) it('allows users to bet', async () => { @@ -472,8 +469,8 @@ contract('MultipleResultsEvent', (accounts) => { it('throws if the currentRound is not 0', async () => { const currTime = await currentBlockTime() - await timeMachine.increaseTime(Number(eventParams[4]) - currTime) - assert.isAtLeast(await currentBlockTime(), Number(eventParams[4])) + await timeMachine.increaseTime(resultSetStartTime - currTime) + assert.isAtLeast(await currentBlockTime(), resultSetStartTime) const amt = await eventMethods.currentConsensusThreshold().call() await setResult({ @@ -528,26 +525,10 @@ contract('MultipleResultsEvent', (accounts) => { }) describe('invalid time', () => { - it('throws if the current time is < betStartTime', async () => { - assert.isBelow(await currentBlockTime(), Number(eventParams[2])) - - try { - await placeBet({ - nbotMethods, - eventAddr, - amtDecimals: 1, - resultIndex: 0, - from: OWNER, - }) - } catch (e) { - sassert.revert(e, 'Current time should be >= betStartTime') - } - }) - it('throws if the current time is > betEndTime', async () => { const currTime = await currentBlockTime() - await timeMachine.increaseTime(Number(eventParams[3]) - currTime) - assert.isAtLeast(await currentBlockTime(), Number(eventParams[3])) + await timeMachine.increaseTime(betEndTime - currTime) + assert.isAtLeast(await currentBlockTime(), betEndTime) try { await placeBet({ From 826f288c6ea45d55670f7719062e326b036f574f Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Tue, 18 Jun 2019 11:36:46 +0700 Subject: [PATCH 08/15] Remove result set end time from event constructor --- contracts/event/MultipleResultsEvent.sol | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/contracts/event/MultipleResultsEvent.sol b/contracts/event/MultipleResultsEvent.sol index 6edfdb2..42f84c1 100644 --- a/contracts/event/MultipleResultsEvent.sol +++ b/contracts/event/MultipleResultsEvent.sol @@ -24,6 +24,7 @@ contract MultipleResultsEvent is NRC223Receiver, Ownable { uint16 private constant VERSION = 6; uint8 private constant INVALID_RESULT_INDEX = 255; + uint256 private constant ORACLE_RESULT_SETTING_LENGTH = 48 * 60 * 60; // 48 hours uint8 private _numOfResults; uint8 private _currentRound = 0; @@ -103,7 +104,6 @@ contract MultipleResultsEvent is NRC223Receiver, Ownable { /// @param numOfResults Number of results. /// @param betEndTime Unix time when betting will end. /// @param resultSetStartTime Unix time when the CentralizedOracle can set the result. - /// @param resultSetEndTime Unix time when anyone can set the result. /// @param centralizedOracle Address of the user that will decide the result. /// @param arbitrationOptionIndex Index of the selected arbitration option. /// @param arbitrationRewardPercentage Percentage of loser's bets going to winning arbitrators. @@ -115,7 +115,6 @@ contract MultipleResultsEvent is NRC223Receiver, Ownable { uint8 numOfResults, uint betEndTime, uint resultSetStartTime, - uint resultSetEndTime, address centralizedOracle, uint8 arbitrationOptionIndex, uint arbitrationRewardPercentage, @@ -133,9 +132,6 @@ contract MultipleResultsEvent is NRC223Receiver, Ownable { require( resultSetStartTime >= betEndTime, "resultSetStartTime should be >= betEndTime"); - require( - resultSetEndTime > resultSetStartTime, - "resultSetEndTime should be > resultSetStartTime"); require( arbitrationOptionIndex < 4, "arbitrationOptionIndex should be < 4"); @@ -149,7 +145,7 @@ contract MultipleResultsEvent is NRC223Receiver, Ownable { _betStartTime = block.timestamp; _betEndTime = betEndTime; _resultSetStartTime = resultSetStartTime; - _resultSetEndTime = resultSetEndTime; + _resultSetEndTime = resultSetStartTime.add(ORACLE_RESULT_SETTING_LENGTH); _centralizedOracle = centralizedOracle; _arbitrationRewardPercentage = arbitrationRewardPercentage; From 5b7ab639cbf894a1b8eef9307df8a65d27441999 Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Tue, 18 Jun 2019 11:37:24 +0700 Subject: [PATCH 09/15] Remove result set end time from event factory --- contracts/event/EventFactory.sol | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/contracts/event/EventFactory.sol b/contracts/event/EventFactory.sol index c300d5d..f7c0ea2 100644 --- a/contracts/event/EventFactory.sol +++ b/contracts/event/EventFactory.sol @@ -92,13 +92,12 @@ contract EventFactory is NRC223Receiver { returns (MultipleResultsEvent) { (string memory eventName, bytes32[3] memory eventResults, - uint betEndTime, uint resultSetStartTime, uint resultSetEndTime, - address centralizedOracle, uint8 arbitrationOptionIndex, - uint arbitrationRewardPercentage) = + uint betEndTime, uint resultSetStartTime, address centralizedOracle, + uint8 arbitrationOptionIndex, uint arbitrationRewardPercentage) = abi.decode(params, (string, bytes32[3], uint, uint, uint, address, uint8, uint)); return createMultipleResultsEvent(from, value, eventName, eventResults, - betEndTime, resultSetStartTime, resultSetEndTime, centralizedOracle, + betEndTime, resultSetStartTime, centralizedOracle, arbitrationOptionIndex, arbitrationRewardPercentage); } @@ -109,7 +108,6 @@ contract EventFactory is NRC223Receiver { /// @param eventResults Possible results. /// @param betEndTime Unix time when betting will end. /// @param resultSetStartTime Unix time when the CentralizedOracle can set the result. - /// @param resultSetEndTime Unix time when anyone can set the result. /// @param centralizedOracle Address of the user that will decide the result. /// @param arbitrationOptionIndex Index of the selected arbitration option. /// @param arbitrationRewardPercentage Percentage of loser's bets going to winning arbitrators. @@ -121,7 +119,6 @@ contract EventFactory is NRC223Receiver { bytes32[3] memory eventResults, uint betEndTime, uint resultSetStartTime, - uint resultSetEndTime, address centralizedOracle, uint8 arbitrationOptionIndex, uint arbitrationRewardPercentage) @@ -151,8 +148,8 @@ contract EventFactory is NRC223Receiver { // Create event MultipleResultsEvent mrEvent = new MultipleResultsEvent( creator, eventName, results, numOfResults, betEndTime, - resultSetStartTime, resultSetEndTime, centralizedOracle, - arbitrationOptionIndex, arbitrationRewardPercentage, _configManager); + resultSetStartTime, centralizedOracle, arbitrationOptionIndex, + arbitrationRewardPercentage, _configManager); // Store escrow info _escrows[address(mrEvent)].depositer = creator; From acfec4a3b8e0433227127620217a455b16e120ee Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Tue, 18 Jun 2019 11:57:26 +0700 Subject: [PATCH 10/15] Fix tests for removing result set end time --- contracts/event/EventFactory.sol | 4 +-- test/event/multiple-results-event.js | 47 +++------------------------- 2 files changed, 7 insertions(+), 44 deletions(-) diff --git a/contracts/event/EventFactory.sol b/contracts/event/EventFactory.sol index f7c0ea2..e057a0a 100644 --- a/contracts/event/EventFactory.sol +++ b/contracts/event/EventFactory.sol @@ -94,8 +94,8 @@ contract EventFactory is NRC223Receiver { (string memory eventName, bytes32[3] memory eventResults, uint betEndTime, uint resultSetStartTime, address centralizedOracle, uint8 arbitrationOptionIndex, uint arbitrationRewardPercentage) = - abi.decode(params, (string, bytes32[3], uint, uint, uint, address, - uint8, uint)); + abi.decode(params, (string, bytes32[3], uint, uint, address, uint8, + uint)); return createMultipleResultsEvent(from, value, eventName, eventResults, betEndTime, resultSetStartTime, centralizedOracle, arbitrationOptionIndex, arbitrationRewardPercentage); diff --git a/test/event/multiple-results-event.js b/test/event/multiple-results-event.js index 183a2fa..33d0cb3 100644 --- a/test/event/multiple-results-event.js +++ b/test/event/multiple-results-event.js @@ -23,6 +23,7 @@ const SET_RESULT_FUNC_SIG = 'a6b4218b' const VOTE_FUNC_SIG = '1e00eb7f' const RESULT_INVALID = 'Invalid' const RESULT_INDEX_INVALID = 255 +const ORACLE_RESULT_SETTING_LENGTH = 172800 const fundUsers = async ({ nbotMethods, accounts }) => { await nbotMethods.transfer(accounts[1], toSatoshi(10000).toString()) @@ -47,7 +48,6 @@ const getEventParams = async (cOracle, currTime) => { ], currTime + 3000, currTime + 4000, - currTime + 6000, cOracle, 0, 10, @@ -61,8 +61,7 @@ const createEvent = async ( // Construct data const data = constructTransfer223Data( CREATE_EVENT_FUNC_SIG, - ['string', 'bytes32[3]', 'uint256', 'uint256', 'uint256', 'address', - 'uint8', 'uint256'], + ['string', 'bytes32[3]', 'uint256', 'uint256', 'address', 'uint8', 'uint256'], eventParams, ) @@ -229,7 +228,7 @@ contract('MultipleResultsEvent', (accounts) => { eventParams = await getEventParams(OWNER, betStartTime) betEndTime = eventParams[2] resultSetStartTime = eventParams[3] - resultSetEndTime = eventParams[4] + resultSetEndTime = resultSetStartTime + ORACLE_RESULT_SETTING_LENGTH // NBOT.transfer() -> create event eventAddr = await createEvent({ @@ -258,7 +257,7 @@ contract('MultipleResultsEvent', (accounts) => { assert.equal(eventMeta[3], 4) const centralizedMeta = await eventMethods.centralizedMetadata().call() - assert.equal(centralizedMeta[0], eventParams[5]) + assert.equal(centralizedMeta[0], eventParams[4]) assert.equal(centralizedMeta[1], betStartTime) assert.equal(centralizedMeta[2], betEndTime) assert.equal(centralizedMeta[3], resultSetStartTime) @@ -274,7 +273,7 @@ contract('MultipleResultsEvent', (accounts) => { configMeta[2], await configManagerMethods.thresholdPercentIncrease().call(), ) - assert.equal(configMeta[3], eventParams[7]) + assert.equal(configMeta[3], eventParams[6]) }) it('throws if centralizedOracle address is invalid', async () => { @@ -353,24 +352,6 @@ contract('MultipleResultsEvent', (accounts) => { } }) - it('throws if betEndTime is <= betStartTime', async () => { - try { - const params = await getEventParams(OWNER, await currentBlockTime()) - params[0] = 'Test Event 5' - params[3] = params[2] - await createEvent({ - nbotMethods, - eventParams: params, - eventFactoryAddr, - escrowAmt, - from: OWNER, - gas: MAX_GAS, - }) - } catch (e) { - sassert.revert(e, 'betEndTime should be > betStartTime') - } - }) - it('throws if resultSetStartTime is < betEndTime', async () => { try { const params = await getEventParams(OWNER, await currentBlockTime()) @@ -388,24 +369,6 @@ contract('MultipleResultsEvent', (accounts) => { sassert.revert(e, 'resultSetStartTime should be >= betEndTime') } }) - - it('throws if resultSetEndTime is <= resultSetStartTime', async () => { - try { - const params = await getEventParams(OWNER, await currentBlockTime()) - params[0] = 'Test Event 7' - params[4] = params[3] - await createEvent({ - nbotMethods, - eventParams: params, - eventFactoryAddr, - escrowAmt, - from: OWNER, - gas: MAX_GAS, - }) - } catch (e) { - sassert.revert(e, 'resultSetEndTime should be > resultSetStartTime') - } - }) }) describe('tokenFallback()', () => { From a686fcfb16ce358ff1be1f6df33f68f28a2ce390 Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Tue, 18 Jun 2019 12:02:21 +0700 Subject: [PATCH 11/15] Add more tests for constructor --- test/event/multiple-results-event.js | 36 ++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test/event/multiple-results-event.js b/test/event/multiple-results-event.js index 33d0cb3..809f3c8 100644 --- a/test/event/multiple-results-event.js +++ b/test/event/multiple-results-event.js @@ -369,6 +369,42 @@ contract('MultipleResultsEvent', (accounts) => { sassert.revert(e, 'resultSetStartTime should be >= betEndTime') } }) + + it('throws if arbitrationOptionIndex is invalid', async () => { + try { + const params = await getEventParams(OWNER, await currentBlockTime()) + params[0] = 'Test Event 7' + params[5] = 4 + await createEvent({ + nbotMethods, + eventParams: params, + eventFactoryAddr, + escrowAmt, + from: OWNER, + gas: MAX_GAS, + }) + } catch (e) { + sassert.revert(e, 'arbitrationOptionIndex should be < 4') + } + }) + + it('throws if arbitrationRewardPercentage is invalid', async () => { + try { + const params = await getEventParams(OWNER, await currentBlockTime()) + params[0] = 'Test Event 8' + params[6] = 100 + await createEvent({ + nbotMethods, + eventParams: params, + eventFactoryAddr, + escrowAmt, + from: OWNER, + gas: MAX_GAS, + }) + } catch (e) { + sassert.revert(e, 'arbitrationRewardPercentage should be < 100') + } + }) }) describe('tokenFallback()', () => { From 070768f32fbb3c77fa91cc330f06cabfd35b1fa0 Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Tue, 18 Jun 2019 12:18:28 +0700 Subject: [PATCH 12/15] Add space --- contracts/event/EventFactory.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/event/EventFactory.sol b/contracts/event/EventFactory.sol index e057a0a..d17251c 100644 --- a/contracts/event/EventFactory.sol +++ b/contracts/event/EventFactory.sol @@ -98,7 +98,7 @@ contract EventFactory is NRC223Receiver { uint)); return createMultipleResultsEvent(from, value, eventName, eventResults, betEndTime, resultSetStartTime, centralizedOracle, - arbitrationOptionIndex, arbitrationRewardPercentage); + arbitrationOptionIndex, arbitrationRewardPercentage); } /// @dev Creates a new MultipleResultsEvent. Only tokenFallback can call this. From 551c7f4ea95112a9d998aa3ee4138788f13b12c7 Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Tue, 18 Jun 2019 12:18:33 +0700 Subject: [PATCH 13/15] Remove space --- contracts/event/EventFactory.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/event/EventFactory.sol b/contracts/event/EventFactory.sol index d17251c..e057a0a 100644 --- a/contracts/event/EventFactory.sol +++ b/contracts/event/EventFactory.sol @@ -98,7 +98,7 @@ contract EventFactory is NRC223Receiver { uint)); return createMultipleResultsEvent(from, value, eventName, eventResults, betEndTime, resultSetStartTime, centralizedOracle, - arbitrationOptionIndex, arbitrationRewardPercentage); + arbitrationOptionIndex, arbitrationRewardPercentage); } /// @dev Creates a new MultipleResultsEvent. Only tokenFallback can call this. From e9e9d64f40fe2048b9de3a0572eac3aa9a0a9191 Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Tue, 18 Jun 2019 13:06:26 +0700 Subject: [PATCH 14/15] Test bet start time with range --- test/event/multiple-results-event.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/event/multiple-results-event.js b/test/event/multiple-results-event.js index 809f3c8..de839f5 100644 --- a/test/event/multiple-results-event.js +++ b/test/event/multiple-results-event.js @@ -258,7 +258,8 @@ contract('MultipleResultsEvent', (accounts) => { const centralizedMeta = await eventMethods.centralizedMetadata().call() assert.equal(centralizedMeta[0], eventParams[4]) - assert.equal(centralizedMeta[1], betStartTime) + assert.isTrue(centralizedMeta[1] >= betStartTime - 50 + && centralizedMeta[1] <= betStartTime + 50) assert.equal(centralizedMeta[2], betEndTime) assert.equal(centralizedMeta[3], resultSetStartTime) assert.equal(centralizedMeta[4], resultSetEndTime) From d609702e07f48843a043a196fb6258063a3451b9 Mon Sep 17 00:00:00 2001 From: Deric Walintukan Date: Tue, 18 Jun 2019 13:07:05 +0700 Subject: [PATCH 15/15] Add comment --- test/event/multiple-results-event.js | 1 + 1 file changed, 1 insertion(+) diff --git a/test/event/multiple-results-event.js b/test/event/multiple-results-event.js index de839f5..064555f 100644 --- a/test/event/multiple-results-event.js +++ b/test/event/multiple-results-event.js @@ -258,6 +258,7 @@ contract('MultipleResultsEvent', (accounts) => { const centralizedMeta = await eventMethods.centralizedMetadata().call() assert.equal(centralizedMeta[0], eventParams[4]) + // Block time during testing isn't completely accurate so test within a range assert.isTrue(centralizedMeta[1] >= betStartTime - 50 && centralizedMeta[1] <= betStartTime + 50) assert.equal(centralizedMeta[2], betEndTime)