Skip to content

Commit

Permalink
Merge pull request #91 from gnosis/fix-gas-measurements
Browse files Browse the repository at this point in the history
Fix gas measurements
  • Loading branch information
cag authored Mar 2, 2018
2 parents 6291c05 + ce1d68f commit 7a5c272
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 43 deletions.
19 changes: 19 additions & 0 deletions scripts/measure_gas_stats.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,25 @@ spawnSync('npm', ['test'], { stdio: 'inherit', env: newEnv })

const gasStats = JSON.parse(fs.readFileSync(gasStatsFile))

// make sure this is toposorted
const inheritanceMap = [
['Event', ['CategoricalEvent', 'ScalarEvent']],
['StandardMarket', ['StandardMarketWithPriceLogger']],
['Market', ['StandardMarket']],
['MarketMaker', ['LMSRMarketMaker']],
['Oracle', ['CentralizedOracle', 'DifficultyOracle', 'FutarchyOracle', 'MajorityOracle', 'SignedMessageOracle', 'UltimateOracle']],
['StandardToken', ['EtherToken', 'OutcomeToken']],
['Token', ['StandardToken']],
].forEach(([parent, children]) => {
const childrenData = children.map(name => gasStats[name]).filter(data => data)
if(childrenData.length === 0) return
if(!gasStats[parent])
gasStats[parent] = {}

_.mergeWith(gasStats[parent], ...childrenData, (objValue, srcValue) =>
_.isArray(objValue) ? objValue.concat(srcValue) : undefined)
})

console.log('-- Gas stats --')

_.forEach(gasStats, (contractData, contractName) => {
Expand Down
37 changes: 20 additions & 17 deletions test/javascript/test_events.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
const utils = require('./utils')

const Event = artifacts.require('Event')
const CategoricalEvent = artifacts.require('CategoricalEvent')
const ScalarEvent = artifacts.require('ScalarEvent')
const EventFactory = artifacts.require('EventFactory')
const Token = artifacts.require('Token')
const OutcomeToken = artifacts.require('OutcomeToken')
const EtherToken = artifacts.require('EtherToken')
const CentralizedOracle = artifacts.require('CentralizedOracle')
const CentralizedOracleFactory = artifacts.require('CentralizedOracleFactory')

const contracts = [Event, EventFactory, Token, EtherToken, CentralizedOracle, CentralizedOracleFactory]
const contracts = [CategoricalEvent, ScalarEvent, EventFactory, OutcomeToken, EtherToken, CentralizedOracle, CentralizedOracleFactory]

contract('Event', function (accounts) {
let centralizedOracleFactory
Expand All @@ -31,24 +32,25 @@ contract('Event', function (accounts) {
)
event = utils.getParamFromTxEvent(
await eventFactory.createCategoricalEvent(etherToken.address, oracle.address, 2),
'categoricalEvent', Event
'categoricalEvent', CategoricalEvent
)
})

it('should buy and sell all outcomes', async () => {
// Buy all outcomes
const buyer = 0
const collateralTokenCount = 10
const collateralTokenCount = 1e19
await etherToken.deposit({ value: collateralTokenCount, from: accounts[buyer] })
assert.equal(await etherToken.balanceOf.call(accounts[buyer]), collateralTokenCount)

await etherToken.approve(event.address, collateralTokenCount, { from: accounts[buyer] })
await event.buyAllOutcomes(collateralTokenCount, { from: accounts[buyer] })
for(let i = 0; i < 10; i++)
await event.buyAllOutcomes(collateralTokenCount / 10, { from: accounts[buyer] })
assert.equal(await etherToken.balanceOf.call(event.address), collateralTokenCount)
assert.equal(await etherToken.balanceOf.call(accounts[buyer]), 0)

const outcomeToken1 = Token.at(await event.outcomeTokens.call(0))
const outcomeToken2 = Token.at(await event.outcomeTokens.call(1))
const outcomeToken1 = OutcomeToken.at(await event.outcomeTokens.call(0))
const outcomeToken2 = OutcomeToken.at(await event.outcomeTokens.call(1))
assert.equal(await outcomeToken1.balanceOf.call(accounts[buyer]), collateralTokenCount)
assert.equal(await outcomeToken2.balanceOf.call(accounts[buyer]), collateralTokenCount)

Expand All @@ -63,17 +65,18 @@ contract('Event', function (accounts) {
it('should buy and verify outcomes', async () => {
// Buy all outcomes
const buyer = 1
const collateralTokenCount = 10
const collateralTokenCount = 1e18
await etherToken.deposit({ value: collateralTokenCount, from: accounts[buyer] })
assert.equal(await etherToken.balanceOf.call(accounts[buyer]), collateralTokenCount)

await etherToken.approve(event.address, collateralTokenCount, { from: accounts[buyer] })
await event.buyAllOutcomes(collateralTokenCount, { from: accounts[buyer] })
for(let i = 0; i < 10; i++)
await event.buyAllOutcomes(collateralTokenCount / 10, { from: accounts[buyer] })
assert.equal(await etherToken.balanceOf.call(event.address), collateralTokenCount)
assert.equal(await etherToken.balanceOf.call(accounts[buyer]), 0)

const outcomeToken1 = Token.at(await event.outcomeTokens.call(0))
const outcomeToken2 = Token.at(await event.outcomeTokens.call(1))
const outcomeToken1 = OutcomeToken.at(await event.outcomeTokens.call(0))
const outcomeToken2 = OutcomeToken.at(await event.outcomeTokens.call(1))
assert.equal(await outcomeToken1.balanceOf.call(accounts[buyer]), collateralTokenCount)
assert.equal(await outcomeToken2.balanceOf.call(accounts[buyer]), collateralTokenCount)

Expand All @@ -99,8 +102,8 @@ contract('Event', function (accounts) {
assert.equal(await etherToken.balanceOf.call(event.address), collateralTokenCount)
assert.equal(await etherToken.balanceOf.call(accounts[buyer]), 0)

const outcomeToken1 = Token.at(await event.outcomeTokens.call(0))
const outcomeToken2 = Token.at(await event.outcomeTokens.call(1))
const outcomeToken1 = OutcomeToken.at(await event.outcomeTokens.call(0))
const outcomeToken2 = OutcomeToken.at(await event.outcomeTokens.call(1))
assert.equal(await outcomeToken1.balanceOf.call(accounts[buyer]), collateralTokenCount)
assert.equal(await outcomeToken2.balanceOf.call(accounts[buyer]), collateralTokenCount)

Expand All @@ -126,7 +129,7 @@ contract('Event', function (accounts) {
it('should buy, set, and redeem outcomes for scalar event', async () => {
const scalarEvent = utils.getParamFromTxEvent(
await eventFactory.createScalarEvent(etherToken.address, oracle.address, -100, 100),
'scalarEvent', Event
'scalarEvent', ScalarEvent
)
// Buy all outcomes
const buyer = 3
Expand All @@ -139,8 +142,8 @@ contract('Event', function (accounts) {
assert.equal(await etherToken.balanceOf.call(scalarEvent.address), collateralTokenCount)
assert.equal(await etherToken.balanceOf.call(accounts[buyer]), 0)

const outcomeToken1 = Token.at(await scalarEvent.outcomeTokens(0))
const outcomeToken2 = Token.at(await scalarEvent.outcomeTokens(1))
const outcomeToken1 = OutcomeToken.at(await scalarEvent.outcomeTokens(0))
const outcomeToken2 = OutcomeToken.at(await scalarEvent.outcomeTokens(1))
assert.equal(await outcomeToken1.balanceOf.call(accounts[buyer]), collateralTokenCount)
assert.equal(await outcomeToken2.balanceOf.call(accounts[buyer]), collateralTokenCount)

Expand Down
18 changes: 9 additions & 9 deletions test/javascript/test_market_makers.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@ const CentralizedOracleFactory = artifacts.require('CentralizedOracleFactory')
const StandardMarketFactory = artifacts.require('StandardMarketFactory')
const LMSRMarketMaker = artifacts.require('LMSRMarketMaker')
const EtherToken = artifacts.require('EtherToken')
const Token = artifacts.require('Token')
const Market = artifacts.require('Market')
const Event = artifacts.require('Event')
const OutcomeToken = artifacts.require('OutcomeToken')
const StandardMarket = artifacts.require('StandardMarket')
const CategoricalEvent = artifacts.require('CategoricalEvent')

const contracts = [EventFactory, CentralizedOracleFactory, StandardMarketFactory, LMSRMarketMaker, EtherToken, Token, Market, Event]
const contracts = [EventFactory, CentralizedOracleFactory, StandardMarketFactory, LMSRMarketMaker, EtherToken, OutcomeToken, StandardMarket, CategoricalEvent]

contract('MarketMaker', function(accounts) {
let eventFactory
Expand Down Expand Up @@ -41,7 +41,7 @@ contract('MarketMaker', function(accounts) {
'centralizedOracle')
const event = getParamFromTxEvent(
await eventFactory.createCategoricalEvent(etherToken.address, oracleAddress, numOutcomes),
'categoricalEvent', Event)
'categoricalEvent', CategoricalEvent)

// Create market
const investor = 0
Expand All @@ -50,7 +50,7 @@ contract('MarketMaker', function(accounts) {
const market = getParamFromTxEvent(
await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor,
{ from: accounts[investor] }),
'market', Market)
'market', StandardMarket)

// Fund market
const funding = 1e17
Expand All @@ -65,7 +65,7 @@ contract('MarketMaker', function(accounts) {
// User buys all outcomes
const trader = 1
const outcome = 1
const outcomeToken = Token.at(await event.outcomeTokens.call(outcome))
const outcomeToken = OutcomeToken.at(await event.outcomeTokens.call(outcome))
const tokenCount = 1e18
const loopCount = 10

Expand Down Expand Up @@ -120,14 +120,14 @@ contract('MarketMaker', function(accounts) {
'centralizedOracle')
const event = getParamFromTxEvent(
await eventFactory.createCategoricalEvent(etherToken.address, oracleAddress, numOutcomes),
'categoricalEvent', Event)
'categoricalEvent', CategoricalEvent)

// Create market
const feeFactor = 0 // 0%
const market = getParamFromTxEvent(
await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor,
{ from: accounts[investor] }),
'market', Market)
'market', StandardMarket)

// Fund market
await etherToken.deposit({ value: funding, from: accounts[investor] })
Expand Down
28 changes: 14 additions & 14 deletions test/javascript/test_markets.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@ const { wait } = require('@digix/tempo')(web3)
const utils = require('./utils')
const { getParamFromTxEvent, assertRejects } = utils

const Event = artifacts.require('Event')
const CategoricalEvent = artifacts.require('CategoricalEvent')
const EventFactory = artifacts.require('EventFactory')
const Token = artifacts.require('Token')
const OutcomeToken = artifacts.require('OutcomeToken')
const EtherToken = artifacts.require('EtherToken')
const CentralizedOracle = artifacts.require('CentralizedOracle')
const CentralizedOracleFactory = artifacts.require('CentralizedOracleFactory')
const Market = artifacts.require('Market')
const StandardMarket = artifacts.require('StandardMarket')
const StandardMarketFactory = artifacts.require('StandardMarketFactory')
const LMSRMarketMaker = artifacts.require('LMSRMarketMaker')
const Campaign = artifacts.require('Campaign')
const CampaignFactory = artifacts.require('CampaignFactory')

const contracts = [Event, EventFactory, Token, EtherToken, CentralizedOracle, CentralizedOracleFactory, Market, StandardMarketFactory, LMSRMarketMaker, Campaign, CampaignFactory]
const contracts = [CategoricalEvent, EventFactory, OutcomeToken, EtherToken, CentralizedOracle, CentralizedOracleFactory, StandardMarket, StandardMarketFactory, LMSRMarketMaker, Campaign, CampaignFactory]

contract('Market', function (accounts) {
contract('StandardMarket', function (accounts) {
let centralizedOracleFactory
let eventFactory
let etherToken
Expand Down Expand Up @@ -45,7 +45,7 @@ contract('Market', function (accounts) {
)
event = getParamFromTxEvent(
await eventFactory.createCategoricalEvent(etherToken.address, centralizedOracle.address, 2),
'categoricalEvent', Event
'categoricalEvent', CategoricalEvent
)
})

Expand All @@ -56,7 +56,7 @@ contract('Market', function (accounts) {
const feeFactor = 0
const market = getParamFromTxEvent(
await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor, { from: accounts[buyer] }),
'market', Market
'market', StandardMarket
)

// Fund market
Expand All @@ -68,7 +68,7 @@ contract('Market', function (accounts) {
await etherToken.approve(market.address, funding, { from: accounts[buyer] })
await market.fund(funding, { from: accounts[buyer] })

// Market can only be funded once
// StandardMarket can only be funded once
await etherToken.deposit({ value: funding, from: accounts[buyer] })
assert.equal(await etherToken.balanceOf.call(accounts[buyer]), funding)
await etherToken.approve(market.address, funding, { from: accounts[buyer] })
Expand All @@ -79,7 +79,7 @@ contract('Market', function (accounts) {
// Close market
await market.close({ from: accounts[buyer] })

// Market can only be closed once
// StandardMarket can only be closed once
await assertRejects(market.close({ from: accounts[buyer] }), 'market closed twice')

// Sell all outcomes
Expand All @@ -94,7 +94,7 @@ contract('Market', function (accounts) {
const feeFactor = 50000 // 5%
const market = getParamFromTxEvent(
await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor, { from: accounts[investor] }),
'market', Market
'market', StandardMarket
)

// Fund market
Expand Down Expand Up @@ -126,7 +126,7 @@ contract('Market', function (accounts) {
await market.buy(outcome, tokenCount, cost, { from: accounts[buyer] }), 'outcomeTokenCost'
), outcomeTokenCost.valueOf())

const outcomeToken = Token.at(await event.outcomeTokens.call(outcome))
const outcomeToken = OutcomeToken.at(await event.outcomeTokens.call(outcome))
assert.equal(await outcomeToken.balanceOf.call(accounts[buyer]), tokenCount)
assert.equal(await etherToken.balanceOf.call(accounts[buyer]), 0)

Expand All @@ -151,7 +151,7 @@ contract('Market', function (accounts) {
const feeFactor = 50000 // 5%
const market = getParamFromTxEvent(
await standardMarketFactory.createMarket(event.address, lmsrMarketMaker.address, feeFactor, { from: accounts[investor] }),
'market', Market
'market', StandardMarket
)

// Fund market
Expand Down Expand Up @@ -184,7 +184,7 @@ contract('Market', function (accounts) {
'cost', null, 'OutcomeTokenShortSale'
).valueOf(), cost)
assert.equal(await etherToken.balanceOf.call(accounts[buyer]), tokenCount - cost)
const outcomeToken = Token.at(await event.outcomeTokens.call(oppositeOutcome))
const outcomeToken = OutcomeToken.at(await event.outcomeTokens.call(oppositeOutcome))
assert.equal(await outcomeToken.balanceOf.call(accounts[buyer]), tokenCount)
})

Expand Down Expand Up @@ -221,7 +221,7 @@ contract('Market', function (accounts) {
assert.equal(await campaign.stage.call(), 1)

// Create market
const market = Market.at(getParamFromTxEvent(await campaign.createMarket(), 'market'))
const market = StandardMarket.at(getParamFromTxEvent(await campaign.createMarket(), 'market'))

// Trade
const buyer = 4
Expand Down
6 changes: 3 additions & 3 deletions test/javascript/test_oracles.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ const StandardMarketWithPriceLogger = artifacts.require('StandardMarketWithPrice
const LMSRMarketMaker = artifacts.require('LMSRMarketMaker')
const CategoricalEvent = artifacts.require('CategoricalEvent')
const ScalarEvent = artifacts.require('ScalarEvent')
const Token = artifacts.require('Token')
const OutcomeToken = artifacts.require('OutcomeToken')

const contracts = [EtherToken, CentralizedOracle, CentralizedOracleFactory, DifficultyOracle, DifficultyOracleFactory, MajorityOracle, MajorityOracleFactory, UltimateOracle, UltimateOracleFactory, FutarchyOracle, FutarchyOracleFactory, StandardMarketWithPriceLogger, LMSRMarketMaker, CategoricalEvent, ScalarEvent, Token]
const contracts = [EtherToken, CentralizedOracle, CentralizedOracleFactory, DifficultyOracle, DifficultyOracleFactory, MajorityOracle, MajorityOracleFactory, UltimateOracle, UltimateOracleFactory, FutarchyOracle, FutarchyOracleFactory, StandardMarketWithPriceLogger, LMSRMarketMaker, CategoricalEvent, ScalarEvent, OutcomeToken]

contract('Oracle', function (accounts) {
let centralizedOracleFactory
Expand Down Expand Up @@ -172,7 +172,7 @@ contract('Oracle', function (accounts) {
await categoricalEvent.buyAllOutcomes(cost, { from: accounts[buyer] })

// Buy long tokens from market 1
const collateralToken = Token.at(await categoricalEvent.outcomeTokens(1))
const collateralToken = OutcomeToken.at(await categoricalEvent.outcomeTokens(1))
await collateralToken.approve(market.address, cost, { from: accounts[buyer] })

assert.equal(utils.getParamFromTxEvent(
Expand Down

0 comments on commit 7a5c272

Please sign in to comment.