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
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
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