def _get_channel_state_from_blockchain(self, channel_id): abi = get_contract_def("MultiPartyEscrow") channel_abi = abi_get_element_by_name(abi, "channels") channel = self.call_contract_command("MultiPartyEscrow", "channels", [channel_id]) channel = abi_decode_struct_to_dict(channel_abi, channel) channel["channelId"] = channel_id return channel
def read_default_contract_address(w3, contract_name): chain_id = w3.version.network # this will raise exception if endpoint is invalid contract_def = get_contract_def(contract_name) networks = contract_def["networks"] contract_address = networks.get(chain_id, {}).get("address", None) if not contract_address: raise Exception() contract_address = w3.toChecksumAddress(contract_address) return contract_address
def add_contract_function_options(parser, contract_name): add_contract_identity_arguments(parser) contract_def = get_contract_def(contract_name) parser.set_defaults(contract_def=contract_def) parser.set_defaults(contract_name=contract_name) fns = [] for fn in filter(lambda e: e["type"] == "function", contract_def["abi"]): fns.append({ "name": fn["name"], "named_inputs": [(i["name"], i["type"]) for i in fn["inputs"] if i["name"] != ""], "positional_inputs": [i["type"] for i in fn["inputs"] if i["name"] == ""] }) if len(fns) > 0: subparsers = parser.add_subparsers( title="{} functions".format(contract_name), metavar="FUNCTION") subparsers.required = True for fn in fns: fn_p = subparsers.add_parser(fn["name"], help="{} function".format(fn["name"])) fn_p.set_defaults(fn="call") fn_p.set_defaults(contract_function=fn["name"]) for i in fn["positional_inputs"]: fn_p.add_argument(i, action=AppendPositionalAction, type=type_converter(i), metavar=i.upper()) for i in fn["named_inputs"]: fn_p.add_argument("contract_named_input_{}".format(i[0]), type=type_converter(i[1]), metavar="{}_{}".format( i[0].lstrip("_"), i[1].upper())) fn_p.add_argument("--transact", action="store_const", const="transact", dest="fn", help="Invoke contract function as transaction") add_transaction_arguments(fn_p)
def _get_all_filtered_channels(self, topics_without_signature): """ get all filtered chanels from blockchain logs """ mpe_address = self.get_mpe_address() event_signature = self.ident.w3.sha3( text= "ChannelOpen(uint256,uint256,address,address,address,bytes32,uint256,uint256)" ).hex() topics = [event_signature] + topics_without_signature logs = self.ident.w3.eth.getLogs({ "fromBlock": self.args.from_block, "address": mpe_address, "topics": topics }) abi = get_contract_def("MultiPartyEscrow") event_abi = abi_get_element_by_name(abi, "ChannelOpen") channels_ids = [ get_event_data(event_abi, l)["args"]["channelId"] for l in logs ] return channels_ids
def get_ContractCommand(self, contract_name, contract_address, contract_fn, contract_params, is_silent=True): contract_def = get_contract_def(contract_name) if (is_silent): out_f = None err_f = None else: out_f = self.out_f err_f = self.err_f return ContractCommand( config=self.config, args=self.get_contract_argser( contract_address=contract_address, contract_function=contract_fn, contract_def=contract_def, contract_name=contract_name)(*contract_params), out_f=out_f, err_f=err_f, w3=self.w3, ident=self.ident)