Exemple #1
0
    def __init__(self,
                 receiver: str,
                 sender: str,
                 deposit: int,
                 open_block_number
                 ):
        """
        A channel between two parties.

        Args:
            receiver (str): receiver address
            sender (str): sender address
            deposit (int): channel deposit
            open_block_number (int): block the channel was created in
        """
        assert is_address(receiver)
        assert is_address(sender)
        assert deposit >= 0
        assert open_block_number >= 0
        self.receiver = receiver
        self.sender = sender  # sender address
        self.deposit = deposit  # deposit is maximum funds that can be used
        self.open_block_number = open_block_number

        self.balance = 0  # how much of the deposit has been spent
        self.state = ChannelState.UNDEFINED
        self.last_signature = None
        # if set, this is the absolute block_number the channel can be settled
        self.settle_timeout = -1
        self.ctime = time.time()  # channel creation time
        self.mtime = self.ctime
        self.confirmed = False

        self.unconfirmed_topups = {}  # txhash to added deposit
 def __init__(self,
              channel_manager,
              light_client_proxy=None
              ):
     super().__init__()
     assert isinstance(channel_manager, ChannelManager)
     assert is_address(channel_manager.channel_manager_contract.address)
     assert is_address(channel_manager.receiver)
     self.contract_address = channel_manager.channel_manager_contract.address
     self.receiver_address = channel_manager.receiver
     self.channel_manager = channel_manager
     self.light_client_proxy = light_client_proxy
 def contract_address(self, v: str):
     if v and is_address(v):
         self._contract_address = to_checksum_address(v)
     elif v:
         raise ValueError("Invalid contract address")
     else:
         self._contract_address = v
Exemple #4
0
    def get(self, sender_address=None):
        parser = reqparse.RequestParser()
        parser.add_argument('status', help='filter channels by a status', default='open',
                            choices=('closed', 'opened', 'open', 'all'))
        args = parser.parse_args()
        channel_filter = self.get_channel_filter(args['status'])

        # if sender exists, return all open blocks
        if sender_address is not None and is_address(sender_address):
            ret = self.get_all_channels(
                condition=lambda k, v:
                (k[0] == to_checksum_address(sender_address) and
                 channel_filter(v))
            )

        # if sender is not specified, return all open channels
        else:
            channels = self.get_all_channels(condition=lambda k, v:
                                             channel_filter(v))
            joined_channels = defaultdict(list)
            for c in channels:
                joined_channels[c['sender_address']].append(c['open_block'])
            ret = [
                {'sender_address': k,
                 'blocks': v
                 } for k, v in joined_channels.items()
            ]

        return json.dumps(ret), 200
def transform_records(log_records: Iterable[Record], replacements: Dict[str, Any]):
    def replace(value):
        # Use `type(value)()` construction to preserve exact (sub-)type
        if isinstance(value, tuple) and hasattr(value, '_fields'):
            # namedtuples have a different signature, *sigh*
            return type(value)(*[replace(inner) for inner in value])
        if isinstance(value, (list, tuple)):
            return type(value)(replace(inner) for inner in value)
        elif isinstance(value, dict):
            return {
                replace(k): replace(v)
                for k, v in value.items()
            }
        str_value = str(value).lower()
        if isinstance(value, str):
            keys_in_value = [key for key in replacement_keys if key in str_value]
            for key in keys_in_value:
                try:
                    repl_start = str_value.index(key)
                except ValueError:
                    # Value no longer in string due to replacement
                    continue
                value = f"{value[:repl_start]}{replacements[key]}{value[repl_start + len(key):]}"
                str_value = value.lower()
        return replacements.get(str_value, value)

    replacements = {str(k).lower(): v for k, v in replacements.items()}
    for k, v in copy(replacements).items():
        # Special handling for `pex()`ed eth addresses
        if isinstance(k, str) and k.startswith('0x') and is_address(k):
            replacements[pex(to_canonical_address(k))] = v
    replacement_keys = replacements.keys()
    for record in log_records:
        yield replace(record)
def test_encode_address(address_value, value_bit_size, data_byte_size):
    if value_bit_size != 20 * 8:
        with pytest.raises(ValueError):
            AddressEncoder(
                value_bit_size=value_bit_size,
                data_byte_size=data_byte_size,
            )
        return
    elif value_bit_size > data_byte_size * 8:
        with pytest.raises(ValueError):
            AddressEncoder(
                value_bit_size=value_bit_size,
                data_byte_size=data_byte_size,
            )
        return

    encoder = AddressEncoder(
        value_bit_size=value_bit_size,
        data_byte_size=data_byte_size,
    )

    if not is_address(address_value):
        with pytest.raises(EncodingTypeError) as exception_info:
            encoder(address_value)
        assert 'AddressEncoder' in str(exception_info.value)
        return

    expected_value = zpad(to_canonical_address(address_value), data_byte_size)
    encoded_value = encoder(address_value)

    assert encoded_value == expected_value
 def sender_address(self, v: str):
     if v and is_address(v):
         self._sender_address = to_checksum_address(v)
     elif v:
         raise ValueError("Invalid sender address")
     else:
         self._sender_address = v
Exemple #8
0
 def __init__(self,
              channel_manager: ChannelManager,
              light_client_proxy=None,
              paywall=None,
              price: None = None,
              ) -> None:
     super(Expensive, self).__init__()
     assert isinstance(channel_manager, ChannelManager)
     assert price is None or callable(price) or price > 0
     self.contract_address = channel_manager.channel_manager_contract.address
     self.receiver_address = channel_manager.receiver
     assert is_address(self.contract_address)
     assert is_address(self.receiver_address)
     self.channel_manager = channel_manager
     self.light_client_proxy = light_client_proxy
     self._price = price
     self.paywall = paywall
Exemple #9
0
def input_address_formatter(addr):
    iban = Iban(addr)
    if iban.isValid() and iban.isDirect():
        return add_0x_prefix(iban.address())
    elif is_address(addr):
        return to_normalized_address(addr)

    raise ValueError("invalid address")
Exemple #10
0
def is_encodable(_type, value):
    try:
        base, sub, arrlist = _type
    except ValueError:
        base, sub, arrlist = process_type(_type)

    if arrlist:
        if not is_list_like(value):
            return False
        if arrlist[-1] and len(value) != arrlist[-1][0]:
            return False
        sub_type = (base, sub, arrlist[:-1])
        return all(is_encodable(sub_type, sub_value) for sub_value in value)
    elif base == 'bool':
        return is_boolean(value)
    elif base == 'uint':
        if not is_integer(value):
            return False
        exp = int(sub)
        if value < 0 or value >= 2**exp:
            return False
        return True
    elif base == 'int':
        if not is_integer(value):
            return False
        exp = int(sub)
        if value <= -1 * 2**(exp - 1) or value >= 2**(exp - 1):
            return False
        return True
    elif base == 'string':
        if not is_string(value):
            return False
        return True
    elif base == 'bytes':
        if not is_string(value):
            return False

        if not sub:
            return True

        max_length = int(sub)
        if isinstance(value, str):
            decodable = is_hex(value) and len(value) % 2 == 0
            return decodable and len(decode_hex(value)) <= max_length
        elif isinstance(value, bytes):
            return len(value) <= max_length
        else:
            False
    elif base == 'address':
        if is_ens_name(value):
            return True
        elif is_address(value):
            return True
        else:
            return False
    else:
        raise ValueError("Unsupported type")
Exemple #11
0
    def get(self, sender_address, opening_block):
        if sender_address and is_address(sender_address):
            sender_address = to_checksum_address(sender_address)
        try:
            key = (sender_address, opening_block)
            sender_channel = self.channel_manager.channels[key]
        except KeyError:
            return "Sender address not found", 404

        return sender_channel.to_dict(), 200
Exemple #12
0
 def f(target: str):
     assert is_address(target)
     ethereum_tester.send_transaction({
         "from": FAUCET_ADDRESS,
         "to": target,
         "gas": 21000,
         "value": 1 * int(units["ether"])
     })
     custom_token.functions.transfer(_to=target,
                                     _value=10000).call_and_transact(
                                         {"from": FAUCET_ADDRESS})
Exemple #13
0
def test_get_swarm(agency, staking_providers, test_registry):
    application_agent = ContractAgency.get_agent(PREApplicationAgent,
                                                 registry=test_registry)

    swarm = application_agent.swarm()
    swarm_addresses = list(swarm)
    assert len(swarm_addresses) == len(staking_providers) + 1

    # Grab a staker address from the swarm
    provider_addr = swarm_addresses[0]
    assert isinstance(provider_addr, str)
    assert is_address(provider_addr)
Exemple #14
0
 def f(target: str):
     assert is_address(target)
     ethereum_tester.send_transaction({
         'from': FAUCET_ADDRESS,
         'to': target,
         'gas': 21000,
         'value': 1 * denoms.ether,  # pylint: disable=E1101
     })
     custom_token.functions.transfer(
         target,
         10000,
     ).transact({'from': FAUCET_ADDRESS})
def test_create_filter_address_parameter(web3, emitter, Emitter, call_as_instance):
    if call_as_instance:
        event_filter = emitter.events.LogNoArguments.createFilter(fromBlock="latest")
    else:
        event_filter = Emitter.events.LogNoArguments.createFilter(fromBlock="latest")

    if call_as_instance:
        # Assert this is a single string value, and not a list of addresses
        assert is_address(event_filter.filter_params['address'])
    else:
        #  Undeployed contract shouldnt have address...
        assert 'address' not in event_filter.filter_params
Exemple #16
0
def validate_transaction(transaction):
    # TODO: refactor this so that it's not gross.
    if 'from' not in transaction:
        raise ValidationError("Transactions must specify a 'from' address")
    elif not is_address(transaction['from']):
        raise ValidationError(
            "transaction[from]: Unrecognized address format: {0}".format(
                transaction['from'], ))
    elif 'to' in transaction and not is_address(transaction['to']):
        raise ValidationError(
            "transaction[to]: Unrecognized address format: {0}".format(
                transaction['to'], ))

    extra_keys = set(transaction.keys()).difference(TRANSACTION_KEYS)
    if extra_keys:
        raise ValidationError(
            "Transactions may only include the keys {0}.  The following extra "
            "keys were found: {1}".format(
                ",".join(sorted(TRANSACTION_KEYS)),
                ",".join(sorted(extra_keys)),
            ))
Exemple #17
0
def main():
    reader = csv.reader(open("snapshot/01-delphi.csv"))
    balances = {
        to_checksum_address(address): int(balance)
        for address, balance in reader if is_address(address)
    }
    print("recipients:", len(balances))
    print("total supply:", sum(balances.values()) / 1e18)
    distribution = prepare_merkle_tree(balances)
    print("merkle root:", distribution["merkleRoot"])
    with open("snapshot/02-merkle.json", "wt") as f:
        json.dump(distribution, f, indent=2)
 def f(initial_amount: int, decimals: int, token_name: str,
       token_symbol: str) -> Contract:
     token_contract = deploy_token_contract(initial_amount, decimals,
                                            token_name, token_symbol)
     txid = token_network_registry_contract.functions.createERC20TokenNetwork(
         token_contract.address, channel_participant_deposit_limit,
         token_network_deposit_limit).call_and_transact(
             {"from": CONTRACT_DEPLOYER_ADDRESS})
     (tx_receipt, _) = check_successful_tx(web3, txid)
     assert len(tx_receipt["logs"]) == 1
     event_abi = contracts_manager.get_event_abi(
         CONTRACT_TOKEN_NETWORK_REGISTRY, EVENT_TOKEN_NETWORK_CREATED)
     decoded_event = get_event_data(event_abi, tx_receipt["logs"][0])
     assert decoded_event is not None
     assert is_address(decoded_event["args"]["token_address"])
     assert is_address(decoded_event["args"]["token_network_address"])
     token_network_address = decoded_event["args"]["token_network_address"]
     token_network_abi = contracts_manager.get_contract_abi(
         CONTRACT_TOKEN_NETWORK)
     return web3.eth.contract(abi=token_network_abi,
                              address=token_network_address)
Exemple #19
0
 def f(target: str):
     assert is_address(target)
     ethereum_tester.send_transaction({
         'from': faucet_address,
         'to': target,
         'gas': 21000,
         'value': 1 * denoms.ether,
     })
     custom_token.functions.transfer(
         target,
         10000,
     ).transact({'from': faucet_address})
 def check_signatures(self, monitor_request: MonitorRequest,
                      channel: sqlite3.Row):
     """Check if signatures set in the message are correct"""
     balance_proof = monitor_request.balance_proof
     participants = [channel['participant1'], channel['participant2']]
     try:
         return (is_address(monitor_request.reward_proof_signer)
                 and balance_proof.signer in participants
                 and monitor_request.non_closing_signer in participants and
                 balance_proof.signer != monitor_request.non_closing_signer)
     except InvalidSignature:
         return False
def assert_is_address(value: Any, name: str) -> None:
    """Assert that `value` is a valid Ethereum address.

    If `value` isn't a hex string, raise a TypeError.  If it isn't a valid
    Ethereum address, raise a ValueError.
    """
    assert_is_hex_string(value, name)
    if not is_address(value):
        raise ValueError(
            f"Expected variable '{name}' to be a valid Ethereum"
            + " address, but it's not."
        )
Exemple #22
0
def validate_abi_value(abi_type, value):
    """
    Helper function for validating a value against the expected abi_type
    Note: abi_type 'bytes' must either be python3 'bytes' object or ''
    """
    if is_array_type(abi_type) and is_list_like(value):
        # validate length
        specified_length = length_of_array_type(abi_type)
        if specified_length is not None:
            if specified_length < 1:
                raise TypeError(
                    "Invalid abi-type: {abi_type}. Length of fixed sized arrays"
                    "must be greater than 0."
                    .format(abi_type=abi_type)
                )
            if specified_length != len(value):
                raise TypeError(
                    "The following array length does not the length specified"
                    "by the abi-type, {abi_type}: {value}"
                    .format(abi_type=abi_type, value=value)
                )

        # validate sub_types
        sub_type = sub_type_of_array_type(abi_type)
        for v in value:
            validate_abi_value(sub_type, v)
        return
    elif is_bool_type(abi_type) and is_boolean(value):
        return
    elif is_uint_type(abi_type) and is_integer(value) and value >= 0:
        return
    elif is_int_type(abi_type) and is_integer(value):
        return
    elif is_address_type(abi_type) and is_address(value):
        return
    elif is_bytes_type(abi_type):
        if sys.version_info.major >= 3 and is_bytes(value):
            return
        elif is_string(value):
            if is_0x_prefixed(value):
                return
            else:
                raise TypeError(
                    "ABI values of abi-type 'bytes' must be either"
                    "a python3 'bytes' object or an '0x' prefixed string."
                )
    elif is_string_type(abi_type) and is_string(value):
        return

    raise TypeError(
        "The following abi value is not a '{abi_type}'': {value}"
        .format(abi_type=abi_type, value=value)
    )
Exemple #23
0
def standard_token_network_contract(web3, contracts_manager,
                                    wait_for_transaction,
                                    token_network_registry_contract,
                                    standard_token_contract,
                                    contract_deployer_address):
    """Return instance of a deployed TokenNetwork for HumanStandardToken."""
    txid = token_network_registry_contract.functions.createERC20TokenNetwork(
        standard_token_contract.address).transact(
            {'from': contract_deployer_address})
    tx_receipt = wait_for_transaction(txid)
    assert len(tx_receipt['logs']) == 1
    event_abi = contracts_manager.get_event_abi('TokenNetworksRegistry',
                                                'TokenNetworkCreated')
    decoded_event = get_event_data(event_abi, tx_receipt['logs'][0])
    assert decoded_event is not None
    assert is_address(decoded_event['args']['token_address'])
    assert is_address(decoded_event['args']['token_network_address'])
    token_network_address = decoded_event['args']['token_network_address']
    token_network_abi = contracts_manager.get_contract_abi('TokenNetwork')
    return web3.eth.contract(abi=token_network_abi,
                             address=token_network_address)
Exemple #24
0
def test_create_filter_address_parameter(emitter, Emitter, call_as_instance):
    if call_as_instance:
        event_filter = emitter.events.LogNoArguments.createFilter(fromBlock="latest")
    else:
        event_filter = Emitter.events.LogNoArguments.createFilter(fromBlock="latest")

    if call_as_instance:
        # Assert this is a single string value, and not a list of addresses
        assert is_address(event_filter.filter_params['address'])
    else:
        #  Undeployed contract shouldnt have address...
        assert 'address' not in event_filter.filter_params
Exemple #25
0
    def call(self, transaction, block_identifier=None):
        # TODO: move to middleware
        if 'from' not in transaction and is_address(self.defaultAccount):
            transaction = assoc(transaction, 'from', self.defaultAccount)

        # TODO: move to middleware
        if block_identifier is None:
            block_identifier = self.defaultBlock

        return self.web3.manager.request_blocking(
            "eth_call",
            [transaction, block_identifier],
        )
Exemple #26
0
def check_if_address_match(address, addresses):
    if addresses is None:
        return True
    if is_tuple(addresses):
        return any(
            is_same_address(address, item)
            for item
            in addresses
        )
    elif is_address(addresses):
        return is_same_address(addresses, address)
    else:
        raise ValueError("Unrecognized address format: {0}".format(addresses))
Exemple #27
0
    def __init__(self, receiver: str, sender: str, deposit: int,
                 open_block_number):
        """
        A channel between two parties.

        Args:
            receiver (str): receiver address
            sender (str): sender address
            deposit (int): channel deposit
            open_block_number (int): block the channel was created in
        """
        assert is_address(receiver)
        assert is_address(sender)
        assert deposit >= 0
        assert open_block_number >= 0
        self.receiver = receiver
        self.sender = sender  # sender address
        self.deposit = deposit  # deposit is maximum funds that can be used
        self.open_block_number = open_block_number

        self.balance = 0  # how much of the deposit has been spent
        self.state = ChannelState.UNDEFINED
        self.last_signature = None
        # if set, this is the absolute block_number the channel can be settled
        self.settle_timeout = -1
        self.monitor_timeout = -1
        self.ctime = time.time()  # channel creation time
        self.mtime = self.ctime
        self.confirmed = False
        self.rng = random
        self.rng.seed(123456789)
        self.nonce = None
        self.last_nonce = None
        self.next_nonce = self.rng.getrandbits(256)
        self.round_number = 0

        self.unconfirmed_topups = {}  # txhash to added deposit

        self.monitor_receipt = None
Exemple #28
0
    def get_money(self):
        get_testnet_eth(self.clientAddress, self.web3)
        print(self.web3.eth.getBalance(self.clientAddress))

        Query_id, self.Query_interface = self.compiled_sol.popitem()
        Delegator_id, self.Delegator_interface = self.compiled_sol.popitem()

        if self.Delegator_address:
            assert(is_address(self.Delegator_address))
        else:

            # self.Query_address = deploy_Query(self.web3, self.Query_interface, self.TEST_ACCOUNT, addr_lst)
            self.Delegator_address = deploy_Master(self.web3, self.Delegator_interface, self.clientAddress)
Exemple #29
0
    def __init__(self,
                 token_network_address: Address,
                 target_address: Address,
                 value: int,
                 chain_id: int,
                 nonce: int,
                 paths_and_fees: list = None,
                 signature: str = None) -> None:
        super().__init__()
        assert is_address(token_network_address)
        assert is_address(target_address)
        assert 0 <= value <= UINT256_MAX
        assert 0 <= nonce <= UINT256_MAX

        self._type = 'PathsReply'
        self.token_network_address = token_network_address
        self.target_address = target_address
        self.value = value
        self.chain_id = chain_id
        self.nonce = nonce
        self.paths_and_fees = paths_and_fees
        self.signature = signature
Exemple #30
0
    def __init__(
        self,
        balance_proof: BalanceProof,
        non_closing_signature: str = None,
        reward_sender_address: Address = None,   # address
        reward_proof_signature: bytes = None,  # bytes
        reward_amount: int = None,             # uint192
        monitor_address: Address = None
    ) -> None:
        assert non_closing_signature is None or len(decode_hex(non_closing_signature)) == 65
        assert reward_amount is None or (reward_amount >= 0) and (reward_amount <= UINT192_MAX)
        # todo: validate reward proof signature
        assert is_address(reward_sender_address)
        assert is_address(monitor_address)
        assert isinstance(balance_proof, BalanceProof)

        self._balance_proof = balance_proof
        self.non_closing_signature = non_closing_signature
        self.reward_sender_address = to_checksum_address(reward_sender_address)
        self.reward_proof_signature = reward_proof_signature
        self.reward_amount = reward_amount
        self.monitor_address = monitor_address
 def f(initial_amount: int, decimals: int, token_name: str,
       token_symbol: str):
     token_contract = deploy_token_contract(initial_amount, decimals,
                                            token_name, token_symbol)
     txid = token_network_registry_contract.functions.createERC20TokenNetwork(
         token_contract.address, ).transact(
             {'from': contract_deployer_address})
     tx_receipt = wait_for_transaction(txid)
     assert len(tx_receipt['logs']) == 1
     event_abi = contracts_manager.get_event_abi(
         CONTRACT_TOKEN_NETWORK_REGISTRY,
         EVENT_TOKEN_NETWORK_CREATED,
     )
     decoded_event = get_event_data(event_abi, tx_receipt['logs'][0])
     assert decoded_event is not None
     assert is_address(decoded_event['args']['token_address'])
     assert is_address(decoded_event['args']['token_network_address'])
     token_network_address = decoded_event['args']['token_network_address']
     token_network_abi = contracts_manager.get_contract_abi(
         CONTRACT_TOKEN_NETWORK)
     return web3.eth.contract(abi=token_network_abi,
                              address=token_network_address)
Exemple #32
0
    def check_headers(self, headers):
        """Check if headers sent by the client are valid"""
        price = headers.get(header.PRICE, None)
        contract_address = headers.get(header.CONTRACT_ADDRESS, None)
        receiver_address = headers.get(header.RECEIVER_ADDRESS, None)
        sender_address = headers.get(header.SENDER_ADDRESS, None)
        payment = headers.get(header.PAYMENT, None)
        balance_signature = headers.get(header.BALANCE_SIGNATURE, None)
        open_block = headers.get(header.OPEN_BLOCK, None)
        balance = headers.get(header.BALANCE, None)
        if price:
            price = int(price)
        if open_block:
            open_block = int(open_block)
        if balance:
            balance = int(balance)
        if price and price < 0:
            raise ValueError("Price must be >= 0")
        if contract_address and not is_address(contract_address):
            raise ValueError("Invalid contract address")
        if receiver_address and not is_address(receiver_address):
            raise ValueError("Invalid receiver address")
        if sender_address and not is_address(sender_address):
            raise ValueError("Invalid sender address")
        if payment and not isinstance(payment, int):
            raise ValueError("Payment must be an integer")
        if open_block and open_block < 0:
            raise ValueError("Open block must be >= 0")
        if balance and balance < 0:
            raise ValueError("Balance must be >= 0")

        self.price = price
        self.contract_address = contract_address
        self.receiver_address = receiver_address
        self.payment = payment
        self.balance_signature = balance_signature
        self.sender_address = sender_address
        self.open_block_number = open_block
        self.balance = balance
Exemple #33
0
        def register():
            """Handle new recipient registration via POST request."""

            new_address = (request.form.get('address')
                           or request.get_json().get('address'))

            if not new_address:
                return Response(response="no address was supplied", status=411)

            if not eth_utils.is_address(new_address):
                return Response(
                    response=
                    "an invalid ethereum address was supplied.  please ensure the address is a proper checksum.",
                    status=400)
            else:
                new_address = eth_utils.to_checksum_address(new_address)

            if new_address in self.reserved_addresses:
                return Response(
                    response=
                    "sorry, that address is reserved and cannot receive funds.",
                    status=403)

            try:
                with ThreadedSession(self.db_engine) as session:

                    existing = Recipient.query.filter_by(
                        address=new_address).all()
                    if len(existing) > self.MAX_INDIVIDUAL_REGISTRATIONS:
                        # Address already exists; Abort
                        self.log.debug(
                            f"{new_address} is already enrolled {self.MAX_INDIVIDUAL_REGISTRATIONS} times."
                        )
                        return Response(
                            response=
                            f"{new_address} requested too many times  -  Please use another address.",
                            status=409)

                    # Create the record
                    recipient = Recipient(address=new_address,
                                          joined=datetime.now())
                    session.add(recipient)
                    session.commit()

            except Exception as e:
                # Pass along exceptions to the logger
                self.log.critical(str(e))
                raise

            else:
                return Response(status=200)  # TODO
    def __init__(self,
                 iden,
                 provider,
                 clientAddress=None,
                 delegatorAddress=None):

        self.web3 = provider
        self.api = ipfsapi.connect('127.0.0.1', 5001)

        self.PASSPHRASE = 'panda'
        self.TEST_ACCOUNT = '0xb4734dCc08241B46C0D7d22D163d065e8581503e'
        self.TEST_KEY = '146396092a127e4cf6ff3872be35d49228c7dc297cf34da5a0808f29cf307da1'

        contract_source_path_A = "blockchain/Delegator.sol"
        contract_source_path_B = "blockchain/Query.sol"
        contract_source_path_C = "blockchain/DAgoraToken.sol"
        self.compiled_sol = compile_files([
            contract_source_path_A, contract_source_path_B,
            contract_source_path_C
        ])

        self.iden = iden

        if clientAddress:
            assert (is_address(clientAddress))
            self.clientAddress = clientAddress
        else:
            #TODO: Initialize client 'container' address if it wasn't assigned one
            self.clientAddress = self.web3.personal.newAccount(self.PASSPHRASE)
            assert (is_address(self.clientAddress))
        self.web3.personal.unlockAccount(self.clientAddress, self.PASSPHRASE)

        print("Client Address:", self.clientAddress)

        self.Delegator_address = delegatorAddress
        self.DAgoraToken_address = self.web3.toChecksumAddress(
            '0x1698215a2bea4935ba9e0f5b48347e83450a6774')
Exemple #35
0
def main(db_file, token_network_address, partner_address, names_translator):
    translator: Optional[Translator]

    if names_translator:
        translator = Translator(json.load(names_translator))
        lookup = {v: k for k, v in translator.items()}
        token_network_address = lookup.get(token_network_address,
                                           token_network_address)
        partner_address = lookup.get(partner_address, partner_address)
    else:
        translator = None

    assert is_address(
        token_network_address), "token_network_address must be provided"
    assert is_address(partner_address), "partner_address must be provided"

    with closing(SerializedSQLiteStorage(db_file,
                                         JSONSerializer())) as storage:
        replay_wal(
            storage=storage,
            token_network_address=to_canonical_address(token_network_address),
            partner_address=to_canonical_address(partner_address),
            translator=translator,
        )
Exemple #36
0
    def _validate_args(args):
        required_args = ['from', 'to', 'value', 'max_paths']
        if not all(args[arg] is not None for arg in required_args):
            return {
                'errors': 'Required parameters: {}'.format(required_args)
            }, 400

        address_error = 'Invalid {} address: {}'
        if not is_address(args['from']):
            return {
                'errors': address_error.format('initiator', args['from'])
            }, 400
        if not is_address(args['to']):
            return {'errors': address_error.format('target', args['to'])}, 400

        address_error = '{} address not checksummed: {}'
        if not is_checksum_address(args['from']):
            return {
                'errors': address_error.format('Initiator', args['from'])
            }, 400
        if not is_checksum_address(args['to']):
            return {'errors': address_error.format('Target', args['to'])}, 400

        if args.value < 0:
            return {
                'errors':
                'Payment value must be non-negative: {}'.format(args.value)
            }, 400

        if args.max_paths <= 0:
            return {
                'errors':
                'Number of paths must be positive: {}'.format(args.max_paths)
            }, 400

        return None
Exemple #37
0
def get_address_type(address: str) -> str:
    """
    Function checks whether the input address is a Bitcoin (in mainnet) or an
    Ethereum address.
    :param address:
    :return: btc, eth or ""
    """
    try:
        if eth_utils.is_address(address):
            return "eth"
        if is_valid_bech32_address(address) or cryptoaddress.BitcoinAddress(
                address):
            return "btc"
    except ValueError:
        return ""
Exemple #38
0
    def withdraw(
            self,
            amount: int,
            destination: str,
            currency: str) -> str:
        if not self._config.WITHDRAWALS_ENABLED:
            raise Exception("Withdrawals are disabled")

        if not is_address(destination):
            raise ValueError("{} is not valid ETH address".format(destination))

        if currency == 'ETH':
            if amount > self.get_available_eth():
                raise exceptions.NotEnoughFunds(
                    amount,
                    self.get_available_eth(),
                    currency,
                )
            log.info(
                "Withdrawing %f ETH to %s",
                amount / denoms.ether,
                destination,
            )
            return self._sci.transfer_eth(destination, amount)

        if currency == 'GNT':
            if amount > self.get_available_gnt():
                raise exceptions.NotEnoughFunds(
                    amount,
                    self.get_available_gnt(),
                    currency,
                )
            log.info(
                "Withdrawing %f GNT to %s",
                amount / denoms.ether,
                destination,
            )
            tx_hash = self._sci.convert_gntb_to_gnt(destination, amount)

            def on_receipt(receipt) -> None:
                self._gntb_withdrawn -= amount
                if not receipt.status:
                    log.error("Failed GNTB withdrawal: %r", receipt)
            self._sci.on_transaction_confirmed(tx_hash, on_receipt)
            self._gntb_withdrawn += amount
            return tx_hash

        raise ValueError('Unknown currency {}'.format(currency))
Exemple #39
0
def _rpc_request_to_filter_params(raw_params: RawFilterParams) -> FilterParams:
    address: Union[None, Address, Tuple[Address, ...]]

    if "address" not in raw_params:
        address = None
    elif raw_params["address"] is None:
        address = None
    elif is_address(raw_params["address"]):
        address = to_canonical_address(raw_params["address"])  # type: ignore
    elif isinstance(raw_params["address"], list):
        address = tuple(
            to_canonical_address(sub_address)
            for sub_address in raw_params["address"])
    else:
        raise TypeError(f"Unsupported address: {raw_params['address']!r}")

    topics: FilterTopics

    if "topics" not in raw_params:
        topics = ()
    elif raw_params["topics"] is None:
        topics = ()
    elif isinstance(raw_params["topics"], Sequence):
        topics = _normalize_topics(raw_params["topics"])  # type: ignore
    else:
        raise TypeError(f"Unsupported topics: {raw_params['topics']!r}")

    from_block: Optional[BlockNumber]
    if "fromBlock" not in raw_params:
        from_block = None
    elif raw_params["fromBlock"] is None:
        from_block = None
    elif isinstance(raw_params["fromBlock"], str):
        from_block = BlockNumber(to_int(hexstr=raw_params["fromBlock"]))
    else:
        raise TypeError(f"Unsupported fromBlock: {raw_params['fromBlock']!r}")

    to_block: Optional[BlockNumber]
    if "toBlock" not in raw_params:
        to_block = None
    elif raw_params["toBlock"] is None:
        to_block = None
    elif isinstance(raw_params["toBlock"], str):
        to_block = BlockNumber(to_int(hexstr=raw_params["toBlock"]))
    else:
        raise TypeError(f"Unsupported toBlock: {raw_params['toBlock']!r}")

    return FilterParams(from_block, to_block, address, topics)
Exemple #40
0
def is_encodable(_type, value):
    try:
        base, sub, arrlist = _type
    except ValueError:
        base, sub, arrlist = process_type(_type)

    if arrlist:
        if not is_list_like(value):
            return False
        if arrlist[-1] and len(value) != arrlist[-1][0]:
            return False
        sub_type = (base, sub, arrlist[:-1])
        return all(is_encodable(sub_type, sub_value) for sub_value in value)
    elif base == 'bool':
        return is_boolean(value)
    elif base == 'uint':
        if not is_integer(value):
            return False
        exp = int(sub)
        if value < 0 or value >= 2**exp:
            return False
        return True
    elif base == 'int':
        if not is_integer(value):
            return False
        exp = int(sub)
        if value <= -1 * 2**(exp - 1) or value >= 2**(exp - 1):
            return False
        return True
    elif base == 'string':
        if not is_string(value):
            return False
        return True
    elif base == 'bytes':
        if not is_string(value):
            return False

        if not sub:
            return True

        max_length = int(sub)
        return len(value) <= max_length
    elif base == 'address':
        if not is_address(value):
            return False
        return True
    else:
        raise ValueError("Unsupported type")
Exemple #41
0
 def delete(self, sender_address):
     parser = reqparse.RequestParser()
     parser.add_argument('open_block', type=int, help='block the channel was opened')
     parser.add_argument('signature', help='last balance proof signature')
     args = parser.parse_args()
     if args.signature is None:
         return "Bad signature format", 400
     if args.block is None:
         return "No opening block specified", 400
     if sender_address and is_address(sender_address):
         sender_address = to_checksum_address(sender_address)
     channel = self.channel_manager.channels[sender_address, args.block]
     if channel.last_signature != args.signature:
         return "Invalid or outdated balance signature", 400
     ret = sign_close(self.channel_manager.private_key, args.signature)
     return ret, 200
Exemple #42
0
def add_header_constant_call(vmc_handler, collation_header):
    args = (getattr(collation_header, field[0])
            for field in collation_header.fields)
    # transform address from canonical to checksum_address, to comply with web3.py
    args_with_checksum_address = (to_checksum_address(item)
                                  if is_address(item) else item
                                  for item in args)
    # Here we use *args_with_checksum_address as the argument, to ensure the order of arguments
    # is the same as the one of parameters of `VMC.add_header`
    result = vmc_handler.call(
        vmc_handler.mk_contract_tx_detail(
            sender_address=vmc_handler.get_default_sender_address(),
            gas=vmc_handler.config['DEFAULT_GAS'],
            gas_price=1,
        )).add_header(*args_with_checksum_address)
    return result
Exemple #43
0
    def test_add_account_no_password(self, eth_tester):
        account = eth_tester.add_account(PK_A)
        assert is_address(account)
        assert any((is_same_address(account, value)
                    for value in eth_tester.get_accounts()))

        # Fund it
        eth_tester.send_transaction({
            'from': eth_tester.get_accounts()[0],
            'to': account,
            'value': 1 * denoms.ether,
            'gas': 21000,
            'gas_price': 1,
        })

        self._send_and_check_transaction(eth_tester, account)
Exemple #44
0
    def delete(self, sender_address, opening_block):
        parser = reqparse.RequestParser()
        parser.add_argument('balance', type=int, help='last balance proof balance')
        args = parser.parse_args()
        if args.balance is None:
            return "Bad balance format", 400
        if sender_address and is_address(sender_address):
            sender_address = to_checksum_address(sender_address)

        try:
            close_signature = self.channel_manager.sign_close(
                sender_address,
                opening_block,
                args.balance)
        except (NoOpenChannel, InvalidBalanceProof) as e:
            return str(e), 400
        except KeyError:
            return "Channel not found", 404
        ret = {'close_signature': encode_hex(close_signature)}

        return ret, 200
Exemple #45
0
    def __init__(self,
                 *args,
                 **kwargs):
        """Create a new smart contract proxy object.

        :param address: Contract address as 0x hex string
        """
        code = kwargs.pop('code', empty)
        code_runtime = kwargs.pop('code_runtime', empty)
        source = kwargs.pop('source', empty)
        abi = kwargs.pop('abi', empty)
        address = kwargs.pop('address', empty)

        if self.web3 is None:
            raise AttributeError(
                'The `Contract` class has not been initialized.  Please use the '
                '`web3.contract` interface to create your contract class.'
            )

        arg_0, arg_1, arg_2, arg_3, arg_4 = tuple(itertools.chain(
            args,
            itertools.repeat(empty, 5),
        ))[:5]

        if is_list_like(arg_0):
            if abi:
                raise TypeError("The 'abi' argument was found twice")
            abi = arg_0
        elif is_address(arg_0):
            if address:
                raise TypeError("The 'address' argument was found twice")
            address = arg_0

        if is_address(arg_1):
            if address:
                raise TypeError("The 'address' argument was found twice")
            address = arg_1

        if arg_2 is not empty:
            if code:
                raise TypeError("The 'code' argument was found twice")
            code = arg_2

        if arg_3 is not empty:
            if code_runtime:
                raise TypeError("The 'code_runtime' argument was found twice")
            code_runtime = arg_3

        if arg_4 is not empty:
            if source:
                raise TypeError("The 'source' argument was found twice")
            source = arg_4

        if any((abi, code, code_runtime, source)):
            warnings.warn(DeprecationWarning(
                "The arguments abi, code, code_runtime, and source have been "
                "deprecated and will be removed from the Contract class "
                "constructor in future releases.  Update your code to use the "
                "Contract.factory method."
            ))

        if abi is not empty:
            self.abi = abi
        if code is not empty:
            self.bytecode = code
        if code_runtime is not empty:
            self.bytecode_runtime = code_runtime
        if source is not empty:
            self._source = source

        if address is not empty:
            self.address = address
        else:
            warnings.warn(DeprecationWarning(
                "The address argument is now required for contract class "
                "instantiation.  Please update your code to reflect this change"
            ))
Exemple #46
0
 def delete(self, sender_address, opening_block):
     if sender_address and is_address(sender_address):
         sender_address = to_checksum_address(sender_address)
     self.channel_manager.force_close_channel(sender_address, opening_block)
     return "force closed (%s, %d)" % (sender_address, opening_block), 200
 def validate_value(cls, value):
     if not is_address(value):
         cls.invalidate_value(value)
Exemple #48
0
def main(**kwargs):
    rpc_provider = kwargs['rpc_provider']
    json_file = kwargs['json']
    owner = kwargs['owner']
    supply = kwargs['supply']
    token_name = kwargs['token_name']
    token_decimals = kwargs['token_decimals']
    token_symbol = kwargs['token_symbol']
    token_address = kwargs['token_address']
    supply *= 10**(token_decimals)
    txn_wait = kwargs['wait']
    gas_price = kwargs['gas_price']

    print('''Make sure chain is running, you can connect to it and it is synced,
          or you'll get timeout''')

    web3 = Web3(HTTPProvider(rpc_provider, request_kwargs={'timeout': 60}))
    print('Web3 provider is', web3.providers[0])

    owner = owner or web3.eth.accounts[0]
    assert owner and is_address(owner), 'Invalid owner provided.'
    owner = to_checksum_address(owner)
    print('Owner is', owner)
    assert web3.eth.getBalance(owner) > 0, 'Account with insuficient funds.'

    transaction = {'from': owner}
    if gas_price == 0:
        transaction['gasPrice'] = gas_price

    with open(json_file) as json_data:
        contracts_compiled_data = json.load(json_data)

        if not token_address:
            token_address = deploy_contract(
                web3,
                contracts_compiled_data,
                'CustomToken',
                transaction,
                txn_wait,
                [supply, token_decimals, token_name, token_symbol]
            )

        assert token_address and is_address(token_address)
        token_address = to_checksum_address(token_address)

        secret_registry_address = deploy_contract(
            web3,
            contracts_compiled_data,
            'SecretRegistry',
            transaction,
            txn_wait
        )

        token_network_registry_address = deploy_contract(
            web3,
            contracts_compiled_data,
            'TokenNetworksRegistry',
            transaction,
            txn_wait,
            [secret_registry_address, int(web3.version.network)]
        )

        token_network_registry = instantiate_contract(
            web3,
            contracts_compiled_data,
            'TokenNetworksRegistry',
            token_network_registry_address
        )

        txhash = token_network_registry.transact(transaction).createERC20TokenNetwork(
            token_address
        )
        receipt = check_succesful_tx(web3, txhash, txn_wait)

        print('TokenNetwork address: {0}. Gas used: {1}'.format(
            token_network_registry.call().token_to_token_networks(token_address),
            receipt['gasUsed'])
        )
def test_eth_accounts(web3):
    accounts = web3.eth.accounts
    assert len(accounts) >= 1
    assert all(is_address(addr) for addr in accounts)