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.
- Contract name:
- DegenSwapper
- Optimization enabled
- true
- Compiler version
- v0.8.20+commit.a1b79de6
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2025-06-27T12:51:31.982398Z
Contract source code
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
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 value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` 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 value) external returns (bool);
}
// File: https://github.com/Uniswap/uniswap-v2-periphery/blob/master/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);
}
// File: https://github.com/Uniswap/uniswap-v2-periphery/blob/master/contracts/interfaces/IUniswapV2Router02.sol
pragma solidity >=0.6.2;
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;
}
// File: DEGEN-main (9)/DEGEN-main/contracts/interface/IDTX.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.20;
interface IDTX {
error ERC20InsufficientAllowance(
address spender,
uint256 allowance,
uint256 needed
);
error ERC20InsufficientBalance(
address sender,
uint256 balance,
uint256 needed
);
error ERC20InvalidApprover(address approver);
error ERC20InvalidReceiver(address receiver);
error ERC20InvalidSender(address sender);
error ERC20InvalidSpender(address spender);
error OwnableInvalidOwner(address owner);
error OwnableUnauthorizedAccount(address account);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
event Transfer(address indexed from, address indexed to, uint256 value);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function balanceOf(address account) external view returns (uint256);
function burn(uint256 value) external;
function burnFrom(address account, uint256 value) external;
function burnToken(address account, uint256 amount) external returns (bool);
function decimals() external view returns (uint8);
function governor() external view returns (address);
function masterchefAddress() external view returns (address);
function mint(address to, uint256 amount) external;
function name() external view returns (string memory);
function owner() external view returns (address);
function rebrandName(string memory _newName) external;
function rebrandSymbol(string memory _newSymbol) external;
function receiveTax() external view returns (address);
function renounceOwnership() external;
function symbol() external view returns (string memory);
function tax() external view returns (uint256);
function totalSupply() external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function transferOwnership(address newOwner) external;
function updateTax(address _taxAddress) external;
function updateTax(uint256 _tax) external;
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchefAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_newName","type":"string"}],"name":"rebrandName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newSymbol","type":"string"}],"name":"rebrandSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"receiveTax","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_taxAddress","type":"address"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tax","type":"uint256"}],"name":"updateTax","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/
// File: DEGEN-main (9)/DEGEN-main/contracts/interface/IGovernor.sol
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity >=0.7.0 <0.9.0;
interface IGovernor {
event EnforceGovernor(
address indexed _newGovernor,
address indexed enforcer
);
event GiveRolloverBonus(
address indexed recipient,
uint256 amount,
address indexed poolInto
);
event SetInflation(uint256 rewardPerBlock);
function OINK() external view returns (address);
function acPool1() external view returns (address);
function acPool1ID() external view returns (uint256);
function acPool2() external view returns (address);
function acPool2ID() external view returns (uint256);
function acPool3() external view returns (address);
function acPool3ID() external view returns (uint256);
function acPool4() external view returns (address);
function acPool4ID() external view returns (uint256);
function addNewPool(address _pool) external;
function addressToUint256(address addr) external pure returns (uint256);
function basicContract() external view returns (address);
function blockGovernorProposal() external;
function burnTokens(uint256 _amount) external;
function changedName() external view returns (bool);
function consensusContract() external view returns (address);
function costToVote() external view returns (uint256);
function creditContract() external view returns (address);
function delayBeforeEnforce() external view returns (uint256);
function depositFee() external view returns (uint256);
function farmContract() external view returns (address);
function fundingRate() external view returns (uint256);
function getRollBonus(address _bonusForPool)
external
view
returns (uint256);
function governorBlocked(address) external view returns (bool);
function harvest() external;
function manageRewardsAddress() external view returns (address);
function helperToken() external view returns (address);
function lastHarvestedTime() external view returns (uint256);
function masterchef() external view returns (address);
function proposeGovernorTimestamp() external view returns (uint256);
function proposeNewGovernor(address beneficiary) external;
function proposedGovernor() external view returns (address);
function rebalancePools() external;
function referralBonus() external view returns (uint256);
function rewardContract() external view returns (address);
function setCallFee(address _acPool, uint256 _newCallFee) external;
function setGovernorTax(uint256 _amount) external;
function setNewGovernor() external;
function setNewGovernor2(address _new) external;
function setPool(
uint256 _pid,
uint256 _allocPoint,
bool _withUpdate
) external;
function setReward(uint256 _amount) external;
function stakeRolloverBonus(
address _toAddress,
address _depositToPool,
uint256 _bonusToPay,
uint256 _stakeID
) external;
function token() external view returns (address);
function transferToTreasury(uint256 amount) external;
function treasuryRequest(
address _tokenAddr,
address _recipient,
uint256 _amountToSend
) external;
function treasuryWallet() external view returns (address);
function updateCostToVote(uint256 newCostToVote) external;
function updateDelayBeforeEnforce(uint256 newDelay) external;
function updateRolloverBonus(address _forPool, uint256 _bonus) external;
function updateVault(uint256 _type, uint256 _amount) external;
}
// THIS FILE WAS AUTOGENERATED FROM THE FOLLOWING ABI JSON:
/*
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_newGovernor","type":"address"},{"indexed":true,"internalType":"address","name":"enforcer","type":"address"}],"name":"EnforceGovernor","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"poolInto","type":"address"}],"name":"GiveRolloverBonus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"SetInflation","type":"event"},{"inputs":[],"name":"OINK","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool1ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool2ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool3ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool4","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acPool4ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"}],"name":"addNewPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addressToUint256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"basicContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockGovernorProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burnTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changedName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"consensusContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costToVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creditContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delayBeforeEnforce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"farmContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_bonusForPool","type":"address"}],"name":"getRollBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"governorBlocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"helperToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastHarvestedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposeGovernorTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"proposeNewGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposedGovernor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalancePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"referralBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_acPool","type":"address"},{"internalType":"uint256","name":"_newCallFee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setGovernorTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setNewGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"setNewGovernor2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"address","name":"_depositToPool","type":"address"},{"internalType":"uint256","name":"_bonusToPay","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"stakeRolloverBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferToTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amountToSend","type":"uint256"}],"name":"treasuryRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCostToVote","type":"uint256"}],"name":"updateCostToVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDelay","type":"uint256"}],"name":"updateDelayBeforeEnforce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_forPool","type":"address"},{"internalType":"uint256","name":"_bonus","type":"uint256"}],"name":"updateRolloverBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_type","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"updateVault","outputs":[],"stateMutability":"nonpayable","type":"function"}]
*/
// File: DEGEN-main (9)/DEGEN-main/contracts/buyOINK.sol
pragma solidity 0.8.20;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
interface IVault {
enum SwapKind { GIVEN_IN, GIVEN_OUT }
struct SingleSwap {
bytes32 poolId;
SwapKind kind;
address assetIn;
address assetOut;
uint256 amount;
bytes userData;
}
struct FundManagement {
address sender;
bool fromInternalBalance;
address payable recipient;
bool toInternalBalance;
}
function swap(
SingleSwap memory singleSwap,
FundManagement memory funds,
uint256 limit,
uint256 deadline
) external payable returns (uint256);
}
contract DegenSwapper {
address public constant UNISWAP_ROUTER_ADDRESS = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
address public constant UNISWAP_ROUTER_ADDRESS_V1 = 0x98bf93ebf5c380C0e6Ae8e192A7e2AE08edAcc02;
address public constant OINK = 0xFAaC6a85C3e123AB2CF7669B1024f146cFef0b38;
address public constant WPLS = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27;
address public constant DEGEN = 0x3E79130ab714E97ee73f86a56a2427bb1A519896;
address public authorizedAddress;
address public constant WETH_ADDRESS = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27;
bool public allowAll = true;
IUniswapV2Router02 public constant uniswapRouter = IUniswapV2Router02(UNISWAP_ROUTER_ADDRESS);
IUniswapV2Router02 public constant uniswapRouterV1 = IUniswapV2Router02(UNISWAP_ROUTER_ADDRESS_V1); //pulsex v1
mapping(address => bool) public exoticToken;
mapping(address => bool) public exoticTokenPath;
mapping(address => bool) public allowedPhux;
mapping(bytes32 => bool) public allowedPhuxId;
mapping(address => bool) public isV1Liquidity;
mapping(address => bool) public isFeeToken;
// Balancer V2 Vault address (mainnet)
IVault public constant vault = IVault(0x7F51AC3df6A034273FB09BB29e383FCF655e473c);
uint256 public slippageTolerance = 97; //3% slippage(token tax)
constructor() {
authorizedAddress = msg.sender;
isFeeToken[0x32fB5663619A657839A80133994E45c5e5cDf427] = true;
allowedPhux[0x6C203A555824ec90a215f37916cf8Db58EBe2fA3] = true; // print
allowedPhuxId[0x30dd5508c3b1deb46a69fe29955428bb4e0733d90001000000000000000004b6] = true; // INC
allowedPhux[0x9663c2d75ffd5F4017310405fCe61720aF45B829] = true; // phux and 2phux
allowedPhux[0x115f3Fa979a936167f9D208a7B7c4d85081e84BD] = true;
allowedPhuxId[0x7b70f6c77f7e3effe28495dbbd146f9a8af1afe50001000000000000000003cc] = true; // 2phux -> wpls
allowedPhuxId[0x545998abcbf0633c83ba20cb94f384925be75dd5000200000000000000000000] = true; // phux -> wpls
//approval for wpls, PRINT, inc, hex, plsx
IERC20(WPLS).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
IERC20(0x2fa878Ab3F87CC1C9737Fc071108F904c0B0C95d).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
IERC20(0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
IERC20(0x95B303987A60C71504D99Aa1b13B4DA07b0790ab).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
IERC20(0x8b4cfb020aF9AcAd95AD80020cE8f67FBB2C700E).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max); //bbc
IERC20(0xefD766cCb38EaF1dfd701853BFCe31359239F305).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max); // edai
IERC20(0x85DF7cE20A4CE0cF859804b45cB540FFE42074Da).approve(UNISWAP_ROUTER_ADDRESS_V1, type(uint256).max); //actr
IERC20(0x32fB5663619A657839A80133994E45c5e5cDf427).approve(UNISWAP_ROUTER_ADDRESS_V1, type(uint256).max); // emit
}
event BoughtOink(uint256 amountSpent, uint256 amountReceived);
modifier onlyAuthorized() {
if(!allowAll) {
require(msg.sender == authorizedAddress, "authorized address only");
}
_;
}
function buyOink(uint256 _swapAmount) public onlyAuthorized {
uint deadline = block.timestamp + 15;
uint[] memory amountsOut = uniswapRouter.getAmountsOut(_swapAmount, getTokenPath());
uint minOut = (amountsOut[amountsOut.length-1] * slippageTolerance) / 100;
uint[] memory amounts = uniswapRouter.swapExactTokensForTokens(
_swapAmount, // amountIn
minOut, // amountOutMin
getTokenPath(),
treasury(),
deadline
);
emit BoughtOink(_swapAmount, amounts[amounts.length - 1]);
}
function buyOinkFixed(uint256 _swapAmount, uint256 _minOut) public onlyAuthorized {
uint deadline = block.timestamp + 15;
uint[] memory amounts = uniswapRouter.swapExactTokensForTokens(
_swapAmount, // amountIn
_minOut, // amountOutMin (caller provides this)
getTokenPath(),
treasury(),
deadline
);
emit BoughtOink(_swapAmount, amounts[amounts.length - 1]);
}
function swapForWpls(uint256 _swapAmount, address _token, uint256 _minOut) public onlyAuthorized {
require(_token != OINK && _token != WPLS && _token != DEGEN, "not allowed for these tokens");
uint deadline = block.timestamp + 15;
IUniswapV2Router02 _router;
if(isV1Liquidity[_token]) {
_router = uniswapRouterV1;
} else {
_router = uniswapRouter;
}
_router.swapExactTokensForTokens(
_swapAmount, // amountIn
_minOut, // amountOutMin
getTokenPath2(_token),
address(this),
deadline
);
}
function swapForWplsFeeToken(uint256 _swapAmount, address _token, uint256 _minOut) public onlyAuthorized {
require(_token != OINK && _token != WPLS && _token != DEGEN, "not allowed for these tokens");
require(isFeeToken[_token], "only fee tokens!");
uint deadline = block.timestamp + 15;
IUniswapV2Router02 _router;
if(isV1Liquidity[_token]) {
_router = uniswapRouterV1;
} else {
_router = uniswapRouter;
}
_router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
_swapAmount, // amountIn
_minOut, // amountOutMin
getTokenPath2(_token),
address(this),
deadline
);
}
function swapExoticTokenForWPLS(address _token, address _into) external onlyAuthorized {
require(exoticToken[_token], "submitted exotic token is not enabled");
require(exoticTokenPath[_into], "submitted exotic token path is not enabled");
uint deadline = block.timestamp + 15;
uint256 tokenBalance = IERC20(_token).balanceOf(address(this));
address[] memory path = new address[](3);
path[0] = _token;
path[1] = _into;
path[2] = WPLS;
IUniswapV2Router02 _router;
if(isV1Liquidity[_token]) {
_router = uniswapRouterV1;
} else {
_router = uniswapRouter;
}
// Get expected output amounts
uint[] memory amountsOut = _router.getAmountsOut(tokenBalance, path);
// Apply slippage tolerance (e.g., 3% slippage)
uint256 minAmountOut = amountsOut[amountsOut.length - 1] ;
// Use swapExactTokensForTokens instead
_router.swapExactTokensForTokens(
tokenBalance, // amountIn
minAmountOut, // amountOutMin
path, // path
address(this), // to
deadline // deadline
);
}
//swap on phux
function swapOnPhuxForWPLS(
address tokenIn, // Address of the input token (e.g., DAI)
bytes32 poolId // Balancer pool ID (e.g., DAI/WETH pool)
) external onlyAuthorized {
require(allowedPhux[tokenIn], "token is not enabled");
require(allowedPhuxId[poolId], "phux pool is not enabled");
uint256 deadline = block.timestamp + 15;
uint256 amountIn = IERC20(tokenIn).balanceOf(address(this));
IERC20(tokenIn).approve(address(vault), amountIn);
// Define the swap parameters
IVault.SingleSwap memory singleSwap = IVault.SingleSwap({
poolId: poolId,
kind: IVault.SwapKind.GIVEN_IN, // Specify exact amount in
assetIn: tokenIn,
assetOut: WPLS,
amount: amountIn,
userData: "0x" // No additional data needed for standard swaps
});
// Define fund management parameters
IVault.FundManagement memory funds = IVault.FundManagement({
sender: address(this), // This contract sends the tokens
fromInternalBalance: false, // Use external balance
recipient: payable(address(this)), // Send WETH to the caller
toInternalBalance: false // Do not use internal balance
});
// Execute the swap with no minimum amount out (ignoring slippage)
// small amount of rewards from constant rewards so no care for slippage
uint256 amountOut = vault.swap(singleSwap, funds, 0, deadline);
}
function enableToken(address _token) external {
IERC20(_token).approve(UNISWAP_ROUTER_ADDRESS, type(uint256).max);
}
function enableTokenV1(address _token) external {
IERC20(_token).approve(UNISWAP_ROUTER_ADDRESS_V1, type(uint256).max);
}
function getTokenPath() private pure returns (address[] memory) {
address[] memory path = new address[](2);
path[0] = WPLS;
path[1] = OINK;
return path;
}
function getTokenPath2(address _token) private pure returns (address[] memory) {
address[] memory path = new address[](2);
path[0] = _token;
path[1] = WPLS;
return path;
}
function getMinOut(uint256 _swapAmount, address[] memory _path) external view returns (uint256) {
IUniswapV2Router02 _router;
if(isV1Liquidity[_path[0]]) {
_router = uniswapRouterV1;
} else {
_router = uniswapRouter;
}
uint[] memory _minOutT = _router.getAmountsOut(_swapAmount, _path);
uint _minOut = _minOutT[_minOutT.length-1];
return _minOut;
}
function wrapPls() external {
uint256 amount = address(this).balance;
require(amount > 0, "No PLS balance");
// Get WETH contract
IWETH weth = IWETH(WETH_ADDRESS);
// Wrap ETH to WETH
weth.deposit{value: amount}();
}
function withdraw(address _token) external {
require(msg.sender == governor(), "only thru decentralized Governance");
IERC20(_token).transfer(treasury(), IERC20(_token).balanceOf(address(this)));
}
function sendToTreasury(address _token, uint256 _amount) external {
require(msg.sender == governor() || msg.sender == authorizedAddress, "only thru decentralized Governance");
IERC20(_token).transfer(treasury(), _amount);
}
function recoverETH() external {
require(msg.sender == governor() || msg.sender == authorizedAddress, "governor only");
address payable recipient = payable(treasury());
recipient.transfer(address(this).balance);
}
function recoverToken(address _token) external {
require(msg.sender == governor(), "governor only");
IERC20(_token).transfer(treasury(), IERC20(_token).balanceOf(address(this)));
}
function modifyAuthorized(address _newAddress) external {
require(msg.sender == authorizedAddress, "authorized address only");
authorizedAddress = _newAddress;
}
function modifyAllowAll(bool _setting) external {
require(msg.sender == authorizedAddress, "authorized address only");
allowAll = _setting;
}
function modifyExotic(address _token, bool _setting) external {
require(msg.sender == authorizedAddress, "authorized address only");
exoticToken[_token] = _setting;
}
function modifyExoticPath(address _token, bool _setting) external {
require(msg.sender == authorizedAddress, "authorized address only");
exoticTokenPath[_token] = _setting;
}
function modifyPhux(address _token, bool _setting) external {
require(msg.sender == authorizedAddress, "authorized address only");
allowedPhux[_token] = _setting;
}
function modifyPhuxPool(bytes32 _poolId, bool _setting) external {
require(msg.sender == authorizedAddress, "authorized address only");
allowedPhuxId[_poolId] = _setting;
}
function modifyV1Liquidity(address _token, bool _setting) external {
require(msg.sender == authorizedAddress, "authorized address only");
isV1Liquidity[_token] = _setting;
}
function modifySlippageTolerance(uint256 _amount) external {
require(msg.sender == authorizedAddress, "authorized address only");
slippageTolerance = _amount;
}
function modifyisFeeToken(address _token, bool _s) external {
require(msg.sender == authorizedAddress, "authorized address only");
isFeeToken[_token] = _s;
}
function governor() public view returns (address) {
return IDTX(DEGEN).governor();
}
function treasury() public view returns (address) {
return IGovernor(governor()).treasuryWallet();
}
// Simple ETH receiver functions
receive() external payable {}
fallback() external payable {}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"BoughtOink","inputs":[{"type":"uint256","name":"amountSpent","internalType":"uint256","indexed":false},{"type":"uint256","name":"amountReceived","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEGEN","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"OINK","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"UNISWAP_ROUTER_ADDRESS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"UNISWAP_ROUTER_ADDRESS_V1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WETH_ADDRESS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WPLS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowAll","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowedPhux","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"allowedPhuxId","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"authorizedAddress","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"buyOink","inputs":[{"type":"uint256","name":"_swapAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"buyOinkFixed","inputs":[{"type":"uint256","name":"_swapAmount","internalType":"uint256"},{"type":"uint256","name":"_minOut","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableToken","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"enableTokenV1","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"exoticToken","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"exoticTokenPath","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMinOut","inputs":[{"type":"uint256","name":"_swapAmount","internalType":"uint256"},{"type":"address[]","name":"_path","internalType":"address[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"governor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isFeeToken","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isV1Liquidity","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifyAllowAll","inputs":[{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifyAuthorized","inputs":[{"type":"address","name":"_newAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifyExotic","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifyExoticPath","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifyPhux","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifyPhuxPool","inputs":[{"type":"bytes32","name":"_poolId","internalType":"bytes32"},{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifySlippageTolerance","inputs":[{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifyV1Liquidity","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"bool","name":"_setting","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"modifyisFeeToken","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"bool","name":"_s","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"recoverETH","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"recoverToken","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"sendToTreasury","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"slippageTolerance","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"swapExoticTokenForWPLS","inputs":[{"type":"address","name":"_token","internalType":"address"},{"type":"address","name":"_into","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"swapForWpls","inputs":[{"type":"uint256","name":"_swapAmount","internalType":"uint256"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_minOut","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"swapForWplsFeeToken","inputs":[{"type":"uint256","name":"_swapAmount","internalType":"uint256"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_minOut","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"swapOnPhuxForWPLS","inputs":[{"type":"address","name":"tokenIn","internalType":"address"},{"type":"bytes32","name":"poolId","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"treasury","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router02"}],"name":"uniswapRouter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IUniswapV2Router02"}],"name":"uniswapRouterV1","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IVault"}],"name":"vault","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"address","name":"_token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"wrapPls","inputs":[]},{"type":"receive","stateMutability":"payable"}]
Contract Creation Code
0x60806040525f805460ff60a01b1916600160a01b179055606160075534801562000027575f80fd5b505f80546001600160a01b031916331781557f238a1e30575e6919c312f0809796b9ae37fca3315a0cf72757ab91df115d1e96805460ff1990811660019081179092557fb5d5c2219d4a6c1ea067eb676b8f79eb887d879e54047e83b6bbd0409fb19c3280548216831790557ff6ce72f957e7b9c210904f372ad0be240173025ad9cf16031d858ce16a807f8180548216831790557f5b26b8aecf35300d0c49f33bc1fe3c873521430e5f57995928f57e41d2fa821480548216831790557fba4795b0619f84b0f2866f065b44f4274053616b3a970c6901f0537039ee04d48054821683179055600460208190527fa439d80f7ee560f5565ecd23282d6478f9c3f6d1912cc3518a7aa5083de4645080548316841790557f545998abcbf0633c83ba20cb94f384925be75dd50002000000000000000000009093527f9b1e0fe3da40ea760fd6ad65d8de9736bb43a3050e62b0c57b49a1f09c17db948054909116909117905560405163095ea7b360e01b81525f8051602062002c62833981519152918101919091525f19602482015273a1077a294dde1b09bb078844df40758a5d0f9a279063095ea7b3906044016020604051808303815f875af1158015620001f3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002199190620005f9565b5060405163095ea7b360e01b81525f8051602062002c6283398151915260048201525f196024820152732fa878ab3f87cc1c9737fc071108f904c0b0c95d9063095ea7b3906044016020604051808303815f875af11580156200027e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002a49190620005f9565b5060405163095ea7b360e01b81525f8051602062002c6283398151915260048201525f196024820152732b591e99afe9f32eaa6214f7b7629768c40eeb399063095ea7b3906044016020604051808303815f875af115801562000309573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200032f9190620005f9565b5060405163095ea7b360e01b81525f8051602062002c6283398151915260048201525f1960248201527395b303987a60c71504d99aa1b13b4da07b0790ab9063095ea7b3906044016020604051808303815f875af115801562000394573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620003ba9190620005f9565b5060405163095ea7b360e01b81525f8051602062002c6283398151915260048201525f196024820152738b4cfb020af9acad95ad80020ce8f67fbb2c700e9063095ea7b3906044016020604051808303815f875af11580156200041f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004459190620005f9565b5060405163095ea7b360e01b81525f8051602062002c6283398151915260048201525f19602482015273efd766ccb38eaf1dfd701853bfce31359239f3059063095ea7b3906044016020604051808303815f875af1158015620004aa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620004d09190620005f9565b5060405163095ea7b360e01b81527398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0260048201525f1960248201527385df7ce20a4ce0cf859804b45cb540ffe42074da9063095ea7b3906044016020604051808303815f875af11580156200053b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005619190620005f9565b5060405163095ea7b360e01b81527398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0260048201525f1960248201527332fb5663619a657839a80133994e45c5e5cdf4279063095ea7b3906044016020604051808303815f875af1158015620005cc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620005f29190620005f9565b5062000621565b5f602082840312156200060a575f80fd5b815180151581146200061a575f80fd5b9392505050565b612633806200062f5f395ff3fe608060405260043610610247575f3560e01c8063735de9f711610137578063c690908a116100af578063d11196e011610076578063d11196e014610704578063d1a4dfdf14610723578063d7e7beb314610742578063eaf7e7a614610770578063ef8ef56f14610250578063fbfa77cf1461078f57005b8063c690908a1461068e578063c90bf57b1461046f578063cd6c8f8f146106ad578063cdc70a00146106db578063d03153aa146106ef57005b80639be65a60116100fe5780639be65a60146105bd5780639d1e07bf146105dc578063a06d0d11146105fb578063ab84aaa214610622578063c47e956314610641578063c67a0e2d1461066057005b8063735de9f71461053957806378edce551461056057806379b369431461053957806384f654a41461057f57806391f952fb1461059e57005b80634ee643a5116101ca578063622ba51211610191578063622ba5121461046f57806362bbf7cc146104965780636822e8d9146104b55780636c639e75146104d45780636d25c6fc146104fb5780636df240f71461051a57005b80634ee643a5146103d25780635167e2f9146103f157806351cff8d91461041e5780635539d4001461043d57806361d027b31461045b57005b8063306588911161020e578063306588911461032857806330f3f38314610356578063345dba631461037557806339118715146103945780633d4f93ed146103b357005b8063040141e5146102505780630614117a146102945780630c340a24146102a857806316ad82d7146102bc578063303e27c3146102fa57005b3661024e57005b005b34801561025b575f80fd5b5061027773a1077a294dde1b09bb078844df40758a5d0f9a2781565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561029f575f80fd5b5061024e6107b6565b3480156102b3575f80fd5b50610277610869565b3480156102c7575f80fd5b506102ea6102d6366004611ff8565b60066020525f908152604090205460ff1681565b604051901515815260200161028b565b348015610305575f80fd5b506102ea610314366004611ff8565b60016020525f908152604090205460ff1681565b348015610333575f80fd5b506102ea610342366004611ff8565b60026020525f908152604090205460ff1681565b348015610361575f80fd5b5061024e610370366004612027565b6108e3565b348015610380575f80fd5b5061024e61038f366004612042565b610929565b34801561039f575f80fd5b5061024e6103ae366004612077565b610b09565b3480156103be575f80fd5b5061024e6103cd3660046120a1565b610bdf565b3480156103dd575f80fd5b505f546102ea90600160a01b900460ff1681565b3480156103fc575f80fd5b5061041061040b366004612140565b610c32565b60405190815260200161028b565b348015610429575f80fd5b5061024e610438366004611ff8565b610d50565b348015610448575f80fd5b505f54610277906001600160a01b031681565b348015610466575f80fd5b50610277610e72565b34801561047a575f80fd5b506102777398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0281565b3480156104a1575f80fd5b5061024e6104b03660046120a1565b610eb6565b3480156104c0575f80fd5b5061024e6104cf3660046121e6565b610f09565b3480156104df575f80fd5b50610277733e79130ab714e97ee73f86a56a2427bb1a51989681565b348015610506575f80fd5b5061024e6105153660046121fd565b611118565b348015610525575f80fd5b5061024e610534366004612077565b611160565b348015610544575f80fd5b5061027773165c3410fc91ef562c50559f7d2289febed552d981565b34801561056b575f80fd5b5061024e61057a366004612042565b61145b565b34801561058a575f80fd5b5061024e6105993660046120a1565b61167f565b3480156105a9575f80fd5b5061024e6105b83660046120a1565b6116d2565b3480156105c8575f80fd5b5061024e6105d7366004611ff8565b611725565b3480156105e7575f80fd5b5061024e6105f63660046120a1565b61177d565b348015610606575f80fd5b5061027773faac6a85c3e123ab2cf7669b1024f146cfef0b3881565b34801561062d575f80fd5b5061024e61063c366004612220565b6117d0565b34801561064c575f80fd5b5061024e61065b36600461224c565b611b9c565b34801561066b575f80fd5b506102ea61067a366004611ff8565b60056020525f908152604090205460ff1681565b348015610699575f80fd5b5061024e6106a8366004611ff8565b611ce3565b3480156106b8575f80fd5b506102ea6106c73660046121e6565b60046020525f908152604090205460ff1681565b3480156106e6575f80fd5b5061024e611d2a565b3480156106fa575f80fd5b5061041060075481565b34801561070f575f80fd5b5061024e61071e3660046121e6565b611dd5565b34801561072e575f80fd5b5061024e61073d366004611ff8565b611e03565b34801561074d575f80fd5b506102ea61075c366004611ff8565b60036020525f908152604090205460ff1681565b34801561077b575f80fd5b5061024e61078a366004611ff8565b611e4d565b34801561079a575f80fd5b50610277737f51ac3df6a034273fb09bb29e383fcf655e473c81565b6107be610869565b6001600160a01b0316336001600160a01b031614806107e657505f546001600160a01b031633145b6108275760405162461bcd60e51b815260206004820152600d60248201526c676f7665726e6f72206f6e6c7960981b60448201526064015b60405180910390fd5b5f610830610e72565b6040519091506001600160a01b038216904780156108fc02915f818181858888f19350505050158015610865573d5f803e3d5ffd5b5050565b5f733e79130ab714e97ee73f86a56a2427bb1a5198966001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108de919061226c565b905090565b5f546001600160a01b0316331461090c5760405162461bcd60e51b815260040161081e90612287565b5f8054911515600160a01b0260ff60a01b19909216919091179055565b5f54600160a01b900460ff16610962575f546001600160a01b031633146109625760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03821673faac6a85c3e123ab2cf7669b1024f146cfef0b38148015906109ac57506001600160a01b03821673a1077a294dde1b09bb078844df40758a5d0f9a2714155b80156109d557506001600160a01b038216733e79130ab714e97ee73f86a56a2427bb1a51989614155b610a215760405162461bcd60e51b815260206004820152601c60248201527f6e6f7420616c6c6f77656420666f7220746865736520746f6b656e7300000000604482015260640161081e565b5f610a2d42600f6122d2565b6001600160a01b0384165f908152600560205260408120549192509060ff1615610a6c57507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc02610a83565b5073165c3410fc91ef562c50559f7d2289febed552d95b806001600160a01b03166338ed17398685610a9d88611e94565b30876040518663ffffffff1660e01b8152600401610abf959493929190612327565b5f604051808303815f875af1158015610ada573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b019190810190612362565b505050505050565b610b11610869565b6001600160a01b0316336001600160a01b03161480610b3957505f546001600160a01b031633145b610b555760405162461bcd60e51b815260040161081e906123ee565b816001600160a01b031663a9059cbb610b6c610e72565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015610bb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bda9190612430565b505050565b5f546001600160a01b03163314610c085760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03919091165f908152600160205260409020805460ff1916911515919091179055565b5f8060055f845f81518110610c4957610c4961244b565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff1615610c8f57507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc02610ca6565b5073165c3410fc91ef562c50559f7d2289febed552d95b60405163d06ca61f60e01b81525f906001600160a01b0383169063d06ca61f90610cd6908890889060040161245f565b5f60405180830381865afa158015610cf0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d179190810190612362565b90505f8160018351610d29919061247f565b81518110610d3957610d3961244b565b602002602001015190508093505050505b92915050565b610d58610869565b6001600160a01b0316336001600160a01b031614610d885760405162461bcd60e51b815260040161081e906123ee565b806001600160a01b031663a9059cbb610d9f610e72565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610de1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e059190612492565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303815f875af1158015610e4e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108659190612430565b5f610e7b610869565b6001600160a01b0316634626402b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ba573d5f803e3d5ffd5b5f546001600160a01b03163314610edf5760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03919091165f908152600660205260409020805460ff1916911515919091179055565b5f54600160a01b900460ff16610f42575f546001600160a01b03163314610f425760405162461bcd60e51b815260040161081e90612287565b5f610f4e42600f6122d2565b90505f73165c3410fc91ef562c50559f7d2289febed552d963d06ca61f84610f74611f31565b6040518363ffffffff1660e01b8152600401610f9192919061245f565b5f60405180830381865afa158015610fab573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fd29190810190612362565b90505f60646007548360018551610fe9919061247f565b81518110610ff957610ff961244b565b602002602001015161100b91906124a9565b61101591906124c0565b90505f73165c3410fc91ef562c50559f7d2289febed552d96338ed1739868461103c611f31565b611044610e72565b896040518663ffffffff1660e01b8152600401611065959493929190612327565b5f604051808303815f875af1158015611080573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110a79190810190612362565b90507f61d7807933e181594731ff5dfca72dfaabdcaf3e72951decc38ff78fcbba88ad8582600184516110da919061247f565b815181106110ea576110ea61244b565b6020026020010151604051611109929190918252602082015260400190565b60405180910390a15050505050565b5f546001600160a01b031633146111415760405162461bcd60e51b815260040161081e90612287565b5f91825260046020526040909120805460ff1916911515919091179055565b5f54600160a01b900460ff16611199575f546001600160a01b031633146111995760405162461bcd60e51b815260040161081e90612287565b6001600160a01b0382165f9081526003602052604090205460ff166111f75760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b881a5cc81b9bdd08195b98589b195960621b604482015260640161081e565b5f8181526004602052604090205460ff166112545760405162461bcd60e51b815260206004820152601860248201527f7068757820706f6f6c206973206e6f7420656e61626c65640000000000000000604482015260640161081e565b5f61126042600f6122d2565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156112a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112cb9190612492565b60405163095ea7b360e01b8152737f51ac3df6a034273fb09bb29e383fcf655e473c6004820152602481018290529091506001600160a01b0385169063095ea7b3906044016020604051808303815f875af115801561132c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113509190612430565b506040805160c0810182528481525f60208083018290526001600160a01b0388168385015273a1077a294dde1b09bb078844df40758a5d0f9a276060808501919091526080808501879052855180870187526002815261060f60f31b8185015260a0860152855190810186523080825292810184905280860192909252810182905292516352bbbe2960e01b8152919291737f51ac3df6a034273fb09bb29e383fcf655e473c906352bbbe2990611411908690869086908b90600401612522565b6020604051808303815f875af115801561142d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114519190612492565b5050505050505050565b5f54600160a01b900460ff16611494575f546001600160a01b031633146114945760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03821673faac6a85c3e123ab2cf7669b1024f146cfef0b38148015906114de57506001600160a01b03821673a1077a294dde1b09bb078844df40758a5d0f9a2714155b801561150757506001600160a01b038216733e79130ab714e97ee73f86a56a2427bb1a51989614155b6115535760405162461bcd60e51b815260206004820152601c60248201527f6e6f7420616c6c6f77656420666f7220746865736520746f6b656e7300000000604482015260640161081e565b6001600160a01b0382165f9081526006602052604090205460ff166115ad5760405162461bcd60e51b815260206004820152601060248201526f6f6e6c792066656520746f6b656e732160801b604482015260640161081e565b5f6115b942600f6122d2565b6001600160a01b0384165f908152600560205260408120549192509060ff16156115f857507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0261160f565b5073165c3410fc91ef562c50559f7d2289febed552d95b806001600160a01b0316635c11d795868561162988611e94565b30876040518663ffffffff1660e01b815260040161164b959493929190612327565b5f604051808303815f87803b158015611662575f80fd5b505af1158015611674573d5f803e3d5ffd5b505050505050505050565b5f546001600160a01b031633146116a85760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03919091165f908152600360205260409020805460ff1916911515919091179055565b5f546001600160a01b031633146116fb5760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03919091165f908152600560205260409020805460ff1916911515919091179055565b61172d610869565b6001600160a01b0316336001600160a01b031614610d885760405162461bcd60e51b815260206004820152600d60248201526c676f7665726e6f72206f6e6c7960981b604482015260640161081e565b5f546001600160a01b031633146117a65760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03919091165f908152600260205260409020805460ff1916911515919091179055565b5f54600160a01b900460ff16611809575f546001600160a01b031633146118095760405162461bcd60e51b815260040161081e90612287565b6001600160a01b0382165f9081526001602052604090205460ff1661187e5760405162461bcd60e51b815260206004820152602560248201527f7375626d69747465642065786f74696320746f6b656e206973206e6f7420656e60448201526418589b195960da1b606482015260840161081e565b6001600160a01b0381165f9081526002602052604090205460ff166118f85760405162461bcd60e51b815260206004820152602a60248201527f7375626d69747465642065786f74696320746f6b656e2070617468206973206e6044820152691bdd08195b98589b195960b21b606482015260840161081e565b5f61190442600f6122d2565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038516906370a0823190602401602060405180830381865afa15801561194b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061196f9190612492565b604080516003808252608082019092529192505f91906020820160608036833701905050905084815f815181106119a8576119a861244b565b60200260200101906001600160a01b031690816001600160a01b03168152505083816001815181106119dc576119dc61244b565b60200260200101906001600160a01b031690816001600160a01b03168152505073a1077a294dde1b09bb078844df40758a5d0f9a2781600281518110611a2457611a2461244b565b6001600160a01b039283166020918202929092018101919091529086165f9081526005909152604081205460ff1615611a7257507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc02611a89565b5073165c3410fc91ef562c50559f7d2289febed552d95b60405163d06ca61f60e01b81525f906001600160a01b0383169063d06ca61f90611ab9908790879060040161245f565b5f60405180830381865afa158015611ad3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611afa9190810190612362565b90505f8160018351611b0c919061247f565b81518110611b1c57611b1c61244b565b60200260200101519050826001600160a01b03166338ed1739868387308b6040518663ffffffff1660e01b8152600401611b5a959493929190612327565b5f604051808303815f875af1158015611b75573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116749190810190612362565b5f54600160a01b900460ff16611bd5575f546001600160a01b03163314611bd55760405162461bcd60e51b815260040161081e90612287565b5f611be142600f6122d2565b90505f73165c3410fc91ef562c50559f7d2289febed552d96338ed17398585611c08611f31565b611c10610e72565b876040518663ffffffff1660e01b8152600401611c31959493929190612327565b5f604051808303815f875af1158015611c4c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c739190810190612362565b90507f61d7807933e181594731ff5dfca72dfaabdcaf3e72951decc38ff78fcbba88ad848260018451611ca6919061247f565b81518110611cb657611cb661244b565b6020026020010151604051611cd5929190918252602082015260400190565b60405180910390a150505050565b60405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d960048201525f1960248201526001600160a01b0382169063095ea7b390604401610e32565b4780611d695760405162461bcd60e51b815260206004820152600e60248201526d4e6f20504c532062616c616e636560901b604482015260640161081e565b5f73a1077a294dde1b09bb078844df40758a5d0f9a279050806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015611dba575f80fd5b505af1158015611dcc573d5f803e3d5ffd5b50505050505050565b5f546001600160a01b03163314611dfe5760405162461bcd60e51b815260040161081e90612287565b600755565b5f546001600160a01b03163314611e2c5760405162461bcd60e51b815260040161081e90612287565b5f80546001600160a01b0319166001600160a01b0392909216919091179055565b60405163095ea7b360e01b81527398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0260048201525f1960248201526001600160a01b0382169063095ea7b390604401610e32565b60408051600280825260608083018452925f92919060208301908036833701905050905082815f81518110611ecb57611ecb61244b565b60200260200101906001600160a01b031690816001600160a01b03168152505073a1077a294dde1b09bb078844df40758a5d0f9a2781600181518110611f1357611f1361244b565b6001600160a01b039092166020928302919091019091015292915050565b60408051600280825260608083018452925f92919060208301908036833701905050905073a1077a294dde1b09bb078844df40758a5d0f9a27815f81518110611f7c57611f7c61244b565b60200260200101906001600160a01b031690816001600160a01b03168152505073faac6a85c3e123ab2cf7669b1024f146cfef0b3881600181518110611fc457611fc461244b565b6001600160a01b0390921660209283029190910190910152919050565b6001600160a01b0381168114611ff5575f80fd5b50565b5f60208284031215612008575f80fd5b813561201381611fe1565b9392505050565b8015158114611ff5575f80fd5b5f60208284031215612037575f80fd5b81356120138161201a565b5f805f60608486031215612054575f80fd5b83359250602084013561206681611fe1565b929592945050506040919091013590565b5f8060408385031215612088575f80fd5b823561209381611fe1565b946020939093013593505050565b5f80604083850312156120b2575f80fd5b82356120bd81611fe1565b915060208301356120cd8161201a565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612115576121156120d8565b604052919050565b5f67ffffffffffffffff821115612136576121366120d8565b5060051b60200190565b5f8060408385031215612151575f80fd5b8235915060208084013567ffffffffffffffff81111561216f575f80fd5b8401601f8101861361217f575f80fd5b803561219261218d8261211d565b6120ec565b81815260059190911b820183019083810190888311156121b0575f80fd5b928401925b828410156121d75783356121c881611fe1565b825292840192908401906121b5565b80955050505050509250929050565b5f602082840312156121f6575f80fd5b5035919050565b5f806040838503121561220e575f80fd5b8235915060208301356120cd8161201a565b5f8060408385031215612231575f80fd5b823561223c81611fe1565b915060208301356120cd81611fe1565b5f806040838503121561225d575f80fd5b50508035926020909101359150565b5f6020828403121561227c575f80fd5b815161201381611fe1565b60208082526017908201527f617574686f72697a65642061646472657373206f6e6c79000000000000000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d4a57610d4a6122be565b5f8151808452602080850194508084015f5b8381101561231c5781516001600160a01b0316875295820195908201906001016122f7565b509495945050505050565b85815284602082015260a060408201525f61234560a08301866122e5565b6001600160a01b0394909416606083015250608001529392505050565b5f6020808385031215612373575f80fd5b825167ffffffffffffffff811115612389575f80fd5b8301601f81018513612399575f80fd5b80516123a761218d8261211d565b81815260059190911b820183019083810190878311156123c5575f80fd5b928401925b828410156123e3578351825292840192908401906123ca565b979650505050505050565b60208082526022908201527f6f6e6c79207468727520646563656e7472616c697a656420476f7665726e616e604082015261636560f01b606082015260800190565b5f60208284031215612440575f80fd5b81516120138161201a565b634e487b7160e01b5f52603260045260245ffd5b828152604060208201525f61247760408301846122e5565b949350505050565b81810381811115610d4a57610d4a6122be565b5f602082840312156124a2575f80fd5b5051919050565b8082028115828204841417610d4a57610d4a6122be565b5f826124da57634e487b7160e01b5f52601260045260245ffd5b500490565b5f81518084525f5b81811015612503576020818501810151868301820152016124e7565b505f602082860101526020601f19601f83011685010191505092915050565b60e08152845160e08201525f60208601516002811061254f57634e487b7160e01b5f52602160045260245ffd5b61010083015260408601516001600160a01b031661012083015260608601516125846101408401826001600160a01b03169052565b50608086015161016083015260a086015160c06101808401526125ab6101a08401826124df565b9150506125eb602083018680516001600160a01b039081168352602080830151151590840152604080830151909116908301526060908101511515910152565b60a082019390935260c001529291505056fea2646970667358221220a3c7bea6e9bc9918112f55bb25402174963520386027b5cd525f3c8a4a4ba6db64736f6c63430008140033000000000000000000000000165c3410fc91ef562c50559f7d2289febed552d9
Deployed ByteCode
0x608060405260043610610247575f3560e01c8063735de9f711610137578063c690908a116100af578063d11196e011610076578063d11196e014610704578063d1a4dfdf14610723578063d7e7beb314610742578063eaf7e7a614610770578063ef8ef56f14610250578063fbfa77cf1461078f57005b8063c690908a1461068e578063c90bf57b1461046f578063cd6c8f8f146106ad578063cdc70a00146106db578063d03153aa146106ef57005b80639be65a60116100fe5780639be65a60146105bd5780639d1e07bf146105dc578063a06d0d11146105fb578063ab84aaa214610622578063c47e956314610641578063c67a0e2d1461066057005b8063735de9f71461053957806378edce551461056057806379b369431461053957806384f654a41461057f57806391f952fb1461059e57005b80634ee643a5116101ca578063622ba51211610191578063622ba5121461046f57806362bbf7cc146104965780636822e8d9146104b55780636c639e75146104d45780636d25c6fc146104fb5780636df240f71461051a57005b80634ee643a5146103d25780635167e2f9146103f157806351cff8d91461041e5780635539d4001461043d57806361d027b31461045b57005b8063306588911161020e578063306588911461032857806330f3f38314610356578063345dba631461037557806339118715146103945780633d4f93ed146103b357005b8063040141e5146102505780630614117a146102945780630c340a24146102a857806316ad82d7146102bc578063303e27c3146102fa57005b3661024e57005b005b34801561025b575f80fd5b5061027773a1077a294dde1b09bb078844df40758a5d0f9a2781565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561029f575f80fd5b5061024e6107b6565b3480156102b3575f80fd5b50610277610869565b3480156102c7575f80fd5b506102ea6102d6366004611ff8565b60066020525f908152604090205460ff1681565b604051901515815260200161028b565b348015610305575f80fd5b506102ea610314366004611ff8565b60016020525f908152604090205460ff1681565b348015610333575f80fd5b506102ea610342366004611ff8565b60026020525f908152604090205460ff1681565b348015610361575f80fd5b5061024e610370366004612027565b6108e3565b348015610380575f80fd5b5061024e61038f366004612042565b610929565b34801561039f575f80fd5b5061024e6103ae366004612077565b610b09565b3480156103be575f80fd5b5061024e6103cd3660046120a1565b610bdf565b3480156103dd575f80fd5b505f546102ea90600160a01b900460ff1681565b3480156103fc575f80fd5b5061041061040b366004612140565b610c32565b60405190815260200161028b565b348015610429575f80fd5b5061024e610438366004611ff8565b610d50565b348015610448575f80fd5b505f54610277906001600160a01b031681565b348015610466575f80fd5b50610277610e72565b34801561047a575f80fd5b506102777398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0281565b3480156104a1575f80fd5b5061024e6104b03660046120a1565b610eb6565b3480156104c0575f80fd5b5061024e6104cf3660046121e6565b610f09565b3480156104df575f80fd5b50610277733e79130ab714e97ee73f86a56a2427bb1a51989681565b348015610506575f80fd5b5061024e6105153660046121fd565b611118565b348015610525575f80fd5b5061024e610534366004612077565b611160565b348015610544575f80fd5b5061027773165c3410fc91ef562c50559f7d2289febed552d981565b34801561056b575f80fd5b5061024e61057a366004612042565b61145b565b34801561058a575f80fd5b5061024e6105993660046120a1565b61167f565b3480156105a9575f80fd5b5061024e6105b83660046120a1565b6116d2565b3480156105c8575f80fd5b5061024e6105d7366004611ff8565b611725565b3480156105e7575f80fd5b5061024e6105f63660046120a1565b61177d565b348015610606575f80fd5b5061027773faac6a85c3e123ab2cf7669b1024f146cfef0b3881565b34801561062d575f80fd5b5061024e61063c366004612220565b6117d0565b34801561064c575f80fd5b5061024e61065b36600461224c565b611b9c565b34801561066b575f80fd5b506102ea61067a366004611ff8565b60056020525f908152604090205460ff1681565b348015610699575f80fd5b5061024e6106a8366004611ff8565b611ce3565b3480156106b8575f80fd5b506102ea6106c73660046121e6565b60046020525f908152604090205460ff1681565b3480156106e6575f80fd5b5061024e611d2a565b3480156106fa575f80fd5b5061041060075481565b34801561070f575f80fd5b5061024e61071e3660046121e6565b611dd5565b34801561072e575f80fd5b5061024e61073d366004611ff8565b611e03565b34801561074d575f80fd5b506102ea61075c366004611ff8565b60036020525f908152604090205460ff1681565b34801561077b575f80fd5b5061024e61078a366004611ff8565b611e4d565b34801561079a575f80fd5b50610277737f51ac3df6a034273fb09bb29e383fcf655e473c81565b6107be610869565b6001600160a01b0316336001600160a01b031614806107e657505f546001600160a01b031633145b6108275760405162461bcd60e51b815260206004820152600d60248201526c676f7665726e6f72206f6e6c7960981b60448201526064015b60405180910390fd5b5f610830610e72565b6040519091506001600160a01b038216904780156108fc02915f818181858888f19350505050158015610865573d5f803e3d5ffd5b5050565b5f733e79130ab714e97ee73f86a56a2427bb1a5198966001600160a01b0316630c340a246040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108de919061226c565b905090565b5f546001600160a01b0316331461090c5760405162461bcd60e51b815260040161081e90612287565b5f8054911515600160a01b0260ff60a01b19909216919091179055565b5f54600160a01b900460ff16610962575f546001600160a01b031633146109625760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03821673faac6a85c3e123ab2cf7669b1024f146cfef0b38148015906109ac57506001600160a01b03821673a1077a294dde1b09bb078844df40758a5d0f9a2714155b80156109d557506001600160a01b038216733e79130ab714e97ee73f86a56a2427bb1a51989614155b610a215760405162461bcd60e51b815260206004820152601c60248201527f6e6f7420616c6c6f77656420666f7220746865736520746f6b656e7300000000604482015260640161081e565b5f610a2d42600f6122d2565b6001600160a01b0384165f908152600560205260408120549192509060ff1615610a6c57507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc02610a83565b5073165c3410fc91ef562c50559f7d2289febed552d95b806001600160a01b03166338ed17398685610a9d88611e94565b30876040518663ffffffff1660e01b8152600401610abf959493929190612327565b5f604051808303815f875af1158015610ada573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610b019190810190612362565b505050505050565b610b11610869565b6001600160a01b0316336001600160a01b03161480610b3957505f546001600160a01b031633145b610b555760405162461bcd60e51b815260040161081e906123ee565b816001600160a01b031663a9059cbb610b6c610e72565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303815f875af1158015610bb6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bda9190612430565b505050565b5f546001600160a01b03163314610c085760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03919091165f908152600160205260409020805460ff1916911515919091179055565b5f8060055f845f81518110610c4957610c4961244b565b6020908102919091018101516001600160a01b031682528101919091526040015f205460ff1615610c8f57507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc02610ca6565b5073165c3410fc91ef562c50559f7d2289febed552d95b60405163d06ca61f60e01b81525f906001600160a01b0383169063d06ca61f90610cd6908890889060040161245f565b5f60405180830381865afa158015610cf0573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d179190810190612362565b90505f8160018351610d29919061247f565b81518110610d3957610d3961244b565b602002602001015190508093505050505b92915050565b610d58610869565b6001600160a01b0316336001600160a01b031614610d885760405162461bcd60e51b815260040161081e906123ee565b806001600160a01b031663a9059cbb610d9f610e72565b6040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015610de1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e059190612492565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303815f875af1158015610e4e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108659190612430565b5f610e7b610869565b6001600160a01b0316634626402b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108ba573d5f803e3d5ffd5b5f546001600160a01b03163314610edf5760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03919091165f908152600660205260409020805460ff1916911515919091179055565b5f54600160a01b900460ff16610f42575f546001600160a01b03163314610f425760405162461bcd60e51b815260040161081e90612287565b5f610f4e42600f6122d2565b90505f73165c3410fc91ef562c50559f7d2289febed552d963d06ca61f84610f74611f31565b6040518363ffffffff1660e01b8152600401610f9192919061245f565b5f60405180830381865afa158015610fab573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610fd29190810190612362565b90505f60646007548360018551610fe9919061247f565b81518110610ff957610ff961244b565b602002602001015161100b91906124a9565b61101591906124c0565b90505f73165c3410fc91ef562c50559f7d2289febed552d96338ed1739868461103c611f31565b611044610e72565b896040518663ffffffff1660e01b8152600401611065959493929190612327565b5f604051808303815f875af1158015611080573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110a79190810190612362565b90507f61d7807933e181594731ff5dfca72dfaabdcaf3e72951decc38ff78fcbba88ad8582600184516110da919061247f565b815181106110ea576110ea61244b565b6020026020010151604051611109929190918252602082015260400190565b60405180910390a15050505050565b5f546001600160a01b031633146111415760405162461bcd60e51b815260040161081e90612287565b5f91825260046020526040909120805460ff1916911515919091179055565b5f54600160a01b900460ff16611199575f546001600160a01b031633146111995760405162461bcd60e51b815260040161081e90612287565b6001600160a01b0382165f9081526003602052604090205460ff166111f75760405162461bcd60e51b81526020600482015260146024820152731d1bdad95b881a5cc81b9bdd08195b98589b195960621b604482015260640161081e565b5f8181526004602052604090205460ff166112545760405162461bcd60e51b815260206004820152601860248201527f7068757820706f6f6c206973206e6f7420656e61626c65640000000000000000604482015260640161081e565b5f61126042600f6122d2565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038516906370a0823190602401602060405180830381865afa1580156112a7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112cb9190612492565b60405163095ea7b360e01b8152737f51ac3df6a034273fb09bb29e383fcf655e473c6004820152602481018290529091506001600160a01b0385169063095ea7b3906044016020604051808303815f875af115801561132c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113509190612430565b506040805160c0810182528481525f60208083018290526001600160a01b0388168385015273a1077a294dde1b09bb078844df40758a5d0f9a276060808501919091526080808501879052855180870187526002815261060f60f31b8185015260a0860152855190810186523080825292810184905280860192909252810182905292516352bbbe2960e01b8152919291737f51ac3df6a034273fb09bb29e383fcf655e473c906352bbbe2990611411908690869086908b90600401612522565b6020604051808303815f875af115801561142d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114519190612492565b5050505050505050565b5f54600160a01b900460ff16611494575f546001600160a01b031633146114945760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03821673faac6a85c3e123ab2cf7669b1024f146cfef0b38148015906114de57506001600160a01b03821673a1077a294dde1b09bb078844df40758a5d0f9a2714155b801561150757506001600160a01b038216733e79130ab714e97ee73f86a56a2427bb1a51989614155b6115535760405162461bcd60e51b815260206004820152601c60248201527f6e6f7420616c6c6f77656420666f7220746865736520746f6b656e7300000000604482015260640161081e565b6001600160a01b0382165f9081526006602052604090205460ff166115ad5760405162461bcd60e51b815260206004820152601060248201526f6f6e6c792066656520746f6b656e732160801b604482015260640161081e565b5f6115b942600f6122d2565b6001600160a01b0384165f908152600560205260408120549192509060ff16156115f857507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0261160f565b5073165c3410fc91ef562c50559f7d2289febed552d95b806001600160a01b0316635c11d795868561162988611e94565b30876040518663ffffffff1660e01b815260040161164b959493929190612327565b5f604051808303815f87803b158015611662575f80fd5b505af1158015611674573d5f803e3d5ffd5b505050505050505050565b5f546001600160a01b031633146116a85760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03919091165f908152600360205260409020805460ff1916911515919091179055565b5f546001600160a01b031633146116fb5760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03919091165f908152600560205260409020805460ff1916911515919091179055565b61172d610869565b6001600160a01b0316336001600160a01b031614610d885760405162461bcd60e51b815260206004820152600d60248201526c676f7665726e6f72206f6e6c7960981b604482015260640161081e565b5f546001600160a01b031633146117a65760405162461bcd60e51b815260040161081e90612287565b6001600160a01b03919091165f908152600260205260409020805460ff1916911515919091179055565b5f54600160a01b900460ff16611809575f546001600160a01b031633146118095760405162461bcd60e51b815260040161081e90612287565b6001600160a01b0382165f9081526001602052604090205460ff1661187e5760405162461bcd60e51b815260206004820152602560248201527f7375626d69747465642065786f74696320746f6b656e206973206e6f7420656e60448201526418589b195960da1b606482015260840161081e565b6001600160a01b0381165f9081526002602052604090205460ff166118f85760405162461bcd60e51b815260206004820152602a60248201527f7375626d69747465642065786f74696320746f6b656e2070617468206973206e6044820152691bdd08195b98589b195960b21b606482015260840161081e565b5f61190442600f6122d2565b6040516370a0823160e01b81523060048201529091505f906001600160a01b038516906370a0823190602401602060405180830381865afa15801561194b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061196f9190612492565b604080516003808252608082019092529192505f91906020820160608036833701905050905084815f815181106119a8576119a861244b565b60200260200101906001600160a01b031690816001600160a01b03168152505083816001815181106119dc576119dc61244b565b60200260200101906001600160a01b031690816001600160a01b03168152505073a1077a294dde1b09bb078844df40758a5d0f9a2781600281518110611a2457611a2461244b565b6001600160a01b039283166020918202929092018101919091529086165f9081526005909152604081205460ff1615611a7257507398bf93ebf5c380c0e6ae8e192a7e2ae08edacc02611a89565b5073165c3410fc91ef562c50559f7d2289febed552d95b60405163d06ca61f60e01b81525f906001600160a01b0383169063d06ca61f90611ab9908790879060040161245f565b5f60405180830381865afa158015611ad3573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611afa9190810190612362565b90505f8160018351611b0c919061247f565b81518110611b1c57611b1c61244b565b60200260200101519050826001600160a01b03166338ed1739868387308b6040518663ffffffff1660e01b8152600401611b5a959493929190612327565b5f604051808303815f875af1158015611b75573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526116749190810190612362565b5f54600160a01b900460ff16611bd5575f546001600160a01b03163314611bd55760405162461bcd60e51b815260040161081e90612287565b5f611be142600f6122d2565b90505f73165c3410fc91ef562c50559f7d2289febed552d96338ed17398585611c08611f31565b611c10610e72565b876040518663ffffffff1660e01b8152600401611c31959493929190612327565b5f604051808303815f875af1158015611c4c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611c739190810190612362565b90507f61d7807933e181594731ff5dfca72dfaabdcaf3e72951decc38ff78fcbba88ad848260018451611ca6919061247f565b81518110611cb657611cb661244b565b6020026020010151604051611cd5929190918252602082015260400190565b60405180910390a150505050565b60405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d960048201525f1960248201526001600160a01b0382169063095ea7b390604401610e32565b4780611d695760405162461bcd60e51b815260206004820152600e60248201526d4e6f20504c532062616c616e636560901b604482015260640161081e565b5f73a1077a294dde1b09bb078844df40758a5d0f9a279050806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004015f604051808303818588803b158015611dba575f80fd5b505af1158015611dcc573d5f803e3d5ffd5b50505050505050565b5f546001600160a01b03163314611dfe5760405162461bcd60e51b815260040161081e90612287565b600755565b5f546001600160a01b03163314611e2c5760405162461bcd60e51b815260040161081e90612287565b5f80546001600160a01b0319166001600160a01b0392909216919091179055565b60405163095ea7b360e01b81527398bf93ebf5c380c0e6ae8e192a7e2ae08edacc0260048201525f1960248201526001600160a01b0382169063095ea7b390604401610e32565b60408051600280825260608083018452925f92919060208301908036833701905050905082815f81518110611ecb57611ecb61244b565b60200260200101906001600160a01b031690816001600160a01b03168152505073a1077a294dde1b09bb078844df40758a5d0f9a2781600181518110611f1357611f1361244b565b6001600160a01b039092166020928302919091019091015292915050565b60408051600280825260608083018452925f92919060208301908036833701905050905073a1077a294dde1b09bb078844df40758a5d0f9a27815f81518110611f7c57611f7c61244b565b60200260200101906001600160a01b031690816001600160a01b03168152505073faac6a85c3e123ab2cf7669b1024f146cfef0b3881600181518110611fc457611fc461244b565b6001600160a01b0390921660209283029190910190910152919050565b6001600160a01b0381168114611ff5575f80fd5b50565b5f60208284031215612008575f80fd5b813561201381611fe1565b9392505050565b8015158114611ff5575f80fd5b5f60208284031215612037575f80fd5b81356120138161201a565b5f805f60608486031215612054575f80fd5b83359250602084013561206681611fe1565b929592945050506040919091013590565b5f8060408385031215612088575f80fd5b823561209381611fe1565b946020939093013593505050565b5f80604083850312156120b2575f80fd5b82356120bd81611fe1565b915060208301356120cd8161201a565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612115576121156120d8565b604052919050565b5f67ffffffffffffffff821115612136576121366120d8565b5060051b60200190565b5f8060408385031215612151575f80fd5b8235915060208084013567ffffffffffffffff81111561216f575f80fd5b8401601f8101861361217f575f80fd5b803561219261218d8261211d565b6120ec565b81815260059190911b820183019083810190888311156121b0575f80fd5b928401925b828410156121d75783356121c881611fe1565b825292840192908401906121b5565b80955050505050509250929050565b5f602082840312156121f6575f80fd5b5035919050565b5f806040838503121561220e575f80fd5b8235915060208301356120cd8161201a565b5f8060408385031215612231575f80fd5b823561223c81611fe1565b915060208301356120cd81611fe1565b5f806040838503121561225d575f80fd5b50508035926020909101359150565b5f6020828403121561227c575f80fd5b815161201381611fe1565b60208082526017908201527f617574686f72697a65642061646472657373206f6e6c79000000000000000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610d4a57610d4a6122be565b5f8151808452602080850194508084015f5b8381101561231c5781516001600160a01b0316875295820195908201906001016122f7565b509495945050505050565b85815284602082015260a060408201525f61234560a08301866122e5565b6001600160a01b0394909416606083015250608001529392505050565b5f6020808385031215612373575f80fd5b825167ffffffffffffffff811115612389575f80fd5b8301601f81018513612399575f80fd5b80516123a761218d8261211d565b81815260059190911b820183019083810190878311156123c5575f80fd5b928401925b828410156123e3578351825292840192908401906123ca565b979650505050505050565b60208082526022908201527f6f6e6c79207468727520646563656e7472616c697a656420476f7665726e616e604082015261636560f01b606082015260800190565b5f60208284031215612440575f80fd5b81516120138161201a565b634e487b7160e01b5f52603260045260245ffd5b828152604060208201525f61247760408301846122e5565b949350505050565b81810381811115610d4a57610d4a6122be565b5f602082840312156124a2575f80fd5b5051919050565b8082028115828204841417610d4a57610d4a6122be565b5f826124da57634e487b7160e01b5f52601260045260245ffd5b500490565b5f81518084525f5b81811015612503576020818501810151868301820152016124e7565b505f602082860101526020601f19601f83011685010191505092915050565b60e08152845160e08201525f60208601516002811061254f57634e487b7160e01b5f52602160045260245ffd5b61010083015260408601516001600160a01b031661012083015260608601516125846101408401826001600160a01b03169052565b50608086015161016083015260a086015160c06101808401526125ab6101a08401826124df565b9150506125eb602083018680516001600160a01b039081168352602080830151151590840152604080830151909116908301526060908101511515910152565b60a082019390935260c001529291505056fea2646970667358221220a3c7bea6e9bc9918112f55bb25402174963520386027b5cd525f3c8a4a4ba6db64736f6c63430008140033