SimpleENSBid

Description:

Smart contract deployed on Ethereum.

Blockchain: Ethereum

Source Code: View Code On The Blockchain

Solidity Source Code:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

interface IERC20 {
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
}

interface IENS {
    function owner(bytes32 node) external view returns (address);
    function setOwner(bytes32 node, address owner) external;
}

interface IBaseRegistrar {
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
    function ownerOf(uint256 tokenId) external view returns (address);
}

interface INameWrapper {
    function ownerOf(uint256 tokenId) external view returns (address);
    function safeTransferFrom(address from, address to, uint256 tokenId, uint256 amount, bytes calldata data) external;
}

contract SimpleENSBid {
    address public constant ENS = 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e;
    address public constant NAME_WRAPPER = 0xD4416b13d2b3a9aBae7AcD5D6C2BbDBE25686401;
    address public constant BASE_REGISTRAR = 0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85;
    
    string public ensName;
    bytes32 public ensNode;        // For wrapped ENS (full namehash)
    bytes32 public ensTokenId;     // For unwrapped ENS (label hash only)
    address public buyer;
    address public token;
    uint256 public amount;
    bool public executed;
    
    event OfferCreated(string indexed ensName, address indexed buyer, address indexed token, uint256 amount);
    event OfferAccepted(address indexed seller, address indexed buyer, string ensName, uint256 amount);
    
    constructor(
        string memory _ensName,
        bytes32 _ensNode,
        bytes32 _ensTokenId,
        address _buyer,
        address _token,
        uint256 _amount
    ) {
        ensName = _ensName;
        ensNode = _ensNode;        // Full namehash for wrapped ENS
        ensTokenId = _ensTokenId;  // Label hash for unwrapped ENS
        buyer = _buyer;
        token = _token;
        amount = _amount;
        
        emit OfferCreated(_ensName, _buyer, _token, _amount);
    }
    
    function accept() external {
        require(!executed, "Already executed");
        require(isENSOwner(msg.sender), "Not ENS owner");
        
        uint256 allowance = IERC20(token).allowance(buyer, address(this));
        require(allowance >= amount, "Insufficient allowance");
        
        require(IERC20(token).transferFrom(buyer, msg.sender, amount), "Token transfer failed");
        
        address registryOwner = IENS(ENS).owner(ensNode);
        if (registryOwner == NAME_WRAPPER) {
            // Wrapped ENS - transfer as ERC1155 using full namehash
            INameWrapper(NAME_WRAPPER).safeTransferFrom(msg.sender, buyer, uint256(ensNode), 1, "");
        } else {
            // Unwrapped ENS - transfer as ERC721 using label hash through BaseRegistrar
            IBaseRegistrar(BASE_REGISTRAR).safeTransferFrom(msg.sender, buyer, uint256(ensTokenId), "");
        }
        
        executed = true;
        emit OfferAccepted(msg.sender, buyer, ensName, amount);
    }
    
    function isENSOwner(address user) public view returns (bool) {
        address registryOwner = IENS(ENS).owner(ensNode);
        
        if (registryOwner == NAME_WRAPPER) {
            // Check wrapped ownership using full namehash
            try INameWrapper(NAME_WRAPPER).ownerOf(uint256(ensNode)) returns (address wrappedOwner) {
                return wrappedOwner == user;
            } catch {
                return false;
            }
        } else {
            // Check unwrapped ownership using label hash through BaseRegistrar
            try IBaseRegistrar(BASE_REGISTRAR).ownerOf(uint256(ensTokenId)) returns (address registrarOwner) {
                return registrarOwner == user;
            } catch {
                return false;
            }
        }
    }
    
    function getStatus() external view returns (string memory) {
        if (executed) return "EXECUTED";
        return "ACTIVE";
    }
}

Tags:
addr:0xb920684bcca02e27e98376378529ecc56b5d7f38|verified:true|block:23435582|tx:0x5038bbb402dfd315fec4cd0a71ca6e4f1f8968d2d7690818f3455dde9f0d9e79|first_check:1758788013

Submitted on: 2025-09-25 10:13:33

Comments

Log in to comment.

No comments yet.