Ejemplo n.º 1
0
def test_market_creation(contractsFixture, universe, cash, market):
    reportingWindow = contractsFixture.applySignature(
        'ReportingWindow', market.getReportingWindow())
    shadyStakeToken = contractsFixture.upload(
        '../source/contracts/reporting/StakeToken.sol', 'shadyStakeToken')
    shadyStakeToken.setController(
        contractsFixture.contracts["Controller"].address)
    shadyStakeToken.initialize(market.address, [0, market.getNumTicks()])

    logs = []
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)
    market = contractsFixture.createReasonableBinaryMarket(
        universe, cash, extraInfo="so extra")

    assert len(logs) == 3
    assert logs[2]['_event_type'] == 'MarketCreated'
    assert logs[2]['extraInfo'] == 'so extra'
    assert logs[2][
        'marketCreationFee'] == universe.getOrCacheMarketCreationCost()
    assert logs[2]['market'] == market.address
    assert logs[2]['marketCreator'] == bytesToHexString(tester.a0)

    assert market.getUniverse() == universe.address
    assert market.getNumberOfOutcomes() == 2
    assert market.getNumTicks() == 10000
    assert reportingWindow.getReputationToken() == universe.getReputationToken(
    )
    assert market.getFinalPayoutDistributionHash() == stringToBytes("")
    assert market.getReportingState(
    ) == contractsFixture.contracts['Constants'].PRE_REPORTING()
    assert market.isContainerForStakeToken(shadyStakeToken.address) == 0
    assert market.getDesignatedReportDueTimestamp(
    ) == market.getEndTime() + timedelta(days=3).total_seconds()
Ejemplo n.º 2
0
def test_firstReportingHappyPath(makeReport, localFixture, universe, market):
    reportingWindow = localFixture.applySignature('ReportingWindow', market.getReportingWindow())
    reputationToken = localFixture.applySignature('ReputationToken', universe.getReputationToken())

    # Proceed to the FIRST REPORTING phase
    proceedToFirstReporting(localFixture, universe, market, makeReport, 1, [0,market.getNumTicks()], [market.getNumTicks(),0])

    logs = []
    captureFilteredLogs(localFixture.chain.head_state, localFixture.contracts['Augur'], logs)

    # We make one report by Tester 2
    stakeTokenYes = localFixture.getOrCreateStakeToken(market, [0,market.getNumTicks()])
    stakeTokenYes.buy(1, sender=tester.k2)
    # If there ws no designated report he first reporter gets the no-show REP bond auto-staked on the outcome they're purchasing
    expectedStakeTokenBalance = 1
    if (not makeReport):
        expectedStakeTokenBalance += universe.getOrCacheDesignatedReportNoShowBond()

    assert stakeTokenYes.balanceOf(tester.a2) == expectedStakeTokenBalance

    # Confirm the report logging works
    log = logs[2]
    if not makeReport:
        log = logs[3]
        assert len(logs) == 4
    else:
        assert len(logs) == 3

    assert log['_event_type'] == 'ReportSubmitted'
    assert log['amountStaked'] == expectedStakeTokenBalance
    assert log['reporter'] == bytesToHexString(tester.a2)
    assert log['stakeToken'] == localFixture.getOrCreateStakeToken(market, [0,market.getNumTicks()]).address
    assert log['market'] == market.address
    assert log['payoutNumerators'] == [0,market.getNumTicks()]

    assert reputationToken.balanceOf(tester.a2) == 1 * 10 ** 6 * 10 ** 18 - 1
    tentativeWinner = market.getTentativeWinningPayoutDistributionHash()
    if (makeReport):
        # The tentative winner will be the No outcome at first since we disputed Yes and have to stake on an outcome in that case
        stakeTokenNo = localFixture.getOrCreateStakeToken(market, [market.getNumTicks(),0])
        assert tentativeWinner == stakeTokenNo.getPayoutDistributionHash()
        # If we buy the full designated bond amount we will be back to the YES outcome winning
        stakeTokenYes.buy(localFixture.contracts['Constants'].DESIGNATED_REPORTER_DISPUTE_BOND_AMOUNT(), sender=tester.k2)
        tentativeWinner = market.getTentativeWinningPayoutDistributionHash()

    assert tentativeWinner == stakeTokenYes.getPayoutDistributionHash()

    # To progress into the FIRST DISPUTE phase we move time forward
    localFixture.chain.head_state.timestamp = reportingWindow.getDisputeStartTime() + 1
    assert market.getReportingState() == localFixture.contracts['Constants'].FIRST_DISPUTE()

    # If time passes and no dispute bond is placed the market can be finalized
    localFixture.chain.head_state.timestamp = reportingWindow.getDisputeEndTime() + 1

    # The market is awaiting finalization now
    assert market.getReportingState() == localFixture.contracts['Constants'].AWAITING_FINALIZATION()

    # We can finalize it
    assert market.tryFinalize()
    assert market.getReportingState() == localFixture.contracts['Constants'].FINALIZED()
Ejemplo n.º 3
0
def test_publicCreateOrder_bid2(contractsFixture, cash, market, universe):
    orders = contractsFixture.contracts['Orders']
    createOrder = contractsFixture.contracts['CreateOrder']
    logs = []

    orderType = BID
    amount = 1
    fxpPrice = fix('0.6')
    outcome = 0
    tradeGroupID = 42

    marketInitialCash = cash.balanceOf(market.address)
    captureFilteredLogs(contractsFixture.chain.head_state, contractsFixture.contracts['Augur'], logs)
    creatorInitialETH = contractsFixture.chain.head_state.get_balance(tester.a1)
    orderID = createOrder.publicCreateOrder(orderType, amount, fxpPrice, market.address, outcome, longTo32Bytes(0), longTo32Bytes(0), tradeGroupID, sender=tester.k1, value = fix('10'))
    assert orderID != bytearray(32), "Order ID should be non-zero"

    assert orders.getAmount(orderID) == amount
    assert orders.getPrice(orderID) == fxpPrice
    assert orders.getOrderCreator(orderID) == bytesToHexString(tester.a1)
    assert orders.getOrderMoneyEscrowed(orderID) == 0.6 * 10**18
    assert orders.getOrderSharesEscrowed(orderID) == 0
    assert cash.balanceOf(tester.a1) == 0
    assert contractsFixture.chain.head_state.get_balance(tester.a1) == creatorInitialETH - long(0.6 * 10**18)
    assert cash.balanceOf(market.address) - marketInitialCash == 0.6 * 10**18
    shareToken = contractsFixture.getShareToken(market, 0)
    assert len(logs) == 1
    assert logs[0]['_event_type'] == 'OrderCreated'
    assert logs[0]['creator'] == bytesToHexString(tester.a1)
    assert logs[0]['shareToken'] == shareToken.address
    assert logs[0]['tradeGroupId'] == 42
    assert logs[0]['orderId'] == orderID
def test_fee_wondow_logging(contractsFixture, market, categoricalMarket,
                            scalarMarket, universe):
    feeWindow = contractsFixture.applySignature(
        'FeeWindow', universe.getOrCreateCurrentFeeWindow())

    contractsFixture.contracts["Time"].setTimestamp(feeWindow.getStartTime() +
                                                    1)

    assert feeWindow.buy(100)

    logs = []
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)

    assert feeWindow.transfer(tester.a1, 8)

    assert len(logs) == 1
    assert logs[0]['_event_type'] == 'TokensTransferred'
    assert logs[0]['from'] == bytesToHexString(tester.a0)
    assert logs[0]['to'] == bytesToHexString(tester.a1)
    assert logs[0]['token'] == feeWindow.address
    assert logs[0]['universe'] == universe.address
    assert logs[0]['value'] == 8

    assert feeWindow.approve(tester.a2, 12)

    assert feeWindow.transferFrom(tester.a0, tester.a1, 12, sender=tester.k2)

    assert len(logs) == 2
    assert logs[1]['_event_type'] == 'TokensTransferred'
    assert logs[1]['from'] == bytesToHexString(tester.a0)
    assert logs[1]['to'] == bytesToHexString(tester.a1)
    assert logs[1]['token'] == feeWindow.address
    assert logs[1]['universe'] == universe.address
    assert logs[1]['value'] == 12
Ejemplo n.º 5
0
def test_reputation_token_logging(contractsFixture, universe):
    reputationToken = contractsFixture.applySignature("ReputationToken", universe.getReputationToken())

    logs = []
    captureFilteredLogs(contractsFixture.chain.head_state, contractsFixture.contracts['Augur'], logs)

    assert reputationToken.transfer(tester.a1, 8)

    assert len(logs) == 1
    assert logs[0]['_event_type'] == 'TokensTransferred'
    assert logs[0]['from'] == bytesToHexString(tester.a0)
    assert logs[0]['to'] == bytesToHexString(tester.a1)
    assert logs[0]['token'] == reputationToken.address
    assert logs[0]['universe'] == universe.address
    assert logs[0]['tokenType'] == 0
    assert logs[0]['value'] == 8

    assert reputationToken.approve(tester.a2, 12)

    assert reputationToken.transferFrom(tester.a0, tester.a1, 12, sender=tester.k2)

    assert len(logs) == 2
    assert logs[1]['_event_type'] == 'TokensTransferred'
    assert logs[1]['from'] == bytesToHexString(tester.a0)
    assert logs[1]['to'] == bytesToHexString(tester.a1)
    assert logs[1]['token'] == reputationToken.address
    assert logs[1]['universe'] == universe.address
    assert logs[0]['tokenType'] == 0
    assert logs[1]['value'] == 12
Ejemplo n.º 6
0
def test_publicFillOrder_bid(contractsFixture, cash, market, universe):
    createOrder = contractsFixture.contracts['CreateOrder']
    fillOrder = contractsFixture.contracts['FillOrder']
    orders = contractsFixture.contracts['Orders']
    tradeGroupID = "42"
    logs = []

    initialMakerETH = contractsFixture.chain.head_state.get_balance(tester.a1)
    initialFillerETH = contractsFixture.chain.head_state.get_balance(tester.a2)
    creatorCost = fix('2', '6000')
    fillerCost = fix('2', '4000')

    # create order
    orderID = createOrder.publicCreateOrder(BID,
                                            fix(2),
                                            6000,
                                            market.address,
                                            YES,
                                            longTo32Bytes(0),
                                            longTo32Bytes(0),
                                            tradeGroupID,
                                            sender=tester.k1,
                                            value=creatorCost)

    # fill best order
    captureFilteredLogs(contractsFixture.chain.head_state, orders, logs)
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)
    fillOrderID = fillOrder.publicFillOrder(orderID,
                                            fix(2),
                                            tradeGroupID,
                                            sender=tester.k2,
                                            value=fillerCost)

    assert len(logs) == 5

    assert logs[4]["_event_type"] == "OrderFilled"
    assert logs[4]["filler"] == bytesToHexString(tester.a2)
    assert logs[4]["numCreatorShares"] == 0
    assert logs[4]["numCreatorTokens"] == creatorCost
    assert logs[4]["numFillerShares"] == 0
    assert logs[4]["numFillerTokens"] == fillerCost
    assert logs[4]["marketCreatorFees"] == 0
    assert logs[4]["reporterFees"] == 0
    assert logs[4]["shareToken"] == market.getShareToken(YES)
    assert logs[4]["tradeGroupId"] == stringToBytes("42")

    assert contractsFixture.chain.head_state.get_balance(
        tester.a1) == initialMakerETH - creatorCost
    assert contractsFixture.chain.head_state.get_balance(
        tester.a2) == initialFillerETH - fillerCost
    assert orders.getAmount(orderID) == 0
    assert orders.getPrice(orderID) == 0
    assert orders.getOrderCreator(orderID) == longToHexString(0)
    assert orders.getOrderMoneyEscrowed(orderID) == 0
    assert orders.getOrderSharesEscrowed(orderID) == 0
    assert orders.getBetterOrderId(orderID) == longTo32Bytes(0)
    assert orders.getWorseOrderId(orderID) == longTo32Bytes(0)
    assert fillOrderID == 0
Ejemplo n.º 7
0
def test_ask_withPartialShares(contractsFixture, universe, cash, market):
    orders = contractsFixture.contracts['Orders']
    createOrder = contractsFixture.contracts['CreateOrder']
    fillOrder = contractsFixture.contracts['FillOrder']
    completeSets = contractsFixture.contracts['CompleteSets']
    yesShareToken = contractsFixture.applySignature('ShareToken',
                                                    market.getShareToken(YES))
    noShareToken = contractsFixture.applySignature('ShareToken',
                                                   market.getShareToken(NO))
    logs = []

    # buy fix(2) complete sets
    assert completeSets.publicBuyCompleteSets(market.address,
                                              fix(2),
                                              sender=tester.k1,
                                              value=fix(
                                                  2, market.getNumTicks()))
    assert cash.balanceOf(tester.a1) == fix('0')
    assert yesShareToken.balanceOf(tester.a1) == fix(2)
    assert noShareToken.balanceOf(tester.a1) == fix(2)

    logs = []
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)

    # create ASK order for fix(3) shares with a mix of shares and cash
    assert yesShareToken.approve(createOrder.address,
                                 fix('2'),
                                 sender=tester.k1)
    orderID = createOrder.publicCreateOrder(ASK,
                                            fix(3),
                                            4000,
                                            market.address,
                                            YES,
                                            longTo32Bytes(0),
                                            longTo32Bytes(0),
                                            "42",
                                            sender=tester.k1,
                                            value=fix('6000'))
    assert cash.balanceOf(tester.a1) == fix('0')
    assert yesShareToken.balanceOf(tester.a1) == 0
    assert noShareToken.balanceOf(tester.a1) == fix(2)

    # Confirm create order logging works correctly
    assert len(logs) == 2
    assert logs[1]['_event_type'] == 'OrderCreated'
    assert logs[1]['creator'] == bytesToHexString(tester.a1)
    assert logs[1]['shareToken'] == yesShareToken.address
    assert logs[1]['tradeGroupId'] == stringToBytes("42")
    assert logs[1]['orderId'] == orderID

    # validate the order contains expected results
    assert orderID != bytearray(32), "Order ID should be non-zero"
    assert orders.getAmount(orderID) == fix(3)
    assert orders.getPrice(orderID) == 4000
    assert orders.getOrderCreator(orderID) == bytesToHexString(tester.a1)
    assert orders.getOrderMoneyEscrowed(orderID) == fix('6000')
    assert orders.getOrderSharesEscrowed(orderID) == fix(2)
Ejemplo n.º 8
0
def test_create_bid_with_shares_fill_with_shares(contractsFixture, cash, market, universe):
    completeSets = contractsFixture.contracts['CompleteSets']
    createOrder = contractsFixture.contracts['CreateOrder']
    fillOrder = contractsFixture.contracts['FillOrder']

    yesShareToken = contractsFixture.applySignature('ShareToken', market.getShareToken(YES))
    noShareToken = contractsFixture.applySignature('ShareToken', market.getShareToken(NO))
    totalProceeds = fix('12', market.getNumTicks())
    marketCreatorFee = totalProceeds / market.getMarketCreatorSettlementFeeDivisor()
    reporterFee = totalProceeds / universe.getOrCacheReportingFeeDivisor()
    completeSetFees = marketCreatorFee + reporterFee

    # 1. buy complete sets with both accounts
    assert completeSets.publicBuyCompleteSets(market.address, fix(12), sender = tester.k1, value=fix('12', market.getNumTicks()))
    assert completeSets.publicBuyCompleteSets(market.address, fix(12), sender = tester.k2, value=fix('12', market.getNumTicks()))
    assert cash.balanceOf(tester.a1) == fix('0')
    assert cash.balanceOf(tester.a2) == fix('0')
    assert yesShareToken.balanceOf(tester.a2) == fix(12)
    assert yesShareToken.balanceOf(tester.a1) == fix(12)
    assert noShareToken.balanceOf(tester.a1) == fix(12)
    assert noShareToken.balanceOf(tester.a2) == fix(12)

    # 2. create BID order for YES with NO shares escrowed
    assert noShareToken.approve(createOrder.address, fix(12), sender = tester.k1)
    orderID = createOrder.publicCreateOrder(BID, fix(12), 6000, market.address, YES, longTo32Bytes(0), longTo32Bytes(0), "42", sender = tester.k1)
    assert orderID
    assert cash.balanceOf(tester.a1) == fix('0')
    assert yesShareToken.balanceOf(tester.a1) == fix(12)
    assert noShareToken.balanceOf(tester.a1) == 0

    # 3. fill BID order for YES with shares of YES
    initialMakerETH = contractsFixture.chain.head_state.get_balance(tester.a1)
    initialFillerETH = contractsFixture.chain.head_state.get_balance(tester.a2)
    assert yesShareToken.approve(fillOrder.address, fix(12), sender = tester.k2)

    logs = []
    captureFilteredLogs(contractsFixture.chain.head_state, contractsFixture.contracts['Augur'], logs)
    leftoverInOrder = fillOrder.publicFillOrder(orderID, fix(12), sender = tester.k2)

    orderFilledLog = logs[5]
    assert orderFilledLog['_event_type'] == 'OrderFilled'
    assert orderFilledLog['marketCreatorFees'] == marketCreatorFee
    assert orderFilledLog['reporterFees'] == reporterFee

    creatorFee = completeSetFees * 0.4
    fillerFee = completeSetFees * 0.6
    assert leftoverInOrder == 0
    creatorPayment = fix('12', '4000') - long(creatorFee)
    fillerPayment = fix('12', '6000') - long(fillerFee)
    assert cash.balanceOf(tester.a1) == 0
    assert cash.balanceOf(tester.a2) == 0
    assert contractsFixture.chain.head_state.get_balance(tester.a1) == initialMakerETH + long(creatorPayment)
    assert contractsFixture.chain.head_state.get_balance(tester.a2) == initialFillerETH + long(fillerPayment)
    assert yesShareToken.balanceOf(tester.a1) == fix(12)
    assert yesShareToken.balanceOf(tester.a2) == 0
    assert noShareToken.balanceOf(tester.a1) == 0
    assert noShareToken.balanceOf(tester.a2) == fix(12)
Ejemplo n.º 9
0
def test_basic_token_emit(localFixture, chain, mockToken):
    logs = []
    assert mockToken.mint(tester.a1, 101)
    captureFilteredLogs(chain.head_state, mockToken, logs)
    assert mockToken.callInternalTransfer(tester.a1, tester.a2, 101)
    assert mockToken.balanceOf(tester.a2) == 101
    assert len(logs) == 1
    assert logs[0]['_event_type'] == 'Transfer'
    assert logs[0]['value'] == 101L
Ejemplo n.º 10
0
def test_one_ask_on_books_buy_partial_order(contractsFixture, cash, market,
                                            universe):
    createOrder = contractsFixture.contracts['CreateOrder']
    trade = contractsFixture.contracts['Trade']
    fillOrder = contractsFixture.contracts['FillOrder']
    orders = contractsFixture.contracts['Orders']
    tradeGroupID = "42"
    logs = []

    # create order
    orderID = createOrder.publicCreateOrder(ASK,
                                            fix(12),
                                            6000,
                                            market.address,
                                            YES,
                                            longTo32Bytes(0),
                                            longTo32Bytes(0),
                                            tradeGroupID,
                                            sender=tester.k1,
                                            value=fix('12', '4000'))

    # fill best order
    captureFilteredLogs(contractsFixture.chain.head_state, orders, logs)
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)
    fillOrderID = trade.publicBuy(market.address,
                                  YES,
                                  fix(7),
                                  6000,
                                  tradeGroupID,
                                  sender=tester.k2,
                                  value=fix('7', '6000'))

    assert len(logs) == 5
    log1 = logs[4]

    assert log1["_event_type"] == "OrderFilled"
    assert log1["filler"] == bytesToHexString(tester.a2)
    assert log1["numCreatorShares"] == 0
    assert log1["numCreatorTokens"] == fix('7', '4000')
    assert log1["numFillerShares"] == 0
    assert log1["numFillerTokens"] == fix('7', '6000')
    assert log1["marketCreatorFees"] == 0
    assert log1["reporterFees"] == 0
    assert log1["shareToken"] == market.getShareToken(YES)
    assert log1["tradeGroupId"] == stringToBytes("42")

    assert orders.getAmount(orderID) == fix(5)
    assert orders.getPrice(orderID) == 6000
    assert orders.getOrderCreator(orderID) == bytesToHexString(tester.a1)
    assert orders.getOrderMoneyEscrowed(orderID) == fix('5', '4000')
    assert orders.getOrderSharesEscrowed(orderID) == 0
    assert orders.getBetterOrderId(orderID) == longTo32Bytes(0)
    assert orders.getWorseOrderId(orderID) == longTo32Bytes(0)

    assert fillOrderID == longTo32Bytes(1)
Ejemplo n.º 11
0
def test_stake_token_logging(contractsFixture, market, categoricalMarket,
                             scalarMarket, universe):
    reportingWindow = contractsFixture.applySignature(
        'ReportingWindow', market.getReportingWindow())
    participationToken = contractsFixture.applySignature(
        "ParticipationToken", reportingWindow.getParticipationToken())

    contractsFixture.chain.head_state.timestamp = market.getEndTime() + 1

    assert contractsFixture.designatedReport(market,
                                             [0, market.getNumTicks()],
                                             tester.k0)
    assert contractsFixture.designatedReport(
        categoricalMarket, [0, 0, categoricalMarket.getNumTicks()], tester.k0)
    assert contractsFixture.designatedReport(scalarMarket,
                                             [0, scalarMarket.getNumTicks()],
                                             tester.k0)

    contractsFixture.chain.head_state.timestamp = reportingWindow.getStartTime(
    ) + 1

    assert market.tryFinalize()
    assert categoricalMarket.tryFinalize()
    assert scalarMarket.tryFinalize()

    assert participationToken.buy(100)

    logs = []
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)

    assert participationToken.transfer(tester.a1, 8)

    assert len(logs) == 1
    assert logs[0]['_event_type'] == 'TokensTransferred'
    assert logs[0]['from'] == bytesToHexString(tester.a0)
    assert logs[0]['to'] == bytesToHexString(tester.a1)
    assert logs[0]['token'] == participationToken.address
    assert logs[0]['universe'] == universe.address
    assert logs[0]['value'] == 8

    assert participationToken.approve(tester.a2, 12)

    assert participationToken.transferFrom(tester.a0,
                                           tester.a1,
                                           12,
                                           sender=tester.k2)

    assert len(logs) == 2
    assert logs[1]['_event_type'] == 'TokensTransferred'
    assert logs[1]['from'] == bytesToHexString(tester.a0)
    assert logs[1]['to'] == bytesToHexString(tester.a1)
    assert logs[1]['token'] == participationToken.address
    assert logs[1]['universe'] == universe.address
    assert logs[1]['value'] == 12
Ejemplo n.º 12
0
def proceedToLastReporting(testFixture, universe, market, makeReport,
                           designatedDisputer, firstDisputer, reportOutcomes,
                           designatedDisputeOutcomes, firstReporter,
                           firstReportOutcomes, firstReportDisputeOutcomes):
    cash = testFixture.contracts['Cash']
    reputationToken = testFixture.applySignature('ReputationToken',
                                                 universe.getReputationToken())
    reportingWindow = testFixture.applySignature('ReportingWindow',
                                                 market.getReportingWindow())

    if (market.getReportingState() !=
            testFixture.contracts['Constants'].FIRST_REPORTING()):
        proceedToFirstReporting(testFixture, universe, market, makeReport,
                                designatedDisputer, reportOutcomes,
                                designatedDisputeOutcomes)

    stakeToken = testFixture.getOrCreateStakeToken(market, firstReportOutcomes)

    # We make one report by the firstReporter
    assert stakeToken.buy(1, sender=testFixture.testerKey[firstReporter])
    tentativeWinner = market.getTentativeWinningPayoutDistributionHash()
    assert tentativeWinner == stakeToken.getPayoutDistributionHash()

    testFixture.chain.head_state.timestamp = reportingWindow.getDisputeStartTime(
    ) + 1

    assert market.getReportingState(
    ) == testFixture.contracts['Constants'].FIRST_DISPUTE()

    logs = []
    captureFilteredLogs(testFixture.chain.head_state,
                        testFixture.contracts['Augur'], logs)

    disputeFirstReportOutcomeStake = testFixture.contracts[
        'Constants'].DESIGNATED_REPORTER_DISPUTE_BOND_AMOUNT()
    assert market.disputeFirstReporters(
        firstReportDisputeOutcomes,
        disputeFirstReportOutcomeStake,
        False,
        sender=testFixture.testerKey[firstDisputer])

    # Confirm the first dispute logging works
    assert len(logs) == 4
    assert logs[3]['_event_type'] == 'ReportsDisputed'
    assert logs[3]['reportingPhase'] == testFixture.contracts[
        'Constants'].FIRST_DISPUTE()
    assert logs[3]['disputer'] == bytesToHexString(
        testFixture.testerAddress[firstDisputer])
    assert logs[3]['disputeBondAmount'] == testFixture.contracts[
        'Constants'].FIRST_REPORTERS_DISPUTE_BOND_AMOUNT()
    assert logs[3]['market'] == market.address

    # We're in the LAST REPORTING phase now
    assert market.getReportingState(
    ) == testFixture.contracts['Constants'].LAST_REPORTING()
Ejemplo n.º 13
0
def test_one_bid_on_books_buy_full_order(contractsFixture, cash, market,
                                         universe):
    createOrder = contractsFixture.contracts['CreateOrder']
    trade = contractsFixture.contracts['Trade']
    fillOrder = contractsFixture.contracts['FillOrder']
    orders = contractsFixture.contracts['Orders']
    tradeGroupID = 42L
    logs = []

    # create order
    orderID = createOrder.publicCreateOrder(BID,
                                            2,
                                            fix('0.6'),
                                            market.address,
                                            YES,
                                            longTo32Bytes(0),
                                            longTo32Bytes(0),
                                            tradeGroupID,
                                            sender=tester.k1,
                                            value=fix('2', '0.6'))

    # fill best order
    captureFilteredLogs(contractsFixture.chain.head_state, orders, logs)
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)
    fillOrderID = trade.publicSell(market.address,
                                   YES,
                                   2,
                                   fix('0.6'),
                                   tradeGroupID,
                                   sender=tester.k2,
                                   value=fix('2', '0.4'))

    assert len(logs) == 5
    log1 = logs[4]

    assert log1["_event_type"] == "OrderFilled"
    assert log1["filler"] == bytesToHexString(tester.a2)
    assert log1["numCreatorShares"] == 0
    assert log1["numCreatorTokens"] == fix('2', '0.6')
    assert log1["numFillerShares"] == 0
    assert log1["numFillerTokens"] == fix('2', '0.4')
    assert log1["settlementFees"] == 0
    assert log1["shareToken"] == market.getShareToken(YES)
    assert log1["tradeGroupId"] == 42

    assert orders.getAmount(orderID) == 0
    assert orders.getPrice(orderID) == 0
    assert orders.getOrderCreator(orderID) == longToHexString(0)
    assert orders.getOrderMoneyEscrowed(orderID) == 0
    assert orders.getOrderSharesEscrowed(orderID) == 0
    assert orders.getBetterOrderId(orderID) == longTo32Bytes(0)
    assert orders.getWorseOrderId(orderID) == longTo32Bytes(0)
    assert fillOrderID == longTo32Bytes(1)
Ejemplo n.º 14
0
def test_cancelBid(contractsFixture, cash, market, universe):
    createOrder = contractsFixture.contracts['CreateOrder']
    cancelOrder = contractsFixture.contracts['CancelOrder']
    orders = contractsFixture.contracts['Orders']

    orderType = BID
    fxpAmount = 1
    fxpPrice = fix('0.6')
    outcomeID = YES
    tradeGroupID = 42
    yesShareToken = contractsFixture.applySignature('ShareToken', market.getShareToken(YES))
    noShareToken = contractsFixture.applySignature('ShareToken', market.getShareToken(NO))
    creatorInitialETH = contractsFixture.chain.head_state.get_balance(tester.a1)
    creatorInitialShares = yesShareToken.balanceOf(tester.a1)
    marketInitialCash = cash.balanceOf(market.address)
    marketInitialYesShares = yesShareToken.totalSupply()
    marketInitialNoShares = noShareToken.totalSupply()
    orderID = createOrder.publicCreateOrder(orderType, fxpAmount, fxpPrice, market.address, outcomeID, longTo32Bytes(0), longTo32Bytes(0), tradeGroupID, sender=tester.k1, value = fix('10000'))

    assert orderID, "Order ID should be non-zero"
    assert orders.getOrderCreator(orderID), "Order should have an owner"

    assert contractsFixture.chain.head_state.get_balance(tester.a1) == creatorInitialETH - fix('0.6'), "ETH should be deducted from the creator balance"

    logs = []
    captureFilteredLogs(contractsFixture.chain.head_state, contractsFixture.contracts['Augur'], logs)

    assert(cancelOrder.cancelOrder(orderID, orderType, market.address, outcomeID, sender=tester.k1) == 1), "cancelOrder should succeed"

    # Confirm cancel order logging works correctly
    assert len(logs) == 1
    assert logs[0]['_event_type'] == 'OrderCanceled'
    assert logs[0]['orderId'] == orderID
    assert logs[0]['shareToken'] == yesShareToken.address
    assert logs[0]['sender'] == bytesToHexString(tester.a1)
    assert logs[0]['orderType'] == orderType
    assert logs[0]['sharesRefund'] == 0
    assert logs[0]['tokenRefund'] == fix('0.6')

    assert orders.getAmount(orderID) == 0
    assert orders.getPrice(orderID) == 0
    assert orders.getOrderCreator(orderID) == longToHexString(0)
    assert orders.getOrderMoneyEscrowed(orderID) == 0
    assert orders.getOrderSharesEscrowed(orderID) == 0
    assert orders.getBetterOrderId(orderID) == longTo32Bytes(0)
    assert orders.getWorseOrderId(orderID) == longTo32Bytes(0)
    assert(creatorInitialETH == contractsFixture.chain.head_state.get_balance(tester.a1)), "Maker's ETH should be the same as before the order was placed"
    assert(marketInitialCash == cash.balanceOf(market.address)), "Market's cash balance should be the same as before the order was placed"
    assert(creatorInitialShares == yesShareToken.balanceOf(tester.a1)), "Maker's shares should be unchanged"
    assert(marketInitialYesShares == yesShareToken.totalSupply()), "Market's yes shares should be unchanged"
    assert marketInitialNoShares == noShareToken.totalSupply(), "Market's no shares should be unchanged"
Ejemplo n.º 15
0
def test_redeem_shares_in_binary_market(kitchenSinkFixture, universe, cash, market):
    claimTradingProceeds = kitchenSinkFixture.contracts['ClaimTradingProceeds']
    yesShareToken = kitchenSinkFixture.applySignature('ShareToken', market.getShareToken(YES))
    noShareToken = kitchenSinkFixture.applySignature('ShareToken', market.getShareToken(NO))
    expectedValue = 1 * market.getNumTicks()
    expectedReporterFees = expectedValue / universe.getOrCacheReportingFeeDivisor()
    expectedMarketCreatorFees = expectedValue / market.getMarketCreatorSettlementFeeDivisor()
    expectedSettlementFees = expectedReporterFees + expectedMarketCreatorFees
    expectedPayout = long(expectedValue - expectedSettlementFees)

    assert universe.getOpenInterestInAttoEth() == 0

    # get YES shares with a1
    acquireLongShares(kitchenSinkFixture, cash, market, YES, 1, claimTradingProceeds.address, sender = tester.k1)
    assert universe.getOpenInterestInAttoEth() == 1 * market.getNumTicks()
    # get NO shares with a2
    acquireShortShareSet(kitchenSinkFixture, cash, market, YES, 1, claimTradingProceeds.address, sender = tester.k2)
    assert universe.getOpenInterestInAttoEth() == 2 * market.getNumTicks()
    finalizeMarket(kitchenSinkFixture, market, [0,10**4])

    logs = []
    captureFilteredLogs(kitchenSinkFixture.chain.head_state, kitchenSinkFixture.contracts['Augur'], logs)

    with TokenDelta(cash, expectedMarketCreatorFees, market.getMarketCreatorMailbox(), "Market creator fees not paid"):
        with TokenDelta(cash, expectedReporterFees, universe.getOrCreateNextFeeWindow(), "Reporter fees not paid"):
            # redeem shares with a1
            initialLongHolderETH = kitchenSinkFixture.chain.head_state.get_balance(tester.a1)
            claimTradingProceeds.claimTradingProceeds(market.address, tester.a1)
            # redeem shares with a2
            initialShortHolderETH = kitchenSinkFixture.chain.head_state.get_balance(tester.a2)
            claimTradingProceeds.claimTradingProceeds(market.address, tester.a2)

    # Confirm claim proceeds logging works correctly
    assert len(logs) == 6
    assert logs[3]['_event_type'] == 'TradingProceedsClaimed'
    assert logs[3]['market'] == market.address
    assert logs[3]['shareToken'] == yesShareToken.address
    assert logs[3]['numPayoutTokens'] == expectedPayout
    assert logs[3]['numShares'] == 1
    assert logs[3]['sender'] == bytesToHexString(tester.a1)
    assert logs[3]['finalTokenBalance'] == initialLongHolderETH + expectedPayout

    # assert a1 ends up with cash (minus fees) and a2 does not
    assert kitchenSinkFixture.chain.head_state.get_balance(tester.a1) == initialLongHolderETH + expectedPayout
    assert kitchenSinkFixture.chain.head_state.get_balance(tester.a2) == initialShortHolderETH
    assert yesShareToken.balanceOf(tester.a1) == 0
    assert yesShareToken.balanceOf(tester.a2) == 0
    assert noShareToken.balanceOf(tester.a1) == 0
    assert noShareToken.balanceOf(tester.a2) == 0
    assert universe.getOpenInterestInAttoEth() == 1 * market.getNumTicks() # The corresponding share for tester2's complete set has not been redeemed
Ejemplo n.º 16
0
def test_transfer(contractsFixture, market):
    shareToken = contractsFixture.applySignature('ShareToken',
                                                 market.getShareToken())
    shareToken.createShares(tester.a0, 7, sender=tester.k0)
    initialTotalSupply = shareToken.totalSupply()
    initialBalance0 = shareToken.balanceOf(tester.a0)
    initialBalance1 = shareToken.balanceOf(tester.a1)
    logs = []

    with raises(TransactionFailed):
        shareToken.transfer(tester.a0, 11, sender=tester.k0)
    with raises(TransactionFailed):
        shareToken.transfer(tester.a0, 5, sender=tester.k1)

    captureFilteredLogs(contractsFixture.chain.head_state, shareToken, logs)
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts["Augur"], logs)
    retval = shareToken.transfer(tester.a1, 5, sender=tester.k0)
    afterTransferBalance0 = shareToken.balanceOf(tester.a0)
    afterTransferBalance1 = shareToken.balanceOf(tester.a1)

    assert (retval == 1), "transfer should succeed"
    assert logs == [{
        "_event_type": "Transfer",
        "from": bytesToHexString(tester.a0),
        "to": bytesToHexString(tester.a1),
        "value": 5,
    }, {
        "_event_type": "TokensTransferred",
        "token": shareToken.address,
        "from": bytesToHexString(tester.a0),
        "to": bytesToHexString(tester.a1),
        "universe": market.getUniverse(),
        "tokenType": 1,
        "market": market.address,
        "value": 5
    }]
    assert (
        initialBalance0 - 5 == afterTransferBalance0
    ), "Decrease in address 1's balance should equal amount transferred"
    assert (
        initialBalance1 + 5 == afterTransferBalance1
    ), "Increase in address 2's balance should equal amount transferred"
    assert (shareToken.totalSupply() == initialTotalSupply
            ), "Total supply should be unchanged"
    assert (retval == 1), "transfer with 0 value should succeed"
Ejemplo n.º 17
0
def proceedToFirstReporting(testFixture, universe, market, makeReport,
                            disputer, reportOutcomes,
                            designatedDisputeOutcomes):
    if (market.getReportingState() !=
            testFixture.contracts['Constants'].DESIGNATED_REPORTING()):
        proceedToDesignatedReporting(testFixture, universe, market,
                                     reportOutcomes)

    # To proceed to first reporting we will either dispute a designated report or not make a designated report within the alotted time window for doing so
    if (makeReport):
        assert testFixture.designatedReport(market, reportOutcomes, tester.k0)
        assert market.getReportingState(
        ) == testFixture.contracts['Constants'].DESIGNATED_DISPUTE()

        logs = []
        captureFilteredLogs(testFixture.chain.head_state,
                            testFixture.contracts['Augur'], logs)

        assert market.disputeDesignatedReport(
            designatedDisputeOutcomes,
            1,
            False,
            sender=testFixture.testerKey[disputer])

        # Confirm the designated dispute logging works
        assert len(logs) == 4
        assert logs[3]['_event_type'] == 'ReportsDisputed'
        assert logs[3]['reportingPhase'] == testFixture.contracts[
            'Constants'].DESIGNATED_DISPUTE()
        assert logs[3]['disputer'] == bytesToHexString(
            testFixture.testerAddress[disputer])
        assert logs[3]['disputeBondAmount'] == testFixture.contracts[
            'Constants'].DESIGNATED_REPORTER_DISPUTE_BOND_AMOUNT()
        assert logs[3]['market'] == market.address

    else:
        testFixture.chain.head_state.timestamp = market.getEndTime(
        ) + testFixture.contracts[
            'Constants'].DESIGNATED_REPORTING_DURATION_SECONDS() + 1

    # We're in the FIRST REPORTING phase now
    assert market.getReportingState(
    ) == testFixture.contracts['Constants'].FIRST_REPORTING()
def test_market_creation(contractsFixture, universe, cash, market):
    numTicks = market.getNumTicks()

    logs = []
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)
    market = contractsFixture.createReasonableBinaryMarket(
        universe, cash, extraInfo="so extra")

    assert len(logs) == 3
    assert logs[2]['_event_type'] == 'MarketCreated'
    assert logs[2]['extraInfo'] == 'so extra'
    assert logs[2][
        'marketCreationFee'] == universe.getOrCacheMarketCreationCost()
    assert logs[2]['market'] == market.address
    assert logs[2]['marketCreator'] == bytesToHexString(tester.a0)

    assert market.getUniverse() == universe.address
    assert market.getNumberOfOutcomes() == 2
    assert numTicks == 10000
    assert market.getReputationToken() == universe.getReputationToken()
    assert market.getWinningPayoutDistributionHash() == stringToBytes("")
Ejemplo n.º 19
0
def test_stake_token_logging(contractsFixture, market, universe):
    stakeToken = contractsFixture.getOrCreateStakeToken(
        market, [market.getNumTicks(), 0])
    reportingWindow = contractsFixture.applySignature(
        'ReportingWindow', universe.getOrCreateNextReportingWindow())

    # Fast forward to one second after the next reporting window
    contractsFixture.chain.head_state.timestamp = reportingWindow.getStartTime(
    ) + 1

    stakeToken.buy(100)

    logs = []
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)

    assert stakeToken.transfer(tester.a1, 8)

    assert len(logs) == 1
    assert logs[0]['_event_type'] == 'TokensTransferred'
    assert logs[0]['from'] == bytesToHexString(tester.a0)
    assert logs[0]['to'] == bytesToHexString(tester.a1)
    assert logs[0]['token'] == stakeToken.address
    assert logs[0]['universe'] == universe.address
    assert logs[0]['value'] == 8

    assert stakeToken.approve(tester.a2, 12)

    assert stakeToken.transferFrom(tester.a0, tester.a1, 12, sender=tester.k2)

    assert len(logs) == 2
    assert logs[1]['_event_type'] == 'TokensTransferred'
    assert logs[1]['from'] == bytesToHexString(tester.a0)
    assert logs[1]['to'] == bytesToHexString(tester.a1)
    assert logs[1]['token'] == stakeToken.address
    assert logs[1]['universe'] == universe.address
    assert logs[1]['value'] == 12
Ejemplo n.º 20
0
def test_approve(contractsFixture, market):
    shareToken = contractsFixture.applySignature('ShareToken', market.getShareToken())
    shareToken.createShares(tester.a0, 7, sender=tester.k0)
    logs = []

    assert(shareToken.allowance(tester.a0, tester.a1) == 0), "initial allowance is 0"
    captureFilteredLogs(contractsFixture.chain.head_state, shareToken, logs)
    captureFilteredLogs(contractsFixture.chain.head_state, contractsFixture.contracts["Augur"], logs)
    retval = shareToken.approve(tester.a1, 10, sender=tester.k0)
    assert(retval == 1), "approve a2 to spend 10 cash from a1"
    assert(shareToken.allowance(tester.a0, tester.a1) == 10), "allowance is 10 after approval"
    retval = shareToken.transferFrom(tester.a0, tester.a1, 7, sender=tester.k1)
    assert(retval == 1), "transferFrom should succeed"
    assert logs == [
        {
            "_event_type": "Approval",
            "owner": bytesToHexString(tester.a0),
            "spender": bytesToHexString(tester.a1),
            "value": 10
        },
        {
            "_event_type": "Transfer",
            "from": bytesToHexString(tester.a0),
            "to": bytesToHexString(tester.a1),
            "value": 7
        },
        {
            "_event_type": "TokensTransferred",
            "token": shareToken.address,
            "from": bytesToHexString(tester.a0),
            "to": bytesToHexString(tester.a1),
            "universe": market.getUniverse(),
            "tokenType": 1,
            "market": market.address,
            "value": 7
        }
    ]
Ejemplo n.º 21
0
def test_designatedReportingHappyPath(localFixture, universe, market):
    # Proceed to the DESIGNATED REPORTING phase
    proceedToDesignatedReporting(localFixture, universe, market, [0,market.getNumTicks()])

    reportingWindow = localFixture.applySignature("ReportingWindow", market.getReportingWindow())

    originalNumDesignatedReportNoShows = reportingWindow.getNumDesignatedReportNoShows()

    # To progress into the DESIGNATED DISPUTE phase we do a designated report
    logs = []
    captureFilteredLogs(localFixture.chain.head_state, localFixture.contracts['Augur'], logs)
    assert localFixture.designatedReport(market, [0,market.getNumTicks()], tester.k0)

    # Confirm the designated report logging works
    assert len(logs) == 4
    assert logs[3]['_event_type'] == 'DesignatedReportSubmitted'
    assert logs[3]['amountStaked'] == localFixture.contracts["Constants"].DEFAULT_DESIGNATED_REPORT_STAKE()
    assert logs[3]['reporter'] == bytesToHexString(tester.a0)
    assert logs[3]['stakeToken'] == localFixture.getOrCreateStakeToken(market, [0,market.getNumTicks()]).address
    assert logs[3]['market'] == market.address
    assert logs[3]['payoutNumerators'] == [0,market.getNumTicks()]

    # making a designated report also decremented the no show accounting on the reporting window
    assert reportingWindow.getNumDesignatedReportNoShows() == originalNumDesignatedReportNoShows - 1

    # We're now in the DESIGNATED DISPUTE PHASE
    assert market.getReportingState() == localFixture.contracts['Constants'].DESIGNATED_DISPUTE()

    # If time passes and no dispute bond is placed the market can be finalized
    localFixture.chain.head_state.timestamp = market.getEndTime() + localFixture.contracts['Constants'].DESIGNATED_REPORTING_DURATION_SECONDS() + localFixture.contracts['Constants'].DESIGNATED_REPORTING_DISPUTE_DURATION_SECONDS() + 1

    # The market is awaiting finalization now
    assert market.getReportingState() == localFixture.contracts['Constants'].AWAITING_FINALIZATION()

    # We can finalize it
    assert market.tryFinalize()
    assert market.getReportingState() == localFixture.contracts['Constants'].FINALIZED()
Ejemplo n.º 22
0
def test_reportingFullHappyPath(getStakeBonus, localFixture, universe, cash, market):
    reputationToken = localFixture.applySignature('ReputationToken', universe.getReputationToken())
    stakeTokenNo = localFixture.getOrCreateStakeToken(market, [market.getNumTicks(),0])
    stakeTokenYes = localFixture.getOrCreateStakeToken(market, [0,market.getNumTicks()])
    reportingWindow = localFixture.applySignature('ReportingWindow', universe.getOrCreateNextReportingWindow())
    expectedMarketCreatorFeePayout = universe.getOrCacheValidityBond()
    reporterGasCosts = universe.getOrCacheTargetReporterGasCosts()

    # We can't yet report on the market as it's in the pre reporting phase
    assert market.getReportingState() == localFixture.contracts['Constants'].PRE_REPORTING()
    with raises(TransactionFailed, message="Reporting cannot be done in the PRE REPORTING state"):
        stakeTokenNo.buy(100, sender=tester.k0)

    # Fast forward to one second after the next reporting window
    localFixture.chain.head_state.timestamp = reportingWindow.getStartTime() + 1

    # This will cause us to be in the first reporting phase
    assert market.getReportingState() == localFixture.contracts['Constants'].FIRST_REPORTING()

    noShowBondCosts = 3 * localFixture.contracts['Constants'].DEFAULT_DESIGNATED_REPORT_NO_SHOW_BOND()
    # Both reporters report on the outcome. Tester 1 reports first, winning the no-show REP bond and and causing the YES outcome to be the tentative winner
    initialFirstReporterETH = localFixture.chain.head_state.get_balance(tester.a1)
    stakeTokenYes.buy(0, sender=tester.k1)
    assert stakeTokenYes.balanceOf(tester.a1) == 2 * 10 ** 18
    assert reputationToken.balanceOf(tester.a1) == 1 * 10**6 * 10 **18
    stakeTokenNo.buy(100, sender=tester.k0)
    assert stakeTokenNo.balanceOf(tester.a0) == 100
    assert reputationToken.balanceOf(tester.a0) == 8 * 10**6 * 10 **18 - 100 - noShowBondCosts
    tentativeWinner = market.getTentativeWinningPayoutDistributionHash()
    assert tentativeWinner == stakeTokenYes.getPayoutDistributionHash()

    # The first reporter also recieves reporter gas fees
    assert localFixture.chain.head_state.get_balance(tester.a1) == initialFirstReporterETH + reporterGasCosts

    # Move time forward into the FIRST DISPUTE phase
    localFixture.chain.head_state.timestamp = reportingWindow.getDisputeStartTime() + 1
    assert market.getReportingState() == localFixture.contracts['Constants'].FIRST_DISPUTE()

    # Contest the results with Tester 0
    market.disputeFirstReporters([], 0, False, sender=tester.k0)
    assert not reportingWindow.isContainerForMarket(market.address)
    assert universe.isContainerForMarket(market.address)
    reportingWindow = localFixture.applySignature('ReportingWindow', market.getReportingWindow())
    assert reportingWindow.isContainerForMarket(market.address)

    # We're now in the LAST REPORTING phase
    assert market.getReportingState() == localFixture.contracts['Constants'].LAST_REPORTING()

    # Tester 0 has a REP balance less the first bond amount
    assert reputationToken.balanceOf(tester.a0) == 8 * 10**6 * 10 **18 - 100 - 11 * 10**21 - noShowBondCosts

    # Tester 2 reports for the NO outcome
    localFixture.chain.head_state.timestamp = reportingWindow.getStartTime() + 1
    stakeTokenNo.buy(2, sender=tester.k2)
    assert stakeTokenNo.balanceOf(tester.a2) == 2
    assert reputationToken.balanceOf(tester.a2) == 10**6 * 10 **18 - 2
    tentativeWinner = market.getTentativeWinningPayoutDistributionHash()
    assert tentativeWinner == stakeTokenNo.getPayoutDistributionHash()

    # Move forward in time to put us in the LAST DISPUTE PHASE
    localFixture.chain.head_state.timestamp = reportingWindow.getDisputeStartTime() + 1
    assert market.getReportingState() == localFixture.contracts['Constants'].LAST_DISPUTE()

    # Tester 1 contests the outcome of the ALL report which will cause a fork
    market.disputeLastReporters(sender=tester.k1)
    assert universe.getForkingMarket() == market.address
    assert not reportingWindow.isContainerForMarket(market.address)
    assert universe.isContainerForMarket(market.address)
    reportingWindow = localFixture.applySignature('ReportingWindow', market.getReportingWindow())
    assert reportingWindow.isContainerForMarket(market.address)
    assert market.getReportingState() == localFixture.contracts['Constants'].FORKING()

    # The universe forks and there is now a universe where NO and YES are the respective outcomes of each
    noUniverse = localFixture.getOrCreateChildUniverse(universe, market, [market.getNumTicks(),0])
    noUniverseReputationToken = localFixture.applySignature('ReputationToken', noUniverse.getReputationToken())
    assert noUniverse.address != universe.address
    yesUniverse = localFixture.getOrCreateChildUniverse(universe, market, [0,market.getNumTicks()])
    yesUniverseReputationToken = localFixture.applySignature('ReputationToken', yesUniverse.getReputationToken())
    assert yesUniverse.address != universe.address
    assert yesUniverse.address != noUniverse.address

    # Attempting to finalize the fork now will not succeed as no REP has been migrated
    assert market.tryFinalize() == 0

    logs = []
    captureFilteredLogs(localFixture.chain.head_state, localFixture.contracts['Augur'], logs)

    # Tester 1 moves their ~1 Million REP to the YES universe and gets a fixed percentage bonus for doing so within the FORKING period
    expectedAmount = reputationToken.balanceOf(tester.a1)
    bonus = expectedAmount / localFixture.contracts["Constants"].FORK_MIGRATION_PERCENTAGE_BONUS_DIVISOR()
    reputationToken.migrateOut(yesUniverseReputationToken.address, tester.a1, reputationToken.balanceOf(tester.a1), sender = tester.k1)
    assert not reputationToken.balanceOf(tester.a1)
    assert yesUniverseReputationToken.balanceOf(tester.a1) == expectedAmount + bonus

    # Confirm the token logs were generated correctly

    assert len(logs) == 3

    burnLog = logs[0]
    mintLog = logs[1]
    bonusMintLog = logs[2]

    assert burnLog['_event_type'] == 'TokensBurned'
    assert burnLog['amount'] == expectedAmount
    assert burnLog['token'] == reputationToken.address
    assert burnLog['universe'] == universe.address

    assert mintLog['_event_type'] == 'TokensMinted'
    assert mintLog['amount'] == expectedAmount
    assert mintLog['token'] == yesUniverseReputationToken.address
    assert mintLog['universe'] == yesUniverse.address

    assert bonusMintLog['_event_type'] == 'TokensMinted'
    assert bonusMintLog['amount'] == bonus
    assert bonusMintLog['token'] == yesUniverseReputationToken.address
    assert bonusMintLog['universe'] == yesUniverse.address

    # Attempting to finalize the fork now will not succeed as a majority or REP has not yet migrated and fork end time has not been reached
    assert market.tryFinalize() == 0

    # Testers 0 and 2 move their combined ~9 million REP to the NO universe and receive a bonus since they are within the FORKING period
    expectedAmount = reputationToken.balanceOf(tester.a0)
    bonus = expectedAmount / localFixture.contracts["Constants"].FORK_MIGRATION_PERCENTAGE_BONUS_DIVISOR()
    reputationToken.migrateOut(noUniverseReputationToken.address, tester.a0, reputationToken.balanceOf(tester.a0), sender = tester.k0)
    assert not reputationToken.balanceOf(tester.a0)
    tester0REPBalance = noUniverseReputationToken.balanceOf(tester.a0)
    assert tester0REPBalance == expectedAmount + bonus
    expectedAmount = reputationToken.balanceOf(tester.a2)
    bonus = expectedAmount / localFixture.contracts["Constants"].FORK_MIGRATION_PERCENTAGE_BONUS_DIVISOR()
    reputationToken.migrateOut(noUniverseReputationToken.address, tester.a2, reputationToken.balanceOf(tester.a2), sender = tester.k2)
    assert not reputationToken.balanceOf(tester.a2)
    assert noUniverseReputationToken.balanceOf(tester.a2) == expectedAmount + bonus

    logs = []
    captureFilteredLogs(localFixture.chain.head_state, localFixture.contracts['Augur'], logs)

    # We can finalize the market now since a mjaority of REP has moved. Alternatively we could "localFixture.chain.head_state.timestamp = universe.getForkEndTime() + 1" to move
    initialMarketCreatorETHBalance = localFixture.chain.head_state.get_balance(market.getMarketCreatorMailbox())
    assert market.tryFinalize()

    # Confirm market finalization logging works
    assert len(logs) == 1
    assert logs[0]['_event_type'] == 'MarketFinalized'
    assert logs[0]['market'] == market.address

    # The market is now finalized and the NO outcome is the winner
    assert market.getReportingState() == localFixture.contracts['Constants'].FINALIZED()
    assert market.getFinalWinningStakeToken() == stakeTokenNo.address

    # Since the designated report was not invalid the market creator gets back the validity bond
    increaseInMarketCreatorBalance = localFixture.chain.head_state.get_balance(market.getMarketCreatorMailbox()) - initialMarketCreatorETHBalance
    assert increaseInMarketCreatorBalance == expectedMarketCreatorFeePayout

    # We can redeem forked REP on any universe we didn't dispute
    stakeTokenBalance = stakeTokenNo.balanceOf(tester.a0)

    # If we wait until after the fork window we won't get the bonus when migrating stake tokens
    bonus = stakeTokenBalance / localFixture.contracts["Constants"].FORK_MIGRATION_PERCENTAGE_BONUS_DIVISOR()
    expectedrepBalanceInNewUniverse = noUniverseReputationToken.balanceOf(tester.a0) + stakeTokenBalance
    if (not getStakeBonus):
        localFixture.chain.head_state.timestamp = universe.getForkEndTime() + 1
    else:
        expectedrepBalanceInNewUniverse += bonus

    assert stakeTokenNo.redeemForkedTokens(sender = tester.k0)
    assert noUniverseReputationToken.balanceOf(tester.a0) == expectedrepBalanceInNewUniverse

    # We can also see that a tester who now migrates their REP will also not get the bonus
    expectedAmount = reputationToken.balanceOf(tester.a3)
    reputationToken.migrateOut(noUniverseReputationToken.address, tester.a3, reputationToken.balanceOf(tester.a3), sender = tester.k3)
    assert not reputationToken.balanceOf(tester.a3)
    assert noUniverseReputationToken.balanceOf(tester.a3) == expectedAmount
Ejemplo n.º 23
0
def test_initial_report_and_participation_fee_collection(
        localFixture, universe, market, categoricalMarket, scalarMarket, cash,
        reputationToken):
    feeWindow = localFixture.applySignature('FeeWindow', market.getFeeWindow())
    constants = localFixture.contracts["Constants"]

    # We cannot purchase participation tokens yet since the window isn't active
    with raises(TransactionFailed):
        feeWindow.buy(1)

    # generate some fees
    generateFees(localFixture, universe, market)

    # We'll make the window active then purchase some participation tokens
    localFixture.contracts["Time"].setTimestamp(feeWindow.getStartTime() + 1)
    feeWindowAmount = 100
    with TokenDelta(reputationToken, -feeWindowAmount, tester.a0,
                    "Buying participation tokens didn't deduct REP correctly"):
        with TokenDelta(
                feeWindow, feeWindowAmount, tester.a0,
                "Buying participation tokens didn't increase participation token balance correctly"
        ):
            assert feeWindow.buy(feeWindowAmount)

    # As other testers we'll buy some more
    assert feeWindow.buy(feeWindowAmount, sender=tester.k1)
    assert feeWindow.buy(feeWindowAmount, sender=tester.k2)
    assert feeWindow.buy(feeWindowAmount, sender=tester.k3)

    # We can't redeem the participation tokens yet since the window isn't over
    with raises(TransactionFailed):
        feeWindow.redeem(False)

    # Now end the window and finalize
    localFixture.contracts["Time"].setTimestamp(feeWindow.getEndTime() + 1)

    assert market.finalize()
    assert categoricalMarket.finalize()
    assert scalarMarket.finalize()

    marketInitialReport = localFixture.applySignature(
        'InitialReporter', market.getInitialReporter())
    categoricalInitialReport = localFixture.applySignature(
        'InitialReporter', categoricalMarket.getInitialReporter())
    scalarInitialReport = localFixture.applySignature(
        'InitialReporter', scalarMarket.getInitialReporter())

    reporterFees = 1000 * market.getNumTicks(
    ) / universe.getOrCacheReportingFeeDivisor()
    totalStake = feeWindow.getTotalFeeStake()
    assert cash.balanceOf(feeWindow.address) == reporterFees

    expectedParticipationFees = reporterFees * feeWindowAmount / totalStake

    # Cashing out Participation tokens will awards fees proportional to the total winning stake in the window
    with TokenDelta(reputationToken, feeWindowAmount, tester.a0,
                    "Redeeming participation tokens didn't refund REP"):
        with TokenDelta(
                feeWindow, -feeWindowAmount, tester.a0,
                "Redeeming participation tokens didn't decrease participation token balance correctly"
        ):
            with EtherDelta(
                    expectedParticipationFees, tester.a0, localFixture.chain,
                    "Redeeming participation tokens didn't increase ETH correctly"
            ):
                assert feeWindow.redeem(tester.a0)

    with TokenDelta(reputationToken, feeWindowAmount, tester.a1,
                    "Redeeming participation tokens didn't refund REP"):
        with TokenDelta(
                feeWindow, -feeWindowAmount, tester.a1,
                "Redeeming participation tokens didn't decrease participation token balance correctly"
        ):
            with EtherDelta(
                    expectedParticipationFees, tester.a1, localFixture.chain,
                    "Redeeming participation tokens didn't increase ETH correctly"
            ):
                assert feeWindow.redeem(tester.a1)

    with TokenDelta(reputationToken, feeWindowAmount, tester.a2,
                    "Redeeming participation tokens didn't refund REP"):
        with TokenDelta(
                feeWindow, -feeWindowAmount, tester.a2,
                "Redeeming participation tokens didn't decrease participation token balance correctly"
        ):
            with EtherDelta(
                    expectedParticipationFees, tester.a2, localFixture.chain,
                    "Redeeming participation tokens didn't increase ETH correctly"
            ):
                assert feeWindow.redeem(tester.a2)

    logs = []
    captureFilteredLogs(localFixture.chain.head_state,
                        localFixture.contracts['Augur'], logs)

    marketStake = marketInitialReport.getStake()
    expectedFees = reporterFees * marketStake / totalStake
    winningsRedeemedLog = {
        "reporter": bytesToHexString(tester.a0),
        "reportingParticipant": marketInitialReport.address,
        "amountRedeemed": marketStake,
        "reportingFeesReceived": expectedFees,
        "payoutNumerators": [market.getNumTicks(), 0],
        "universe": universe.address,
        "market": market.address
    }
    with AssertLog(localFixture, "WinningsRedeemed", winningsRedeemedLog):
        with TokenDelta(reputationToken, marketStake, tester.a0,
                        "Redeeming didn't refund REP"):
            with EtherDelta(expectedFees, tester.a0, localFixture.chain,
                            "Redeeming didn't increase ETH correctly"):
                assert marketInitialReport.redeem(tester.a0)

    categoricalMarketStake = categoricalInitialReport.getStake()
    expectedFees = reporterFees * categoricalMarketStake / totalStake
    with TokenDelta(reputationToken, categoricalMarketStake, tester.a0,
                    "Redeeming didn't refund REP"):
        with EtherDelta(expectedFees, tester.a0, localFixture.chain,
                        "Redeeming didn't increase ETH correctly"):
            assert categoricalInitialReport.redeem(tester.a0)
Ejemplo n.º 24
0
def test_token_fee_collection(localFixture, universe, market,
                              categoricalMarket, scalarMarket, cash,
                              reputationToken, reportingWindow):
    # We'll progress past the designated dispute phase and finalize all the markets
    localFixture.chain.head_state.timestamp = market.getEndTime(
    ) + localFixture.contracts[
        "Constants"].DESIGNATED_REPORTING_DURATION_SECONDS() + 1

    assert market.tryFinalize()
    assert categoricalMarket.tryFinalize()
    assert scalarMarket.tryFinalize()

    # We can't redeem the stake used to do the designated report for fees yet since the window is not yet over
    marketDesignatedStake = localFixture.getOrCreateStakeToken(
        market, [0, market.getNumTicks()])
    categoricalMarketDesignatedStake = localFixture.getOrCreateStakeToken(
        categoricalMarket, [0, 0, categoricalMarket.getNumTicks()])
    scalarMarketDesignatedStake = localFixture.getOrCreateStakeToken(
        scalarMarket, [0, scalarMarket.getNumTicks()])

    with raises(TransactionFailed):
        marketDesignatedStake.redeemWinningTokens(False)

    # If we forgo fees we can redeem however. We'll do this for the scalar market. Note that the market total stake isn't decreased. Market total stake only decreases once it is finalized at which point it can no longer migrate so the value doesn't matter
    scalarStake = scalarMarketDesignatedStake.balanceOf(tester.a0)
    with TokenDelta(reputationToken, scalarStake, tester.a0,
                    "Forgoing fees resulting in an incorrect REP refund"):
        with EtherDelta(0, tester.a0, localFixture.chain,
                        "Forgoing fees gave fees incorrectly"):
            with StakeDelta(
                    0, -scalarStake, -scalarStake, scalarMarket,
                    reportingWindow,
                    "Forgoing fees incorrectly updated stake accounting"):
                assert scalarMarketDesignatedStake.redeemWinningTokens(True)

    # We cannot purchase participation tokens yet since the window isn't active
    participationToken = localFixture.applySignature(
        "ParticipationToken", reportingWindow.getParticipationToken())
    with raises(TransactionFailed):
        participationToken.buy(1)

    # We'll progress to the start of the window and purchase some participation tokens
    localFixture.chain.head_state.timestamp = reportingWindow.getStartTime(
    ) + 1
    participationTokenAmount = 100
    with TokenDelta(reputationToken, -participationTokenAmount, tester.a0,
                    "Buying participation tokens didn't deduct REP correctly"):
        with TokenDelta(
                participationToken, participationTokenAmount, tester.a0,
                "Buying participation tokens didn't increase participation token balance correctly"
        ):
            with StakeDelta(
                    0, participationTokenAmount, participationTokenAmount,
                    market, reportingWindow,
                    "Buying participation tokens din't adjust stake accounting correctly"
            ):
                assert participationToken.buy(participationTokenAmount)

    # As other testers we'll buy some more
    with StakeDelta(
            0, participationTokenAmount * 3, participationTokenAmount * 3,
            market, reportingWindow,
            "Buying participation tokens din't adjust stake accounting correctly"
    ):
        with TokenDelta(
                participationToken, participationTokenAmount, tester.a1,
                "Buying participation tokens didn't increase participation token balance correctly"
        ):
            assert participationToken.buy(participationTokenAmount,
                                          sender=tester.k1)
        with TokenDelta(
                participationToken, participationTokenAmount, tester.a2,
                "Buying participation tokens didn't increase participation token balance correctly"
        ):
            assert participationToken.buy(participationTokenAmount,
                                          sender=tester.k2)
        with TokenDelta(
                participationToken, participationTokenAmount, tester.a3,
                "Buying participation tokens didn't increase participation token balance correctly"
        ):
            assert participationToken.buy(participationTokenAmount,
                                          sender=tester.k3)

    # We can't redeem the participation tokens for fees yet since the window isn't over
    with raises(TransactionFailed):
        participationToken.redeem(False)

    # We can redeem them to just get back REP. We'll have tester 3 do this
    participationValue = participationToken.balanceOf(tester.a3)
    with TokenDelta(reputationToken, participationValue, tester.a3,
                    "Forgoing fees resulting in an incorrect REP refund"):
        with TokenDelta(
                participationToken, -participationTokenAmount, tester.a3,
                "Redeeming participation tokens didn't decrease participation token balance correctly"
        ):
            with EtherDelta(0, tester.a0, localFixture.chain,
                            "Forgoing fees gave fees incorrectly"):
                with StakeDelta(
                        0, -participationValue, -participationValue, market,
                        reportingWindow,
                        "Forgoing fees incorrectly updated stake accounting"):
                    assert participationToken.redeem(True, sender=tester.k3)

    # Fast forward time until the window is over and we can redeem our winning stake and participation tokens and receive fees
    localFixture.chain.head_state.timestamp = reportingWindow.getEndTime() + 1

    reporterFees = 1000 * market.getNumTicks(
    ) / universe.getOrCacheReportingFeeDivisor()
    totalWinningStake = reportingWindow.getTotalWinningStake()
    assert cash.balanceOf(reportingWindow.address) == reporterFees

    expectedParticipationFees = reporterFees * participationTokenAmount / totalWinningStake

    # Cashing out Participation tokens or Stake tokens will awards fees proportional to the total winning stake in the window
    with TokenDelta(
            participationToken, -participationTokenAmount, tester.a0,
            "Redeeming participation tokens didn't decrease participation token balance correctly"
    ):
        with EtherDelta(
                expectedParticipationFees, tester.a0, localFixture.chain,
                "Redeeming participation tokens didn't increase ETH correctly"
        ):
            assert participationToken.redeem(False)

    with TokenDelta(
            participationToken, -participationTokenAmount, tester.a1,
            "Redeeming participation tokens didn't decrease participation token balance correctly"
    ):
        with EtherDelta(
                expectedParticipationFees, tester.a1, localFixture.chain,
                "Redeeming participation tokens didn't increase ETH correctly"
        ):
            assert participationToken.redeem(False, sender=tester.k1)

    with TokenDelta(
            participationToken, -participationTokenAmount, tester.a2,
            "Redeeming participation tokens didn't decrease participation token balance correctly"
    ):
        with EtherDelta(
                expectedParticipationFees, tester.a2, localFixture.chain,
                "Redeeming participation tokens didn't increase ETH correctly"
        ):
            assert participationToken.redeem(False, sender=tester.k2)

    logs = []
    captureFilteredLogs(localFixture.chain.head_state,
                        localFixture.contracts['Augur'], logs)

    marketStake = marketDesignatedStake.balanceOf(tester.a0)
    expectedFees = reporterFees * marketStake / totalWinningStake + 1  # Rounding error
    with EtherDelta(expectedFees, tester.a0, localFixture.chain,
                    "Redeeming Stake tokens didn't increase ETH correctly"):
        with TokenDelta(
                marketDesignatedStake, -marketStake, tester.a0,
                "Redeeming Stake tokens didn't decrease Stake token balance correctly"
        ):
            assert marketDesignatedStake.redeemWinningTokens(False)

    # Confirm redeeming stake tokens logs appropriately
    assert len(logs) == 3
    assert logs[2]['_event_type'] == 'WinningTokensRedeemed'
    assert logs[2]['reporter'] == bytesToHexString(tester.a0)
    assert logs[2]['reportingFeesReceived'] == expectedFees
    assert logs[2]['stakeToken'] == marketDesignatedStake.address
    assert logs[2]['market'] == market.address
    assert logs[2]['amountRedeemed'] == marketStake
    assert logs[2]['payoutNumerators'] == [0, market.getNumTicks()]

    categoricalMarketStake = categoricalMarketDesignatedStake.balanceOf(
        tester.a0)
    expectedFees = reporterFees * categoricalMarketStake / totalWinningStake + 1  # Rounding error
    with EtherDelta(expectedFees, tester.a0, localFixture.chain,
                    "Redeeming Stake tokens didn't increase ETH correctly"):
        with TokenDelta(
                categoricalMarketDesignatedStake, -categoricalMarketStake,
                tester.a0,
                "Redeeming Stake tokens didn't decrease Stake token balance correctly"
        ):
            assert categoricalMarketDesignatedStake.redeemWinningTokens(False)
Ejemplo n.º 25
0
def test_fill_order_with_shares_escrowed_sell_with_shares(
        contractsFixture, cash, market, universe):
    createOrder = contractsFixture.contracts['CreateOrder']
    fillOrder = contractsFixture.contracts['FillOrder']
    orders = contractsFixture.contracts['Orders']
    completeSets = contractsFixture.contracts['CompleteSets']
    yesShareToken = contractsFixture.applySignature('ShareToken',
                                                    market.getShareToken(YES))
    noShareToken = contractsFixture.applySignature('ShareToken',
                                                   market.getShareToken(NO))

    # buy complete sets for both users
    assert completeSets.publicBuyCompleteSets(market.address,
                                              fix(1),
                                              sender=tester.k1,
                                              value=fix('1', '10000'))
    assert yesShareToken.balanceOf(tester.a1) == fix(1)
    assert completeSets.publicBuyCompleteSets(market.address,
                                              fix(1),
                                              sender=tester.k2,
                                              value=fix('1', '10000'))
    assert noShareToken.balanceOf(tester.a2) == fix(1)

    # create order with shares
    logs = []
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)
    orderID = createOrder.publicCreateOrder(ASK,
                                            fix(1),
                                            6000,
                                            market.address,
                                            YES,
                                            longTo32Bytes(0),
                                            longTo32Bytes(0),
                                            "42",
                                            sender=tester.k1)
    assert orderID

    # fill order with shares
    assert fillOrder.publicFillOrder(orderID, fix(1), "43",
                                     sender=tester.k2) == 0

    assert len(logs) == 8
    log1 = logs[7]

    assert log1["_event_type"] == "OrderFilled"
    assert log1["filler"] == bytesToHexString(tester.a2)
    assert log1["numCreatorShares"] == fix(1)
    assert log1["numCreatorTokens"] == 0
    assert log1["numFillerShares"] == fix(1)
    assert log1["numFillerTokens"] == 0
    assert log1["marketCreatorFees"] == fix(
        1, 10000) / market.getMarketCreatorSettlementFeeDivisor()
    assert log1["reporterFees"] == fix(
        1, 10000) / universe.getOrCacheReportingFeeDivisor()
    assert log1["shareToken"] == market.getShareToken(YES)
    assert log1["tradeGroupId"] == stringToBytes("43")

    assert orders.getAmount(orderID) == 0
    assert orders.getPrice(orderID) == 0
    assert orders.getOrderCreator(orderID) == longToHexString(0)
    assert orders.getOrderMoneyEscrowed(orderID) == 0
    assert orders.getOrderSharesEscrowed(orderID) == 0
    assert orders.getBetterOrderId(orderID) == longTo32Bytes(0)
    assert orders.getWorseOrderId(orderID) == longTo32Bytes(0)
Ejemplo n.º 26
0
def test_two_asks_on_books_buy_one_full_then_create(contractsFixture, cash,
                                                    market, universe):
    createOrder = contractsFixture.contracts['CreateOrder']
    trade = contractsFixture.contracts['Trade']
    fillOrder = contractsFixture.contracts['FillOrder']
    orders = contractsFixture.contracts['Orders']
    tradeGroupID = "42"
    logs = []

    # create order 1
    orderID1 = createOrder.publicCreateOrder(ASK,
                                             fix(12),
                                             6000,
                                             market.address,
                                             YES,
                                             longTo32Bytes(0),
                                             longTo32Bytes(0),
                                             tradeGroupID,
                                             sender=tester.k1,
                                             value=fix('12', '4000'))
    # create order 2
    orderID2 = createOrder.publicCreateOrder(ASK,
                                             fix(7),
                                             7000,
                                             market.address,
                                             YES,
                                             longTo32Bytes(0),
                                             longTo32Bytes(0),
                                             tradeGroupID,
                                             sender=tester.k3,
                                             value=fix('7', '4000'))

    # fill/create
    captureFilteredLogs(contractsFixture.chain.head_state, orders, logs)
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)
    fillOrderID = trade.publicBuy(market.address,
                                  YES,
                                  fix(15),
                                  6000,
                                  tradeGroupID,
                                  sender=tester.k2,
                                  value=fix('15', '6000'))

    assert len(logs) == 6
    log1 = logs[4]
    log2 = logs[5]

    assert log1["_event_type"] == "OrderFilled"
    assert log1["filler"] == bytesToHexString(tester.a2)
    assert log1["numCreatorShares"] == 0
    assert log1["numCreatorTokens"] == fix('12', '4000')
    assert log1["numFillerShares"] == 0
    assert log1["numFillerTokens"] == fix('12', '6000')
    assert log1["marketCreatorFees"] == 0
    assert log1["reporterFees"] == 0
    assert log1["shareToken"] == market.getShareToken(YES)
    assert log1["tradeGroupId"] == stringToBytes("42")

    assert log2["_event_type"] == "OrderCreated"
    assert log2['creator'] == bytesToHexString(tester.a2)
    assert log2["orderId"] == fillOrderID
    assert log2["shareToken"] == market.getShareToken(YES)
    assert log2["tradeGroupId"] == stringToBytes("42")

    assert orders.getAmount(orderID1) == 0
    assert orders.getPrice(orderID1) == 0
    assert orders.getOrderCreator(orderID1) == longToHexString(0)
    assert orders.getOrderMoneyEscrowed(orderID1) == 0
    assert orders.getOrderSharesEscrowed(orderID1) == 0
    assert orders.getBetterOrderId(orderID1) == longTo32Bytes(0)
    assert orders.getWorseOrderId(orderID1) == longTo32Bytes(0)

    assert orders.getAmount(orderID2) == fix(7)
    assert orders.getPrice(orderID2) == 7000
    assert orders.getOrderCreator(orderID2) == bytesToHexString(tester.a3)
    assert orders.getOrderMoneyEscrowed(orderID2) == fix('7', '3000')
    assert orders.getOrderSharesEscrowed(orderID2) == 0
    assert orders.getBetterOrderId(orderID2) == longTo32Bytes(0)
    assert orders.getWorseOrderId(orderID2) == longTo32Bytes(0)

    assert orders.getAmount(fillOrderID) == fix(3)
    assert orders.getPrice(fillOrderID) == 6000
    assert orders.getOrderCreator(fillOrderID) == bytesToHexString(tester.a2)
    assert orders.getOrderMoneyEscrowed(fillOrderID) == fix('3', '6000')
    assert orders.getOrderSharesEscrowed(fillOrderID) == 0
    assert orders.getBetterOrderId(fillOrderID) == longTo32Bytes(0)
    assert orders.getWorseOrderId(fillOrderID) == longTo32Bytes(0)
Ejemplo n.º 27
0
def test_fill_order_with_shares_escrowed_sell_with_shares_categorical(
        contractsFixture, cash, categoricalMarket, universe):
    market = categoricalMarket
    createOrder = contractsFixture.contracts['CreateOrder']
    fillOrder = contractsFixture.contracts['FillOrder']
    orders = contractsFixture.contracts['Orders']
    completeSets = contractsFixture.contracts['CompleteSets']
    firstShareToken = contractsFixture.applySignature('ShareToken',
                                                      market.getShareToken(0))
    secondShareToken = contractsFixture.applySignature('ShareToken',
                                                       market.getShareToken(1))
    thirdShareToken = contractsFixture.applySignature('ShareToken',
                                                      market.getShareToken(2))

    # buy complete sets for both users
    numTicks = market.getNumTicks()
    assert completeSets.publicBuyCompleteSets(market.address,
                                              fix(1),
                                              sender=tester.k1,
                                              value=fix('1', numTicks))
    assert completeSets.publicBuyCompleteSets(market.address,
                                              fix(1),
                                              sender=tester.k2,
                                              value=fix('1', numTicks))
    assert firstShareToken.balanceOf(tester.a1) == firstShareToken.balanceOf(
        tester.a2) == fix(1)
    assert secondShareToken.balanceOf(tester.a1) == secondShareToken.balanceOf(
        tester.a2) == fix(1)
    assert thirdShareToken.balanceOf(tester.a1) == thirdShareToken.balanceOf(
        tester.a2) == fix(1)

    # create order with shares
    logs = []
    price = 6000
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)
    orderID = createOrder.publicCreateOrder(ASK,
                                            fix(1),
                                            price,
                                            market.address,
                                            0,
                                            longTo32Bytes(0),
                                            longTo32Bytes(0),
                                            "42",
                                            sender=tester.k1)
    assert orderID

    # fill order with shares
    assert fillOrder.publicFillOrder(orderID, fix(1), "43",
                                     sender=tester.k2) == 0

    # The second users corresponding shares were used to fulfil this order
    assert firstShareToken.balanceOf(tester.a2) == fix(1)
    assert secondShareToken.balanceOf(tester.a2) == 0
    assert thirdShareToken.balanceOf(tester.a2) == 0

    assert len(logs) == 10
    log1 = logs[9]

    assert log1["_event_type"] == "OrderFilled"
    assert log1["filler"] == bytesToHexString(tester.a2)
    assert log1["numCreatorShares"] == fix(1)
    assert log1["numCreatorTokens"] == 0
    assert log1["numFillerShares"] == fix(1)
    assert log1["numFillerTokens"] == 0
    assert log1["marketCreatorFees"] == fix(
        1, numTicks) / market.getMarketCreatorSettlementFeeDivisor()
    assert log1["reporterFees"] == fix(
        1, numTicks) / universe.getOrCacheReportingFeeDivisor()
    assert log1["shareToken"] == market.getShareToken(0)
    assert log1["tradeGroupId"] == stringToBytes("43")

    assert orders.getAmount(orderID) == 0
    assert orders.getPrice(orderID) == 0
    assert orders.getOrderCreator(orderID) == longToHexString(0)
    assert orders.getOrderMoneyEscrowed(orderID) == 0
    assert orders.getOrderSharesEscrowed(orderID) == 0
    assert orders.getBetterOrderId(orderID) == longTo32Bytes(0)
    assert orders.getWorseOrderId(orderID) == longTo32Bytes(0)
Ejemplo n.º 28
0
def proceedToForking(testFixture, universe, market, makeReport,
                     designatedDisputer, firstDisputer, reporter,
                     reportOutcomes, designatedDisputeOutcomes, firstReporter,
                     firstReportOutcomes, firstReportDisputeOutcomes,
                     lastReportOutcomes):
    reputationToken = testFixture.applySignature('ReputationToken',
                                                 universe.getReputationToken())

    # Proceed to the LAST REPORTING phase
    if (market.getReportingState() !=
            testFixture.contracts['Constants'].LAST_REPORTING()):
        proceedToLastReporting(testFixture, universe, market, makeReport,
                               designatedDisputer, firstDisputer,
                               reportOutcomes, designatedDisputeOutcomes,
                               firstReporter, firstReportOutcomes,
                               firstReportDisputeOutcomes)

    reportingWindow = testFixture.applySignature('ReportingWindow',
                                                 market.getReportingWindow())

    stakeTokenNo = testFixture.getOrCreateStakeToken(market,
                                                     lastReportOutcomes)
    stakeTokenYes = testFixture.getOrCreateStakeToken(
        market, firstReportDisputeOutcomes)

    # If we buy the delta between outcome stakes that will be sufficient to make the outcome win
    noStake = market.getPayoutDistributionHashStake(
        stakeTokenNo.getPayoutDistributionHash())
    yesStake = market.getPayoutDistributionHashStake(
        stakeTokenYes.getPayoutDistributionHash())
    stakeDelta = yesStake - noStake
    stakeTokenNo.buy(stakeDelta + 1, sender=testFixture.testerKey[reporter])
    tentativeWinner = market.getTentativeWinningPayoutDistributionHash()
    assert tentativeWinner == stakeTokenNo.getPayoutDistributionHash()

    # To progress into the LAST DISPUTE phase we move time forward
    testFixture.chain.head_state.timestamp = reportingWindow.getDisputeStartTime(
    ) + 1
    assert market.getReportingState(
    ) == testFixture.contracts['Constants'].LAST_DISPUTE()

    logs = []
    captureFilteredLogs(testFixture.chain.head_state,
                        testFixture.contracts['Augur'], logs)

    # Making a dispute at this phase will progress the market into FORKING
    assert market.disputeLastReporters(sender=tester.k0)
    assert market.getReportingState(
    ) == testFixture.contracts['Constants'].FORKING()

    # Confirm the last dispute logging and universe fork logging works
    assert len(logs) == 3

    assert logs[1]['_event_type'] == 'UniverseForked'
    assert logs[1]['universe'] == universe.address

    assert logs[2]['_event_type'] == 'ReportsDisputed'
    assert logs[2]['reportingPhase'] == testFixture.contracts[
        'Constants'].LAST_DISPUTE()
    assert logs[2]['disputer'] == bytesToHexString(tester.a0)
    assert logs[2]['disputeBondAmount'] == testFixture.contracts[
        'Constants'].LAST_REPORTERS_DISPUTE_BOND_AMOUNT()
    assert logs[2]['market'] == market.address
Ejemplo n.º 29
0
def test_fill_buy_order_with_buy_categorical(contractsFixture, cash,
                                             categoricalMarket, universe):
    market = categoricalMarket
    createOrder = contractsFixture.contracts['CreateOrder']
    fillOrder = contractsFixture.contracts['FillOrder']
    orders = contractsFixture.contracts['Orders']
    firstShareToken = contractsFixture.applySignature('ShareToken',
                                                      market.getShareToken(0))
    secondShareToken = contractsFixture.applySignature('ShareToken',
                                                       market.getShareToken(1))
    thirdShareToken = contractsFixture.applySignature('ShareToken',
                                                      market.getShareToken(2))

    # create order with cash
    logs = []
    price = 6000
    numTicks = market.getNumTicks()
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)
    orderID = createOrder.publicCreateOrder(BID,
                                            fix(1),
                                            price,
                                            market.address,
                                            0,
                                            longTo32Bytes(0),
                                            longTo32Bytes(0),
                                            "42",
                                            value=fix(1, price),
                                            sender=tester.k1)
    assert orderID

    # fill order with cash
    assert fillOrder.publicFillOrder(orderID,
                                     fix(1),
                                     "43",
                                     sender=tester.k2,
                                     value=fix(1, numTicks - price)) == 0

    # A complete set was purchased with the provided cash and the shares were provided to each user
    assert firstShareToken.balanceOf(tester.a1) == fix(1)
    assert secondShareToken.balanceOf(tester.a1) == 0
    assert thirdShareToken.balanceOf(tester.a1) == 0

    assert firstShareToken.balanceOf(tester.a2) == 0
    assert secondShareToken.balanceOf(tester.a2) == fix(1)
    assert thirdShareToken.balanceOf(tester.a2) == fix(1)

    assert len(logs) == 8
    log1 = logs[7]

    assert log1["_event_type"] == "OrderFilled"
    assert log1["filler"] == bytesToHexString(tester.a2)
    assert log1["numCreatorShares"] == 0
    assert log1["numCreatorTokens"] == fix(1, price)
    assert log1["numFillerShares"] == 0
    assert log1["numFillerTokens"] == fix(1, numTicks - price)
    assert log1["marketCreatorFees"] == 0
    assert log1["reporterFees"] == 0
    assert log1["shareToken"] == market.getShareToken(0)
    assert log1["tradeGroupId"] == stringToBytes("43")

    assert orders.getAmount(orderID) == 0
    assert orders.getPrice(orderID) == 0
    assert orders.getOrderCreator(orderID) == longToHexString(0)
    assert orders.getOrderMoneyEscrowed(orderID) == 0
    assert orders.getOrderSharesEscrowed(orderID) == 0
    assert orders.getBetterOrderId(orderID) == longTo32Bytes(0)
    assert orders.getWorseOrderId(orderID) == longTo32Bytes(0)
Ejemplo n.º 30
0
def test_publicFillOrder_bid_scalar(contractsFixture, cash, scalarMarket,
                                    universe):
    createOrder = contractsFixture.contracts['CreateOrder']
    fillOrder = contractsFixture.contracts['FillOrder']
    orders = contractsFixture.contracts['Orders']
    # We're testing the scalar market because it has a different numTicks than 10**18 as the other do. In particular it's numTicks is 40*18**18
    market = scalarMarket
    tradeGroupID = 42
    logs = []

    initialMakerETH = contractsFixture.chain.head_state.get_balance(tester.a1)
    initialFillerETH = contractsFixture.chain.head_state.get_balance(tester.a2)
    creatorCost = fix('2', '0.6')
    fillerCost = fix('2', '39.4')

    # create order
    orderID = createOrder.publicCreateOrder(BID,
                                            2,
                                            fix('0.6'),
                                            market.address,
                                            YES,
                                            longTo32Bytes(0),
                                            longTo32Bytes(0),
                                            tradeGroupID,
                                            sender=tester.k1,
                                            value=creatorCost)

    # fill best order
    captureFilteredLogs(contractsFixture.chain.head_state, orders, logs)
    captureFilteredLogs(contractsFixture.chain.head_state,
                        contractsFixture.contracts['Augur'], logs)
    fillOrderID = fillOrder.publicFillOrder(orderID,
                                            2,
                                            tradeGroupID,
                                            sender=tester.k2,
                                            value=fillerCost)

    assert len(logs) == 5

    assert logs[4]["_event_type"] == "OrderFilled"
    assert logs[4]["filler"] == bytesToHexString(tester.a2)
    assert logs[4]["numCreatorShares"] == 0
    assert logs[4]["numCreatorTokens"] == creatorCost
    assert logs[4]["numFillerShares"] == 0
    assert logs[4]["numFillerTokens"] == fillerCost
    assert logs[4]["settlementFees"] == 0
    assert logs[4]["shareToken"] == market.getShareToken(YES)
    assert logs[4]["tradeGroupId"] == 42

    assert contractsFixture.chain.head_state.get_balance(
        tester.a1) == initialMakerETH - creatorCost
    assert contractsFixture.chain.head_state.get_balance(
        tester.a2) == initialFillerETH - fillerCost
    assert orders.getAmount(orderID) == 0
    assert orders.getPrice(orderID) == 0
    assert orders.getOrderCreator(orderID) == longToHexString(0)
    assert orders.getOrderMoneyEscrowed(orderID) == 0
    assert orders.getOrderSharesEscrowed(orderID) == 0
    assert orders.getBetterOrderId(orderID) == longTo32Bytes(0)
    assert orders.getWorseOrderId(orderID) == longTo32Bytes(0)
    assert fillOrderID == 0