示例#1
0
def _transform_btc_address(
    ethereum: EthereumManager,
    given_address: str,
) -> BTCAddress:
    """Returns a SegWit/P2PKH/P2SH address (if existing) given an ENS domain.

    NB: ENS domains for BTC store the scriptpubkey. Check EIP-2304.
    """
    if not given_address.endswith('.eth'):
        return BTCAddress(given_address)

    resolved_address = ethereum.ens_lookup(
        given_address,
        blockchain=SupportedBlockchain.BITCOIN,
    )
    if resolved_address is None:
        raise ValidationError(
            f'Given ENS address {given_address} could not be resolved for Bitcoin',
            field_name='address',
        ) from None

    try:
        address = scriptpubkey_to_btc_address(bytes.fromhex(resolved_address))
    except EncodingError as e:
        raise ValidationError(
            f'Given ENS address {given_address} does not contain a valid Bitcoin '
            f"scriptpubkey: {resolved_address}. Bitcoin address can't be obtained.",
            field_name='address',
        ) from e

    log.debug(f'Resolved BTC ENS {given_address} to {address}')

    return address
示例#2
0
def _transform_eth_address(ethereum: EthereumManager,
                           given_address: str) -> ChecksumEthAddress:
    try:
        address = to_checksum_address(given_address)
    except ValueError:
        # Validation will only let .eth names come here.
        # So let's see if it resolves to anything
        resolved_address = ethereum.ens_lookup(given_address)
        if resolved_address is None:
            raise ValidationError(
                f'Given ENS address {given_address} could not be resolved',
                field_name='address',
            )
        else:
            address = to_checksum_address(resolved_address)
            log.info(f'Resolved ENS {given_address} to {address}')

    return address
示例#3
0
def _transform_ksm_address(
    ethereum: EthereumManager,
    given_address: str,
) -> KusamaAddress:
    """Returns a KSM address (if exists) given an ENS domain. At this point any
    given address has been already validated either as an ENS name or as a
    valid Kusama address (ss58 format).

    NB: ENS domains for Substrate chains (e.g. KSM, DOT) store the Substrate
    public key. It requires to encode it with a specific ss58 format for
    obtaining the specific chain address.

    Kusama/Polkadot ENS domain accounts:
    https://guide.kusama.network/docs/en/mirror-ens

    ENS domain substrate public key encoding:
    https://github.com/ensdomains/address-encoder/blob/master/src/index.ts
    """
    if not given_address.endswith('.eth'):
        return KusamaAddress(given_address)

    resolved_address = ethereum.ens_lookup(
        given_address,
        blockchain=SupportedBlockchain.KUSAMA,
    )
    if resolved_address is None:
        raise ValidationError(
            f'Given ENS address {given_address} could not be resolved for Kusama',
            field_name='address',
        ) from None

    try:
        address = get_kusama_address_from_public_key(
            SubstratePublicKey(resolved_address))
    except (TypeError, ValueError) as e:
        raise ValidationError(
            f'Given ENS address {given_address} does not contain a valid '
            f"Substrate public key: {resolved_address}. Kusama address can't be obtained.",
            field_name='address',
        ) from e

    log.debug(f'Resolved KSM ENS {given_address} to {address}')

    return address