ETH Price: $3,097.37 (-0.01%)

Contract

0x323798df70fD8fA12b8FD84270c0E4dbb6fc554e
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve212149472024-11-18 13:37:115 hrs ago1731937031IN
0x323798df...bb6fc554e
0 ETH0.0007046314.97144092
Approve211952002024-11-15 19:32:233 days ago1731699143IN
0x323798df...bb6fc554e
0 ETH0.0007689716.33858192
Approve211835952024-11-14 4:38:114 days ago1731559091IN
0x323798df...bb6fc554e
0 ETH0.0013853529.47251132
Approve211707292024-11-12 9:32:596 days ago1731403979IN
0x323798df...bb6fc554e
0 ETH0.0019346141.10515676
Approve211670282024-11-11 21:08:236 days ago1731359303IN
0x323798df...bb6fc554e
0 ETH0.0018792639.92910578
Approve211659312024-11-11 17:27:597 days ago1731346079IN
0x323798df...bb6fc554e
0 ETH0.0025729854.73863206
Approve211637112024-11-11 10:01:357 days ago1731319295IN
0x323798df...bb6fc554e
0 ETH0.0008748618.58841168
Approve211625242024-11-11 6:03:237 days ago1731305003IN
0x323798df...bb6fc554e
0 ETH0.0010184821.66767188
Approve211600432024-11-10 21:45:117 days ago1731275111IN
0x323798df...bb6fc554e
0 ETH0.0009908221.05232207
Transfer211600372024-11-10 21:43:597 days ago1731275039IN
0x323798df...bb6fc554e
0 ETH0.0011140920.34202756
Approve211543482024-11-10 2:42:118 days ago1731206531IN
0x323798df...bb6fc554e
0 ETH0.000393848.37869329
Approve211466792024-11-09 1:02:359 days ago1731114155IN
0x323798df...bb6fc554e
0 ETH0.0005702612.11643746
Approve211466792024-11-09 1:02:359 days ago1731114155IN
0x323798df...bb6fc554e
0 ETH0.0005702612.11643746
Approve211441452024-11-08 16:33:4710 days ago1731083627IN
0x323798df...bb6fc554e
0 ETH0.0010764122.9
Approve211392822024-11-08 0:14:4710 days ago1731024887IN
0x323798df...bb6fc554e
0 ETH0.0011274123.9544031
Approve211385732024-11-07 21:52:1110 days ago1731016331IN
0x323798df...bb6fc554e
0 ETH0.0008771218.75117916
Approve211385592024-11-07 21:49:2310 days ago1731016163IN
0x323798df...bb6fc554e
0 ETH0.0009261419.79401626
Approve211297512024-11-06 16:18:1112 days ago1730909891IN
0x323798df...bb6fc554e
0 ETH0.0008323317.70728962
Approve211297392024-11-06 16:15:4712 days ago1730909747IN
0x323798df...bb6fc554e
0 ETH0.0008995419.13728512
Approve211296012024-11-06 15:47:5912 days ago1730908079IN
0x323798df...bb6fc554e
0 ETH0.0007600928.01773683
Approve211296002024-11-06 15:47:4712 days ago1730908067IN
0x323798df...bb6fc554e
0 ETH0.0013108427.87310222
Approve211293892024-11-06 15:05:3512 days ago1730905535IN
0x323798df...bb6fc554e
0 ETH0.0010909323.2089303
Approve211292482024-11-06 14:37:1112 days ago1730903831IN
0x323798df...bb6fc554e
0 ETH0.0010001821.27826343
Approve211292372024-11-06 14:34:5912 days ago1730903699IN
0x323798df...bb6fc554e
0 ETH0.0009550820.29282597
Approve211292362024-11-06 14:34:3512 days ago1730903675IN
0x323798df...bb6fc554e
0 ETH0.0009917321.07157439
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Unibridge

Compiler Version
v0.8.27+commit.40a35a09

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion
File 1 of 9 : Unibridge.sol
// SPDX-License-Identifier: MIT
// https://unibridge.fi

pragma solidity ^0.8.0;

import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol';
import '@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol';
import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol';
import 'solmate/src/tokens/ERC20.sol';
import 'solmate/src/utils/SafeTransferLib.sol';
import 'solmate/src/auth/Owned.sol';
import 'solmate/src/tokens/WETH.sol';

enum TRANSFER_TYPE {
  BUY,
  SELL,
  TRANSFER
}

contract Unibridge is ERC20, Owned {
  using SafeTransferLib for ERC20;

  modifier checkTaxes(uint256 _tax) {
    if (_tax > maxTax) revert TaxTooHigh();
    _;
  }

  modifier onlyAllowed() {
    if (msg.sender != deployer && msg.sender != owner) revert NotAllowed();
    _;
  }

  error NotTrading();
  error TaxTooHigh();
  error NotAllowed();
  error InvalidAddress();

  IUniswapV2Router02 internal constant router =
    IUniswapV2Router02(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
  WETH internal immutable weth;

  IUniswapV2Factory internal immutable factory;
  IUniswapV2Pair public immutable pair;

  address internal immutable deployer;
  address public treasury;

  uint256 public constant TOTAL_SUPPLY = 10_000_000 ether;
  uint256 internal constant MAX_SELL_CHUNK = TOTAL_SUPPLY / 100;

  uint256 public maxTax = 300;
  uint256 public buyTax = 50;
  uint256 public sellTax = 50;
  bool public tradingEnabled;

  constructor(
    string memory _name,
    string memory _symbol
  ) ERC20(_name, _symbol, 18) Owned(msg.sender) {
    weth = WETH(payable(router.WETH()));
    factory = IUniswapV2Factory(router.factory());
    pair = IUniswapV2Pair(factory.createPair(address(this), address(weth)));
    _mint(msg.sender, TOTAL_SUPPLY);
    approve(address(router), type(uint256).max);
    approve(address(this), type(uint256).max);
    deployer = msg.sender;
  }

  function setBuyTax(uint256 _tax) external onlyOwner checkTaxes(_tax) {
    buyTax = _tax;
  }

  function setSellTax(uint256 _tax) external onlyOwner checkTaxes(_tax) {
    sellTax = _tax;
  }

  function enableTrading() external onlyOwner() {
    tradingEnabled = true;
  }

  function setTreasury(address _treasury) external onlyAllowed {
    treasury = _treasury;
  }

  function _transferHook(
    address from,
    address to,
    uint256 amount
  ) internal override returns (uint256) {
    (bool allowed, TRANSFER_TYPE transferType, bool skipTax) = _isAllowedToTrade(from, to, amount);

    if (!allowed) revert NotTrading();

    if (transferType == TRANSFER_TYPE.BUY && !skipTax) {
      uint256 tax = (amount * buyTax) / 1000;
      amount -= tax;
      balanceOf[address(this)] += tax;
    } else if (transferType == TRANSFER_TYPE.SELL) {
      if (!skipTax) {
        uint256 tax = (amount * sellTax) / 1000;
        amount -= tax;
        balanceOf[address(this)] += tax;
      }
      _sellChunk();
    }

    return amount;
  }

  function _isAllowedToTrade(
    address _from,
    address _to,
    uint256 _amount
  ) internal view returns (bool allowed, TRANSFER_TYPE transferType, bool skipTax) {
    if (_from == deployer || _from == owner || _from == treasury || _from == address(this))
      return (true, TRANSFER_TYPE.TRANSFER, true);
    if (_to == deployer || _to == owner || _to == treasury || _to == address(this))
      return (true, TRANSFER_TYPE.TRANSFER, true);

    if (!tradingEnabled) return (false, TRANSFER_TYPE.TRANSFER, false);

    TRANSFER_TYPE transferType = _from == address(pair) ? TRANSFER_TYPE.BUY : _to == address(pair) ? TRANSFER_TYPE.SELL : TRANSFER_TYPE.TRANSFER;
    return (
      true,
      transferType,
      (transferType == TRANSFER_TYPE.TRANSFER) ? true : false
    );
  }

  function _sellChunk() internal {
    allowance[address(this)][address(router)] = type(uint256).max;
    uint256 balance = balanceOf[address(this)];
    if (balance > MAX_SELL_CHUNK) balance = MAX_SELL_CHUNK;
    if (balance == 0) return;

    address[] memory path = new address[](2);
    path[0] = address(this);
    path[1] = address(weth);

    router.swapExactTokensForETHSupportingFeeOnTransferTokens(
      balance,
      0,
      path,
      treasury,
      block.timestamp
    );
  }
}

File 2 of 9 : IUniswapV2Factory.sol
pragma solidity >=0.5.0;

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint);

    function feeTo() external view returns (address);
    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function allPairs(uint) external view returns (address pair);
    function allPairsLength() external view returns (uint);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;
    function setFeeToSetter(address) external;
}

File 3 of 9 : IUniswapV2Pair.sol
pragma solidity >=0.5.0;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint value);
    event Transfer(address indexed from, address indexed to, uint value);

    function name() external pure returns (string memory);
    function symbol() external pure returns (string memory);
    function decimals() external pure returns (uint8);
    function totalSupply() external view returns (uint);
    function balanceOf(address owner) external view returns (uint);
    function allowance(address owner, address spender) external view returns (uint);

    function approve(address spender, uint value) external returns (bool);
    function transfer(address to, uint value) external returns (bool);
    function transferFrom(address from, address to, uint value) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external pure returns (bytes32);
    function nonces(address owner) external view returns (uint);

    function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;

    event Mint(address indexed sender, uint amount0, uint amount1);
    event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint amount0In,
        uint amount1In,
        uint amount0Out,
        uint amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint);
    function factory() external view returns (address);
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function price0CumulativeLast() external view returns (uint);
    function price1CumulativeLast() external view returns (uint);
    function kLast() external view returns (uint);

    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
    function skim(address to) external;
    function sync() external;

    function initialize(address, address) external;
}

File 4 of 9 : IUniswapV2Router01.sol
pragma solidity >=0.6.2;

interface IUniswapV2Router01 {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    function addLiquidityETH(
        address token,
        uint amountTokenDesired,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETH(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountToken, uint amountETH);
    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountA, uint amountB);
    function removeLiquidityETHWithPermit(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountToken, uint amountETH);
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapTokensForExactTokens(
        uint amountOut,
        uint amountInMax,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);
    function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
        external
        returns (uint[] memory amounts);
    function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
        external
        payable
        returns (uint[] memory amounts);

    function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
    function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}

File 5 of 9 : IUniswapV2Router02.sol
pragma solidity >=0.6.2;

import './IUniswapV2Router01.sol';

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline
    ) external returns (uint amountETH);
    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint liquidity,
        uint amountTokenMin,
        uint amountETHMin,
        address to,
        uint deadline,
        bool approveMax, uint8 v, bytes32 r, bytes32 s
    ) external returns (uint amountETH);

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

File 6 of 9 : Owned.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Simple single owner authorization mixin.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/auth/Owned.sol)
abstract contract Owned {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

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

    /*//////////////////////////////////////////////////////////////
                            OWNERSHIP STORAGE
    //////////////////////////////////////////////////////////////*/

    address public owner;

    modifier onlyOwner() virtual {
        require(msg.sender == owner, "UNAUTHORIZED");

        _;
    }

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(address _owner) {
        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    /*//////////////////////////////////////////////////////////////
                             OWNERSHIP LOGIC
    //////////////////////////////////////////////////////////////*/

    function transferOwnership(address newOwner) public virtual onlyOwner {
        owner = newOwner;

        emit OwnershipTransferred(msg.sender, newOwner);
    }
}

File 7 of 9 : ERC20.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;
        amount = _transferHook(msg.sender, to, amount);

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function _transferHook(address from, address to, uint256 amount) internal virtual returns (uint256 amountTo) {
        return amount;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
        balanceOf[from] -= amount;
        amount = _transferHook(from, to, amount);

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

File 8 of 9 : WETH.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "./ERC20.sol";

import {SafeTransferLib} from "../utils/SafeTransferLib.sol";

/// @notice Minimalist and modern Wrapped Ether implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/WETH.sol)
/// @author Inspired by WETH9 (https://github.com/dapphub/ds-weth/blob/master/src/weth9.sol)
contract WETH is ERC20("Wrapped Ether", "WETH", 18) {
    using SafeTransferLib for address;

    event Deposit(address indexed from, uint256 amount);

    event Withdrawal(address indexed to, uint256 amount);

    function deposit() public payable virtual {
        _mint(msg.sender, msg.value);

        emit Deposit(msg.sender, msg.value);
    }

    function withdraw(uint256 amount) public virtual {
        _burn(msg.sender, amount);

        emit Withdrawal(msg.sender, amount);

        msg.sender.safeTransferETH(amount);
    }

    receive() external payable virtual {
        deposit();
    }
}

File 9 of 9 : SafeTransferLib.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
/// @dev Note that none of the functions in this library check that a token has code at all! That responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because the length of our calldata totals up like so: 4 + 32 * 3.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 100, 0, 32)
            )
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        /// @solidity memory-safe-assembly
        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Append and mask the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Append the "amount" argument. Masking not required as it's a full 32 byte type.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because the length of our calldata totals up like so: 4 + 32 * 2.
                // We use 0 and 32 to copy up to 32 bytes of return data into the scratch space.
                // Counterintuitively, this call must be positioned second to the or() call in the
                // surrounding and() call or else returndatasize() will be zero during the computation.
                call(gas(), token, 0, freeMemoryPointer, 68, 0, 32)
            )
        }

        require(success, "APPROVE_FAILED");
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"NotAllowed","type":"error"},{"inputs":[],"name":"NotTrading","type":"error"},{"inputs":[],"name":"TaxTooHigh","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

61016060405261012c60085560326009556032600a5534801561002157600080fd5b506040516136fc3803806136fc833981810160405281019061004391906107e7565b338282601282600090816100579190610a80565b5081600190816100679190610a80565b508060ff1660808160ff16815250504660a0818152505061008c61042460201b60201c565b60c0818152505050505080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101b69190610bb0565b73ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610248573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026c9190610bb0565b73ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff16815250506101005173ffffffffffffffffffffffffffffffffffffffff1663c9c653963060e0516040518363ffffffff1660e01b81526004016102e0929190610bec565b6020604051808303816000875af11580156102ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103239190610bb0565b73ffffffffffffffffffffffffffffffffffffffff166101208173ffffffffffffffffffffffffffffffffffffffff1681525050610372336a084595161401484a0000006104b060201b60201c565b6103b6737a250d5630b4cf539739df2c5dacb4c659f2488d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61058060201b60201c565b506103e7307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61058060201b60201c565b503373ffffffffffffffffffffffffffffffffffffffff166101408173ffffffffffffffffffffffffffffffffffffffff16815250505050610dc8565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516104569190610cb8565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc64630604051602001610495959493929190610cf7565b60405160208183030381529060405280519060200120905090565b80600260008282546104c29190610d79565b9250508190555080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516105749190610dad565b60405180910390a35050565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516106609190610dad565b60405180910390a36001905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6106d982610690565b810181811067ffffffffffffffff821117156106f8576106f76106a1565b5b80604052505050565b600061070b610672565b905061071782826106d0565b919050565b600067ffffffffffffffff821115610737576107366106a1565b5b61074082610690565b9050602081019050919050565b60005b8381101561076b578082015181840152602081019050610750565b60008484015250505050565b600061078a6107858461071c565b610701565b9050828152602081018484840111156107a6576107a561068b565b5b6107b184828561074d565b509392505050565b600082601f8301126107ce576107cd610686565b5b81516107de848260208601610777565b91505092915050565b600080604083850312156107fe576107fd61067c565b5b600083015167ffffffffffffffff81111561081c5761081b610681565b5b610828858286016107b9565b925050602083015167ffffffffffffffff81111561084957610848610681565b5b610855858286016107b9565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806108b157607f821691505b6020821081036108c4576108c361086a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261092c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826108ef565b61093686836108ef565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600061097d6109786109738461094e565b610958565b61094e565b9050919050565b6000819050919050565b61099783610962565b6109ab6109a382610984565b8484546108fc565b825550505050565b600090565b6109c06109b3565b6109cb81848461098e565b505050565b5b818110156109ef576109e46000826109b8565b6001810190506109d1565b5050565b601f821115610a3457610a05816108ca565b610a0e846108df565b81016020851015610a1d578190505b610a31610a29856108df565b8301826109d0565b50505b505050565b600082821c905092915050565b6000610a5760001984600802610a39565b1980831691505092915050565b6000610a708383610a46565b9150826002028217905092915050565b610a898261085f565b67ffffffffffffffff811115610aa257610aa16106a1565b5b610aac8254610899565b610ab78282856109f3565b600060209050601f831160018114610aea5760008415610ad8578287015190505b610ae28582610a64565b865550610b4a565b601f198416610af8866108ca565b60005b82811015610b2057848901518255600182019150602085019450602081019050610afb565b86831015610b3d5784890151610b39601f891682610a46565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b7d82610b52565b9050919050565b610b8d81610b72565b8114610b9857600080fd5b50565b600081519050610baa81610b84565b92915050565b600060208284031215610bc657610bc561067c565b5b6000610bd484828501610b9b565b91505092915050565b610be681610b72565b82525050565b6000604082019050610c016000830185610bdd565b610c0e6020830184610bdd565b9392505050565b600081905092915050565b60008190508160005260206000209050919050565b60008154610c4281610899565b610c4c8186610c15565b94506001821660008114610c675760018114610c7c57610caf565b60ff1983168652811515820286019350610caf565b610c8585610c20565b60005b83811015610ca757815481890152600182019150602081019050610c88565b838801955050505b50505092915050565b6000610cc48284610c35565b915081905092915050565b6000819050919050565b610ce281610ccf565b82525050565b610cf18161094e565b82525050565b600060a082019050610d0c6000830188610cd9565b610d196020830187610cd9565b610d266040830186610cd9565b610d336060830185610ce8565b610d406080830184610bdd565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610d848261094e565b9150610d8f8361094e565b9250828201905080821115610da757610da6610d4a565b5b92915050565b6000602082019050610dc26000830184610ce8565b92915050565b60805160a05160c05160e0516101005161012051610140516128c1610e3b60003960008181611112015281816115d1015261171c015260008181610bd10152818161188e01526118e10152600050506000611b6f015260006108ed015260006108b90152600061089301526128c16000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80638a8c523c116100de578063a9059cbb11610097578063dc1052e211610071578063dc1052e214610430578063dd62ed3e1461044c578063f0f442601461047c578063f2fde38b1461049857610173565b8063a9059cbb146103c6578063cc1776d3146103f6578063d505accf1461041457610173565b80638a8c523c146103285780638cd09d50146103325780638da5cb5b1461034e578063902d55a51461036c57806395d89b411461038a578063a8aa1b31146103a857610173565b80634ada218b116101305780634ada218b146102505780634f7041a51461026e57806361d027b31461028c5780636d8813c5146102aa57806370a08231146102c85780637ecebe00146102f857610173565b806306fdde0314610178578063095ea7b31461019657806318160ddd146101c657806323b872dd146101e4578063313ce567146102145780633644e51514610232575b600080fd5b6101806104b4565b60405161018d9190611d1b565b60405180910390f35b6101b060048036038101906101ab9190611dd6565b610542565b6040516101bd9190611e31565b60405180910390f35b6101ce610634565b6040516101db9190611e5b565b60405180910390f35b6101fe60048036038101906101f99190611e76565b61063a565b60405161020b9190611e31565b60405180910390f35b61021c610891565b6040516102299190611ee5565b60405180910390f35b61023a6108b5565b6040516102479190611f19565b60405180910390f35b610258610912565b6040516102659190611e31565b60405180910390f35b610276610925565b6040516102839190611e5b565b60405180910390f35b61029461092b565b6040516102a19190611f43565b60405180910390f35b6102b2610951565b6040516102bf9190611e5b565b60405180910390f35b6102e260048036038101906102dd9190611f5e565b610957565b6040516102ef9190611e5b565b60405180910390f35b610312600480360381019061030d9190611f5e565b61096f565b60405161031f9190611e5b565b60405180910390f35b610330610987565b005b61034c60048036038101906103479190611f8b565b610a34565b005b610356610b0c565b6040516103639190611f43565b60405180910390f35b610374610b32565b6040516103819190611e5b565b60405180910390f35b610392610b41565b60405161039f9190611d1b565b60405180910390f35b6103b0610bcf565b6040516103bd9190612017565b60405180910390f35b6103e060048036038101906103db9190611dd6565b610bf3565b6040516103ed9190611e31565b60405180910390f35b6103fe610d14565b60405161040b9190611e5b565b60405180910390f35b61042e6004803603810190610429919061208a565b610d1a565b005b61044a60048036038101906104459190611f8b565b611013565b005b6104666004803603810190610461919061212c565b6110eb565b6040516104739190611e5b565b60405180910390f35b61049660048036038101906104919190611f5e565b611110565b005b6104b260048036038101906104ad9190611f5e565b611235565b005b600080546104c19061219b565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed9061219b565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516106229190611e5b565b60405180910390a36001905092915050565b60025481565b600080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107705782816106ef91906121fb565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546107bf91906121fb565b925050819055506107d1858585611363565b925082600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161087d9190611e5b565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000046146108eb576108e661153e565b61090d565b7f00000000000000000000000000000000000000000000000000000000000000005b905090565b600b60009054906101000a900460ff1681565b60095481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60036020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0e9061227b565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abb9061227b565b60405180910390fd5b80600854811115610b01576040517faf1ee13400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600a819055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6a084595161401484a00000081565b60018054610b4e9061219b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7a9061219b565b8015610bc75780601f10610b9c57610100808354040283529160200191610bc7565b820191906000526020600020905b815481529060010190602001808311610baa57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c4491906121fb565b92505081905550610c56338484611363565b915081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d029190611e5b565b60405180910390a36001905092915050565b600a5481565b42841015610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d54906122e7565b60405180910390fd5b60006001610d696108b5565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a600560008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558b604051602001610df196959493929190612307565b60405160208183030381529060405280519060200120604051602001610e189291906123e0565b6040516020818303038152906040528051906020012085858560405160008152602001604052604051610e4e9493929190612417565b6020604051602081039080840390855afa158015610e70573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ee457508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a906124a8565b60405180910390fd5b85600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925876040516110029190611e5b565b60405180910390a350505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a9061227b565b60405180910390fd5b806008548111156110e0576040517faf1ee13400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816009819055505050565b6004602052816000526040600020602052806000526040600020600091509150505481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156111ba5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156111f1576040517f3d693ada00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc9061227b565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000806000806113748787876115ca565b925092509250826113b1576040517f0bc3bfc600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028111156113c5576113c46124c8565b5b8260028111156113d8576113d76124c8565b5b1480156113e3575080155b156114715760006103e8600954876113fb91906124f7565b6114059190612568565b9050808661141391906121fb565b955080600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114649190612599565b9250508190555050611531565b60016002811115611485576114846124c8565b5b826002811115611498576114976124c8565b5b0361153057806115275760006103e8600a54876114b591906124f7565b6114bf9190612568565b905080866114cd91906121fb565b955080600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461151e9190612599565b92505081905550505b61152f61198f565b5b5b8493505050509392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516115709190612670565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016115af959493929190612687565b60405160208183030381529060405280519060200120905090565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614806116765750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b806116ce5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b8061170457503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b1561171a57600160026001925092509250611986565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806117c15750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b806118195750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b8061184f57503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b1561186557600160026001925092509250611986565b600b60009054906101000a900460ff1661188a57600060026000925092509250611986565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611941577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461193957600261193c565b60015b611944565b60005b905060018160028081111561195c5761195b6124c8565b5b83600281111561196f5761196e6124c8565b5b1461197b57600061197e565b60015b935093509350505b93509350939050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060646a084595161401484a000000611aa09190612568565b811115611ac25760646a084595161401484a000000611abf9190612568565b90505b60008103611ad05750611c89565b6000600267ffffffffffffffff811115611aed57611aec6126da565b5b604051908082528060200260200182016040528015611b1b5781602001602082028036833780820191505090505b5090503081600081518110611b3357611b32612709565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611ba257611ba1612709565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611c54959493929190612831565b600060405180830381600087803b158015611c6e57600080fd5b505af1158015611c82573d6000803e3d6000fd5b5050505050505b565b600081519050919050565b600082825260208201905092915050565b60005b83811015611cc5578082015181840152602081019050611caa565b60008484015250505050565b6000601f19601f8301169050919050565b6000611ced82611c8b565b611cf78185611c96565b9350611d07818560208601611ca7565b611d1081611cd1565b840191505092915050565b60006020820190508181036000830152611d358184611ce2565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d6d82611d42565b9050919050565b611d7d81611d62565b8114611d8857600080fd5b50565b600081359050611d9a81611d74565b92915050565b6000819050919050565b611db381611da0565b8114611dbe57600080fd5b50565b600081359050611dd081611daa565b92915050565b60008060408385031215611ded57611dec611d3d565b5b6000611dfb85828601611d8b565b9250506020611e0c85828601611dc1565b9150509250929050565b60008115159050919050565b611e2b81611e16565b82525050565b6000602082019050611e466000830184611e22565b92915050565b611e5581611da0565b82525050565b6000602082019050611e706000830184611e4c565b92915050565b600080600060608486031215611e8f57611e8e611d3d565b5b6000611e9d86828701611d8b565b9350506020611eae86828701611d8b565b9250506040611ebf86828701611dc1565b9150509250925092565b600060ff82169050919050565b611edf81611ec9565b82525050565b6000602082019050611efa6000830184611ed6565b92915050565b6000819050919050565b611f1381611f00565b82525050565b6000602082019050611f2e6000830184611f0a565b92915050565b611f3d81611d62565b82525050565b6000602082019050611f586000830184611f34565b92915050565b600060208284031215611f7457611f73611d3d565b5b6000611f8284828501611d8b565b91505092915050565b600060208284031215611fa157611fa0611d3d565b5b6000611faf84828501611dc1565b91505092915050565b6000819050919050565b6000611fdd611fd8611fd384611d42565b611fb8565b611d42565b9050919050565b6000611fef82611fc2565b9050919050565b600061200182611fe4565b9050919050565b61201181611ff6565b82525050565b600060208201905061202c6000830184612008565b92915050565b61203b81611ec9565b811461204657600080fd5b50565b60008135905061205881612032565b92915050565b61206781611f00565b811461207257600080fd5b50565b6000813590506120848161205e565b92915050565b600080600080600080600060e0888a0312156120a9576120a8611d3d565b5b60006120b78a828b01611d8b565b97505060206120c88a828b01611d8b565b96505060406120d98a828b01611dc1565b95505060606120ea8a828b01611dc1565b94505060806120fb8a828b01612049565b93505060a061210c8a828b01612075565b92505060c061211d8a828b01612075565b91505092959891949750929550565b6000806040838503121561214357612142611d3d565b5b600061215185828601611d8b565b925050602061216285828601611d8b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806121b357607f821691505b6020821081036121c6576121c561216c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061220682611da0565b915061221183611da0565b9250828203905081811115612229576122286121cc565b5b92915050565b7f554e415554484f52495a45440000000000000000000000000000000000000000600082015250565b6000612265600c83611c96565b91506122708261222f565b602082019050919050565b6000602082019050818103600083015261229481612258565b9050919050565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b60006122d1601783611c96565b91506122dc8261229b565b602082019050919050565b60006020820190508181036000830152612300816122c4565b9050919050565b600060c08201905061231c6000830189611f0a565b6123296020830188611f34565b6123366040830187611f34565b6123436060830186611e4c565b6123506080830185611e4c565b61235d60a0830184611e4c565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006123a9600283612368565b91506123b482612373565b600282019050919050565b6000819050919050565b6123da6123d582611f00565b6123bf565b82525050565b60006123eb8261239c565b91506123f782856123c9565b60208201915061240782846123c9565b6020820191508190509392505050565b600060808201905061242c6000830187611f0a565b6124396020830186611ed6565b6124466040830185611f0a565b6124536060830184611f0a565b95945050505050565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b6000612492600e83611c96565b915061249d8261245c565b602082019050919050565b600060208201905081810360008301526124c181612485565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600061250282611da0565b915061250d83611da0565b925082820261251b81611da0565b91508282048414831517612532576125316121cc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061257382611da0565b915061257e83611da0565b92508261258e5761258d612539565b5b828204905092915050565b60006125a482611da0565b91506125af83611da0565b92508282019050808211156125c7576125c66121cc565b5b92915050565b600081905092915050565b60008190508160005260206000209050919050565b600081546125fa8161219b565b61260481866125cd565b9450600182166000811461261f576001811461263457612667565b60ff1983168652811515820286019350612667565b61263d856125d8565b60005b8381101561265f57815481890152600182019150602081019050612640565b838801955050505b50505092915050565b600061267c82846125ed565b915081905092915050565b600060a08201905061269c6000830188611f0a565b6126a96020830187611f0a565b6126b66040830186611f0a565b6126c36060830185611e4c565b6126d06080830184611f34565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061275d61275861275384612738565b611fb8565b611da0565b9050919050565b61276d81612742565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127a881611d62565b82525050565b60006127ba838361279f565b60208301905092915050565b6000602082019050919050565b60006127de82612773565b6127e8818561277e565b93506127f38361278f565b8060005b8381101561282457815161280b88826127ae565b9750612816836127c6565b9250506001810190506127f7565b5085935050505092915050565b600060a0820190506128466000830188611e4c565b6128536020830187612764565b818103604083015261286581866127d3565b90506128746060830185611f34565b6128816080830184611e4c565b969550505050505056fea2646970667358221220c07cba8a4fc40133b4867d29ad25e71c58ae1241bb4fac822bb2e25e6f54155964736f6c634300081b0033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000009556e6962726964676500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004554e494200000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101735760003560e01c80638a8c523c116100de578063a9059cbb11610097578063dc1052e211610071578063dc1052e214610430578063dd62ed3e1461044c578063f0f442601461047c578063f2fde38b1461049857610173565b8063a9059cbb146103c6578063cc1776d3146103f6578063d505accf1461041457610173565b80638a8c523c146103285780638cd09d50146103325780638da5cb5b1461034e578063902d55a51461036c57806395d89b411461038a578063a8aa1b31146103a857610173565b80634ada218b116101305780634ada218b146102505780634f7041a51461026e57806361d027b31461028c5780636d8813c5146102aa57806370a08231146102c85780637ecebe00146102f857610173565b806306fdde0314610178578063095ea7b31461019657806318160ddd146101c657806323b872dd146101e4578063313ce567146102145780633644e51514610232575b600080fd5b6101806104b4565b60405161018d9190611d1b565b60405180910390f35b6101b060048036038101906101ab9190611dd6565b610542565b6040516101bd9190611e31565b60405180910390f35b6101ce610634565b6040516101db9190611e5b565b60405180910390f35b6101fe60048036038101906101f99190611e76565b61063a565b60405161020b9190611e31565b60405180910390f35b61021c610891565b6040516102299190611ee5565b60405180910390f35b61023a6108b5565b6040516102479190611f19565b60405180910390f35b610258610912565b6040516102659190611e31565b60405180910390f35b610276610925565b6040516102839190611e5b565b60405180910390f35b61029461092b565b6040516102a19190611f43565b60405180910390f35b6102b2610951565b6040516102bf9190611e5b565b60405180910390f35b6102e260048036038101906102dd9190611f5e565b610957565b6040516102ef9190611e5b565b60405180910390f35b610312600480360381019061030d9190611f5e565b61096f565b60405161031f9190611e5b565b60405180910390f35b610330610987565b005b61034c60048036038101906103479190611f8b565b610a34565b005b610356610b0c565b6040516103639190611f43565b60405180910390f35b610374610b32565b6040516103819190611e5b565b60405180910390f35b610392610b41565b60405161039f9190611d1b565b60405180910390f35b6103b0610bcf565b6040516103bd9190612017565b60405180910390f35b6103e060048036038101906103db9190611dd6565b610bf3565b6040516103ed9190611e31565b60405180910390f35b6103fe610d14565b60405161040b9190611e5b565b60405180910390f35b61042e6004803603810190610429919061208a565b610d1a565b005b61044a60048036038101906104459190611f8b565b611013565b005b6104666004803603810190610461919061212c565b6110eb565b6040516104739190611e5b565b60405180910390f35b61049660048036038101906104919190611f5e565b611110565b005b6104b260048036038101906104ad9190611f5e565b611235565b005b600080546104c19061219b565b80601f01602080910402602001604051908101604052809291908181526020018280546104ed9061219b565b801561053a5780601f1061050f5761010080835404028352916020019161053a565b820191906000526020600020905b81548152906001019060200180831161051d57829003601f168201915b505050505081565b600081600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516106229190611e5b565b60405180910390a36001905092915050565b60025481565b600080600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107705782816106ef91906121fb565b600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b82600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546107bf91906121fb565b925050819055506107d1858585611363565b925082600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8560405161087d9190611e5b565b60405180910390a360019150509392505050565b7f000000000000000000000000000000000000000000000000000000000000001281565b60007f000000000000000000000000000000000000000000000000000000000000000146146108eb576108e661153e565b61090d565b7fdeecd0a61b49202723b5def5e1524027535e229554ef7f1985e24e6e9c8440c25b905090565b600b60009054906101000a900460ff1681565b60095481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b60036020528060005260406000206000915090505481565b60056020528060005260406000206000915090505481565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0e9061227b565b60405180910390fd5b6001600b60006101000a81548160ff021916908315150217905550565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ac4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abb9061227b565b60405180910390fd5b80600854811115610b01576040517faf1ee13400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600a819055505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6a084595161401484a00000081565b60018054610b4e9061219b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7a9061219b565b8015610bc75780601f10610b9c57610100808354040283529160200191610bc7565b820191906000526020600020905b815481529060010190602001808311610baa57829003601f168201915b505050505081565b7f0000000000000000000000003d06dc9459779a298913ef23eb0754ad1443810381565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610c4491906121fb565b92505081905550610c56338484611363565b915081600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d029190611e5b565b60405180910390a36001905092915050565b600a5481565b42841015610d5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d54906122e7565b60405180910390fd5b60006001610d696108b5565b7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98a8a8a600560008f73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600101919050558b604051602001610df196959493929190612307565b60405160208183030381529060405280519060200120604051602001610e189291906123e0565b6040516020818303038152906040528051906020012085858560405160008152602001604052604051610e4e9493929190612417565b6020604051602081039080840390855afa158015610e70573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015610ee457508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a906124a8565b60405180910390fd5b85600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925876040516110029190611e5b565b60405180910390a350505050505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146110a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109a9061227b565b60405180910390fd5b806008548111156110e0576040517faf1ee13400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816009819055505050565b6004602052816000526040600020602052806000526040600020600091509150505481565b7f0000000000000000000000004b9a5971e016fd8391fbe86b5ea077e53d889d6273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156111ba5750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b156111f1576040517f3d693ada00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112bc9061227b565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b6000806000806113748787876115ca565b925092509250826113b1576040517f0bc3bfc600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600060028111156113c5576113c46124c8565b5b8260028111156113d8576113d76124c8565b5b1480156113e3575080155b156114715760006103e8600954876113fb91906124f7565b6114059190612568565b9050808661141391906121fb565b955080600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114649190612599565b9250508190555050611531565b60016002811115611485576114846124c8565b5b826002811115611498576114976124c8565b5b0361153057806115275760006103e8600a54876114b591906124f7565b6114bf9190612568565b905080866114cd91906121fb565b955080600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461151e9190612599565b92505081905550505b61152f61198f565b5b5b8493505050509392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60006040516115709190612670565b60405180910390207fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc646306040516020016115af959493929190612687565b60405160208183030381529060405280519060200120905090565b60008060007f0000000000000000000000004b9a5971e016fd8391fbe86b5ea077e53d889d6273ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614806116765750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b806116ce5750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b8061170457503073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b1561171a57600160026001925092509250611986565b7f0000000000000000000000004b9a5971e016fd8391fbe86b5ea077e53d889d6273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806117c15750600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b806118195750600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b8061184f57503073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b1561186557600160026001925092509250611986565b600b60009054906101000a900460ff1661188a57600060026000925092509250611986565b60007f0000000000000000000000003d06dc9459779a298913ef23eb0754ad1443810373ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614611941577f0000000000000000000000003d06dc9459779a298913ef23eb0754ad1443810373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461193957600261193c565b60015b611944565b60005b905060018160028081111561195c5761195b6124c8565b5b83600281111561196f5761196e6124c8565b5b1461197b57600061197e565b60015b935093509350505b93509350939050565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600460003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600360003073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060646a084595161401484a000000611aa09190612568565b811115611ac25760646a084595161401484a000000611abf9190612568565b90505b60008103611ad05750611c89565b6000600267ffffffffffffffff811115611aed57611aec6126da565b5b604051908082528060200260200182016040528015611b1b5781602001602082028036833780820191505090505b5090503081600081518110611b3357611b32612709565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281600181518110611ba257611ba1612709565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050737a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac94783600084600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401611c54959493929190612831565b600060405180830381600087803b158015611c6e57600080fd5b505af1158015611c82573d6000803e3d6000fd5b5050505050505b565b600081519050919050565b600082825260208201905092915050565b60005b83811015611cc5578082015181840152602081019050611caa565b60008484015250505050565b6000601f19601f8301169050919050565b6000611ced82611c8b565b611cf78185611c96565b9350611d07818560208601611ca7565b611d1081611cd1565b840191505092915050565b60006020820190508181036000830152611d358184611ce2565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611d6d82611d42565b9050919050565b611d7d81611d62565b8114611d8857600080fd5b50565b600081359050611d9a81611d74565b92915050565b6000819050919050565b611db381611da0565b8114611dbe57600080fd5b50565b600081359050611dd081611daa565b92915050565b60008060408385031215611ded57611dec611d3d565b5b6000611dfb85828601611d8b565b9250506020611e0c85828601611dc1565b9150509250929050565b60008115159050919050565b611e2b81611e16565b82525050565b6000602082019050611e466000830184611e22565b92915050565b611e5581611da0565b82525050565b6000602082019050611e706000830184611e4c565b92915050565b600080600060608486031215611e8f57611e8e611d3d565b5b6000611e9d86828701611d8b565b9350506020611eae86828701611d8b565b9250506040611ebf86828701611dc1565b9150509250925092565b600060ff82169050919050565b611edf81611ec9565b82525050565b6000602082019050611efa6000830184611ed6565b92915050565b6000819050919050565b611f1381611f00565b82525050565b6000602082019050611f2e6000830184611f0a565b92915050565b611f3d81611d62565b82525050565b6000602082019050611f586000830184611f34565b92915050565b600060208284031215611f7457611f73611d3d565b5b6000611f8284828501611d8b565b91505092915050565b600060208284031215611fa157611fa0611d3d565b5b6000611faf84828501611dc1565b91505092915050565b6000819050919050565b6000611fdd611fd8611fd384611d42565b611fb8565b611d42565b9050919050565b6000611fef82611fc2565b9050919050565b600061200182611fe4565b9050919050565b61201181611ff6565b82525050565b600060208201905061202c6000830184612008565b92915050565b61203b81611ec9565b811461204657600080fd5b50565b60008135905061205881612032565b92915050565b61206781611f00565b811461207257600080fd5b50565b6000813590506120848161205e565b92915050565b600080600080600080600060e0888a0312156120a9576120a8611d3d565b5b60006120b78a828b01611d8b565b97505060206120c88a828b01611d8b565b96505060406120d98a828b01611dc1565b95505060606120ea8a828b01611dc1565b94505060806120fb8a828b01612049565b93505060a061210c8a828b01612075565b92505060c061211d8a828b01612075565b91505092959891949750929550565b6000806040838503121561214357612142611d3d565b5b600061215185828601611d8b565b925050602061216285828601611d8b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806121b357607f821691505b6020821081036121c6576121c561216c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061220682611da0565b915061221183611da0565b9250828203905081811115612229576122286121cc565b5b92915050565b7f554e415554484f52495a45440000000000000000000000000000000000000000600082015250565b6000612265600c83611c96565b91506122708261222f565b602082019050919050565b6000602082019050818103600083015261229481612258565b9050919050565b7f5045524d49545f444541444c494e455f45585049524544000000000000000000600082015250565b60006122d1601783611c96565b91506122dc8261229b565b602082019050919050565b60006020820190508181036000830152612300816122c4565b9050919050565b600060c08201905061231c6000830189611f0a565b6123296020830188611f34565b6123366040830187611f34565b6123436060830186611e4c565b6123506080830185611e4c565b61235d60a0830184611e4c565b979650505050505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006123a9600283612368565b91506123b482612373565b600282019050919050565b6000819050919050565b6123da6123d582611f00565b6123bf565b82525050565b60006123eb8261239c565b91506123f782856123c9565b60208201915061240782846123c9565b6020820191508190509392505050565b600060808201905061242c6000830187611f0a565b6124396020830186611ed6565b6124466040830185611f0a565b6124536060830184611f0a565b95945050505050565b7f494e56414c49445f5349474e4552000000000000000000000000000000000000600082015250565b6000612492600e83611c96565b915061249d8261245c565b602082019050919050565b600060208201905081810360008301526124c181612485565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600061250282611da0565b915061250d83611da0565b925082820261251b81611da0565b91508282048414831517612532576125316121cc565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061257382611da0565b915061257e83611da0565b92508261258e5761258d612539565b5b828204905092915050565b60006125a482611da0565b91506125af83611da0565b92508282019050808211156125c7576125c66121cc565b5b92915050565b600081905092915050565b60008190508160005260206000209050919050565b600081546125fa8161219b565b61260481866125cd565b9450600182166000811461261f576001811461263457612667565b60ff1983168652811515820286019350612667565b61263d856125d8565b60005b8381101561265f57815481890152600182019150602081019050612640565b838801955050505b50505092915050565b600061267c82846125ed565b915081905092915050565b600060a08201905061269c6000830188611f0a565b6126a96020830187611f0a565b6126b66040830186611f0a565b6126c36060830185611e4c565b6126d06080830184611f34565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600061275d61275861275384612738565b611fb8565b611da0565b9050919050565b61276d81612742565b82525050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6127a881611d62565b82525050565b60006127ba838361279f565b60208301905092915050565b6000602082019050919050565b60006127de82612773565b6127e8818561277e565b93506127f38361278f565b8060005b8381101561282457815161280b88826127ae565b9750612816836127c6565b9250506001810190506127f7565b5085935050505092915050565b600060a0820190506128466000830188611e4c565b6128536020830187612764565b818103604083015261286581866127d3565b90506128746060830185611f34565b6128816080830184611e4c565b969550505050505056fea2646970667358221220c07cba8a4fc40133b4867d29ad25e71c58ae1241bb4fac822bb2e25e6f54155964736f6c634300081b0033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000009556e6962726964676500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004554e494200000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Unibridge
Arg [1] : _symbol (string): UNIB

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [3] : 556e696272696467650000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 554e494200000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty 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
Loading...
Loading
[ 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.