// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {CyreneGenesisLocker} from "./CyreneGenesisLocker.sol";
import {CyreneGenesisLockerDeployer} from "./CyreneGenesisLockerDeployer.sol";
import {CyreneGenesisToken} from "./CyreneGenesisToken.sol";
import {CyreneGenesisVesting} from "./CyreneGenesisVesting.sol";
import {CyreneGenesisVestingDeployer} from "./CyreneGenesisVestingDeployer.sol";
import {Math} from "./Math.sol";
import {TickMath} from "./TickMath.sol";
import {
BalanceDelta,
Currency,
IERC20Minimal,
IHooks,
IPermit2,
IUnlockCallback,
IWETH,
IV4PoolManager,
IV4PositionManager,
PoolKey,
SwapParams,
V4Actions
} from "./interfaces/IUniswapV4.sol";
contract CyreneGenesisFactory is IUnlockCallback {
uint16 public constant DEFAULT_SALE_SUPPLY_BPS = 9900;
address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
address public owner;
address public protocolFeeRecipient;
address public immutable tokenImplementation;
address public immutable weth;
address public immutable usdg;
IV4PoolManager public immutable poolManager;
IV4PositionManager public immutable positionManager;
IPermit2 public immutable permit2;
CyreneGenesisLockerDeployer public immutable lockerDeployer;
CyreneGenesisVestingDeployer public immutable vestingDeployer;
mapping(address => address) public lockerOf;
mapping(address => address) public vestingOf;
mapping(address => address) public quoteOfToken;
mapping(address => bytes32) public poolOf;
mapping(bytes32 => address) public tokenOfPool;
mapping(address => bool) public isToken;
address[] public allTokens;
event Launched(
address indexed token,
bytes32 indexed poolId,
address indexed creator,
address locker,
address vesting,
address quoteAsset,
uint256 startMarketCapQuote
);
event OwnerUpdated(address owner);
event ProtocolFeeRecipientUpdated(address protocolFeeRecipient);
struct LaunchConfig {
uint256 totalSupply;
uint16 creatorVestingBps;
uint64 vestingCliffSeconds;
uint64 vestingDurationSeconds;
uint64 lpUnlockTime;
address quoteAsset;
uint24 poolFee;
int24 tickSpacing;
int24 startTickAbs;
int24 tickLower;
int24 tickUpper;
uint16 saleSupplyBps;
uint256 startMarketCapQuote;
uint256 firstBuyQuoteAmount;
uint256 minFirstBuyTokens;
address partnerFeeRecipient;
uint16 creatorFeeBps;
uint16 protocolFeeBps;
uint16 partnerFeeBps;
}
modifier onlyOwner() {
require(msg.sender == owner, "owner");
_;
}
constructor(
address _protocolFeeRecipient,
address _weth,
address _usdg,
address _poolManager,
address _positionManager,
address _permit2,
address _lockerDeployer,
address _vestingDeployer
) {
require(_protocolFeeRecipient != address(0), "protocol");
require(_weth != address(0), "weth");
require(_poolManager != address(0), "pool manager");
require(_positionManager != address(0), "position manager");
require(_permit2 != address(0), "permit2");
require(_lockerDeployer != address(0), "locker deployer");
require(_vestingDeployer != address(0), "vesting deployer");
owner = msg.sender;
protocolFeeRecipient = _protocolFeeRecipient;
weth = _weth;
usdg = _usdg;
poolManager = IV4PoolManager(_poolManager);
positionManager = IV4PositionManager(_positionManager);
permit2 = IPermit2(_permit2);
lockerDeployer = CyreneGenesisLockerDeployer(_lockerDeployer);
vestingDeployer = CyreneGenesisVestingDeployer(_vestingDeployer);
tokenImplementation = address(new CyreneGenesisToken());
}
function launch(CyreneGenesisToken.Meta calldata meta, LaunchConfig calldata config)
external
payable
returns (address tokenAddr, bytes32 poolId, address locker, address vesting)
{
_validate(config);
address quote = _quoteAsset(config);
require(msg.value == ((quote == weth || quote == address(0)) ? config.firstBuyQuoteAmount : 0), "value");
CyreneGenesisToken token = _cloneToken(meta, config.totalSupply);
tokenAddr = address(token);
isToken[tokenAddr] = true;
vesting = _deployVesting(token, tokenAddr, config);
uint256 poolTokens = config.totalSupply * _saleSupplyBps(config) / 10000;
require(poolTokens > 0, "pool tokens");
(poolId, locker) = _createPool(token, tokenAddr, config, poolTokens);
_burnRemainder(token);
poolOf[tokenAddr] = poolId;
lockerOf[tokenAddr] = locker;
vestingOf[tokenAddr] = vesting;
quoteOfToken[tokenAddr] = _quoteAsset(config);
allTokens.push(tokenAddr);
token.setLaunchContracts(poolId, locker, vesting);
if (config.firstBuyQuoteAmount > 0) {
_firstBuy(token, _poolKey(tokenAddr, config), quote, config.firstBuyQuoteAmount, config.minFirstBuyTokens, msg.sender);
}
emit Launched(tokenAddr, poolId, msg.sender, locker, vesting, _quoteAsset(config), config.startMarketCapQuote);
}
function allTokensLength() external view returns (uint256) {
return allTokens.length;
}
function setProtocolFeeRecipient(address account) external onlyOwner {
require(account != address(0), "protocol");
protocolFeeRecipient = account;
emit ProtocolFeeRecipientUpdated(account);
}
function transferOwnership(address account) external onlyOwner {
require(account != address(0), "owner");
owner = account;
emit OwnerUpdated(account);
}
function removeLiquidity(address token, uint16 bps) external onlyOwner {
address locker = lockerOf[token];
require(locker != address(0), "token");
CyreneGenesisLocker(payable(locker)).removeLiquidity(bps);
}
function setLockerClaimBlocked(address token, address account, bool blocked) external onlyOwner {
address locker = lockerOf[token];
require(locker != address(0), "token");
CyreneGenesisLocker(payable(locker)).setClaimBlocked(account, blocked);
}
function claimBlockedLockerFee(address token, address account) external onlyOwner {
address locker = lockerOf[token];
require(locker != address(0), "token");
CyreneGenesisLocker(payable(locker)).claimBlockedFee(account, owner);
}
function setVestingClaimBlocked(address token, bool blocked) external onlyOwner {
address vesting = vestingOf[token];
require(vesting != address(0), "token");
CyreneGenesisVesting(vesting).setClaimBlocked(blocked);
}
function _validate(LaunchConfig calldata c) internal view {
require(c.totalSupply > 0, "supply");
require(c.poolFee > 0, "pool fee");
require(c.creatorVestingBps <= 10000, "vesting bps");
require(c.creatorVestingBps + _saleSupplyBps(c) <= 10000, "supply split");
require(c.creatorVestingBps == 0 || (c.vestingDurationSeconds > 0 && c.vestingCliffSeconds <= c.vestingDurationSeconds), "vesting");
require(c.tickLower < c.tickUpper, "ticks");
require(c.startTickAbs > 0, "start tick");
require(c.firstBuyQuoteAmount == 0 || c.minFirstBuyTokens > 0, "min buy");
require(c.partnerFeeRecipient != address(0) || c.partnerFeeBps == 0, "partner");
require(c.protocolFeeBps >= 3000, "protocol fee");
require(uint256(c.creatorFeeBps) + c.protocolFeeBps + c.partnerFeeBps == 10000, "split");
}
function _cloneToken(CyreneGenesisToken.Meta calldata meta, uint256 totalSupply)
internal
returns (CyreneGenesisToken token)
{
address impl = tokenImplementation;
address clone;
assembly {
let ptr := mload(0x40)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
mstore(add(ptr, 0x14), shl(0x60, impl))
mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
clone := create(0, ptr, 0x37)
}
require(clone != address(0), "clone");
token = CyreneGenesisToken(clone);
token.initialize(meta, totalSupply, msg.sender, address(this));
}
function _poolKey(address tokenAddr, LaunchConfig calldata config) internal view returns (PoolKey memory) {
address quote = _quoteAsset(config);
(address currency0, address currency1) = quote < tokenAddr ? (quote, tokenAddr) : (tokenAddr, quote);
return PoolKey({
currency0: Currency.wrap(currency0),
currency1: Currency.wrap(currency1),
fee: config.poolFee,
tickSpacing: config.tickSpacing,
hooks: IHooks(address(0))
});
}
function _createPool(
CyreneGenesisToken token,
address tokenAddr,
LaunchConfig calldata config,
uint256 poolTokens
) internal returns (bytes32 poolId, address locker) {
PoolKey memory key = _poolKey(tokenAddr, config);
poolId = _poolId(key);
tokenOfPool[poolId] = tokenAddr;
(int24 tickLower, int24 tickUpper, int24 startTick) = _positionTicks(tokenAddr, key, config);
poolManager.initialize(key, TickMath.getSqrtRatioAtTick(startTick));
uint128 liquidity = _liquidityForTokenAmount(tokenAddr, key, tickLower, tickUpper, poolTokens);
locker = _mintLockedPosition(token, tokenAddr, key, config, poolTokens, liquidity);
}
function _deployVesting(
CyreneGenesisToken token,
address tokenAddr,
LaunchConfig calldata config
) internal returns (address vesting) {
uint256 vestingTokens = config.totalSupply * config.creatorVestingBps / 10000;
if (vestingTokens == 0) return address(0);
vesting = vestingDeployer.deploy(
tokenAddr,
msg.sender,
address(this),
vestingTokens,
config.vestingCliffSeconds,
config.vestingDurationSeconds
);
require(token.transfer(vesting, vestingTokens), "vesting transfer");
}
function _mintLockedPosition(
CyreneGenesisToken token,
address tokenAddr,
PoolKey memory key,
LaunchConfig calldata config,
uint256 poolTokens,
uint128 liquidity
) internal returns (address locker) {
int24 mintTickLower = _mintTickLower(tokenAddr, key, config);
int24 mintTickUpper = _mintTickUpper(tokenAddr, key, config);
locker = lockerDeployer.deploy(
address(positionManager),
address(this),
msg.sender,
protocolFeeRecipient,
config.partnerFeeRecipient,
key,
config.creatorFeeBps,
config.protocolFeeBps,
config.partnerFeeBps,
config.lpUnlockTime,
liquidity,
mintTickLower,
mintTickUpper
);
require(token.approve(address(permit2), poolTokens), "permit approve");
require(token.approve(address(positionManager), poolTokens), "pm approve");
permit2.approve(tokenAddr, address(positionManager), uint160(poolTokens), uint48(block.timestamp + 1 days));
uint256 lpTokenId = positionManager.nextTokenId();
bytes memory actions = abi.encodePacked(uint8(V4Actions.MINT_POSITION), uint8(V4Actions.SETTLE_PAIR));
bytes[] memory params = new bytes[](2);
params[0] = abi.encode(
key,
_mintTickLower(tokenAddr, key, config),
_mintTickUpper(tokenAddr, key, config),
uint256(liquidity),
uint128(Currency.unwrap(key.currency0) == tokenAddr ? poolTokens : 0),
uint128(Currency.unwrap(key.currency1) == tokenAddr ? poolTokens : 0),
locker,
bytes("")
);
params[1] = abi.encode(key.currency0, key.currency1);
positionManager.modifyLiquidities(abi.encode(actions, params), block.timestamp + 300);
CyreneGenesisLocker(payable(locker)).setTokenId(lpTokenId);
}
function _firstBuy(
CyreneGenesisToken token,
PoolKey memory key,
address quote,
uint256 amountIn,
uint256 minOut,
address recipient
) internal {
if (quote == weth) {
IWETH(weth).deposit{value: amountIn}();
} else if (quote != address(0)) {
require(IERC20Minimal(quote).transferFrom(recipient, address(this), amountIn), "quote transfer");
}
poolManager.unlock(abi.encode(token, key, quote, amountIn, minOut, recipient));
}
function unlockCallback(bytes calldata data) external returns (bytes memory) {
require(msg.sender == address(poolManager), "pool manager");
(CyreneGenesisToken token, PoolKey memory key, address quote, uint256 amountIn, uint256 minOut, address recipient) =
abi.decode(data, (CyreneGenesisToken, PoolKey, address, uint256, uint256, address));
bool quoteIsToken0 = Currency.unwrap(key.currency0) == quote;
Currency input = quoteIsToken0 ? key.currency0 : key.currency1;
Currency output = quoteIsToken0 ? key.currency1 : key.currency0;
uint160 sqrtPriceLimitX96 = quoteIsToken0
? TickMath.getSqrtRatioAtTick(int24(TickMath.MIN_TICK + 1))
: TickMath.getSqrtRatioAtTick(int24(TickMath.MAX_TICK - 1));
BalanceDelta delta = poolManager.swap(
key,
SwapParams({zeroForOne: quoteIsToken0, amountSpecified: -int256(amountIn), sqrtPriceLimitX96: sqrtPriceLimitX96}),
bytes("")
);
uint256 out = _tokenOutFromDelta(delta, quoteIsToken0);
require(out >= minOut, "slippage");
poolManager.sync(input);
if (quote == address(0)) {
poolManager.settle{value: amountIn}();
} else {
require(IERC20Minimal(quote).transfer(address(poolManager), amountIn), "quote settle");
poolManager.settle();
}
poolManager.take(output, address(this), out);
require(token.transfer(recipient, out), "buy transfer");
return bytes("");
}
function _tokenOutFromDelta(BalanceDelta delta, bool quoteIsToken0) internal pure returns (uint256) {
int256 raw = BalanceDelta.unwrap(delta);
int128 a0 = int128(raw >> 128);
int128 a1 = int128(raw);
int128 output = quoteIsToken0 ? a1 : a0;
return output > 0 ? uint256(uint128(output)) : 0;
}
function _quoteAsset(LaunchConfig calldata c) internal view returns (address) {
return c.quoteAsset;
}
function _saleSupplyBps(LaunchConfig calldata c) internal pure returns (uint16) {
return c.saleSupplyBps == 0 ? DEFAULT_SALE_SUPPLY_BPS : c.saleSupplyBps;
}
function _burnRemainder(CyreneGenesisToken token) internal {
uint256 balance = token.balanceOf(address(this));
if (balance > 0) require(token.transfer(DEAD, balance), "burn transfer");
}
function _liquidityForTokenAmount(
address tokenAddr,
PoolKey memory key,
int24 tickLower,
int24 tickUpper,
uint256 poolTokens
) internal pure returns (uint128) {
uint160 sqrtLower = TickMath.getSqrtRatioAtTick(tickLower);
uint160 sqrtUpper = TickMath.getSqrtRatioAtTick(tickUpper);
uint256 liquidity;
if (Currency.unwrap(key.currency0) == tokenAddr) {
liquidity = Math.mulDiv(
poolTokens,
Math.mulDiv(uint256(sqrtLower), uint256(sqrtUpper), 1 << 96),
uint256(sqrtUpper) - uint256(sqrtLower)
);
} else {
liquidity = Math.mulDiv(poolTokens, 1 << 96, uint256(sqrtUpper) - uint256(sqrtLower));
}
require(liquidity <= type(uint128).max, "liquidity");
require(liquidity > 0, "liquidity zero");
return uint128(liquidity);
}
function _positionTicks(address tokenAddr, PoolKey memory key, LaunchConfig calldata config)
internal
pure
returns (int24 tickLower, int24 tickUpper, int24 startTick)
{
if (Currency.unwrap(key.currency0) == tokenAddr) {
startTick = -config.startTickAbs;
tickLower = startTick;
tickUpper = config.tickUpper;
} else {
startTick = config.startTickAbs;
tickLower = config.tickLower;
tickUpper = startTick;
}
require(tickLower < tickUpper, "range");
}
function _mintTickLower(address tokenAddr, PoolKey memory key, LaunchConfig calldata config) internal pure returns (int24) {
(int24 tickLower,,) = _positionTicks(tokenAddr, key, config);
return tickLower;
}
function _mintTickUpper(address tokenAddr, PoolKey memory key, LaunchConfig calldata config) internal pure returns (int24) {
(, int24 tickUpper,) = _positionTicks(tokenAddr, key, config);
return tickUpper;
}
function _poolId(PoolKey memory key) internal pure returns (bytes32) {
return keccak256(abi.encode(key.currency0, key.currency1, key.fee, key.tickSpacing, address(key.hooks)));
}
}[
{
"type": "constructor",
"inputs": [
{
"name": "_protocolFeeRecipient",
"type": "address",
"internalType": "address"
},
{
"name": "_weth",
"type": "address",
"internalType": "address"
},
{
"name": "_usdg",
"type": "address",
"internalType": "address"
},
{
"name": "_poolManager",
"type": "address",
"internalType": "address"
},
{
"name": "_positionManager",
"type": "address",
"internalType": "address"
},
{
"name": "_permit2",
"type": "address",
"internalType": "address"
},
{
"name": "_lockerDeployer",
"type": "address",
"internalType": "address"
},
{
"name": "_vestingDeployer",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "nonpayable"
},
{
"name": "Launched",
"type": "event",
"inputs": [
{
"name": "token",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "poolId",
"type": "bytes32",
"indexed": true,
"internalType": "bytes32"
},
{
"name": "creator",
"type": "address",
"indexed": true,
"internalType": "address"
},
{
"name": "locker",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "vesting",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "quoteAsset",
"type": "address",
"indexed": false,
"internalType": "address"
},
{
"name": "startMarketCapQuote",
"type": "uint256",
"indexed": false,
"internalType": "uint256"
}
],
"anonymous": false
},
{
"name": "OwnerUpdated",
"type": "event",
"inputs": [
{
"name": "owner",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "ProtocolFeeRecipientUpdated",
"type": "event",
"inputs": [
{
"name": "protocolFeeRecipient",
"type": "address",
"indexed": false,
"internalType": "address"
}
],
"anonymous": false
},
{
"name": "DEAD",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "DEFAULT_SALE_SUPPLY_BPS",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint16",
"internalType": "uint16"
}
],
"stateMutability": "view"
},
{
"name": "allTokens",
"type": "function",
"inputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "allTokensLength",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "uint256",
"internalType": "uint256"
}
],
"stateMutability": "view"
},
{
"name": "claimBlockedLockerFee",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "isToken",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bool",
"internalType": "bool"
}
],
"stateMutability": "view"
},
{
"name": "launch",
"type": "function",
"inputs": [
{
"name": "meta",
"type": "tuple",
"components": [
{
"name": "name",
"type": "string",
"internalType": "string"
},
{
"name": "symbol",
"type": "string",
"internalType": "string"
},
{
"name": "description",
"type": "string",
"internalType": "string"
},
{
"name": "image",
"type": "string",
"internalType": "string"
},
{
"name": "website",
"type": "string",
"internalType": "string"
},
{
"name": "telegram",
"type": "string",
"internalType": "string"
},
{
"name": "twitter",
"type": "string",
"internalType": "string"
}
],
"internalType": "struct CyreneGenesisToken.Meta"
},
{
"name": "config",
"type": "tuple",
"components": [
{
"name": "totalSupply",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "creatorVestingBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "vestingCliffSeconds",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "vestingDurationSeconds",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "lpUnlockTime",
"type": "uint64",
"internalType": "uint64"
},
{
"name": "quoteAsset",
"type": "address",
"internalType": "address"
},
{
"name": "poolFee",
"type": "uint24",
"internalType": "uint24"
},
{
"name": "tickSpacing",
"type": "int24",
"internalType": "int24"
},
{
"name": "startTickAbs",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickLower",
"type": "int24",
"internalType": "int24"
},
{
"name": "tickUpper",
"type": "int24",
"internalType": "int24"
},
{
"name": "saleSupplyBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "startMarketCapQuote",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "firstBuyQuoteAmount",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "minFirstBuyTokens",
"type": "uint256",
"internalType": "uint256"
},
{
"name": "partnerFeeRecipient",
"type": "address",
"internalType": "address"
},
{
"name": "creatorFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "protocolFeeBps",
"type": "uint16",
"internalType": "uint16"
},
{
"name": "partnerFeeBps",
"type": "uint16",
"internalType": "uint16"
}
],
"internalType": "struct CyreneGenesisFactory.LaunchConfig"
}
],
"outputs": [
{
"name": "tokenAddr",
"type": "address",
"internalType": "address"
},
{
"name": "poolId",
"type": "bytes32",
"internalType": "bytes32"
},
{
"name": "locker",
"type": "address",
"internalType": "address"
},
{
"name": "vesting",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "payable"
},
{
"name": "lockerDeployer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract CyreneGenesisLockerDeployer"
}
],
"stateMutability": "view"
},
{
"name": "lockerOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "owner",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "permit2",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IPermit2"
}
],
"stateMutability": "view"
},
{
"name": "poolManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IV4PoolManager"
}
],
"stateMutability": "view"
},
{
"name": "poolOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"stateMutability": "view"
},
{
"name": "positionManager",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract IV4PositionManager"
}
],
"stateMutability": "view"
},
{
"name": "protocolFeeRecipient",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "quoteOfToken",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "removeLiquidity",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "bps",
"type": "uint16",
"internalType": "uint16"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setLockerClaimBlocked",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "account",
"type": "address",
"internalType": "address"
},
{
"name": "blocked",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setProtocolFeeRecipient",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "setVestingClaimBlocked",
"type": "function",
"inputs": [
{
"name": "token",
"type": "address",
"internalType": "address"
},
{
"name": "blocked",
"type": "bool",
"internalType": "bool"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "tokenImplementation",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "tokenOfPool",
"type": "function",
"inputs": [
{
"name": "",
"type": "bytes32",
"internalType": "bytes32"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "transferOwnership",
"type": "function",
"inputs": [
{
"name": "account",
"type": "address",
"internalType": "address"
}
],
"outputs": [],
"stateMutability": "nonpayable"
},
{
"name": "unlockCallback",
"type": "function",
"inputs": [
{
"name": "data",
"type": "bytes",
"internalType": "bytes"
}
],
"outputs": [
{
"name": "",
"type": "bytes",
"internalType": "bytes"
}
],
"stateMutability": "nonpayable"
},
{
"name": "usdg",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "vestingDeployer",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "contract CyreneGenesisVestingDeployer"
}
],
"stateMutability": "view"
},
{
"name": "vestingOf",
"type": "function",
"inputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
},
{
"name": "weth",
"type": "function",
"inputs": [],
"outputs": [
{
"name": "",
"type": "address",
"internalType": "address"
}
],
"stateMutability": "view"
}
]0x61018034620003a4576200555d601f38829003908101601f19168301906001600160401b03908183118584101762000233578085946040948552853961010094859181010312620003a4576200005583620003a8565b9160209262000066848601620003a8565b9262000074838701620003a8565b936200008360608801620003a8565b946200009260808901620003a8565b90620000a160a08a01620003a8565b92620000be60e0620000b660c08d01620003a8565b9b01620003a8565b976001600160a01b039687169081156200037557878316156200034b57871693841562000318578716948515620002e15787169a8b15620002b35787169889156200027d578716998a1562000247575060018060a01b031933815f5416175f55600154161760015560a05260c05260e052875261012095865261014093845261016094855282519061196c9081830190838210908211176200023357829162003bf1833903905ff0801562000229571660805251926138339485620003be863960805185818161039d015261246b015260a0518581816104a6015281816109a30152612b3d015260c05185610e08015260e051858181610c8d01528181611218015281816128040152612be40152518481816106310152818161316301528181613256015281816132e30152818161334f0152818161351a015261356f01525183818161029801526131ea0152518281816108df0152613199015251818181610359015261260c0152f35b82513d5f823e3d90fd5b634e487b7160e01b5f52604160045260245ffd5b60649089519062461bcd60e51b82526004820152601060248201526f3b32b9ba34b733903232b83637bcb2b960811b6044820152fd5b885162461bcd60e51b8152600481018c9052600f60248201526e3637b1b5b2b9103232b83637bcb2b960891b6044820152606490fd5b885162461bcd60e51b8152600481018c905260076024820152663832b936b4ba1960c91b6044820152606490fd5b885162461bcd60e51b8152600481018c9052601060248201526f3837b9b4ba34b7b71036b0b730b3b2b960811b6044820152606490fd5b885162461bcd60e51b8152600481018c9052600c60248201526b3837b7b61036b0b730b3b2b960a11b6044820152606490fd5b885162461bcd60e51b815260048082018d90526024820152630eecae8d60e31b6044820152606490fd5b885162461bcd60e51b8152600481018c905260086024820152671c1c9bdd1bd8dbdb60c21b6044820152606490fd5b5f80fd5b51906001600160a01b0382168203620003a45756fe60806040526004361015610011575f80fd5b5f3560e01c806303fd2a45146101d45780630ae89127146101cf578063104ad631146101ca57806312261ee7146101c5578063184cfbab146101c057806319f37361146101bb5780632e97d9a8146101b65780632f3a3d5d146101b15780633d82181d146101ac5780633fc8cef3146101a757806344e30d78146101a2578063634282af1461019d57806364df049e14610198578063791b98bc146101935780638cb7fd771461018e5780638da5cb5b1461018957806391dd734614610184578063988b1fa71461017f578063a2700a3b1461017a578063c1caea8314610175578063c47cfca114610170578063d0c509db1461016b578063d138dbf114610166578063dbb80e4214610161578063dc4c90d31461015c578063e521cb9214610157578063f2fde38b146101525763f5b91b7b1461014d575f80fd5b610df3565b610d76565b610cbc565b610c78565b610c5b565b610c3f565b61094b565b61090e565b6108ca565b610825565b6107ea565b610784565b610703565b61066c565b61061c565b6105f4565b61059a565b6104d5565b610491565b6103d6565b610388565b610344565b610304565b6102c7565b610283565b610246565b610203565b6101e7565b5f9103126101e357565b5f80fd5b346101e3575f3660031901126101e357602060405161dead8152f35b346101e35760203660031901126101e3576004355f526006602052602060018060a01b0360405f205416604051908152f35b6001600160a01b038116036101e357565b346101e35760203660031901126101e357602060043561026581610235565b60018060a01b038091165f526004825260405f205416604051908152f35b346101e3575f3660031901126101e3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101e35760203660031901126101e35760206004356102e681610235565b60018060a01b038091165f526002825260405f205416604051908152f35b346101e35760203660031901126101e35760043561032181610235565b60018060a01b03165f526007602052602060ff60405f2054166040519015158152f35b346101e3575f3660031901126101e3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101e3575f3660031901126101e3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b801515036101e357565b346101e35760403660031901126101e3576004356103f381610235565b60243590610400826103cc565b5f546001600160a01b0391829161041a9083163314610e37565b165f908152600360205260409020546001600160a01b03161661043e811515610e6b565b803b156101e357604051637a47676360e01b81528215156004820152905f908290818381602481015b03925af1801561048c5761047757005b8061048461048a92610eb3565b806101d9565b005b610f3d565b346101e3575f3660031901126101e3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101e35760603660031901126101e3576004356104f281610235565b6024356104fe81610235565b6044359161050b836103cc565b5f546001600160a01b039182916105259083163314610e37565b165f908152600260205260409020546001600160a01b0316169161054a831515610e6b565b823b156101e35760405163361e393f60e01b81526001600160a01b03909216600483015215156024820152905f90829081838160448101610467565b634e487b7160e01b5f52603260045260245ffd5b346101e35760203660031901126101e3576004356008548110156101e35760085f527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301546040516001600160a01b039091168152602090f35b346101e3575f3660031901126101e3576001546040516001600160a01b039091168152602090f35b346101e3575f3660031901126101e3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b61ffff8116036101e357565b346101e35760403660031901126101e35760043561068981610235565b6024359061069682610660565b5f546001600160a01b039182916106b09083163314610e37565b165f908152600260205260409020546001600160a01b0316166106d4811515610e6b565b803b156101e35760405163a394cfd760e01b815261ffff83166004820152905f90829081838160248101610467565b346101e3575f3660031901126101e3575f546040516001600160a01b039091168152602090f35b5f5b83811061073b5750505f910152565b818101518382015260200161072c565b906020916107648151809281855285808601910161072a565b601f01601f1916010190565b90602061078192818152019061074b565b90565b346101e35760203660031901126101e3576001600160401b036004358181116101e357366023820112156101e35780600401359182116101e35736602483830101116101e3576107e69160246107da920161120e565b60405191829182610770565b0390f35b346101e35760203660031901126101e35760043561080781610235565b60018060a01b03165f526005602052602060405f2054604051908152f35b346101e35760403660031901126101e35760043561084281610235565b60243561084e81610235565b5f546001600160a01b03908116928190610869338614610e37565b165f908152600260205260409020546001600160a01b0316169161088e831515610e6b565b823b156101e357604051638b06813360e01b81526001600160a01b03928316600482015291166024820152905f90829081838160448101610467565b346101e3575f3660031901126101e3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101e35760203660031901126101e357602060043561092d81610235565b60018060a01b038091165f526003825260405f205416604051908152f35b600319610280368201126101e357600435906001600160401b0382116101e35760e09082360301126101e3576102603660231901126101e35761098c6120f1565b610994612033565b6001600160a01b0391908083167f000000000000000000000000000000000000000000000000000000000000000084168114908115610c36575b5015610c2d576109e36101c4355b34146115a8565b6109f3602435809360040161244c565b92831691610a21610a148460018060a01b03165f52600760205260405f2090565b805460ff19166001179055565b610a67610a55610a4d610a34868861256a565b93610a47610a406126e9565b61ffff1690565b90611894565b612710900490565b610a608115156118d6565b8486612744565b9094610a72816128b5565b6001600160a01b0385165f90815260056020908152604080832089905560029091529020610abc9083905b80546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b0385165f908152600360205260409020610ade908490610a9d565b610b05610ae9612033565b6001600160a01b0387165f908152600460205260409020610a9d565b610b0e85611910565b843b156101e357604051631375482760e21b8152600481018790526001600160a01b03838116602483015284166044820152935f85606481838a5af194851561048c576107e695610c1a575b506101c4359182610bf8575b505050610b71612033565b604080516001600160a01b038481168252858116602083015292909216908201526101a43560608201523390869086907fa147aafe4da85ef5d6da764e8d4560c33f7a713dfff4725d58b31589a2fa524c90608090a4604080516001600160a01b039586168152602081019690965290841690850152909116606083015281906080820190565b610c1292610c0588612974565b9233936101e43593612b2c565b5f8080610b66565b80610484610c2792610eb3565b5f610b5a565b6109e35f6109dc565b9050155f6109ce565b346101e3575f3660031901126101e35760206040516126ac8152f35b346101e3575f3660031901126101e3576020600854604051908152f35b346101e3575f3660031901126101e3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346101e35760203660031901126101e357600435610cd981610235565b5f546001600160a01b0390610cf19082163314610e37565b81168015610d4657600180546001600160a01b0319169190911790556040516001600160a01b039190911681527fc1b5345cce283376356748dc57f2dfa7120431d016fc7ca9ba641bc65f91411d90602090a1005b60405162461bcd60e51b81526020600482015260086024820152671c1c9bdd1bd8dbdb60c21b6044820152606490fd5b346101e35760203660031901126101e3577f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b6020600435610db681610235565b5f54906001600160a01b0390610dcf3383851614610e37565b168091610ddd821515610e37565b6001600160a01b031916175f55604051908152a1005b346101e3575f3660031901126101e3576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b15610e3e57565b60405162461bcd60e51b815260206004820152600560248201526437bbb732b960d91b6044820152606490fd5b15610e7257565b60405162461bcd60e51b81526020600482015260056024820152643a37b5b2b760d91b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b6001600160401b038111610ec657604052565b610e9f565b60a081019081106001600160401b03821117610ec657604052565b606081019081106001600160401b03821117610ec657604052565b60c081019081106001600160401b03821117610ec657604052565b90601f801991011681019081106001600160401b03821117610ec657604052565b6040513d5f823e3d90fd5b15610f4f57565b60405162461bcd60e51b815260206004820152600c60248201526b3837b7b61036b0b730b3b2b960a11b6044820152606490fd5b60405190610f9082610ee6565b565b62ffffff8116036101e357565b8060020b036101e357565b3590610f9082610235565b809291039161014083126101e35760a08135610fd081610235565b93601f1901126101e357604051610fe681610ecb565b6020820135610ff481610235565b8152604082013561100481610235565b6020820152606082013561101781610f92565b6040820152608082013561102a81610f9f565b606082015260a082013561103d81610235565b60808201529161104f60c08301610faa565b9160e0810135916107816101206101008401359301610faa565b634e487b7160e01b5f52601160045260245ffd5b600160ff1b811461108d575f0390565b611069565b60405190602082018281106001600160401b03821117610ec6576040525f8252565b908160209103126101e3575190565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b610781939261111882610120946110c3565b8051151560a0830152602081015160c0830152604001516001600160a01b031660e08201526101008101829052019061074b565b1561115357565b60405162461bcd60e51b8152602060048201526008602482015267736c69707061676560c01b6044820152606490fd5b908160209103126101e35751610781816103cc565b1561119f57565b60405162461bcd60e51b815260206004820152600c60248201526b71756f746520736574746c6560a01b6044820152606490fd5b156111da57565b60405162461bcd60e51b815260206004820152600c60248201526b313abc903a3930b739b332b960a11b6044820152606490fd5b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169290916112da91839161125991611251338814610f48565b810190610fb5565b97939891929590951691611273895160018060a01b031690565b808516841493841561159457815b851561158e575060208b01516001600160a01b0316945b8015611581576112a6611a58565b6112af8561107d565b6112b7610f83565b831515815260209e8f928383015260409d8e948584019060018060a01b03169052565b6112ff6112e5611092565b9451633cf3645360e21b8152948593849360048501611106565b03815f8a5af191821561048c5761132c92611323928f5f92611564575b5050611d89565b9889101561114c565b833b156101e3578851632961046560e21b81526001600160a01b039290921660048301525f8260248183885af191821561048c578b92611551575b50806114ac57508751630476982d60e21b81529182906004908290865af1801561048c5761147f575b505b803b156101e3578551630b0d9c0960e01b81526001600160a01b03929092166004830152306024830152604482018590525f908290606490829084905af1801561048c576114199688965f93859361146c575b505163a9059cbb60e01b815293166001600160a01b0316600484015260248301949094529094859384929183906044820190565b0393165af190811561048c57611437925f9261143f575b50506111d3565b610781611092565b61145e9250803d10611465575b6114568183610f1c565b810190611183565b5f80611430565b503d61144c565b8061048461147992610eb3565b5f6113e5565b61149e90893d8b116114a5575b6114968183610f1c565b8101906110b4565b505f611390565b503d61148c565b885163a9059cbb60e01b81526001600160a01b03851660048201526024810193909352829060449082905f905af1801561048c576114f1915f91611534575b50611198565b8551630476982d60e21b815288816004815f865af1801561048c57611517575b50611392565b61152d90893d8b116114a5576114968183610f1c565b505f611511565b61154b91508a3d8c11611465576114568183610f1c565b5f6114eb565b8061048461155e92610eb3565b5f611367565b61157a9250803d106114a5576114968183610f1c565b5f8f61131c565b6115896119ee565b6112a6565b94611298565b60208b01516001600160a01b031691611281565b156115af57565b60405162461bcd60e51b815260206004820152600560248201526476616c756560d81b6044820152606490fd5b906ffff97272373d413259a46990580e213a9182810292818404149015171561108d57565b906ffff2e50f5f656932ef12357cf3c7fdcc9182810292818404149015171561108d57565b906fffe5caca7e10e4e61c3624eaa0941cd09182810292818404149015171561108d57565b906fffcb9843d60f6159c9db58835c9266449182810292818404149015171561108d57565b906fff973b41fa98c081472e6896dfb254c09182810292818404149015171561108d57565b906fff2ea16466c96a3843ec78b326b528619182810292818404149015171561108d57565b906ffe5dee046a99a2a811c461f1969c30539182810292818404149015171561108d57565b906ffcbe86c7900a88aedcffc83b479aa3a49182810292818404149015171561108d57565b906ff987a7253ac413176f2b074cf7815e549182810292818404149015171561108d57565b906ff3392b0822b70005940c7a398e4b70f39182810292818404149015171561108d57565b906fe7159475a2c29b7443b29c7fa6e889d99182810292818404149015171561108d57565b906fd097f3bdfd2022b8845ad8f792aa58259182810292818404149015171561108d57565b906fa9f746462d870fdf8a65dc1f90e061e59182810292818404149015171561108d57565b906f70d869a156d2a1b890bb3df62baf32f79182810292818404149015171561108d57565b906f31be135f97d08fd981231505542fcfa69182810292818404149015171561108d57565b906f09aa508b5b7a84e1c677de54f3e99bc99182810292818404149015171561108d57565b906e5d6af8dedb81196699c329225ee6049182810292818404149015171561108d57565b906d2216e584f5fa1ea926041bedfe989182810292818404149015171561108d57565b906b048a170391f7dc42444e8fa29182810292818404149015171561108d57565b8181029291811591840414171561108d57565b634e487b7160e01b5f52601260045260245ffd5b80156118c7575f190490565b6118a7565b81156118c7570490565b156118dd57565b60405162461bcd60e51b815260206004820152600b60248201526a706f6f6c20746f6b656e7360a81b6044820152606490fd5b60085468010000000000000000811015610ec65760018101806008558110156119785760085f527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b03909216919091179055565b610586565b60020b627fffff19811461108d575f0390565b1561199757565b606460405162461bcd60e51b81526020600482015260046024820152637469636b60e01b6044820152fd5b9062015180820180921161108d57565b9061012c820180921161108d57565b9190820180921161108d57565b611a23611a1b7c38665f117878f5596384fb0421d6a277268b88ffb7a4196032db14cb385b60801c611873565b60801c6118bb565b63ffffffff8160201c9116155f14611a4f5760ff5f5b16810180911161108d576001600160a01b031690565b60ff6001611a39565b611a74611a136f01a78b37816912cce622050c8bd8179d611850565b63ffffffff8160a01c9160801c16155f14611a4f576001600160a01b031690565b611bd1610781918060020b905f82125f14611d7e57611ab9611ab9611ac19261197d565b62ffffff1690565b905b611ad2620d89e8831115611990565b6001821615611d6c576001600160881b036ffffcb933bd6fad37aa2d162d1a5940015b169160028116611d59575b60048116611d46575b60088116611d33575b60108116611d20575b60208116611d0d575b60408116611cfa575b60808116611ce7575b6101008116611cd4575b6102008116611cc1575b6104008116611cae575b6108008116611c9b575b6110008116611c88575b6120008116611c75575b6140008116611c62575b6180008116611c4f575b620100008116611c3c575b620200008116611c29575b620400008116611c10575b6208000016611bf4575b5f12611be6575b63ffffffff8116611bdd5760ff5f5b169060201c6119e1565b6001600160a01b031690565b60ff6001611bc7565b611bef906118bb565b611bb8565b90611c08611c025f92611873565b60801c90565b919050611bb1565b91611c21611c026208000092611850565b929050611ba7565b91611c02611c369161182c565b91611b9c565b91611c02611c4991611807565b91611b91565b91611c02611c5c916117e2565b91611b86565b91611c02611c6f916117bd565b91611b7c565b91611c02611c8291611798565b91611b72565b91611c02611c9591611773565b91611b68565b91611c02611ca89161174e565b91611b5e565b91611c02611cbb91611729565b91611b54565b91611c02611cce91611704565b91611b4a565b91611c02611ce1916116df565b91611b40565b91611c02611cf4916116ba565b91611b36565b91611c02611d0791611695565b91611b2d565b91611c02611d1a91611670565b91611b24565b91611c02611d2d9161164b565b91611b1b565b91611c02611d4091611626565b91611b12565b91611c02611d5391611601565b91611b09565b91611c02611d66916115dc565b91611b00565b6001600160881b03600160801b611af5565b62ffffff1690611ac3565b9015611db057600f0b5b5f81600f0b135f14611dab576001600160801b031690565b505f90565b60801d600f0b611d93565b15611dc257565b60405162461bcd60e51b8152602060048201526006602482015265737570706c7960d01b6044820152606490fd5b60e43561078181610f92565b15611e0357565b60405162461bcd60e51b8152602060048201526008602482015267706f6f6c2066656560c01b6044820152606490fd5b60443561078181610660565b6102643561078181610660565b6102443561078181610660565b6102243561078181610660565b15611e6d57565b60405162461bcd60e51b815260206004820152600b60248201526a76657374696e672062707360a81b6044820152606490fd5b91909161ffff8080941691160191821161108d57565b15611ebd57565b60405162461bcd60e51b815260206004820152600c60248201526b1cdd5c1c1b1e481cdc1b1a5d60a21b6044820152606490fd5b6084356001600160401b03811681036101e35790565b6064356001600160401b03811681036101e35790565b60a4356001600160401b03811681036101e35790565b15611f3a57565b60405162461bcd60e51b815260206004820152600760248201526676657374696e6760c81b6044820152606490fd5b6101443561078181610f9f565b6101643561078181610f9f565b6101243561078181610f9f565b15611f9757565b60405162461bcd60e51b81526020600482015260056024820152647469636b7360d81b6044820152606490fd5b15611fcb57565b60405162461bcd60e51b815260206004820152600a6024820152697374617274207469636b60b01b6044820152606490fd5b1561200457565b60405162461bcd60e51b81526020600482015260076024820152666d696e2062757960c81b6044820152606490fd5b60c43561078181610235565b6102043561078181610235565b1561205357565b60405162461bcd60e51b81526020600482015260076024820152663830b93a3732b960c91b6044820152606490fd5b1561208957565b60405162461bcd60e51b815260206004820152600c60248201526b70726f746f636f6c2066656560a01b6044820152606490fd5b156120c457565b60405162461bcd60e51b81526020600482015260056024820152641cdc1b1a5d60da1b6044820152606490fd5b6120fe6024351515611dbb565b61211562ffffff61210d611df0565b161515611dfc565b610f906127106121fe610bb861ffff6121398482612131611e33565b161115611e66565b61216084612159610a4061214b611e33565b6121536126e9565b90611ea0565b1115611eb6565b80612169611e33565b16158015612254575b61217b90611f33565b6121a1612186611f69565b612197612191611f76565b60020b90565b9060020b12611f90565b6121b65f6121ad611f83565b60020b13611fc4565b6101c435158015612248575b6121cb90611ffd565b6001600160a01b036121db61203f565b1615801590612231575b6121ee9061204c565b6121f6611e4c565b161015612082565b61222b61222061220f610a40611e59565b61221a610a40611e4c565b906119e1565b61221a610a40611e3f565b146120bd565b506121ee612240610a40611e3f565b1590506121e5565b506101e43515156121c2565b5061217b6001600160401b0380612269611ef1565b161515908161227b575b509050612172565b9050612285611f07565b9061229d612291611ef1565b6001600160401b031690565b911611155f612273565b156122ae57565b60405162461bcd60e51b8152602060048201526005602482015264636c6f6e6560d81b6044820152606490fd5b9035601e19823603018112156101e35701602081359101916001600160401b0382116101e35781360383136101e357565b908060209392818452848401375f828201840152601f01601f1916010190565b61243c610f90946124246060949897959860808552846124146124096123eb6123cd6123b161239461237361236189806122db565b60e060808b01526101608a019161230c565b61238060208a018a6122db565b90607f199960a08b8286030191015261230c565b6123a160408901896122db565b8d8303890160c08f01529061230c565b6123bd8c8801886122db565b8c8303880160e08e01529061230c565b6123da60808701876122db565b90868c8403016101008d015261230c565b6123f860a08601866122db565b90858b8403016101208c015261230c565b9260c08101906122db565b918784030161014088015261230c565b60208401989098526001600160a01b03166040830152565b6001600160a01b03909216910152565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81527f000000000000000000000000000000000000000000000000000000000000000060601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201529192916001600160a01b03906037905ff016906124c88215156122a7565b8193823b156101e3576124f8925f92836040518096819582946373c1affb60e11b8452309133916004860161232c565b03925af1801561048c576125095750565b80610484610f9092610eb3565b908160209103126101e3575161078181610235565b1561253257565b60405162461bcd60e51b815260206004820152601060248201526f3b32b9ba34b733903a3930b739b332b960811b6044820152606490fd5b919091612586610a4d61257e610a40611e33565b602435611894565b9081156126e2576001600160a01b03936126069083906125a4611f07565b6125ac611ef1565b604051636a32885f60e11b81526001600160a01b03909316600484015233602484015230604484015260648301969096526001600160401b03908116608483015290941660a48501526020939184908390819060c4820190565b03815f8a7f0000000000000000000000000000000000000000000000000000000000000000165af192831561048c5761267a9385935f916126b5575b5060405163a9059cbb60e01b81526001600160a01b03821660048201526024810193909352969193849283915f919083906044820190565b0393165af190811561048c57610f90925f92612698575b505061252b565b6126ae9250803d10611465576114568183610f1c565b5f80612691565b6126d59150843d86116126db575b6126cd8183610f1c565b810190612516565b5f612642565b503d6126c3565b505f925050565b610184356126f681610660565b61ffff811661270657506126ac90565b61078181610660565b908160209103126101e3575161078181610f9f565b90929160a0906127388360c08101966110c3565b600180831b0316910152565b9291909261275184612974565b9160018060a01b0392838151168460208301511662ffffff604084015116606084015160020b8760808601511691604051936020850195865260408501526060840152608083015260a082015260a081526127ab81610f01565b519020956127c581610a9d895f52600660205260405f2090565b5f6127e360206128006127d88686612d00565b9a919a949094611a95565b60405195868094819363313b65df60e11b83528b60048401612724565b03927f0000000000000000000000000000000000000000000000000000000000000000165af190811561048c576107819761284493879361284a575b508585612dd7565b936130ef565b61286b9060203d602011612872575b6128638183610f1c565b81019061270f565b505f61283c565b503d612859565b1561288057565b60405162461bcd60e51b815260206004820152600d60248201526c313ab937103a3930b739b332b960991b6044820152606490fd5b6040516370a0823160e01b81523060048201526020916001600160a01b03168282602481845afa91821561048c575f92612955575b50816128f557505050565b60405163a9059cbb60e01b815261dead600482015260248101929092528290829060449082905f905af190811561048c57610f90925f92612938575b5050612879565b61294e9250803d10611465576114568183610f1c565b5f80612931565b61296d919250833d85116114a5576114968183610f1c565b905f6128ea565b5f608060405161298381610ecb565b828152826020820152826040820152826060820152015260c435906129a782610235565b6001600160a01b038181168382161015612a3157612a1e612a2892915b612a1260e435916129d483610f92565b61010435946129e286610f9f565b612a0182604051996129f38b610ecb565b166001600160a01b03168952565b166001600160a01b03166020870152565b62ffffff166040850152565b60020b6060830152565b5f608082015290565b612a1e612a289293916129c4565b15612a4657565b60405162461bcd60e51b815260206004820152600e60248201526d38bab7ba32903a3930b739b332b960911b6044820152606490fd5b6001600160a01b03918216815261014081019796909561012095929491939092918591612aad9060208a01906110c3565b1660c087015260e086015261010085015216910152565b6020818303126101e35780516001600160401b03918282116101e357019082601f830112156101e3578151908111610ec65760405192612b0e601f8301601f191660200185610f1c565b818452602082840101116101e357610781916020808501910161072a565b9394929391926001600160a01b03927f0000000000000000000000000000000000000000000000000000000000000000841691848616808403612c445750823b156101e3575f8793600460405180968193630d0e30db60e41b83525af190811561048c575f988998612be098612bc496612bb695612c31575b505b60405197889660208801612a7c565b03601f198101835282610f1c565b6040519485809481936348c8949160e01b835260048301610770565b03927f0000000000000000000000000000000000000000000000000000000000000000165af1801561048c57612c135750565b612c2e903d805f833e612c268183610f1c565b810190612ac4565b50565b80610484612c3e92610eb3565b5f612ba5565b809194969295979350612c6a575b5092612bb6612be095935f98612bc4948a9997612ba7565b6040516323b872dd60e01b81526001600160a01b038516600482015230602482015260448101849052929691959194919390602090849060649082905f905af190811561048c575f988998612be098612cd1612bb695612bc4988d91612ce1575b50612a3f565b9497995094509850939550612c52565b612cfa915060203d602011611465576114568183610f1c565b5f612ccb565b90516001600160a01b03918216911603612d7757612d2961012435612d2481610f9f565b61197d565b908161016435612d3881610f9f565b915b8260020b8460020b1215612d4a57565b60405162461bcd60e51b815260206004820152600560248201526472616e676560d81b6044820152606490fd5b6101243590612d8582610f9f565b8161014435612d9381610f9f565b9291612d3a565b15612da157565b60405162461bcd60e51b815260206004820152600e60248201526d6c6971756964697479207a65726f60901b6044820152606490fd5b929091612de6612dec91611a95565b91611a95565b915191926001600160a01b039290831690831603612e76578116911690612e13828261378c565b90820391821161108d57612e26926137d3565b6001600160801b0390818111612e4557612e41811515612d9a565b1690565b60405162461bcd60e51b81526020600482015260096024820152686c697175696469747960b81b6044820152606490fd5b9181169116810390811161108d57612e8d916136f6565b612e26565b6001600160a01b03918216815291811660208301529182166040820152918116606083015290911660808201526102208101999897909690959094909390929091612ee19060a08901906110c3565b61ffff9081166101408801521661016086015261ffff166101808501526001600160401b03166101a08401526001600160801b03166101c083015260020b6101e082015261020001610f909160020b9052565b15612f3b57565b60405162461bcd60e51b815260206004820152600e60248201526d7065726d697420617070726f766560901b6044820152606490fd5b15612f7857565b60405162461bcd60e51b815260206004820152600a602482015269706d20617070726f766560b01b6044820152606490fd5b60409060405191612fba83610ee6565b60028352825f5b828110612fcd57505050565b806060602080938501015201612fc1565b9492610781989794919692612ff687610180996110c3565b600290810b60a08801520b60c086015260e08501526001600160801b03918216610100850152166101208301526001600160a01b03166101408201526101608101829052019061074b565b8051156119785760200190565b8051600110156119785760400190565b906130719060408352604083019061074b565b90602090818184039101528251908183528083019281808460051b8301019501935f915b8483106130a55750505050505090565b90919293949584806130c3600193601f198682030187528a5161074b565b9801930193019194939290613095565b9291906130ea60209160408652604086019061074b565b930152565b949390928260206131008287612d00565b505061310c8388612d00565b506001546001600160a01b031691506131949061312761203f565b9388613131611e59565b613139611e4c565b613141611e3f565b9061314a611f1d565b60405163b3b3e97960e01b81529e8f9a8b9a92959233307f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660048f01612e92565b03815f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af193841561048c575f9461366c575b5060405163095ea7b360e01b8082526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600484018190526024840186905296998a97939116916020826044815f875af191821561048c57602092613246915f9161364f575b50612f34565b6040519081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001660048201526024810186905291829060449082905f905af1801561048c576132a5915f91613630575b50612f71565b6132bc6132b1426119c2565b65ffffffffffff1690565b90803b156101e3576040516387517c4560e01b81526001600160a01b0388811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301528516604482015265ffffffffffff9290921660648301525f908290608490829084905af1801561048c5761361d575b50604051631d5e528f60e21b8152946020866004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa95861561048c575f966135fc575b50604051600160f91b6020820152600d60f81b602182015260028152601f199290919086906133b7602285610f1c565b6133bf612faa565b966133ca8285612d00565b5050916133d78186612d00565b50825190996001600160801b039250906133f9906001600160a01b0316611bd1565b6001600160a01b03978816971687036135f55780945b6020840180519098906001600160a01b03166001600160a01b03166001600160a01b0316145f1461350e9b6134dc986134b0986134a29861348196613475956135ed57955b61345c611092565b9489806040519b8c9a1695169316918b60208a01612fde565b03898101835282610f1c565b61348a8a613041565b5261349489613041565b50516001600160a01b031690565b92516001600160a01b031690565b604080516001600160a01b03948516602082015291909316928101929092526060848101835282610f1c565b6134e58561304e565b526134ef8461304e565b506135026040519485926020840161305e565b03908101835282610f1c565b613517426119d2565b907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163b156101e35760405163dd46508f60e01b8152915f918391829161356a9190600484016130d3565b0381837f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1801561048c576135da575b506001600160a01b0316803b156101e35760405163c929ccf360e01b815260048101929092525f908290818381602481016124f8565b806104846135e792610eb3565b5f6135a4565b505f95613454565b5f9461340f565b61361691965060203d6020116114a5576114968183610f1c565b945f613387565b8061048461362a92610eb3565b5f613338565b613649915060203d602011611465576114568183610f1c565b5f61329f565b6136669150843d8611611465576114568183610f1c565b5f613240565b61368691945060203d6020116126db576126cd8183610f1c565b925f6131d1565b1561369457565b606460405162461bcd60e51b81526020600482015260046024820152630646976360e41b6044820152fd5b156136c657565b60405162461bcd60e51b81526020600482015260086024820152676f766572666c6f7760c01b6044820152606490fd5b600160601b915f19838309928260601b92838086109503948086039514613774579082916137258684116136bf565b0960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505090610781925061378782151561368d565b6118cc565b5f1982820990828102928380841093039280840393146137ca57600160601b916137b78484116136bf565b0990828211900360a01b910360601c1790565b50505060601c90565b90915f198383099280830292838086109503948086039514613774579082916137258684116136bf56fea264697066735822122085df34308a2ea28ceef47eb3a5e1cecdca39e5a486f46c7264d7c0e0bcd45e9764736f6c634300081800336080806040523461002957600c805460ff60a01b1916600160a01b17905561193e908161002e8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c90816302d05d3f146112fc5750806306fdde0314611268578063095ea7b3146111f3578063158ef93e146111ce57806318160ddd146111b157806323b872dd146110e3578063313ce567146110c85780633e0dc34e146110ab57806344c63eec1461108357806347ecb665146110685780634dd5209c14610fc757806370a0823114610f8f5780637284e41614610f7457806395d89b4114610ea9578063a9059cbb14610e77578063abb1dc4414610d9a578063abfaeee014610d7f578063beb0a41614610d64578063c45a015514610d3c578063d7b96d4e14610d14578063dd62ed3e14610cc7578063e7835ff6146101505763f3ccaac014610119575f80fd5b3461014c575f36600319011261014c5761014861013461157b565b60405191829160208352602083019061168d565b0390f35b5f80fd5b3461014c5760031960803682011261014c57600435906001600160401b03821161014c5760e090823603011261014c576040519060e082018281106001600160401b038211176106c05760405280600401356001600160401b03811161014c576101c0906004369184010161170d565b825260248101356001600160401b03811161014c576101e5906004369184010161170d565b602083015260448101356001600160401b03811161014c5761020d906004369184010161170d565b604083015260648101356001600160401b03811161014c57610235906004369184010161170d565b606083015260848101356001600160401b03811161014c5761025d906004369184010161170d565b608083015260a48101356001600160401b03811161014c57610285906004369184010161170d565b60a083015260c4810135906001600160401b03821161014c5760046102ad923692010161170d565b60c08201526102ba6116f7565b606435916001600160a01b0390818416840361014c57600c5460ff8160a01c16610c9c5782841615610c6d576102f38386161515611762565b60ff60a01b1916600160a01b17600c5580518051906001600160401b0382116106c05781906103225f5461131f565b601f8111610bff575b50602090601f8311600114610b8d575f92610b82575b50508160011b915f199060031b1c1916175f555b60208101518051906001600160401b0382116106c057819061037860015461131f565b601f8111610b13575b50602090601f8311600114610a9f575f92610a94575b50508160011b915f199060031b1c1916176001555b60408101518051906001600160401b0382116106c05781906103cf60035461131f565b601f8111610a25575b50602090601f83116001146109b1575f926109a6575b50508160011b915f199060031b1c1916176003555b60608101518051906001600160401b0382116106c057819061042660045461131f565b601f8111610937575b50602090601f83116001146108c3575f926108b8575b50508160011b915f199060031b1c1916176004555b60808101518051906001600160401b0382116106c057819061047d60055461131f565b601f8111610849575b50602090601f83116001146107d5575f926107ca575b50508160011b915f199060031b1c1916176005555b60a08101518051906001600160401b0382116106c0576104d260065461131f565b601f8111610767575b50602090601f83116001146106df5760c09392915f91836106d4575b50508160011b915f199060031b1c1916176006555b01519283516001600160401b0381116106c05761052a60075461131f565b601f811161065d575b50602094601f82116001146105dc579481929394955f926105d1575b50508160011b915f199060031b1c1916176007555b816bffffffffffffffffffffffff60a01b931683600854161760085516906009541617600955602435600255335f52600d60205260243560405f205560405160243581525f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60203393a3005b01519050858061054f565b601f1982169560075f527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688915f5b8881106106455750836001959697981061062d575b505050811b01600755610564565b01515f1960f88460031b161c1916905585808061061f565b9192602060018192868501518155019401920161060a565b60075f527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688601f830160051c810191602084106106b6575b601f0160051c01905b8181106106ab5750610533565b5f815560010161069e565b9091508190610695565b634e487b7160e01b5f52604160045260245ffd5b0151905087806104f7565b9060065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f915f5b601f198516811061074f575091839160019360c09695601f19811610610737575b505050811b0160065561050c565b01515f1960f88460031b161c19169055878080610729565b91926020600181928685015181550194019201610708565b60065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f601f840160051c810191602085106107c0575b601f0160051c01905b8181106107b557506104db565b5f81556001016107a8565b909150819061079f565b01519050868061049c565b925060055f525f80516020611869833981519152905f935b601f198416851061082e576001945083601f19811610610816575b505050811b016005556104b1565b01515f1960f88460031b161c19169055868080610808565b818101518355602094850194600190930192909101906107ed565b90915060055f52601f830160051c5f8051602061186983398151915201602084106108a4575b908392915b601f820160051c5f805160206118698339815191520181106108965750610486565b5f8155849350600101610874565b505f8051602061186983398151915261086f565b015190508680610445565b925060045f525f805160206118e9833981519152905f935b601f198416851061091c576001945083601f19811610610904575b505050811b0160045561045a565b01515f1960f88460031b161c191690558680806108f6565b818101518355602094850194600190930192909101906108db565b90915060045f52601f830160051c5f805160206118e98339815191520160208410610992575b908392915b601f820160051c5f805160206118e9833981519152018110610984575061042f565b5f8155849350600101610962565b505f805160206118e983398151915261095d565b0151905086806103ee565b925060035f525f80516020611889833981519152905f935b601f1984168510610a0a576001945083601f198116106109f2575b505050811b01600355610403565b01515f1960f88460031b161c191690558680806109e4565b818101518355602094850194600190930192909101906109c9565b90915060035f52601f830160051c5f805160206118898339815191520160208410610a80575b908392915b601f820160051c5f80516020611889833981519152018110610a7257506103d8565b5f8155849350600101610a50565b505f80516020611889833981519152610a4b565b015190508680610397565b925060015f525f805160206118c9833981519152905f935b601f1984168510610af8576001945083601f19811610610ae0575b505050811b016001556103ac565b01515f1960f88460031b161c19169055868080610ad2565b81810151835560209485019460019093019290910190610ab7565b90915060015f52601f830160051c5f805160206118c98339815191520160208410610b6e575b908392915b601f820160051c5f805160206118c9833981519152018110610b605750610381565b5f8155849350600101610b3e565b505f805160206118c9833981519152610b39565b015190508680610341565b92505f80525f805160206118a9833981519152905f935b601f1984168510610be4576001945083601f19811610610bcc575b505050811b015f55610355565b01515f1960f88460031b161c19169055868080610bbf565b81810151835560209485019460019093019290910190610ba4565b9091505f8052601f830160051c5f805160206118a98339815191520160208410610c59575b908392915b601f820160051c5f805160206118a9833981519152018110610c4b575061032b565b5f8155849350600101610c29565b505f805160206118a9833981519152610c24565b60405162461bcd60e51b815260206004820152600760248201526631b932b0ba37b960c91b6044820152606490fd5b606460405162461bcd60e51b81526020600482015260046024820152631a5b9a5d60e21b6044820152fd5b3461014c57604036600319011261014c57610ce06116cb565b610ce86116e1565b9060018060a01b038091165f52600e60205260405f2091165f52602052602060405f2054604051908152f35b3461014c575f36600319011261014c57600b546040516001600160a01b039091168152602090f35b3461014c575f36600319011261014c576009546040516001600160a01b039091168152602090f35b3461014c575f36600319011261014c57610148610134611604565b3461014c575f36600319011261014c576101486101346114df565b3461014c575f36600319011261014c5760606020604051610dba81611357565b8281520152600854604051906001600160a01b0316610dd882611357565b610de0611393565b8252610148610ded6114df565b60208401908152610dfc61157b565b93610e67610e4f610e0b611456565b610e41610e16611604565b91610e336040519a8b9a8b5260a060208c015260a08b019061168d565b9089820360408b015261168d565b90878203606089015261168d565b9185830360808701525160408352604083019061168d565b915190602081840391015261168d565b3461014c57604036600319011261014c576020610e9f610e956116cb565b6024359033611798565b6040519015158152f35b3461014c575f36600319011261014c576040515f60018260015492610ecd8461131f565b92838352602094856001821691825f14610f54575050600114610f0c575b50610ef892500383611372565b61014860405192828493845283019061168d565b84915060015f525f805160206118c9833981519152905f915b858310610f3c575050610ef8935082010185610eeb565b80548389018501528794508693909201918101610f25565b60ff191685820152610ef895151560051b8501019250879150610eeb9050565b3461014c575f36600319011261014c57610148610134611456565b3461014c57602036600319011261014c576001600160a01b03610fb06116cb565b165f52600d602052602060405f2054604051908152f35b3461014c57606036600319011261014c57610fe06116e1565b610fe86116f7565b6009546001600160a01b039291906110039084163314611762565b600b5483811661103d578392600435600a556bffffffffffffffffffffffff60a01b94859116911617600b551690600c541617600c555f80f35b60405162461bcd60e51b81526020600482015260036024820152621cd95d60ea1b6044820152606490fd5b3461014c575f36600319011261014c57610148610134611393565b3461014c575f36600319011261014c57600c546040516001600160a01b039091168152602090f35b3461014c575f36600319011261014c576020600a54604051908152f35b3461014c575f36600319011261014c57602060405160128152f35b3461014c57606036600319011261014c576110fc6116cb565b6111046116e1565b60443560018060a01b03831691825f52602093600e855260405f20335f52855260405f20545f19810361113d575b50610e9f9350611798565b8381106111805783810390811161116c57610e9f945f52600e865260405f20335f52865260405f205585611132565b634e487b7160e01b5f52601160045260245ffd5b60405162461bcd60e51b8152600481018790526009602482015268616c6c6f77616e636560b81b6044820152606490fd5b3461014c575f36600319011261014c576020600254604051908152f35b3461014c575f36600319011261014c57602060ff600c5460a01c166040519015158152f35b3461014c57604036600319011261014c5761120c6116cb565b602435335f52600e60205260405f209160018060a01b031691825f526020528060405f20556040519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560203392a3602060405160018152f35b3461014c575f36600319011261014c576040515f805490826112898361131f565b91828252602093600190856001821691825f14610f545750506001146112b65750610ef892500383611372565b5f808052859250905f805160206118a98339815191525b8583106112e4575050610ef8935082010185610eeb565b805483890185015287945086939092019181016112cd565b3461014c575f36600319011261014c576008546001600160a01b03168152602090f35b90600182811c9216801561134d575b602083101461133957565b634e487b7160e01b5f52602260045260245ffd5b91607f169161132e565b604081019081106001600160401b038211176106c057604052565b90601f801991011681019081106001600160401b038211176106c057604052565b604051905f82600654916113a68361131f565b8083529260209060019081811690811561143257506001146113d3575b50506113d192500383611372565b565b91509260065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f935f925b82841061141a57506113d19450505081016020015f806113c3565b855488850183015294850194879450928101926113ff565b915050602092506113d194915060ff191682840152151560051b8201015f806113c3565b604051905f82600354916114698361131f565b8083529260209060019081811690811561143257506001146114935750506113d192500383611372565b91509260035f525f80516020611889833981519152935f925b8284106114c757506113d19450505081016020015f806113c3565b855488850183015294850194879450928101926114ac565b604051905f82600754916114f28361131f565b80835292602090600190818116908115611432575060011461151c5750506113d192500383611372565b91509260075f527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688935f925b82841061156357506113d19450505081016020015f806113c3565b85548885018301529485019487945092810192611548565b604051905f826004549161158e8361131f565b8083529260209060019081811690811561143257506001146115b85750506113d192500383611372565b91509260045f525f805160206118e9833981519152935f925b8284106115ec57506113d19450505081016020015f806113c3565b855488850183015294850194879450928101926115d1565b604051905f82600554916116178361131f565b8083529260209060019081811690811561143257506001146116415750506113d192500383611372565b91509260055f525f80516020611869833981519152935f925b82841061167557506113d19450505081016020015f806113c3565b8554888501830152948501948794509281019261165a565b91908251928382525f5b8481106116b7575050825f602080949584010152601f8019910116010190565b602081830181015184830182015201611697565b600435906001600160a01b038216820361014c57565b602435906001600160a01b038216820361014c57565b604435906001600160a01b038216820361014c57565b81601f8201121561014c578035906001600160401b0382116106c05760405192611741601f8401601f191660200185611372565b8284526020838301011161014c57815f926020809301838601378301015290565b1561176957565b60405162461bcd60e51b8152602060048201526007602482015266666163746f727960c81b6044820152606490fd5b6001600160a01b03918216929190831561183d571690815f52600d60205260405f205481811061180e57817fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92602092855f52600d84520360405f2055845f5260405f20818154019055604051908152a3600190565b60405162461bcd60e51b815260206004820152600760248201526662616c616e636560c81b6044820152606490fd5b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fdfe036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563b10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19ba26469706673582212202764655141448ce4ef0a7989823687673755707a2c0ba9d86e6eb7042af8d7f364736f6c63430008180033000000000000000000000000eb5d46645763b657e2fe3984a046dda254439dda0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad730000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1680000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095100000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa7000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba3000000000000000000000000e59a2ff1138d67f643955f6e5321dbe98b434810000000000000000000000000f5e3feb17be78c40529d3451e2fee1082a70bed3
0x60806040526004361015610011575f80fd5b5f3560e01c806303fd2a45146101d45780630ae89127146101cf578063104ad631146101ca57806312261ee7146101c5578063184cfbab146101c057806319f37361146101bb5780632e97d9a8146101b65780632f3a3d5d146101b15780633d82181d146101ac5780633fc8cef3146101a757806344e30d78146101a2578063634282af1461019d57806364df049e14610198578063791b98bc146101935780638cb7fd771461018e5780638da5cb5b1461018957806391dd734614610184578063988b1fa71461017f578063a2700a3b1461017a578063c1caea8314610175578063c47cfca114610170578063d0c509db1461016b578063d138dbf114610166578063dbb80e4214610161578063dc4c90d31461015c578063e521cb9214610157578063f2fde38b146101525763f5b91b7b1461014d575f80fd5b610df3565b610d76565b610cbc565b610c78565b610c5b565b610c3f565b61094b565b61090e565b6108ca565b610825565b6107ea565b610784565b610703565b61066c565b61061c565b6105f4565b61059a565b6104d5565b610491565b6103d6565b610388565b610344565b610304565b6102c7565b610283565b610246565b610203565b6101e7565b5f9103126101e357565b5f80fd5b346101e3575f3660031901126101e357602060405161dead8152f35b346101e35760203660031901126101e3576004355f526006602052602060018060a01b0360405f205416604051908152f35b6001600160a01b038116036101e357565b346101e35760203660031901126101e357602060043561026581610235565b60018060a01b038091165f526004825260405f205416604051908152f35b346101e3575f3660031901126101e3576040517f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba36001600160a01b03168152602090f35b346101e35760203660031901126101e35760206004356102e681610235565b60018060a01b038091165f526002825260405f205416604051908152f35b346101e35760203660031901126101e35760043561032181610235565b60018060a01b03165f526007602052602060ff60405f2054166040519015158152f35b346101e3575f3660031901126101e3576040517f000000000000000000000000f5e3feb17be78c40529d3451e2fee1082a70bed36001600160a01b03168152602090f35b346101e3575f3660031901126101e3576040517f00000000000000000000000068ab424edd2e3703b8625016fa12b7f128b74d896001600160a01b03168152602090f35b801515036101e357565b346101e35760403660031901126101e3576004356103f381610235565b60243590610400826103cc565b5f546001600160a01b0391829161041a9083163314610e37565b165f908152600360205260409020546001600160a01b03161661043e811515610e6b565b803b156101e357604051637a47676360e01b81528215156004820152905f908290818381602481015b03925af1801561048c5761047757005b8061048461048a92610eb3565b806101d9565b005b610f3d565b346101e3575f3660031901126101e3576040517f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad736001600160a01b03168152602090f35b346101e35760603660031901126101e3576004356104f281610235565b6024356104fe81610235565b6044359161050b836103cc565b5f546001600160a01b039182916105259083163314610e37565b165f908152600260205260409020546001600160a01b0316169161054a831515610e6b565b823b156101e35760405163361e393f60e01b81526001600160a01b03909216600483015215156024820152905f90829081838160448101610467565b634e487b7160e01b5f52603260045260245ffd5b346101e35760203660031901126101e3576004356008548110156101e35760085f527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee301546040516001600160a01b039091168152602090f35b346101e3575f3660031901126101e3576001546040516001600160a01b039091168152602090f35b346101e3575f3660031901126101e3576040517f00000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa76001600160a01b03168152602090f35b61ffff8116036101e357565b346101e35760403660031901126101e35760043561068981610235565b6024359061069682610660565b5f546001600160a01b039182916106b09083163314610e37565b165f908152600260205260409020546001600160a01b0316166106d4811515610e6b565b803b156101e35760405163a394cfd760e01b815261ffff83166004820152905f90829081838160248101610467565b346101e3575f3660031901126101e3575f546040516001600160a01b039091168152602090f35b5f5b83811061073b5750505f910152565b818101518382015260200161072c565b906020916107648151809281855285808601910161072a565b601f01601f1916010190565b90602061078192818152019061074b565b90565b346101e35760203660031901126101e3576001600160401b036004358181116101e357366023820112156101e35780600401359182116101e35736602483830101116101e3576107e69160246107da920161120e565b60405191829182610770565b0390f35b346101e35760203660031901126101e35760043561080781610235565b60018060a01b03165f526005602052602060405f2054604051908152f35b346101e35760403660031901126101e35760043561084281610235565b60243561084e81610235565b5f546001600160a01b03908116928190610869338614610e37565b165f908152600260205260409020546001600160a01b0316169161088e831515610e6b565b823b156101e357604051638b06813360e01b81526001600160a01b03928316600482015291166024820152905f90829081838160448101610467565b346101e3575f3660031901126101e3576040517f000000000000000000000000e59a2ff1138d67f643955f6e5321dbe98b4348106001600160a01b03168152602090f35b346101e35760203660031901126101e357602060043561092d81610235565b60018060a01b038091165f526003825260405f205416604051908152f35b600319610280368201126101e357600435906001600160401b0382116101e35760e09082360301126101e3576102603660231901126101e35761098c6120f1565b610994612033565b6001600160a01b0391908083167f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad7384168114908115610c36575b5015610c2d576109e36101c4355b34146115a8565b6109f3602435809360040161244c565b92831691610a21610a148460018060a01b03165f52600760205260405f2090565b805460ff19166001179055565b610a67610a55610a4d610a34868861256a565b93610a47610a406126e9565b61ffff1690565b90611894565b612710900490565b610a608115156118d6565b8486612744565b9094610a72816128b5565b6001600160a01b0385165f90815260056020908152604080832089905560029091529020610abc9083905b80546001600160a01b0319166001600160a01b03909216919091179055565b6001600160a01b0385165f908152600360205260409020610ade908490610a9d565b610b05610ae9612033565b6001600160a01b0387165f908152600460205260409020610a9d565b610b0e85611910565b843b156101e357604051631375482760e21b8152600481018790526001600160a01b03838116602483015284166044820152935f85606481838a5af194851561048c576107e695610c1a575b506101c4359182610bf8575b505050610b71612033565b604080516001600160a01b038481168252858116602083015292909216908201526101a43560608201523390869086907fa147aafe4da85ef5d6da764e8d4560c33f7a713dfff4725d58b31589a2fa524c90608090a4604080516001600160a01b039586168152602081019690965290841690850152909116606083015281906080820190565b610c1292610c0588612974565b9233936101e43593612b2c565b5f8080610b66565b80610484610c2792610eb3565b5f610b5a565b6109e35f6109dc565b9050155f6109ce565b346101e3575f3660031901126101e35760206040516126ac8152f35b346101e3575f3660031901126101e3576020600854604051908152f35b346101e3575f3660031901126101e3576040517f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e409516001600160a01b03168152602090f35b346101e35760203660031901126101e357600435610cd981610235565b5f546001600160a01b0390610cf19082163314610e37565b81168015610d4657600180546001600160a01b0319169190911790556040516001600160a01b039190911681527fc1b5345cce283376356748dc57f2dfa7120431d016fc7ca9ba641bc65f91411d90602090a1005b60405162461bcd60e51b81526020600482015260086024820152671c1c9bdd1bd8dbdb60c21b6044820152606490fd5b346101e35760203660031901126101e3577f4ffd725fc4a22075e9ec71c59edf9c38cdeb588a91b24fc5b61388c5be41282b6020600435610db681610235565b5f54906001600160a01b0390610dcf3383851614610e37565b168091610ddd821515610e37565b6001600160a01b031916175f55604051908152a1005b346101e3575f3660031901126101e3576040517f0000000000000000000000005fc5360d0400a0fd4f2af552add042d716f1d1686001600160a01b03168152602090f35b15610e3e57565b60405162461bcd60e51b815260206004820152600560248201526437bbb732b960d91b6044820152606490fd5b15610e7257565b60405162461bcd60e51b81526020600482015260056024820152643a37b5b2b760d91b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b6001600160401b038111610ec657604052565b610e9f565b60a081019081106001600160401b03821117610ec657604052565b606081019081106001600160401b03821117610ec657604052565b60c081019081106001600160401b03821117610ec657604052565b90601f801991011681019081106001600160401b03821117610ec657604052565b6040513d5f823e3d90fd5b15610f4f57565b60405162461bcd60e51b815260206004820152600c60248201526b3837b7b61036b0b730b3b2b960a11b6044820152606490fd5b60405190610f9082610ee6565b565b62ffffff8116036101e357565b8060020b036101e357565b3590610f9082610235565b809291039161014083126101e35760a08135610fd081610235565b93601f1901126101e357604051610fe681610ecb565b6020820135610ff481610235565b8152604082013561100481610235565b6020820152606082013561101781610f92565b6040820152608082013561102a81610f9f565b606082015260a082013561103d81610235565b60808201529161104f60c08301610faa565b9160e0810135916107816101206101008401359301610faa565b634e487b7160e01b5f52601160045260245ffd5b600160ff1b811461108d575f0390565b611069565b60405190602082018281106001600160401b03821117610ec6576040525f8252565b908160209103126101e3575190565b80516001600160a01b03908116835260208083015182169084015260408083015162ffffff169084015260608083015160020b9084015260809182015116910152565b610781939261111882610120946110c3565b8051151560a0830152602081015160c0830152604001516001600160a01b031660e08201526101008101829052019061074b565b1561115357565b60405162461bcd60e51b8152602060048201526008602482015267736c69707061676560c01b6044820152606490fd5b908160209103126101e35751610781816103cc565b1561119f57565b60405162461bcd60e51b815260206004820152600c60248201526b71756f746520736574746c6560a01b6044820152606490fd5b156111da57565b60405162461bcd60e51b815260206004820152600c60248201526b313abc903a3930b739b332b960a11b6044820152606490fd5b6001600160a01b037f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e4095181169290916112da91839161125991611251338814610f48565b810190610fb5565b97939891929590951691611273895160018060a01b031690565b808516841493841561159457815b851561158e575060208b01516001600160a01b0316945b8015611581576112a6611a58565b6112af8561107d565b6112b7610f83565b831515815260209e8f928383015260409d8e948584019060018060a01b03169052565b6112ff6112e5611092565b9451633cf3645360e21b8152948593849360048501611106565b03815f8a5af191821561048c5761132c92611323928f5f92611564575b5050611d89565b9889101561114c565b833b156101e3578851632961046560e21b81526001600160a01b039290921660048301525f8260248183885af191821561048c578b92611551575b50806114ac57508751630476982d60e21b81529182906004908290865af1801561048c5761147f575b505b803b156101e3578551630b0d9c0960e01b81526001600160a01b03929092166004830152306024830152604482018590525f908290606490829084905af1801561048c576114199688965f93859361146c575b505163a9059cbb60e01b815293166001600160a01b0316600484015260248301949094529094859384929183906044820190565b0393165af190811561048c57611437925f9261143f575b50506111d3565b610781611092565b61145e9250803d10611465575b6114568183610f1c565b810190611183565b5f80611430565b503d61144c565b8061048461147992610eb3565b5f6113e5565b61149e90893d8b116114a5575b6114968183610f1c565b8101906110b4565b505f611390565b503d61148c565b885163a9059cbb60e01b81526001600160a01b03851660048201526024810193909352829060449082905f905af1801561048c576114f1915f91611534575b50611198565b8551630476982d60e21b815288816004815f865af1801561048c57611517575b50611392565b61152d90893d8b116114a5576114968183610f1c565b505f611511565b61154b91508a3d8c11611465576114568183610f1c565b5f6114eb565b8061048461155e92610eb3565b5f611367565b61157a9250803d106114a5576114968183610f1c565b5f8f61131c565b6115896119ee565b6112a6565b94611298565b60208b01516001600160a01b031691611281565b156115af57565b60405162461bcd60e51b815260206004820152600560248201526476616c756560d81b6044820152606490fd5b906ffff97272373d413259a46990580e213a9182810292818404149015171561108d57565b906ffff2e50f5f656932ef12357cf3c7fdcc9182810292818404149015171561108d57565b906fffe5caca7e10e4e61c3624eaa0941cd09182810292818404149015171561108d57565b906fffcb9843d60f6159c9db58835c9266449182810292818404149015171561108d57565b906fff973b41fa98c081472e6896dfb254c09182810292818404149015171561108d57565b906fff2ea16466c96a3843ec78b326b528619182810292818404149015171561108d57565b906ffe5dee046a99a2a811c461f1969c30539182810292818404149015171561108d57565b906ffcbe86c7900a88aedcffc83b479aa3a49182810292818404149015171561108d57565b906ff987a7253ac413176f2b074cf7815e549182810292818404149015171561108d57565b906ff3392b0822b70005940c7a398e4b70f39182810292818404149015171561108d57565b906fe7159475a2c29b7443b29c7fa6e889d99182810292818404149015171561108d57565b906fd097f3bdfd2022b8845ad8f792aa58259182810292818404149015171561108d57565b906fa9f746462d870fdf8a65dc1f90e061e59182810292818404149015171561108d57565b906f70d869a156d2a1b890bb3df62baf32f79182810292818404149015171561108d57565b906f31be135f97d08fd981231505542fcfa69182810292818404149015171561108d57565b906f09aa508b5b7a84e1c677de54f3e99bc99182810292818404149015171561108d57565b906e5d6af8dedb81196699c329225ee6049182810292818404149015171561108d57565b906d2216e584f5fa1ea926041bedfe989182810292818404149015171561108d57565b906b048a170391f7dc42444e8fa29182810292818404149015171561108d57565b8181029291811591840414171561108d57565b634e487b7160e01b5f52601260045260245ffd5b80156118c7575f190490565b6118a7565b81156118c7570490565b156118dd57565b60405162461bcd60e51b815260206004820152600b60248201526a706f6f6c20746f6b656e7360a81b6044820152606490fd5b60085468010000000000000000811015610ec65760018101806008558110156119785760085f527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30180546001600160a01b0319166001600160a01b03909216919091179055565b610586565b60020b627fffff19811461108d575f0390565b1561199757565b606460405162461bcd60e51b81526020600482015260046024820152637469636b60e01b6044820152fd5b9062015180820180921161108d57565b9061012c820180921161108d57565b9190820180921161108d57565b611a23611a1b7c38665f117878f5596384fb0421d6a277268b88ffb7a4196032db14cb385b60801c611873565b60801c6118bb565b63ffffffff8160201c9116155f14611a4f5760ff5f5b16810180911161108d576001600160a01b031690565b60ff6001611a39565b611a74611a136f01a78b37816912cce622050c8bd8179d611850565b63ffffffff8160a01c9160801c16155f14611a4f576001600160a01b031690565b611bd1610781918060020b905f82125f14611d7e57611ab9611ab9611ac19261197d565b62ffffff1690565b905b611ad2620d89e8831115611990565b6001821615611d6c576001600160881b036ffffcb933bd6fad37aa2d162d1a5940015b169160028116611d59575b60048116611d46575b60088116611d33575b60108116611d20575b60208116611d0d575b60408116611cfa575b60808116611ce7575b6101008116611cd4575b6102008116611cc1575b6104008116611cae575b6108008116611c9b575b6110008116611c88575b6120008116611c75575b6140008116611c62575b6180008116611c4f575b620100008116611c3c575b620200008116611c29575b620400008116611c10575b6208000016611bf4575b5f12611be6575b63ffffffff8116611bdd5760ff5f5b169060201c6119e1565b6001600160a01b031690565b60ff6001611bc7565b611bef906118bb565b611bb8565b90611c08611c025f92611873565b60801c90565b919050611bb1565b91611c21611c026208000092611850565b929050611ba7565b91611c02611c369161182c565b91611b9c565b91611c02611c4991611807565b91611b91565b91611c02611c5c916117e2565b91611b86565b91611c02611c6f916117bd565b91611b7c565b91611c02611c8291611798565b91611b72565b91611c02611c9591611773565b91611b68565b91611c02611ca89161174e565b91611b5e565b91611c02611cbb91611729565b91611b54565b91611c02611cce91611704565b91611b4a565b91611c02611ce1916116df565b91611b40565b91611c02611cf4916116ba565b91611b36565b91611c02611d0791611695565b91611b2d565b91611c02611d1a91611670565b91611b24565b91611c02611d2d9161164b565b91611b1b565b91611c02611d4091611626565b91611b12565b91611c02611d5391611601565b91611b09565b91611c02611d66916115dc565b91611b00565b6001600160881b03600160801b611af5565b62ffffff1690611ac3565b9015611db057600f0b5b5f81600f0b135f14611dab576001600160801b031690565b505f90565b60801d600f0b611d93565b15611dc257565b60405162461bcd60e51b8152602060048201526006602482015265737570706c7960d01b6044820152606490fd5b60e43561078181610f92565b15611e0357565b60405162461bcd60e51b8152602060048201526008602482015267706f6f6c2066656560c01b6044820152606490fd5b60443561078181610660565b6102643561078181610660565b6102443561078181610660565b6102243561078181610660565b15611e6d57565b60405162461bcd60e51b815260206004820152600b60248201526a76657374696e672062707360a81b6044820152606490fd5b91909161ffff8080941691160191821161108d57565b15611ebd57565b60405162461bcd60e51b815260206004820152600c60248201526b1cdd5c1c1b1e481cdc1b1a5d60a21b6044820152606490fd5b6084356001600160401b03811681036101e35790565b6064356001600160401b03811681036101e35790565b60a4356001600160401b03811681036101e35790565b15611f3a57565b60405162461bcd60e51b815260206004820152600760248201526676657374696e6760c81b6044820152606490fd5b6101443561078181610f9f565b6101643561078181610f9f565b6101243561078181610f9f565b15611f9757565b60405162461bcd60e51b81526020600482015260056024820152647469636b7360d81b6044820152606490fd5b15611fcb57565b60405162461bcd60e51b815260206004820152600a6024820152697374617274207469636b60b01b6044820152606490fd5b1561200457565b60405162461bcd60e51b81526020600482015260076024820152666d696e2062757960c81b6044820152606490fd5b60c43561078181610235565b6102043561078181610235565b1561205357565b60405162461bcd60e51b81526020600482015260076024820152663830b93a3732b960c91b6044820152606490fd5b1561208957565b60405162461bcd60e51b815260206004820152600c60248201526b70726f746f636f6c2066656560a01b6044820152606490fd5b156120c457565b60405162461bcd60e51b81526020600482015260056024820152641cdc1b1a5d60da1b6044820152606490fd5b6120fe6024351515611dbb565b61211562ffffff61210d611df0565b161515611dfc565b610f906127106121fe610bb861ffff6121398482612131611e33565b161115611e66565b61216084612159610a4061214b611e33565b6121536126e9565b90611ea0565b1115611eb6565b80612169611e33565b16158015612254575b61217b90611f33565b6121a1612186611f69565b612197612191611f76565b60020b90565b9060020b12611f90565b6121b65f6121ad611f83565b60020b13611fc4565b6101c435158015612248575b6121cb90611ffd565b6001600160a01b036121db61203f565b1615801590612231575b6121ee9061204c565b6121f6611e4c565b161015612082565b61222b61222061220f610a40611e59565b61221a610a40611e4c565b906119e1565b61221a610a40611e3f565b146120bd565b506121ee612240610a40611e3f565b1590506121e5565b506101e43515156121c2565b5061217b6001600160401b0380612269611ef1565b161515908161227b575b509050612172565b9050612285611f07565b9061229d612291611ef1565b6001600160401b031690565b911611155f612273565b156122ae57565b60405162461bcd60e51b8152602060048201526005602482015264636c6f6e6560d81b6044820152606490fd5b9035601e19823603018112156101e35701602081359101916001600160401b0382116101e35781360383136101e357565b908060209392818452848401375f828201840152601f01601f1916010190565b61243c610f90946124246060949897959860808552846124146124096123eb6123cd6123b161239461237361236189806122db565b60e060808b01526101608a019161230c565b61238060208a018a6122db565b90607f199960a08b8286030191015261230c565b6123a160408901896122db565b8d8303890160c08f01529061230c565b6123bd8c8801886122db565b8c8303880160e08e01529061230c565b6123da60808701876122db565b90868c8403016101008d015261230c565b6123f860a08601866122db565b90858b8403016101208c015261230c565b9260c08101906122db565b918784030161014088015261230c565b60208401989098526001600160a01b03166040830152565b6001600160a01b03909216910152565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81527f00000000000000000000000068ab424edd2e3703b8625016fa12b7f128b74d8960601b60148201526e5af43d82803e903d91602b57fd5bf360881b60288201529192916001600160a01b03906037905ff016906124c88215156122a7565b8193823b156101e3576124f8925f92836040518096819582946373c1affb60e11b8452309133916004860161232c565b03925af1801561048c576125095750565b80610484610f9092610eb3565b908160209103126101e3575161078181610235565b1561253257565b60405162461bcd60e51b815260206004820152601060248201526f3b32b9ba34b733903a3930b739b332b960811b6044820152606490fd5b919091612586610a4d61257e610a40611e33565b602435611894565b9081156126e2576001600160a01b03936126069083906125a4611f07565b6125ac611ef1565b604051636a32885f60e11b81526001600160a01b03909316600484015233602484015230604484015260648301969096526001600160401b03908116608483015290941660a48501526020939184908390819060c4820190565b03815f8a7f000000000000000000000000f5e3feb17be78c40529d3451e2fee1082a70bed3165af192831561048c5761267a9385935f916126b5575b5060405163a9059cbb60e01b81526001600160a01b03821660048201526024810193909352969193849283915f919083906044820190565b0393165af190811561048c57610f90925f92612698575b505061252b565b6126ae9250803d10611465576114568183610f1c565b5f80612691565b6126d59150843d86116126db575b6126cd8183610f1c565b810190612516565b5f612642565b503d6126c3565b505f925050565b610184356126f681610660565b61ffff811661270657506126ac90565b61078181610660565b908160209103126101e3575161078181610f9f565b90929160a0906127388360c08101966110c3565b600180831b0316910152565b9291909261275184612974565b9160018060a01b0392838151168460208301511662ffffff604084015116606084015160020b8760808601511691604051936020850195865260408501526060840152608083015260a082015260a081526127ab81610f01565b519020956127c581610a9d895f52600660205260405f2090565b5f6127e360206128006127d88686612d00565b9a919a949094611a95565b60405195868094819363313b65df60e11b83528b60048401612724565b03927f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951165af190811561048c576107819761284493879361284a575b508585612dd7565b936130ef565b61286b9060203d602011612872575b6128638183610f1c565b81019061270f565b505f61283c565b503d612859565b1561288057565b60405162461bcd60e51b815260206004820152600d60248201526c313ab937103a3930b739b332b960991b6044820152606490fd5b6040516370a0823160e01b81523060048201526020916001600160a01b03168282602481845afa91821561048c575f92612955575b50816128f557505050565b60405163a9059cbb60e01b815261dead600482015260248101929092528290829060449082905f905af190811561048c57610f90925f92612938575b5050612879565b61294e9250803d10611465576114568183610f1c565b5f80612931565b61296d919250833d85116114a5576114968183610f1c565b905f6128ea565b5f608060405161298381610ecb565b828152826020820152826040820152826060820152015260c435906129a782610235565b6001600160a01b038181168382161015612a3157612a1e612a2892915b612a1260e435916129d483610f92565b61010435946129e286610f9f565b612a0182604051996129f38b610ecb565b166001600160a01b03168952565b166001600160a01b03166020870152565b62ffffff166040850152565b60020b6060830152565b5f608082015290565b612a1e612a289293916129c4565b15612a4657565b60405162461bcd60e51b815260206004820152600e60248201526d38bab7ba32903a3930b739b332b960911b6044820152606490fd5b6001600160a01b03918216815261014081019796909561012095929491939092918591612aad9060208a01906110c3565b1660c087015260e086015261010085015216910152565b6020818303126101e35780516001600160401b03918282116101e357019082601f830112156101e3578151908111610ec65760405192612b0e601f8301601f191660200185610f1c565b818452602082840101116101e357610781916020808501910161072a565b9394929391926001600160a01b03927f0000000000000000000000000bd7d308f8e1639fab988df18a8011f41eacad73841691848616808403612c445750823b156101e3575f8793600460405180968193630d0e30db60e41b83525af190811561048c575f988998612be098612bc496612bb695612c31575b505b60405197889660208801612a7c565b03601f198101835282610f1c565b6040519485809481936348c8949160e01b835260048301610770565b03927f0000000000000000000000008366a39cc670b4001a1121b8f6a443a643e40951165af1801561048c57612c135750565b612c2e903d805f833e612c268183610f1c565b810190612ac4565b50565b80610484612c3e92610eb3565b5f612ba5565b809194969295979350612c6a575b5092612bb6612be095935f98612bc4948a9997612ba7565b6040516323b872dd60e01b81526001600160a01b038516600482015230602482015260448101849052929691959194919390602090849060649082905f905af190811561048c575f988998612be098612cd1612bb695612bc4988d91612ce1575b50612a3f565b9497995094509850939550612c52565b612cfa915060203d602011611465576114568183610f1c565b5f612ccb565b90516001600160a01b03918216911603612d7757612d2961012435612d2481610f9f565b61197d565b908161016435612d3881610f9f565b915b8260020b8460020b1215612d4a57565b60405162461bcd60e51b815260206004820152600560248201526472616e676560d81b6044820152606490fd5b6101243590612d8582610f9f565b8161014435612d9381610f9f565b9291612d3a565b15612da157565b60405162461bcd60e51b815260206004820152600e60248201526d6c6971756964697479207a65726f60901b6044820152606490fd5b929091612de6612dec91611a95565b91611a95565b915191926001600160a01b039290831690831603612e76578116911690612e13828261378c565b90820391821161108d57612e26926137d3565b6001600160801b0390818111612e4557612e41811515612d9a565b1690565b60405162461bcd60e51b81526020600482015260096024820152686c697175696469747960b81b6044820152606490fd5b9181169116810390811161108d57612e8d916136f6565b612e26565b6001600160a01b03918216815291811660208301529182166040820152918116606083015290911660808201526102208101999897909690959094909390929091612ee19060a08901906110c3565b61ffff9081166101408801521661016086015261ffff166101808501526001600160401b03166101a08401526001600160801b03166101c083015260020b6101e082015261020001610f909160020b9052565b15612f3b57565b60405162461bcd60e51b815260206004820152600e60248201526d7065726d697420617070726f766560901b6044820152606490fd5b15612f7857565b60405162461bcd60e51b815260206004820152600a602482015269706d20617070726f766560b01b6044820152606490fd5b60409060405191612fba83610ee6565b60028352825f5b828110612fcd57505050565b806060602080938501015201612fc1565b9492610781989794919692612ff687610180996110c3565b600290810b60a08801520b60c086015260e08501526001600160801b03918216610100850152166101208301526001600160a01b03166101408201526101608101829052019061074b565b8051156119785760200190565b8051600110156119785760400190565b906130719060408352604083019061074b565b90602090818184039101528251908183528083019281808460051b8301019501935f915b8483106130a55750505050505090565b90919293949584806130c3600193601f198682030187528a5161074b565b9801930193019194939290613095565b9291906130ea60209160408652604086019061074b565b930152565b949390928260206131008287612d00565b505061310c8388612d00565b506001546001600160a01b031691506131949061312761203f565b9388613131611e59565b613139611e4c565b613141611e3f565b9061314a611f1d565b60405163b3b3e97960e01b81529e8f9a8b9a92959233307f00000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa76001600160a01b031660048f01612e92565b03815f7f000000000000000000000000e59a2ff1138d67f643955f6e5321dbe98b4348106001600160a01b03165af193841561048c575f9461366c575b5060405163095ea7b360e01b8082526001600160a01b037f000000000000000000000000000000000022d473030f116ddee9f6b43ac78ba38116600484018190526024840186905296998a97939116916020826044815f875af191821561048c57602092613246915f9161364f575b50612f34565b6040519081526001600160a01b037f00000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa71660048201526024810186905291829060449082905f905af1801561048c576132a5915f91613630575b50612f71565b6132bc6132b1426119c2565b65ffffffffffff1690565b90803b156101e3576040516387517c4560e01b81526001600160a01b0388811660048301527f00000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa7811660248301528516604482015265ffffffffffff9290921660648301525f908290608490829084905af1801561048c5761361d575b50604051631d5e528f60e21b8152946020866004817f00000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa76001600160a01b03165afa95861561048c575f966135fc575b50604051600160f91b6020820152600d60f81b602182015260028152601f199290919086906133b7602285610f1c565b6133bf612faa565b966133ca8285612d00565b5050916133d78186612d00565b50825190996001600160801b039250906133f9906001600160a01b0316611bd1565b6001600160a01b03978816971687036135f55780945b6020840180519098906001600160a01b03166001600160a01b03166001600160a01b0316145f1461350e9b6134dc986134b0986134a29861348196613475956135ed57955b61345c611092565b9489806040519b8c9a1695169316918b60208a01612fde565b03898101835282610f1c565b61348a8a613041565b5261349489613041565b50516001600160a01b031690565b92516001600160a01b031690565b604080516001600160a01b03948516602082015291909316928101929092526060848101835282610f1c565b6134e58561304e565b526134ef8461304e565b506135026040519485926020840161305e565b03908101835282610f1c565b613517426119d2565b907f00000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa76001600160a01b03163b156101e35760405163dd46508f60e01b8152915f918391829161356a9190600484016130d3565b0381837f00000000000000000000000058daec3116aae6d93017baaea7749052e8a04fa76001600160a01b03165af1801561048c576135da575b506001600160a01b0316803b156101e35760405163c929ccf360e01b815260048101929092525f908290818381602481016124f8565b806104846135e792610eb3565b5f6135a4565b505f95613454565b5f9461340f565b61361691965060203d6020116114a5576114968183610f1c565b945f613387565b8061048461362a92610eb3565b5f613338565b613649915060203d602011611465576114568183610f1c565b5f61329f565b6136669150843d8611611465576114568183610f1c565b5f613240565b61368691945060203d6020116126db576126cd8183610f1c565b925f6131d1565b1561369457565b606460405162461bcd60e51b81526020600482015260046024820152630646976360e41b6044820152fd5b156136c657565b60405162461bcd60e51b81526020600482015260086024820152676f766572666c6f7760c01b6044820152606490fd5b600160601b915f19838309928260601b92838086109503948086039514613774579082916137258684116136bf565b0960018219018216809204600280826003021880830282030280830282030280830282030280830282030280830282030280920290030293600183805f03040190848311900302920304170290565b505090610781925061378782151561368d565b6118cc565b5f1982820990828102928380841093039280840393146137ca57600160601b916137b78484116136bf565b0990828211900360a01b910360601c1790565b50505060601c90565b90915f198383099280830292838086109503948086039514613774579082916137258684116136bf56fea264697066735822122085df34308a2ea28ceef47eb3a5e1cecdca39e5a486f46c7264d7c0e0bcd45e9764736f6c63430008180033
| Token | Symbol | Balance | Price | Value |
|---|---|---|---|---|
| no token holdings | ||||
| Txn Hash | Age | Event | Topics / Data |
|---|---|---|---|
| 0xb54c08…e75dce | 3 days agoFri, 14 Aug 2026 13:41:16 UTC | 0xa147aa…524c | [0] 0x000000000000…13ea84df [1] 0x05be754dbf3b…ccacef4d [2] 0x000000000000…9490fc94 data: 0x000000000000000000…b1880000 |
| 0x6d03bd…2adfaf | 4 days agoThu, 13 Aug 2026 16:12:52 UTC | 0xa147aa…524c | [0] 0x000000000000…9f630568 [1] 0x3aac7fc01042…19394f8d [2] 0x000000000000…53356c18 data: 0x000000000000000000…b1880000 |
| 0xd6a0e3…018b11 | 4 days agoThu, 13 Aug 2026 03:23:40 UTC | 0xa147aa…524c | [0] 0x000000000000…afef4806 [1] 0x0b792709ff18…ea952ec6 [2] 0x000000000000…3a5d333e data: 0x000000000000000000…b1880000 |
| 0x6267eb…4f68f5 | 5 days agoWed, 12 Aug 2026 13:57:56 UTC | 0xa147aa…524c | [0] 0x000000000000…93c53b55 [1] 0x5f67e9df71d8…e995834d [2] 0x000000000000…61b59ab0 data: 0x000000000000000000…b1880000 |
| 0x4f2770…9b95dd | 5 days agoWed, 12 Aug 2026 04:48:07 UTC | 0xa147aa…524c | [0] 0x000000000000…f8d4e87f [1] 0x78509467daa0…084d6303 [2] 0x000000000000…28bed54e data: 0x000000000000000000…58ec0000 |
| 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 | |||
| Transaction Hash | Method | Block | Age | From | To | Amount | Token | ||
|---|---|---|---|---|---|---|---|---|---|
| 0xb54c0854…e75dce | Transfer | 36,296,320 | 3 days agoFri, 14 Aug 2026 13:41:16 UTC | 0x7c06…bdaa | OUT | 0x659d…fc94 | 152.959879 REACH | ReachLLM (REACH) | |
| 0xb54c0854…e75dce | Transfer | 36,296,320 | 3 days agoFri, 14 Aug 2026 13:41:16 UTC | 0x8366…0951 | IN | 0x7c06…bdaa | 152.959879 REACH | ReachLLM (REACH) | |
| 0xb54c0854…e75dce | Transfer | 36,296,320 | 3 days agoFri, 14 Aug 2026 13:41:16 UTC | 0x7c06…bdaa | OUT | 0x8366…0951 | 0.008 WETH | WETH (WETH) | |
| 0xb54c0854…e75dce | Transfer | 36,296,320 | 3 days agoFri, 14 Aug 2026 13:41:16 UTC | 0x0000…0000 | IN | 0x7c06…bdaa | 0.008 WETH | WETH (WETH) | |
| 0xb54c0854…e75dce | Transfer | 36,296,320 | 3 days agoFri, 14 Aug 2026 13:41:16 UTC | 0x7c06…bdaa | OUT | 0x0000…dead | 10,000 REACH | ReachLLM (REACH) | |
| 0xb54c0854…e75dce | Transfer | 36,296,320 | 3 days agoFri, 14 Aug 2026 13:41:16 UTC | 0x7c06…bdaa | OUT | 0x8366…0951 | 789,999.999999 REACH | ReachLLM (REACH) | |
| 0xb54c0854…e75dce | Transfer | 36,296,320 | 3 days agoFri, 14 Aug 2026 13:41:16 UTC | 0x7c06…bdaa | OUT | 0xb90a…783c | 199,999.999999 REACH | ReachLLM (REACH) | |
| 0xb54c0854…e75dce | Transfer | 36,296,320 | 3 days agoFri, 14 Aug 2026 13:41:16 UTC | 0x0000…0000 | IN | 0x7c06…bdaa | 999,999.999999 REACH | ReachLLM (REACH) | |
| 0x6d03bdbf…2adfaf | Transfer | 35,524,778 | 4 days agoThu, 13 Aug 2026 16:12:52 UTC | 0x7c06…bdaa | OUT | 0xab9e…6c18 | 95.606866 GSMC | GSMC (GSMC) | |
| 0x6d03bdbf…2adfaf | Transfer | 35,524,778 | 4 days agoThu, 13 Aug 2026 16:12:52 UTC | 0x8366…0951 | IN | 0x7c06…bdaa | 95.606866 GSMC | GSMC (GSMC) | |
| 0x6d03bdbf…2adfaf | Transfer | 35,524,778 | 4 days agoThu, 13 Aug 2026 16:12:52 UTC | 0x7c06…bdaa | OUT | 0x8366…0951 | 0.005 WETH | WETH (WETH) | |
| 0x6d03bdbf…2adfaf | Transfer | 35,524,778 | 4 days agoThu, 13 Aug 2026 16:12:52 UTC | 0x0000…0000 | IN | 0x7c06…bdaa | 0.005 WETH | WETH (WETH) | |
| 0x6d03bdbf…2adfaf | Transfer | 35,524,778 | 4 days agoThu, 13 Aug 2026 16:12:52 UTC | 0x7c06…bdaa | OUT | 0x0000…dead | 10,000 GSMC | GSMC (GSMC) | |
| 0x6d03bdbf…2adfaf | Transfer | 35,524,778 | 4 days agoThu, 13 Aug 2026 16:12:52 UTC | 0x7c06…bdaa | OUT | 0x8366…0951 | 789,999.999999 GSMC | GSMC (GSMC) | |
| 0x6d03bdbf…2adfaf | Transfer | 35,524,778 | 4 days agoThu, 13 Aug 2026 16:12:52 UTC | 0x7c06…bdaa | OUT | 0x0627…a0b1 | 199,999.999999 GSMC | GSMC (GSMC) | |
| 0x6d03bdbf…2adfaf | Transfer | 35,524,778 | 4 days agoThu, 13 Aug 2026 16:12:52 UTC | 0x0000…0000 | IN | 0x7c06…bdaa | 999,999.999999 GSMC | GSMC (GSMC) | |
| 0xd6a0e3d0…018b11 | Transfer | 35,064,806 | 4 days agoThu, 13 Aug 2026 03:23:40 UTC | 0x7c06…bdaa | OUT | 0xcb38…333e | 19.123224 ENGMA | Enigmra (ENGMA) | |
| 0xd6a0e3d0…018b11 | Transfer | 35,064,806 | 4 days agoThu, 13 Aug 2026 03:23:40 UTC | 0x8366…0951 | IN | 0x7c06…bdaa | 19.123224 ENGMA | Enigmra (ENGMA) | |
| 0xd6a0e3d0…018b11 | Transfer | 35,064,806 | 4 days agoThu, 13 Aug 2026 03:23:40 UTC | 0x7c06…bdaa | OUT | 0x8366…0951 | 0.001 WETH | WETH (WETH) | |
| 0xd6a0e3d0…018b11 | Transfer | 35,064,806 | 4 days agoThu, 13 Aug 2026 03:23:40 UTC | 0x0000…0000 | IN | 0x7c06…bdaa | 0.001 WETH | WETH (WETH) | |
| 0xd6a0e3d0…018b11 | Transfer | 35,064,806 | 4 days agoThu, 13 Aug 2026 03:23:40 UTC | 0x7c06…bdaa | OUT | 0x0000…dead | 10,000 ENGMA | Enigmra (ENGMA) | |
| 0xd6a0e3d0…018b11 | Transfer | 35,064,806 | 4 days agoThu, 13 Aug 2026 03:23:40 UTC | 0x7c06…bdaa | OUT | 0x8366…0951 | 789,999.999999 ENGMA | Enigmra (ENGMA) | |
| 0xd6a0e3d0…018b11 | Transfer | 35,064,806 | 4 days agoThu, 13 Aug 2026 03:23:40 UTC | 0x7c06…bdaa | OUT | 0xbfc2…77cc | 199,999.999999 ENGMA | Enigmra (ENGMA) | |
| 0xd6a0e3d0…018b11 | Transfer | 35,064,806 | 4 days agoThu, 13 Aug 2026 03:23:40 UTC | 0x0000…0000 | IN | 0x7c06…bdaa | 999,999.999999 ENGMA | Enigmra (ENGMA) | |
| 0x6267eb57…4f68f5 | Transfer | 34,582,138 | 5 days agoWed, 12 Aug 2026 13:57:56 UTC | 0x7c06…bdaa | OUT | 0x02fc…9ab0 | 19.123224 KRATOS | KRX (KRATOS) |
| Transaction Hash | Method ? | Block | Age | From | To | Amount | Txn Fee ? | ||
|---|---|---|---|---|---|---|---|---|---|
| 0x20446c…91c86e | removeLiquidity | 38,943,834 | 3 hrs agoMon, 17 Aug 2026 15:27:21 UTC | 0x9578…13e5 | IN | CyreneGenesisFactory | $0.000 ETH | 0.00000417 | |
| 0xe0d663…f4f545 | removeLiquidity | 38,189,993 | 1 day agoSun, 16 Aug 2026 18:26:50 UTC | 0x9578…13e5 | IN | CyreneGenesisFactory | $0.000 ETH | 0.00000384 | |
| 0xb54c08…e75dce | launch | 36,296,320 | 3 days agoFri, 14 Aug 2026 13:41:16 UTC | 0x659d…fc94 | IN | CyreneGenesisFactory | $15.240.008 ETH | 0.00013982 | |
| 0x6d03bd…2adfaf | launch | 35,524,778 | 4 days agoThu, 13 Aug 2026 16:12:52 UTC | 0xab9e…6c18 | IN | CyreneGenesisFactory | $9.530.005 ETH | 0.00015849 | |
| 0xd6a0e3…018b11 | launch | 35,064,806 | 4 days agoThu, 13 Aug 2026 03:23:40 UTC | 0xcb38…333e | IN | CyreneGenesisFactory | $1.910.001 ETH | 0.00018516 | |
| 0x6267eb…4f68f5 | launch | 34,582,138 | 5 days agoWed, 12 Aug 2026 13:57:56 UTC | 0x02fc…9ab0 | IN | CyreneGenesisFactory | $1.910.001 ETH | 0.00017995 | |
| 0x6e7966…e228d2 | setLockerClaimBlocked | 34,254,176 | 5 days agoWed, 12 Aug 2026 04:52:56 UTC | 0x9578…13e5 | IN | CyreneGenesisFactory | $0.000 ETH | 0.00000227 | |
| 0x4f2770…9b95dd | launch | 34,251,286 | 5 days agoWed, 12 Aug 2026 04:48:07 UTC | 0xe6bc…d54e | IN | CyreneGenesisFactory | $0.190.0001 ETH | 0.00014382 |
| Block | Age | Parent Transaction Hash | Type | Method | From | To | Value | |
|---|---|---|---|---|---|---|---|---|
| 36,296,320 | 3 days agoFri, 14 Aug 2026 13:41:16 UTC | 0xb54c08…e75dce | CALL | launch | 0x7c06…bdaa | OUT | 0x0bd7…ad73 | 0.008 ETH |
| 36,296,320 | 3 days agoFri, 14 Aug 2026 13:41:16 UTC | 0xb54c08…e75dce | CREATE | launch | 0x7c06…bdaa | OUT | 0x6913…84df | 0 ETH |
| 35,524,778 | 4 days agoThu, 13 Aug 2026 16:12:52 UTC | 0x6d03bd…2adfaf | CALL | launch | 0x7c06…bdaa | OUT | 0x0bd7…ad73 | 0.005 ETH |
| 35,524,778 | 4 days agoThu, 13 Aug 2026 16:12:52 UTC | 0x6d03bd…2adfaf | CREATE | launch | 0x7c06…bdaa | OUT | 0x5165…0568 | 0 ETH |
| 35,064,806 | 4 days agoThu, 13 Aug 2026 03:23:40 UTC | 0xd6a0e3…018b11 | CALL | launch | 0x7c06…bdaa | OUT | 0x0bd7…ad73 | 0.001 ETH |
| 35,064,806 | 4 days agoThu, 13 Aug 2026 03:23:40 UTC | 0xd6a0e3…018b11 | CREATE | launch | 0x7c06…bdaa | OUT | 0x7f5c…4806 | 0 ETH |
| 34,582,138 | 5 days agoWed, 12 Aug 2026 13:57:56 UTC | 0x6267eb…4f68f5 | CALL | launch | 0x7c06…bdaa | OUT | 0x0bd7…ad73 | 0.001 ETH |
| 34,582,138 | 5 days agoWed, 12 Aug 2026 13:57:56 UTC | 0x6267eb…4f68f5 | CREATE | launch | 0x7c06…bdaa | OUT | 0x3cb3…3b55 | 0 ETH |
| 34,251,286 | 5 days agoWed, 12 Aug 2026 04:48:07 UTC | 0x4f2770…9b95dd | CALL | launch | 0x7c06…bdaa | OUT | 0x8366…0951 | 0.0001 ETH |
| 34,251,286 | 5 days agoWed, 12 Aug 2026 04:48:07 UTC | 0x4f2770…9b95dd | CREATE | launch | 0x7c06…bdaa | OUT | 0x3a5b…e87f | 0 ETH |
| 34,239,757 | 5 days agoWed, 12 Aug 2026 04:28:56 UTC | 0xb02926…1390dd | CREATE | 0x61018034 | 0x7c06…bdaa | OUT | 0x68ab…4d89 | 0 ETH |