S Price: $0.86275 (-0.34%)

Contract

0x62C517854f73515bCa2179eF147Ab45EF53b48bC

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Register Bridge ...78510912025-02-14 13:10:596 days ago1739538659IN
0x62C51785...EF53b48bC
0 S0.0026754755
Set Authorizatio...78493992025-02-14 12:54:156 days ago1739537655IN
0x62C51785...EF53b48bC
0 S0.0026589755
Set Authorizatio...78493542025-02-14 12:53:496 days ago1739537629IN
0x62C51785...EF53b48bC
0 S0.0026589755
Set Bridge Depos...78489962025-02-14 12:50:136 days ago1739537413IN
0x62C51785...EF53b48bC
0 S0.0025500255
Set EML Reward A...78489052025-02-14 12:49:246 days ago1739537364IN
0x62C51785...EF53b48bC
0 S0.0025390255

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ChiefValidator

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 12 : chiefValidator.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./sources/OZ/Ownable.sol";
import "./sources/OZ/ReentrancyGuard.sol";
import "./sources/OZ/IERC20.sol";
import "./sources/OZ/Address.sol";
import "./sources/IWETH.sol";
import "./sources/IMintableERC20.sol";
import "./sources/IBridgedToken.sol";
import "./validatorFactory.sol";
import "./validator.sol";


interface IBurnableERC20 {
    function burn(uint256 amount) external;
}
contract ChiefValidator is Ownable, ReentrancyGuard {
    address public EMLTokenAddress;
    ValidatorFactory public validatorFactory;
    uint256 public emlRewardAmount;
    address public bridgeDeposit;
    address public wethAddress;
    address public devAddress;
    IWETH public weth;
    
    // Retreive Bridge Tokens
    mapping(address => bool) public bridgeTokens;
    // Store Proofs
    mapping(bytes32 => bool) public proofs; // bool => true (legit) or false (not submitted or fraud)
    // Mapping of authorized Contracts
    mapping(address => bool) public authorizedContracts;

    // Events
    event TokenDeployed(address indexed initialOwner, address indexed tokenAddress, string name, string symbol);
    event ProofVerified(bytes32 indexed proofHash, bool valid);
    event EMLMinted(address indexed validator, uint256 amount);
    event BridgeTokenRegistered(address indexed tokenAddress);
    event BridgedETH(address to, uint256 amount);
    event BridgeFee(address to, uint256 amount);
    event TokenBridgedIn(address indexed tokenAddress, address to, uint256 amount);
    event BridgedTokenTransfered(address indexed tokenAddress, address to, uint256 amount);
    event DeployerAuthorized(address indexed contractAddress, bool isAuthorized);

    // Modifier
    modifier onlyAuthorized() {
        require(authorizedContracts[msg.sender], "Caller is not authorized");
        _;
    }

    constructor(
        address _EMLTokenAddress,
        address _wethAddress,
        address _devAddress,
        address _initialOwner,
        address _validatorFactory
    ) Ownable(_initialOwner) 
    {
        EMLTokenAddress = _EMLTokenAddress;
        validatorFactory = ValidatorFactory(_validatorFactory);
        wethAddress = _wethAddress;
        devAddress = _devAddress;
        transferOwnership(_initialOwner);
    }

    // Autorize contracts for validator creation
    function setAuthorization(address _contract, bool _isAuthorized) external onlyOwner {
        authorizedContracts[_contract] = _isAuthorized;
        emit DeployerAuthorized(_contract, _isAuthorized);
    }

    // Register Bridge Tokens
    function registerBridgeTokens(address[] calldata tokens) external onlyAuthorized {
        for (uint256 i = 0; i < tokens.length; i++) {
            bridgeTokens[tokens[i]] = true;
            emit BridgeTokenRegistered(tokens[i]);
        }
    }

    // Update Bridge Tokens
    function updateBridgeTokens(address tokenAddress, bool isRegistered) external onlyOwner {
        bridgeTokens[tokenAddress] = isRegistered;
    }

    function isBridgeTokenRegistered(address token) external view returns (bool) {
        return bridgeTokens[token];
    }
    
    // Verify Proof & Mint EML Rewards to validators
    function verifyProof(string[] calldata proofData, bytes32 proofHash) external nonReentrant onlyOwner {
        require(proofData.length == 6, "Invalid proof data length");
        require(!proofs[proofHash], "Proof already submitted");

        address[] memory validators = validatorFactory.getDeployedValidators();
        uint256 activeValidatorCount = 0;
        address[] memory activeValidators = new address[](validators.length);

        for (uint256 i = 0; i < validators.length; i++) {
            if (Validator(validators[i]).isActive()) {
                activeValidators[activeValidatorCount] = validators[i];
                activeValidatorCount++;
            }
        }

        require(activeValidatorCount > 0, "No active validators found");

        bool proofValid = false;
        for (uint256 i = 0; i < activeValidatorCount; i++) {
            bytes32 keccakResult = Validator(activeValidators[i]).calculateKeccak256(proofData);
            if (keccakResult == proofHash) {
                proofValid = true;
                break;
            }
        }

        if (proofValid) {
            mintEMLRewards();
            handleBridgedToken(proofData);
            proofs[proofHash] = true;
            emit ProofVerified(proofHash, true);
        } else {
            emit ProofVerified(proofHash, false);
        }
    }

    // Mint EML Rewards
    function mintEMLRewards() internal {
        address[] memory validators = validatorFactory.getDeployedValidators();
        uint256 totalActiveValidators = 0;

        // Number of active Validators
        for (uint256 i = 0; i < validators.length; i++) {
            if (Validator(validators[i]).isActive()) {
                totalActiveValidators++;
            }
        }

        require(totalActiveValidators > 0, "No active validators found");

        uint256 rewardPerValidator = emlRewardAmount / totalActiveValidators;

        // EML Mint to Active Validators only & equally 
        for (uint256 i = 0; i < validators.length; i++) {
            if (Validator(validators[i]).isActive()) {
                address validatorOwner = Validator(validators[i]).getValidatorOwner();
                // Call EML Mint function
                IMintableERC20(EMLTokenAddress).mint(validatorOwner, rewardPerValidator);
                emit EMLMinted(validatorOwner, rewardPerValidator);
            }
        }
    }

    // Handle Bridge Operations
    function handleBridgedToken(string[] calldata proofData) internal {
        address tokenAddress = parseAddress(proofData[0]);
        uint256 amount = parseUint(proofData[1]);
        address destination = parseAddress(proofData[2]);
        uint256 timestamp = parseUint(proofData[3]);
        string memory emoliumSaltData = proofData[4];
        uint256 providedFee = parseUint(proofData[5]);

        require(timestamp >= 0, "Invalid timestamp");
        require(bytes(emoliumSaltData).length > 0, "Invalid salt data");
        require(providedFee >= 0, "Invalid fee");

        // Fee calculation and validation
        uint256 calculatedFee = (amount * providedFee) / 10000;
        uint256 netAmount = amount - calculatedFee;
        
        // Handle ETH & WETH
        if (tokenAddress == wethAddress) {
            IWETH(wethAddress).withdraw(amount);
            payable(devAddress).transfer(calculatedFee);
            payable(destination).transfer(netAmount);
            emit BridgedETH(destination, netAmount);
            if (calculatedFee > 0) emit BridgeFee(devAddress, calculatedFee);
        }
        // Handle Emolium Bridge Registered Token
        else if (bridgeTokens[tokenAddress]) {
            IBridgedToken(tokenAddress).mint(destination, netAmount);
            IBridgedToken(tokenAddress).mint(devAddress, calculatedFee);
            emit TokenBridgedIn(tokenAddress, destination, netAmount);
            if (calculatedFee > 0) emit BridgeFee(devAddress, calculatedFee);
        }
        // Handle all other ERC20 tokens
        else {
            IERC20(tokenAddress).transfer(destination, netAmount);
            IERC20(tokenAddress).transfer(devAddress, calculatedFee);
            emit BridgedTokenTransfered(tokenAddress, destination, netAmount);
            if (calculatedFee > 0) emit BridgeFee(devAddress, calculatedFee);
        }
    }

    // Convert string to uint
    function parseUint(string memory _value) internal pure returns (uint256) {
        bytes memory b = bytes(_value);
        uint256 number = 0;
        for (uint256 i = 0; i < b.length; i++) {
            number = number * 10 + (uint256(uint8(b[i])) - 48);
        }
        return number;
    }

    // Convert string to address
    function parseAddress(string memory _value) internal pure returns (address) {
        bytes memory b = bytes(_value);
        require(b.length == 42, "Invalid address length"); // Inclut '0x' au début

        uint160 number;
        for (uint256 i = 2; i < b.length; i++) { // Skip '0x'
            number *= 16;
            uint8 c = uint8(b[i]);
            if (c >= 48 && c <= 57) {
                number += c - 48;
            } else if (c >= 97 && c <= 102) {
                number += c - 87;
            } else if (c >= 65 && c <= 70) {
                number += c - 55;
            }
        }
        return address(number);
    }

    // Setters for addresses
    function setBridgeDeposit(address _bridgeDeposit) external onlyOwner {
        bridgeDeposit = _bridgeDeposit;
    }

    function setWethAddress(address _wethAddress) external onlyOwner {
        wethAddress = _wethAddress;
    }

    // Set EML Reward Amount
    function setEMLRewardAmount(uint256 _amount) external onlyOwner {
        emlRewardAmount = _amount;
    }

    // Get Proof Status
    function getProofStatus(bytes32 proofHash) external view returns (bool) {
        return proofs[proofHash];
    }

    // Emergency & Rescue Functions
    function rescueETH() external onlyOwner {
        require(address(this).balance > 0, "Insufficient ETH balance");
        payable(devAddress).transfer(address(this).balance);
    }

    function rescueERC20(address token, uint256 amount) external onlyOwner {
        IERC20 erc20 = IERC20(token);
        require(erc20.balanceOf(address(this)) >= amount, "Insufficient token balance");
        erc20.transfer(devAddress, amount);
    }

    function rescueWETH(uint256 amount) external onlyOwner {
        require(weth.balanceOf(address(this)) >= amount, "Insufficient WETH balance");
        weth.transfer(devAddress, amount);
    }

    receive() external payable {}

}

File 2 of 12 : validator.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./sources/OZ/IERC20.sol";
import "./sources/OZ/Ownable.sol";

contract Validator is Ownable {
    address public EMLTokenAddress;
    address public validatorFactory;
    uint256 public validatorPrice;
    address public admin;
    bool public active = false;

    // Validator Current Owner
    mapping(address => address) public validatorOwners;

    // Mapping to associate the contract address with the validator address
    mapping(address => address) public validatorContracts;
    // Events
    event EMLBalanceChecked(uint256 balance);
    event ValidatorCount(uint256 activeCount, uint256 maxCount);
    event ValidatorClosed(address indexed owner, uint256 amount);
    event ValidatorOpened();
    event ValidatorClosedEvent();

    constructor(address _EMLTokenAddress, address _initialOwner, address _validatorFactory) Ownable(_initialOwner) {
        EMLTokenAddress = _EMLTokenAddress;
        admin = _initialOwner;
        validatorFactory = _validatorFactory; // Set the validatorFactory by default
        validatorContracts[address(this)] = address(this);
        validatorOwners[address(this)] = _initialOwner;
    }
    
    // Keccak hash function for an array of strings
    function calculateKeccak256(string[] calldata inputs) external view returns (bytes32) {
        require(active, "Validator is not active"); // Check if the validator is active

        // Concatenate all strings in the array
        bytes memory concatenatedString;
        for (uint256 i = 0; i < inputs.length; i++) {
            concatenatedString = abi.encodePacked(concatenatedString, inputs[i]);
        }

        // Calculate the Keccak256 hash of the concatenated string
        bytes32 hash = keccak256(concatenatedString);
        return hash;
    }

    // Set a new validator factory
    function setValidatorFactory(address _validatorFactory) external onlyOwner {
        require(_validatorFactory != address(0), "Invalid validator factory address");
        validatorFactory = _validatorFactory;
    }

    // Return the validator contract address
    function getValidatorContractAddress() external view returns (address) {
        return validatorContracts[address(this)];
    }

    // Return the current validator owner
    function getValidatorOwner() external view returns (address) {
        return validatorOwners[address(this)];
    }

    // Return the amount of EML available in the contract
    function getEMLBalance() external view returns (uint256) {
        return IERC20(EMLTokenAddress).balanceOf(address(this));
    }

    // Function to close the validator and send the EML balance to the owner
    function closeValidator() external onlyOwner {
        uint256 balance = IERC20(EMLTokenAddress).balanceOf(address(this));
        require(balance > 0, "No EML tokens to transfer");

        IERC20(EMLTokenAddress).transfer(owner(), balance);
        active = false;

        emit ValidatorClosed(owner(), balance);
        emit ValidatorClosedEvent();
    }

    // Open the validator if it holds at least 20,000 EML
    function openValidator() external onlyOwner {
        uint256 emlBalance = IERC20(EMLTokenAddress).balanceOf(address(this));
        emit EMLBalanceChecked(emlBalance); // Log la balance

        require(emlBalance >= 20000 * 10**18, "Validator must hold at least 20,000 EML");
        active = true;
        emit ValidatorOpened();
    }

    // Function to check if the validator is active
    function isActive() external view returns (bool) {
        return active;
    }

    // Function to get the admin address
    function getAdmin() external view returns (address) {
        return admin;
    }
}

File 3 of 12 : validatorFactory.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "./sources/OZ/Ownable.sol";
import "./validator.sol";

contract ValidatorFactory is Ownable {

    // Mapping to store the addresses of deployed validators
    mapping(address => bool) public validators;
    // Mapping of authorized Contracts
    mapping(address => bool) public authorizedContracts;
    // List of deployed validators
    address[] public deployedValidators;
    // Maximum number of active validators
    uint256 public constant MAX_ACTIVE_VALIDATORS = 25;

    // Events
    event ValidatorCreated(address indexed validatorAddress);
    event ContractAuthorized(address indexed contractAddress, bool isAuthorized);

    // Modifier
    modifier onlyAuthorized() {
        require(authorizedContracts[msg.sender], "Caller is not authorized");
        _;
    }

    constructor(address _initialOwner) Ownable(_initialOwner) {
    } 

    // Autorize contracts for validator creation
    function setAuthorization(address _contract, bool _isAuthorized) external onlyOwner {
        authorizedContracts[_contract] = _isAuthorized;
        emit ContractAuthorized(_contract, _isAuthorized);
    }

    // Function to create a single Validator and assign ownership to the provided owner
    function createValidator(address _EMLTokenAddress, address _owner) external onlyAuthorized returns (address) {
        // Check the number of active validators
        uint256 activeValidatorCount = 0;
        for (uint256 i = 0; i < deployedValidators.length; i++) {
            if (Validator(deployedValidators[i]).isActive()) {
                activeValidatorCount++;
            }
        }

        require(
            activeValidatorCount < MAX_ACTIVE_VALIDATORS,
            "Maximum number of active validators reached"
        );

        // Create the validator and pass this factory address in the constructor
        Validator newValidator = new Validator(_EMLTokenAddress, _owner, address(this));

        // Register the new validator in the factory
        address validatorAddress = address(newValidator);
        validators[validatorAddress] = true;
        deployedValidators.push(validatorAddress);

        emit ValidatorCreated(validatorAddress);
        return validatorAddress;
    }

    // Create a batch of Validators
    function createInitialValidators(address _EMLTokenAddress, uint256 numberOfValidators) external onlyOwner {
        require(numberOfValidators > 0, "Number of validators must be greater than 0");
        require(numberOfValidators <= MAX_ACTIVE_VALIDATORS, "Cannot create more than the maximum allowed validators");
        
        // Check active Validators number
        uint256 activeValidatorCount = 0;
        for (uint256 i = 0; i < deployedValidators.length; i++) {
            if (Validator(deployedValidators[i]).isActive()) {
                activeValidatorCount++;
            }
        }

        require(
            deployedValidators.length + numberOfValidators <= MAX_ACTIVE_VALIDATORS || activeValidatorCount < MAX_ACTIVE_VALIDATORS,
            "Cannot exceed the maximum number of validators"
        );

        for (uint256 i = 0; i < numberOfValidators; i++) {
            Validator newValidator = new Validator(_EMLTokenAddress, msg.sender, address(this));
            address validatorAddress = address(newValidator);
            
            validators[validatorAddress] = true;
            deployedValidators.push(validatorAddress);

            emit ValidatorCreated(validatorAddress);
        }
    }

    // Check if a validator is active
    function isValidatorActive(address validatorAddress) external view returns (bool) {
        require(validators[validatorAddress], "Validator not found");
        return Validator(validatorAddress).isActive();
    }

    // Get the owner of a validator
    function getValidatorOwner(address validatorAddress) external view returns (address) {
        require(validators[validatorAddress], "Validator not found");
        return Validator(validatorAddress).getValidatorOwner();
    }

    // Get the list of deployed validators
    function getDeployedValidators() external view returns (address[] memory) {
        return deployedValidators;
    }
}

File 4 of 12 : IBridgedToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IBridgedToken {
    function mint(address to, uint256 amount) external;
    function burn(address from, uint256 amount) external;
    function burnFrom(address from, uint256 amount) external;
    function transfer(address to, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function tokenAddress() external view returns (address);
    function mintable() external view returns (bool);
    function burnable() external view returns (bool);
}

File 5 of 12 : IMintableERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IMintableERC20 {
    function mint(address to, uint256 amount) external;
    function burn(address from, uint256 amount) external;
    function transfer(address to, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    function approve(address spender, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function tokenAddress() external view returns (address);
    function mintable() external view returns (bool);
    function burnable() external view returns (bool);
}

File 6 of 12 : IWETH.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IWETH {
    function deposit() external payable;
    function withdraw(uint256 wad) external;
    function balanceOf(address guy) external view returns (uint256);
    function transfer(address dst, uint256 wad) external returns (bool);
    function approve(address usr, uint256 wad) external returns (bool);
    function transferFrom(address src, address dst, uint256 wad) external returns (bool);
    function allowance(address src, address dst) external view returns (uint256);
    event Deposit(address indexed dst, uint256 wad);
    event Withdrawal(address indexed src, uint256 wad);
}

File 7 of 12 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)

pragma solidity ^0.8.20;

import "./Errors.sol";

library Address {
    error AddressEmptyCode(address target);
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert Errors.InsufficientBalance(address(this).balance, amount);
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert Errors.FailedCall();
        }
    }

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0);
    }

    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert Errors.InsufficientBalance(address(this).balance, value);
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            assembly ("memory-safe") {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert Errors.FailedCall();
        }
    }
}

File 8 of 12 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

interface IERC20 {

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address to, uint256 value) external returns (bool);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

File 9 of 12 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol)

pragma solidity ^0.8.20;

abstract contract ReentrancyGuard {

    uint256 private constant NOT_ENTERED = 1;
    uint256 private constant ENTERED = 2;
    uint256 private _status;

    error ReentrancyGuardReentrantCall();

    constructor() {
        _status = NOT_ENTERED;
    }
    
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        if (_status == ENTERED) {
            revert ReentrancyGuardReentrantCall();
        }

        _status = ENTERED;
    }

    function _nonReentrantAfter() private {
        _status = NOT_ENTERED;
    }

    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == ENTERED;
    }
}

File 10 of 12 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import  "./Context.sol";

abstract contract Ownable is Context {
    address private _owner;

    error OwnableUnauthorizedAccount(address account);
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 11 of 12 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 12 of 12 : Errors.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;

library Errors {
    
    error InsufficientBalance(uint256 balance, uint256 needed);
    error FailedCall();
    error FailedDeployment();
    error MissingPrecompile(address);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "remappings": []
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_EMLTokenAddress","type":"address"},{"internalType":"address","name":"_wethAddress","type":"address"},{"internalType":"address","name":"_devAddress","type":"address"},{"internalType":"address","name":"_initialOwner","type":"address"},{"internalType":"address","name":"_validatorFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BridgeFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"BridgeTokenRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BridgedETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BridgedTokenTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuthorized","type":"bool"}],"name":"DeployerAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"validator","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EMLMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"proofHash","type":"bytes32"},{"indexed":false,"internalType":"bool","name":"valid","type":"bool"}],"name":"ProofVerified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenBridgedIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initialOwner","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"}],"name":"TokenDeployed","type":"event"},{"inputs":[],"name":"EMLTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedContracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeDeposit","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bridgeTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emlRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"proofHash","type":"bytes32"}],"name":"getProofStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isBridgeTokenRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"proofs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"name":"registerBridgeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"_isAuthorized","type":"bool"}],"name":"setAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bridgeDeposit","type":"address"}],"name":"setBridgeDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setEMLRewardAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wethAddress","type":"address"}],"name":"setWethAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"bool","name":"isRegistered","type":"bool"}],"name":"updateBridgeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"validatorFactory","outputs":[{"internalType":"contract ValidatorFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"proofData","type":"string[]"},{"internalType":"bytes32","name":"proofHash","type":"bytes32"}],"name":"verifyProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wethAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405234801561000f575f80fd5b5060405161399738038061399783398181016040528101906100319190610448565b815f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100a2575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161009991906104ce565b60405180910390fd5b6100b1816101d260201b60201c565b50600180819055508460025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101c88261029360201b60201c565b50505050506104e7565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6102a161032360201b60201c565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610311575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161030891906104ce565b60405180910390fd5b610320816101d260201b60201c565b50565b6103316103bc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166103556103c360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146103ba5761037e6103bc60201b60201c565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016103b191906104ce565b60405180910390fd5b565b5f33905090565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610417826103ee565b9050919050565b6104278161040d565b8114610431575f80fd5b50565b5f815190506104428161041e565b92915050565b5f805f805f60a08688031215610461576104606103ea565b5b5f61046e88828901610434565b955050602061047f88828901610434565b945050604061049088828901610434565b93505060606104a188828901610434565b92505060806104b288828901610434565b9150509295509295909350565b6104c88161040d565b82525050565b5f6020820190506104e15f8301846104bf565b92915050565b6134a3806104f45f395ff3fe608060405260043610610169575f3560e01c8063715018a6116100d0578063c853c4bc11610089578063e727530d11610063578063e727530d14610508578063eecea00014610532578063effb73f31461055a578063f2fde38b1461058457610170565b8063c853c4bc1461047a578063d5b9221b146104a2578063d7368fd6146104de57610170565b8063715018a61461039857806377f84f9a146103ae5780638cd4426d146103d65780638da5cb5b146103fe578063971fa3dd14610428578063a96e24231461045257610170565b80633cced748116101225780633cced748146102545780633fc8cef314610290578063444d95b0146102ba5780634f0e0ef3146102f65780636866a817146103205780636d1ac36a1461035c57610170565b806311024b4a1461017457806320800a001461019c5780632bc0d448146101b25780632efdf584146101da5780633a3206b3146102025780633ad10ef61461022a57610170565b3661017057005b5f80fd5b34801561017f575f80fd5b5061019a600480360381019061019591906124bc565b6105ac565b005b3480156101a7575f80fd5b506101b061073a565b005b3480156101bd575f80fd5b506101d860048036038101906101d39190612561565b6107eb565b005b3480156101e5575f80fd5b5061020060048036038101906101fb9190612614565b610836565b005b34801561020d575f80fd5b50610228600480360381019061022391906126a4565b610cb5565b005b348015610235575f80fd5b5061023e610cc7565b60405161024b91906126de565b60405180910390f35b34801561025f575f80fd5b5061027a600480360381019061027591906126f7565b610cec565b604051610287919061273c565b60405180910390f35b34801561029b575f80fd5b506102a4610d12565b6040516102b191906127b0565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906126f7565b610d37565b6040516102ed919061273c565b60405180910390f35b348015610301575f80fd5b5061030a610d54565b60405161031791906126de565b60405180910390f35b34801561032b575f80fd5b5061034660048036038101906103419190612561565b610d79565b604051610353919061273c565b60405180910390f35b348015610367575f80fd5b50610382600480360381019061037d9190612561565b610dcb565b60405161038f919061273c565b60405180910390f35b3480156103a3575f80fd5b506103ac610de8565b005b3480156103b9575f80fd5b506103d460048036038101906103cf91906127f3565b610dfb565b005b3480156103e1575f80fd5b506103fc60048036038101906103f79190612831565b610e5b565b005b348015610409575f80fd5b50610412610fc3565b60405161041f91906126de565b60405180910390f35b348015610433575f80fd5b5061043c610fea565b60405161044991906126de565b60405180910390f35b34801561045d575f80fd5b5061047860048036038101906104739190612561565b61100f565b005b348015610485575f80fd5b506104a0600480360381019061049b91906126a4565b61105a565b005b3480156104ad575f80fd5b506104c860048036038101906104c39190612561565b6111fe565b6040516104d5919061273c565b60405180910390f35b3480156104e9575f80fd5b506104f261121b565b6040516104ff919061288f565b60405180910390f35b348015610513575f80fd5b5061051c611240565b60405161052991906126de565b60405180910390f35b34801561053d575f80fd5b50610558600480360381019061055391906127f3565b611265565b005b348015610565575f80fd5b5061056e611313565b60405161057b91906128b7565b60405180910390f35b34801561058f575f80fd5b506105aa60048036038101906105a59190612561565b611319565b005b600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062c9061292a565b60405180910390fd5b5f5b8282905081101561073557600160095f85858581811061065a57610659612948565b5b905060200201602081019061066f9190612561565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508282828181106106d1576106d0612948565b5b90506020020160208101906106e69190612561565b73ffffffffffffffffffffffffffffffffffffffff167f82957733094fbdcd516829d25e832bab05592438632724eeee6485e94e9d473360405160405180910390a28080600101915050610637565b505050565b61074261139d565b5f4711610784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077b906129bf565b60405180910390fd5b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f193505050501580156107e8573d5f803e3d5ffd5b50565b6107f361139d565b8060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61083e611424565b61084661139d565b6006838390501461088c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088390612a27565b60405180910390fd5b600a5f8281526020019081526020015f205f9054906101000a900460ff16156108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e190612a8f565b60405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f97dd866040518163ffffffff1660e01b81526004015f60405180830381865afa158015610954573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061097c9190612c09565b90505f80825167ffffffffffffffff81111561099b5761099a612abd565b5b6040519080825280602002602001820160405280156109c95781602001602082028036833780820191505090505b5090505f5b8351811015610ae7578381815181106109ea576109e9612948565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166322f3e2d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190612c64565b15610ada57838181518110610a7657610a75612948565b5b6020026020010151828481518110610a9157610a90612948565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508280610ad690612cbc565b9350505b80806001019150506109ce565b505f8211610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190612d4d565b60405180910390fd5b5f805b83811015610beb575f838281518110610b4957610b48612948565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16630c45192f8a8a6040518363ffffffff1660e01b8152600401610b8b929190612ed1565b602060405180830381865afa158015610ba6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bca9190612f07565b9050868103610bdd576001925050610beb565b508080600101915050610b2d565b508015610c6b57610bfa61146a565b610c048787611813565b6001600a5f8781526020019081526020015f205f6101000a81548160ff021916908315150217905550847ff8ea4b84d199e84ff35249e26840ceba1b2a1711d50a01b47e981737011721806001604051610c5e919061273c565b60405180910390a2610ca4565b847ff8ea4b84d199e84ff35249e26840ceba1b2a1711d50a01b47e981737011721805f604051610c9b919061273c565b60405180910390a25b50505050610cb06121a7565b505050565b610cbd61139d565b8060048190555050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600a5f8381526020019081526020015f205f9054906101000a900460ff169050919050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a602052805f5260405f205f915054906101000a900460ff1681565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6009602052805f5260405f205f915054906101000a900460ff1681565b610df061139d565b610df95f6121b0565b565b610e0361139d565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b610e6361139d565b5f829050818173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ea191906126de565b602060405180830381865afa158015610ebc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee09190612f46565b1015610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890612fbb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401610f7d929190612fd9565b6020604051808303815f875af1158015610f99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbd9190612c64565b50505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61101761139d565b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61106261139d565b8060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110bd91906126de565b602060405180830381865afa1580156110d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110fc9190612f46565b101561113d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111349061304a565b60405180910390fd5b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016111ba929190612fd9565b6020604051808303815f875af11580156111d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111fa9190612c64565b5050565b600b602052805f5260405f205f915054906101000a900460ff1681565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61126d61139d565b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167ffa27fcd166190505684063d08e30b8ccd6e8d6fa57ff7cb8540164a4b65a128e82604051611307919061273c565b60405180910390a25050565b60045481565b61132161139d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611391575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161138891906126de565b60405180910390fd5b61139a816121b0565b50565b6113a5612271565b73ffffffffffffffffffffffffffffffffffffffff166113c3610fc3565b73ffffffffffffffffffffffffffffffffffffffff1614611422576113e6612271565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161141991906126de565b60405180910390fd5b565b600260015403611460576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f97dd866040518163ffffffff1660e01b81526004015f60405180830381865afa1580156114d4573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906114fc9190612c09565b90505f805b82518110156115b25782818151811061151d5761151c612948565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166322f3e2d46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561156d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115919190612c64565b156115a55781806115a190612cbc565b9250505b8080600101915050611501565b505f81116115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90612d4d565b60405180910390fd5b5f816004546116049190613095565b90505f5b835181101561180d5783818151811061162457611623612948565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166322f3e2d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611674573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116989190612c64565b15611800575f8482815181106116b1576116b0612948565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16633741b3516040518163ffffffff1660e01b8152600401602060405180830381865afa158015611701573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172591906130c5565b905060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1982856040518363ffffffff1660e01b8152600401611783929190612fd9565b5f604051808303815f87803b15801561179a575f80fd5b505af11580156117ac573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff167f572c9fd0f88af242d9e85568b37ba37f4eb69496d16a161d534e3b82e9db4b33846040516117f691906128b7565b60405180910390a2505b8080600101915050611608565b50505050565b5f61188383835f81811061182a57611829612948565b5b905060200281019061183c91906130fc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612278565b90505f6118f68484600181811061189d5761189c612948565b5b90506020028101906118af91906130fc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506123d8565b90505f611969858560028181106119105761190f612948565b5b905060200281019061192291906130fc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612278565b90505f6119dc8686600381811061198357611982612948565b5b905060200281019061199591906130fc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506123d8565b90505f868660048181106119f3576119f2612948565b5b9050602002810190611a0591906130fc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505090505f611aba88886005818110611a6157611a60612948565b5b9050602002810190611a7391906130fc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506123d8565b90505f831015611aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af6906131a8565b60405180910390fd5b5f825111611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3990613210565b60405180910390fd5b5f811015611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c90613278565b60405180910390fd5b5f6127108287611b959190613296565b611b9f9190613095565b90505f8187611bae91906132d7565b905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603611dd55760065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d886040518263ffffffff1660e01b8152600401611c5e91906128b7565b5f604051808303815f87803b158015611c75575f80fd5b505af1158015611c87573d5f803e3d5ffd5b5050505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015611cef573d5f803e3d5ffd5b508573ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611d33573d5f803e3d5ffd5b507f840f66444932f475becbdb15ce5390aae52e4664b4c70085fb595b6bf37e9eb08682604051611d65929190612fd9565b60405180910390a15f821115611dd0577f239e25fd86733421cbe368223d4a80bbf6eba67333d4d9ea915c7a3ce3a869c160075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683604051611dc7929190612fd9565b60405180910390a15b61219b565b60095f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611fcd578773ffffffffffffffffffffffffffffffffffffffff166340c10f1987836040518363ffffffff1660e01b8152600401611e5f929190612fd9565b5f604051808303815f87803b158015611e76575f80fd5b505af1158015611e88573d5f803e3d5ffd5b505050508773ffffffffffffffffffffffffffffffffffffffff166340c10f1960075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611ee8929190612fd9565b5f604051808303815f87803b158015611eff575f80fd5b505af1158015611f11573d5f803e3d5ffd5b505050508773ffffffffffffffffffffffffffffffffffffffff167f8b21a08b49ee2c19e621b1b0ce95c5533f486dc115a504e4242cce06a18b2f4b8783604051611f5d929190612fd9565b60405180910390a25f821115611fc8577f239e25fd86733421cbe368223d4a80bbf6eba67333d4d9ea915c7a3ce3a869c160075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683604051611fbf929190612fd9565b60405180910390a15b61219a565b8773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87836040518363ffffffff1660e01b8152600401612008929190612fd9565b6020604051808303815f875af1158015612024573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120489190612c64565b508773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b81526004016120a5929190612fd9565b6020604051808303815f875af11580156120c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120e59190612c64565b508773ffffffffffffffffffffffffffffffffffffffff167f457eae72bd5de65449cda0fd208f3693c544a8bd9322731caba869a983e1cba2878360405161212e929190612fd9565b60405180910390a25f821115612199577f239e25fd86733421cbe368223d4a80bbf6eba67333d4d9ea915c7a3ce3a869c160075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683604051612190929190612fd9565b60405180910390a15b5b5b50505050505050505050565b60018081905550565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f80829050602a8151146122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b890613354565b60405180910390fd5b5f80600290505b82518110156123cd576010826122de9190613372565b91505f8382815181106122f4576122f3612948565b5b602001015160f81c60f81b60f81c905060308160ff161015801561231c575060398160ff1611155b156123435760308161232e91906133bf565b60ff168361233c91906133f3565b92506123bf565b60618160ff161015801561235b575060668160ff1611155b156123825760578161236d91906133bf565b60ff168361237b91906133f3565b92506123be565b60418160ff161015801561239a575060468160ff1611155b156123bd576037816123ac91906133bf565b60ff16836123ba91906133f3565b92505b5b5b5080806001019150506122c8565b508092505050919050565b5f808290505f805b825181101561243f5760308382815181106123fe576123fd612948565b5b602001015160f81c60f81b60f81c60ff1661241991906132d7565b600a836124269190613296565b612430919061343a565b915080806001019150506123e0565b508092505050919050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261247c5761247b61245b565b5b8235905067ffffffffffffffff8111156124995761249861245f565b5b6020830191508360208202830111156124b5576124b4612463565b5b9250929050565b5f80602083850312156124d2576124d1612453565b5b5f83013567ffffffffffffffff8111156124ef576124ee612457565b5b6124fb85828601612467565b92509250509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61253082612507565b9050919050565b61254081612526565b811461254a575f80fd5b50565b5f8135905061255b81612537565b92915050565b5f6020828403121561257657612575612453565b5b5f6125838482850161254d565b91505092915050565b5f8083601f8401126125a1576125a061245b565b5b8235905067ffffffffffffffff8111156125be576125bd61245f565b5b6020830191508360208202830111156125da576125d9612463565b5b9250929050565b5f819050919050565b6125f3816125e1565b81146125fd575f80fd5b50565b5f8135905061260e816125ea565b92915050565b5f805f6040848603121561262b5761262a612453565b5b5f84013567ffffffffffffffff81111561264857612647612457565b5b6126548682870161258c565b9350935050602061266786828701612600565b9150509250925092565b5f819050919050565b61268381612671565b811461268d575f80fd5b50565b5f8135905061269e8161267a565b92915050565b5f602082840312156126b9576126b8612453565b5b5f6126c684828501612690565b91505092915050565b6126d881612526565b82525050565b5f6020820190506126f15f8301846126cf565b92915050565b5f6020828403121561270c5761270b612453565b5b5f61271984828501612600565b91505092915050565b5f8115159050919050565b61273681612722565b82525050565b5f60208201905061274f5f83018461272d565b92915050565b5f819050919050565b5f61277861277361276e84612507565b612755565b612507565b9050919050565b5f6127898261275e565b9050919050565b5f61279a8261277f565b9050919050565b6127aa81612790565b82525050565b5f6020820190506127c35f8301846127a1565b92915050565b6127d281612722565b81146127dc575f80fd5b50565b5f813590506127ed816127c9565b92915050565b5f806040838503121561280957612808612453565b5b5f6128168582860161254d565b9250506020612827858286016127df565b9150509250929050565b5f806040838503121561284757612846612453565b5b5f6128548582860161254d565b925050602061286585828601612690565b9150509250929050565b5f6128798261277f565b9050919050565b6128898161286f565b82525050565b5f6020820190506128a25f830184612880565b92915050565b6128b181612671565b82525050565b5f6020820190506128ca5f8301846128a8565b92915050565b5f82825260208201905092915050565b7f43616c6c6572206973206e6f7420617574686f72697a656400000000000000005f82015250565b5f6129146018836128d0565b915061291f826128e0565b602082019050919050565b5f6020820190508181035f83015261294181612908565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f496e73756666696369656e74204554482062616c616e636500000000000000005f82015250565b5f6129a96018836128d0565b91506129b482612975565b602082019050919050565b5f6020820190508181035f8301526129d68161299d565b9050919050565b7f496e76616c69642070726f6f662064617461206c656e677468000000000000005f82015250565b5f612a116019836128d0565b9150612a1c826129dd565b602082019050919050565b5f6020820190508181035f830152612a3e81612a05565b9050919050565b7f50726f6f6620616c7265616479207375626d69747465640000000000000000005f82015250565b5f612a796017836128d0565b9150612a8482612a45565b602082019050919050565b5f6020820190508181035f830152612aa681612a6d565b9050919050565b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612af382612aad565b810181811067ffffffffffffffff82111715612b1257612b11612abd565b5b80604052505050565b5f612b2461244a565b9050612b308282612aea565b919050565b5f67ffffffffffffffff821115612b4f57612b4e612abd565b5b602082029050602081019050919050565b5f81519050612b6e81612537565b92915050565b5f612b86612b8184612b35565b612b1b565b90508083825260208201905060208402830185811115612ba957612ba8612463565b5b835b81811015612bd25780612bbe8882612b60565b845260208401935050602081019050612bab565b5050509392505050565b5f82601f830112612bf057612bef61245b565b5b8151612c00848260208601612b74565b91505092915050565b5f60208284031215612c1e57612c1d612453565b5b5f82015167ffffffffffffffff811115612c3b57612c3a612457565b5b612c4784828501612bdc565b91505092915050565b5f81519050612c5e816127c9565b92915050565b5f60208284031215612c7957612c78612453565b5b5f612c8684828501612c50565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612cc682612671565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612cf857612cf7612c8f565b5b600182019050919050565b7f4e6f206163746976652076616c696461746f727320666f756e640000000000005f82015250565b5f612d37601a836128d0565b9150612d4282612d03565b602082019050919050565b5f6020820190508181035f830152612d6481612d2b565b9050919050565b5f82825260208201905092915050565b5f819050919050565b5f82825260208201905092915050565b828183375f83830152505050565b5f612dad8385612d84565b9350612dba838584612d94565b612dc383612aad565b840190509392505050565b5f612dda848484612da2565b90509392505050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112612e0b57612e0a612deb565b5b83810192508235915060208301925067ffffffffffffffff821115612e3357612e32612de3565b5b600182023603831315612e4957612e48612de7565b5b509250929050565b5f602082019050919050565b5f612e688385612d6b565b935083602084028501612e7a84612d7b565b805f5b87811015612ebf578484038952612e948284612def565b612e9f868284612dce565b9550612eaa84612e51565b935060208b019a505050600181019050612e7d565b50829750879450505050509392505050565b5f6020820190508181035f830152612eea818486612e5d565b90509392505050565b5f81519050612f01816125ea565b92915050565b5f60208284031215612f1c57612f1b612453565b5b5f612f2984828501612ef3565b91505092915050565b5f81519050612f408161267a565b92915050565b5f60208284031215612f5b57612f5a612453565b5b5f612f6884828501612f32565b91505092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e63650000000000005f82015250565b5f612fa5601a836128d0565b9150612fb082612f71565b602082019050919050565b5f6020820190508181035f830152612fd281612f99565b9050919050565b5f604082019050612fec5f8301856126cf565b612ff960208301846128a8565b9392505050565b7f496e73756666696369656e7420574554482062616c616e6365000000000000005f82015250565b5f6130346019836128d0565b915061303f82613000565b602082019050919050565b5f6020820190508181035f83015261306181613028565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61309f82612671565b91506130aa83612671565b9250826130ba576130b9613068565b5b828204905092915050565b5f602082840312156130da576130d9612453565b5b5f6130e784828501612b60565b91505092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112613118576131176130f0565b5b80840192508235915067ffffffffffffffff82111561313a576131396130f4565b5b602083019250600182023603831315613156576131556130f8565b5b509250929050565b7f496e76616c69642074696d657374616d700000000000000000000000000000005f82015250565b5f6131926011836128d0565b915061319d8261315e565b602082019050919050565b5f6020820190508181035f8301526131bf81613186565b9050919050565b7f496e76616c69642073616c7420646174610000000000000000000000000000005f82015250565b5f6131fa6011836128d0565b9150613205826131c6565b602082019050919050565b5f6020820190508181035f830152613227816131ee565b9050919050565b7f496e76616c6964206665650000000000000000000000000000000000000000005f82015250565b5f613262600b836128d0565b915061326d8261322e565b602082019050919050565b5f6020820190508181035f83015261328f81613256565b9050919050565b5f6132a082612671565b91506132ab83612671565b92508282026132b981612671565b915082820484148315176132d0576132cf612c8f565b5b5092915050565b5f6132e182612671565b91506132ec83612671565b925082820390508181111561330457613303612c8f565b5b92915050565b7f496e76616c69642061646472657373206c656e677468000000000000000000005f82015250565b5f61333e6016836128d0565b91506133498261330a565b602082019050919050565b5f6020820190508181035f83015261336b81613332565b9050919050565b5f61337c82612507565b915061338783612507565b925082820261339581612507565b915082820484148315176133ac576133ab612c8f565b5b5092915050565b5f60ff82169050919050565b5f6133c9826133b3565b91506133d4836133b3565b9250828203905060ff8111156133ed576133ec612c8f565b5b92915050565b5f6133fd82612507565b915061340883612507565b9250828201905073ffffffffffffffffffffffffffffffffffffffff81111561343457613433612c8f565b5b92915050565b5f61344482612671565b915061344f83612671565b925082820190508082111561346757613466612c8f565b5b9291505056fea26469706673582212203bb53d93e91cf2548b6028130a15619eb25cdc5f4776242a90e8d252c8d98cfb64736f6c634300081a00330000000000000000000000006728e8a26bc853b6cb20a59bf254434ea5bc93d8000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3800000000000000000000000002a5e058bbfc96ae09f032066a43d82e2f00617000000000000000000000000092eed0282c6665c9bcc81605a13a5c3b1e4dc7f2000000000000000000000000aa63811655645f1d8c00271784cfb048eb0f4c33

Deployed Bytecode

0x608060405260043610610169575f3560e01c8063715018a6116100d0578063c853c4bc11610089578063e727530d11610063578063e727530d14610508578063eecea00014610532578063effb73f31461055a578063f2fde38b1461058457610170565b8063c853c4bc1461047a578063d5b9221b146104a2578063d7368fd6146104de57610170565b8063715018a61461039857806377f84f9a146103ae5780638cd4426d146103d65780638da5cb5b146103fe578063971fa3dd14610428578063a96e24231461045257610170565b80633cced748116101225780633cced748146102545780633fc8cef314610290578063444d95b0146102ba5780634f0e0ef3146102f65780636866a817146103205780636d1ac36a1461035c57610170565b806311024b4a1461017457806320800a001461019c5780632bc0d448146101b25780632efdf584146101da5780633a3206b3146102025780633ad10ef61461022a57610170565b3661017057005b5f80fd5b34801561017f575f80fd5b5061019a600480360381019061019591906124bc565b6105ac565b005b3480156101a7575f80fd5b506101b061073a565b005b3480156101bd575f80fd5b506101d860048036038101906101d39190612561565b6107eb565b005b3480156101e5575f80fd5b5061020060048036038101906101fb9190612614565b610836565b005b34801561020d575f80fd5b50610228600480360381019061022391906126a4565b610cb5565b005b348015610235575f80fd5b5061023e610cc7565b60405161024b91906126de565b60405180910390f35b34801561025f575f80fd5b5061027a600480360381019061027591906126f7565b610cec565b604051610287919061273c565b60405180910390f35b34801561029b575f80fd5b506102a4610d12565b6040516102b191906127b0565b60405180910390f35b3480156102c5575f80fd5b506102e060048036038101906102db91906126f7565b610d37565b6040516102ed919061273c565b60405180910390f35b348015610301575f80fd5b5061030a610d54565b60405161031791906126de565b60405180910390f35b34801561032b575f80fd5b5061034660048036038101906103419190612561565b610d79565b604051610353919061273c565b60405180910390f35b348015610367575f80fd5b50610382600480360381019061037d9190612561565b610dcb565b60405161038f919061273c565b60405180910390f35b3480156103a3575f80fd5b506103ac610de8565b005b3480156103b9575f80fd5b506103d460048036038101906103cf91906127f3565b610dfb565b005b3480156103e1575f80fd5b506103fc60048036038101906103f79190612831565b610e5b565b005b348015610409575f80fd5b50610412610fc3565b60405161041f91906126de565b60405180910390f35b348015610433575f80fd5b5061043c610fea565b60405161044991906126de565b60405180910390f35b34801561045d575f80fd5b5061047860048036038101906104739190612561565b61100f565b005b348015610485575f80fd5b506104a0600480360381019061049b91906126a4565b61105a565b005b3480156104ad575f80fd5b506104c860048036038101906104c39190612561565b6111fe565b6040516104d5919061273c565b60405180910390f35b3480156104e9575f80fd5b506104f261121b565b6040516104ff919061288f565b60405180910390f35b348015610513575f80fd5b5061051c611240565b60405161052991906126de565b60405180910390f35b34801561053d575f80fd5b50610558600480360381019061055391906127f3565b611265565b005b348015610565575f80fd5b5061056e611313565b60405161057b91906128b7565b60405180910390f35b34801561058f575f80fd5b506105aa60048036038101906105a59190612561565b611319565b005b600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16610635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062c9061292a565b60405180910390fd5b5f5b8282905081101561073557600160095f85858581811061065a57610659612948565b5b905060200201602081019061066f9190612561565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508282828181106106d1576106d0612948565b5b90506020020160208101906106e69190612561565b73ffffffffffffffffffffffffffffffffffffffff167f82957733094fbdcd516829d25e832bab05592438632724eeee6485e94e9d473360405160405180910390a28080600101915050610637565b505050565b61074261139d565b5f4711610784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077b906129bf565b60405180910390fd5b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f193505050501580156107e8573d5f803e3d5ffd5b50565b6107f361139d565b8060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61083e611424565b61084661139d565b6006838390501461088c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088390612a27565b60405180910390fd5b600a5f8281526020019081526020015f205f9054906101000a900460ff16156108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e190612a8f565b60405180910390fd5b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f97dd866040518163ffffffff1660e01b81526004015f60405180830381865afa158015610954573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f8201168201806040525081019061097c9190612c09565b90505f80825167ffffffffffffffff81111561099b5761099a612abd565b5b6040519080825280602002602001820160405280156109c95781602001602082028036833780820191505090505b5090505f5b8351811015610ae7578381815181106109ea576109e9612948565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166322f3e2d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a3a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a5e9190612c64565b15610ada57838181518110610a7657610a75612948565b5b6020026020010151828481518110610a9157610a90612948565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508280610ad690612cbc565b9350505b80806001019150506109ce565b505f8211610b2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2190612d4d565b60405180910390fd5b5f805b83811015610beb575f838281518110610b4957610b48612948565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16630c45192f8a8a6040518363ffffffff1660e01b8152600401610b8b929190612ed1565b602060405180830381865afa158015610ba6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bca9190612f07565b9050868103610bdd576001925050610beb565b508080600101915050610b2d565b508015610c6b57610bfa61146a565b610c048787611813565b6001600a5f8781526020019081526020015f205f6101000a81548160ff021916908315150217905550847ff8ea4b84d199e84ff35249e26840ceba1b2a1711d50a01b47e981737011721806001604051610c5e919061273c565b60405180910390a2610ca4565b847ff8ea4b84d199e84ff35249e26840ceba1b2a1711d50a01b47e981737011721805f604051610c9b919061273c565b60405180910390a25b50505050610cb06121a7565b505050565b610cbd61139d565b8060048190555050565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600a5f8381526020019081526020015f205f9054906101000a900460ff169050919050565b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600a602052805f5260405f205f915054906101000a900460ff1681565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6009602052805f5260405f205f915054906101000a900460ff1681565b610df061139d565b610df95f6121b0565b565b610e0361139d565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b610e6361139d565b5f829050818173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610ea191906126de565b602060405180830381865afa158015610ebc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee09190612f46565b1015610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890612fbb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401610f7d929190612fd9565b6020604051808303815f875af1158015610f99573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fbd9190612c64565b50505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61101761139d565b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61106261139d565b8060085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110bd91906126de565b602060405180830381865afa1580156110d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110fc9190612f46565b101561113d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111349061304a565b60405180910390fd5b60085f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016111ba929190612fd9565b6020604051808303815f875af11580156111d6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111fa9190612c64565b5050565b600b602052805f5260405f205f915054906101000a900460ff1681565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61126d61139d565b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff167ffa27fcd166190505684063d08e30b8ccd6e8d6fa57ff7cb8540164a4b65a128e82604051611307919061273c565b60405180910390a25050565b60045481565b61132161139d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611391575f6040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161138891906126de565b60405180910390fd5b61139a816121b0565b50565b6113a5612271565b73ffffffffffffffffffffffffffffffffffffffff166113c3610fc3565b73ffffffffffffffffffffffffffffffffffffffff1614611422576113e6612271565b6040517f118cdaa700000000000000000000000000000000000000000000000000000000815260040161141991906126de565b60405180910390fd5b565b600260015403611460576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633f97dd866040518163ffffffff1660e01b81526004015f60405180830381865afa1580156114d4573d5f803e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906114fc9190612c09565b90505f805b82518110156115b25782818151811061151d5761151c612948565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166322f3e2d46040518163ffffffff1660e01b8152600401602060405180830381865afa15801561156d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115919190612c64565b156115a55781806115a190612cbc565b9250505b8080600101915050611501565b505f81116115f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ec90612d4d565b60405180910390fd5b5f816004546116049190613095565b90505f5b835181101561180d5783818151811061162457611623612948565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166322f3e2d46040518163ffffffff1660e01b8152600401602060405180830381865afa158015611674573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116989190612c64565b15611800575f8482815181106116b1576116b0612948565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16633741b3516040518163ffffffff1660e01b8152600401602060405180830381865afa158015611701573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061172591906130c5565b905060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1982856040518363ffffffff1660e01b8152600401611783929190612fd9565b5f604051808303815f87803b15801561179a575f80fd5b505af11580156117ac573d5f803e3d5ffd5b505050508073ffffffffffffffffffffffffffffffffffffffff167f572c9fd0f88af242d9e85568b37ba37f4eb69496d16a161d534e3b82e9db4b33846040516117f691906128b7565b60405180910390a2505b8080600101915050611608565b50505050565b5f61188383835f81811061182a57611829612948565b5b905060200281019061183c91906130fc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612278565b90505f6118f68484600181811061189d5761189c612948565b5b90506020028101906118af91906130fc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506123d8565b90505f611969858560028181106119105761190f612948565b5b905060200281019061192291906130fc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f82011690508083019250505050505050612278565b90505f6119dc8686600381811061198357611982612948565b5b905060200281019061199591906130fc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506123d8565b90505f868660048181106119f3576119f2612948565b5b9050602002810190611a0591906130fc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f8201169050808301925050505050505090505f611aba88886005818110611a6157611a60612948565b5b9050602002810190611a7391906130fc565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506123d8565b90505f831015611aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af6906131a8565b60405180910390fd5b5f825111611b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3990613210565b60405180910390fd5b5f811015611b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7c90613278565b60405180910390fd5b5f6127108287611b959190613296565b611b9f9190613095565b90505f8187611bae91906132d7565b905060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1603611dd55760065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d886040518263ffffffff1660e01b8152600401611c5e91906128b7565b5f604051808303815f87803b158015611c75575f80fd5b505af1158015611c87573d5f803e3d5ffd5b5050505060075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc8390811502906040515f60405180830381858888f19350505050158015611cef573d5f803e3d5ffd5b508573ffffffffffffffffffffffffffffffffffffffff166108fc8290811502906040515f60405180830381858888f19350505050158015611d33573d5f803e3d5ffd5b507f840f66444932f475becbdb15ce5390aae52e4664b4c70085fb595b6bf37e9eb08682604051611d65929190612fd9565b60405180910390a15f821115611dd0577f239e25fd86733421cbe368223d4a80bbf6eba67333d4d9ea915c7a3ce3a869c160075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683604051611dc7929190612fd9565b60405180910390a15b61219b565b60095f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611fcd578773ffffffffffffffffffffffffffffffffffffffff166340c10f1987836040518363ffffffff1660e01b8152600401611e5f929190612fd9565b5f604051808303815f87803b158015611e76575f80fd5b505af1158015611e88573d5f803e3d5ffd5b505050508773ffffffffffffffffffffffffffffffffffffffff166340c10f1960075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611ee8929190612fd9565b5f604051808303815f87803b158015611eff575f80fd5b505af1158015611f11573d5f803e3d5ffd5b505050508773ffffffffffffffffffffffffffffffffffffffff167f8b21a08b49ee2c19e621b1b0ce95c5533f486dc115a504e4242cce06a18b2f4b8783604051611f5d929190612fd9565b60405180910390a25f821115611fc8577f239e25fd86733421cbe368223d4a80bbf6eba67333d4d9ea915c7a3ce3a869c160075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683604051611fbf929190612fd9565b60405180910390a15b61219a565b8773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb87836040518363ffffffff1660e01b8152600401612008929190612fd9565b6020604051808303815f875af1158015612024573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120489190612c64565b508773ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b81526004016120a5929190612fd9565b6020604051808303815f875af11580156120c1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120e59190612c64565b508773ffffffffffffffffffffffffffffffffffffffff167f457eae72bd5de65449cda0fd208f3693c544a8bd9322731caba869a983e1cba2878360405161212e929190612fd9565b60405180910390a25f821115612199577f239e25fd86733421cbe368223d4a80bbf6eba67333d4d9ea915c7a3ce3a869c160075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683604051612190929190612fd9565b60405180910390a15b5b5b50505050505050505050565b60018081905550565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f80829050602a8151146122c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b890613354565b60405180910390fd5b5f80600290505b82518110156123cd576010826122de9190613372565b91505f8382815181106122f4576122f3612948565b5b602001015160f81c60f81b60f81c905060308160ff161015801561231c575060398160ff1611155b156123435760308161232e91906133bf565b60ff168361233c91906133f3565b92506123bf565b60618160ff161015801561235b575060668160ff1611155b156123825760578161236d91906133bf565b60ff168361237b91906133f3565b92506123be565b60418160ff161015801561239a575060468160ff1611155b156123bd576037816123ac91906133bf565b60ff16836123ba91906133f3565b92505b5b5b5080806001019150506122c8565b508092505050919050565b5f808290505f805b825181101561243f5760308382815181106123fe576123fd612948565b5b602001015160f81c60f81b60f81c60ff1661241991906132d7565b600a836124269190613296565b612430919061343a565b915080806001019150506123e0565b508092505050919050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261247c5761247b61245b565b5b8235905067ffffffffffffffff8111156124995761249861245f565b5b6020830191508360208202830111156124b5576124b4612463565b5b9250929050565b5f80602083850312156124d2576124d1612453565b5b5f83013567ffffffffffffffff8111156124ef576124ee612457565b5b6124fb85828601612467565b92509250509250929050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61253082612507565b9050919050565b61254081612526565b811461254a575f80fd5b50565b5f8135905061255b81612537565b92915050565b5f6020828403121561257657612575612453565b5b5f6125838482850161254d565b91505092915050565b5f8083601f8401126125a1576125a061245b565b5b8235905067ffffffffffffffff8111156125be576125bd61245f565b5b6020830191508360208202830111156125da576125d9612463565b5b9250929050565b5f819050919050565b6125f3816125e1565b81146125fd575f80fd5b50565b5f8135905061260e816125ea565b92915050565b5f805f6040848603121561262b5761262a612453565b5b5f84013567ffffffffffffffff81111561264857612647612457565b5b6126548682870161258c565b9350935050602061266786828701612600565b9150509250925092565b5f819050919050565b61268381612671565b811461268d575f80fd5b50565b5f8135905061269e8161267a565b92915050565b5f602082840312156126b9576126b8612453565b5b5f6126c684828501612690565b91505092915050565b6126d881612526565b82525050565b5f6020820190506126f15f8301846126cf565b92915050565b5f6020828403121561270c5761270b612453565b5b5f61271984828501612600565b91505092915050565b5f8115159050919050565b61273681612722565b82525050565b5f60208201905061274f5f83018461272d565b92915050565b5f819050919050565b5f61277861277361276e84612507565b612755565b612507565b9050919050565b5f6127898261275e565b9050919050565b5f61279a8261277f565b9050919050565b6127aa81612790565b82525050565b5f6020820190506127c35f8301846127a1565b92915050565b6127d281612722565b81146127dc575f80fd5b50565b5f813590506127ed816127c9565b92915050565b5f806040838503121561280957612808612453565b5b5f6128168582860161254d565b9250506020612827858286016127df565b9150509250929050565b5f806040838503121561284757612846612453565b5b5f6128548582860161254d565b925050602061286585828601612690565b9150509250929050565b5f6128798261277f565b9050919050565b6128898161286f565b82525050565b5f6020820190506128a25f830184612880565b92915050565b6128b181612671565b82525050565b5f6020820190506128ca5f8301846128a8565b92915050565b5f82825260208201905092915050565b7f43616c6c6572206973206e6f7420617574686f72697a656400000000000000005f82015250565b5f6129146018836128d0565b915061291f826128e0565b602082019050919050565b5f6020820190508181035f83015261294181612908565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f496e73756666696369656e74204554482062616c616e636500000000000000005f82015250565b5f6129a96018836128d0565b91506129b482612975565b602082019050919050565b5f6020820190508181035f8301526129d68161299d565b9050919050565b7f496e76616c69642070726f6f662064617461206c656e677468000000000000005f82015250565b5f612a116019836128d0565b9150612a1c826129dd565b602082019050919050565b5f6020820190508181035f830152612a3e81612a05565b9050919050565b7f50726f6f6620616c7265616479207375626d69747465640000000000000000005f82015250565b5f612a796017836128d0565b9150612a8482612a45565b602082019050919050565b5f6020820190508181035f830152612aa681612a6d565b9050919050565b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b612af382612aad565b810181811067ffffffffffffffff82111715612b1257612b11612abd565b5b80604052505050565b5f612b2461244a565b9050612b308282612aea565b919050565b5f67ffffffffffffffff821115612b4f57612b4e612abd565b5b602082029050602081019050919050565b5f81519050612b6e81612537565b92915050565b5f612b86612b8184612b35565b612b1b565b90508083825260208201905060208402830185811115612ba957612ba8612463565b5b835b81811015612bd25780612bbe8882612b60565b845260208401935050602081019050612bab565b5050509392505050565b5f82601f830112612bf057612bef61245b565b5b8151612c00848260208601612b74565b91505092915050565b5f60208284031215612c1e57612c1d612453565b5b5f82015167ffffffffffffffff811115612c3b57612c3a612457565b5b612c4784828501612bdc565b91505092915050565b5f81519050612c5e816127c9565b92915050565b5f60208284031215612c7957612c78612453565b5b5f612c8684828501612c50565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612cc682612671565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612cf857612cf7612c8f565b5b600182019050919050565b7f4e6f206163746976652076616c696461746f727320666f756e640000000000005f82015250565b5f612d37601a836128d0565b9150612d4282612d03565b602082019050919050565b5f6020820190508181035f830152612d6481612d2b565b9050919050565b5f82825260208201905092915050565b5f819050919050565b5f82825260208201905092915050565b828183375f83830152505050565b5f612dad8385612d84565b9350612dba838584612d94565b612dc383612aad565b840190509392505050565b5f612dda848484612da2565b90509392505050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112612e0b57612e0a612deb565b5b83810192508235915060208301925067ffffffffffffffff821115612e3357612e32612de3565b5b600182023603831315612e4957612e48612de7565b5b509250929050565b5f602082019050919050565b5f612e688385612d6b565b935083602084028501612e7a84612d7b565b805f5b87811015612ebf578484038952612e948284612def565b612e9f868284612dce565b9550612eaa84612e51565b935060208b019a505050600181019050612e7d565b50829750879450505050509392505050565b5f6020820190508181035f830152612eea818486612e5d565b90509392505050565b5f81519050612f01816125ea565b92915050565b5f60208284031215612f1c57612f1b612453565b5b5f612f2984828501612ef3565b91505092915050565b5f81519050612f408161267a565b92915050565b5f60208284031215612f5b57612f5a612453565b5b5f612f6884828501612f32565b91505092915050565b7f496e73756666696369656e7420746f6b656e2062616c616e63650000000000005f82015250565b5f612fa5601a836128d0565b9150612fb082612f71565b602082019050919050565b5f6020820190508181035f830152612fd281612f99565b9050919050565b5f604082019050612fec5f8301856126cf565b612ff960208301846128a8565b9392505050565b7f496e73756666696369656e7420574554482062616c616e6365000000000000005f82015250565b5f6130346019836128d0565b915061303f82613000565b602082019050919050565b5f6020820190508181035f83015261306181613028565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61309f82612671565b91506130aa83612671565b9250826130ba576130b9613068565b5b828204905092915050565b5f602082840312156130da576130d9612453565b5b5f6130e784828501612b60565b91505092915050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112613118576131176130f0565b5b80840192508235915067ffffffffffffffff82111561313a576131396130f4565b5b602083019250600182023603831315613156576131556130f8565b5b509250929050565b7f496e76616c69642074696d657374616d700000000000000000000000000000005f82015250565b5f6131926011836128d0565b915061319d8261315e565b602082019050919050565b5f6020820190508181035f8301526131bf81613186565b9050919050565b7f496e76616c69642073616c7420646174610000000000000000000000000000005f82015250565b5f6131fa6011836128d0565b9150613205826131c6565b602082019050919050565b5f6020820190508181035f830152613227816131ee565b9050919050565b7f496e76616c6964206665650000000000000000000000000000000000000000005f82015250565b5f613262600b836128d0565b915061326d8261322e565b602082019050919050565b5f6020820190508181035f83015261328f81613256565b9050919050565b5f6132a082612671565b91506132ab83612671565b92508282026132b981612671565b915082820484148315176132d0576132cf612c8f565b5b5092915050565b5f6132e182612671565b91506132ec83612671565b925082820390508181111561330457613303612c8f565b5b92915050565b7f496e76616c69642061646472657373206c656e677468000000000000000000005f82015250565b5f61333e6016836128d0565b91506133498261330a565b602082019050919050565b5f6020820190508181035f83015261336b81613332565b9050919050565b5f61337c82612507565b915061338783612507565b925082820261339581612507565b915082820484148315176133ac576133ab612c8f565b5b5092915050565b5f60ff82169050919050565b5f6133c9826133b3565b91506133d4836133b3565b9250828203905060ff8111156133ed576133ec612c8f565b5b92915050565b5f6133fd82612507565b915061340883612507565b9250828201905073ffffffffffffffffffffffffffffffffffffffff81111561343457613433612c8f565b5b92915050565b5f61344482612671565b915061344f83612671565b925082820190508082111561346757613466612c8f565b5b9291505056fea26469706673582212203bb53d93e91cf2548b6028130a15619eb25cdc5f4776242a90e8d252c8d98cfb64736f6c634300081a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000006728e8a26bc853b6cb20a59bf254434ea5bc93d8000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad3800000000000000000000000002a5e058bbfc96ae09f032066a43d82e2f00617000000000000000000000000092eed0282c6665c9bcc81605a13a5c3b1e4dc7f2000000000000000000000000aa63811655645f1d8c00271784cfb048eb0f4c33

-----Decoded View---------------
Arg [0] : _EMLTokenAddress (address): 0x6728e8a26BC853B6cb20a59bf254434ea5bC93d8
Arg [1] : _wethAddress (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
Arg [2] : _devAddress (address): 0x02a5E058bBFC96ae09f032066A43D82e2f006170
Arg [3] : _initialOwner (address): 0x92eED0282c6665c9bcc81605A13a5C3b1E4Dc7F2
Arg [4] : _validatorFactory (address): 0xAa63811655645f1d8c00271784CfB048eB0F4C33

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000006728e8a26bc853b6cb20a59bf254434ea5bc93d8
Arg [1] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Arg [2] : 00000000000000000000000002a5e058bbfc96ae09f032066a43d82e2f006170
Arg [3] : 00000000000000000000000092eed0282c6665c9bcc81605a13a5c3b1e4dc7f2
Arg [4] : 000000000000000000000000aa63811655645f1d8c00271784cfb048eb0f4c33


Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.