Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 5 from a total of 5 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
Contract Source Code (Solidity Standard Json-Input format)
// 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 {} }
// 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; } }
// 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; } }
// 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); }
// 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); }
// 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); }
// 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(); } } }
// 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); }
// 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; } }
// 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); } }
// 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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; library Errors { error InsufficientBalance(uint256 balance, uint256 needed); error FailedCall(); error FailedDeployment(); error MissingPrecompile(address); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "remappings": [] }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.