code: def setup_owner(self, name, new_owner=default, transact={}):
          
          (super_owner, unowned, owned) = self._first_owner(name)
          if new_owner is default:
              new_owner = super_owner
          elif not new_owner:
              new_owner = EMPTY_ADDR_HEX
          else:
              new_owner = to_checksum_address(new_owner)
          current_owner = self.owner(name)
          if new_owner == EMPTY_ADDR_HEX and not current_owner:
              return None
          elif current_owner == new_owner:
              return current_owner
          else:
              self._assert_control(super_owner, name, owned)
              self._claim_ownership(new_owner, unowned, owned, super_owner, transact=transact)
              return new_owner
docs: Set the owner of the supplied name to `new_owner`.
  
          For typical scenarios, you'll never need to call this method directly,
          simply call :meth:`setup_name` or :meth:`setup_address`. This method does *not*
          set up the name to point to an address.
  
          If `new_owner` is not supplied, then this will assume you
          want the same owner as the parent domain.
  
          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 new_owner: account that will own `name`. If ``None``, set owner to empty addr.
              If not specified, name will point to the parent domain 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`
          :returns: the new owner's address