// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import { ERC20Burnable } from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import { ERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
import { IUniswapV2Factory } from "../interfaces/IUniswapV2Factory.sol";
import { IUniswapV2Pair } from "../interfaces/IUniswapV2Pair.sol";
import { IUniswapV2Router02 } from "../interfaces/IUniswapV2Router02.sol";
contract WarcatToken is ERC20, ERC20Burnable, ERC20Permit, Ownable {
struct LaunchTokenConfig {
string name;
string symbol;
uint8 decimals_;
uint256 totalSupply;
uint256 poolTokenAmount;
address uniswapV2Router;
}
IUniswapV2Router02 public immutable UNISWAP_V2_ROUTER;
uint8 private immutable TOKEN_DECIMALS;
uint256 public immutable POOL_TOKEN_AMOUNT;
address public uniswapV2Pair;
bool public tradingActive;
bool public initialLiquidityAdded;
uint32 public tradingActiveBlock;
mapping(address account => bool excluded) public isExcludedFromFees;
event PairCreated(address indexed pair);
event InitialLiquidityAdded(
address indexed pair, uint256 tokenAmount, uint256 ethAmount, uint256 liquidity
);
event PublicTradingOpened(uint32 tradingActiveBlock);
event ExcludedFromFeesSet(address indexed account, bool excluded);
error InvalidRecipient();
error PairNotCreated();
error InitialLiquidityAlreadyAdded();
error InitialLiquidityNotAdded();
error ProtectedExclusion();
error TradingAlreadyActive();
error UnauthorizedTransferBeforeTrading();
/**
* @notice Deploys a no-tax Base Uniswap v2 launch token.
* @param config Token metadata, launch allocation, and router settings.
*/
constructor(LaunchTokenConfig memory config)
ERC20(config.name, config.symbol)
ERC20Permit(config.name)
Ownable(msg.sender)
{
TOKEN_DECIMALS = config.decimals_;
POOL_TOKEN_AMOUNT = config.poolTokenAmount;
UNISWAP_V2_ROUTER = IUniswapV2Router02(config.uniswapV2Router);
_setFeeExcluded(msg.sender, true);
_setFeeExcluded(address(this), true);
_setFeeExcluded(config.uniswapV2Router, true);
_setFeeExcluded(address(0xdead), true);
_mint(address(this), config.poolTokenAmount);
uint256 retainedSupply = config.totalSupply - config.poolTokenAmount;
if (retainedSupply != 0) {
_mint(msg.sender, retainedSupply);
}
}
/**
* @notice Returns the configured display decimals for the token.
* @return Token decimals.
*/
function decimals() public view override returns (uint8) {
return TOKEN_DECIMALS;
}
/**
* @notice Creates the Uniswap v2 WETH pair before Base launch construction.
* @return pair The created pair address.
*/
function createPair() external onlyOwner returns (address pair) {
if (tradingActive) revert TradingAlreadyActive();
IUniswapV2Factory factory = IUniswapV2Factory(UNISWAP_V2_ROUTER.factory());
address weth = UNISWAP_V2_ROUTER.WETH();
pair = factory.createPair(address(this), weth);
uniswapV2Pair = pair;
emit PairCreated(pair);
}
/**
* @notice Adds initial Uniswap v2 liquidity while public trading remains closed.
* @param tokenAmount Amount of this token to pair with the supplied ETH.
* @param amountTokenMin Minimum token amount accepted by the router.
* @param amountEthMin Minimum ETH amount accepted by the router.
* @param lpRecipient Recipient of the minted LP tokens.
*/
function addInitialLiquidity(
uint256 tokenAmount,
uint256 amountTokenMin,
uint256 amountEthMin,
address lpRecipient
) external payable onlyOwner {
address pair = uniswapV2Pair;
if (pair == address(0)) revert PairNotCreated();
if (tradingActive) revert TradingAlreadyActive();
if (initialLiquidityAdded) revert InitialLiquidityAlreadyAdded();
IUniswapV2Pair(pair).skim(owner());
_approve(address(this), address(UNISWAP_V2_ROUTER), type(uint256).max);
(uint256 amountToken, uint256 amountEth, uint256 liquidity) = UNISWAP_V2_ROUTER.addLiquidityETH{
value: msg.value
}(
address(this), tokenAmount, amountTokenMin, amountEthMin, lpRecipient, block.timestamp
);
initialLiquidityAdded = true;
emit InitialLiquidityAdded(pair, amountToken, amountEth, liquidity);
}
/**
* @notice Opens public trading after liquidity and exempt launch-wallet buys are complete.
*/
function openTrading() external onlyOwner {
if (uniswapV2Pair == address(0)) revert PairNotCreated();
if (!initialLiquidityAdded) revert InitialLiquidityNotAdded();
if (tradingActive) revert TradingAlreadyActive();
tradingActive = true;
tradingActiveBlock = uint32(block.number);
emit PublicTradingOpened(tradingActiveBlock);
}
/**
* @notice Adds or removes pre-trading launch exemptions.
* @param accounts Accounts to update.
* @param excluded Whether each account should be excluded.
*/
function setExcludedFromFees(address[] calldata accounts, bool excluded) external onlyOwner {
for (uint256 i = 0; i < accounts.length; i++) {
address account = accounts[i];
if (account == address(0)) revert InvalidRecipient();
if (account == uniswapV2Pair) revert ProtectedExclusion();
if (!excluded && _isProtectedExclusion(account)) revert ProtectedExclusion();
_setFeeExcluded(account, excluded);
emit ExcludedFromFeesSet(account, excluded);
}
}
function _update(address from, address to, uint256 amount) internal override {
if (
from != address(0) && to != address(0) && !tradingActive && !isExcludedFromFees[from]
&& !isExcludedFromFees[to]
) {
revert UnauthorizedTransferBeforeTrading();
}
super._update(from, to, amount);
}
function _setFeeExcluded(address account, bool excluded) private {
isExcludedFromFees[account] = excluded;
}
function _isProtectedExclusion(address account) private view returns (bool) {
return account == owner() || account == address(this)
|| account == address(UNISWAP_V2_ROUTER) || account == address(0xdead);
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "config",
"type": "tuple",
"components": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "decimals_",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "totalSupply",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "poolTokenAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "uniswapV2Router",
"type": "address",
"internalType": "address"
}
],
"internalType": "struct WarcatToken.LaunchTokenConfig"
}
],
"stateMutability": "nonpayable"
},
{
"name": "ECDSAInvalidSignature",
"type": "error",
"inputs": []
},
{
"name": "ECDSAInvalidSignatureLength",
"type": "error",
"inputs": [
{
"name": "length",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ECDSAInvalidSignatureS",
"type": "error",
"inputs": [
{
"name": "s",
"type": "bytes32",
"internalType": "bytes32"
}
]
},
{
"name": "ERC20InsufficientAllowance",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "allowance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InsufficientBalance",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
},
{
"name": "balance",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "needed",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC20InvalidApprover",
"type": "error",
"inputs": [
{
"name": "approver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidReceiver",
"type": "error",
"inputs": [
{
"name": "receiver",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSender",
"type": "error",
"inputs": [
{
"name": "sender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC20InvalidSpender",
"type": "error",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "ERC2612ExpiredSignature",
"type": "error",
"inputs": [
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "ERC2612InvalidSigner",
"type": "error",
"inputs": [
{
"name": "signer",
"type": "address",
"internalType": "address"
},
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "InitialLiquidityAlreadyAdded",
"type": "error",
"inputs": []
},
{
"name": "InitialLiquidityNotAdded",
"type": "error",
"inputs": []
},
{
"name": "InvalidAccountNonce",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "currentNonce",
"type": "uint256",
"internalType": "uint256"
}
]
},
{
"name": "InvalidRecipient",
"type": "error",
"inputs": []
},
{
"name": "InvalidShortString",
"type": "error",
"inputs": []
},
{
"name": "OwnableInvalidOwner",
"type": "error",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "OwnableUnauthorizedAccount",
"type": "error",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
]
},
{
"name": "PairNotCreated",
"type": "error",
"inputs": []
},
{
"name": "ProtectedExclusion",
"type": "error",
"inputs": []
},
{
"name": "StringTooLong",
"type": "error",
"inputs": [
{
"name": "str",
"type": "string",
"internalType": "string"
}
]
},
{
"name": "TradingAlreadyActive",
"type": "error",
"inputs": []
},
{
"name": "UnauthorizedTransferBeforeTrading",
"type": "error",
"inputs": []
},
{
"name": "Approval",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "EIP712DomainChanged",
"type": "event",
"inputs": [],
"anonymous": false
},
{
"name": "ExcludedFromFeesSet",
"type": "event",
"inputs": [
{
"name": "account",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "excluded",
"type": "bool",
"indexed": false,
"internalType": "bool"
}
],
"anonymous": false
},
{
"name": "InitialLiquidityAdded",
"type": "event",
"inputs": [
{
"name": "pair",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "tokenAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "ethAmount",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
},
{
"name": "liquidity",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnershipTransferred",
"type": "event",
"inputs": [
{
"name": "previousOwner",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "newOwner",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PairCreated",
"type": "event",
"inputs": [
{
"name": "pair",
"type": "address",
"indexed": true,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "PublicTradingOpened",
"type": "event",
"inputs": [
{
"name": "tradingActiveBlock",
"type": "uint32",
"indexed": false,
"internalType": "uint32"
}
],
"anonymous": false
},
{
"name": "Transfer",
"type": "event",
"inputs": [
{
"name": "from",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "to",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "DOMAIN_SEPARATOR",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "POOL_TOKEN_AMOUNT",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "UNISWAP_V2_ROUTER",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IUniswapV2Router02"
}
],
"stateMutability": "view"
},
{
"name": "addInitialLiquidity",
"type": "function",
"inputs": [
{
"name": "tokenAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amountTokenMin",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "amountEthMin",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "lpRecipient",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "payable"
},
{
"name": "allowance",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "approve",
"type": "function",
"inputs": [
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "balanceOf",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "burn",
"type": "function",
"inputs": [
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "burnFrom",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "createPair",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "pair",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "decimals",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint8",
"internalType": "uint8"
}
],
"stateMutability": "view"
},
{
"name": "eip712Domain",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "fields",
"type": "bytes1",
"internalType": "bytes1"
},
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "version",
"type": "string",
"internalType": "string"
},
{
"name": "chainId",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "verifyingContract",
"type": "address",
"internalType": "address"
},
{
"name": "salt",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "extensions",
"type": "uint256[]",
"internalType": "uint256[]"
}
],
"stateMutability": "view"
},
{
"name": "initialLiquidityAdded",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "isExcludedFromFees",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "excluded",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "name",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "nonces",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "openTrading",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "permit",
"type": "function",
"inputs": [
{
"name": "owner",
"type": "address",
"internalType": "address"
},
{
"name": "spender",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "deadline",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "v",
"type": "uint8",
"internalType": "uint8"
},
{
"name": "r",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "s",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "renounceOwnership",
"type": "function",
"inputs": [],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setExcludedFromFees",
"type": "function",
"inputs": [
{
"name": "accounts",
"type": "address[]",
"internalType": "address[]"
},
{
"name": "excluded",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "symbol",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "string",
"internalType": "string"
}
],
"stateMutability": "view"
},
{
"name": "totalSupply",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "tradingActive",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "tradingActiveBlock",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint32",
"internalType": "uint32"
}
],
"stateMutability": "view"
},
{
"name": "transfer",
"type": "function",
"inputs": [
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferFrom",
"type": "function",
"inputs": [
{
"name": "from",
"type": "address",
"internalType": "address"
},
{
"name": "to",
"type": "address",
"internalType": "address"
},
{
"name": "value",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "nonpayable"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "newOwner",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "uniswapV2Pair",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
}
]0x6101c0604052348015610010575f5ffd5b506040516125a03803806125a083398101604081905261002f916105ee565b33815f015180604051806040016040528060018152602001603160f81b815250845f0151856020015181600390816100679190610746565b5060046100748282610746565b5061008491508390506005610234565b61012052610093816006610234565b61014052815160208084019190912060e052815190820120610100524660a05261011f60e05161010051604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201529081019290925260608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b60805250503060c052506001600160a01b03811661015757604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61016081610266565b5060408181015160ff16610180526080820180516101a05260a0830180516001600160a01b0390811661016052335f908152600a6020528481208054600160ff19918216811790925530808452878420805483168417905594519093168252948120805483168617905561dead90527f20677881080440a9b3c87e826370bb5d9c2f74efd4dede686d52d77a6a09f8bb80549091169093179092555161020691906102b7565b5f8160800151826060015161021b9190610818565b9050801561022d5761022d33826102b7565b5050610896565b5f60208351101561024f57610248836102ef565b9050610260565b8161025a8482610746565b5060ff90505b92915050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6001600160a01b0382166102e05760405163ec442f0560e01b81525f600482015260240161014e565b6102eb5f838361032c565b5050565b5f5f829050601f81511115610319578260405163305a27a960e01b815260040161014e919061082b565b805161032482610860565b179392505050565b6001600160a01b0383161580159061034c57506001600160a01b03821615155b80156103625750600954600160a01b900460ff16155b801561038657506001600160a01b0383165f908152600a602052604090205460ff16155b80156103aa57506001600160a01b0382165f908152600a602052604090205460ff16155b156103c857604051630493140b60e31b815260040160405180910390fd5b6103d38383836103d8565b505050565b6001600160a01b038316610402578060025f8282546103f79190610883565b909155506104729050565b6001600160a01b0383165f90815260208190526040902054818110156104545760405163391434e360e21b81526001600160a01b0385166004820152602481018290526044810183905260640161014e565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b03821661048e576002805482900390556104ac565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516104f191815260200190565b60405180910390a3505050565b634e487b7160e01b5f52604160045260245ffd5b60405160c081016001600160401b0381118282101715610534576105346104fe565b60405290565b5f82601f830112610549575f5ffd5b81516001600160401b03811115610562576105626104fe565b604051601f8201601f19908116603f011681016001600160401b0381118282101715610590576105906104fe565b6040528181528382016020018510156105a7575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b805160ff811681146105d3575f5ffd5b919050565b80516001600160a01b03811681146105d3575f5ffd5b5f602082840312156105fe575f5ffd5b81516001600160401b03811115610613575f5ffd5b820160c08185031215610624575f5ffd5b61062c610512565b81516001600160401b03811115610641575f5ffd5b61064d8682850161053a565b82525060208201516001600160401b03811115610668575f5ffd5b6106748682850161053a565b602083015250610686604083016105c3565b604082015260608281015190820152608080830151908201526106ab60a083016105d8565b60a0820152949350505050565b600181811c908216806106cc57607f821691505b6020821081036106ea57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156103d357828211156103d357805f5260205f20601f840160051c602085101561071b57505f5b90810190601f840160051c035f5b8181101561073e575f83820155600101610729565b505050505050565b81516001600160401b0381111561075f5761075f6104fe565b6107738161076d84546106b8565b846106f0565b6020601f8211600181146107a5575f831561078e5750848201515b5f19600385901b1c1916600184901b1784556107fd565b5f84815260208120601f198516915b828110156107d457878501518255602094850194600190920191016107b4565b50848210156107f157868401515f19600387901b60f8161c191681555b505060018360011b0184555b5050505050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561026057610260610804565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b805160208083015191908110156106ea575f1960209190910360031b1b16919050565b8082018082111561026057610260610804565b60805160a05160c05160e05161010051610120516101405161016051610180516101a051611c786109285f395f61050601525f61028801525f8181610480015281816109050152818161097101528181610b2201528181610ba50152610fd901525f6112dc01525f6112af01525f6111d301525f6111ab01525f61110601525f61113001525f61115a0152611c785ff3fe6080604052600436106101ba575f3560e01c806379cc6790116100f2578063a9059cbb11610092578063d505accf11610062578063d505accf14610528578063dd62ed3e14610547578063ee40166e1461058b578063f2fde38b146105c3575f5ffd5b8063a9059cbb146104a2578063bbc0c742146104c1578063c9567bf9146104e1578063cfd5fafb146104f5575f5ffd5b80638da5cb5b116100cd5780638da5cb5b1461042a57806395d89b41146104475780639e78fb4f1461045b578063a82ed9ec1461046f575f5ffd5b806379cc6790146103c55780637ecebe00146103e457806384b0196e14610403575f5ffd5b806342966c681161015d5780634fbee193116101385780634fbee1931461032f57806370a082311461035d578063715018a61461039157806373bd699a146103a5575f5ffd5b806342966c68146102c657806349bd5a5e146102e55780634e656faa1461031c575f5ffd5b806318160ddd1161019857806318160ddd1461023857806323b872dd14610256578063313ce567146102755780633644e515146102b2575f5ffd5b806306fdde03146101be578063095ea7b3146101e8578063105222f914610217575b5f5ffd5b3480156101c9575f5ffd5b506101d26105e2565b6040516101df91906118b4565b60405180910390f35b3480156101f3575f5ffd5b506102076102023660046118e1565b610672565b60405190151581526020016101df565b348015610222575f5ffd5b5061023661023136600461190b565b61068b565b005b348015610243575f5ffd5b506002545b6040519081526020016101df565b348015610261575f5ffd5b50610207610270366004611991565b6107c4565b348015610280575f5ffd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000001681526020016101df565b3480156102bd575f5ffd5b506102486107e7565b3480156102d1575f5ffd5b506102366102e03660046119cf565b6107f5565b3480156102f0575f5ffd5b50600954610304906001600160a01b031681565b6040516001600160a01b0390911681526020016101df565b61023661032a3660046119e6565b610802565b34801561033a575f5ffd5b50610207610349366004611a24565b600a6020525f908152604090205460ff1681565b348015610368575f5ffd5b50610248610377366004611a24565b6001600160a01b03165f9081526020819052604090205490565b34801561039c575f5ffd5b50610236610a51565b3480156103b0575f5ffd5b5060095461020790600160a81b900460ff1681565b3480156103d0575f5ffd5b506102366103df3660046118e1565b610a64565b3480156103ef575f5ffd5b506102486103fe366004611a24565b610a7d565b34801561040e575f5ffd5b50610417610a9a565b6040516101df9796959493929190611a3f565b348015610435575f5ffd5b506008546001600160a01b0316610304565b348015610452575f5ffd5b506101d2610adc565b348015610466575f5ffd5b50610304610aeb565b34801561047a575f5ffd5b506103047f000000000000000000000000000000000000000000000000000000000000000081565b3480156104ad575f5ffd5b506102076104bc3660046118e1565b610ce5565b3480156104cc575f5ffd5b5060095461020790600160a01b900460ff1681565b3480156104ec575f5ffd5b50610236610cf2565b348015610500575f5ffd5b506102487f000000000000000000000000000000000000000000000000000000000000000081565b348015610533575f5ffd5b50610236610542366004611ad5565b610de3565b348015610552575f5ffd5b50610248610561366004611b46565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610596575f5ffd5b506009546105ae90600160b01b900463ffffffff1681565b60405163ffffffff90911681526020016101df565b3480156105ce575f5ffd5b506102366105dd366004611a24565b610f1e565b6060600380546105f190611b7d565b80601f016020809104026020016040519081016040528092919081815260200182805461061d90611b7d565b80156106685780601f1061063f57610100808354040283529160200191610668565b820191905f5260205f20905b81548152906001019060200180831161064b57829003601f168201915b5050505050905090565b5f3361067f818585610f58565b60019150505b92915050565b610693610f6a565b5f5b828110156107be575f8484838181106106b0576106b0611bb5565b90506020020160208101906106c59190611a24565b90506001600160a01b0381166106ee57604051634e46966960e11b815260040160405180910390fd5b6009546001600160a01b039081169082160361071d57604051632bc4a6f160e11b815260040160405180910390fd5b8215801561072f575061072f81610f97565b1561074d57604051632bc4a6f160e11b815260040160405180910390fd5b6001600160a01b0381165f908152600a60205260409020805460ff1916841515179055806001600160a01b03167fa45484f40f32433a1767fa4a62722739b4094e7c611b3d49fe79b003bfb93b97846040516107ad911515815260200190565b60405180910390a250600101610695565b50505050565b5f336107d1858285611027565b6107dc85858561109d565b506001949350505050565b5f6107f06110fa565b905090565b6107ff3382611223565b50565b61080a610f6a565b6009546001600160a01b0316806108345760405163c6bcf59960e01b815260040160405180910390fd5b600954600160a01b900460ff161561085f576040516314bcbf6360e01b815260040160405180910390fd5b600954600160a81b900460ff161561088a5760405163b1f3376760e01b815260040160405180910390fd5b806001600160a01b031663bc25cf776108ab6008546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b1580156108e9575f5ffd5b505af11580156108fb573d5f5f3e3d5ffd5b5050505061092b307f00000000000000000000000000000000000000000000000000000000000000005f19610f58565b60405163f305d71960e01b81523060048201526024810186905260448101859052606481018490526001600160a01b0383811660848301524260a48301525f91829182917f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990349060c40160606040518083038185885af11580156109bb573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906109e09190611bc9565b6009805460ff60a81b1916600160a81b179055604080518481526020810184905290810182905292955090935091506001600160a01b038516907fb74e6471b3628e5564a820a208c77a7cdc392155b3b943031f2926e8347a65ec9060600160405180910390a25050505050505050565b610a59610f6a565b610a625f611257565b565b610a6f823383611027565b610a798282611223565b5050565b6001600160a01b0381165f90815260076020526040812054610685565b5f6060805f5f5f6060610aab6112a8565b610ab36112d5565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6060600480546105f190611b7d565b5f610af4610f6a565b600954600160a01b900460ff1615610b1f576040516314bcbf6360e01b815260040160405180910390fd5b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba09190611bf4565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c239190611bf4565b6040516364e329cb60e11b81523060048201526001600160a01b0380831660248301529192509083169063c9c65396906044016020604051808303815f875af1158015610c72573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c969190611bf4565b600980546001600160a01b0319166001600160a01b038316908117909155604051919450907fb14a725aeeb25d591b81b16b4c5b25403dd8867bdd1876fa787867f566206be1905f90a2505090565b5f3361067f81858561109d565b610cfa610f6a565b6009546001600160a01b0316610d235760405163c6bcf59960e01b815260040160405180910390fd5b600954600160a81b900460ff16610d4d5760405163db5c0ef960e01b815260040160405180910390fd5b600954600160a01b900460ff1615610d78576040516314bcbf6360e01b815260040160405180910390fd5b6009805463ffffffff438116600160b01b90810265ffffffff00ff60a01b1990931692909217600160a01b17928390556040519190920490911681527fbf6886c6ccf527bff659692d778b5f4daec4cbf3f324a434ee3247ea415d6bef9060200160405180910390a1565b83421115610e0c5760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610e578c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610eb182611302565b90505f610ec08287878761132e565b9050896001600160a01b0316816001600160a01b031614610f07576040516325c0072360e11b81526001600160a01b0380831660048301528b166024820152604401610e03565b610f128a8a8a610f58565b50505050505050505050565b610f26610f6a565b6001600160a01b038116610f4f57604051631e4fbdf760e01b81525f6004820152602401610e03565b6107ff81611257565b610f65838383600161135a565b505050565b6008546001600160a01b03163314610a625760405163118cdaa760e01b8152336004820152602401610e03565b5f610faa6008546001600160a01b031690565b6001600160a01b0316826001600160a01b03161480610fd157506001600160a01b03821630145b8061100d57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b8061068557506001600160a01b03821661dead1492915050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156107be578181101561108f57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610e03565b6107be84848484035f61135a565b6001600160a01b0383166110c657604051634b637e8f60e11b81525f6004820152602401610e03565b6001600160a01b0382166110ef5760405163ec442f0560e01b81525f6004820152602401610e03565b610f6583838361142c565b5f306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561115257507f000000000000000000000000000000000000000000000000000000000000000046145b1561117c57507f000000000000000000000000000000000000000000000000000000000000000090565b6107f0604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0000000000000000000000000000000000000000000000000000000000000000918101919091527f000000000000000000000000000000000000000000000000000000000000000060608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b6001600160a01b03821661124c57604051634b637e8f60e11b81525f6004820152602401610e03565b610a79825f8361142c565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606107f07f000000000000000000000000000000000000000000000000000000000000000060056114d3565b60606107f07f000000000000000000000000000000000000000000000000000000000000000060066114d3565b5f61068561130e6110fa565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f61133e8888888861157c565b92509250925061134e8282611644565b50909695505050505050565b6001600160a01b0384166113835760405163e602df0560e01b81525f6004820152602401610e03565b6001600160a01b0383166113ac57604051634a1406b160e11b81525f6004820152602401610e03565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156107be57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161141e91815260200190565b60405180910390a350505050565b6001600160a01b0383161580159061144c57506001600160a01b03821615155b80156114625750600954600160a01b900460ff16155b801561148657506001600160a01b0383165f908152600a602052604090205460ff16155b80156114aa57506001600160a01b0382165f908152600a602052604090205460ff16155b156114c857604051630493140b60e31b815260040160405180910390fd5b610f658383836116fc565b606060ff83146114ed576114e683611822565b9050610685565b8180546114f990611b7d565b80601f016020809104026020016040519081016040528092919081815260200182805461152590611b7d565b80156115705780601f1061154757610100808354040283529160200191611570565b820191905f5260205f20905b81548152906001019060200180831161155357829003601f168201915b50505050509050610685565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156115b557505f9150600390508261163a565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611606573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661163157505f92506001915082905061163a565b92505f91508190505b9450945094915050565b5f82600381111561165757611657611c0f565b03611660575050565b600182600381111561167457611674611c0f565b036116925760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116a6576116a6611c0f565b036116c75760405163fce698f760e01b815260048101829052602401610e03565b60038260038111156116db576116db611c0f565b03610a79576040516335e2f38360e21b815260048101829052602401610e03565b6001600160a01b038316611726578060025f82825461171b9190611c23565b909155506117969050565b6001600160a01b0383165f90815260208190526040902054818110156117785760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610e03565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166117b2576002805482900390556117d0565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161181591815260200190565b60405180910390a3505050565b60605f61182e8361185f565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f81111561068557604051632cd44ac360e21b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6118c66020830184611886565b9392505050565b6001600160a01b03811681146107ff575f5ffd5b5f5f604083850312156118f2575f5ffd5b82356118fd816118cd565b946020939093013593505050565b5f5f5f6040848603121561191d575f5ffd5b833567ffffffffffffffff811115611933575f5ffd5b8401601f81018613611943575f5ffd5b803567ffffffffffffffff811115611959575f5ffd5b8660208260051b840101111561196d575f5ffd5b6020918201945092508401358015158114611986575f5ffd5b809150509250925092565b5f5f5f606084860312156119a3575f5ffd5b83356119ae816118cd565b925060208401356119be816118cd565b929592945050506040919091013590565b5f602082840312156119df575f5ffd5b5035919050565b5f5f5f5f608085870312156119f9575f5ffd5b8435935060208501359250604085013591506060850135611a19816118cd565b939692955090935050565b5f60208284031215611a34575f5ffd5b81356118c6816118cd565b60ff60f81b8816815260e060208201525f611a5d60e0830189611886565b8281036040840152611a6f8189611886565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015611ac4578351835260209384019390920191600101611aa6565b50909b9a5050505050505050505050565b5f5f5f5f5f5f5f60e0888a031215611aeb575f5ffd5b8735611af6816118cd565b96506020880135611b06816118cd565b95506040880135945060608801359350608088013560ff81168114611b29575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215611b57575f5ffd5b8235611b62816118cd565b91506020830135611b72816118cd565b809150509250929050565b600181811c90821680611b9157607f821691505b602082108103611baf57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f5f5f60608486031215611bdb575f5ffd5b5050815160208301516040909301519094929350919050565b5f60208284031215611c04575f5ffd5b81516118c6816118cd565b634e487b7160e01b5f52602160045260245ffd5b8082018082111561068557634e487b7160e01b5f52601160045260245ffdfea26469706673582212200631bc40766026223f5ce6dc6b75df01320af47ef1a7b87ec5878010e80b85d864736f6c63430008230033000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000033b2e3c9fd0803ce80000000000000000000000000000000000000000000000033b2e3c9fd0803ce800000000000000000000000000000089e5db8b5aa49aa85ac63f691524311aeb649eba0000000000000000000000000000000000000000000000000000000000000005466f6661720000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005464f464152000000000000000000000000000000000000000000000000000000
0x6080604052600436106101ba575f3560e01c806379cc6790116100f2578063a9059cbb11610092578063d505accf11610062578063d505accf14610528578063dd62ed3e14610547578063ee40166e1461058b578063f2fde38b146105c3575f5ffd5b8063a9059cbb146104a2578063bbc0c742146104c1578063c9567bf9146104e1578063cfd5fafb146104f5575f5ffd5b80638da5cb5b116100cd5780638da5cb5b1461042a57806395d89b41146104475780639e78fb4f1461045b578063a82ed9ec1461046f575f5ffd5b806379cc6790146103c55780637ecebe00146103e457806384b0196e14610403575f5ffd5b806342966c681161015d5780634fbee193116101385780634fbee1931461032f57806370a082311461035d578063715018a61461039157806373bd699a146103a5575f5ffd5b806342966c68146102c657806349bd5a5e146102e55780634e656faa1461031c575f5ffd5b806318160ddd1161019857806318160ddd1461023857806323b872dd14610256578063313ce567146102755780633644e515146102b2575f5ffd5b806306fdde03146101be578063095ea7b3146101e8578063105222f914610217575b5f5ffd5b3480156101c9575f5ffd5b506101d26105e2565b6040516101df91906118b4565b60405180910390f35b3480156101f3575f5ffd5b506102076102023660046118e1565b610672565b60405190151581526020016101df565b348015610222575f5ffd5b5061023661023136600461190b565b61068b565b005b348015610243575f5ffd5b506002545b6040519081526020016101df565b348015610261575f5ffd5b50610207610270366004611991565b6107c4565b348015610280575f5ffd5b5060405160ff7f00000000000000000000000000000000000000000000000000000000000000121681526020016101df565b3480156102bd575f5ffd5b506102486107e7565b3480156102d1575f5ffd5b506102366102e03660046119cf565b6107f5565b3480156102f0575f5ffd5b50600954610304906001600160a01b031681565b6040516001600160a01b0390911681526020016101df565b61023661032a3660046119e6565b610802565b34801561033a575f5ffd5b50610207610349366004611a24565b600a6020525f908152604090205460ff1681565b348015610368575f5ffd5b50610248610377366004611a24565b6001600160a01b03165f9081526020819052604090205490565b34801561039c575f5ffd5b50610236610a51565b3480156103b0575f5ffd5b5060095461020790600160a81b900460ff1681565b3480156103d0575f5ffd5b506102366103df3660046118e1565b610a64565b3480156103ef575f5ffd5b506102486103fe366004611a24565b610a7d565b34801561040e575f5ffd5b50610417610a9a565b6040516101df9796959493929190611a3f565b348015610435575f5ffd5b506008546001600160a01b0316610304565b348015610452575f5ffd5b506101d2610adc565b348015610466575f5ffd5b50610304610aeb565b34801561047a575f5ffd5b506103047f00000000000000000000000089e5db8b5aa49aa85ac63f691524311aeb649eba81565b3480156104ad575f5ffd5b506102076104bc3660046118e1565b610ce5565b3480156104cc575f5ffd5b5060095461020790600160a01b900460ff1681565b3480156104ec575f5ffd5b50610236610cf2565b348015610500575f5ffd5b506102487f0000000000000000000000000000000000000000033b2e3c9fd0803ce800000081565b348015610533575f5ffd5b50610236610542366004611ad5565b610de3565b348015610552575f5ffd5b50610248610561366004611b46565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b348015610596575f5ffd5b506009546105ae90600160b01b900463ffffffff1681565b60405163ffffffff90911681526020016101df565b3480156105ce575f5ffd5b506102366105dd366004611a24565b610f1e565b6060600380546105f190611b7d565b80601f016020809104026020016040519081016040528092919081815260200182805461061d90611b7d565b80156106685780601f1061063f57610100808354040283529160200191610668565b820191905f5260205f20905b81548152906001019060200180831161064b57829003601f168201915b5050505050905090565b5f3361067f818585610f58565b60019150505b92915050565b610693610f6a565b5f5b828110156107be575f8484838181106106b0576106b0611bb5565b90506020020160208101906106c59190611a24565b90506001600160a01b0381166106ee57604051634e46966960e11b815260040160405180910390fd5b6009546001600160a01b039081169082160361071d57604051632bc4a6f160e11b815260040160405180910390fd5b8215801561072f575061072f81610f97565b1561074d57604051632bc4a6f160e11b815260040160405180910390fd5b6001600160a01b0381165f908152600a60205260409020805460ff1916841515179055806001600160a01b03167fa45484f40f32433a1767fa4a62722739b4094e7c611b3d49fe79b003bfb93b97846040516107ad911515815260200190565b60405180910390a250600101610695565b50505050565b5f336107d1858285611027565b6107dc85858561109d565b506001949350505050565b5f6107f06110fa565b905090565b6107ff3382611223565b50565b61080a610f6a565b6009546001600160a01b0316806108345760405163c6bcf59960e01b815260040160405180910390fd5b600954600160a01b900460ff161561085f576040516314bcbf6360e01b815260040160405180910390fd5b600954600160a81b900460ff161561088a5760405163b1f3376760e01b815260040160405180910390fd5b806001600160a01b031663bc25cf776108ab6008546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b1580156108e9575f5ffd5b505af11580156108fb573d5f5f3e3d5ffd5b5050505061092b307f00000000000000000000000089e5db8b5aa49aa85ac63f691524311aeb649eba5f19610f58565b60405163f305d71960e01b81523060048201526024810186905260448101859052606481018490526001600160a01b0383811660848301524260a48301525f91829182917f00000000000000000000000089e5db8b5aa49aa85ac63f691524311aeb649eba9091169063f305d71990349060c40160606040518083038185885af11580156109bb573d5f5f3e3d5ffd5b50505050506040513d601f19601f820116820180604052508101906109e09190611bc9565b6009805460ff60a81b1916600160a81b179055604080518481526020810184905290810182905292955090935091506001600160a01b038516907fb74e6471b3628e5564a820a208c77a7cdc392155b3b943031f2926e8347a65ec9060600160405180910390a25050505050505050565b610a59610f6a565b610a625f611257565b565b610a6f823383611027565b610a798282611223565b5050565b6001600160a01b0381165f90815260076020526040812054610685565b5f6060805f5f5f6060610aab6112a8565b610ab36112d5565b604080515f80825260208201909252600f60f81b9b939a50919850469750309650945092509050565b6060600480546105f190611b7d565b5f610af4610f6a565b600954600160a01b900460ff1615610b1f576040516314bcbf6360e01b815260040160405180910390fd5b5f7f00000000000000000000000089e5db8b5aa49aa85ac63f691524311aeb649eba6001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b7c573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ba09190611bf4565b90505f7f00000000000000000000000089e5db8b5aa49aa85ac63f691524311aeb649eba6001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015610bff573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c239190611bf4565b6040516364e329cb60e11b81523060048201526001600160a01b0380831660248301529192509083169063c9c65396906044016020604051808303815f875af1158015610c72573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c969190611bf4565b600980546001600160a01b0319166001600160a01b038316908117909155604051919450907fb14a725aeeb25d591b81b16b4c5b25403dd8867bdd1876fa787867f566206be1905f90a2505090565b5f3361067f81858561109d565b610cfa610f6a565b6009546001600160a01b0316610d235760405163c6bcf59960e01b815260040160405180910390fd5b600954600160a81b900460ff16610d4d5760405163db5c0ef960e01b815260040160405180910390fd5b600954600160a01b900460ff1615610d78576040516314bcbf6360e01b815260040160405180910390fd5b6009805463ffffffff438116600160b01b90810265ffffffff00ff60a01b1990931692909217600160a01b17928390556040519190920490911681527fbf6886c6ccf527bff659692d778b5f4daec4cbf3f324a434ee3247ea415d6bef9060200160405180910390a1565b83421115610e0c5760405163313c898160e11b8152600481018590526024015b60405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610e578c6001600160a01b03165f90815260076020526040902080546001810190915590565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610eb182611302565b90505f610ec08287878761132e565b9050896001600160a01b0316816001600160a01b031614610f07576040516325c0072360e11b81526001600160a01b0380831660048301528b166024820152604401610e03565b610f128a8a8a610f58565b50505050505050505050565b610f26610f6a565b6001600160a01b038116610f4f57604051631e4fbdf760e01b81525f6004820152602401610e03565b6107ff81611257565b610f65838383600161135a565b505050565b6008546001600160a01b03163314610a625760405163118cdaa760e01b8152336004820152602401610e03565b5f610faa6008546001600160a01b031690565b6001600160a01b0316826001600160a01b03161480610fd157506001600160a01b03821630145b8061100d57507f00000000000000000000000089e5db8b5aa49aa85ac63f691524311aeb649eba6001600160a01b0316826001600160a01b0316145b8061068557506001600160a01b03821661dead1492915050565b6001600160a01b038381165f908152600160209081526040808320938616835292905220545f198110156107be578181101561108f57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610e03565b6107be84848484035f61135a565b6001600160a01b0383166110c657604051634b637e8f60e11b81525f6004820152602401610e03565b6001600160a01b0382166110ef5760405163ec442f0560e01b81525f6004820152602401610e03565b610f6583838361142c565b5f306001600160a01b037f000000000000000000000000ec2f2d0a915f506346d5113b6cf5f37117dd358f1614801561115257507f000000000000000000000000000000000000000000000000000000000000123746145b1561117c57507ff2f78709b32ff59e433cde57faac515bfc61c35e2cf4c5caf7aa6cdbd3a6280490565b6107f0604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f60208201527f0e46d83bd2d0e2f36653e607151a1c57823f362a6b139905bb61de5a2848e973918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a08201525f9060c00160405160208183030381529060405280519060200120905090565b6001600160a01b03821661124c57604051634b637e8f60e11b81525f6004820152602401610e03565b610a79825f8361142c565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60606107f07f466f66617200000000000000000000000000000000000000000000000000000560056114d3565b60606107f07f310000000000000000000000000000000000000000000000000000000000000160066114d3565b5f61068561130e6110fa565b8360405161190160f01b8152600281019290925260228201526042902090565b5f5f5f5f61133e8888888861157c565b92509250925061134e8282611644565b50909695505050505050565b6001600160a01b0384166113835760405163e602df0560e01b81525f6004820152602401610e03565b6001600160a01b0383166113ac57604051634a1406b160e11b81525f6004820152602401610e03565b6001600160a01b038085165f90815260016020908152604080832093871683529290522082905580156107be57826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161141e91815260200190565b60405180910390a350505050565b6001600160a01b0383161580159061144c57506001600160a01b03821615155b80156114625750600954600160a01b900460ff16155b801561148657506001600160a01b0383165f908152600a602052604090205460ff16155b80156114aa57506001600160a01b0382165f908152600a602052604090205460ff16155b156114c857604051630493140b60e31b815260040160405180910390fd5b610f658383836116fc565b606060ff83146114ed576114e683611822565b9050610685565b8180546114f990611b7d565b80601f016020809104026020016040519081016040528092919081815260200182805461152590611b7d565b80156115705780601f1061154757610100808354040283529160200191611570565b820191905f5260205f20905b81548152906001019060200180831161155357829003601f168201915b50505050509050610685565b5f80807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08411156115b557505f9150600390508261163a565b604080515f808252602082018084528a905260ff891692820192909252606081018790526080810186905260019060a0016020604051602081039080840390855afa158015611606573d5f5f3e3d5ffd5b5050604051601f1901519150506001600160a01b03811661163157505f92506001915082905061163a565b92505f91508190505b9450945094915050565b5f82600381111561165757611657611c0f565b03611660575050565b600182600381111561167457611674611c0f565b036116925760405163f645eedf60e01b815260040160405180910390fd5b60028260038111156116a6576116a6611c0f565b036116c75760405163fce698f760e01b815260048101829052602401610e03565b60038260038111156116db576116db611c0f565b03610a79576040516335e2f38360e21b815260048101829052602401610e03565b6001600160a01b038316611726578060025f82825461171b9190611c23565b909155506117969050565b6001600160a01b0383165f90815260208190526040902054818110156117785760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610e03565b6001600160a01b0384165f9081526020819052604090209082900390555b6001600160a01b0382166117b2576002805482900390556117d0565b6001600160a01b0382165f9081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161181591815260200190565b60405180910390a3505050565b60605f61182e8361185f565b6040805160208082528183019092529192505f91906020820181803683375050509182525060208101929092525090565b5f60ff8216601f81111561068557604051632cd44ac360e21b815260040160405180910390fd5b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f6118c66020830184611886565b9392505050565b6001600160a01b03811681146107ff575f5ffd5b5f5f604083850312156118f2575f5ffd5b82356118fd816118cd565b946020939093013593505050565b5f5f5f6040848603121561191d575f5ffd5b833567ffffffffffffffff811115611933575f5ffd5b8401601f81018613611943575f5ffd5b803567ffffffffffffffff811115611959575f5ffd5b8660208260051b840101111561196d575f5ffd5b6020918201945092508401358015158114611986575f5ffd5b809150509250925092565b5f5f5f606084860312156119a3575f5ffd5b83356119ae816118cd565b925060208401356119be816118cd565b929592945050506040919091013590565b5f602082840312156119df575f5ffd5b5035919050565b5f5f5f5f608085870312156119f9575f5ffd5b8435935060208501359250604085013591506060850135611a19816118cd565b939692955090935050565b5f60208284031215611a34575f5ffd5b81356118c6816118cd565b60ff60f81b8816815260e060208201525f611a5d60e0830189611886565b8281036040840152611a6f8189611886565b606084018890526001600160a01b038716608085015260a0840186905283810360c0850152845180825260208087019350909101905f5b81811015611ac4578351835260209384019390920191600101611aa6565b50909b9a5050505050505050505050565b5f5f5f5f5f5f5f60e0888a031215611aeb575f5ffd5b8735611af6816118cd565b96506020880135611b06816118cd565b95506040880135945060608801359350608088013560ff81168114611b29575f5ffd5b9699959850939692959460a0840135945060c09093013592915050565b5f5f60408385031215611b57575f5ffd5b8235611b62816118cd565b91506020830135611b72816118cd565b809150509250929050565b600181811c90821680611b9157607f821691505b602082108103611baf57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b5f5f5f60608486031215611bdb575f5ffd5b5050815160208301516040909301519094929350919050565b5f60208284031215611c04575f5ffd5b81516118c6816118cd565b634e487b7160e01b5f52602160045260245ffd5b8082018082111561068557634e487b7160e01b5f52601160045260245ffdfea26469706673582212200631bc40766026223f5ce6dc6b75df01320af47ef1a7b87ec5878010e80b85d864736f6c63430008230033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| DIH | 1 | $0.0000102 | $0 |
| Transaction Hash | Method | Block | Age | From | To | Type | Item | ||
|---|---|---|---|---|---|---|---|---|---|
| no NFT transfers for this address yet | |||||||||
| Type | Age | Block | Details |
|---|---|---|---|
| no cross-chain L1↔L2 transactions for this address | |||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xfc4a73…a4ea68 | 28 days agoMon, 20 Jul 2026 22:16:05 UTC | Approval | [0] 0x000000000000…88f7a0e6 [1] 0x000000000000…e5a3ac7f data: 0x000000000000000000…00000000 |
| 0x42d6d8…0b6540 | 33 days agoWed, 15 Jul 2026 22:45:25 UTC | Transfer | [0] 0x000000000000…52bfeeef [1] 0x000000000000…c72c7ac6 data: 0x000000000000000000…01e14f9f |
| 0x44b1a4…aa4124 | 33 days agoWed, 15 Jul 2026 22:43:18 UTC | Transfer | [0] 0x000000000000…eb649eba [1] 0x000000000000…57a03dec data: 0x000000000000000000…3be1ec39 |
| 0x44b1a4…aa4124 | 33 days agoWed, 15 Jul 2026 22:43:18 UTC | Transfer | [0] 0x000000000000…52bfeeef [1] 0x000000000000…eb649eba data: 0x000000000000000000…3be1ec39 |
| 0x7f0a98…a83680 | 33 days agoWed, 15 Jul 2026 21:48:50 UTC | Transfer | [0] 0x000000000000…ec4fff4f [1] 0x000000000000…52bfeeef data: 0x000000000000000000…2f94c0dc |
| 0x7f0a98…a83680 | 33 days agoWed, 15 Jul 2026 21:48:50 UTC | Approval | [0] 0x000000000000…ec4fff4f [1] 0x000000000000…72c22734 data: 0x000000000000000000…2f94c0dc |
| 0x7f0a98…a83680 | 33 days agoWed, 15 Jul 2026 21:48:50 UTC | Transfer | [0] 0x000000000000…ce69bc2f [1] 0x000000000000…ec4fff4f data: 0x000000000000000000…2f94c0dc |
| 0x7f0a98…a83680 | 33 days agoWed, 15 Jul 2026 21:48:50 UTC | Approval | [0] 0x000000000000…ce69bc2f [1] 0x000000000000…f1c315be data: 0x000000000000000000…2f94c0dc |
| 0xe861cc…3ffc96 | 33 days agoWed, 15 Jul 2026 21:48:43 UTC | Transfer | [0] 0x000000000000…ec4fff4f [1] 0x000000000000…ce69bc2f data: 0x000000000000000000…c8855707 |
| 0xe861cc…3ffc96 | 33 days agoWed, 15 Jul 2026 21:48:43 UTC | Transfer | [0] 0x000000000000…52bfeeef [1] 0x000000000000…ec4fff4f data: 0x000000000000000000…c8855707 |
| 0x33989a…644523 | 33 days agoWed, 15 Jul 2026 21:44:46 UTC | Transfer | [0] 0x000000000000…99db0622 [1] 0x000000000000…52bfeeef data: 0x000000000000000000…da68bd99 |
| 0x10c274…391d94 | 33 days agoWed, 15 Jul 2026 21:44:46 UTC | Approval | [0] 0x000000000000…99db0622 [1] 0x000000000000…262c40dc data: 0xffffffffffffffffff…ffffffff |
| 0xb2b2a2…3c9ec4 | 33 days agoWed, 15 Jul 2026 21:28:21 UTC | Transfer | [0] 0x000000000000…d1c64d14 [1] 0x000000000000…52bfeeef data: 0x000000000000000000…3d6a22d0 |
| 0xd7a203…67c59a | 33 days agoWed, 15 Jul 2026 21:15:24 UTC | Transfer | [0] 0x000000000000…a66cd48a [1] 0x000000000000…52bfeeef data: 0x000000000000000000…b0cd1829 |
| 0xe04c99…36ae89 | 33 days agoWed, 15 Jul 2026 21:15:24 UTC | Approval | [0] 0x000000000000…a66cd48a [1] 0x000000000000…eb649eba data: 0xffffffffffffffffff…ffffffff |
| 0x8e6f2f…29e0ec | 33 days agoWed, 15 Jul 2026 21:15:16 UTC | Transfer | [0] 0x000000000000…6fa7fc39 [1] 0x000000000000…52bfeeef data: 0x000000000000000000…0223a628 |
| 0xbbd7ae…2d1d5c | 33 days agoWed, 15 Jul 2026 21:15:16 UTC | Approval | [0] 0x000000000000…6fa7fc39 [1] 0x000000000000…eb649eba data: 0xffffffffffffffffff…ffffffff |
| 0x7e8b3f…fcec98 | 33 days agoWed, 15 Jul 2026 21:15:02 UTC | Transfer | [0] 0x000000000000…52bfeeef [1] 0x000000000000…c72c7ac6 data: 0x000000000000000000…a7abbcb0 |
| 0xed2851…7e4efc | 33 days agoWed, 15 Jul 2026 21:14:39 UTC | Transfer | [0] 0x000000000000…d740788c [1] 0x000000000000…52bfeeef data: 0x000000000000000000…ae2cfc1f |
| 0x1600a1…a23c45 | 33 days agoWed, 15 Jul 2026 21:14:39 UTC | Approval | [0] 0x000000000000…d740788c [1] 0x000000000000…eb649eba data: 0xffffffffffffffffff…ffffffff |
| 0xe3f758…a79975 | 33 days agoWed, 15 Jul 2026 21:14:39 UTC | Transfer | [0] 0x000000000000…6fa7fc39 [1] 0x000000000000…52bfeeef data: 0x000000000000000000…684cf1e4 |
| 0xffd61f…72e207 | 33 days agoWed, 15 Jul 2026 21:14:35 UTC | Transfer | [0] 0x000000000000…98028e13 [1] 0x000000000000…52bfeeef data: 0x000000000000000000…69c474a4 |
| 0x9c896b…8309b8 | 33 days agoWed, 15 Jul 2026 21:14:32 UTC | Transfer | [0] 0x000000000000…7f9d30e4 [1] 0x000000000000…52bfeeef data: 0x000000000000000000…eab4c027 |
| 0xc35188…35b7fe | 33 days agoWed, 15 Jul 2026 21:14:30 UTC | Transfer | [0] 0x000000000000…f8d7f412 [1] 0x000000000000…52bfeeef data: 0x000000000000000000…a0ac2f81 |
| 0x9fc235…082043 | 33 days agoWed, 15 Jul 2026 21:14:29 UTC | Approval | [0] 0x000000000000…f8d7f412 [1] 0x000000000000…eb649eba data: 0xffffffffffffffffff…ffffffff |
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xe8b837b8…76b015 | Transfer | 20,614,968 | 21 days agoMon, 27 Jul 2026 09:12:32 UTC | 0xcaf7…5d11 | IN | 0xec2f…358f | $0.001 DIH | ||
| 0x0d702242…1f4c25 | Transfer | 10,687,193 | 33 days agoWed, 15 Jul 2026 20:37:18 UTC | 0xec2f…358f | OUT | 0x99d7…eeef | 1,000,000,000.000000 FOFAR | Fofar (FOFAR) | |
| 0xe1a2bba6…c5b9fe | Transfer | 10,686,419 | 33 days agoWed, 15 Jul 2026 20:36:00 UTC | 0x0000…0000 | IN | 0xec2f…358f | 1,000,000,000.000000 FOFAR | Fofar (FOFAR) |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xfc4a73…a4ea68 | Approve | 15,053,056 | 28 days agoMon, 20 Jul 2026 22:16:05 UTC | 0xed23…a0e6 | IN | Fofar | $0.000 ETH | 0.00000143 | |
| 0x10c274…391d94 | Approve | 10,727,605 | 33 days agoWed, 15 Jul 2026 21:44:46 UTC | 0x6454…0622 | IN | Fofar | $0.000 ETH | 0.00000313 | |
| 0xe04c99…36ae89 | Approve | 10,710,002 | 33 days agoWed, 15 Jul 2026 21:15:24 UTC | 0x3600…d48a | IN | Fofar | $0.000 ETH | 0.00000317 | |
| 0xbbd7ae…2d1d5c | Approve | 10,709,923 | 33 days agoWed, 15 Jul 2026 21:15:16 UTC | 0xd96f…fc39 | IN | Fofar | $0.000 ETH | 0.00000315 | |
| 0x1600a1…a23c45 | Approve | 10,709,553 | 33 days agoWed, 15 Jul 2026 21:14:39 UTC | 0xb324…788c | IN | Fofar | $0.000 ETH | 0.00000315 | |
| 0x9fc235…082043 | Approve | 10,709,455 | 33 days agoWed, 15 Jul 2026 21:14:29 UTC | 0x3b9d…f412 | IN | Fofar | $0.000 ETH | 0.00000317 | |
| 0xd5057a…bb3cf9 | Approve | 10,709,364 | 33 days agoWed, 15 Jul 2026 21:14:20 UTC | 0xdcca…9479 | IN | Fofar | $0.000 ETH | 0.00000314 | |
| 0x4661ce…8e58f8 | Approve | 10,709,296 | 33 days agoWed, 15 Jul 2026 21:14:13 UTC | 0xdd92…06d3 | IN | Fofar | $0.000 ETH | 0.00000315 | |
| 0xbaf385…f18f2c | Approve | 10,709,207 | 33 days agoWed, 15 Jul 2026 21:14:04 UTC | 0xc924…6a28 | IN | Fofar | $0.000 ETH | 0.00000316 | |
| 0x1927b7…965d15 | Approve | 10,709,148 | 33 days agoWed, 15 Jul 2026 21:13:58 UTC | 0x4655…7107 | IN | Fofar | $0.000 ETH | 0.00000315 | |
| 0xa139e2…a0953e | Approve | 10,709,125 | 33 days agoWed, 15 Jul 2026 21:13:56 UTC | 0x2830…7855 | IN | Fofar | $0.000 ETH | 0.00000314 | |
| 0x421565…4bb082 | Approve | 10,709,106 | 33 days agoWed, 15 Jul 2026 21:13:54 UTC | 0xd700…04f4 | IN | Fofar | $0.000 ETH | 0.00000315 | |
| 0x287f35…cc2691 | Approve | 10,708,947 | 33 days agoWed, 15 Jul 2026 21:13:38 UTC | 0x3a96…629c | IN | Fofar | $0.000 ETH | 0.00000315 | |
| 0x67fb96…007a55 | Approve | 10,708,908 | 33 days agoWed, 15 Jul 2026 21:13:34 UTC | 0xc7ab…ceab | IN | Fofar | $0.000 ETH | 0.00000316 | |
| 0x6a84ab…a84223 | Approve | 10,708,846 | 33 days agoWed, 15 Jul 2026 21:13:28 UTC | 0x6fa4…2815 | IN | Fofar | $0.000 ETH | 0.00000314 | |
| 0x03b385…835fda | Approve | 10,708,808 | 33 days agoWed, 15 Jul 2026 21:13:24 UTC | 0x1298…9130 | IN | Fofar | $0.000 ETH | 0.00000314 | |
| 0x23b549…ca3035 | Approve | 10,708,799 | 33 days agoWed, 15 Jul 2026 21:13:23 UTC | 0x2f2d…5b37 | IN | Fofar | $0.000 ETH | 0.00000318 | |
| 0x997403…711e2e | Approve | 10,708,760 | 33 days agoWed, 15 Jul 2026 21:13:19 UTC | 0x02eb…7bec | IN | Fofar | $0.000 ETH | 0.00000316 | |
| 0x0038f4…59d289 | Approve | 10,708,747 | 33 days agoWed, 15 Jul 2026 21:13:18 UTC | 0x9a1d…11cb | IN | Fofar | $0.000 ETH | 0.00000314 | |
| 0x3291c5…c45b5c | Approve | 10,708,689 | 33 days agoWed, 15 Jul 2026 21:13:12 UTC | 0xba49…0267 | IN | Fofar | $0.000 ETH | 0.00000316 | |
| 0xe32c4c…211832 | Approve | 10,708,659 | 33 days agoWed, 15 Jul 2026 21:13:09 UTC | 0x3c3b…31d5 | IN | Fofar | $0.000 ETH | 0.00000316 | |
| 0xd02b57…f6083d | Approve | 10,708,650 | 33 days agoWed, 15 Jul 2026 21:13:08 UTC | 0x6fe3…fc60 | IN | Fofar | $0.000 ETH | 0.00000316 | |
| 0xc15637…590e79 | Approve | 10,708,638 | 33 days agoWed, 15 Jul 2026 21:13:07 UTC | 0xc353…97f7 | IN | Fofar | $0.000 ETH | 0.00000314 | |
| 0xbd410e…e445a6 | Approve | 10,708,628 | 33 days agoWed, 15 Jul 2026 21:13:06 UTC | 0x929a…0c64 | IN | Fofar | $0.000 ETH | 0.00000315 | |
| 0x73742f…3e77fd | Approve | 10,708,597 | 33 days agoWed, 15 Jul 2026 21:13:03 UTC | 0x20a8…8215 | IN | Fofar | $0.000 ETH | 0.00000314 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 10,687,193 | 33 days agoWed, 15 Jul 2026 20:37:18 UTC | 0x0d7022…1f4c25 | CALL | addInitialLiquidity | 0xec2f…358f | OUT | 0x89e5…9eba | 1 ETH |