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 verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- SurplusGuard
- Optimization enabled
- false
- Compiler version
- v0.8.19+commit.7dd6d404
- EVM Version
- paris
- Verified at
- 2026-03-07T19:59:26.197259Z
SurplusGuard.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
interface IPair {
function skim(address to) external;
function sync() external;
function getReserves() external view returns (uint112, uint112, uint32);
function token0() external view returns (address);
function token1() external view returns (address);
}
interface IERC20 {
function balanceOf(address) external view returns (uint256);
}
/**
* @title SurplusGuard
* @notice Protects LP pair from MEV bot reflection harvesting via skim()
* @dev Hardcoded for Mirror/Shadow pair on PulseChain
*
* Pair: 0x14d8f49af789c2df5a62db950c9b5336cb61c304
* Mirror: 0x0A2321acEE7977F1665F5F72Fd49b1c60154Ad69 (1% reflect + 1% burn)
* Shadow: 0xcC1C700B4CDE776DAAd00132605301AEB58a91c2 (2% reflect + 2% burn)
*/
contract SurplusGuard {
// ─── Constants ────────────────────────────────────────────────────────────
address public constant PAIR = 0x14D8f49AF789C2dF5a62dB950C9B5336CB61C304;
address public constant MIRROR = 0x0A2321acEE7977F1665F5F72Fd49b1c60154Ad69;
address public constant SHADOW = 0xcC1C700B4CDE776DAAd00132605301AEB58a91c2;
address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
// skim() selector — used by bot to detect pending skim calls in mempool
bytes4 public constant SKIM_SELECTOR = bytes4(keccak256("skim(address)"));
// sync() selector
bytes4 public constant SYNC_SELECTOR = bytes4(keccak256("sync()"));
// ─── State ────────────────────────────────────────────────────────────────
address public keeper;
address public pendingKeeper;
uint256 public minSurplusThreshold = 1e18;
// Griefing protection: track how many times a caller hit us this block
mapping(address => uint256) public lastBlock;
mapping(address => uint256) public callsThisBlock;
uint256 public totalSwept0;
uint256 public totalSwept1;
uint256 public sweepCount;
// ─── Events ───────────────────────────────────────────────────────────────
event SurplusSwept(uint256 surplus0, uint256 surplus1, address indexed triggeredBy);
event ThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);
event KeeperTransferStarted(address indexed newKeeper);
event KeeperTransferred(address indexed oldKeeper, address indexed newKeeper);
// ─── Constructor ──────────────────────────────────────────────────────────
constructor() {
keeper = msg.sender;
}
// ─── Modifiers ────────────────────────────────────────────────────────────
modifier onlyKeeper() {
require(msg.sender == keeper, "Not keeper");
_;
}
// ─── Core: Emergency front-run sweep ──────────────────────────────────────
/**
* @notice Called by keeper bot the moment it detects a pending skim()
* in the mempool. Uses higher gas to front-run.
* @dev No threshold check — if bot sees a skim attempt, sweep immediately
* regardless of surplus size.
*/
function emergencySweep() external onlyKeeper {
_sweep();
}
/**
* @notice Normal sweep — only fires if surplus exceeds threshold.
* Called on every block during polling.
*/
function sweepSurplus() external onlyKeeper {
(uint256 s0, uint256 s1) = _getSurplus();
require(s0 > minSurplusThreshold || s1 > minSurplusThreshold, "Below threshold");
_sweep();
}
/**
* @notice Sweep + sync in one tx.
* Calling sync() after skim() ensures reserves match,
* removing the price discrepancy bots are trying to arb.
*/
function sweepAndSync() external onlyKeeper {
_sweep();
IPair(PAIR).sync();
}
// ─── Internal ─────────────────────────────────────────────────────────────
function _sweep() internal {
(uint256 surplus0, uint256 surplus1) = _getSurplus();
if (surplus0 > 0 || surplus1 > 0) {
// skim(DEAD) — any surplus goes to burn address, never to a bot
IPair(PAIR).skim(DEAD);
totalSwept0 += surplus0;
totalSwept1 += surplus1;
sweepCount++;
emit SurplusSwept(surplus0, surplus1, msg.sender);
}
}
function _getSurplus() internal view returns (uint256 surplus0, uint256 surplus1) {
(uint112 reserve0, uint112 reserve1,) = IPair(PAIR).getReserves();
address token0 = IPair(PAIR).token0();
address token1 = IPair(PAIR).token1();
uint256 bal0 = IERC20(token0).balanceOf(PAIR);
uint256 bal1 = IERC20(token1).balanceOf(PAIR);
surplus0 = bal0 > uint256(reserve0) ? bal0 - uint256(reserve0) : 0;
surplus1 = bal1 > uint256(reserve1) ? bal1 - uint256(reserve1) : 0;
}
// ─── Views ────────────────────────────────────────────────────────────────
function getSurplus() external view returns (uint256 surplus0, uint256 surplus1) {
return _getSurplus();
}
function getPairState() external view returns (
uint256 bal0,
uint256 bal1,
uint112 reserve0,
uint112 reserve1,
uint256 surplus0,
uint256 surplus1
) {
(reserve0, reserve1,) = IPair(PAIR).getReserves();
address token0 = IPair(PAIR).token0();
address token1 = IPair(PAIR).token1();
bal0 = IERC20(token0).balanceOf(PAIR);
bal1 = IERC20(token1).balanceOf(PAIR);
surplus0 = bal0 > uint256(reserve0) ? bal0 - uint256(reserve0) : 0;
surplus1 = bal1 > uint256(reserve1) ? bal1 - uint256(reserve1) : 0;
}
// ─── Admin ────────────────────────────────────────────────────────────────
function setThreshold(uint256 threshold) external onlyKeeper {
emit ThresholdUpdated(minSurplusThreshold, threshold);
minSurplusThreshold = threshold;
}
// Two-step keeper transfer to prevent accidents
function transferKeeper(address newKeeper) external onlyKeeper {
pendingKeeper = newKeeper;
emit KeeperTransferStarted(newKeeper);
}
function acceptKeeper() external {
require(msg.sender == pendingKeeper, "Not pending keeper");
emit KeeperTransferred(keeper, pendingKeeper);
keeper = pendingKeeper;
pendingKeeper = address(0);
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":false},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"paris","compilationTarget":{"SurplusGuard.sol":"SurplusGuard"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"KeeperTransferStarted","inputs":[{"type":"address","name":"newKeeper","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"KeeperTransferred","inputs":[{"type":"address","name":"oldKeeper","internalType":"address","indexed":true},{"type":"address","name":"newKeeper","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"SurplusSwept","inputs":[{"type":"uint256","name":"surplus0","internalType":"uint256","indexed":false},{"type":"uint256","name":"surplus1","internalType":"uint256","indexed":false},{"type":"address","name":"triggeredBy","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ThresholdUpdated","inputs":[{"type":"uint256","name":"oldThreshold","internalType":"uint256","indexed":false},{"type":"uint256","name":"newThreshold","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEAD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"MIRROR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"PAIR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"SHADOW","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"SKIM_SELECTOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes4","name":"","internalType":"bytes4"}],"name":"SYNC_SELECTOR","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptKeeper","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"callsThisBlock","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencySweep","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"bal0","internalType":"uint256"},{"type":"uint256","name":"bal1","internalType":"uint256"},{"type":"uint112","name":"reserve0","internalType":"uint112"},{"type":"uint112","name":"reserve1","internalType":"uint112"},{"type":"uint256","name":"surplus0","internalType":"uint256"},{"type":"uint256","name":"surplus1","internalType":"uint256"}],"name":"getPairState","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"surplus0","internalType":"uint256"},{"type":"uint256","name":"surplus1","internalType":"uint256"}],"name":"getSurplus","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"keeper","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lastBlock","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minSurplusThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pendingKeeper","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setThreshold","inputs":[{"type":"uint256","name":"threshold","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"sweepAndSync","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sweepCount","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"sweepSurplus","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSwept0","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSwept1","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferKeeper","inputs":[{"type":"address","name":"newKeeper","internalType":"address"}]}]
Contract Creation Code
0x6080604052670de0b6b3a764000060025534801561001c57600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061190a8061006c6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063960bfe04116100b8578063c0b097361161007c578063c0b097361461030e578063caee3ee61461032c578063cb5d79151461034f578063ec7a74d214610359578063f344ed1114610363578063fef62d6d1461038157610142565b8063960bfe041461027a578063ab361d0714610296578063ace3a8a7146102b4578063aced1661146102d2578063b3759298146102f057610142565b80634667f8021161010a5780634667f802146101c85780636f0f9fcc146101e6578063750102a81461020457806379248d9414610222578063855bd22d14610240578063952ca92c1461024a57610142565b806301a605771461014757806303fd2a451461015157806318b9ce721461016f5780632383b0741461018d5780632c192526146101ac575b600080fd5b61014f6103b1565b005b610159610583565b6040516101669190611352565b60405180910390f35b610177610589565b6040516101849190611352565b60405180910390f35b6101956105a1565b6040516101a3929190611386565b60405180910390f35b6101c660048036038101906101c191906113e0565b6105b4565b005b6101d06106c9565b6040516101dd919061140d565b60405180910390f35b6101ee6106cf565b6040516101fb9190611463565b60405180910390f35b61020c6106f3565b604051610219919061140d565b60405180910390f35b61022a6106f9565b6040516102379190611352565b60405180910390f35b610248610711565b005b610264600480360381019061025f91906113e0565b61080a565b604051610271919061140d565b60405180910390f35b610294600480360381019061028f91906114aa565b610822565b005b61029e6108f5565b6040516102ab919061140d565b60405180910390f35b6102bc6108fb565b6040516102c99190611352565b60405180910390f35b6102da610913565b6040516102e79190611352565b60405180910390f35b6102f8610937565b6040516103059190611352565b60405180910390f35b61031661095d565b6040516103239190611463565b60405180910390f35b610334610981565b60405161034696959493929190611500565b60405180910390f35b610357610cc8565b005b610361610d60565b005b61036b610e6c565b604051610378919061140d565b60405180910390f35b61039b600480360381019061039691906113e0565b610e72565b6040516103a8919061140d565b60405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610441576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610438906115be565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9097747ed48b5dd443be38e301bbacc0183d965854f4e1fcb64583b429dcc88a60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61dead81565b730a2321acee7977f1665f5f72fd49b1c60154ad6981565b6000806105ac610e8a565b915091509091565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610642576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106399061162a565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f9e4cfbd4e11b23040e7dbbd345d12d1708db747bc27c5743235c89dde183963f60405160405180910390a250565b60055481565b7ffff6cae917b7a8768ced5ece158885f4009776adc00606f01315420108ff9e1081565b60075481565b73cc1c700b4cde776daad00132605301aeb58a91c281565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107969061162a565b60405180910390fd5b6000806107aa610e8a565b915091506002548211806107bf575060025481115b6107fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f590611696565b60405180910390fd5b6108066111ce565b5050565b60036020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a79061162a565b60405180910390fd5b7fb06a54caabe58475c86c2bf9df3f2f06dd1213e9e10659c293117fe4893b274b600254826040516108e3929190611386565b60405180910390a18060028190555050565b60065481565b7314d8f49af789c2df5a62db950c9b5336cb61c30481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fbc25cf77f209a4796fa892acd45be15fa2a2d91b60348de52e18e4098606ba6d81565b6000806000806000807314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156109e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0d919061171e565b50809450819550505060007314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9b9190611786565b905060007314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b229190611786565b90508173ffffffffffffffffffffffffffffffffffffffff166370a082317314d8f49af789c2df5a62db950c9b5336cb61c3046040518263ffffffff1660e01b8152600401610b719190611352565b602060405180830381865afa158015610b8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb291906117c8565b97508073ffffffffffffffffffffffffffffffffffffffff166370a082317314d8f49af789c2df5a62db950c9b5336cb61c3046040518263ffffffff1660e01b8152600401610c019190611352565b602060405180830381865afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4291906117c8565b9650856dffffffffffffffffffffffffffff168811610c62576000610c7f565b856dffffffffffffffffffffffffffff1688610c7e9190611824565b5b9350846dffffffffffffffffffffffffffff168711610c9f576000610cbc565b846dffffffffffffffffffffffffffff1687610cbb9190611824565b5b92505050909192939495565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d9061162a565b60405180910390fd5b610d5e6111ce565b565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de59061162a565b60405180910390fd5b610df66111ce565b7314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e5257600080fd5b505af1158015610e66573d6000803e3d6000fd5b50505050565b60025481565b60046020528060005260406000206000915090505481565b6000806000807314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f13919061171e565b509150915060007314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9d9190611786565b905060007314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190611786565b905060008273ffffffffffffffffffffffffffffffffffffffff166370a082317314d8f49af789c2df5a62db950c9b5336cb61c3046040518263ffffffff1660e01b81526004016110759190611352565b602060405180830381865afa158015611092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b691906117c8565b905060008273ffffffffffffffffffffffffffffffffffffffff166370a082317314d8f49af789c2df5a62db950c9b5336cb61c3046040518263ffffffff1660e01b81526004016111079190611352565b602060405180830381865afa158015611124573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114891906117c8565b9050856dffffffffffffffffffffffffffff168211611168576000611185565b856dffffffffffffffffffffffffffff16826111849190611824565b5b9750846dffffffffffffffffffffffffffff1681116111a55760006111c2565b846dffffffffffffffffffffffffffff16816111c19190611824565b5b96505050505050509091565b6000806111d9610e8a565b9150915060008211806111ec5750600081115b1561130d577314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff1663bc25cf7761dead6040518263ffffffff1660e01b81526004016112409190611352565b600060405180830381600087803b15801561125a57600080fd5b505af115801561126e573d6000803e3d6000fd5b5050505081600560008282546112849190611858565b92505081905550806006600082825461129d9190611858565b92505081905550600760008154809291906112b79061188c565b91905055503373ffffffffffffffffffffffffffffffffffffffff167fb037baff94945082a1588110e0c03e6e86bb9f76ff8e9a1d241b8dff9763b0418383604051611304929190611386565b60405180910390a25b5050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061133c82611311565b9050919050565b61134c81611331565b82525050565b60006020820190506113676000830184611343565b92915050565b6000819050919050565b6113808161136d565b82525050565b600060408201905061139b6000830185611377565b6113a86020830184611377565b9392505050565b600080fd5b6113bd81611331565b81146113c857600080fd5b50565b6000813590506113da816113b4565b92915050565b6000602082840312156113f6576113f56113af565b5b6000611404848285016113cb565b91505092915050565b60006020820190506114226000830184611377565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61145d81611428565b82525050565b60006020820190506114786000830184611454565b92915050565b6114878161136d565b811461149257600080fd5b50565b6000813590506114a48161147e565b92915050565b6000602082840312156114c0576114bf6113af565b5b60006114ce84828501611495565b91505092915050565b60006dffffffffffffffffffffffffffff82169050919050565b6114fa816114d7565b82525050565b600060c0820190506115156000830189611377565b6115226020830188611377565b61152f60408301876114f1565b61153c60608301866114f1565b6115496080830185611377565b61155660a0830184611377565b979650505050505050565b600082825260208201905092915050565b7f4e6f742070656e64696e67206b65657065720000000000000000000000000000600082015250565b60006115a8601283611561565b91506115b382611572565b602082019050919050565b600060208201905081810360008301526115d78161159b565b9050919050565b7f4e6f74206b656570657200000000000000000000000000000000000000000000600082015250565b6000611614600a83611561565b915061161f826115de565b602082019050919050565b6000602082019050818103600083015261164381611607565b9050919050565b7f42656c6f77207468726573686f6c640000000000000000000000000000000000600082015250565b6000611680600f83611561565b915061168b8261164a565b602082019050919050565b600060208201905081810360008301526116af81611673565b9050919050565b6116bf816114d7565b81146116ca57600080fd5b50565b6000815190506116dc816116b6565b92915050565b600063ffffffff82169050919050565b6116fb816116e2565b811461170657600080fd5b50565b600081519050611718816116f2565b92915050565b600080600060608486031215611737576117366113af565b5b6000611745868287016116cd565b9350506020611756868287016116cd565b925050604061176786828701611709565b9150509250925092565b600081519050611780816113b4565b92915050565b60006020828403121561179c5761179b6113af565b5b60006117aa84828501611771565b91505092915050565b6000815190506117c28161147e565b92915050565b6000602082840312156117de576117dd6113af565b5b60006117ec848285016117b3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061182f8261136d565b915061183a8361136d565b9250828203905081811115611852576118516117f5565b5b92915050565b60006118638261136d565b915061186e8361136d565b9250828201905080821115611886576118856117f5565b5b92915050565b60006118978261136d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036118c9576118c86117f5565b5b60018201905091905056fea26469706673582212208b4ff812e3e5912f6650bac928880a91f0a7b1c36d8e78ea97eb38e98749d43f64736f6c63430008130033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106101425760003560e01c8063960bfe04116100b8578063c0b097361161007c578063c0b097361461030e578063caee3ee61461032c578063cb5d79151461034f578063ec7a74d214610359578063f344ed1114610363578063fef62d6d1461038157610142565b8063960bfe041461027a578063ab361d0714610296578063ace3a8a7146102b4578063aced1661146102d2578063b3759298146102f057610142565b80634667f8021161010a5780634667f802146101c85780636f0f9fcc146101e6578063750102a81461020457806379248d9414610222578063855bd22d14610240578063952ca92c1461024a57610142565b806301a605771461014757806303fd2a451461015157806318b9ce721461016f5780632383b0741461018d5780632c192526146101ac575b600080fd5b61014f6103b1565b005b610159610583565b6040516101669190611352565b60405180910390f35b610177610589565b6040516101849190611352565b60405180910390f35b6101956105a1565b6040516101a3929190611386565b60405180910390f35b6101c660048036038101906101c191906113e0565b6105b4565b005b6101d06106c9565b6040516101dd919061140d565b60405180910390f35b6101ee6106cf565b6040516101fb9190611463565b60405180910390f35b61020c6106f3565b604051610219919061140d565b60405180910390f35b61022a6106f9565b6040516102379190611352565b60405180910390f35b610248610711565b005b610264600480360381019061025f91906113e0565b61080a565b604051610271919061140d565b60405180910390f35b610294600480360381019061028f91906114aa565b610822565b005b61029e6108f5565b6040516102ab919061140d565b60405180910390f35b6102bc6108fb565b6040516102c99190611352565b60405180910390f35b6102da610913565b6040516102e79190611352565b60405180910390f35b6102f8610937565b6040516103059190611352565b60405180910390f35b61031661095d565b6040516103239190611463565b60405180910390f35b610334610981565b60405161034696959493929190611500565b60405180910390f35b610357610cc8565b005b610361610d60565b005b61036b610e6c565b604051610378919061140d565b60405180910390f35b61039b600480360381019061039691906113e0565b610e72565b6040516103a8919061140d565b60405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610441576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610438906115be565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f9097747ed48b5dd443be38e301bbacc0183d965854f4e1fcb64583b429dcc88a60405160405180910390a3600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61dead81565b730a2321acee7977f1665f5f72fd49b1c60154ad6981565b6000806105ac610e8a565b915091509091565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610642576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106399061162a565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f9e4cfbd4e11b23040e7dbbd345d12d1708db747bc27c5743235c89dde183963f60405160405180910390a250565b60055481565b7ffff6cae917b7a8768ced5ece158885f4009776adc00606f01315420108ff9e1081565b60075481565b73cc1c700b4cde776daad00132605301aeb58a91c281565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461079f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107969061162a565b60405180910390fd5b6000806107aa610e8a565b915091506002548211806107bf575060025481115b6107fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f590611696565b60405180910390fd5b6108066111ce565b5050565b60036020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a79061162a565b60405180910390fd5b7fb06a54caabe58475c86c2bf9df3f2f06dd1213e9e10659c293117fe4893b274b600254826040516108e3929190611386565b60405180910390a18060028190555050565b60065481565b7314d8f49af789c2df5a62db950c9b5336cb61c30481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7fbc25cf77f209a4796fa892acd45be15fa2a2d91b60348de52e18e4098606ba6d81565b6000806000806000807314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156109e9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a0d919061171e565b50809450819550505060007314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9b9190611786565b905060007314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610afe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b229190611786565b90508173ffffffffffffffffffffffffffffffffffffffff166370a082317314d8f49af789c2df5a62db950c9b5336cb61c3046040518263ffffffff1660e01b8152600401610b719190611352565b602060405180830381865afa158015610b8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb291906117c8565b97508073ffffffffffffffffffffffffffffffffffffffff166370a082317314d8f49af789c2df5a62db950c9b5336cb61c3046040518263ffffffff1660e01b8152600401610c019190611352565b602060405180830381865afa158015610c1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4291906117c8565b9650856dffffffffffffffffffffffffffff168811610c62576000610c7f565b856dffffffffffffffffffffffffffff1688610c7e9190611824565b5b9350846dffffffffffffffffffffffffffff168711610c9f576000610cbc565b846dffffffffffffffffffffffffffff1687610cbb9190611824565b5b92505050909192939495565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d9061162a565b60405180910390fd5b610d5e6111ce565b565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610dee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de59061162a565b60405180910390fd5b610df66111ce565b7314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e5257600080fd5b505af1158015610e66573d6000803e3d6000fd5b50505050565b60025481565b60046020528060005260406000206000915090505481565b6000806000807314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f13919061171e565b509150915060007314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9d9190611786565b905060007314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611000573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110249190611786565b905060008273ffffffffffffffffffffffffffffffffffffffff166370a082317314d8f49af789c2df5a62db950c9b5336cb61c3046040518263ffffffff1660e01b81526004016110759190611352565b602060405180830381865afa158015611092573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b691906117c8565b905060008273ffffffffffffffffffffffffffffffffffffffff166370a082317314d8f49af789c2df5a62db950c9b5336cb61c3046040518263ffffffff1660e01b81526004016111079190611352565b602060405180830381865afa158015611124573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114891906117c8565b9050856dffffffffffffffffffffffffffff168211611168576000611185565b856dffffffffffffffffffffffffffff16826111849190611824565b5b9750846dffffffffffffffffffffffffffff1681116111a55760006111c2565b846dffffffffffffffffffffffffffff16816111c19190611824565b5b96505050505050509091565b6000806111d9610e8a565b9150915060008211806111ec5750600081115b1561130d577314d8f49af789c2df5a62db950c9b5336cb61c30473ffffffffffffffffffffffffffffffffffffffff1663bc25cf7761dead6040518263ffffffff1660e01b81526004016112409190611352565b600060405180830381600087803b15801561125a57600080fd5b505af115801561126e573d6000803e3d6000fd5b5050505081600560008282546112849190611858565b92505081905550806006600082825461129d9190611858565b92505081905550600760008154809291906112b79061188c565b91905055503373ffffffffffffffffffffffffffffffffffffffff167fb037baff94945082a1588110e0c03e6e86bb9f76ff8e9a1d241b8dff9763b0418383604051611304929190611386565b60405180910390a25b5050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061133c82611311565b9050919050565b61134c81611331565b82525050565b60006020820190506113676000830184611343565b92915050565b6000819050919050565b6113808161136d565b82525050565b600060408201905061139b6000830185611377565b6113a86020830184611377565b9392505050565b600080fd5b6113bd81611331565b81146113c857600080fd5b50565b6000813590506113da816113b4565b92915050565b6000602082840312156113f6576113f56113af565b5b6000611404848285016113cb565b91505092915050565b60006020820190506114226000830184611377565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61145d81611428565b82525050565b60006020820190506114786000830184611454565b92915050565b6114878161136d565b811461149257600080fd5b50565b6000813590506114a48161147e565b92915050565b6000602082840312156114c0576114bf6113af565b5b60006114ce84828501611495565b91505092915050565b60006dffffffffffffffffffffffffffff82169050919050565b6114fa816114d7565b82525050565b600060c0820190506115156000830189611377565b6115226020830188611377565b61152f60408301876114f1565b61153c60608301866114f1565b6115496080830185611377565b61155660a0830184611377565b979650505050505050565b600082825260208201905092915050565b7f4e6f742070656e64696e67206b65657065720000000000000000000000000000600082015250565b60006115a8601283611561565b91506115b382611572565b602082019050919050565b600060208201905081810360008301526115d78161159b565b9050919050565b7f4e6f74206b656570657200000000000000000000000000000000000000000000600082015250565b6000611614600a83611561565b915061161f826115de565b602082019050919050565b6000602082019050818103600083015261164381611607565b9050919050565b7f42656c6f77207468726573686f6c640000000000000000000000000000000000600082015250565b6000611680600f83611561565b915061168b8261164a565b602082019050919050565b600060208201905081810360008301526116af81611673565b9050919050565b6116bf816114d7565b81146116ca57600080fd5b50565b6000815190506116dc816116b6565b92915050565b600063ffffffff82169050919050565b6116fb816116e2565b811461170657600080fd5b50565b600081519050611718816116f2565b92915050565b600080600060608486031215611737576117366113af565b5b6000611745868287016116cd565b9350506020611756868287016116cd565b925050604061176786828701611709565b9150509250925092565b600081519050611780816113b4565b92915050565b60006020828403121561179c5761179b6113af565b5b60006117aa84828501611771565b91505092915050565b6000815190506117c28161147e565b92915050565b6000602082840312156117de576117dd6113af565b5b60006117ec848285016117b3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061182f8261136d565b915061183a8361136d565b9250828203905081811115611852576118516117f5565b5b92915050565b60006118638261136d565b915061186e8361136d565b9250828201905080821115611886576118856117f5565b5b92915050565b60006118978261136d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036118c9576118c86117f5565b5b60018201905091905056fea26469706673582212208b4ff812e3e5912f6650bac928880a91f0a7b1c36d8e78ea97eb38e98749d43f64736f6c63430008130033