Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- ColdfiV3Factory
- Optimization enabled
- true
- Compiler version
- v0.7.6+commit.7338295f
- Optimization runs
- 1000000
- EVM Version
- istanbul
- Verified at
- 2024-11-17T12:18:11.612456Z
Constructor Arguments
0x0000000000000000000000005d2cc072d1972f6a81696acbd9bc51b324c45e57
Arg [0] (address) : 0x5d2cc072d1972f6a81696acbd9bc51b324c45e57
contracts/ColdfiV3Factory.sol
// SPDX-License-Identifier: GPL-2.0-or-laterpragma solidity =0.7.6;import './interfaces/IColdfiV3Factory.sol';import "./interfaces/IColdfiV3PoolDeployer.sol";import './interfaces/IColdfiV3Pool.sol';/// @title Canonical ColdfiSwap V3 factory/// @notice Deploys ColdfiSwap V3 pools and manages ownership and control over pool protocol feescontract ColdfiV3Factory is IColdfiV3Factory {/// @inheritdoc IColdfiV3Factoryaddress public override owner;address public immutable poolDeployer;/// @inheritdoc IColdfiV3Factorymapping(uint24 => int24) public override feeAmountTickSpacing;/// @inheritdoc IColdfiV3Factorymapping(address => mapping(address => mapping(uint24 => address))) public override getPool;/// @inheritdoc IColdfiV3Factorymapping(uint24 => TickSpacingExtraInfo) public override feeAmountTickSpacingExtraInfo;mapping(address => bool) private _whiteListAddresses;modifier onlyOwner() {require(msg.sender == owner, "Not owner");_;}constructor(address _poolDeployer) {poolDeployer = _poolDeployer;owner = msg.sender;emit OwnerChanged(address(0), msg.sender);feeAmountTickSpacing[100] = 1;feeAmountTickSpacingExtraInfo[100] = TickSpacingExtraInfo({whitelistRequested: false, enabled: true});emit FeeAmountEnabled(100, 1);emit FeeAmountExtraInfoUpdated(100, false, true);feeAmountTickSpacing[500] = 10;feeAmountTickSpacingExtraInfo[500] = TickSpacingExtraInfo({whitelistRequested: false, enabled: true});
contracts/interfaces/IColdfiV3Factory.sol
// SPDX-License-Identifier: GPL-2.0-or-laterpragma solidity >=0.5.0;/// @title The interface for the ColdfiSwap V3 Factory/// @notice The ColdfiSwap V3 Factory facilitates creation of ColdfiSwap V3 pools and control over the protocol feesinterface IColdfiV3Factory {struct TickSpacingExtraInfo {bool whitelistRequested;bool enabled;}/// @notice Emitted when the owner of the factory is changed/// @param oldOwner The owner before the owner was changed/// @param newOwner The owner after the owner was changedevent OwnerChanged(address indexed oldOwner, address indexed newOwner);/// @notice Emitted when a pool is created/// @param token0 The first token of the pool by address sort order/// @param token1 The second token of the pool by address sort order/// @param fee The fee collected upon every swap in the pool, denominated in hundredths of a bip/// @param tickSpacing The minimum number of ticks between initialized ticks/// @param pool The address of the created poolevent PoolCreated(address indexed token0,address indexed token1,uint24 indexed fee,int24 tickSpacing,address pool);/// @notice Emitted when a new fee amount is enabled for pool creation via the factory/// @param fee The enabled fee, denominated in hundredths of a bip/// @param tickSpacing The minimum number of ticks between initialized ticks for pools created with the given feeevent FeeAmountEnabled(uint24 indexed fee, int24 indexed tickSpacing);event FeeAmountExtraInfoUpdated(uint24 indexed fee, bool whitelistRequested, bool enabled);event WhiteListAdded(address indexed user, bool verified);/// @notice Returns the current owner of the factory/// @dev Can be changed by the current owner via setOwner
contracts/interfaces/IColdfiV3Pool.sol
// SPDX-License-Identifier: GPL-2.0-or-laterpragma solidity >=0.5.0;import './pool/IColdfiV3PoolImmutables.sol';import './pool/IColdfiV3PoolState.sol';import './pool/IColdfiV3PoolDerivedState.sol';import './pool/IColdfiV3PoolActions.sol';import './pool/IColdfiV3PoolOwnerActions.sol';import './pool/IColdfiV3PoolEvents.sol';/// @title The interface for a ColdfiSwap V3 Pool/// @notice A ColdfiSwap pool facilitates swapping and automated market making between any two assets that strictly conform/// to the ERC20 specification/// @dev The pool interface is broken up into many smaller piecesinterface IColdfiV3Pool isIColdfiV3PoolImmutables,IColdfiV3PoolState,IColdfiV3PoolDerivedState,IColdfiV3PoolActions,IColdfiV3PoolOwnerActions,IColdfiV3PoolEvents{}
contracts/interfaces/IColdfiV3PoolDeployer.sol
// SPDX-License-Identifier: GPL-2.0-or-laterpragma solidity >=0.5.0;/// @title An interface for a contract that is capable of deploying ColdfiSwap V3 Pools/// @notice A contract that constructs a pool must implement this to pass arguments to the pool/// @dev This is used to avoid having constructor arguments in the pool contract, which results in the init code hash/// of the pool being constant allowing the CREATE2 address of the pool to be cheaply computed on-chaininterface IColdfiV3PoolDeployer {/// @notice Get the parameters to be used in constructing the pool, set transiently during pool creation./// @dev Called by the pool constructor to fetch the parameters of the pool/// Returns factory The factory address/// Returns token0 The first token of the pool by address sort order/// Returns token1 The second token of the pool by address sort order/// Returns fee The fee collected upon every swap in the pool, denominated in hundredths of a bip/// Returns tickSpacing The minimum number of ticks between initialized ticksfunction parameters()externalviewreturns (address factory,address token0,address token1,uint24 fee,int24 tickSpacing);function deploy(address factory,address token0,address token1,uint24 fee,int24 tickSpacing) external returns (address pool);}
contracts/interfaces/pool/IColdfiV3PoolActions.sol
// SPDX-License-Identifier: GPL-2.0-or-laterpragma solidity >=0.5.0;/// @title Permissionless pool actions/// @notice Contains pool methods that can be called by anyoneinterface IColdfiV3PoolActions {/// @notice Sets the initial price for the pool/// @dev Price is represented as a sqrt(amountToken1/amountToken0) Q64.96 value/// @param sqrtPriceX96 the initial sqrt price of the pool as a Q64.96function initialize(uint160 sqrtPriceX96) external;/// @notice Adds liquidity for the given recipient/tickLower/tickUpper position/// @dev The caller of this method receives a callback in the form of IColdfiV3MintCallback#coldfiV3MintCallback/// in which they must pay any token0 or token1 owed for the liquidity. The amount of token0/token1 due depends/// on tickLower, tickUpper, the amount of liquidity, and the current price./// @param recipient The address for which the liquidity will be created/// @param tickLower The lower tick of the position in which to add liquidity/// @param tickUpper The upper tick of the position in which to add liquidity/// @param amount The amount of liquidity to mint/// @param data Any data that should be passed through to the callback/// @return amount0 The amount of token0 that was paid to mint the given amount of liquidity. Matches the value in the callback/// @return amount1 The amount of token1 that was paid to mint the given amount of liquidity. Matches the value in the callbackfunction mint(address recipient,int24 tickLower,int24 tickUpper,uint128 amount,bytes calldata data) external returns (uint256 amount0, uint256 amount1);/// @notice Collects tokens owed to a position/// @dev Does not recompute fees earned, which must be done either via mint or burn of any amount of liquidity./// Collect must be called by the position owner. To withdraw only token0 or only token1, amount0Requested or/// amount1Requested may be set to zero. To withdraw all tokens owed, caller may pass any value greater than the/// actual tokens owed, e.g. type(uint128).max. Tokens owed may be from accumulated swap fees or burned liquidity./// @param recipient The address which should receive the fees collected/// @param tickLower The lower tick of the position for which to collect fees/// @param tickUpper The upper tick of the position for which to collect fees/// @param amount0Requested How much token0 should be withdrawn from the fees owed/// @param amount1Requested How much token1 should be withdrawn from the fees owed/// @return amount0 The amount of fees collected in token0
contracts/interfaces/pool/IColdfiV3PoolDerivedState.sol
// SPDX-License-Identifier: GPL-2.0-or-laterpragma solidity >=0.5.0;/// @title Pool state that is not stored/// @notice Contains view functions to provide information about the pool that is computed rather than stored on the/// blockchain. The functions here may have variable gas costs.interface IColdfiV3PoolDerivedState {/// @notice Returns the cumulative tick and liquidity as of each timestamp `secondsAgo` from the current block timestamp/// @dev To get a time weighted average tick or liquidity-in-range, you must call this with two values, one representing/// the beginning of the period and another for the end of the period. E.g., to get the last hour time-weighted average tick,/// you must call it with secondsAgos = [3600, 0]./// @dev The time weighted average tick represents the geometric time weighted average price of the pool, in/// log base sqrt(1.0001) of token1 / token0. The TickMath library can be used to go from a tick value to a ratio./// @param secondsAgos From how long ago each cumulative tick and liquidity value should be returned/// @return tickCumulatives Cumulative tick values as of each `secondsAgos` from the current block timestamp/// @return secondsPerLiquidityCumulativeX128s Cumulative seconds per liquidity-in-range value as of each `secondsAgos` from the current block/// timestampfunction observe(uint32[] calldata secondsAgos)externalviewreturns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s);/// @notice Returns a snapshot of the tick cumulative, seconds per liquidity and seconds inside a tick range/// @dev Snapshots must only be compared to other snapshots, taken over a period for which a position existed./// I.e., snapshots cannot be compared if a position is not held for the entire period between when the first/// snapshot is taken and the second snapshot is taken./// @param tickLower The lower tick of the range/// @param tickUpper The upper tick of the range/// @return tickCumulativeInside The snapshot of the tick accumulator for the range/// @return secondsPerLiquidityInsideX128 The snapshot of seconds per liquidity for the range/// @return secondsInside The snapshot of seconds per liquidity for the rangefunction snapshotCumulativesInside(int24 tickLower, int24 tickUpper)externalviewreturns (int56 tickCumulativeInside,uint160 secondsPerLiquidityInsideX128,uint32 secondsInside);}
contracts/interfaces/pool/IColdfiV3PoolEvents.sol
// SPDX-License-Identifier: GPL-2.0-or-laterpragma solidity >=0.5.0;/// @title Events emitted by a pool/// @notice Contains all events emitted by the poolinterface IColdfiV3PoolEvents {/// @notice Emitted exactly once by a pool when #initialize is first called on the pool/// @dev Mint/Burn/Swap cannot be emitted by the pool before Initialize/// @param sqrtPriceX96 The initial sqrt price of the pool, as a Q64.96/// @param tick The initial tick of the pool, i.e. log base 1.0001 of the starting price of the poolevent Initialize(uint160 sqrtPriceX96, int24 tick);/// @notice Emitted when liquidity is minted for a given position/// @param sender The address that minted the liquidity/// @param owner The owner of the position and recipient of any minted liquidity/// @param tickLower The lower tick of the position/// @param tickUpper The upper tick of the position/// @param amount The amount of liquidity minted to the position range/// @param amount0 How much token0 was required for the minted liquidity/// @param amount1 How much token1 was required for the minted liquidityevent Mint(address sender,address indexed owner,int24 indexed tickLower,int24 indexed tickUpper,uint128 amount,uint256 amount0,uint256 amount1);/// @notice Emitted when fees are collected by the owner of a position/// @dev Collect events may be emitted with zero amount0 and amount1 when the caller chooses not to collect fees/// @param owner The owner of the position for which fees are collected/// @param tickLower The lower tick of the position/// @param tickUpper The upper tick of the position/// @param amount0 The amount of token0 fees collected/// @param amount1 The amount of token1 fees collectedevent Collect(address indexed owner,address recipient,int24 indexed tickLower,
contracts/interfaces/pool/IColdfiV3PoolImmutables.sol
// SPDX-License-Identifier: GPL-2.0-or-laterpragma solidity >=0.5.0;/// @title Pool state that never changes/// @notice These parameters are fixed for a pool forever, i.e., the methods will always return the same valuesinterface IColdfiV3PoolImmutables {/// @notice The contract that deployed the pool, which must adhere to the IColdfiV3Factory interface/// @return The contract addressfunction factory() external view returns (address);/// @notice The first of the two tokens of the pool, sorted by address/// @return The token contract addressfunction token0() external view returns (address);/// @notice The second of the two tokens of the pool, sorted by address/// @return The token contract addressfunction token1() external view returns (address);/// @notice The pool's fee in hundredths of a bip, i.e. 1e-6/// @return The feefunction fee() external view returns (uint24);/// @notice The pool tick spacing/// @dev Ticks can only be used at multiples of this value, minimum of 1 and always positive/// e.g.: a tickSpacing of 3 means ticks can be initialized every 3rd tick, i.e., ..., -6, -3, 0, 3, 6, .../// This value is an int24 to avoid casting even though it is always positive./// @return The tick spacingfunction tickSpacing() external view returns (int24);/// @notice The maximum amount of position liquidity that can use any tick in the range/// @dev This parameter is enforced per tick to prevent liquidity from overflowing a uint128 at any point, and/// also prevents out-of-range liquidity from being used to prevent adding in-range liquidity to a pool/// @return The max amount of liquidity per tickfunction maxLiquidityPerTick() external view returns (uint128);}
contracts/interfaces/pool/IColdfiV3PoolOwnerActions.sol
// SPDX-License-Identifier: GPL-2.0-or-laterpragma solidity >=0.5.0;/// @title Permissioned pool actions/// @notice Contains pool methods that may only be called by the factory ownerinterface IColdfiV3PoolOwnerActions {/// @notice Set the denominator of the protocol's % share of the fees/// @param feeProtocol0 new protocol fee for token0 of the pool/// @param feeProtocol1 new protocol fee for token1 of the poolfunction setFeeProtocol(uint32 feeProtocol0, uint32 feeProtocol1) external;/// @notice Collect the protocol fee accrued to the pool/// @param recipient The address to which collected protocol fees should be sent/// @param amount0Requested The maximum amount of token0 to send, can be 0 to collect fees in only token1/// @param amount1Requested The maximum amount of token1 to send, can be 0 to collect fees in only token0/// @return amount0 The protocol fee collected in token0/// @return amount1 The protocol fee collected in token1function collectProtocol(address recipient,uint128 amount0Requested,uint128 amount1Requested) external returns (uint128 amount0, uint128 amount1);}
contracts/interfaces/pool/IColdfiV3PoolState.sol
// SPDX-License-Identifier: GPL-2.0-or-laterpragma solidity >=0.5.0;/// @title Pool state that can change/// @notice These methods compose the pool's state, and can change with any frequency including multiple times/// per transactioninterface IColdfiV3PoolState {/// @notice The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas/// when accessed externally./// @return sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value/// tick The current tick of the pool, i.e. according to the last tick transition that was run./// This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick/// boundary./// observationIndex The index of the last oracle observation that was written,/// observationCardinality The current maximum number of observations stored in the pool,/// observationCardinalityNext The next maximum number of observations, to be updated when the observation./// feeProtocol The protocol fee for both tokens of the pool./// Encoded as two 4 bit values, where the protocol fee of token1 is shifted 4 bits and the protocol fee of token0/// is the lower 4 bits. Used as the denominator of a fraction of the swap fee, e.g. 4 means 1/4th of the swap fee./// unlocked Whether the pool is currently locked to reentrancyfunction slot0()externalviewreturns (uint160 sqrtPriceX96,int24 tick,uint16 observationIndex,uint16 observationCardinality,uint16 observationCardinalityNext,uint32 feeProtocol,bool unlocked);/// @notice The fee growth as a Q128.128 fees of token0 collected per unit of liquidity for the entire life of the pool/// @dev This value can overflow the uint256function feeGrowthGlobal0X128() external view returns (uint256);/// @notice The fee growth as a Q128.128 fees of token1 collected per unit of liquidity for the entire life of the pool/// @dev This value can overflow the uint256function feeGrowthGlobal1X128() external view returns (uint256);
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":1000000,"enabled":true},"metadata":{"bytecodeHash":"none"},"libraries":{},"evmVersion":"istanbul"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_poolDeployer","internalType":"address"}]},{"type":"event","name":"FeeAmountEnabled","inputs":[{"type":"uint24","name":"fee","internalType":"uint24","indexed":true},{"type":"int24","name":"tickSpacing","internalType":"int24","indexed":true}],"anonymous":false},{"type":"event","name":"FeeAmountExtraInfoUpdated","inputs":[{"type":"uint24","name":"fee","internalType":"uint24","indexed":true},{"type":"bool","name":"whitelistRequested","internalType":"bool","indexed":false},{"type":"bool","name":"enabled","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"OwnerChanged","inputs":[{"type":"address","name":"oldOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"PoolCreated","inputs":[{"type":"address","name":"token0","internalType":"address","indexed":true},{"type":"address","name":"token1","internalType":"address","indexed":true},{"type":"uint24","name":"fee","internalType":"uint24","indexed":true},{"type":"int24","name":"tickSpacing","internalType":"int24","indexed":false},{"type":"address","name":"pool","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"WhiteListAdded","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"bool","name":"verified","internalType":"bool","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint128","name":"amount0","internalType":"uint128"},{"type":"uint128","name":"amount1","internalType":"uint128"}],"name":"collectProtocol","inputs":[{"type":"address","name":"pool","internalType":"address"},{"type":"address","name":"recipient","internalType":"address"},{"type":"uint128","name":"amount0Requested","internalType":"uint128"},{"type":"uint128","name":"amount1Requested","internalType":"uint128"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address","name":"pool","internalType":"address"}],"name":"createPool","inputs":[{"type":"address","name":"tokenA","internalType":"address"},{"type":"address","name":"tokenB","internalType":"address"},{"type":"uint24","name":"fee","internalType":"uint24"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableFeeAmount","inputs":[{"type":"uint24","name":"fee","internalType":"uint24"},{"type":"int24","name":"tickSpacing","internalType":"int24"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"int24","name":"","internalType":"int24"}],"name":"feeAmountTickSpacing","inputs":[{"type":"uint24","name":"","internalType":"uint24"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"whitelistRequested","internalType":"bool"},{"type":"bool","name":"enabled","internalType":"bool"}],"name":"feeAmountTickSpacingExtraInfo","inputs":[{"type":"uint24","name":"","internalType":"uint24"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getPool","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"},{"type":"uint24","name":"","internalType":"uint24"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"poolDeployer","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeAmountExtraInfo","inputs":[{"type":"uint24","name":"fee","internalType":"uint24"},{"type":"bool","name":"whitelistRequested","internalType":"bool"},{"type":"bool","name":"enabled","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeProtocol","inputs":[{"type":"address","name":"pool","internalType":"address"},{"type":"uint32","name":"feeProtocol0","internalType":"uint32"},{"type":"uint32","name":"feeProtocol1","internalType":"uint32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setOwner","inputs":[{"type":"address","name":"_owner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setWhiteListAddress","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"bool","name":"verified","internalType":"bool"}]}]
Contract Creation Code
0x60a060405234801561001057600080fd5b506040516115a03803806115a08339818101604052602081101561003357600080fd5b50516001600160601b0319606082901b16608052600080546001600160a01b0319163390811782556040519091907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c908290a37f1bd07f61ef326b4de236f5b68f225f46ff76ee2c375ae31a06da201c49c70c12805462ffffff19166001908117909155604080518082018252600080825260208281018581526064808452600390925292517f6b16ef514f22b74729cbea5cc7babfecbdc2309e530ca716643d11fe929eed2e8054945115156101000261ff001992151560ff199096169590951791909116939093179092559151909160008051602061156083398151915291a36040805160008152600160208201528151606492600080516020611580833981519152928290030190a27f344a86d038cc67650617710ee5afca4f5d1ed60d199ecd86852cac7a55b2d3e5805462ffffff1916600a9081179091556040805180820182526000808252600160208381019182526101f4808452600390915292517f5ed261ce397475c8f8ccd7526f550ae383248415591df3d1b32ee25c9ab0af2e8054925115156101000261ff001992151560ff1990941693909317919091169190911790559151909160008051602061156083398151915291a360408051600081526001602082015281516101f492600080516020611580833981519152928290030190a27f18ea07d45b61092cf379823b7e255753fc01638d9bcaaef647c0748469d0c8cb805462ffffff191660329081179091556040805180820182526000808252600160208381019182526109c4808452600390915292517f2cb06da9fad5bc9043c9933b28e89aaba34d84764c67113fa1d4256f6b23f7558054925115156101000261ff001992151560ff1990941693909317919091169190911790559151909160008051602061156083398151915291a360408051600081526001602082015281516109c492600080516020611580833981519152928290030190a27f1ca239af1d44623dfaa87ee0cbbbe4bbeb2112df36e66deedafd694350d045cd805462ffffff191660c8908117909155604080518082018252600080825260016020838101918252612710808452600390915292517fbed90d45c8c5fb2e8fcae0027c6e57da3d943cdb82d794c1080bce28e166f2118054925115156101000261ff001992151560ff1990941693909317919091169190911790559151909160008051602061156083398151915291a3604080516000815260016020820152815161271092600080516020611580833981519152928290030190a25060805160601c61114a6104166000398061052f5280610e06525061114a6000f3fe608060405234801561001057600080fd5b50600436106100d45760003560e01c806388e8006d116100815780638ff38e801161005b5780638ff38e8014610316578063a167129514610348578063e4a86a9914610391576100d4565b806388e8006d146102a65780638a7c195f146102e35780638da5cb5b1461030e576100d4565b80633119049a116100b25780633119049a146101b957806343db87da146101c15780637e8435e61461025f576100d4565b806313af4035146100d95780631698ee821461010e57806322afcccb14610180575b600080fd5b61010c600480360360208110156100ef57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166103cc565b005b6101576004803603606081101561012457600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff908116916020810135909116906040013562ffffff166104df565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101a26004803603602081101561019657600080fd5b503562ffffff16610518565b6040805160029290920b8252519081900360200190f35b61015761052d565b61021e600480360360808110156101d757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135909116906fffffffffffffffffffffffffffffffff60408201358116916060013516610551565b60405180836fffffffffffffffffffffffffffffffff168152602001826fffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b61010c6004803603606081101561027557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169063ffffffff602082013581169160400135166106a7565b6102c8600480360360208110156102bc57600080fd5b503562ffffff166107c5565b60408051921515835290151560208301528051918290030190f35b61010c600480360360408110156102f957600080fd5b5062ffffff813516906020013560020b6107e3565b6101576109ee565b61010c6004803603606081101561032c57600080fd5b5062ffffff813516906020810135151590604001351515610a0a565b6101576004803603606081101561035e57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff908116916020810135909116906040013562ffffff16610b7b565b61010c600480360360408110156103a757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610f5f565b60005473ffffffffffffffffffffffffffffffffffffffff16331461045257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600260209081526000938452604080852082529284528284209052825290205473ffffffffffffffffffffffffffffffffffffffff1681565b60016020526000908152604090205460020b81565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008054819073ffffffffffffffffffffffffffffffffffffffff1633146105da57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604080517f85b6672900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526fffffffffffffffffffffffffffffffff8088166024840152861660448301528251908916926385b6672992606480820193918290030181600087803b15801561066757600080fd5b505af115801561067b573d6000803e3d6000fd5b505050506040513d604081101561069157600080fd5b5080516020909101519097909650945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461072d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604080517fb0d0d21100000000000000000000000000000000000000000000000000000000815263ffffffff808516600483015283166024820152905173ffffffffffffffffffffffffffffffffffffffff85169163b0d0d21191604480830192600092919082900301818387803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b50505050505050565b60036020526000908152604090205460ff8082169161010090041682565b60005473ffffffffffffffffffffffffffffffffffffffff16331461086957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b620f42408262ffffff161061087d57600080fd5b60008160020b13801561089457506140008160020b125b61089d57600080fd5b62ffffff8216600090815260016020526040902054600290810b900b156108c357600080fd5b62ffffff828116600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000016600289900b9788161790558051808201825284815280830193845285855260039092528084209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909416901515177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010093151593909302929092179055517fc66a3fdf07232cdd185febcc6579d408c241b47ae2f9907d84be655141eeaecc9190a3604080516000815260016020820152815162ffffff8516927fed85b616dbfbc54d0f1180a7bd0f6e3bb645b269b234e7a9edcc269ef1443d88928290030190a25050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a9057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b62ffffff8316600090815260016020526040902054600290810b900b610ab557600080fd5b604080518082018252831515808252831515602080840182815262ffffff89166000818152600384528790209551865492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009094169390931716919091179094558451928352820152825191927fed85b616dbfbc54d0f1180a7bd0f6e3bb645b269b234e7a9edcc269ef1443d8892918290030190a2505050565b60008273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610bb657600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1610610bf3578486610bf6565b85855b909250905073ffffffffffffffffffffffffffffffffffffffff8216610c1b57600080fd5b62ffffff8416600090815260016020908152604080832054600383529281902081518083019092525460ff8082161515835261010090910416151591810191909152600291820b9182900b15801590610c75575080602001515b610ce057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f666565206973206e6f7420617661696c61626c65207965740000000000000000604482015290519081900360640190fd5b805115610d4f573360009081526004602052604090205460ff16610d4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061110c6032913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84811660009081526002602090815260408083208785168452825280832062ffffff8b1684529091529020541615610d9b57600080fd5b604080517ffad5359f00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8681166024830152858116604483015262ffffff89166064830152600285900b608483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163fad5359f9160a4808201926020929091908290030181600087803b158015610e5157600080fd5b505af1158015610e65573d6000803e3d6000fd5b505050506040513d6020811015610e7b57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff80861660008181526002602081815260408084208a871680865290835281852062ffffff8f168087529084528286208054988a167fffffffffffffffffffffffff0000000000000000000000000000000000000000998a1681179091558287528585528387208888528552838720828852855295839020805490981686179097558151938a900b8452918301939093528251959a5093947f783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118929181900390910190a4505050509392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fe557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604090205460ff161515811515141561108057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f7374617465206e6f74206368616e676500000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016851515908117909155825190815291517faec42ac7f1bb8651906ae6522f50a19429e124e8ea678ef59fd27750759288a29281900390910190a2505056fe757365722073686f756c6420626520696e20746865207768697465206c69737420666f722074686973206665652074696572a164736f6c6343000706000ac66a3fdf07232cdd185febcc6579d408c241b47ae2f9907d84be655141eeaecced85b616dbfbc54d0f1180a7bd0f6e3bb645b269b234e7a9edcc269ef1443d880000000000000000000000005d2cc072d1972f6a81696acbd9bc51b324c45e57
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100d45760003560e01c806388e8006d116100815780638ff38e801161005b5780638ff38e8014610316578063a167129514610348578063e4a86a9914610391576100d4565b806388e8006d146102a65780638a7c195f146102e35780638da5cb5b1461030e576100d4565b80633119049a116100b25780633119049a146101b957806343db87da146101c15780637e8435e61461025f576100d4565b806313af4035146100d95780631698ee821461010e57806322afcccb14610180575b600080fd5b61010c600480360360208110156100ef57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166103cc565b005b6101576004803603606081101561012457600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff908116916020810135909116906040013562ffffff166104df565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101a26004803603602081101561019657600080fd5b503562ffffff16610518565b6040805160029290920b8252519081900360200190f35b61015761052d565b61021e600480360360808110156101d757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135909116906fffffffffffffffffffffffffffffffff60408201358116916060013516610551565b60405180836fffffffffffffffffffffffffffffffff168152602001826fffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b61010c6004803603606081101561027557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169063ffffffff602082013581169160400135166106a7565b6102c8600480360360208110156102bc57600080fd5b503562ffffff166107c5565b60408051921515835290151560208301528051918290030190f35b61010c600480360360408110156102f957600080fd5b5062ffffff813516906020013560020b6107e3565b6101576109ee565b61010c6004803603606081101561032c57600080fd5b5062ffffff813516906020810135151590604001351515610a0a565b6101576004803603606081101561035e57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff908116916020810135909116906040013562ffffff16610b7b565b61010c600480360360408110156103a757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610f5f565b60005473ffffffffffffffffffffffffffffffffffffffff16331461045257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600260209081526000938452604080852082529284528284209052825290205473ffffffffffffffffffffffffffffffffffffffff1681565b60016020526000908152604090205460020b81565b7f0000000000000000000000005d2cc072d1972f6a81696acbd9bc51b324c45e5781565b60008054819073ffffffffffffffffffffffffffffffffffffffff1633146105da57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604080517f85b6672900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301526fffffffffffffffffffffffffffffffff8088166024840152861660448301528251908916926385b6672992606480820193918290030181600087803b15801561066757600080fd5b505af115801561067b573d6000803e3d6000fd5b505050506040513d604081101561069157600080fd5b5080516020909101519097909650945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461072d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b604080517fb0d0d21100000000000000000000000000000000000000000000000000000000815263ffffffff808516600483015283166024820152905173ffffffffffffffffffffffffffffffffffffffff85169163b0d0d21191604480830192600092919082900301818387803b1580156107a857600080fd5b505af11580156107bc573d6000803e3d6000fd5b50505050505050565b60036020526000908152604090205460ff8082169161010090041682565b60005473ffffffffffffffffffffffffffffffffffffffff16331461086957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b620f42408262ffffff161061087d57600080fd5b60008160020b13801561089457506140008160020b125b61089d57600080fd5b62ffffff8216600090815260016020526040902054600290810b900b156108c357600080fd5b62ffffff828116600081815260016020818152604080842080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000016600289900b9788161790558051808201825284815280830193845285855260039092528084209151825493517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909416901515177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010093151593909302929092179055517fc66a3fdf07232cdd185febcc6579d408c241b47ae2f9907d84be655141eeaecc9190a3604080516000815260016020820152815162ffffff8516927fed85b616dbfbc54d0f1180a7bd0f6e3bb645b269b234e7a9edcc269ef1443d88928290030190a25050565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a9057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b62ffffff8316600090815260016020526040902054600290810b900b610ab557600080fd5b604080518082018252831515808252831515602080840182815262ffffff89166000818152600384528790209551865492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9115157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009094169390931716919091179094558451928352820152825191927fed85b616dbfbc54d0f1180a7bd0f6e3bb645b269b234e7a9edcc269ef1443d8892918290030190a2505050565b60008273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610bb657600080fd5b6000808473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1610610bf3578486610bf6565b85855b909250905073ffffffffffffffffffffffffffffffffffffffff8216610c1b57600080fd5b62ffffff8416600090815260016020908152604080832054600383529281902081518083019092525460ff8082161515835261010090910416151591810191909152600291820b9182900b15801590610c75575080602001515b610ce057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f666565206973206e6f7420617661696c61626c65207965740000000000000000604482015290519081900360640190fd5b805115610d4f573360009081526004602052604090205460ff16610d4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061110c6032913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84811660009081526002602090815260408083208785168452825280832062ffffff8b1684529091529020541615610d9b57600080fd5b604080517ffad5359f00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff8681166024830152858116604483015262ffffff89166064830152600285900b608483015291517f0000000000000000000000005d2cc072d1972f6a81696acbd9bc51b324c45e579092169163fad5359f9160a4808201926020929091908290030181600087803b158015610e5157600080fd5b505af1158015610e65573d6000803e3d6000fd5b505050506040513d6020811015610e7b57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff80861660008181526002602081815260408084208a871680865290835281852062ffffff8f168087529084528286208054988a167fffffffffffffffffffffffff0000000000000000000000000000000000000000998a1681179091558287528585528387208888528552838720828852855295839020805490981686179097558151938a900b8452918301939093528251959a5093947f783cca1c0412dd0d695e784568c96da2e9c22ff989357a2e8b1d9b2b4e6b7118929181900390910190a4505050509392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610fe557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526004602052604090205460ff161515811515141561108057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f7374617465206e6f74206368616e676500000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016851515908117909155825190815291517faec42ac7f1bb8651906ae6522f50a19429e124e8ea678ef59fd27750759288a29281900390910190a2505056fe757365722073686f756c6420626520696e20746865207768697465206c69737420666f722074686973206665652074696572a164736f6c6343000706000a