Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 10,435 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Exit Farm | 24735423 | 1 hr ago | IN | 0 ETH | 0.00002917 | ||||
| Claim Rewards | 24735364 | 1 hr ago | IN | 0 ETH | 0.00001263 | ||||
| Claim Rewards | 24734812 | 3 hrs ago | IN | 0 ETH | 0.00008489 | ||||
| Claim Rewards | 24733676 | 6 hrs ago | IN | 0 ETH | 0.00009742 | ||||
| Claim Rewards | 24732805 | 9 hrs ago | IN | 0 ETH | 0.0000027 | ||||
| Claim Rewards | 24732787 | 9 hrs ago | IN | 0 ETH | 0.00000294 | ||||
| Claim Rewards | 24732649 | 10 hrs ago | IN | 0 ETH | 0.00000301 | ||||
| Farm Deposit | 24732644 | 10 hrs ago | IN | 0 ETH | 0.00000379 | ||||
| Farm Deposit | 24732641 | 10 hrs ago | IN | 0 ETH | 0.00000375 | ||||
| Farm Deposit | 24732639 | 10 hrs ago | IN | 0 ETH | 0.00000382 | ||||
| Farm Deposit | 24732634 | 10 hrs ago | IN | 0 ETH | 0.00000364 | ||||
| Farm Deposit | 24732632 | 10 hrs ago | IN | 0 ETH | 0.00000385 | ||||
| Claim Rewards | 24732625 | 10 hrs ago | IN | 0 ETH | 0.00000293 | ||||
| Claim Rewards | 24732367 | 11 hrs ago | IN | 0 ETH | 0.00000301 | ||||
| Claim Rewards | 24731110 | 15 hrs ago | IN | 0 ETH | 0.00000356 | ||||
| Farm Deposit | 24730662 | 16 hrs ago | IN | 0 ETH | 0.0000051 | ||||
| Exit Farm | 24730478 | 17 hrs ago | IN | 0 ETH | 0.00012761 | ||||
| Claim Rewards | 24730474 | 17 hrs ago | IN | 0 ETH | 0.0000782 | ||||
| Farm Deposit | 24730134 | 18 hrs ago | IN | 0 ETH | 0.00009201 | ||||
| Claim Rewards | 24729946 | 19 hrs ago | IN | 0 ETH | 0.00000642 | ||||
| Exit Farm | 24729143 | 22 hrs ago | IN | 0 ETH | 0.00001323 | ||||
| Claim Rewards | 24729137 | 22 hrs ago | IN | 0 ETH | 0.00001187 | ||||
| Claim Rewards | 24729038 | 22 hrs ago | IN | 0 ETH | 0.00001298 | ||||
| Claim Rewards | 24729022 | 22 hrs ago | IN | 0 ETH | 0.00001224 | ||||
| Farm Deposit | 24728025 | 25 hrs ago | IN | 0 ETH | 0.00013108 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DynamicRewardFarm
Compiler Version
v0.8.26+commit.8a97fa7a
Optimization Enabled:
Yes with 9999999 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: -- BCOM --
pragma solidity =0.8.26;
import "./TokenWrapper.sol";
error NoRewards();
error UnknownToken();
error ExistingToken();
error InvalidAddress();
contract DynamicRewardFarm is TokenWrapper {
IERC20 public stakeToken;
uint256 public periodFinished;
uint256 public rewardDuration;
uint256 public lastUpdateTime;
uint256 constant MAX_TOKENS = 20;
uint256 constant PRECISIONS = 1E18;
address public ownerAddress;
address public proposedOwner;
address public managerAddress;
uint256 public tokenCount;
address[] public rewardTokens;
address constant DEAD_ADDRESS = address(
0x000000000000000000000000000000000000dEaD
);
struct RewardData {
uint256 rewardRate;
uint256 perTokenStored;
mapping(address => uint256) userRewards;
mapping(address => uint256) perTokenPaid;
}
mapping(address => RewardData) public rewards;
modifier onlyOwner() {
_onlyOwner();
_;
}
modifier onlyManager() {
_onlyManager();
_;
}
modifier updateFarm() {
_updateFarm();
_;
}
modifier updateUser() {
_updateUser(msg.sender);
_;
}
modifier updateSender(address _sender) {
_updateUser(_sender);
_;
}
event RewardTokenAdded(
address indexed rewardToken,
uint256 tokenCount
);
/**
* @dev No modifier necessary since this contract is
* cloned by the factory contract calling initialize
*/
function initialize(
address _stakeToken,
uint256 _defaultDuration,
address _ownerAddress,
address _managerAddress,
string calldata _name,
string calldata _symbol
)
external
// onlyFactory
{
require(
_defaultDuration > 0,
"DynamicRewardFarm: INVALID_DURATION"
);
require(
rewardDuration == 0,
"DynamicRewardFarm: ALREADY_INITIALIZED"
);
rewardDuration = _defaultDuration;
name = _name;
symbol = _symbol;
stakeToken = IERC20(
_stakeToken
);
ownerAddress = _ownerAddress;
managerAddress = _managerAddress;
_stake(
PRECISIONS,
DEAD_ADDRESS
);
}
/**
* @dev Adds a new reward token to the farm
*/
function addRewardToken(
address _rewardToken
)
external
onlyOwner
{
require(
tokenCount < MAX_TOKENS,
"DynamicRewardFarm: MAX_TOKENS_REACHED"
);
_validateRewardToken(
_rewardToken
);
rewardTokens.push(
_rewardToken
);
tokenCount = tokenCount + 1;
emit RewardTokenAdded(
_rewardToken,
tokenCount
);
}
/**
* @dev Checks if the token is already added
*/
function _validateRewardToken(
address _tokenAddress
)
private
view
{
if (_tokenAddress == ZERO_ADDRESS) {
revert InvalidAddress();
}
for (uint256 i; i < rewardTokens.length; i++) {
if (_tokenAddress == rewardTokens[i]) {
revert ExistingToken();
}
}
}
function getRewardTokens()
external
view
returns (address[] memory)
{
address[] memory tokens = new address[](
rewardTokens.length
);
for (uint256 i; i < rewardTokens.length; i++) {
tokens[i] = rewardTokens[i];
}
return tokens;
}
/**
* @dev Tracks timestamp for when reward was applied last time
*/
function lastTimeRewardApplicable()
public
view
returns (uint256 res)
{
res = block.timestamp < periodFinished
? block.timestamp
: periodFinished;
}
/**
* @dev Relative value on reward for single
* staked token for a given {_rewardToken}
*/
function rewardPerToken(
address _rewardToken
)
public
view
returns (uint256)
{
RewardData storage r = rewards[
_rewardToken
];
uint256 timeFrame = lastTimeRewardApplicable()
- lastUpdateTime;
uint256 extraFund = timeFrame
* r.rewardRate
* PRECISIONS
/ _totalStaked;
return r.perTokenStored
+ extraFund;
}
/**
* @dev Returns an array of earned amounts for
* all reward tokens by given {_walletAddress}
*/
function earned(
address _walletAddress
)
external
view
returns (uint256[] memory)
{
uint256[] memory earnedAmounts = new uint256[](
rewardTokens.length
);
for (uint256 i; i < rewardTokens.length; i++) {
earnedAmounts[i] = earnedByToken(
rewardTokens[i],
_walletAddress
);
}
return earnedAmounts;
}
/**
* @dev Reports earned amount of a reward
* token by wallet address not yet collected
*/
function earnedByToken(
address _rewardToken,
address _walletAddress
)
public
view
returns (uint256)
{
RewardData storage r = rewards[
_rewardToken
];
uint256 difference = rewardPerToken(_rewardToken)
- r.perTokenPaid[_walletAddress];
return _balances[_walletAddress]
* difference
/ PRECISIONS
+ r.userRewards[_walletAddress];
}
/**
* @dev Performs deposit of staked token into the farm
*/
function farmDeposit(
uint256 _stakeAmount
)
external
updateFarm()
updateUser()
{
address senderAddress = msg.sender;
_stake(
_stakeAmount,
senderAddress
);
safeTransferFrom(
stakeToken,
senderAddress,
address(this),
_stakeAmount
);
emit Staked(
senderAddress,
_stakeAmount
);
}
function farmWithdraw(
uint256 _withdrawAmount
)
public
updateFarm()
updateUser()
{
address senderAddress = msg.sender;
_withdraw(
_withdrawAmount,
senderAddress
);
safeTransfer(
stakeToken,
senderAddress,
_withdrawAmount
);
emit Withdrawn(
senderAddress,
_withdrawAmount
);
}
function exitFarm()
external
{
uint256 withdrawAmount = _balances[
msg.sender
];
farmWithdraw(
withdrawAmount
);
claimRewards();
}
function claimRewards()
public
updateFarm()
updateUser()
{
address senderAddress = msg.sender;
for (uint256 i; i < rewardTokens.length; i++) {
address tokenAddress = rewardTokens[i];
RewardData storage r = rewards[
tokenAddress
];
uint256 rewardAmount = earnedByToken(
tokenAddress,
senderAddress
);
if (rewardAmount > 0) {
r.userRewards[senderAddress] = 0;
safeTransfer(
IERC20(tokenAddress),
senderAddress,
rewardAmount
);
emit RewardPaid(
senderAddress,
tokenAddress,
rewardAmount
);
}
}
}
function proposeNewOwner(
address _newOwner
)
external
onlyOwner
{
if (_newOwner == ZERO_ADDRESS) {
revert InvalidAddress();
}
proposedOwner = _newOwner;
emit OwnerProposed(
_newOwner
);
}
function claimOwnership()
external
{
require(
msg.sender == proposedOwner,
"DynamicRewardFarm: INVALID_CANDIDATE"
);
ownerAddress = proposedOwner;
emit OwnerChanged(
ownerAddress
);
}
function changeManager(
address _newManager
)
external
onlyOwner
{
if (_newManager == ZERO_ADDRESS) {
revert InvalidAddress();
}
managerAddress = _newManager;
emit ManagerChanged(
_newManager
);
}
function recoverToken(
address _tokenAddress,
uint256 _recoveryAmount
)
external
onlyOwner
{
IERC20 tokenAddress = IERC20(
_tokenAddress
);
if (tokenAddress == stakeToken) {
revert("DynamicRewardFarm: STAKE_TOKEN");
}
for (uint256 i; i < rewardTokens.length; i++) {
if (_tokenAddress == rewardTokens[i]) {
uint256 earnedByDead = earnedByToken(
_tokenAddress,
DEAD_ADDRESS
);
require(
_recoveryAmount <= earnedByDead,
"DynamicRewardFarm: NOT_ENOUGH_REWARDS"
);
_updateFarm();
_updateUser(DEAD_ADDRESS);
rewards[_tokenAddress].userRewards[DEAD_ADDRESS] =
rewards[_tokenAddress].userRewards[DEAD_ADDRESS] - _recoveryAmount;
break;
}
}
safeTransfer(
tokenAddress,
ownerAddress,
_recoveryAmount
);
emit Recovered(
tokenAddress,
_recoveryAmount
);
}
function setRewardDuration(
uint256 _rewardDuration
)
external
onlyOwner
{
require(
_rewardDuration > 0,
"DynamicRewardFarm: INVALID_DURATION"
);
require(
block.timestamp > periodFinished,
"DynamicRewardFarm: ONGOING_DISTRIBUTION"
);
rewardDuration = _rewardDuration;
emit RewardsDurationUpdated(
_rewardDuration
);
}
function _onlyExistingToken(
address _tokenAddress
)
private
view
{
for (uint256 i; i < rewardTokens.length; i++) {
if (_tokenAddress == rewardTokens[i]) {
return;
}
}
revert UnknownToken();
}
/**
* @dev Internal function to set reward rate for a token
*/
function _setRewardRate(
address _rewardToken,
uint256 _newRewardRate
)
private
{
_onlyExistingToken(
_rewardToken
);
IERC20 tokenAddress = IERC20(
_rewardToken
);
RewardData storage r = rewards[
_rewardToken
];
if (block.timestamp < periodFinished) {
require(
r.rewardRate <= _newRewardRate,
"DynamicRewardFarm: RATE_CANT_DECREASE"
);
uint256 remainingTime = periodFinished
- block.timestamp;
uint256 remainingRewards = remainingTime
* r.rewardRate;
safeTransfer(
tokenAddress,
managerAddress,
remainingRewards
);
}
r.rewardRate = _newRewardRate;
uint256 newRewardAmount = rewardDuration
* _newRewardRate;
safeTransferFrom(
tokenAddress,
managerAddress,
address(this),
newRewardAmount
);
emit RewardAdded(
_rewardToken,
_newRewardRate,
newRewardAmount
);
}
/**
* @dev Sets the reward rates for multiple reward tokens
*/
function setRewardRates(
address[] calldata _rewardTokens,
uint256[] calldata _newRewardRates
)
external
onlyManager
updateFarm()
{
require(
_rewardTokens.length == _newRewardRates.length,
"DynamicRewardFarm: ARRAY_LENGTH_MISMATCH"
);
require(
_rewardTokens.length == rewardTokens.length,
"DynamicRewardFarm: TOKEN_LENGTH_MISMATCH"
);
_shouldHaveSomeRewards(
_newRewardRates
);
for (uint256 i; i < _rewardTokens.length; i++) {
require(
_rewardTokens[i] == rewardTokens[i],
"DynamicRewardFarm: INVALID_TOKEN_ORDER"
);
_setRewardRate(
_rewardTokens[i],
_newRewardRates[i]
);
}
lastUpdateTime = block.timestamp;
periodFinished = block.timestamp + rewardDuration;
}
/**
* @dev Checks if there are any rewards to distribute
*/
function _shouldHaveSomeRewards(
uint256[] calldata _newRewardRates
)
private
pure
{
for (uint256 i; i < _newRewardRates.length; i++) {
if (_newRewardRates[i] > 0) {
return;
}
}
revert NoRewards();
}
/**
* @dev Allows to transfer receipt tokens
*/
function transfer(
address _recipient,
uint256 _amount
)
external
updateFarm()
updateUser()
updateSender(_recipient)
returns (bool)
{
_transfer(
msg.sender,
_recipient,
_amount
);
return true;
}
/**
* @dev Allows to transfer receipt tokens on owner's behalf
*/
function transferFrom(
address _sender,
address _recipient,
uint256 _amount
)
external
updateFarm()
updateSender(_sender)
updateSender(_recipient)
returns (bool)
{
if (_allowances[_sender][msg.sender] != type(uint256).max) {
_allowances[_sender][msg.sender] -= _amount;
}
_transfer(
_sender,
_recipient,
_amount
);
return true;
}
function _updateFarm()
private
{
for (uint256 i; i < rewardTokens.length; i++) {
address rewardToken = rewardTokens[i];
rewards[rewardToken].perTokenStored = rewardPerToken(
rewardToken
);
}
lastUpdateTime = lastTimeRewardApplicable();
}
function _updateUser(
address _user
)
private
{
for (uint256 i; i < rewardTokens.length; i++) {
address tokenAddress = rewardTokens[i];
RewardData storage r = rewards[
tokenAddress
];
r.userRewards[_user] = earnedByToken(
tokenAddress,
_user
);
r.perTokenPaid[_user] = r.perTokenStored;
}
}
function _onlyOwner()
private
view
{
require(
msg.sender == ownerAddress,
"DynamicRewardFarm: INVALID_OWNER"
);
}
function _onlyManager()
private
view
{
require(
msg.sender == managerAddress,
"DynamicRewardFarm: INVALID_MANAGER"
);
}
}// SPDX-License-Identifier: -- BCOM --
pragma solidity =0.8.26;
import "./SafeERC20.sol";
contract TokenWrapper is SafeERC20 {
string public name;
string public symbol;
uint8 public constant decimals = 18;
uint256 _totalStaked;
mapping(address => uint256) _balances;
mapping(address => mapping(address => uint256)) _allowances;
address constant ZERO_ADDRESS = address(0x0);
event Transfer(
address indexed from,
address indexed to,
uint256 value
);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Staked(
address indexed user,
uint256 tokenAmount
);
event Withdrawn(
address indexed user,
uint256 tokenAmount
);
event RewardAdded(
address indexed rewardToken,
uint256 rewardRate,
uint256 tokenAmount
);
event RewardPaid(
address indexed user,
address indexed rewardToken,
uint256 tokenAmount
);
event Recovered(
IERC20 indexed token,
uint256 tokenAmount
);
event RewardsDurationUpdated(
uint256 newRewardDuration
);
event OwnerProposed(
address proposedOwner
);
event OwnerChanged(
address newOwner
);
event ManagerChanged(
address newManager
);
/**
* @dev Returns total amount of staked tokens
*/
function totalSupply()
external
view
returns (uint256)
{
return _totalStaked;
}
/**
* @dev Returns staked amount by wallet address
*/
function balanceOf(
address _walletAddress
)
external
view
returns (uint256)
{
return _balances[_walletAddress];
}
/**
* @dev Increases staked amount by wallet address
*/
function _stake(
uint256 _amount,
address _address
)
internal
{
_totalStaked =
_totalStaked + _amount;
unchecked {
_balances[_address] =
_balances[_address] + _amount;
}
emit Transfer(
ZERO_ADDRESS,
_address,
_amount
);
}
/**
* @dev Decreases total staked amount
*/
function _withdraw(
uint256 _amount,
address _address
)
internal
{
_burn(
_amount,
_address
);
}
/**
* @dev Decreases total staked amount
*/
function _burn(
uint256 _amount,
address _address
)
internal
{
unchecked {
_totalStaked =
_totalStaked - _amount;
}
_balances[_address] =
_balances[_address] - _amount;
emit Transfer(
_address,
ZERO_ADDRESS,
_amount
);
}
/**
* @dev Updates balances during transfer
*/
function _transfer(
address _sender,
address _recipient,
uint256 _amount
)
internal
{
_balances[_sender] =
_balances[_sender] - _amount;
unchecked {
_balances[_recipient] =
_balances[_recipient] + _amount;
}
emit Transfer(
_sender,
_recipient,
_amount
);
}
/**
* @dev Grants permission for receipt tokens transfer on owner's behalf
*/
function approve(
address _spender,
uint256 _amount
)
external
returns (bool)
{
_approve(
msg.sender,
_spender,
_amount
);
return true;
}
/**
* @dev Checks value for receipt tokens transfer on owner's behalf
*/
function allowance(
address _owner,
address _spender
)
external
view
returns (uint256)
{
return _allowances[_owner][_spender];
}
/**
* @dev Allowance update for receipt tokens transfer on owner's behalf
*/
function _approve(
address _owner,
address _spender,
uint256 _amount
)
internal
{
_allowances[_owner][_spender] = _amount;
emit Approval(
_owner,
_spender,
_amount
);
}
/**
* @dev Increases value for receipt tokens transfer on owner's behalf
*/
function increaseAllowance(
address _spender,
uint256 _addedValue
)
external
returns (bool)
{
_approve(
msg.sender,
_spender,
_allowances[msg.sender][_spender] + _addedValue
);
return true;
}
/**
* @dev Decreases value for receipt tokens transfer on owner's behalf
*/
function decreaseAllowance(
address _spender,
uint256 _subtractedValue
)
external
returns (bool)
{
_approve(
msg.sender,
_spender,
_allowances[msg.sender][_spender] - _subtractedValue
);
return true;
}
}// SPDX-License-Identifier: -- BCOM --
pragma solidity =0.8.26;
import "./IERC20.sol";
error SafeERC20FailedOperation(
address token
);
contract SafeERC20 {
/**
* @dev Allows to execute transfer for a token
*/
function safeTransfer(
IERC20 _token,
address _to,
uint256 _value
)
internal
{
_callOptionalReturn(
_token,
abi.encodeWithSelector(
_token.transfer.selector,
_to,
_value
)
);
}
/**
* @dev Allows to execute transferFrom for a token
*/
function safeTransferFrom(
IERC20 _token,
address _from,
address _to,
uint256 _value
)
internal
{
_callOptionalReturn(
_token,
abi.encodeWithSelector(
_token.transferFrom.selector,
_from,
_to,
_value
)
);
}
function _callOptionalReturn(
IERC20 _token,
bytes memory _data
)
private
{
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
let success := call(
gas(),
_token,
0,
add(_data, 0x20),
mload(_data),
0,
0x20
)
// bubble errors
if iszero(success) {
let ptr := mload(0x40)
returndatacopy(
ptr,
0,
returndatasize()
)
revert(
ptr,
returndatasize()
)
}
returnSize := returndatasize()
returnValue := mload(0)
}
if (returnSize == 0
? address(_token).code.length == 0
: returnValue != 1
) {
revert SafeERC20FailedOperation(
address(_token)
);
}
}
}// SPDX-License-Identifier: -- BCOM --
pragma solidity =0.8.26;
interface IERC20 {
/**
* @dev Interface fo transfer function
*/
function transfer(
address _recipient,
uint256 _amount
)
external
returns (bool);
/**
* @dev Interface for transferFrom function
*/
function transferFrom(
address _sender,
address _recipient,
uint256 _amount
)
external
returns (bool);
/**
* @dev Interface for approve function
*/
function approve(
address _spender,
uint256 _amount
)
external
returns (bool);
function balanceOf(
address _account
)
external
view
returns (uint256);
function mint(
address _user,
uint256 _amount
)
external;
}{
"remappings": [
"@chainlink/=node_modules/@chainlink/",
"@ensdomains/=node_modules/@ensdomains/",
"@eth-optimism/=node_modules/@eth-optimism/",
"@openzeppelin/=node_modules/@openzeppelin/",
"ds-test/=lib/forge-std/lib/ds-test/src/",
"eth-gas-reporter/=node_modules/eth-gas-reporter/",
"forge-std/=lib/forge-std/src/",
"hardhat/=node_modules/hardhat/",
"truffle/=node_modules/truffle/"
],
"optimizer": {
"enabled": true,
"runs": 9999999
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"name":"ExistingToken","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"NoRewards","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"UnknownToken","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":false,"internalType":"address","name":"newManager","type":"address"}],"name":"ManagerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"proposedOwner","type":"address"}],"name":"OwnerProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rewardToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenCount","type":"uint256"}],"name":"RewardTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRewardDuration","type":"uint256"}],"name":"RewardsDurationUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"Staked","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"addRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletAddress","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newManager","type":"address"}],"name":"changeManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_walletAddress","type":"address"}],"name":"earned","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"},{"internalType":"address","name":"_walletAddress","type":"address"}],"name":"earnedByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exitFarm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeAmount","type":"uint256"}],"name":"farmDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawAmount","type":"uint256"}],"name":"farmWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getRewardTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_stakeToken","type":"address"},{"internalType":"uint256","name":"_defaultDuration","type":"uint256"},{"internalType":"address","name":"_ownerAddress","type":"address"},{"internalType":"address","name":"_managerAddress","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"res","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"periodFinished","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"proposeNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"proposedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_recoveryAmount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_rewardToken","type":"address"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"rewardRate","type":"uint256"},{"internalType":"uint256","name":"perTokenStored","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardDuration","type":"uint256"}],"name":"setRewardDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"_newRewardRates","type":"uint256[]"}],"name":"setRewardRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCount","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":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6080604052348015600e575f80fd5b50612a4b8061001c5f395ff3fe608060405234801561000f575f80fd5b5060043610610282575f3560e01c806390717dd311610157578063b29a8140116100d2578063cf73a1bc11610088578063dd62ed3e1161006e578063dd62ed3e146105a3578063f1229777146105e8578063f520e7e5146105fb575f80fd5b8063cf73a1bc14610563578063d153b60c14610583575f80fd5b8063c4f59f9b116100b8578063c4f59f9b1461053d578063c8f33c9114610552578063cddaf3581461055b575f80fd5b8063b29a814014610517578063c0ed00c91461052a575f80fd5b8063a457c2d711610127578063a9a901971161010d578063a9a90197146104de578063b1899bd6146104f1578063b1f8100d14610504575f80fd5b8063a457c2d7146104b8578063a9059cbb146104cb575f80fd5b806390717dd31461048157806395d89b41146104945780639f181b5e1461049c578063a3fbbaae146104a5575f80fd5b8063313ce5671161020157806351ed6a30116101b75780637bb7bed11161019d5780637bb7bed11461044657806380faa57d146104595780638f84aa0914610461575f80fd5b806351ed6a30146103cc57806370a0823114610411575f80fd5b806339509351116101e7578063395093511461039e5780633b9e9b45146103b15780634e71e0c8146103c4575f80fd5b8063313ce5671461037c578063372500ab14610396575f80fd5b80630962c4f9116102565780631c03e6cc1161023c5780631c03e6cc1461034157806323b872dd146103565780632b8c8a6414610369575f80fd5b80630962c4f91461032257806318160ddd14610339575f80fd5b80628cc2621461028657806306fdde03146102af5780630700037d146102c4578063095ea7b3146102ff575b5f80fd5b610299610294366004612426565b610604565b6040516102a69190612446565b60405180910390f35b6102b76106c5565b6040516102a69190612488565b6102ea6102d2366004612426565b600e6020525f90815260409020805460019091015482565b604080519283526020830191909152016102a6565b61031261030d3660046124db565b610750565b60405190151581526020016102a6565b61032b60065481565b6040519081526020016102a6565b60025461032b565b61035461034f366004612426565b610766565b005b610312610364366004612503565b6108dd565b61035461037736600461253d565b6109ac565b610384601281565b60405160ff90911681526020016102a6565b610354610a40565b6103126103ac3660046124db565b610b60565b61032b6103bf366004612554565b610ba8565b610354610c60565b6005546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102a6565b61032b61041f366004612426565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b6103ec61045436600461253d565b610d81565b61032b610db6565b6009546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b61035461048f36600461253d565b610dcc565b6102b7610e55565b61032b600c5481565b6103546104b3366004612426565b610e62565b6103126104c63660046124db565b610f31565b6103126104d93660046124db565b610f74565b6103546104ec3660046125ca565b610fa5565b6103546104ff3660046126b4565b611164565b610354610512366004612426565b611412565b6103546105253660046124db565b6114da565b61035461053836600461253d565b611763565b6105456118c0565b6040516102a69190612720565b61032b60085481565b610354611998565b600b546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b600a546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b61032b6105b1366004612554565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260046020908152604080832093909416825291909152205490565b61032b6105f6366004612426565b6119bb565b61032b60075481565b600d546060905f9067ffffffffffffffff8111156106245761062461276d565b60405190808252806020026020018201604052801561064d578160200160208202803683370190505b5090505f5b600d548110156106be57610699600d82815481106106725761067261279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff1685610ba8565b8282815181106106ab576106ab61279a565b6020908102919091010152600101610652565b5092915050565b5f80546106d1906127c7565b80601f01602080910402602001604051908101604052809291908181526020018280546106fd906127c7565b80156107485780601f1061071f57610100808354040283529160200191610748565b820191905f5260205f20905b81548152906001019060200180831161072b57829003601f168201915b505050505081565b5f61075c338484611a3a565b5060015b92915050565b61076e611aa8565b6014600c5410610805576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44796e616d69635265776172644661726d3a204d41585f544f4b454e535f524560448201527f414348454400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61080e81611b2b565b600d8054600180820183555f929092527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055600c5461088a9161283f565b600c81905560405190815273ffffffffffffffffffffffffffffffffffffffff8216907f68e3e9397770d9dfa88c0953a34e1a70a05416b3895957f5b689787a920791c49060200160405180910390a250565b5f6108e6611bfc565b836108f081611c8a565b836108fa81611c8a565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146109955773ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091528120805486929061098f908490612852565b90915550505b6109a0868686611d34565b50600195945050505050565b6109b4611bfc565b6109bd33611c8a565b336109c88282611dcf565b6005546109ec9073ffffffffffffffffffffffffffffffffffffffff168284611dd9565b8073ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d583604051610a3491815260200190565b60405180910390a25050565b610a48611bfc565b610a5133611c8a565b335f5b600d54811015610b5c575f600d8281548110610a7257610a7261279a565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600e9091526040822090925090610aaf8386610ba8565b90508015610b515773ffffffffffffffffffffffffffffffffffffffff85165f908152600283016020526040812055610ae9838683611dd9565b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610b4891815260200190565b60405180910390a35b505050600101610a54565b5050565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161075c918590610ba390869061283f565b611a3a565b73ffffffffffffffffffffffffffffffffffffffff8083165f908152600e602090815260408083209385168352600384019091528120549091908290610bed866119bb565b610bf79190612852565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260028401602090815260408083205460039092529091205491925090670de0b6b3a764000090610c43908490612865565b610c4d919061287c565b610c57919061283f565b95945050505050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44796e616d69635265776172644661726d3a20494e56414c49445f43414e444960448201527f444154450000000000000000000000000000000000000000000000000000000060648201526084016107fc565b600a54600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf369060200160405180910390a1565b600d8181548110610d90575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f6006544210610dc7575060065490565b504290565b610dd4611bfc565b610ddd33611c8a565b33610de88282611eb2565b600554610e0d9073ffffffffffffffffffffffffffffffffffffffff16823085611f24565b8073ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d83604051610a3491815260200190565b600180546106d1906127c7565b610e6a611aa8565b73ffffffffffffffffffffffffffffffffffffffff8116610eb7576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f198db6e425fb8aafd1823c6ca50be2d51e5764571a5ae0f0f21c6812e45def0b906020015b60405180910390a150565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161075c918590610ba3908690612852565b5f610f7d611bfc565b610f8633611c8a565b82610f9081611c8a565b610f9b338585611d34565b5060019392505050565b5f8711611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f44796e616d69635265776172644661726d3a20494e56414c49445f445552415460448201527f494f4e000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b600754156110c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f44796e616d69635265776172644661726d3a20414c52454144595f494e49544960448201527f414c495a4544000000000000000000000000000000000000000000000000000060648201526084016107fc565b60078790555f6110d58486836128ff565b5060016110e38284836128ff565b506005805473ffffffffffffffffffffffffffffffffffffffff808b167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560098054898416908316179055600b80549288169290911691909117905561115a670de0b6b3a764000061dead611eb2565b5050505050505050565b61116c611f88565b611174611bfc565b828114611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f44796e616d69635265776172644661726d3a2041525241595f4c454e4754485f60448201527f4d49534d4154434800000000000000000000000000000000000000000000000060648201526084016107fc565b600d548314611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f44796e616d69635265776172644661726d3a20544f4b454e5f4c454e4754485f60448201527f4d49534d4154434800000000000000000000000000000000000000000000000060648201526084016107fc565b61129e828261202f565b5f5b838110156113f657600d81815481106112bb576112bb61279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff168585838181106112ee576112ee61279a565b90506020020160208101906113039190612426565b73ffffffffffffffffffffffffffffffffffffffff16146113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f44796e616d69635265776172644661726d3a20494e56414c49445f544f4b454e60448201527f5f4f52444552000000000000000000000000000000000000000000000000000060648201526084016107fc565b6113ee8585838181106113bb576113bb61279a565b90506020020160208101906113d09190612426565b8484848181106113e2576113e261279a565b90506020020135612099565b6001016112a0565b504260088190556007546114099161283f565b60065550505050565b61141a611aa8565b73ffffffffffffffffffffffffffffffffffffffff8116611467576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f35b5da26a401fdbef2e1cfabeec2c10a6121d56f136be501a393c284cdd1af5890602001610f26565b6114e2611aa8565b600554829073ffffffffffffffffffffffffffffffffffffffff90811690821603611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f44796e616d69635265776172644661726d3a205354414b455f544f4b454e000060448201526064016107fc565b5f5b600d548110156116e857600d81815481106115885761158861279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff908116908516036116e0575f6115c08561dead610ba8565b905080841115611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44796e616d69635265776172644661726d3a204e4f545f454e4f5547485f524560448201527f574152445300000000000000000000000000000000000000000000000000000060648201526084016107fc565b61165a611bfc565b61166561dead611c8a565b73ffffffffffffffffffffffffffffffffffffffff85165f908152600e6020908152604080832061dead84526002019091529020546116a5908590612852565b73ffffffffffffffffffffffffffffffffffffffff86165f908152600e6020908152604080832061dead8452600201909152902055506116e8565b60010161156b565b5060095461170e90829073ffffffffffffffffffffffffffffffffffffffff1684611dd9565b8073ffffffffffffffffffffffffffffffffffffffff167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288360405161175691815260200190565b60405180910390a2505050565b61176b611aa8565b5f81116117fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f44796e616d69635265776172644661726d3a20494e56414c49445f445552415460448201527f494f4e000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b600654421161188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f44796e616d69635265776172644661726d3a204f4e474f494e475f444953545260448201527f49425554494f4e0000000000000000000000000000000000000000000000000060648201526084016107fc565b60078190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d390602001610f26565b600d546060905f9067ffffffffffffffff8111156118e0576118e061276d565b604051908082528060200260200182016040528015611909578160200160208202803683370190505b5090505f5b600d5481101561199257600d818154811061192b5761192b61279a565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168282815181106119655761196561279a565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161190e565b50919050565b335f908152600360205260409020546119b0816109ac565b6119b8610a40565b50565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600e6020526040812060085482906119ec610db6565b6119f69190612852565b90505f600254670de0b6b3a7640000845f015484611a149190612865565b611a1e9190612865565b611a28919061287c565b9050808360010154610c57919061283f565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60095473ffffffffffffffffffffffffffffffffffffffff163314611b29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f44796e616d69635265776172644661726d3a20494e56414c49445f4f574e455260448201526064016107fc565b565b73ffffffffffffffffffffffffffffffffffffffff8116611b78576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b600d54811015610b5c57600d8181548110611b9757611b9761279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff90811690831603611bf4576040517fe4ed28f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101611b7a565b5f5b600d54811015611c7c575f600d8281548110611c1c57611c1c61279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050611c48816119bb565b73ffffffffffffffffffffffffffffffffffffffff9091165f908152600e6020526040902060019081019190915501611bfe565b50611c85610db6565b600855565b5f5b600d54811015610b5c575f600d8281548110611caa57611caa61279a565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600e9091526040909120909150611ce78285610ba8565b73ffffffffffffffffffffffffffffffffffffffff85165f908152600283016020908152604080832093909355600180850154600390950190915291902091909155919091019050611c8c565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260036020526040902054611d64908290612852565b73ffffffffffffffffffffffffffffffffffffffff8481165f8181526003602090815260408083209590955592861680825290849020805486019055925184815290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611a9b565b610b5c8282612243565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611ead9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526122d6565b505050565b81600254611ec0919061283f565b60025573ffffffffffffffffffffffffffffffffffffffff81165f818152600360209081526040808320805487019055518581527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f829085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611e2b565b50505050565b600b5473ffffffffffffffffffffffffffffffffffffffff163314611b29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f44796e616d69635265776172644661726d3a20494e56414c49445f4d414e414760448201527f455200000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b5f5b81811015612066575f83838381811061204c5761204c61279a565b90506020020135111561205e57505050565b600101612031565b506040517f3fb087f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120a282612375565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600e602052604090206006548391904210156121af578054831015612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44796e616d69635265776172644661726d3a20524154455f43414e545f44454360448201527f524541534500000000000000000000000000000000000000000000000000000060648201526084016107fc565b5f426006546121739190612852565b82549091505f906121849083612865565b600b549091506121ac90859073ffffffffffffffffffffffffffffffffffffffff1683611dd9565b50505b8281556007545f906121c2908590612865565b600b549091506121eb90849073ffffffffffffffffffffffffffffffffffffffff163084611f24565b604080518581526020810183905273ffffffffffffffffffffffffffffffffffffffff8716917f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474910160405180910390a25050505050565b60028054839003905573ffffffffffffffffffffffffffffffffffffffff81165f9081526003602052604090205461227c908390612852565b73ffffffffffffffffffffffffffffffffffffffff82165f818152600360205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f189086815260200190565b5f8060205f8451602086015f885af1806122f5576040513d5f823e3d81fd5b50505f513d9150811561230c578060011415612326565b73ffffffffffffffffffffffffffffffffffffffff84163b155b15611f82576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107fc565b5f5b600d548110156123cb57600d81815481106123945761239461279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff908116908316036123c3575050565b600101612377565b506040517f8698bf3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114612421575f80fd5b919050565b5f60208284031215612436575f80fd5b61243f826123fe565b9392505050565b602080825282518282018190525f918401906040840190835b8181101561247d57835183526020938401939092019160010161245f565b509095945050505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f80604083850312156124ec575f80fd5b6124f5836123fe565b946020939093013593505050565b5f805f60608486031215612515575f80fd5b61251e846123fe565b925061252c602085016123fe565b929592945050506040919091013590565b5f6020828403121561254d575f80fd5b5035919050565b5f8060408385031215612565575f80fd5b61256e836123fe565b915061257c602084016123fe565b90509250929050565b5f8083601f840112612595575f80fd5b50813567ffffffffffffffff8111156125ac575f80fd5b6020830191508360208285010111156125c3575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156125e1575f80fd5b6125ea896123fe565b9750602089013596506125ff60408a016123fe565b955061260d60608a016123fe565b9450608089013567ffffffffffffffff811115612628575f80fd5b6126348b828c01612585565b90955093505060a089013567ffffffffffffffff811115612653575f80fd5b61265f8b828c01612585565b999c989b5096995094979396929594505050565b5f8083601f840112612683575f80fd5b50813567ffffffffffffffff81111561269a575f80fd5b6020830191508360208260051b85010111156125c3575f80fd5b5f805f80604085870312156126c7575f80fd5b843567ffffffffffffffff8111156126dd575f80fd5b6126e987828801612673565b909550935050602085013567ffffffffffffffff811115612708575f80fd5b61271487828801612673565b95989497509550505050565b602080825282518282018190525f918401906040840190835b8181101561247d57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612739565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b600181811c908216806127db57607f821691505b602082108103611992577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561076057610760612812565b8181038181111561076057610760612812565b808202811582820484141761076057610760612812565b5f826128af577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b601f821115611ead57805f5260205f20601f840160051c810160208510156128d95750805b601f840160051c820191505b818110156128f8575f81556001016128e5565b5050505050565b67ffffffffffffffff8311156129175761291761276d565b61292b8361292583546127c7565b836128b4565b5f601f84116001811461297b575f85156129455750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556128f8565b5f838152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08716915b828110156129c857868501358255602094850194600190920191016129a8565b5086821015612a03577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b018355505050505056fea2646970667358221220193db1e50b18e8f491ff2df84acc986d4aabf5810f8182f61b04f15f52412d6964736f6c634300081a0033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610282575f3560e01c806390717dd311610157578063b29a8140116100d2578063cf73a1bc11610088578063dd62ed3e1161006e578063dd62ed3e146105a3578063f1229777146105e8578063f520e7e5146105fb575f80fd5b8063cf73a1bc14610563578063d153b60c14610583575f80fd5b8063c4f59f9b116100b8578063c4f59f9b1461053d578063c8f33c9114610552578063cddaf3581461055b575f80fd5b8063b29a814014610517578063c0ed00c91461052a575f80fd5b8063a457c2d711610127578063a9a901971161010d578063a9a90197146104de578063b1899bd6146104f1578063b1f8100d14610504575f80fd5b8063a457c2d7146104b8578063a9059cbb146104cb575f80fd5b806390717dd31461048157806395d89b41146104945780639f181b5e1461049c578063a3fbbaae146104a5575f80fd5b8063313ce5671161020157806351ed6a30116101b75780637bb7bed11161019d5780637bb7bed11461044657806380faa57d146104595780638f84aa0914610461575f80fd5b806351ed6a30146103cc57806370a0823114610411575f80fd5b806339509351116101e7578063395093511461039e5780633b9e9b45146103b15780634e71e0c8146103c4575f80fd5b8063313ce5671461037c578063372500ab14610396575f80fd5b80630962c4f9116102565780631c03e6cc1161023c5780631c03e6cc1461034157806323b872dd146103565780632b8c8a6414610369575f80fd5b80630962c4f91461032257806318160ddd14610339575f80fd5b80628cc2621461028657806306fdde03146102af5780630700037d146102c4578063095ea7b3146102ff575b5f80fd5b610299610294366004612426565b610604565b6040516102a69190612446565b60405180910390f35b6102b76106c5565b6040516102a69190612488565b6102ea6102d2366004612426565b600e6020525f90815260409020805460019091015482565b604080519283526020830191909152016102a6565b61031261030d3660046124db565b610750565b60405190151581526020016102a6565b61032b60065481565b6040519081526020016102a6565b60025461032b565b61035461034f366004612426565b610766565b005b610312610364366004612503565b6108dd565b61035461037736600461253d565b6109ac565b610384601281565b60405160ff90911681526020016102a6565b610354610a40565b6103126103ac3660046124db565b610b60565b61032b6103bf366004612554565b610ba8565b610354610c60565b6005546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102a6565b61032b61041f366004612426565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b6103ec61045436600461253d565b610d81565b61032b610db6565b6009546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b61035461048f36600461253d565b610dcc565b6102b7610e55565b61032b600c5481565b6103546104b3366004612426565b610e62565b6103126104c63660046124db565b610f31565b6103126104d93660046124db565b610f74565b6103546104ec3660046125ca565b610fa5565b6103546104ff3660046126b4565b611164565b610354610512366004612426565b611412565b6103546105253660046124db565b6114da565b61035461053836600461253d565b611763565b6105456118c0565b6040516102a69190612720565b61032b60085481565b610354611998565b600b546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b600a546103ec9073ffffffffffffffffffffffffffffffffffffffff1681565b61032b6105b1366004612554565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260046020908152604080832093909416825291909152205490565b61032b6105f6366004612426565b6119bb565b61032b60075481565b600d546060905f9067ffffffffffffffff8111156106245761062461276d565b60405190808252806020026020018201604052801561064d578160200160208202803683370190505b5090505f5b600d548110156106be57610699600d82815481106106725761067261279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff1685610ba8565b8282815181106106ab576106ab61279a565b6020908102919091010152600101610652565b5092915050565b5f80546106d1906127c7565b80601f01602080910402602001604051908101604052809291908181526020018280546106fd906127c7565b80156107485780601f1061071f57610100808354040283529160200191610748565b820191905f5260205f20905b81548152906001019060200180831161072b57829003601f168201915b505050505081565b5f61075c338484611a3a565b5060015b92915050565b61076e611aa8565b6014600c5410610805576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44796e616d69635265776172644661726d3a204d41585f544f4b454e535f524560448201527f414348454400000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b61080e81611b2b565b600d8054600180820183555f929092527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055600c5461088a9161283f565b600c81905560405190815273ffffffffffffffffffffffffffffffffffffffff8216907f68e3e9397770d9dfa88c0953a34e1a70a05416b3895957f5b689787a920791c49060200160405180910390a250565b5f6108e6611bfc565b836108f081611c8a565b836108fa81611c8a565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff146109955773ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091528120805486929061098f908490612852565b90915550505b6109a0868686611d34565b50600195945050505050565b6109b4611bfc565b6109bd33611c8a565b336109c88282611dcf565b6005546109ec9073ffffffffffffffffffffffffffffffffffffffff168284611dd9565b8073ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d583604051610a3491815260200190565b60405180910390a25050565b610a48611bfc565b610a5133611c8a565b335f5b600d54811015610b5c575f600d8281548110610a7257610a7261279a565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600e9091526040822090925090610aaf8386610ba8565b90508015610b515773ffffffffffffffffffffffffffffffffffffffff85165f908152600283016020526040812055610ae9838683611dd9565b8273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f540798df468d7b23d11f156fdb954cb19ad414d150722a7b6d55ba369dea792e83604051610b4891815260200190565b60405180910390a35b505050600101610a54565b5050565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161075c918590610ba390869061283f565b611a3a565b73ffffffffffffffffffffffffffffffffffffffff8083165f908152600e602090815260408083209385168352600384019091528120549091908290610bed866119bb565b610bf79190612852565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260028401602090815260408083205460039092529091205491925090670de0b6b3a764000090610c43908490612865565b610c4d919061287c565b610c57919061283f565b95945050505050565b600a5473ffffffffffffffffffffffffffffffffffffffff163314610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f44796e616d69635265776172644661726d3a20494e56414c49445f43414e444960448201527f444154450000000000000000000000000000000000000000000000000000000060648201526084016107fc565b600a54600980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90921691821790556040519081527fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf369060200160405180910390a1565b600d8181548110610d90575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f6006544210610dc7575060065490565b504290565b610dd4611bfc565b610ddd33611c8a565b33610de88282611eb2565b600554610e0d9073ffffffffffffffffffffffffffffffffffffffff16823085611f24565b8073ffffffffffffffffffffffffffffffffffffffff167f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d83604051610a3491815260200190565b600180546106d1906127c7565b610e6a611aa8565b73ffffffffffffffffffffffffffffffffffffffff8116610eb7576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f198db6e425fb8aafd1823c6ca50be2d51e5764571a5ae0f0f21c6812e45def0b906020015b60405180910390a150565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909161075c918590610ba3908690612852565b5f610f7d611bfc565b610f8633611c8a565b82610f9081611c8a565b610f9b338585611d34565b5060019392505050565b5f8711611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f44796e616d69635265776172644661726d3a20494e56414c49445f445552415460448201527f494f4e000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b600754156110c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f44796e616d69635265776172644661726d3a20414c52454144595f494e49544960448201527f414c495a4544000000000000000000000000000000000000000000000000000060648201526084016107fc565b60078790555f6110d58486836128ff565b5060016110e38284836128ff565b506005805473ffffffffffffffffffffffffffffffffffffffff808b167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560098054898416908316179055600b80549288169290911691909117905561115a670de0b6b3a764000061dead611eb2565b5050505050505050565b61116c611f88565b611174611bfc565b828114611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f44796e616d69635265776172644661726d3a2041525241595f4c454e4754485f60448201527f4d49534d4154434800000000000000000000000000000000000000000000000060648201526084016107fc565b600d548314611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f44796e616d69635265776172644661726d3a20544f4b454e5f4c454e4754485f60448201527f4d49534d4154434800000000000000000000000000000000000000000000000060648201526084016107fc565b61129e828261202f565b5f5b838110156113f657600d81815481106112bb576112bb61279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff168585838181106112ee576112ee61279a565b90506020020160208101906113039190612426565b73ffffffffffffffffffffffffffffffffffffffff16146113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f44796e616d69635265776172644661726d3a20494e56414c49445f544f4b454e60448201527f5f4f52444552000000000000000000000000000000000000000000000000000060648201526084016107fc565b6113ee8585838181106113bb576113bb61279a565b90506020020160208101906113d09190612426565b8484848181106113e2576113e261279a565b90506020020135612099565b6001016112a0565b504260088190556007546114099161283f565b60065550505050565b61141a611aa8565b73ffffffffffffffffffffffffffffffffffffffff8116611467576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f35b5da26a401fdbef2e1cfabeec2c10a6121d56f136be501a393c284cdd1af5890602001610f26565b6114e2611aa8565b600554829073ffffffffffffffffffffffffffffffffffffffff90811690821603611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f44796e616d69635265776172644661726d3a205354414b455f544f4b454e000060448201526064016107fc565b5f5b600d548110156116e857600d81815481106115885761158861279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff908116908516036116e0575f6115c08561dead610ba8565b905080841115611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44796e616d69635265776172644661726d3a204e4f545f454e4f5547485f524560448201527f574152445300000000000000000000000000000000000000000000000000000060648201526084016107fc565b61165a611bfc565b61166561dead611c8a565b73ffffffffffffffffffffffffffffffffffffffff85165f908152600e6020908152604080832061dead84526002019091529020546116a5908590612852565b73ffffffffffffffffffffffffffffffffffffffff86165f908152600e6020908152604080832061dead8452600201909152902055506116e8565b60010161156b565b5060095461170e90829073ffffffffffffffffffffffffffffffffffffffff1684611dd9565b8073ffffffffffffffffffffffffffffffffffffffff167f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288360405161175691815260200190565b60405180910390a2505050565b61176b611aa8565b5f81116117fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f44796e616d69635265776172644661726d3a20494e56414c49445f445552415460448201527f494f4e000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b600654421161188b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f44796e616d69635265776172644661726d3a204f4e474f494e475f444953545260448201527f49425554494f4e0000000000000000000000000000000000000000000000000060648201526084016107fc565b60078190556040518181527ffb46ca5a5e06d4540d6387b930a7c978bce0db5f449ec6b3f5d07c6e1d44f2d390602001610f26565b600d546060905f9067ffffffffffffffff8111156118e0576118e061276d565b604051908082528060200260200182016040528015611909578160200160208202803683370190505b5090505f5b600d5481101561199257600d818154811061192b5761192b61279a565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168282815181106119655761196561279a565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015260010161190e565b50919050565b335f908152600360205260409020546119b0816109ac565b6119b8610a40565b50565b73ffffffffffffffffffffffffffffffffffffffff81165f908152600e6020526040812060085482906119ec610db6565b6119f69190612852565b90505f600254670de0b6b3a7640000845f015484611a149190612865565b611a1e9190612865565b611a28919061287c565b9050808360010154610c57919061283f565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60095473ffffffffffffffffffffffffffffffffffffffff163314611b29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f44796e616d69635265776172644661726d3a20494e56414c49445f4f574e455260448201526064016107fc565b565b73ffffffffffffffffffffffffffffffffffffffff8116611b78576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b600d54811015610b5c57600d8181548110611b9757611b9761279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff90811690831603611bf4576040517fe4ed28f100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600101611b7a565b5f5b600d54811015611c7c575f600d8281548110611c1c57611c1c61279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050611c48816119bb565b73ffffffffffffffffffffffffffffffffffffffff9091165f908152600e6020526040902060019081019190915501611bfe565b50611c85610db6565b600855565b5f5b600d54811015610b5c575f600d8281548110611caa57611caa61279a565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16808352600e9091526040909120909150611ce78285610ba8565b73ffffffffffffffffffffffffffffffffffffffff85165f908152600283016020908152604080832093909355600180850154600390950190915291902091909155919091019050611c8c565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260036020526040902054611d64908290612852565b73ffffffffffffffffffffffffffffffffffffffff8481165f8181526003602090815260408083209590955592861680825290849020805486019055925184815290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611a9b565b610b5c8282612243565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611ead9084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526122d6565b505050565b81600254611ec0919061283f565b60025573ffffffffffffffffffffffffffffffffffffffff81165f818152600360209081526040808320805487019055518581527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052611f829085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611e2b565b50505050565b600b5473ffffffffffffffffffffffffffffffffffffffff163314611b29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f44796e616d69635265776172644661726d3a20494e56414c49445f4d414e414760448201527f455200000000000000000000000000000000000000000000000000000000000060648201526084016107fc565b5f5b81811015612066575f83838381811061204c5761204c61279a565b90506020020135111561205e57505050565b600101612031565b506040517f3fb087f400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120a282612375565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600e602052604090206006548391904210156121af578054831015612164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f44796e616d69635265776172644661726d3a20524154455f43414e545f44454360448201527f524541534500000000000000000000000000000000000000000000000000000060648201526084016107fc565b5f426006546121739190612852565b82549091505f906121849083612865565b600b549091506121ac90859073ffffffffffffffffffffffffffffffffffffffff1683611dd9565b50505b8281556007545f906121c2908590612865565b600b549091506121eb90849073ffffffffffffffffffffffffffffffffffffffff163084611f24565b604080518581526020810183905273ffffffffffffffffffffffffffffffffffffffff8716917f6a6f77044107a33658235d41bedbbaf2fe9ccdceb313143c947a5e76e1ec8474910160405180910390a25050505050565b60028054839003905573ffffffffffffffffffffffffffffffffffffffff81165f9081526003602052604090205461227c908390612852565b73ffffffffffffffffffffffffffffffffffffffff82165f818152600360205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611f189086815260200190565b5f8060205f8451602086015f885af1806122f5576040513d5f823e3d81fd5b50505f513d9150811561230c578060011415612326565b73ffffffffffffffffffffffffffffffffffffffff84163b155b15611f82576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851660048201526024016107fc565b5f5b600d548110156123cb57600d81815481106123945761239461279a565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff908116908316036123c3575050565b600101612377565b506040517f8698bf3700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b803573ffffffffffffffffffffffffffffffffffffffff81168114612421575f80fd5b919050565b5f60208284031215612436575f80fd5b61243f826123fe565b9392505050565b602080825282518282018190525f918401906040840190835b8181101561247d57835183526020938401939092019160010161245f565b509095945050505050565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f80604083850312156124ec575f80fd5b6124f5836123fe565b946020939093013593505050565b5f805f60608486031215612515575f80fd5b61251e846123fe565b925061252c602085016123fe565b929592945050506040919091013590565b5f6020828403121561254d575f80fd5b5035919050565b5f8060408385031215612565575f80fd5b61256e836123fe565b915061257c602084016123fe565b90509250929050565b5f8083601f840112612595575f80fd5b50813567ffffffffffffffff8111156125ac575f80fd5b6020830191508360208285010111156125c3575f80fd5b9250929050565b5f805f805f805f8060c0898b0312156125e1575f80fd5b6125ea896123fe565b9750602089013596506125ff60408a016123fe565b955061260d60608a016123fe565b9450608089013567ffffffffffffffff811115612628575f80fd5b6126348b828c01612585565b90955093505060a089013567ffffffffffffffff811115612653575f80fd5b61265f8b828c01612585565b999c989b5096995094979396929594505050565b5f8083601f840112612683575f80fd5b50813567ffffffffffffffff81111561269a575f80fd5b6020830191508360208260051b85010111156125c3575f80fd5b5f805f80604085870312156126c7575f80fd5b843567ffffffffffffffff8111156126dd575f80fd5b6126e987828801612673565b909550935050602085013567ffffffffffffffff811115612708575f80fd5b61271487828801612673565b95989497509550505050565b602080825282518282018190525f918401906040840190835b8181101561247d57835173ffffffffffffffffffffffffffffffffffffffff16835260209384019390920191600101612739565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b600181811c908216806127db57607f821691505b602082108103611992577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561076057610760612812565b8181038181111561076057610760612812565b808202811582820484141761076057610760612812565b5f826128af577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b601f821115611ead57805f5260205f20601f840160051c810160208510156128d95750805b601f840160051c820191505b818110156128f8575f81556001016128e5565b5050505050565b67ffffffffffffffff8311156129175761291761276d565b61292b8361292583546127c7565b836128b4565b5f601f84116001811461297b575f85156129455750838201355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b1c1916600186901b1783556128f8565b5f838152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08716915b828110156129c857868501358255602094850194600190920191016129a8565b5086821015612a03577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88860031b161c19848701351681555b505060018560011b018355505050505056fea2646970667358221220193db1e50b18e8f491ff2df84acc986d4aabf5810f8182f61b04f15f52412d6964736f6c634300081a0033
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.