Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Code
Read Contract
Write Contract
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- PulseFinityPriceDiscovery
- Optimization enabled
- true
- Compiler version
- v0.8.17+commit.8df45f5f
- Optimization runs
- 1000
- EVM Version
- default
- Verified at
- 2023-06-13T16:07:21.868269Z
Constructor Arguments
0x000000000000000000000000051e42052bd1ac8510b9aef638e5e3eb33b04b47000000000000000000000000dae9dd3d1a52cfce9d5f2fac7fde164d500e50f700000000000000000000000000000000000000000000000000000000648896040000000000000000000000000000000000000000000000000000000064889604000000000000000000000000000000000000000000000000000000006488985c000000000000000000000000000000000000000000000000000000006488985c0000000000000000000000000000000000000000000000000000000064889ab40000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a
Arg [0] (address) : 0x051e42052bd1ac8510b9aef638e5e3eb33b04b47
Arg [1] (address) : 0xdae9dd3d1a52cfce9d5f2fac7fde164d500e50f7
Arg [2] (uint256) : 1686672900
Arg [3] (uint256) : 1686672900
Arg [4] (uint256) : 1686673500
Arg [5] (uint256) : 1686673500
Arg [6] (uint256) : 1686674100
Arg [7] (uint256) : 5
Arg [8] (uint256) : 10
contracts/src/PulseFinityPriceDiscovery.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import "../interfaces/IPulseFinityToken.sol";
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
import "../interfaces/IPLXRouter.sol";
contract PulseFinityPriceDiscovery {
mapping(address => uint256) public plfDeposits;
mapping(address => uint256) public plsDeposits;
uint256 public totalSupplyPLF;
uint256 public totalSupplyPLS;
mapping(address => uint256) public unlockedPLF;
mapping(address => uint256) public unlockedPLS;
uint256 public pricePLF;
IPulseFinityToken public plfToken;
IPLXRouter public plxRouter;
uint256 public priceDiscoveryStartTime;
uint256 public priceDiscoveryPhaseTwoStartTime;
uint256 public priceDiscoveryPhaseThreeStartTime;
uint256 public liquidityPhaseStartTime;
uint256 public tradingPhaseStartTime;
bool public liquidityPhaseStarted;
bool public tradingPhaseStarted;
uint256 public priceDiscoveryPhaseTwoWithdrawPenalty;
uint256 public priceDiscoveryPhaseThreeWithdrawPenalty;
event Deposit(address indexed from, uint256 value, address tokenIdentifier);
event Withdraw(address indexed from, uint256 value, address tokenIdentifier);
constructor(
address pulseFinityToken_,
address router_,
uint256 priceDiscoveryStartTime_,
uint256 priceDiscoveryPhaseTwoStartTime_,
uint256 priceDiscoveryPhaseThreeStartTime_,
uint256 liquidityPhaseStartTime_,
uint256 tradingPhaseStartTime_,
uint256 priceDiscoveryPhaseTwoWithdrawPenalty_,
uint256 priceDiscoveryPhaseThreeWithdrawPenalty_
) public {
plfToken = IPulseFinityToken(pulseFinityToken_);
plxRouter = IPLXRouter(router_);
plfDeposits[address(this)] = plfToken.balanceOf(address(this)) / 2;
priceDiscoveryStartTime = priceDiscoveryStartTime_;
priceDiscoveryPhaseTwoStartTime = priceDiscoveryPhaseTwoStartTime_;
priceDiscoveryPhaseThreeStartTime = priceDiscoveryPhaseThreeStartTime_;
liquidityPhaseStartTime = liquidityPhaseStartTime_;
tradingPhaseStartTime = tradingPhaseStartTime_;
priceDiscoveryPhaseTwoWithdrawPenalty = priceDiscoveryPhaseTwoWithdrawPenalty_;
priceDiscoveryPhaseThreeWithdrawPenalty = priceDiscoveryPhaseThreeWithdrawPenalty_;
totalSupplyPLF = plfDeposits[address(this)];
}
function deposit(
uint256 value,
address identifier
) public payable {
require(
block.timestamp >= priceDiscoveryStartTime &&
block.timestamp < priceDiscoveryPhaseThreeStartTime,
"PulseFinityPriceDiscovery: deposit phase is over"
);
require(value > 0);
if (identifier == address(plfToken)) {
plfToken.transferFrom(msg.sender, address(this), value);
plfDeposits[msg.sender] += value;
totalSupplyPLF += value;
} else {
require(msg.value == value);
plsDeposits[msg.sender] += value;
totalSupplyPLS += value;
}
setNewPrice();
emit Deposit(msg.sender, value, identifier);
}
function withdraw(
uint256 value,
address identifier
) public {
require(
block.timestamp < liquidityPhaseStartTime,
"PulseFinityPriceDiscovery: withdraw phase is over"
);
require(value > 0);
uint256 withdrawPenalty = getWithdrawPenalty();
if (identifier == address(plfToken)) {
require(plfDeposits[msg.sender] >= value, "PulseFinityPriceDiscovery: insufficient balance");
uint256 penaltyAmount = (value * withdrawPenalty) / 100;
uint256 withdrawAmount = value - penaltyAmount;
plfDeposits[msg.sender] -= value;
totalSupplyPLF -= withdrawAmount;
setNewPrice();
plfToken.transfer(msg.sender, withdrawAmount);
} else {
require(plsDeposits[msg.sender] >= value, "PulseFinityPriceDiscovery: insufficient balance");
uint256 penaltyAmount = (value * withdrawPenalty) / 100;
uint256 withdrawAmount = value - penaltyAmount;
plsDeposits[msg.sender] -= value;
totalSupplyPLS -= withdrawAmount;
setNewPrice();
payable(msg.sender).transfer(withdrawAmount);
}
emit Withdraw(msg.sender, value, identifier);
}
function addLiquidity(
uint256 plfAmountFromWallet,
uint256 plfAmountLocked,
uint256 plsAmountFromWallet,
uint256 plsAmountLocked
) public payable {
require(
block.timestamp >= liquidityPhaseStartTime &&
block.timestamp < tradingPhaseStartTime,
"PulseFinityPriceDiscovery: add liquidity phase is over"
);
require(liquidityPhaseStarted, "PulseFinityPriceDiscovery: liquidity phase not started");
uint256 totalPlfAmount = plfAmountFromWallet + plfAmountLocked;
uint256 totalPlsAmount = plsAmountFromWallet + plsAmountLocked;
require(totalPlfAmount > 0, "PulseFinityPriceDiscovery: plf amount is zero");
require(totalPlsAmount > 0, "PulseFinityPriceDiscovery: pls amount is zero");
require(totalPlfAmount == totalPlsAmount * pricePLF, "PulseFinityPriceDiscovery: pls amount is not equal ratio to plf amount");
if (plfAmountFromWallet > 0) {
plfToken.transferFrom(msg.sender, address(this), plfAmountFromWallet);
}
if (plsAmountFromWallet > 0) {
require(msg.value == plsAmountFromWallet, "PulseFinityPriceDiscovery: pls amount from wallet is not equal to msg.value");
}
if (plfAmountLocked > 0) {
uint256 lockedPlfBalance = getLockedPLF(msg.sender);
require(lockedPlfBalance >= plfAmountLocked);
unlockedPLF[msg.sender] += plfAmountLocked;
}
if (plsAmountLocked > 0) {
uint256 lockedPlsBalance = getLockedPLS(msg.sender);
require(lockedPlsBalance >= plsAmountLocked, "PulseFinityPriceDiscovery: pls amount locked is greater than locked pls balance");
unlockedPLS[msg.sender] += plsAmountLocked;
}
plfToken.approve(address(plxRouter), totalPlfAmount);
plxRouter.addLiquidityETH{value: totalPlsAmount}(
address(plfToken),
totalPlfAmount,
0,
0,
msg.sender,
block.timestamp
);
}
function claimLockedTokens() public {
require(
block.timestamp >= tradingPhaseStartTime,
"PulseFinityPriceDiscovery: trading phase not started"
);
require(tradingPhaseStarted, "PulseFinityPriceDiscovery: trading phase not started");
uint256 lockedPlfBalance = getLockedPLF(msg.sender);
uint256 lockedPlsBalance = getLockedPLS(msg.sender);
require(lockedPlfBalance > 0 || lockedPlsBalance > 0);
if (lockedPlfBalance > 0) {
unlockedPLF[msg.sender] += lockedPlfBalance;
plfToken.transfer(msg.sender, lockedPlfBalance);
}
if (lockedPlsBalance > 0) {
unlockedPLS[msg.sender] += lockedPlsBalance;
payable(msg.sender).transfer(lockedPlsBalance);
}
}
function nextStage() public {
if (block.timestamp >= liquidityPhaseStartTime && block.timestamp < tradingPhaseStartTime) {
require(!liquidityPhaseStarted, "PulseFinityPriceDiscovery: liquidity phase already started");
uint256 contractLockedPLS = getLockedPLS(address(this));
uint256 contractLiquidityPLF = plfDeposits[address(this)];
unlockedPLS[address(this)] += contractLockedPLS;
plfToken.approve(address(plxRouter), contractLiquidityPLF);
plxRouter.addLiquidityETH{value: contractLockedPLS}(
address(plfToken),
contractLiquidityPLF,
0,
0,
address(this),
block.timestamp
);
liquidityPhaseStarted = true;
}
if (block.timestamp >= tradingPhaseStartTime) {
require(!tradingPhaseStarted, "PulseFinityPriceDiscovery: trading phase already started");
plfToken.enableTrading();
tradingPhaseStarted = true;
}
}
function setNewPrice() internal {
if (totalSupplyPLS > 0) {
pricePLF = totalSupplyPLF / totalSupplyPLS;
} else {
pricePLF = 0;
}
}
function getLockedPLF(address user) public view returns (uint256) {
if (block.timestamp < liquidityPhaseStartTime) {
return 0;
}
uint256 plsDeposit = plsDeposits[user];
uint256 lockedPlf = plsDeposit * pricePLF;
return lockedPlf - unlockedPLF[user];
}
function getLockedPLS(address user) public view returns (uint256) {
if (block.timestamp < liquidityPhaseStartTime) {
return 0;
}
uint256 plfDeposit = plfDeposits[user];
uint256 lockedPls = plfDeposit / pricePLF;
return lockedPls - unlockedPLS[user];
}
function getWithdrawPenalty() public view returns (uint256) {
if (block.timestamp < priceDiscoveryPhaseTwoStartTime) {
return 0;
} else if (block.timestamp < priceDiscoveryPhaseThreeStartTime) {
uint256 timePassed = block.timestamp - priceDiscoveryPhaseTwoStartTime;
uint256 timeTotal = priceDiscoveryPhaseThreeStartTime - priceDiscoveryPhaseTwoStartTime;
return 1 + priceDiscoveryPhaseTwoWithdrawPenalty * timePassed / timeTotal;
} else {
return priceDiscoveryPhaseThreeWithdrawPenalty;
}
}
receive() external payable {}
}
@openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router01.sol
pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol
pragma solidity >=0.6.2;
import './IUniswapV2Router01.sol';
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
contracts/interfaces/IPLXRouter.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
import "@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol";
/// @dev Override the default uniswap router interface with the PulseX router interface
interface IPLXRouter is IUniswapV2Router02 {
function WPLS() external view returns (address);
}
contracts/interfaces/IPulseFinityToken.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IPulseFinityToken is IERC20 {
function burn(uint256 amount) external;
function maxSupply() external view returns (uint256);
function enableTrading() external;
function dexPair() external view returns (address);
}
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":1000,"enabled":true},"metadata":{"useLiteralContent":true},"libraries":{}}
Contract ABI
[{"type":"constructor","inputs":[{"type":"address","name":"pulseFinityToken_","internalType":"address"},{"type":"address","name":"router_","internalType":"address"},{"type":"uint256","name":"priceDiscoveryStartTime_","internalType":"uint256"},{"type":"uint256","name":"priceDiscoveryPhaseTwoStartTime_","internalType":"uint256"},{"type":"uint256","name":"priceDiscoveryPhaseThreeStartTime_","internalType":"uint256"},{"type":"uint256","name":"liquidityPhaseStartTime_","internalType":"uint256"},{"type":"uint256","name":"tradingPhaseStartTime_","internalType":"uint256"},{"type":"uint256","name":"priceDiscoveryPhaseTwoWithdrawPenalty_","internalType":"uint256"},{"type":"uint256","name":"priceDiscoveryPhaseThreeWithdrawPenalty_","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"addLiquidity","inputs":[{"type":"uint256","name":"plfAmountFromWallet","internalType":"uint256"},{"type":"uint256","name":"plfAmountLocked","internalType":"uint256"},{"type":"uint256","name":"plsAmountFromWallet","internalType":"uint256"},{"type":"uint256","name":"plsAmountLocked","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimLockedTokens","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"deposit","inputs":[{"type":"uint256","name":"value","internalType":"uint256"},{"type":"address","name":"identifier","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLockedPLF","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getLockedPLS","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getWithdrawPenalty","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityPhaseStartTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"liquidityPhaseStarted","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"nextStage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"plfDeposits","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPulseFinityToken"}],"name":"plfToken","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"plsDeposits","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPLXRouter"}],"name":"plxRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"priceDiscoveryPhaseThreeStartTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"priceDiscoveryPhaseThreeWithdrawPenalty","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"priceDiscoveryPhaseTwoStartTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"priceDiscoveryPhaseTwoWithdrawPenalty","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"priceDiscoveryStartTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pricePLF","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupplyPLF","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupplyPLS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"tradingPhaseStartTime","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"tradingPhaseStarted","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"unlockedPLF","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"unlockedPLS","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"value","internalType":"uint256"},{"type":"address","name":"identifier","internalType":"address"}]},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"from","indexed":true},{"type":"uint256","name":"value","indexed":false},{"type":"address","name":"tokenIdentifier","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"from","indexed":true},{"type":"uint256","name":"value","indexed":false},{"type":"address","name":"tokenIdentifier","indexed":false}],"anonymous":false},{"type":"receive"}]
Contract Creation Code
0x60806040523480156200001157600080fd5b5060405162001a3f38038062001a3f83398101604081905262000034916200012f565b600780546001600160a01b038b81166001600160a01b0319928316811790935560088054918c16919092161790556040516370a0823160e01b8152306004820152600291906370a0823190602401602060405180830381865afa158015620000a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c69190620001ab565b620000d29190620001c5565b306000908152602081905260409020908155600997909755600a95909555600b93909355600c91909155600d55600f556010555460025550620001e89050565b80516001600160a01b03811681146200012a57600080fd5b919050565b60008060008060008060008060006101208a8c0312156200014f57600080fd5b6200015a8a62000112565b98506200016a60208b0162000112565b975060408a0151965060608a0151955060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a015190509295985092959850929598565b600060208284031215620001be57600080fd5b5051919050565b600082620001e357634e487b7160e01b600052601260045260246000fd5b500490565b61184780620001f86000396000f3fe6080604052600436106101a45760003560e01c80637566fa1e116100e1578063b4fb3e3d1161008a578063d6d4077811610064578063d6d4077814610456578063e3ed1e8914610476578063e61419ff14610490578063ee3743ab146104a657600080fd5b8063b4fb3e3d146103fd578063c84cb6cb1461042a578063cc7624181461044057600080fd5b8063997aba1a116100bb578063997aba1a146103be578063aebf3e41146103d4578063b355419f146103e757600080fd5b80637566fa1e1461037d57806390a4907f14610392578063910f3248146103a857600080fd5b80633ca063161161014e5780635504f8e3116101285780635504f8e314610311578063639e3a941461033e57806365723048146103545780636e553f651461036a57600080fd5b80633ca06316146102a15780633d9698fe146102ce57806343ac2ff3146102fb57600080fd5b806327aae8dc1161017f57806327aae8dc1461023d578063377be80a1461025d5780633b9c7ac21461028c57600080fd5b8062f714ce146101b057806315d293fa146101d25780631c193e9e1461020557600080fd5b366101ab57005b600080fd5b3480156101bc57600080fd5b506101d06101cb3660046116c6565b6104bb565b005b3480156101de57600080fd5b506101f26101ed3660046116f2565b610849565b6040519081526020015b60405180910390f35b34801561021157600080fd5b50600754610225906001600160a01b031681565b6040516001600160a01b0390911681526020016101fc565b34801561024957600080fd5b506101f26102583660046116f2565b6108b4565b34801561026957600080fd5b50600e5461027c90610100900460ff1681565b60405190151581526020016101fc565b34801561029857600080fd5b506101d0610917565b3480156102ad57600080fd5b506101f26102bc3660046116f2565b60006020819052908152604090205481565b3480156102da57600080fd5b506101f26102e93660046116f2565b60056020526000908152604090205481565b34801561030757600080fd5b506101f260025481565b34801561031d57600080fd5b506101f261032c3660046116f2565b60016020526000908152604090205481565b34801561034a57600080fd5b506101f2600d5481565b34801561036057600080fd5b506101f260035481565b6101d06103783660046116c6565b610b3c565b34801561038957600080fd5b506101f2610d3c565b34801561039e57600080fd5b506101f2600a5481565b3480156103b457600080fd5b506101f260065481565b3480156103ca57600080fd5b506101f260095481565b6101d06103e2366004611714565b610db0565b3480156103f357600080fd5b506101f2600b5481565b34801561040957600080fd5b506101f26104183660046116f2565b60046020526000908152604090205481565b34801561043657600080fd5b506101f2600c5481565b34801561044c57600080fd5b506101f2600f5481565b34801561046257600080fd5b50600854610225906001600160a01b031681565b34801561048257600080fd5b50600e5461027c9060ff1681565b34801561049c57600080fd5b506101f260105481565b3480156104b257600080fd5b506101d0611395565b600c5442106105375760405162461bcd60e51b815260206004820152603160248201527f50756c736546696e6974795072696365446973636f766572793a20776974686460448201527f726177207068617365206973206f76657200000000000000000000000000000060648201526084015b60405180910390fd5b6000821161054457600080fd5b600061054e610d3c565b6007549091506001600160a01b03908116908316036106da57336000908152602081905260409020548311156105ec5760405162461bcd60e51b815260206004820152602f60248201527f50756c736546696e6974795072696365446973636f766572793a20696e73756660448201527f66696369656e742062616c616e63650000000000000000000000000000000000606482015260840161052e565b600060646105fa838661175c565b6106049190611779565b90506000610612828661179b565b3360009081526020819052604081208054929350879290919061063690849061179b565b92505081905550806002600082825461064f919061179b565b9091555061065d9050611686565b60075460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156106ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d291906117ae565b505050610801565b3360009081526001602052604090205483111561075f5760405162461bcd60e51b815260206004820152602f60248201527f50756c736546696e6974795072696365446973636f766572793a20696e73756660448201527f66696369656e742062616c616e63650000000000000000000000000000000000606482015260840161052e565b6000606461076d838661175c565b6107779190611779565b90506000610785828661179b565b336000908152600160205260408120805492935087929091906107a990849061179b565b9250508190555080600360008282546107c2919061179b565b909155506107d09050611686565b604051339082156108fc029083906000818181858888f193505050501580156107fd573d6000803e3d6000fd5b5050505b604080518481526001600160a01b038416602082015233917f56c54ba9bd38d8fd62012e42c7ee564519b09763c426d331b3661b537ead19b2910160405180910390a2505050565b6000600c5442101561085d57506000919050565b6001600160a01b0382166000908152602081905260408120546006549091906108869083611779565b6001600160a01b0385166000908152600560205260409020549091506108ac908261179b565b949350505050565b6000600c544210156108c857506000919050565b6001600160a01b0382166000908152600160205260408120546006549091906108f1908361175c565b6001600160a01b0385166000908152600460205260409020549091506108ac908261179b565b600d5442101561098f5760405162461bcd60e51b815260206004820152603460248201527f50756c736546696e6974795072696365446973636f766572793a20747261646960448201527f6e67207068617365206e6f742073746172746564000000000000000000000000606482015260840161052e565b600e54610100900460ff16610a0c5760405162461bcd60e51b815260206004820152603460248201527f50756c736546696e6974795072696365446973636f766572793a20747261646960448201527f6e67207068617365206e6f742073746172746564000000000000000000000000606482015260840161052e565b6000610a17336108b4565b90506000610a2433610849565b90506000821180610a355750600081115b610a3e57600080fd5b8115610adf573360009081526004602052604081208054849290610a639084906117d0565b909155505060075460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610ab9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610add91906117ae565b505b8015610b38573360009081526005602052604081208054839290610b049084906117d0565b9091555050604051339082156108fc029083906000818181858888f19350505050158015610b36573d6000803e3d6000fd5b505b5050565b6009544210158015610b4f5750600b5442105b610bc15760405162461bcd60e51b815260206004820152603060248201527f50756c736546696e6974795072696365446973636f766572793a206465706f7360448201527f6974207068617365206973206f76657200000000000000000000000000000000606482015260840161052e565b60008211610bce57600080fd5b6007546001600160a01b0390811690821603610ca3576007546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610c3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5f91906117ae565b503360009081526020819052604081208054849290610c7f9084906117d0565b925050819055508160026000828254610c9891906117d0565b90915550610ced9050565b813414610caf57600080fd5b3360009081526001602052604081208054849290610cce9084906117d0565b925050819055508160036000828254610ce791906117d0565b90915550505b610cf5611686565b604080518381526001600160a01b038316602082015233917fe31c7b8d08ee7db0afa68782e1028ef92305caeea8626633ad44d413e30f6b2f910160405180910390a25050565b6000600a54421015610d4e5750600090565b600b54421015610da9576000600a5442610d68919061179b565b90506000600a54600b54610d7c919061179b565b90508082600f54610d8d919061175c565b610d979190611779565b610da29060016117d0565b9250505090565b5060105490565b600c544210158015610dc35750600d5442105b610e355760405162461bcd60e51b815260206004820152603660248201527f50756c736546696e6974795072696365446973636f766572793a20616464206c60448201527f6971756964697479207068617365206973206f76657200000000000000000000606482015260840161052e565b600e5460ff16610ead5760405162461bcd60e51b815260206004820152603660248201527f50756c736546696e6974795072696365446973636f766572793a206c6971756960448201527f64697479207068617365206e6f74207374617274656400000000000000000000606482015260840161052e565b6000610eb984866117d0565b90506000610ec783856117d0565b905060008211610f2f5760405162461bcd60e51b815260206004820152602d60248201527f50756c736546696e6974795072696365446973636f766572793a20706c66206160448201526c6d6f756e74206973207a65726f60981b606482015260840161052e565b60008111610f955760405162461bcd60e51b815260206004820152602d60248201527f50756c736546696e6974795072696365446973636f766572793a20706c73206160448201526c6d6f756e74206973207a65726f60981b606482015260840161052e565b600654610fa2908261175c565b821461103c5760405162461bcd60e51b815260206004820152604660248201527f50756c736546696e6974795072696365446973636f766572793a20706c73206160448201527f6d6f756e74206973206e6f7420657175616c20726174696f20746f20706c662060648201527f616d6f756e740000000000000000000000000000000000000000000000000000608482015260a40161052e565b85156110bf576007546040516323b872dd60e01b8152336004820152306024820152604481018890526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bd91906117ae565b505b8315611160578334146111605760405162461bcd60e51b815260206004820152604b60248201527f50756c736546696e6974795072696365446973636f766572793a20706c73206160448201527f6d6f756e742066726f6d2077616c6c6574206973206e6f7420657175616c207460648201527f6f206d73672e76616c7565000000000000000000000000000000000000000000608482015260a40161052e565b84156111a6576000611171336108b4565b90508581101561118057600080fd5b336000908152600460205260408120805488929061119f9084906117d0565b9091555050505b821561127b5760006111b733610849565b9050838110156112555760405162461bcd60e51b815260206004820152604f60248201527f50756c736546696e6974795072696365446973636f766572793a20706c73206160448201527f6d6f756e74206c6f636b65642069732067726561746572207468616e206c6f6360648201527f6b656420706c732062616c616e63650000000000000000000000000000000000608482015260a40161052e565b33600090815260056020526040812080548692906112749084906117d0565b9091555050505b60075460085460405163095ea7b360e01b81526001600160a01b0391821660048201526024810185905291169063095ea7b3906044016020604051808303816000875af11580156112d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f491906117ae565b5060085460075460405163f305d71960e01b81526001600160a01b0391821660048201526024810185905260006044820181905260648201523360848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015611365573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061138a91906117e3565b505050505050505050565b600c5442101580156113a85750600d5442105b1561158557600e5460ff16156114265760405162461bcd60e51b815260206004820152603a60248201527f50756c736546696e6974795072696365446973636f766572793a206c6971756960448201527f6469747920706861736520616c72656164792073746172746564000000000000606482015260840161052e565b600061143130610849565b3060009081526020818152604080832054600590925282208054939450909284929061145e9084906117d0565b909155505060075460085460405163095ea7b360e01b81526001600160a01b0391821660048201526024810184905291169063095ea7b3906044016020604051808303816000875af11580156114b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114dc91906117ae565b5060085460075460405163f305d71960e01b81526001600160a01b0391821660048201526024810184905260006044820181905260648201523060848201524260a482015291169063f305d71990849060c40160606040518083038185885af115801561154d573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061157291906117e3565b5050600e805460ff191660011790555050505b600d54421061168457600e54610100900460ff161561160c5760405162461bcd60e51b815260206004820152603860248201527f50756c736546696e6974795072696365446973636f766572793a20747261646960448201527f6e6720706861736520616c726561647920737461727465640000000000000000606482015260840161052e565b600760009054906101000a90046001600160a01b03166001600160a01b0316638a8c523c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561165c57600080fd5b505af1158015611670573d6000803e3d6000fd5b5050600e805461ff00191661010017905550505b565b600354156116a35760035460025461169e9190611779565b600655565b6000600655565b80356001600160a01b03811681146116c157600080fd5b919050565b600080604083850312156116d957600080fd5b823591506116e9602084016116aa565b90509250929050565b60006020828403121561170457600080fd5b61170d826116aa565b9392505050565b6000806000806080858703121561172a57600080fd5b5050823594602084013594506040840135936060013592509050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761177357611773611746565b92915050565b60008261179657634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561177357611773611746565b6000602082840312156117c057600080fd5b8151801515811461170d57600080fd5b8082018082111561177357611773611746565b6000806000606084860312156117f857600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220a92f23882ff31b43a4467b326e4468cfc9567b97b8ffa26694aa1c3e02c9df3f64736f6c63430008110033000000000000000000000000051e42052bd1ac8510b9aef638e5e3eb33b04b47000000000000000000000000dae9dd3d1a52cfce9d5f2fac7fde164d500e50f700000000000000000000000000000000000000000000000000000000648896040000000000000000000000000000000000000000000000000000000064889604000000000000000000000000000000000000000000000000000000006488985c000000000000000000000000000000000000000000000000000000006488985c0000000000000000000000000000000000000000000000000000000064889ab40000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000a
Deployed ByteCode
0x6080604052600436106101a45760003560e01c80637566fa1e116100e1578063b4fb3e3d1161008a578063d6d4077811610064578063d6d4077814610456578063e3ed1e8914610476578063e61419ff14610490578063ee3743ab146104a657600080fd5b8063b4fb3e3d146103fd578063c84cb6cb1461042a578063cc7624181461044057600080fd5b8063997aba1a116100bb578063997aba1a146103be578063aebf3e41146103d4578063b355419f146103e757600080fd5b80637566fa1e1461037d57806390a4907f14610392578063910f3248146103a857600080fd5b80633ca063161161014e5780635504f8e3116101285780635504f8e314610311578063639e3a941461033e57806365723048146103545780636e553f651461036a57600080fd5b80633ca06316146102a15780633d9698fe146102ce57806343ac2ff3146102fb57600080fd5b806327aae8dc1161017f57806327aae8dc1461023d578063377be80a1461025d5780633b9c7ac21461028c57600080fd5b8062f714ce146101b057806315d293fa146101d25780631c193e9e1461020557600080fd5b366101ab57005b600080fd5b3480156101bc57600080fd5b506101d06101cb3660046116c6565b6104bb565b005b3480156101de57600080fd5b506101f26101ed3660046116f2565b610849565b6040519081526020015b60405180910390f35b34801561021157600080fd5b50600754610225906001600160a01b031681565b6040516001600160a01b0390911681526020016101fc565b34801561024957600080fd5b506101f26102583660046116f2565b6108b4565b34801561026957600080fd5b50600e5461027c90610100900460ff1681565b60405190151581526020016101fc565b34801561029857600080fd5b506101d0610917565b3480156102ad57600080fd5b506101f26102bc3660046116f2565b60006020819052908152604090205481565b3480156102da57600080fd5b506101f26102e93660046116f2565b60056020526000908152604090205481565b34801561030757600080fd5b506101f260025481565b34801561031d57600080fd5b506101f261032c3660046116f2565b60016020526000908152604090205481565b34801561034a57600080fd5b506101f2600d5481565b34801561036057600080fd5b506101f260035481565b6101d06103783660046116c6565b610b3c565b34801561038957600080fd5b506101f2610d3c565b34801561039e57600080fd5b506101f2600a5481565b3480156103b457600080fd5b506101f260065481565b3480156103ca57600080fd5b506101f260095481565b6101d06103e2366004611714565b610db0565b3480156103f357600080fd5b506101f2600b5481565b34801561040957600080fd5b506101f26104183660046116f2565b60046020526000908152604090205481565b34801561043657600080fd5b506101f2600c5481565b34801561044c57600080fd5b506101f2600f5481565b34801561046257600080fd5b50600854610225906001600160a01b031681565b34801561048257600080fd5b50600e5461027c9060ff1681565b34801561049c57600080fd5b506101f260105481565b3480156104b257600080fd5b506101d0611395565b600c5442106105375760405162461bcd60e51b815260206004820152603160248201527f50756c736546696e6974795072696365446973636f766572793a20776974686460448201527f726177207068617365206973206f76657200000000000000000000000000000060648201526084015b60405180910390fd5b6000821161054457600080fd5b600061054e610d3c565b6007549091506001600160a01b03908116908316036106da57336000908152602081905260409020548311156105ec5760405162461bcd60e51b815260206004820152602f60248201527f50756c736546696e6974795072696365446973636f766572793a20696e73756660448201527f66696369656e742062616c616e63650000000000000000000000000000000000606482015260840161052e565b600060646105fa838661175c565b6106049190611779565b90506000610612828661179b565b3360009081526020819052604081208054929350879290919061063690849061179b565b92505081905550806002600082825461064f919061179b565b9091555061065d9050611686565b60075460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156106ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d291906117ae565b505050610801565b3360009081526001602052604090205483111561075f5760405162461bcd60e51b815260206004820152602f60248201527f50756c736546696e6974795072696365446973636f766572793a20696e73756660448201527f66696369656e742062616c616e63650000000000000000000000000000000000606482015260840161052e565b6000606461076d838661175c565b6107779190611779565b90506000610785828661179b565b336000908152600160205260408120805492935087929091906107a990849061179b565b9250508190555080600360008282546107c2919061179b565b909155506107d09050611686565b604051339082156108fc029083906000818181858888f193505050501580156107fd573d6000803e3d6000fd5b5050505b604080518481526001600160a01b038416602082015233917f56c54ba9bd38d8fd62012e42c7ee564519b09763c426d331b3661b537ead19b2910160405180910390a2505050565b6000600c5442101561085d57506000919050565b6001600160a01b0382166000908152602081905260408120546006549091906108869083611779565b6001600160a01b0385166000908152600560205260409020549091506108ac908261179b565b949350505050565b6000600c544210156108c857506000919050565b6001600160a01b0382166000908152600160205260408120546006549091906108f1908361175c565b6001600160a01b0385166000908152600460205260409020549091506108ac908261179b565b600d5442101561098f5760405162461bcd60e51b815260206004820152603460248201527f50756c736546696e6974795072696365446973636f766572793a20747261646960448201527f6e67207068617365206e6f742073746172746564000000000000000000000000606482015260840161052e565b600e54610100900460ff16610a0c5760405162461bcd60e51b815260206004820152603460248201527f50756c736546696e6974795072696365446973636f766572793a20747261646960448201527f6e67207068617365206e6f742073746172746564000000000000000000000000606482015260840161052e565b6000610a17336108b4565b90506000610a2433610849565b90506000821180610a355750600081115b610a3e57600080fd5b8115610adf573360009081526004602052604081208054849290610a639084906117d0565b909155505060075460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610ab9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610add91906117ae565b505b8015610b38573360009081526005602052604081208054839290610b049084906117d0565b9091555050604051339082156108fc029083906000818181858888f19350505050158015610b36573d6000803e3d6000fd5b505b5050565b6009544210158015610b4f5750600b5442105b610bc15760405162461bcd60e51b815260206004820152603060248201527f50756c736546696e6974795072696365446973636f766572793a206465706f7360448201527f6974207068617365206973206f76657200000000000000000000000000000000606482015260840161052e565b60008211610bce57600080fd5b6007546001600160a01b0390811690821603610ca3576007546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610c3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5f91906117ae565b503360009081526020819052604081208054849290610c7f9084906117d0565b925050819055508160026000828254610c9891906117d0565b90915550610ced9050565b813414610caf57600080fd5b3360009081526001602052604081208054849290610cce9084906117d0565b925050819055508160036000828254610ce791906117d0565b90915550505b610cf5611686565b604080518381526001600160a01b038316602082015233917fe31c7b8d08ee7db0afa68782e1028ef92305caeea8626633ad44d413e30f6b2f910160405180910390a25050565b6000600a54421015610d4e5750600090565b600b54421015610da9576000600a5442610d68919061179b565b90506000600a54600b54610d7c919061179b565b90508082600f54610d8d919061175c565b610d979190611779565b610da29060016117d0565b9250505090565b5060105490565b600c544210158015610dc35750600d5442105b610e355760405162461bcd60e51b815260206004820152603660248201527f50756c736546696e6974795072696365446973636f766572793a20616464206c60448201527f6971756964697479207068617365206973206f76657200000000000000000000606482015260840161052e565b600e5460ff16610ead5760405162461bcd60e51b815260206004820152603660248201527f50756c736546696e6974795072696365446973636f766572793a206c6971756960448201527f64697479207068617365206e6f74207374617274656400000000000000000000606482015260840161052e565b6000610eb984866117d0565b90506000610ec783856117d0565b905060008211610f2f5760405162461bcd60e51b815260206004820152602d60248201527f50756c736546696e6974795072696365446973636f766572793a20706c66206160448201526c6d6f756e74206973207a65726f60981b606482015260840161052e565b60008111610f955760405162461bcd60e51b815260206004820152602d60248201527f50756c736546696e6974795072696365446973636f766572793a20706c73206160448201526c6d6f756e74206973207a65726f60981b606482015260840161052e565b600654610fa2908261175c565b821461103c5760405162461bcd60e51b815260206004820152604660248201527f50756c736546696e6974795072696365446973636f766572793a20706c73206160448201527f6d6f756e74206973206e6f7420657175616c20726174696f20746f20706c662060648201527f616d6f756e740000000000000000000000000000000000000000000000000000608482015260a40161052e565b85156110bf576007546040516323b872dd60e01b8152336004820152306024820152604481018890526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611099573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110bd91906117ae565b505b8315611160578334146111605760405162461bcd60e51b815260206004820152604b60248201527f50756c736546696e6974795072696365446973636f766572793a20706c73206160448201527f6d6f756e742066726f6d2077616c6c6574206973206e6f7420657175616c207460648201527f6f206d73672e76616c7565000000000000000000000000000000000000000000608482015260a40161052e565b84156111a6576000611171336108b4565b90508581101561118057600080fd5b336000908152600460205260408120805488929061119f9084906117d0565b9091555050505b821561127b5760006111b733610849565b9050838110156112555760405162461bcd60e51b815260206004820152604f60248201527f50756c736546696e6974795072696365446973636f766572793a20706c73206160448201527f6d6f756e74206c6f636b65642069732067726561746572207468616e206c6f6360648201527f6b656420706c732062616c616e63650000000000000000000000000000000000608482015260a40161052e565b33600090815260056020526040812080548692906112749084906117d0565b9091555050505b60075460085460405163095ea7b360e01b81526001600160a01b0391821660048201526024810185905291169063095ea7b3906044016020604051808303816000875af11580156112d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f491906117ae565b5060085460075460405163f305d71960e01b81526001600160a01b0391821660048201526024810185905260006044820181905260648201523360848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015611365573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061138a91906117e3565b505050505050505050565b600c5442101580156113a85750600d5442105b1561158557600e5460ff16156114265760405162461bcd60e51b815260206004820152603a60248201527f50756c736546696e6974795072696365446973636f766572793a206c6971756960448201527f6469747920706861736520616c72656164792073746172746564000000000000606482015260840161052e565b600061143130610849565b3060009081526020818152604080832054600590925282208054939450909284929061145e9084906117d0565b909155505060075460085460405163095ea7b360e01b81526001600160a01b0391821660048201526024810184905291169063095ea7b3906044016020604051808303816000875af11580156114b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114dc91906117ae565b5060085460075460405163f305d71960e01b81526001600160a01b0391821660048201526024810184905260006044820181905260648201523060848201524260a482015291169063f305d71990849060c40160606040518083038185885af115801561154d573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061157291906117e3565b5050600e805460ff191660011790555050505b600d54421061168457600e54610100900460ff161561160c5760405162461bcd60e51b815260206004820152603860248201527f50756c736546696e6974795072696365446973636f766572793a20747261646960448201527f6e6720706861736520616c726561647920737461727465640000000000000000606482015260840161052e565b600760009054906101000a90046001600160a01b03166001600160a01b0316638a8c523c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561165c57600080fd5b505af1158015611670573d6000803e3d6000fd5b5050600e805461ff00191661010017905550505b565b600354156116a35760035460025461169e9190611779565b600655565b6000600655565b80356001600160a01b03811681146116c157600080fd5b919050565b600080604083850312156116d957600080fd5b823591506116e9602084016116aa565b90509250929050565b60006020828403121561170457600080fd5b61170d826116aa565b9392505050565b6000806000806080858703121561172a57600080fd5b5050823594602084013594506040840135936060013592509050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761177357611773611746565b92915050565b60008261179657634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561177357611773611746565b6000602082840312156117c057600080fd5b8151801515811461170d57600080fd5b8082018082111561177357611773611746565b6000806000606084860312156117f857600080fd5b835192506020840151915060408401519050925092509256fea2646970667358221220a92f23882ff31b43a4467b326e4468cfc9567b97b8ffa26694aa1c3e02c9df3f64736f6c63430008110033