code: def setup_address(self, name, address=default, transact={}):
          
          owner = self.setup_owner(name, transact=transact)
          self._assert_control(owner, name)
          if is_none_or_zero_address(address):
              address = None
          elif address is default:
              address = owner
          elif is_binary_address(address):
              address = to_checksum_address(address)
          elif not is_checksum_address(address):
              raise ValueError("You must supply the address in checksum format")
          if self.address(name) == address:
              return None
          if address is None:
              address = EMPTY_ADDR_HEX
          transact['from'] = owner
          resolver = self._set_resolver(name, transact=transact)
          return resolver.functions.setAddr(raw_name_to_hash(name), address).transact(transact)
docs: Set up the name to point to the supplied address.
          The sender of the transaction must own the name, or
          its parent name.
  
          Example: If the caller owns ``parentname.eth`` with no subdomains
          and calls this method with ``sub.parentname.eth``,
          then ``sub`` will be created as part of this call.
  
          :param str name: ENS name to set up
          :param str address: name will point to this address, in checksum format. If ``None``,
              erase the record. If not specified, name will point to the owner's address.
          :param dict transact: the transaction configuration, like in
              :meth:`~web3.eth.Eth.sendTransaction`
          :raises InvalidName: if ``name`` has invalid syntax
          :raises UnauthorizedError: if ``'from'`` in `transact` does not own `name`