45 input_notes: List[str],
46 output_specs: List[str],
47 eth_addr: Optional[str],
48 eth_private_key: Optional[str],
50 for_dispatch_call: bool,
51 dump_parameters: Optional[str],
52 dump_signing_keypair: Optional[str],
53 dry_run: bool) ->
None:
58 if len(input_notes) > JS_INPUTS:
59 raise ClickException(f
"too many inputs (max {JS_INPUTS})")
60 if len(output_specs) > JS_OUTPUTS:
61 raise ClickException(f
"too many outputs (max {JS_OUTPUTS})")
63 vin_pub = EtherValue(vin)
64 vout_pub = EtherValue(vout)
68 client_ctx, prover_client)
71 zeth_client.mixer_instance, zeth_address.addr_sk, client_ctx)
73 inputs: List[Tuple[int, ZethNote]] = [
74 wallet.find_note(note_id).as_input()
for note_id
in input_notes]
75 outputs: List[Tuple[ZethAddressPub, EtherValue]] = [
80 sum([
int(note.value, 16)
for _, note
in inputs]))
81 output_note_sum = sum([value
for _, value
in outputs], EtherValue(0))
82 if vin_pub + input_note_sum != vout_pub + output_note_sum:
83 raise ClickException(
"input and output value mismatch")
89 tx_value = EtherValue(0)
if mixer_desc.token
else vin_pub
93 mix_params, signing_keypair = \
94 zeth_client.create_mix_parameters_and_signing_key(
97 zeth_address.ownership_keypair(),
103 for_dispatch_call=for_dispatch_call)
107 if dump_parameters ==
'-':
108 print(f
"mix_params={mix_params.to_json()}")
110 with open(dump_parameters,
"w")
as mix_params_f:
111 json.dump(mix_params.to_json_dict(), mix_params_f)
114 if dump_signing_keypair:
115 if dump_signing_keypair ==
'-':
116 print(f
"signing_key={signing_keypair.to_json_dict()}")
118 with open(dump_signing_keypair,
"w")
as signing_keypair_f:
119 json.dump(signing_keypair.to_json_dict(), signing_keypair_f)
122 if for_dispatch_call
or dry_run:
126 tx_hash = zeth_client.mix(
127 mix_params=mix_params,
128 sender_eth_address=eth_address,
129 sender_eth_private_key=eth_private_key_data,
134 pp = prover_client.get_configuration().pairing_parameters
135 do_sync(zeth_client.web3, wallet, pp, tx_hash, zeth_note_short_print)