visual-identity/plasma_cash/challenge_between_demo.py

75 lines
2.2 KiB
Python
Raw Permalink Normal View History

2018-07-31 15:24:58 +00:00
import time
from client.client import Client
from dependency_config import container
from utils.utils import increaseTime
alice = Client(container.get_root('alice'), container.get_token('alice'))
bob = Client(container.get_root('bob'), container.get_token('bob'))
eve = Client(container.get_root('eve'), container.get_token('eve'))
authority = Client(
container.get_root('authority'), container.get_token('authority')
)
bobTokensStart = bob.token_contract.balance_of()
# Give Eve 5 tokens
eve.register()
# Eve deposits a coin
tx_hash, gas_used = eve.deposit(11)
event_data = eve.root_chain.get_event_data('Deposit', tx_hash)
deposit1_utxo = event_data[0]['args']['slot']
# wait to make sure that events get fired correctly
time.sleep(2)
# Eve sends her plasma coin to Bob
coin = eve.get_plasma_coin(deposit1_utxo)
eve_to_bob = eve.send_transaction(
deposit1_utxo, coin['deposit_block'], bob.token_contract.account.address
)
authority.submit_block()
eve_to_bob_block = authority.get_block_number()
bob.watch_exits(deposit1_utxo)
# Eve sends this same plasma coin to Alice
eve_to_alice = eve.send_transaction(
deposit1_utxo, coin['deposit_block'], alice.token_contract.account.address
)
authority.submit_block()
eve_to_alice_block = authority.get_block_number()
# Alice attempts to exit here double-spent coin
# Bob auto-challenges Alice's exit
alice.start_exit(deposit1_utxo, coin['deposit_block'], eve_to_alice_block)
# bob.challenge_between(deposit1_utxo, eve_to_bob_block)
# Wait for challenge
time.sleep(2)
bob.start_exit(deposit1_utxo, coin['deposit_block'], eve_to_bob_block)
bob.stop_watching_exits(deposit1_utxo)
w3 = bob.root_chain.w3 # get w3 instance
increaseTime(w3, 8 * 24 * 3600)
authority.finalize_exits()
bob.withdraw(deposit1_utxo)
bob_balance_before = w3.eth.getBalance(bob.token_contract.account.address)
bob.withdraw_bonds()
bob_balance_after = w3.eth.getBalance(bob.token_contract.account.address)
assert (
bob_balance_before < bob_balance_after
), "END: Bob did not withdraw his bonds"
bobTokensEnd = bob.token_contract.balance_of()
print('Bob has {} tokens'.format(bobTokensEnd))
assert (
bobTokensEnd == bobTokensStart + 1
), "END: Bob has incorrect number of tokens"
print('Plasma Cash `challengeBetween` success :)')