def test_extra_call_gas_constant_when_gas_price_higher(deploy_client,
                                                       deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.PassesInt

    deposit_amount = get_max_gas(
        deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address,
                                  value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(
        alarm._meta.address, -12345)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    base_gas_price = alarm.getCallBaseGasPrice(call_key)

    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 120)
    call_txn_hash = alarm.doCall.sendTransaction(call_key,
                                                 gas_price=base_gas_price + 10)

    call_txn_receipt = wait_for_transaction(deploy_client, call_txn_hash)

    assert alarm.checkIfCalled(call_key) is True

    recorded_gas_used = alarm.getCallGasUsed(call_key)
    actual_gas_used = int(call_txn_receipt['gasUsed'], 16)

    assert recorded_gas_used >= actual_gas_used

    assert abs(recorded_gas_used - actual_gas_used) in {0, 64}
def test_caller_payout(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.PassesUInt

    coinbase = deploy_client.get_coinbase()

    deposit_amount = get_max_gas(deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address, 3)
    wait_for_transaction(deploy_client, txn_hash)

    assert client_contract.value() == 0

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    assert alarm.getCallPayout(call_key) == 0
    assert alarm.getAccountBalance(coinbase) == 0

    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 120)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    wait_for_transaction(deploy_client, call_txn_hash)

    gas_used = alarm.getCallGasUsed(call_key)
    gas_price = alarm.getCallGasPrice(call_key)
    base_gas_price = alarm.getCallBaseGasPrice(call_key)

    scalar = 100 * base_gas_price / (abs(gas_price - base_gas_price) + base_gas_price)
    expected_payout = gas_used * gas_price * scalar * 101 / 10000

    balance = alarm.getAccountBalance(coinbase)
    assert balance == expected_payout
    assert alarm.getCallPayout(call_key) == balance
示例#3
0
def test_call_fee(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.PassesUInt

    deposit_amount = get_max_gas(deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address, 3)
    wait_for_transaction(deploy_client, txn_hash)

    assert client_contract.value() == 0

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    owner = '0xd3cda913deb6f67967b99d67acdfa1712c293601'

    assert alarm.getCallFee(call_key) == 0
    assert alarm.getAccountBalance(owner) == 0

    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 120)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    wait_for_transaction(deploy_client, call_txn_hash)

    balance = alarm.getAccountBalance(owner)
    assert balance > 0
    assert alarm.getCallFee(call_key) == balance
def test_entering_pool(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    coinbase = deploy_client.get_coinbase()

    assert alarm.getBondBalance(coinbase) == 0
    deposit_amount = alarm.getMinimumBond() * 10

    txn_1_hash = alarm.depositBond.sendTransaction(value=deposit_amount)
    wait_for_transaction(deploy_client, txn_1_hash)

    assert alarm.isInPool(coinbase) is False
    assert alarm.canEnterPool(coinbase) is True

    wait_for_transaction(deploy_client, alarm.enterPool.sendTransaction())

    # Now queued to be in the next pool.
    assert alarm.getCurrentGenerationId() == 0
    assert alarm.isInPool(coinbase) is True
    assert alarm.canEnterPool(coinbase) is False

    next_generation_id = alarm.getNextGenerationId()
    assert next_generation_id > 0
    assert alarm.isInGeneration(coinbase, next_generation_id) is True

    deploy_client.wait_for_block(
        alarm.getGenerationStartAt(next_generation_id), 18)

    assert alarm.isInPool(coinbase) is True
    assert alarm.canEnterPool(coinbase) is False
def test_check_if_call_successful(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    deposit_amount = get_max_gas(
        deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address,
                                  value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    assert client_contract.value() is False

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    assert alarm.checkIfCalled(call_key) is False
    assert alarm.checkIfSuccess(call_key) is False

    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key))
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    wait_for_transaction(deploy_client, call_txn_hash)

    assert client_contract.value() is True
    assert alarm.checkIfCalled(call_key) is True
    assert alarm.checkIfSuccess(call_key) is True
def test_extra_call_gas_constant_when_gas_price_lower(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.PassesInt

    deposit_amount = get_max_gas(deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address, -12345)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    base_gas_price = alarm.getCallBaseGasPrice(call_key)

    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 120)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)

    call_txn_receipt = wait_for_transaction(deploy_client, call_txn_hash)

    assert alarm.checkIfCalled(call_key) is True

    recorded_gas_used = alarm.getCallGasUsed(call_key)
    actual_gas_used = int(call_txn_receipt['gasUsed'], 16)

    assert recorded_gas_used >= actual_gas_used

    assert abs(recorded_gas_used - actual_gas_used) in {0, 64}
def test_getting_called_at_block(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    deposit_amount = get_max_gas(deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    assert client_contract.value() is False

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    assert alarm.getCallGasUsed(call_key) == 0

    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 120)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    wait_for_transaction(deploy_client, call_txn_hash)

    call_txn = deploy_client.get_transaction_by_hash(call_txn_hash)

    assert client_contract.value() is True
    assert alarm.getCallCalledAtBlock(call_key) == int(call_txn['blockNumber'], 16)
示例#8
0
def test_infinite_loop_protection(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.InfiniteLoop

    deposit_amount = get_max_gas(
        deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address,
                                  value=deposit_amount)
    deploy_client.send_transaction(to=client_contract._meta.address,
                                   value=1000000000)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    callKey = alarm.getLastCallKey.call()
    assert callKey is not None
    deploy_client.wait_for_block(alarm.getCallTargetBlock.call(callKey), 300)
    call_txn_hash = alarm.doCall.sendTransaction(callKey)
    call_txn_receipt = wait_for_transaction(deploy_client, call_txn_hash)
    call_txn = deploy_client.get_transaction_by_hash(call_txn_hash)

    assert alarm.checkIfCalled.call(callKey) is True
    assert alarm.checkIfSuccess.call(callKey) is False

    gas_used = int(call_txn_receipt['gasUsed'], 16)
    expected = int(call_txn['gas'], 16)
    assert gas_used == expected
def test_caller_payout(geth_node, geth_coinbase, rpc_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.PassesUInt

    deposit_amount = get_max_gas(rpc_client) * rpc_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address, 3)
    wait_for_transaction(client_contract._meta.rpc_client, txn_hash)

    assert client_contract.value.call() == 0

    callKey = alarm.getLastCallKey.call()
    assert callKey is not None

    assert alarm.getCallPayout.call(callKey) == 0
    assert alarm.accountBalances.call(geth_coinbase) == 0

    wait_for_block(rpc_client, alarm.getCallTargetBlock.call(callKey), 120)
    call_txn_hash = alarm.doCall.sendTransaction(callKey)
    wait_for_transaction(alarm._meta.rpc_client, call_txn_hash)

    gas_used = alarm.getCallGasUsed.call(callKey)
    gas_price = alarm.getCallGasPrice.call(callKey)
    base_gas_price = alarm.getCallBaseGasPrice.call(callKey)

    scalar = 100 * base_gas_price / (abs(gas_price - base_gas_price) + base_gas_price)
    expected_payout = gas_used * gas_price * scalar * 101 / 10000

    balance = alarm.accountBalances.call(geth_coinbase)
    assert balance == expected_payout
    assert alarm.getCallPayout.call(callKey) == balance
def test_what_happens_when_call_throws_exception(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.Fails

    deposit_amount = get_max_gas(deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    assert client_contract.value() is False
    assert alarm.checkIfCalled(call_key) is False
    assert alarm.checkIfSuccess(call_key) is False

    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 300)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    call_txn_receipt = wait_for_transaction(deploy_client, call_txn_hash)
    call_txn = deploy_client.get_transaction_by_hash(call_txn_hash)

    assert client_contract.value() is False
    assert alarm.checkIfCalled(call_key) is True
    assert alarm.checkIfSuccess(call_key) is False

    gas_used = int(call_txn_receipt['gasUsed'], 16)
    gas = int(call_txn['gas'], 16)
    gas_recorded = alarm.getCallGasUsed(call_key)

    assert gas == gas_used
    assert gas == gas_recorded
def test_what_happens_when_call_throws_exception(deploy_client,
                                                 deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.Fails

    deposit_amount = get_max_gas(
        deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address,
                                  value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    assert client_contract.value() is False
    assert alarm.checkIfCalled(call_key) is False
    assert alarm.checkIfSuccess(call_key) is False

    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 300)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    call_txn_receipt = wait_for_transaction(deploy_client, call_txn_hash)
    call_txn = deploy_client.get_transaction_by_hash(call_txn_hash)

    assert client_contract.value() is False
    assert alarm.checkIfCalled(call_key) is True
    assert alarm.checkIfSuccess(call_key) is False

    gas_used = int(call_txn_receipt['gasUsed'], 16)
    gas = int(call_txn['gas'], 16)
    gas_recorded = alarm.getCallGasUsed(call_key)

    assert gas == gas_used
    assert gas == gas_recorded
    def manage_membership(self):
        if self.in_any_pool:
            return

        # check bond balance.
        if self.bond_balance < self.minimum_bond:
            self.logger.error(
                "Insufficient bond balance to enter the caller pool")
            self.stop()

        # check the next pool is not currently frozen.
        if self.next_generation_id and self.is_generation_frozen(
                self.next_generation_id):
            self.logger.info("Next pool is frozen and cannot be joined")
            return

        # double check the API agrees with our other checks.
        if not self.can_enter_pool:
            self.logger.warning(
                "CallerPool unexpectedly said we couldn't enter")
            return

        self.logger.info("Entering caller pool")
        txn_hash = self.enter_pool()
        self.logger.debug("Entered caller pool with txn: %s", txn_hash)
        wait_for_transaction(self.rpc_client, txn_hash, 60)
        self.logger.info("Entered caller pool at generation #%s",
                         self.next_generation_id)
def test_entering_pool(geth_node, geth_coinbase, rpc_client, deployed_contracts):
    caller_pool = deployed_contracts.CallerPool

    assert caller_pool.callerBonds.call(geth_coinbase) == 0
    deposit_amount = caller_pool.getMinimumBond.call() * 10

    txn_1_hash = caller_pool.depositBond.sendTransaction(value=deposit_amount)
    wait_for_transaction(rpc_client, txn_1_hash)

    assert caller_pool.isInAnyPool.call() is False
    assert caller_pool.canEnterPool.call() is True

    wait_for_transaction(rpc_client, caller_pool.enterPool.sendTransaction())

    # Now queued to be in the next pool.
    assert caller_pool.getActivePoolKey.call() == 0
    assert caller_pool.isInAnyPool.call() is True
    assert caller_pool.canEnterPool.call() is False

    next_pool_key = caller_pool.getNextPoolKey.call()
    assert next_pool_key > 0
    assert caller_pool.isInPool.call(next_pool_key) is True

    wait_for_block(rpc_client, next_pool_key, 180)

    assert caller_pool.isInAnyPool.call() is True
    assert caller_pool.canEnterPool.call() is False
def test_check_if_call_successful_for_failed_call(deploy_client,
                                                  deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.InfiniteLoop

    deposit_amount = get_max_gas(
        deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address,
                                  value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    assert alarm.checkIfCalled(call_key) is False
    assert alarm.checkIfSuccess(call_key) is False

    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 120)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    call_txn_receipt = wait_for_transaction(deploy_client, call_txn_hash)
    call_txn = deploy_client.get_transaction_by_hash(call_txn_hash)

    assert alarm.checkIfCalled(call_key) is True
    assert alarm.checkIfSuccess(call_key) is False
    assert int(call_txn_receipt['gasUsed'], 16) == int(call_txn['gas'], 16)
def test_extra_call_gas_constant_when_gas_price_lower(geth_node, rpc_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.PassesInt

    deposit_amount = get_max_gas(rpc_client) * rpc_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address, -12345)
    wait_for_transaction(client_contract._meta.rpc_client, txn_hash)

    callKey = alarm.getLastCallKey.call()
    assert callKey is not None

    base_gas_price = alarm.getCallBaseGasPrice.call(callKey)

    wait_for_block(rpc_client, alarm.getCallTargetBlock.call(callKey), 120)
    call_txn_hash = alarm.doCall.sendTransaction(callKey, gas_price=base_gas_price - 10)

    call_txn_receipt = wait_for_transaction(alarm._meta.rpc_client, call_txn_hash)

    assert alarm.checkIfCalled.call(callKey) is True

    recorded_gas_used = alarm.getCallGasUsed.call(callKey)
    actual_gas_used = int(call_txn_receipt['gasUsed'], 16)

    try:
        assert actual_gas_used == recorded_gas_used
    except AssertionError:
        assert actual_gas_used == recorded_gas_used + 64
def test_registering_many_values(geth_node, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.TestDataRegistry

    assert client_contract.wasSuccessful.call() == 0

    txn_hash = client_contract.registerMany.sendTransaction(
        alarm._meta.address,
        2 ** 256 - 1,
        -1 * (2 ** 128 - 1),
        2 ** 128 - 1,
        '1234567890\00\00\00abcdefg',
        '0xc948453368e5ddc7bc00bb52b5809138217a068d',
        '123456789012345678901234567890123456789012345678901234567890',
    )

    wait_for_transaction(client_contract._meta.rpc_client, txn_hash)

    assert client_contract.wasSuccessful.call() == 1

    data_hash = alarm.getLastDataHash.call()
    assert data_hash is not None

    data = alarm.getLastData.call()
    assert data == (
        '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
        '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff'
        '1234567890\x00\x00\x00abcdefg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9HE3h\xe5\xdd\xc7\xbc\x00\xbbR\xb5\x80\x918!z\x06\x8d'
        '123456789012345678901234567890123456789012345678901234567890\x00\x00\x00\x00'
    )
示例#17
0
def test_registering_using_local_abstraction(deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.TestDataRegistry

    assert client_contract.wasSuccessful.call() == 0

    # This is for a weird bug that I'm not sure how to fix.
    evm = alarm._meta.rpc_client.evm
    evm.mine()

    txn_hash = client_contract.registerData.sendTransaction(
        alarm._meta.address,
        -1 * (2**128 - 1),
        '1234567890\00\00\00abcdefg',
        '0xc948453368e5ddc7bc00bb52b5809138217a068d',
    )

    wait_for_transaction(client_contract._meta.rpc_client, txn_hash)

    assert client_contract.wasSuccessful.call() == 1

    data_hash = alarm.getLastDataHash.call()
    assert data_hash is not None

    data = alarm.getLastData.call()
    assert data == (
        '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
        '1234567890\x00\x00\x00abcdefg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9HE3h\xe5\xdd\xc7\xbc\x00\xbbR\xb5\x80\x918!z\x06\x8d'
    )
def test_call_fee(geth_node, rpc_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.PassesUInt

    deposit_amount = get_max_gas(rpc_client) * rpc_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address, 3)
    wait_for_transaction(client_contract._meta.rpc_client, txn_hash)

    assert client_contract.value.call() == 0

    callKey = alarm.getLastCallKey.call()
    assert callKey is not None

    before_balance = alarm.accountBalances.call(client_contract._meta.address)

    wait_for_block(rpc_client, alarm.getCallTargetBlock.call(callKey), 120)
    call_txn_hash = alarm.doCall.sendTransaction(callKey)
    wait_for_transaction(alarm._meta.rpc_client, call_txn_hash)

    after_balance = alarm.accountBalances.call(client_contract._meta.address)
    fee = alarm.getCallFee.call(callKey)
    payout = alarm.getCallPayout.call(callKey)

    assert after_balance == before_balance - payout - fee
def test_scheduled_call_execution_without_pool(geth_node, geth_coinbase, rpc_client, deployed_contracts, contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.SpecifyBlock
    caller_pool = contracts.CallerPool(alarm.getCallerPoolAddress.call(), rpc_client)

    deposit_amount = get_max_gas(rpc_client) * rpc_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    target_block = rpc_client.get_block_number() + 45

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address, target_block)
    wait_for_transaction(client_contract._meta.rpc_client, txn_hash)

    callKey = alarm.getLastCallKey.call()
    assert callKey is not None

    pool_manager = PoolManager(caller_pool)
    scheduled_call = ScheduledCall(alarm, pool_manager, callKey)

    assert pool_manager.in_active_pool is False
    scheduled_call.execute_async()

    wait_for_block(rpc_client, scheduled_call.target_block + 4, 180)
    assert pool_manager.in_active_pool is False

    assert scheduled_call.txn_hash
    assert scheduled_call.txn_receipt
    assert scheduled_call.txn

    assert alarm.checkIfCalled.call(scheduled_call.call_key)
    assert scheduled_call.was_called
    assert scheduled_call.target_block <= scheduled_call.called_at_block
    assert scheduled_call.called_at_block <= scheduled_call.target_block + scheduled_call.grace_period
def test_entering_pool(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    coinbase = deploy_client.get_coinbase()

    assert alarm.getBondBalance(coinbase) == 0
    deposit_amount = alarm.getMinimumBond() * 10

    txn_1_hash = alarm.depositBond.sendTransaction(value=deposit_amount)
    wait_for_transaction(deploy_client, txn_1_hash)

    assert alarm.isInPool(coinbase) is False
    assert alarm.canEnterPool(coinbase) is True

    wait_for_transaction(deploy_client, alarm.enterPool.sendTransaction())

    # Now queued to be in the next pool.
    assert alarm.getCurrentGenerationId() == 0
    assert alarm.isInPool(coinbase) is True
    assert alarm.canEnterPool(coinbase) is False

    next_generation_id = alarm.getNextGenerationId()
    assert next_generation_id > 0
    assert alarm.isInGeneration(coinbase, next_generation_id) is True

    deploy_client.wait_for_block(alarm.getGenerationStartAt(next_generation_id), 18)

    assert alarm.isInPool(coinbase) is True
    assert alarm.canEnterPool(coinbase) is False
示例#21
0
def test_call_fee_and_payout_deducted_from_account_balance(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.PassesUInt

    deposit_amount = get_max_gas(deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address, 3)
    wait_for_transaction(deploy_client, txn_hash)

    assert client_contract.value() == 0

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    before_balance = alarm.getAccountBalance(client_contract._meta.address)

    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 120)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    wait_for_transaction(deploy_client, call_txn_hash)

    after_balance = alarm.getAccountBalance(client_contract._meta.address)
    fee = alarm.getCallFee(call_key)
    payout = alarm.getCallPayout(call_key)

    assert after_balance == before_balance - payout - fee
def test_enumerate_upcoming_tree_positions(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.SpecifyBlock

    anchor_block = deploy_client.get_block_number()

    blocks = (1, 4, 4, 8, 15, 25, 25, 25, 30, 40, 50, 60)

    call_keys = []

    for n in blocks:
        txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address, anchor_block + 100 + n)
        wait_for_transaction(deploy_client, txn_hash)

        last_call_key = alarm.getLastCallKey()
        assert last_call_key is not None

        call_keys.append(last_call_key)

    expected_calls = tuple(utils.encode_hex(c) for c in call_keys[1:10])

    actual_calls = tuple(
        utils.encode_hex(c)
        for c in enumerate_upcoming_calls(alarm, anchor_block + 100 + 4)
    )
    assert actual_calls == expected_calls
def test_cost_of_duplicate_call(geth_node, rpc_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    deposit_amount = get_max_gas(rpc_client) * rpc_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(client_contract._meta.rpc_client, txn_hash)

    assert client_contract.value.call() is False

    callKey = alarm.getLastCallKey.call()
    assert callKey is not None

    assert alarm.checkIfCalled.call(callKey) is False

    wait_for_block(rpc_client, alarm.getCallTargetBlock.call(callKey), 120)
    call_txn_hash = alarm.doCall.sendTransaction(callKey)
    call_txn_receipt = wait_for_transaction(alarm._meta.rpc_client, call_txn_hash)

    assert alarm.checkIfCalled.call(callKey) is True

    call_txn_hash = alarm.doCall.sendTransaction(callKey)
    call_txn_receipt = wait_for_transaction(alarm._meta.rpc_client, call_txn_hash)

    assert call_txn_receipt['gasUsed'] == '0x67f0'
示例#24
0
def test_getting_gas_used(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    deposit_amount = get_max_gas(
        deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address,
                                  value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    assert client_contract.value() is False

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    assert alarm.getCallGasUsed(call_key) == 0

    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 120)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    wait_for_transaction(deploy_client, call_txn_hash)

    call_txn = deploy_client.get_transaction_by_hash(call_txn_hash)

    assert client_contract.value() is True
    assert alarm.getCallGasPrice(call_key) == int(call_txn['gasPrice'], 16)
def test_registering_using_local_abstraction(deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.TestDataRegistry

    assert client_contract.wasSuccessful.call() == 0

    # This is for a weird bug that I'm not sure how to fix.
    evm = alarm._meta.rpc_client.evm
    evm.mine()

    txn_hash = client_contract.registerData.sendTransaction(
        alarm._meta.address,
        -1 * (2 ** 128 - 1),
        '1234567890\00\00\00abcdefg',
        '0xc948453368e5ddc7bc00bb52b5809138217a068d',
    )

    wait_for_transaction(client_contract._meta.rpc_client, txn_hash)

    assert client_contract.wasSuccessful.call() == 1

    data_hash = alarm.getLastDataHash.call()
    assert data_hash is not None

    data = alarm.getLastData.call()
    assert data == (
        '\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'
        '1234567890\x00\x00\x00abcdefg\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
        '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xc9HE3h\xe5\xdd\xc7\xbc\x00\xbbR\xb5\x80\x918!z\x06\x8d'
    )
示例#26
0
def test_executing_scheduled_call_with_bytes32(deploy_client,
                                               deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.PassesBytes32

    deposit_amount = get_max_gas(
        deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address,
                                  value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(
        alarm._meta.address,
        'abc\x00\x00\x00\x00\x00abc\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
    )
    wait_for_transaction(deploy_client, txn_hash)

    assert client_contract.value() is None

    call_key = alarm.getLastCallKey()
    assert call_key is not None
    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 120)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    wait_for_transaction(deploy_client, call_txn_hash)

    assert client_contract.value() == 'abc\x00\x00\x00\x00\x00abc'
def test_authorizing_other_address(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.AuthorizesOthers
    coinbase = deploy_client.get_coinbase()

    authed_addr = alarm.authorizedAddress()
    unauthed_addr = alarm.unauthorizedAddress()

    deposit_amount = get_max_gas(
        deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(coinbase, value=deposit_amount)

    assert alarm.checkAuthorization(coinbase,
                                    client_contract._meta.address) is False

    txn_1_hash = alarm.scheduleCall.sendTransaction(
        client_contract._meta.address,
        client_contract.doIt.encoded_abi_signature,
        utils.decode_hex(
            'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'
        ),
        deploy_client.get_block_number() + 50, 255, 0)
    wait_for_transaction(deploy_client, txn_1_hash)

    call_key = alarm.getLastCallKey()
    assert call_key is not None
    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 120)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    wait_for_transaction(deploy_client, call_txn_hash)

    assert alarm.checkIfCalled(call_key) is True
    assert alarm.checkIfSuccess(call_key) is True
    assert client_contract.calledBy() == unauthed_addr

    wait_for_transaction(
        deploy_client,
        client_contract.authorize.sendTransaction(alarm._meta.address))
    assert alarm.checkAuthorization(coinbase,
                                    client_contract._meta.address) is True

    txn_2_hash = alarm.scheduleCall.sendTransaction(
        client_contract._meta.address,
        client_contract.doIt.encoded_abi_signature,
        utils.decode_hex(
            'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470'
        ),
        deploy_client.get_block_number() + 50, 255, 0)
    wait_for_transaction(deploy_client, txn_2_hash)

    assert call_key != alarm.getLastCallKey()
    call_key = alarm.getLastCallKey()
    assert call_key is not None
    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 120)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    wait_for_transaction(deploy_client, call_txn_hash)

    assert alarm.checkIfCalled(call_key) is True
    assert alarm.checkIfSuccess(call_key) is True
    assert client_contract.calledBy() == authed_addr
def test_get_next_call_with_no_duplicate_block_numbers(geth_node, rpc_client, deployed_contracts):
    """
              8
             / \
            /   \
           /     \
          7       13
         /       /  \
        4       9    15
       / \       \
      1   5       11
           \
            6
    """
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.SpecifyBlock

    anchor_block = rpc_client.get_block_number()

    call_keys = []

    blocks = [anchor_block + 1000 + n for n in (8, 7, 13, 4, 5, 1, 9, 6, 11, 15)]

    for n in blocks:
        wait_for_transaction(rpc_client, client_contract.scheduleIt.sendTransaction(alarm._meta.address, n))

        last_call_key = alarm.getLastCallKey.call()
        assert last_call_key is not None

        call_keys.append(last_call_key)

    key_to_block = dict(zip(call_keys, [b - 1000 - anchor_block for b in blocks]))
    key_to_block[None] = None

    expected_next_blocks = {
        1: 1,
        2: 4,
        3: 4,
        4: 4,
        5: 5,
        6: 6,
        7: 7,
        8: 8,
        9: 9,
        10: 11,
        11: 11,
        12: 13,
        13: 13,
        14: 15,
        15: 15,
        16: None,
    }

    actual_next_blocks = {
        n: key_to_block[alarm.getNextCallKey.call(n + 1000 + anchor_block)]
        for n in expected_next_blocks.keys()
    }

    assert actual_next_blocks == expected_next_blocks
def test_get_call_signature(geth_node, geth_coinbase, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(client_contract._meta.rpc_client, txn_hash)

    call_key = alarm.getLastCallKey.call()
    assert call_key

    alarm.getCallABISignature.call(call_key) == client_contract.doIt.encoded_abi_function_signature
def test_get_call_signature(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey.call()
    assert call_key

    alarm.getCallABISignature.call(call_key) == '\xb2\x9f\x085'
    alarm.getCallABISignature.call(call_key) == client_contract.doIt.encoded_abi_signature
def test_getting_contract_address(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    assert client_contract.value() is False

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    assert alarm.getCallContractAddress(call_key) == client_contract._meta.address
def test_authorizing_other_address(geth_node, geth_coinbase, rpc_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.AuthorizesOthers

    assert alarm.checkAuthorization.call(geth_coinbase, client_contract._meta.address) is False

    wait_for_transaction(rpc_client, client_contract.authorize.sendTransaction(alarm._meta.address))

    assert alarm.checkAuthorization.call(geth_coinbase, client_contract._meta.address) is True

    wait_for_transaction(rpc_client, client_contract.unauthorize.sendTransaction(alarm._meta.address))

    assert alarm.checkAuthorization.call(geth_coinbase, client_contract._meta.address) is False
示例#33
0
def test_get_call_signature(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey.call()
    assert call_key

    alarm.getCallABISignature.call(call_key) == '\xb2\x9f\x085'
    alarm.getCallABISignature.call(
        call_key) == client_contract.doIt.encoded_abi_signature
def test_withdrawing_bond_restricted_when_in_pool(deploy_client,
                                                  deployed_contracts):
    alarm = deployed_contracts.Alarm
    coinbase = deploy_client.get_coinbase()

    assert alarm.getBondBalance(coinbase) == 0
    deposit_amount = alarm.getMinimumBond() * 10

    txn_1_hash = alarm.depositBond.sendTransaction(value=deposit_amount)
    wait_for_transaction(deploy_client, txn_1_hash)

    assert alarm.getBondBalance(coinbase) == deposit_amount

    assert alarm.isInPool(coinbase) is False
    assert alarm.canEnterPool(coinbase) is True
    wait_for_transaction(deploy_client, alarm.enterPool.sendTransaction())

    txn_2_hash = alarm.withdrawBond.sendTransaction(deposit_amount)
    wait_for_transaction(deploy_client, txn_2_hash)

    assert alarm.isInPool(coinbase) is True

    # Withdrawl of full amount not allowed
    assert alarm.getBondBalance(coinbase) == deposit_amount

    # wi
    minimum_bond = alarm.getMinimumBond()
    txn_3_hash = alarm.withdrawBond.sendTransaction(
        deposit_amount - 2 * minimum_bond, )
    wait_for_transaction(deploy_client, txn_3_hash)

    # Withdrawl of amount above minimum bond amount is allowed
    assert alarm.isInPool(coinbase) is True
    assert alarm.getBondBalance(coinbase) == 2 * minimum_bond
def test_getting_target_block(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)
    txn = deploy_client.get_transaction_by_hash(txn_hash)

    created_at_block = int(txn['blockNumber'], 16)

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    assert alarm.getCallTargetBlock(call_key) == created_at_block + 40
def test_get_scheduled_by(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    deposit_amount = get_max_gas(deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey()
    assert call_key

    alarm.getCallScheduledBy(call_key) == deploy_client.get_coinbase()
def test_first_call_registered_is_set_as_root(geth_node, rpc_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.SpecifyBlock

    assert alarm.rootNodeCallKey.call(raw=True) == "0x0000000000000000000000000000000000000000000000000000000000000000"

    current_block = rpc_client.get_block_number()

    wait_for_transaction(rpc_client, client_contract.scheduleIt.sendTransaction(alarm._meta.address, current_block + 100))

    last_call_key = alarm.getLastCallKey.call()
    assert last_call_key is not None

    assert alarm.rootNodeCallKey.call() == last_call_key
def test_depositing_bond(geth_node, geth_coinbase, deployed_contracts):
    caller_pool = deployed_contracts.CallerPool

    assert caller_pool.callerBonds.call(geth_coinbase) == 0

    txn_1_hash = caller_pool.depositBond.sendTransaction(value=123)
    wait_for_transaction(caller_pool._meta.rpc_client, txn_1_hash)

    assert caller_pool.callerBonds.call(geth_coinbase) == 123

    txn_2_hash = caller_pool.depositBond.sendTransaction(value=456)
    wait_for_transaction(caller_pool._meta.rpc_client, txn_2_hash)

    assert caller_pool.callerBonds.call(geth_coinbase) == 579
def test_getting_target_block(geth_node, rpc_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(client_contract._meta.rpc_client, txn_hash)
    txn = client_contract._meta.rpc_client.get_transaction_by_hash(txn_hash)

    created_at_block = int(txn["blockNumber"], 16)

    callKey = alarm.getLastCallKey.call()
    assert callKey is not None

    assert alarm.getCallTargetBlock.call(callKey) == created_at_block + 40
def test_depositing_funds(geth_node, geth_coinbase, deployed_contracts):
    alarm = deployed_contracts.Alarm

    assert alarm.accountBalances.call(geth_coinbase) == 0

    txn_1_hash = alarm.deposit.sendTransaction(geth_coinbase, value=123)
    wait_for_transaction(alarm._meta.rpc_client, txn_1_hash)

    assert alarm.accountBalances.call(geth_coinbase) == 123

    txn_2_hash = alarm.deposit.sendTransaction(geth_coinbase, value=456)
    wait_for_transaction(alarm._meta.rpc_client, txn_2_hash)

    assert alarm.accountBalances.call(geth_coinbase) == 579
def test_withdrawing_bond_restricted_when_in_pool(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    coinbase = deploy_client.get_coinbase()

    assert alarm.getBondBalance(coinbase) == 0
    deposit_amount = alarm.getMinimumBond() * 10

    txn_1_hash = alarm.depositBond.sendTransaction(value=deposit_amount)
    wait_for_transaction(deploy_client, txn_1_hash)

    assert alarm.getBondBalance(coinbase) == deposit_amount

    assert alarm.isInPool(coinbase) is False
    assert alarm.canEnterPool(coinbase) is True
    wait_for_transaction(deploy_client, alarm.enterPool.sendTransaction())

    txn_2_hash = alarm.withdrawBond.sendTransaction(deposit_amount)
    wait_for_transaction(deploy_client, txn_2_hash)

    assert alarm.isInPool(coinbase) is True

    # Withdrawl of full amount not allowed
    assert alarm.getBondBalance(coinbase) == deposit_amount

    # wi
    minimum_bond = alarm.getMinimumBond()
    txn_3_hash = alarm.withdrawBond.sendTransaction(
        deposit_amount - 2 * minimum_bond,
    )
    wait_for_transaction(deploy_client, txn_3_hash)

    # Withdrawl of amount above minimum bond amount is allowed
    assert alarm.isInPool(coinbase) is True
    assert alarm.getBondBalance(coinbase) == 2 * minimum_bond
def test_depositing(deploy_client, deployed_contracts):
    bank = deployed_contracts.TestAccounting
    coinbase = deploy_client.get_coinbase()

    assert bank.getAccountBalance(coinbase) == 0

    txn_hash = bank.deposit(value=1234)
    wait_for_transaction(deploy_client, txn_hash)

    assert bank.getAccountBalance(coinbase) == 1234

    txn_hash = bank.deposit(value=1234)
    wait_for_transaction(deploy_client, txn_hash)

    assert bank.getAccountBalance(coinbase) == 2468
def test_depositing_bond(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    coinbase = deploy_client.get_coinbase()

    assert alarm.getBondBalance.call(coinbase) == 0

    txn_1_hash = alarm.depositBond.sendTransaction(value=123)
    wait_for_transaction(deploy_client, txn_1_hash)

    assert alarm.getBondBalance.call(coinbase) == 123

    txn_2_hash = alarm.depositBond.sendTransaction(value=456)
    wait_for_transaction(deploy_client, txn_2_hash)

    assert alarm.getBondBalance.call(coinbase) == 579
def test_executing_scheduled_call(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.PassesUInt

    deposit_amount = get_max_gas(deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address, 3)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    call_data = alarm.getCallData(call_key)
    assert call_data == '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03'
def test_getting_base_gas_used(geth_node, rpc_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    deposit_amount = get_max_gas(rpc_client) * rpc_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(client_contract._meta.rpc_client, txn_hash)
    txn = rpc_client.get_transaction_by_hash(txn_hash)

    callKey = alarm.getLastCallKey.call()
    assert callKey is not None

    assert alarm.getCallBaseGasPrice.call(callKey) == int(txn['gasPrice'], 16)
def test_depositing_bond(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    coinbase = deploy_client.get_coinbase()

    assert alarm.getBondBalance.call(coinbase) == 0

    txn_1_hash = alarm.depositBond.sendTransaction(value=123)
    wait_for_transaction(deploy_client, txn_1_hash)

    assert alarm.getBondBalance.call(coinbase) == 123

    txn_2_hash = alarm.depositBond.sendTransaction(value=456)
    wait_for_transaction(deploy_client, txn_2_hash)

    assert alarm.getBondBalance.call(coinbase) == 579
def test_depositing_funds(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    coinbase = deploy_client.get_coinbase()

    assert alarm.getAccountBalance.call(coinbase) == 0

    txn_1_hash = alarm.deposit.sendTransaction(coinbase, value=123)
    wait_for_transaction(alarm._meta.rpc_client, txn_1_hash)

    assert alarm.getAccountBalance.call(coinbase) == 123

    txn_2_hash = alarm.deposit.sendTransaction(coinbase, value=456)
    wait_for_transaction(alarm._meta.rpc_client, txn_2_hash)

    assert alarm.getAccountBalance.call(coinbase) == 579
示例#48
0
def test_get_scheduled_by(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    deposit_amount = get_max_gas(
        deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address,
                                  value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey()
    assert call_key

    alarm.getCallScheduledBy(call_key) == deploy_client.get_coinbase()
示例#49
0
def test_scheduled_call_execution_without_pool(geth_node, geth_node_config, deploy_client, deployed_contracts, contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.SpecifyBlock

    deposit_amount = get_max_gas(deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    target_block = deploy_client.get_block_number() + 45

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address, target_block)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    scheduled_call = ScheduledCall(alarm, call_key)
    block_sage = scheduled_call.block_sage
    pool_manager = PoolManager(alarm, block_sage=block_sage)

    time.sleep(1)

    assert pool_manager.in_any_pool is False
    scheduled_call.execute_async()

    # let the scheduled call do it's thing.
    assert block_sage.current_block_number < target_block

    wait_till = scheduled_call.target_block + 10
    wait_for_block(
        deploy_client,
        wait_till,
        2 * block_sage.estimated_time_to_block(wait_till),
    )

    for i in range(5):
        if scheduled_call.txn_hash:
            break
        time.sleep(block_sage.block_time)

    assert scheduled_call.txn_hash
    assert scheduled_call.txn_receipt
    assert scheduled_call.txn

    assert alarm.checkIfCalled(scheduled_call.call_key)
    assert scheduled_call.was_called
    assert scheduled_call.target_block <= scheduled_call.called_at_block
    assert scheduled_call.called_at_block <= scheduled_call.target_block + scheduled_call.grace_period
def test_getting_base_gas_used(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.NoArgs

    deposit_amount = get_max_gas(
        deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address,
                                  value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)
    txn = deploy_client.get_transaction_by_hash(txn_hash)

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    assert alarm.getCallBaseGasPrice(call_key) == int(txn['gasPrice'], 16)
def test_scheduler(geth_node, geth_node_config, deploy_client,
                   deployed_contracts, contracts):
    block_sage = BlockSage(deploy_client)

    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.SpecifyBlock

    deposit_amount = get_max_gas(
        deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address,
                                  value=deposit_amount)

    anchor_block = deploy_client.get_block_number()

    blocks = (1, 4, 4, 8, 30, 40, 50, 60)

    call_keys = []

    for n in blocks:
        wait_for_transaction(
            deploy_client,
            client_contract.scheduleIt.sendTransaction(alarm._meta.address,
                                                       anchor_block + 100 + n))

        last_call_key = alarm.getLastCallKey()
        assert last_call_key is not None

        call_keys.append(last_call_key)

    pool_manager = PoolManager(alarm, block_sage)
    scheduler = Scheduler(alarm, pool_manager, block_sage=block_sage)
    scheduler.monitor_async()

    final_block = anchor_block + 100 + 70
    wait_for_block(
        deploy_client,
        final_block,
        2 * block_sage.estimated_time_to_block(final_block),
    )

    scheduler.stop()
    block_sage.stop()

    results = [alarm.checkIfCalled(k) for k in call_keys]
    assert all(results)
示例#52
0
def test_executing_scheduled_call(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.PassesUInt

    deposit_amount = get_max_gas(
        deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address,
                                  value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(
        alarm._meta.address, 3)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    call_data = alarm.getCallData(call_key)
    assert call_data == '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x03'
示例#53
0
def test_cancelling_a_call(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.CancelsCall

    deposit_amount = get_max_gas(deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address)
    wait_for_transaction(deploy_client, txn_hash)

    call_key = alarm.getLastCallKey()
    assert call_key is not None

    assert alarm.checkIfCancelled(call_key) is False

    cancel_txn_hash = client_contract.cancelIt.sendTransaction(alarm._meta.address, call_key)
    wait_for_transaction(deploy_client, cancel_txn_hash)

    assert alarm.checkIfCancelled(call_key) is True
def test_registering_bytes(deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.TestDataRegistry

    assert client_contract.wasSuccessful.call() == 0

    # This is for a weird bug that I'm not sure how to fix.
    evm = alarm._meta.rpc_client.evm
    evm.mine()

    txn_hash = client_contract.registerBytes.sendTransaction(alarm._meta.address, 'abcd')
    wait_for_transaction(client_contract._meta.rpc_client, txn_hash)

    assert client_contract.wasSuccessful.call() == 1

    data_hash = alarm.getLastDataHash.call()
    assert data_hash is not None

    data = alarm.getLastData.call()
    assert data == 'abcd\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
示例#55
0
def test_authorizing_other_address(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.AuthorizesOthers
    coinbase = deploy_client.get_coinbase()

    assert alarm.checkAuthorization.call(
        coinbase, client_contract._meta.address) is False

    wait_for_transaction(
        deploy_client,
        client_contract.authorize.sendTransaction(alarm._meta.address))

    assert alarm.checkAuthorization.call(coinbase,
                                         client_contract._meta.address) is True

    wait_for_transaction(
        deploy_client,
        client_contract.unauthorize.sendTransaction(alarm._meta.address))

    assert alarm.checkAuthorization.call(
        coinbase, client_contract._meta.address) is False
def test_executing_scheduled_call_with_address(deploy_client, deployed_contracts):
    alarm = deployed_contracts.Alarm
    client_contract = deployed_contracts.PassesAddress

    deposit_amount = get_max_gas(deploy_client) * deploy_client.get_gas_price() * 20
    alarm.deposit.sendTransaction(client_contract._meta.address, value=deposit_amount)

    address = '0xc948453368e5ddc7bc00bb52b5809138217a068d'

    txn_hash = client_contract.scheduleIt.sendTransaction(alarm._meta.address, address)
    wait_for_transaction(deploy_client, txn_hash)

    assert client_contract.value() == '0x0000000000000000000000000000000000000000'

    call_key = alarm.getLastCallKey()
    assert call_key is not None
    deploy_client.wait_for_block(alarm.getCallTargetBlock(call_key), 120)
    call_txn_hash = alarm.doCall.sendTransaction(call_key)
    wait_for_transaction(deploy_client, call_txn_hash)

    assert client_contract.value() == address