38     web3, eth = mock.open_test_web3()
 
   41     keystore = mock.init_test_keystore()
 
   43     deployer_eth_address = eth.accounts[0]
 
   44     bob_eth_address = eth.accounts[1]
 
   45     alice_eth_address = eth.accounts[2]
 
   46     charlie_eth_address = eth.accounts[3]
 
   49     prover_client = ProverClient(mock.TEST_PROVER_SERVER_ENDPOINT)
 
   50     prover_config = prover_client.get_configuration()
 
   51     pp = prover_config.pairing_parameters
 
   52     assert prover_client.get_configuration().zksnark_name == zksnark_name
 
   55     tree_depth = zeth.core.constants.ZETH_MERKLE_TREE_DEPTH
 
   56     zeth_client, _contract_desc = MixerClient.deploy(
 
   71         tree_depth, tree_hash)
 
   72     mixer_instance = zeth_client.mixer_instance
 
   75     def _mk_wallet(name: str, sk: ZethAddressPriv) -> Wallet:
 
   76         wallet_dir = join(mock.TEST_NOTE_DIR, name + 
"-eth")
 
   77         if exists(wallet_dir):
 
   80             shutil.rmtree(wallet_dir)
 
   81         return Wallet(mixer_instance, name, wallet_dir, sk, tree_hash)
 
   83     sk_alice = keystore[
'Alice'].addr_sk
 
   84     sk_bob = keystore[
'Bob'].addr_sk
 
   85     sk_charlie = keystore[
'Charlie'].addr_sk
 
   86     alice_wallet = _mk_wallet(
'alice', sk_alice)
 
   87     bob_wallet = _mk_wallet(
'bob', sk_bob)
 
   88     charlie_wallet = _mk_wallet(
'charlie', sk_charlie)
 
   93             out_ev: List[MixOutputEvents]) \
 
   94             -> Dict[str, List[ZethNoteDescription]]:
 
   97             'alice': alice_wallet.receive_notes(out_ev, pp),
 
   98             'bob': bob_wallet.receive_notes(out_ev, pp),
 
   99             'charlie': charlie_wallet.receive_notes(out_ev, pp),
 
  101         alice_wallet.update_and_save_state(block_num)
 
  102         bob_wallet.update_and_save_state(block_num)
 
  103         charlie_wallet.update_and_save_state(block_num)
 
  104         block_num = block_num + 1
 
  107     print(
"[INFO] 4. Running tests (asset mixed: Ether)...")
 
  108     print(
"- Initial balances: ")
 
  114         zeth_client.mixer_instance.address)
 
  117     result_deposit_bob_to_bob = scenario.bob_deposit(
 
  124     print(
"- Balances after Bob's deposit: ")
 
  130         zeth_client.mixer_instance.address
 
  136     recovered_notes = _receive_notes(result_deposit_bob_to_bob.output_events)
 
  137     assert(len(recovered_notes[
'alice']) == 0), \
 
  138         "Alice decrypted a ciphertext that was not encrypted with her key!" 
  144     assert(len(recovered_notes[
'bob']) == 2), \
 
  145         f
"Bob recovered {len(recovered_notes['bob'])} notes, expected 2" 
  148     result_transfer_bob_to_charlie = scenario.bob_to_charlie(
 
  152         recovered_notes[
'bob'][0].as_input(),
 
  157     result_double_spending = 
None 
  159         result_double_spending = scenario.bob_to_charlie(
 
  163             recovered_notes[
'bob'][0].as_input(),
 
  166     except Exception 
as e:
 
  167         print(f
"Bob's double spending successfully rejected! (msg: {e})")
 
  168     assert(result_double_spending 
is None), \
 
  169         "Bob managed to spend the same note twice!" 
  171     print(
"- Balances after Bob's transfer to Charlie: ")
 
  177         zeth_client.mixer_instance.address
 
  181     recovered_notes = _receive_notes(
 
  182         result_transfer_bob_to_charlie.output_events)
 
  183     notes_charlie = recovered_notes[
'charlie']
 
  184     assert(len(notes_charlie) == 1), \
 
  185         f
"Charlie decrypted {len(notes_charlie)}.  Expected 1!" 
  187     input_charlie_withdraw = notes_charlie[0]
 
  189     charlie_balance_before_withdrawal = eth.getBalance(charlie_eth_address)
 
  190     _ = scenario.charlie_withdraw(
 
  194         input_charlie_withdraw.as_input(),
 
  197     charlie_balance_after_withdrawal = eth.getBalance(charlie_eth_address)
 
  198     print(
"Balances after Charlie's withdrawal: ")
 
  204         zeth_client.mixer_instance.address)
 
  205     if charlie_balance_after_withdrawal <= charlie_balance_before_withdrawal:
 
  206         raise Exception(
"Charlie's balance did not increase after withdrawal")
 
  209     result_double_spending = 
None 
  213         result_double_spending = scenario.charlie_double_withdraw(
 
  218             input_charlie_withdraw.as_input(),
 
  221     except Exception 
as e:
 
  222         print(f
"Charlie's double spending successfully rejected! (msg: {e})")
 
  223     print(
"Balances after Charlie's double withdrawal attempt: ")
 
  224     assert(result_double_spending 
is None), \
 
  225         "Charlie managed to withdraw the same note twice!" 
  231         zeth_client.mixer_instance.address)
 
  235     result_deposit_bob_to_bob = scenario.charlie_corrupt_bob_deposit(
 
  246     recovered_notes = _receive_notes(
 
  247         result_deposit_bob_to_bob.output_events)
 
  248     assert(len(recovered_notes[
'bob']) == 2), \
 
  249         f
"Bob recovered {len(recovered_notes['bob'])} notes, expected 2" 
  251     print(
"- Balances after Bob's last deposit: ")
 
  257         zeth_client.mixer_instance.address)
 
  260         "========================================\n" +
 
  262         "========================================\n")