WrappedElon

WrappedElon converts native ELON (18 decimals) to a lower-precision token (4 decimals) so it can bridge to Solana using Stargate.

Specifications

  • Truncates ELON 18 → 4 decimals
  • Owner (DAO or admin) can pause wrapping/unwrapping
  • Designed for compatibility with chains that do not support full 18 decimal precision
  • Can be adapted for other tokens in the future
  • Deployed as part of the Dogelon Mars Stargate bridging platform

Source: GitHub Repository

Audit Reports

AuditorReport
BoustroView PDF
KekkaiView PDF
PashovView PDF

Key Code Snippet

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

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable2Step.sol";

/**
 * @title WrappedElon
 * @dev Wraps native ELON (18 decimals) into wELON (4 decimals) for cross-chain transfers.
 */
contract WrappedElon is ERC20, Ownable2Step {
    ERC20 private constant ELON = ERC20(0x761D38e5ddf6ccf6Cf7c55759d5210750B5D60F3);
    uint256 private constant MIN_ELON_AMOUNT = 100_000_000_000_000; // 0.0001 ELON

    bool public wrapEnabled = true;
    bool public unwrapEnabled = true;

    event Wrap(address addr, uint256 elonAmount, uint256 wrappedAmount);
    event Unwrap(address addr, uint256 elonAmount, uint256 wrappedAmount);
    event WrapEnabled(bool enabled);
    event UnwrapEnabled(bool enabled);

    constructor() ERC20("Dogelon", "ELON") {}

    function decimals() public view override returns (uint8) {
        return 4;
    }

    /**
     * @notice Wrap ELON into wELON
     */
    function wrap(uint256 elonAmount) external {
        require(wrapEnabled, "Wrapping disabled");
        require(elonAmount >= MIN_ELON_AMOUNT, "Minimum 0.0001 ELON");

        uint256 wrappedAmount = elonAmount / MIN_ELON_AMOUNT;
        uint256 wrappableElon = wrappedAmount * MIN_ELON_AMOUNT;

        ELON.transferFrom(msg.sender, address(this), wrappableElon);
        _mint(msg.sender, wrappedAmount);

        emit Wrap(msg.sender, wrappableElon, wrappedAmount);
    }

    /**
     * @notice Unwrap wELON back to ELON
     */
    function unwrap(uint256 wrappedAmount) external {
        require(unwrapEnabled, "Unwrapping disabled");
        require(wrappedAmount > 0, "Cannot unwrap zero");

        uint256 elonAmount = wrappedAmount * MIN_ELON_AMOUNT;
        _burn(msg.sender, wrappedAmount);
        ELON.transfer(msg.sender, elonAmount);

        emit Unwrap(msg.sender, elonAmount, wrappedAmount);
    }

    /**
     * @notice Admin: Enable/disable wrapping and unwrapping
     */
    function setEnabledState(bool _wrapEnabled, bool _unwrapEnabled) external onlyOwner {
        if (wrapEnabled != _wrapEnabled) {
            wrapEnabled = _wrapEnabled;
            emit WrapEnabled(_wrapEnabled);
        }
        if (unwrapEnabled != _unwrapEnabled) {
            unwrapEnabled = _unwrapEnabled;
            emit UnwrapEnabled(_unwrapEnabled);
        }
    }
}