Transactions
Token Transfers
Tokens
Internal Transactions
Coin Balance History
Logs
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.
This contract has been partially verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- NeonLiquidityAdder
- Optimization enabled
- true
- Compiler version
- v0.8.31+commit.fd3a2265
- Optimization runs
- 1
- EVM Version
- shanghai
- Verified at
- 2026-03-24T11:13:46.274928Z
Constructor Arguments
000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27000000000000000000000000f2da3942616880e52e841e5c504b5a9fba23fff0000000000000000000000000f6f8db0aba00007681f8faf16a0fda1c9b030b11000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d9
Arg [0] (address) : 0xa1077a294dde1b09bb078844df40758a5d0f9a27
Arg [1] (address) : 0xf2da3942616880e52e841e5c504b5a9fba23fff0
Arg [2] (address) : 0xf6f8db0aba00007681f8faf16a0fda1c9b030b11
Arg [3] (address) : 0x165c3410fc91ef562c50559f7d2289febed552d9
contracts/Tokens/NeonLiquidityAdder.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IERC20_NLA {
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
}
interface IWPLS_NLA {
function deposit() external payable;
function balanceOf(address account) external view returns (uint256);
}
interface IPulseXRouter {
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
) external returns (uint256 amountA, uint256 amountB, uint256 liquidity);
function factory() external view returns (address);
}
interface IPulseXFactory {
function getPair(address tokenA, address tokenB) external view returns (address);
}
/**
* @title NeonLiquidityAdder
* @notice Receives PLS from token tax processing. Every Nth deposit auto-triggers
* LP addition to a single configurable pair on PulseX V2.
* Owner can change the pair, trigger frequency, and withdraw anything.
*/
contract NeonLiquidityAdder {
address public owner;
address public immutable WPLS;
address public immutable router;
/// @notice The two tokens of the LP pair to add liquidity to
address public tokenA;
address public tokenB;
/// @notice How many PLS receives before auto-processing
uint256 public processEveryN = 10;
/// @notice Current receive counter
uint256 public receiveCount;
/// @notice Minimum WPLS balance required to process
uint256 public minProcessAmount = 1 ether;
event LiquidityAdded(address indexed pair, uint256 lpAmount);
event AutoProcessTriggered(uint256 wplsAmount);
event PairUpdated(address tokenA, address tokenB);
event ProcessEveryNUpdated(uint256 newN);
event MinProcessAmountUpdated(uint256 newMin);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_;
}
constructor(
address _wpls,
address _tokenA,
address _tokenB,
address _router
) {
require(_wpls != address(0) && _tokenA != address(0) && _tokenB != address(0) && _router != address(0), "Zero address");
owner = msg.sender;
WPLS = _wpls;
router = _router;
tokenA = _tokenA;
tokenB = _tokenB;
IERC20_NLA(_wpls).approve(_router, type(uint256).max);
IERC20_NLA(_tokenA).approve(_router, type(uint256).max);
IERC20_NLA(_tokenB).approve(_router, type(uint256).max);
}
// ─── Auto-trigger on receive ─────────────────────────────────────
receive() external payable {
receiveCount++;
if (receiveCount >= processEveryN) {
receiveCount = 0;
_tryProcess();
}
}
// ─── Core ────────────────────────────────────────────────────────
/// @notice Manual trigger — anyone can call
function processLiquidity() external {
_wrapPLS();
uint256 wplsBal = IWPLS_NLA(WPLS).balanceOf(address(this));
require(wplsBal >= minProcessAmount, "Below min");
_addLiquidity(wplsBal);
}
// ─── Internal ────────────────────────────────────────────────────
function _tryProcess() internal {
_wrapPLS();
uint256 wplsBal = IWPLS_NLA(WPLS).balanceOf(address(this));
if (wplsBal < minProcessAmount) return;
emit AutoProcessTriggered(wplsBal);
_addLiquidity(wplsBal);
}
function _wrapPLS() internal {
uint256 plsBal = address(this).balance;
if (plsBal > 0) {
IWPLS_NLA(WPLS).deposit{value: plsBal}();
}
}
/**
* @dev Swap half WPLS → tokenA (if != WPLS), swap half WPLS → tokenB (if != WPLS),
* then addLiquidity(tokenA, tokenB). LP tokens stay in contract.
*/
function _addLiquidity(uint256 wplsAmount) internal {
uint256 half = wplsAmount / 2;
if (half == 0) return;
address _tokenA = tokenA;
address _tokenB = tokenB;
uint256 amountA;
uint256 amountB;
// Get tokenA
if (_tokenA == WPLS) {
amountA = half;
} else {
uint256 before = IERC20_NLA(_tokenA).balanceOf(address(this));
address[] memory path = new address[](2);
path[0] = WPLS;
path[1] = _tokenA;
try IPulseXRouter(router).swapExactTokensForTokensSupportingFeeOnTransferTokens(
half, 0, path, address(this), block.timestamp
) {} catch { return; }
amountA = IERC20_NLA(_tokenA).balanceOf(address(this)) - before;
if (amountA == 0) return;
}
// Get tokenB
uint256 otherHalf = wplsAmount - half;
if (_tokenB == WPLS) {
amountB = otherHalf;
} else {
uint256 before = IERC20_NLA(_tokenB).balanceOf(address(this));
address[] memory path = new address[](2);
path[0] = WPLS;
path[1] = _tokenB;
try IPulseXRouter(router).swapExactTokensForTokensSupportingFeeOnTransferTokens(
otherHalf, 0, path, address(this), block.timestamp
) {} catch { return; }
amountB = IERC20_NLA(_tokenB).balanceOf(address(this)) - before;
if (amountB == 0) return;
}
try IPulseXRouter(router).addLiquidity(
_tokenA, _tokenB, amountA, amountB, 0, 0, address(this), block.timestamp
) returns (uint256, uint256, uint256 liquidity) {
address pair = IPulseXFactory(IPulseXRouter(router).factory()).getPair(_tokenA, _tokenB);
emit LiquidityAdded(pair, liquidity);
} catch {}
}
// ─── Owner Controls ──────────────────────────────────────────────
/// @notice Change the LP pair. Approves router for new tokens.
function setPair(address _tokenA, address _tokenB) external onlyOwner {
require(_tokenA != address(0) && _tokenB != address(0), "Zero address");
tokenA = _tokenA;
tokenB = _tokenB;
if (_tokenA != WPLS) {
IERC20_NLA(_tokenA).approve(router, type(uint256).max);
}
if (_tokenB != WPLS) {
IERC20_NLA(_tokenB).approve(router, type(uint256).max);
}
emit PairUpdated(_tokenA, _tokenB);
}
function setProcessEveryN(uint256 _n) external onlyOwner {
require(_n > 0, "Must be > 0");
processEveryN = _n;
emit ProcessEveryNUpdated(_n);
}
function setMinProcessAmount(uint256 _min) external onlyOwner {
minProcessAmount = _min;
emit MinProcessAmountUpdated(_min);
}
function withdrawToken(address token, uint256 amount) external onlyOwner {
require(token != address(0), "Zero address");
IERC20_NLA(token).transfer(owner, amount);
}
function withdrawPLS(uint256 amount) external onlyOwner {
(bool ok, ) = owner.call{value: amount}("");
require(ok, "Transfer failed");
}
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0), "Zero address");
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
Compiler Settings
{"viaIR":true,"remappings":[":@1inch/solidity-utils/=lib/solidity-utils/",":@chainlink/=lib/foundry-chainlink-toolkit/",":@chainlink/contracts/=lib/foundry-chainlink-toolkit/lib/chainlink-brownie-contracts/contracts/src/",":@forge-std/=lib/forge-std/src/",":@gearbox-protocol/core-v2/=lib/core-v2/",":@gearbox-protocol/core-v3/=lib/core-v3/",":@gearbox-protocol/sdk-gov/=lib/sdk-gov/",":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",":@redstone-finance/=lib/integrations-v3/node_modules/@redstone-finance/",":@uniswap/v2-core/=lib/v2-core/",":@uniswap/v2-periphery/=lib/v2-periphery/",":chainlink-brownie-contracts/=lib/foundry-chainlink-toolkit/lib/chainlink-brownie-contracts/contracts/src/v0.6/vendor/@arbitrum/nitro-contracts/src/",":chainlink/=lib/chainlink/",":core-v2/=lib/core-v2/contracts/",":core-v3/=lib/core-v3/contracts/",":ds-test/=lib/forge-std/lib/ds-test/src/",":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",":forge-std/=lib/forge-std/src/",":foundry-chainlink-toolkit/=lib/foundry-chainlink-toolkit/",":foundry-devops/=lib/foundry-devops/",":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",":integrations-v3/=lib/integrations-v3/",":openzeppelin-contracts copy/=lib/openzeppelin-contracts copy/",":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",":openzeppelin-contracts/=lib/openzeppelin-contracts/",":sdk-gov/=lib/sdk-gov/",":solidity-lib/=lib/solidity-lib/contracts/",":solidity-utils/=lib/solidity-utils/contracts/",":v2-core/=lib/v2-core/contracts/",":v2-periphery/=lib/v2-periphery/contracts/"],"optimizer":{"runs":1,"enabled":true},"metadata":{"bytecodeHash":"none"},"libraries":{},"evmVersion":"shanghai","compilationTarget":{"contracts/Tokens/NeonLiquidityAdder.sol":"NeonLiquidityAdder"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_wpls","internalType":"address"},{"type":"address","name":"_tokenA","internalType":"address"},{"type":"address","name":"_tokenB","internalType":"address"},{"type":"address","name":"_router","internalType":"address"}]},{"type":"event","name":"AutoProcessTriggered","inputs":[{"type":"uint256","name":"wplsAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"LiquidityAdded","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":true},{"type":"uint256","name":"lpAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MinProcessAmountUpdated","inputs":[{"type":"uint256","name":"newMin","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"PairUpdated","inputs":[{"type":"address","name":"tokenA","internalType":"address","indexed":false},{"type":"address","name":"tokenB","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"ProcessEveryNUpdated","inputs":[{"type":"uint256","name":"newN","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WPLS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minProcessAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"processEveryN","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"processLiquidity","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"receiveCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinProcessAmount","inputs":[{"type":"uint256","name":"_min","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPair","inputs":[{"type":"address","name":"_tokenA","internalType":"address"},{"type":"address","name":"_tokenB","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setProcessEveryN","inputs":[{"type":"uint256","name":"_n","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"tokenA","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"tokenB","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawPLS","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdrawToken","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60c080604052346102ba576080816113ad803803809161001f82856102be565b8339810103126102ba57610032816102f5565b9061003f602082016102f5565b906100586060610051604084016102f5565b92016102f5565b600a600355670de0b6b3a76400006005556001600160a01b03841693909190841515806102a8575b80610296575b80610284575b15610250575f8054336001600160a01b031991821617825560809290925260a0849052600180546001600160a01b0396871690841681179091556002805494871694909316841790925560405163095ea7b360e01b815294909316600485018190525f1960248601529491929091602091859160449183915af190811561020f575f93602092610235575b5060446040518095819363095ea7b360e01b8352886004840152811960248401525af1801561020f575f9360209360449261021a575b50604051948593849263095ea7b360e01b84526004840152811960248401525af1801561020f576101e0575b60405161108b908161032282396080518181816101e2015281816103b501528181610677015281816108f401528181610a3c0152610fb7015260a05181818161011f01528181610421015281816104b301528181610a8501528181610ca50152610e4c0152f35b6102019060203d602011610208575b6101f981836102be565b810190610309565b505f610179565b503d6101ef565b6040513d5f823e3d90fd5b61023090853d8711610208576101f981836102be565b61014d565b61024b90833d8511610208576101f981836102be565b610117565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b506001600160a01b038316151561008c565b506001600160a01b0382161515610086565b506001600160a01b0384161515610080565b5f80fd5b601f909101601f19168101906001600160401b038211908210176102e157604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036102ba57565b908160209103126102ba575180151581036102ba579056fe6080806040526004361015610059575b50361561001a575f80fd5b6004545f1981146100455760010180600455600354111561003757005b5f600455610043610f94565b005b634e487b7160e01b5f52601160045260245ffd5b5f3560e01c9081630fc63d10146107e757508063279c4ebf146107255780633923411c146106445780634ccd4097146105b25780635f64b55b1461058a5780637209d3b91461056d5780637ba85592146105505780638da5cb5b1461052957806395c5c5e31461033557806397eac8e8146103185780639e281a9814610269578063d5dcaeee14610211578063ef8ef56f146101cd578063f2fde38b146101525763f887ea401461010a575f61000f565b3461014e575f36600319011261014e576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b5f80fd5b3461014e57602036600319011261014e5761016b61080a565b5f546001600160a01b03811691610183338414610820565b6001600160a01b031691829061019a82151561087b565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36001600160a01b031916175f55005b3461014e575f36600319011261014e576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b3461014e57602036600319011261014e577fb42aeb1dff935605cccca8f17007a26258bcc6bde46312d3aaae9ecbac667484602060043561025c60018060a01b035f54163314610820565b80600555604051908152a1005b3461014e57604036600319011261014e5761028261080a565b5f546001600160a01b03169060209061029c338414610820565b6001600160a01b0316916102b183151561087b565b60405192839163a9059cbb60e01b835260048301526024356024830152815f604482800301925af1801561030d576102e557005b6100439060203d602011610306575b6102fe8183610858565b8101906108b6565b503d6102f4565b6040513d5f823e3d90fd5b3461014e575f36600319011261014e576020600554604051908152f35b3461014e57604036600319011261014e5761034e61080a565b6024356001600160a01b0381169182820361014e5761037760018060a01b035f54163314610820565b6001600160a01b03811680151580610520575b6103939061087b565b600180546001600160a01b0319908116831790915560028054909116851790557f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316908181036104a4575b508303610412575b5f51602061105f5f395f51905f52925061040d604051928392836108ce565b0390a1005b60405163095ea7b360e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660048201525f19602482015292602090849060449082905f905af192831561030d575f51602061105f5f395f51905f5293610485575b506103ee565b61049d9060203d602011610306576102fe8183610858565b508361047f565b60405163095ea7b360e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660048201525f19602482015290602090829060449082905f905af1801561030d57156103e6576105199060203d602011610306576102fe8183610858565b50846103e6565b5083151561038a565b3461014e575f36600319011261014e575f546040516001600160a01b039091168152602090f35b3461014e575f36600319011261014e576020600454604051908152f35b3461014e575f36600319011261014e576020600354604051908152f35b3461014e575f36600319011261014e576002546040516001600160a01b039091168152602090f35b3461014e57602036600319011261014e576004356105da60018060a01b035f54163314610820565b8015610611576020817faece30ec52bb020d80a8b6a0a5688f46722d23cbe2e7d80e1313c42675f2bf6a92600355604051908152a1005b60405162461bcd60e51b815260206004820152600b60248201526a04d757374206265203e20360ac1b6044820152606490fd5b3461014e575f36600319011261014e5761065c6108e8565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561030d575f916106f3575b5060055481106106c25761004390610a19565b60405162461bcd60e51b81526020600482015260096024820152682132b637bb9036b4b760b91b6044820152606490fd5b90506020813d60201161071d575b8161070e60209383610858565b8101031261014e5751816106af565b3d9150610701565b3461014e57602036600319011261014e575f80548190819081906001600160a01b0316610753338214610820565b600435905af13d156107e2573d6001600160401b0381116107ce5760405190610786601f8201601f191660200183610858565b81525f60203d92013e5b1561079757005b60405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b610790565b3461014e575f36600319011261014e576001546001600160a01b03168152602090f35b600435906001600160a01b038216820361014e57565b1561082757565b60405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b6044820152606490fd5b601f909101601f19168101906001600160401b038211908210176107ce57604052565b1561088257565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b9081602091031261014e5751801515810361014e5790565b6001600160a01b0391821681529116602082015260400190565b47806108f2575b50565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561014e575f90600460405180948193630d0e30db60e41b83525af1801561030d576109475750565b5f61095191610858565b565b8051156109605760200190565b634e487b7160e01b5f52603260045260245ffd5b8051600110156109605760400190565b91909493929460a083019083525f602084015260a060408401528151809152602060c084019201905f5b8181106109ce575050506001600160a01b03909416606082015260800152565b82516001600160a01b03168452602093840193909201916001016109ae565b9190820391821161004557565b9081602091031261014e57516001600160a01b038116810361014e5790565b5f8160011c8015610f8f576001546002546001600160a01b0390811692918116917f000000000000000000000000000000000000000000000000000000000000000090911690818303610dee5780610a7191966109ed565b90838103610c475750905b60018060a01b037f000000000000000000000000000000000000000000000000000000000000000016916040519562e8e33760e81b8752826004880152846024880152604487015260648601528360848601528360a48601523060c48601524260e48601526060856101048187865af180958596610c0c575b50610b02575b5050505050565b60206004926040519384809263c45a015560e01b82525afa918215610c015791610b4e93916020938692610be2575b5060405180958194829363e6a4390560e01b8452600484016108ce565b03916001600160a01b03165afa918215610bd6577fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb3120889260209290610ba9575b506040519384526001600160a01b031692a25f80808080610afb565b610bc99150823d8411610bcf575b610bc18183610858565b8101906109fa565b5f610b8d565b503d610bb7565b604051903d90823e3d90fd5b610bfa919250843d8611610bcf57610bc18183610858565b905f610b31565b6040513d86823e3d90fd5b9095506060813d606011610c3f575b81610c2860609383610858565b81010312610c3b5760400151945f610af5565b8480fd5b3d9150610c1b565b6040516370a0823160e01b815230600482015291602083602481885afa928315610de3578693610daf575b5060405191610c82606084610858565b600283526040366020850137610c9783610953565b5284610ca283610974565b527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690813b15610dab57610cfe928792839283604051809781958294635c11d79560e01b84524291309160048601610984565b03925af19182610d96575b5050610d16575050505050565b6040516370a0823160e01b815230600482015290602082602481875afa8015610d8b578590610d57575b610d4a92506109ed565b9081610a7c575050505050565b506020823d602011610d83575b81610d7160209383610858565b8101031261014e57610d4a9151610d40565b3d9150610d64565b6040513d87823e3d90fd5b81610da091610858565b610c3b57845f610d09565b8680fd5b9092506020813d602011610ddb575b81610dcb60209383610858565b8101031261014e5751915f610c72565b3d9150610dbe565b6040513d88823e3d90fd5b946040516370a0823160e01b8152306004820152602081602481875afa90811561030d575f91610f5d575b50604051610e28606082610858565b60028152604036602083013783610e3e82610953565b5284610e4982610974565b527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316803b1561014e57610ea3915f918a83604051809681958294635c11d79560e01b84524291309160048601610984565b03925af19081610f48575b50610ebc5750505050505050565b6040516370a0823160e01b815230600482015290602082602481885afa8015610f3d578790610f09575b610ef092506109ed565b958615610f0057610a71916109ed565b50505050505050565b506020823d602011610f35575b81610f2360209383610858565b8101031261014e57610ef09151610ee6565b3d9150610f16565b6040513d89823e3d90fd5b610f559197505f90610858565b5f955f610eae565b90506020813d602011610f87575b81610f7860209383610858565b8101031261014e57515f610e19565b3d9150610f6b565b505050565b610f9c6108e8565b6040516370a0823160e01b81523060048201526020816024817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa90811561030d575f9161102c575b5060055481106108ef57610951907fd4e1cd91d2707400c53a3fc4822006215c498a3d424b95eabedaf574d2bb64016020604051838152a1610a19565b90506020813d602011611056575b8161104760209383610858565b8101031261014e57515f610fef565b3d915061103a56fe2daa13478b8265a01977bdca6d2719323c82f5d97ff95449c85592b27f655604a164736f6c634300081f000a000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a27000000000000000000000000f2da3942616880e52e841e5c504b5a9fba23fff0000000000000000000000000f6f8db0aba00007681f8faf16a0fda1c9b030b11000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d9
Deployed ByteCode
0x6080806040526004361015610059575b50361561001a575f80fd5b6004545f1981146100455760010180600455600354111561003757005b5f600455610043610f94565b005b634e487b7160e01b5f52601160045260245ffd5b5f3560e01c9081630fc63d10146107e757508063279c4ebf146107255780633923411c146106445780634ccd4097146105b25780635f64b55b1461058a5780637209d3b91461056d5780637ba85592146105505780638da5cb5b1461052957806395c5c5e31461033557806397eac8e8146103185780639e281a9814610269578063d5dcaeee14610211578063ef8ef56f146101cd578063f2fde38b146101525763f887ea401461010a575f61000f565b3461014e575f36600319011261014e576040517f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d96001600160a01b03168152602090f35b5f80fd5b3461014e57602036600319011261014e5761016b61080a565b5f546001600160a01b03811691610183338414610820565b6001600160a01b031691829061019a82151561087b565b7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36001600160a01b031916175f55005b3461014e575f36600319011261014e576040517f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b03168152602090f35b3461014e57602036600319011261014e577fb42aeb1dff935605cccca8f17007a26258bcc6bde46312d3aaae9ecbac667484602060043561025c60018060a01b035f54163314610820565b80600555604051908152a1005b3461014e57604036600319011261014e5761028261080a565b5f546001600160a01b03169060209061029c338414610820565b6001600160a01b0316916102b183151561087b565b60405192839163a9059cbb60e01b835260048301526024356024830152815f604482800301925af1801561030d576102e557005b6100439060203d602011610306575b6102fe8183610858565b8101906108b6565b503d6102f4565b6040513d5f823e3d90fd5b3461014e575f36600319011261014e576020600554604051908152f35b3461014e57604036600319011261014e5761034e61080a565b6024356001600160a01b0381169182820361014e5761037760018060a01b035f54163314610820565b6001600160a01b03811680151580610520575b6103939061087b565b600180546001600160a01b0319908116831790915560028054909116851790557f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b0316908181036104a4575b508303610412575b5f51602061105f5f395f51905f52925061040d604051928392836108ce565b0390a1005b60405163095ea7b360e01b81527f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031660048201525f19602482015292602090849060449082905f905af192831561030d575f51602061105f5f395f51905f5293610485575b506103ee565b61049d9060203d602011610306576102fe8183610858565b508361047f565b60405163095ea7b360e01b81527f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031660048201525f19602482015290602090829060449082905f905af1801561030d57156103e6576105199060203d602011610306576102fe8183610858565b50846103e6565b5083151561038a565b3461014e575f36600319011261014e575f546040516001600160a01b039091168152602090f35b3461014e575f36600319011261014e576020600454604051908152f35b3461014e575f36600319011261014e576020600354604051908152f35b3461014e575f36600319011261014e576002546040516001600160a01b039091168152602090f35b3461014e57602036600319011261014e576004356105da60018060a01b035f54163314610820565b8015610611576020817faece30ec52bb020d80a8b6a0a5688f46722d23cbe2e7d80e1313c42675f2bf6a92600355604051908152a1005b60405162461bcd60e51b815260206004820152600b60248201526a04d757374206265203e20360ac1b6044820152606490fd5b3461014e575f36600319011261014e5761065c6108e8565b6040516370a0823160e01b81523060048201526020816024817f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b03165afa90811561030d575f916106f3575b5060055481106106c25761004390610a19565b60405162461bcd60e51b81526020600482015260096024820152682132b637bb9036b4b760b91b6044820152606490fd5b90506020813d60201161071d575b8161070e60209383610858565b8101031261014e5751816106af565b3d9150610701565b3461014e57602036600319011261014e575f80548190819081906001600160a01b0316610753338214610820565b600435905af13d156107e2573d6001600160401b0381116107ce5760405190610786601f8201601f191660200183610858565b81525f60203d92013e5b1561079757005b60405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606490fd5b634e487b7160e01b5f52604160045260245ffd5b610790565b3461014e575f36600319011261014e576001546001600160a01b03168152602090f35b600435906001600160a01b038216820361014e57565b1561082757565b60405162461bcd60e51b81526020600482015260096024820152682737ba1037bbb732b960b91b6044820152606490fd5b601f909101601f19168101906001600160401b038211908210176107ce57604052565b1561088257565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b9081602091031261014e5751801515810361014e5790565b6001600160a01b0391821681529116602082015260400190565b47806108f2575b50565b7f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b0316803b1561014e575f90600460405180948193630d0e30db60e41b83525af1801561030d576109475750565b5f61095191610858565b565b8051156109605760200190565b634e487b7160e01b5f52603260045260245ffd5b8051600110156109605760400190565b91909493929460a083019083525f602084015260a060408401528151809152602060c084019201905f5b8181106109ce575050506001600160a01b03909416606082015260800152565b82516001600160a01b03168452602093840193909201916001016109ae565b9190820391821161004557565b9081602091031261014e57516001600160a01b038116810361014e5790565b5f8160011c8015610f8f576001546002546001600160a01b0390811692918116917f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a2790911690818303610dee5780610a7191966109ed565b90838103610c475750905b60018060a01b037f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d916916040519562e8e33760e81b8752826004880152846024880152604487015260648601528360848601528360a48601523060c48601524260e48601526060856101048187865af180958596610c0c575b50610b02575b5050505050565b60206004926040519384809263c45a015560e01b82525afa918215610c015791610b4e93916020938692610be2575b5060405180958194829363e6a4390560e01b8452600484016108ce565b03916001600160a01b03165afa918215610bd6577fc17cea59c2955cb181b03393209566960365771dbba9dc3d510180e7cb3120889260209290610ba9575b506040519384526001600160a01b031692a25f80808080610afb565b610bc99150823d8411610bcf575b610bc18183610858565b8101906109fa565b5f610b8d565b503d610bb7565b604051903d90823e3d90fd5b610bfa919250843d8611610bcf57610bc18183610858565b905f610b31565b6040513d86823e3d90fd5b9095506060813d606011610c3f575b81610c2860609383610858565b81010312610c3b5760400151945f610af5565b8480fd5b3d9150610c1b565b6040516370a0823160e01b815230600482015291602083602481885afa928315610de3578693610daf575b5060405191610c82606084610858565b600283526040366020850137610c9783610953565b5284610ca283610974565b527f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d96001600160a01b031690813b15610dab57610cfe928792839283604051809781958294635c11d79560e01b84524291309160048601610984565b03925af19182610d96575b5050610d16575050505050565b6040516370a0823160e01b815230600482015290602082602481875afa8015610d8b578590610d57575b610d4a92506109ed565b9081610a7c575050505050565b506020823d602011610d83575b81610d7160209383610858565b8101031261014e57610d4a9151610d40565b3d9150610d64565b6040513d87823e3d90fd5b81610da091610858565b610c3b57845f610d09565b8680fd5b9092506020813d602011610ddb575b81610dcb60209383610858565b8101031261014e5751915f610c72565b3d9150610dbe565b6040513d88823e3d90fd5b946040516370a0823160e01b8152306004820152602081602481875afa90811561030d575f91610f5d575b50604051610e28606082610858565b60028152604036602083013783610e3e82610953565b5284610e4982610974565b527f000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d96001600160a01b0316803b1561014e57610ea3915f918a83604051809681958294635c11d79560e01b84524291309160048601610984565b03925af19081610f48575b50610ebc5750505050505050565b6040516370a0823160e01b815230600482015290602082602481885afa8015610f3d578790610f09575b610ef092506109ed565b958615610f0057610a71916109ed565b50505050505050565b506020823d602011610f35575b81610f2360209383610858565b8101031261014e57610ef09151610ee6565b3d9150610f16565b6040513d89823e3d90fd5b610f559197505f90610858565b5f955f610eae565b90506020813d602011610f87575b81610f7860209383610858565b8101031261014e57515f610e19565b3d9150610f6b565b505050565b610f9c6108e8565b6040516370a0823160e01b81523060048201526020816024817f000000000000000000000000a1077a294dde1b09bb078844df40758a5d0f9a276001600160a01b03165afa90811561030d575f9161102c575b5060055481106108ef57610951907fd4e1cd91d2707400c53a3fc4822006215c498a3d424b95eabedaf574d2bb64016020604051838152a1610a19565b90506020813d602011611056575b8161104760209383610858565b8101031261014e57515f610fef565b3d915061103a56fe2daa13478b8265a01977bdca6d2719323c82f5d97ff95449c85592b27f655604a164736f6c634300081f000a