Address Contract Verified
Address
0x5CF2F480e62F357E8fa5aA2c3791d02cC1d26ded
Balance
0 ETH
Nonce
1
Code Size
6219 bytes
Creator
0xAeD9A2ac...3A90 at tx 0x223cf47d...b04a5b
Indexed Transactions
0
Contract Bytecode
6219 bytes
0x608060405234801561001057600080fd5b50600436106101735760003560e01c80638da5cb5b116100de578063bfe1092811610097578063deac361a11610071578063deac361a1461039e578063ed4acaa8146103a6578063f3d86e4a146103ae578063f62ae76a146103b657610173565b8063bfe1092814610371578063c9f464ff14610379578063d7b96d4e1461039657610173565b80638da5cb5b146102fe5780638f077b8314610306578063900cf0cf1461030e5780639ebea88c1461033c578063a8dd07dc14610361578063af14052c1461036957610173565b80635a96ac0a116101305780635a96ac0a146102295780636746f4c2146102315780637acb77571461027f578063865e6fd3146102bf5780638b33533d146102ee5780638b7afe2e146102f657610173565b806303c2367014610178578063089208d8146101975780631e83409a1461019f5780632986c0e5146101c557806335a30fc2146101df57806346f68ee914610203575b600080fd5b6101956004803603602081101561018e57600080fd5b50356103d3565b005b610195610437565b610195600480360360208110156101b557600080fd5b50356001600160a01b03166104ce565b6101cd610682565b60408051918252519081900360200190f35b6101e761070e565b604080516001600160a01b039092168252519081900360200190f35b6101956004803603602081101561021957600080fd5b50356001600160a01b0316610732565b61019561081f565b6102576004803603602081101561024757600080fd5b50356001600160a01b03166108c9565b6040805194855260208501939093528383019190915215156060830152519081900360800190f35b6102ab6004803603604081101561029557600080fd5b50803590602001356001600160a01b03166108f3565b604080519115158252519081900360200190f35b610195600480360360408110156102d557600080fd5b50803560ff1690602001356001600160a01b0316610b3f565b6101e7610cb9565b6101cd610cdd565b6101e7610d89565b610195610d98565b610316610dbc565b604080519485526020850193909352838301919091526060830152519081900360800190f35b6101956004803603604081101561035257600080fd5b50803590602001351515610dcb565b6101cd610e42565b610195610e48565b6101e7611056565b6101956004803603602081101561038f57600080fd5b5035611065565b6101e76110b7565b6101cd6110c6565b6101e76110cc565b6101956110db565b610195600480360360208110156103cc57600080fd5b5035611285565b6007546001600160a01b031633146103ea57600080fd5b6008546103f790826112e7565b600855600754610434906001600160a01b037f000000000000000000000000064d8bf7ac3a36d1326eebcd4216376e236adcd18116911683611348565b50565b6000546001600160a01b03163314610484576040805162461bcd60e51b815260206004820181905260248201526000805160206117cc833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba908390a3600080546001600160a01b0319169055565b6104d6611713565b506001600160a01b0381166000908152600b6020908152604091829020825160808101845281548152600182015492810192909252600281015492820183905260039081015460ff16151560608301525490911180159061053a5750604081015115155b1561067e576001600160a01b038083166000908152600b602090815260408083208381556001810184905560028101939093556003909201805460ff19169055600954848201518351637965d56d60e01b8152600481019190915292519084169363c3a2a6659387937f000000000000000000000000064d8bf7ac3a36d1326eebcd4216376e236adcd190921692637965d56d92602480840193919291829003018186803b1580156105eb57600080fd5b505afa1580156105ff573d6000803e3d6000fd5b505050506040513d602081101561061557600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b15801561066557600080fd5b505af1158015610679573d6000803e3d6000fd5b505050505b5050565b60007f000000000000000000000000064d8bf7ac3a36d1326eebcd4216376e236adcd16001600160a01b0316632986c0e56040518163ffffffff1660e01b815260040160206040518083038186803b1580156106dd57600080fd5b505afa1580156106f1573d6000803e3d6000fd5b505050506040513d602081101561070757600080fd5b5051905090565b7f0000000000000000000000005a1912749d2b7c3cdb832b81601c8c3f437a0de881565b6000546001600160a01b0316331461077f576040805162461bcd60e51b815260206004820181905260248201526000805160206117cc833981519152604482015290519081900360640190fd5b6001600160a01b0381166107c45760405162461bcd60e51b81526004018080602001828103825260268152602001806117616026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917fea8258f2d9ddb679928cf34b78cf645b7feda9acc828e4dd82d014eaae270eba91a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146108685760405162461bcd60e51b81526004018080602001828103825260228152602001806117aa6022913960400191505060405180910390fd5b600154600080546040516001600160a01b0393841693909116917faa151555690c956fc3ea32f106bb9f119b5237a061eaa8557cff3e51e3792c8d91a3600154600080546001600160a01b0319166001600160a01b03909216919091179055565b600b6020526000908152604090208054600182015460028301546003909301549192909160ff1684565b60006108fd610e48565b6109326001600160a01b037f0000000000000000000000005a1912749d2b7c3cdb832b81601c8c3f437a0de81633308661139f565b61093a611713565b506001600160a01b0382166000908152600b602090815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460ff1615801560608301526109dd576040805162461bcd60e51b815260206004820152601f60248201527f4465706f7369747320666f72206163636f756e7420617265206c6f636b656400604482015290519081900360640190fd5b6040805160808101909152815181906109f690876112e7565b8152602001610a997f000000000000000000000000064d8bf7ac3a36d1326eebcd4216376e236adcd16001600160a01b0316631bd39674886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610a6257600080fd5b505afa158015610a76573d6000803e3d6000fd5b505050506040513d6020811015610a8c57600080fd5b50516020850151906112e7565b8152600a54600354602090920191610ab0916112e7565b8152600060209182018190526001600160a01b038681168252600b8352604091829020845181559284015160018401559083015160028301556060909201516003909101805460ff1916911515919091179055600954610b35917f000000000000000000000000064d8bf7ac3a36d1326eebcd4216376e236adcd18116911686611348565b5060019392505050565b6000546001600160a01b03163314610b8c576040805162461bcd60e51b815260206004820181905260248201526000805160206117cc833981519152604482015290519081900360640190fd5b6000826002811115610b9a57fe5b1415610bc057600680546001600160a01b0319166001600160a01b03831617905561067e565b6001826002811115610bce57fe5b1415610c3c576009546001600160a01b031615610c1c5760405162461bcd60e51b81526004018080602001828103825260238152602001806117876023913960400191505060405180910390fd5b600980546001600160a01b0319166001600160a01b03831617905561067e565b6002826002811115610c4a57fe5b141561067e576007546001600160a01b031615610c985760405162461bcd60e51b815260040180806020018281038252602381526020018061173e6023913960400191505060405180910390fd5b600780546001600160a01b0383166001600160a01b03199091161790555050565b7f000000000000000000000000064d8bf7ac3a36d1326eebcd4216376e236adcd181565b6000610d846008547f0000000000000000000000005a1912749d2b7c3cdb832b81601c8c3f437a0de86001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610d5257600080fd5b505afa158015610d66573d6000803e3d6000fd5b505050506040513d6020811015610d7c57600080fd5b5051906112e7565b905090565b6000546001600160a01b031690565b336000908152600b60205260409020600301805460ff19811660ff90911615179055565b60025460035460045460055484565b8015610dd957610dd9610e48565b610e0e6001600160a01b037f000000000000000000000000064d8bf7ac3a36d1326eebcd4216376e236adcd11633308561139f565b61067e6001600160a01b037f0000000000000000000000005a1912749d2b7c3cdb832b81601c8c3f437a0de8163384611348565b60085481565b6004544210611054577f000000000000000000000000064d8bf7ac3a36d1326eebcd4216376e236adcd16001600160a01b031663058ecdb46002600301546002600101546040518363ffffffff1660e01b81526004018083815260200182815260200192505050602060405180830381600087803b158015610ec957600080fd5b505af1158015610edd573d6000803e3d6000fd5b505050506040513d6020811015610ef357600080fd5b5050600254600454610f04916112e7565b6004556003805460010190556006546001600160a01b031615610f9e57600660009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f7157600080fd5b505af1158015610f85573d6000803e3d6000fd5b505050506040513d6020811015610f9b57600080fd5b50505b6000610fa8610cdd565b905060007f000000000000000000000000064d8bf7ac3a36d1326eebcd4216376e236adcd16001600160a01b0316639358928b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561100557600080fd5b505afa158015611019573d6000803e3d6000fd5b505050506040513d602081101561102f57600080fd5b5051905080821161104457600060055561067e565b61104e82826113ff565b60055550505b565b6006546001600160a01b031681565b6000546001600160a01b031633146110b2576040805162461bcd60e51b815260206004820181905260248201526000805160206117cc833981519152604482015290519081900360640190fd5b600a55565b6007546001600160a01b031681565b600a5481565b6009546001600160a01b031681565b6110e3611713565b50336000818152600b602081815260408084208151608081018352815481526001820180548286019081526002840180548487015260038501805460ff8116151560608701529a8a5297875293889055908790559590915560ff1990951690925560095492518251637965d56d60e01b8152600481019190915291516001600160a01b039384169363c3a2a6659330937f000000000000000000000000064d8bf7ac3a36d1326eebcd4216376e236adcd190921692637965d56d92602480840193919291829003018186803b1580156111bb57600080fd5b505afa1580156111cf573d6000803e3d6000fd5b505050506040513d60208110156111e557600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b039093166004840152602483019190915251604480830192600092919082900301818387803b15801561123557600080fd5b505af1158015611249573d6000803e3d6000fd5b5050825161043492506001600160a01b037f0000000000000000000000005a1912749d2b7c3cdb832b81601c8c3f437a0de81691503390611348565b6007546001600160a01b0316331461129c57600080fd5b6008546112a990826113ff565b600855600754610434906001600160a01b037f000000000000000000000000064d8bf7ac3a36d1326eebcd4216376e236adcd181169116308461139f565b600082820183811015611341576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261139a908490611441565b505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526113f9908590611441565b50505050565b600061134183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506114f2565b6060611496826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166115899092919063ffffffff16565b80519091501561139a578080602001905160208110156114b557600080fd5b505161139a5760405162461bcd60e51b815260040180806020018281038252602a8152602001806117ec602a913960400191505060405180910390fd5b600081848411156115815760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561154657818101518382015260200161152e565b50505050905090810190601f1680156115735780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b606061159884846000856115a0565b949350505050565b60606115ab8561170d565b6115fc576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061163b5780518252601f19909201916020918201910161161c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461169d576040519150601f19603f3d011682016040523d82523d6000602084013e6116a2565b606091505b509150915081156116b65791506115989050565b8051156116c65780518082602001fd5b60405162461bcd60e51b815260206004820181815286516024840152865187939192839260440191908501908083836000831561154657818101518382015260200161152e565b3b151590565b6040518060800160405280600081526020016000815260200160008152602001600015158152509056fe4c6f636b65722063616e6e6f7420626520736574206d6f7265207468616e206f6e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735761726d75702063616e6e6f7420626520736574206d6f7265207468616e206f6e63654f776e61626c653a206d757374206265206e6577206f776e657220746f2070756c6c4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220d9389d2dccdf53334bc774ef1db5c4d1c65c6e4ae7e38df004452a61729c4da364736f6c63430007050033
Verified Source Code Full Match
Compiler: v0.7.5+commit.eb77ed08
EVM: istanbul
Optimization: Yes (200 runs)
FlyzStaking.sol 251 lines
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import './interfaces/IFlyzStaking.sol';
import './interfaces/IsFlyzERC20.sol';
import './types/ERC20.sol';
import './types/Ownable.sol';
import './libraries/SafeMath.sol';
import './libraries/SafeERC20.sol';
interface IWarmup {
function retrieve(address staker_, uint256 amount_) external;
}
interface IDistributor {
function distribute() external returns (bool);
}
contract FlyzStaking is Ownable, IFlyzStaking {
using SafeMath for uint256;
using SafeERC20 for IERC20;
address public immutable FLYZ;
address public immutable sFLYZ;
struct Epoch {
uint256 length; // in seconds
uint256 number;
uint256 endTime; // unix epoch time in seconds
uint256 distribute;
}
Epoch public epoch;
address public distributor;
address public locker;
uint256 public totalBonus;
address public warmupContract;
uint256 public warmupPeriod;
constructor(
address _FLYZ,
address _sFLYZ,
uint256 _epochLength,
uint256 _firstEpochNumber,
uint256 _firstEpochTime
) {
require(_FLYZ != address(0));
FLYZ = _FLYZ;
require(_sFLYZ != address(0));
sFLYZ = _sFLYZ;
epoch = Epoch({
length: _epochLength,
number: _firstEpochNumber,
endTime: _firstEpochTime,
distribute: 0
});
}
struct Claim {
uint256 deposit;
uint256 gons;
uint256 expiry;
bool lock; // prevents malicious delays
}
mapping(address => Claim) public warmupInfo;
/**
@notice stake FLYZ to enter warmup
@param _amount uint
@return bool
*/
function stake(uint256 _amount, address _recipient)
external
override
returns (bool)
{
rebase();
IERC20(FLYZ).safeTransferFrom(msg.sender, address(this), _amount);
Claim memory info = warmupInfo[_recipient];
require(!info.lock, 'Deposits for account are locked');
warmupInfo[_recipient] = Claim({
deposit: info.deposit.add(_amount),
gons: info.gons.add(IsFlyzERC20(sFLYZ).gonsForBalance(_amount)),
expiry: epoch.number.add(warmupPeriod),
lock: false
});
IERC20(sFLYZ).safeTransfer(warmupContract, _amount);
return true;
}
/**
@notice retrieve sFLYZ from warmup
@param _recipient address
*/
function claim(address _recipient) external override {
Claim memory info = warmupInfo[_recipient];
if (epoch.number >= info.expiry && info.expiry != 0) {
delete warmupInfo[_recipient];
IWarmup(warmupContract).retrieve(
_recipient,
IsFlyzERC20(sFLYZ).balanceForGons(info.gons)
);
}
}
/**
@notice forfeit sFLYZ in warmup and retrieve FLYZ
*/
function forfeit() external {
Claim memory info = warmupInfo[msg.sender];
delete warmupInfo[msg.sender];
IWarmup(warmupContract).retrieve(
address(this),
IsFlyzERC20(sFLYZ).balanceForGons(info.gons)
);
IERC20(FLYZ).safeTransfer(msg.sender, info.deposit);
}
/**
@notice prevent new deposits to address (protection from malicious activity)
*/
function toggleDepositLock() external {
warmupInfo[msg.sender].lock = !warmupInfo[msg.sender].lock;
}
/**
@notice redeem sFLYZ for FLYZ
@param _amount uint
@param _trigger bool
*/
function unstake(uint256 _amount, bool _trigger) external {
if (_trigger) {
rebase();
}
IERC20(sFLYZ).safeTransferFrom(msg.sender, address(this), _amount);
IERC20(FLYZ).safeTransfer(msg.sender, _amount);
}
/**
@notice returns the sFLYZ index, which tracks rebase growth
@return uint
*/
function index() public view returns (uint256) {
return IsFlyzERC20(sFLYZ).index();
}
/**
@notice trigger rebase if epoch over
*/
function rebase() public {
if (epoch.endTime <= block.timestamp) {
IsFlyzERC20(sFLYZ).rebase(epoch.distribute, epoch.number);
epoch.endTime = epoch.endTime.add(epoch.length);
epoch.number++;
if (distributor != address(0)) {
IDistributor(distributor).distribute();
}
uint256 balance = contractBalance();
uint256 staked = IsFlyzERC20(sFLYZ).circulatingSupply();
if (balance <= staked) {
epoch.distribute = 0;
} else {
epoch.distribute = balance.sub(staked);
}
}
}
/**
@notice returns contract FLYZ holdings, including bonuses provided
@return uint
*/
function contractBalance() public view returns (uint256) {
return IERC20(FLYZ).balanceOf(address(this)).add(totalBonus);
}
/**
@notice provide bonus to locked staking contract
@param _amount uint
*/
function giveLockBonus(uint256 _amount) external {
require(msg.sender == locker);
totalBonus = totalBonus.add(_amount);
IERC20(sFLYZ).safeTransfer(locker, _amount);
}
/**
@notice reclaim bonus from locked staking contract
@param _amount uint
*/
function returnLockBonus(uint256 _amount) external {
require(msg.sender == locker);
totalBonus = totalBonus.sub(_amount);
IERC20(sFLYZ).safeTransferFrom(locker, address(this), _amount);
}
enum CONTRACTS {
DISTRIBUTOR,
WARMUP,
LOCKER
}
/**
@notice sets the contract address for LP staking
@param _contract address
*/
function setContract(CONTRACTS _contract, address _address)
external
onlyOwner
{
if (_contract == CONTRACTS.DISTRIBUTOR) {
// 0
distributor = _address;
} else if (_contract == CONTRACTS.WARMUP) {
// 1
require(
warmupContract == address(0),
'Warmup cannot be set more than once'
);
warmupContract = _address;
} else if (_contract == CONTRACTS.LOCKER) {
// 2
require(
locker == address(0),
'Locker cannot be set more than once'
);
locker = _address;
}
}
/**
* @notice set warmup period for new stakers
* @param _warmupPeriod uint
*/
function setWarmup(uint256 _warmupPeriod) external onlyOwner {
warmupPeriod = _warmupPeriod;
}
}
ERC20.sol 281 lines
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import '../interfaces/IERC20.sol';
import '../libraries/SafeMath.sol';
import '../libraries/Counters.sol';
import '../libraries/Address.sol';
abstract contract ERC20 is IERC20 {
using SafeMath for uint256;
// TODO comment actual hash value.
bytes32 private constant ERC20TOKEN_ERC1820_INTERFACE_ID =
keccak256('ERC20Token');
mapping(address => uint256) internal _balances;
mapping(address => mapping(address => uint256)) internal _allowances;
uint256 internal _totalSupply;
string internal _name;
string internal _symbol;
uint8 internal _decimals;
constructor(
string memory name_,
string memory symbol_,
uint8 decimals_
) {
_name = name_;
_symbol = symbol_;
_decimals = decimals_;
}
function name() public view override returns (string memory) {
return _name;
}
function symbol() public view override returns (string memory) {
return _symbol;
}
function decimals() public view override returns (uint8) {
return _decimals;
}
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account)
public
view
virtual
override
returns (uint256)
{
return _balances[account];
}
function transfer(address recipient, uint256 amount)
public
virtual
override
returns (bool)
{
_transfer(msg.sender, recipient, amount);
return true;
}
function allowance(address owner, address spender)
public
view
virtual
override
returns (uint256)
{
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount)
public
virtual
override
returns (bool)
{
_approve(msg.sender, spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
_approve(
sender,
msg.sender,
_allowances[sender][msg.sender].sub(
amount,
'ERC20: transfer amount exceeds allowance'
)
);
return true;
}
function increaseAllowance(address spender, uint256 addedValue)
public
virtual
returns (bool)
{
_approve(
msg.sender,
spender,
_allowances[msg.sender][spender].add(addedValue)
);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue)
public
virtual
returns (bool)
{
_approve(
msg.sender,
spender,
_allowances[msg.sender][spender].sub(
subtractedValue,
'ERC20: decreased allowance below zero'
)
);
return true;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), 'ERC20: transfer from the zero address');
require(recipient != address(0), 'ERC20: transfer to the zero address');
_beforeTokenTransfer(sender, recipient, amount);
_balances[sender] = _balances[sender].sub(
amount,
'ERC20: transfer amount exceeds balance'
);
_balances[recipient] = _balances[recipient].add(amount);
emit Transfer(sender, recipient, amount);
}
function _mint(address account_, uint256 ammount_) internal virtual {
require(account_ != address(0), 'ERC20: mint to the zero address');
_beforeTokenTransfer(address(this), account_, ammount_);
_totalSupply = _totalSupply.add(ammount_);
_balances[account_] = _balances[account_].add(ammount_);
emit Transfer(address(this), account_, ammount_);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), 'ERC20: burn from the zero address');
_beforeTokenTransfer(account, address(0), amount);
_balances[account] = _balances[account].sub(
amount,
'ERC20: burn amount exceeds balance'
);
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), 'ERC20: approve from the zero address');
require(spender != address(0), 'ERC20: approve to the zero address');
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _beforeTokenTransfer(
address from_,
address to_,
uint256 amount_
) internal virtual {}
}
interface IERC2612Permit {
function permit(
address owner,
address spender,
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
}
abstract contract ERC20Permit is ERC20, IERC2612Permit {
using Counters for Counters.Counter;
mapping(address => Counters.Counter) private _nonces;
// keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
bytes32 public constant PERMIT_TYPEHASH =
0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;
bytes32 public DOMAIN_SEPARATOR;
constructor() {
uint256 chainID;
assembly {
chainID := chainid()
}
DOMAIN_SEPARATOR = keccak256(
abi.encode(
keccak256(
'EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'
),
keccak256(bytes(name())),
keccak256(bytes('1')), // Version
chainID,
address(this)
)
);
}
function permit(
address owner,
address spender,
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public virtual override {
require(block.timestamp <= deadline, 'Permit: expired deadline');
bytes32 hashStruct = keccak256(
abi.encode(
PERMIT_TYPEHASH,
owner,
spender,
amount,
_nonces[owner].current(),
deadline
)
);
bytes32 _hash = keccak256(
abi.encodePacked(uint16(0x1901), DOMAIN_SEPARATOR, hashStruct)
);
address signer = ecrecover(_hash, v, r, s);
require(
signer != address(0) && signer == owner,
'ZeroSwapPermit: Invalid signature'
);
_nonces[owner].increment();
_approve(owner, spender, amount);
}
function nonces(address owner) public view override returns (uint256) {
return _nonces[owner].current();
}
}
Ownable.sol 65 lines
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
interface IOwnable {
function owner() external view returns (address);
function renounceManagement() external;
function pushManagement(address newOwner_) external;
function pullManagement() external;
}
contract Ownable is IOwnable {
address internal _owner;
address internal _newOwner;
event OwnershipPushed(
address indexed previousOwner,
address indexed newOwner
);
event OwnershipPulled(
address indexed previousOwner,
address indexed newOwner
);
constructor() {
_owner = msg.sender;
emit OwnershipPushed(address(0), _owner);
}
function owner() public view override returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == msg.sender, 'Ownable: caller is not the owner');
_;
}
function renounceManagement() public virtual override onlyOwner {
emit OwnershipPushed(_owner, address(0));
_owner = address(0);
}
function pushManagement(address newOwner_)
public
virtual
override
onlyOwner
{
require(
newOwner_ != address(0),
'Ownable: new owner is the zero address'
);
emit OwnershipPushed(_owner, newOwner_);
_newOwner = newOwner_;
}
function pullManagement() public virtual override {
require(msg.sender == _newOwner, 'Ownable: must be new owner to pull');
emit OwnershipPulled(_owner, _newOwner);
_owner = _newOwner;
}
}
IERC20.sol 42 lines
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity >=0.5.0;
interface IERC20 {
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
}
interface IERC20Mintable {
function mint(uint256 amount_) external;
function mint(address account_, uint256 ammount_) external;
}
Address.sol 193 lines
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly {
size := extcodesize(account)
}
return size > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(
address(this).balance >= amount,
'Address: insufficient balance'
);
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{value: amount}('');
require(
success,
'Address: unable to send value, recipient may have reverted'
);
}
function functionCall(address target, bytes memory data)
internal
returns (bytes memory)
{
return functionCall(target, data, 'Address: low-level call failed');
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
'Address: low-level call with value failed'
);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(
address(this).balance >= value,
'Address: insufficient balance for call'
);
require(isContract(target), 'Address: call to non-contract');
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{value: value}(
data
);
return _verifyCallResult(success, returndata, errorMessage);
}
function _functionCallWithValue(
address target,
bytes memory data,
uint256 weiValue,
string memory errorMessage
) private returns (bytes memory) {
require(isContract(target), 'Address: call to non-contract');
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{value: weiValue}(
data
);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
function functionStaticCall(address target, bytes memory data)
internal
view
returns (bytes memory)
{
return
functionStaticCall(
target,
data,
'Address: low-level static call failed'
);
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), 'Address: static call to non-contract');
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data)
internal
returns (bytes memory)
{
return
functionDelegateCall(
target,
data,
'Address: low-level delegate call failed'
);
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), 'Address: delegate call to non-contract');
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) private pure returns (bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
function addressToString(address _address)
internal
pure
returns (string memory)
{
bytes32 _bytes = bytes32(uint256(_address));
bytes memory HEX = '0123456789abcdef';
bytes memory _addr = new bytes(42);
_addr[0] = '0';
_addr[1] = 'x';
for (uint256 i = 0; i < 20; i++) {
_addr[2 + i * 2] = HEX[uint8(_bytes[i + 12] >> 4)];
_addr[3 + i * 2] = HEX[uint8(_bytes[i + 12] & 0x0f)];
}
return string(_addr);
}
}
Counters.sol 24 lines
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import './SafeMath.sol';
library Counters {
using SafeMath for uint256;
struct Counter {
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
counter._value += 1;
}
function decrement(Counter storage counter) internal {
counter._value = counter._value.sub(1);
}
}
SafeMath.sol 66 lines
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, 'SafeMath: addition overflow');
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, 'SafeMath: subtraction overflow');
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, 'SafeMath: multiplication overflow');
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, 'SafeMath: division by zero');
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
function sqrrt(uint256 a) internal pure returns (uint256 c) {
if (a > 3) {
c = a;
uint256 b = add(div(a, 2), 1);
while (b < c) {
c = b;
b = div(add(div(a, b), b), 2);
}
} else if (a != 0) {
c = 1;
}
}
}
SafeERC20.sol 103 lines
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
import '../interfaces/IERC20.sol';
import './SafeMath.sol';
import './Counters.sol';
import './Address.sol';
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transfer.selector, to, value)
);
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
);
}
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
'SafeERC20: approve from non-zero to non-zero allowance'
);
_callOptionalReturn(
token,
abi.encodeWithSelector(token.approve.selector, spender, value)
);
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(
value
);
_callOptionalReturn(
token,
abi.encodeWithSelector(
token.approve.selector,
spender,
newAllowance
)
);
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(
value,
'SafeERC20: decreased allowance below zero'
);
_callOptionalReturn(
token,
abi.encodeWithSelector(
token.approve.selector,
spender,
newAllowance
)
);
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(
data,
'SafeERC20: low-level call failed'
);
if (returndata.length > 0) {
// Return data is optional
// solhint-disable-next-line max-line-length
require(
abi.decode(returndata, (bool)),
'SafeERC20: ERC20 operation did not succeed'
);
}
}
}
IsFlyzERC20.sol 18 lines
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity >=0.7.5;
import './IERC20.sol';
interface IsFlyzERC20 is IERC20 {
function rebase(uint256 flyzProfit_, uint256 epoch_)
external
returns (uint256);
function circulatingSupply() external view returns (uint256);
function gonsForBalance(uint256 amount) external view returns (uint256);
function balanceForGons(uint256 gons) external view returns (uint256);
function index() external view returns (uint256);
}
IFlyzStaking.sol 8 lines
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.7.5;
interface IFlyzStaking {
function stake(uint256 _amount, address _recipient) external returns (bool);
function claim(address _recipient) external;
}
Read Contract
FLYZ 0x35a30fc2 → address
contractBalance 0x8b7afe2e → uint256
distributor 0xbfe10928 → address
epoch 0x900cf0cf → uint256, uint256, uint256, uint256
index 0x2986c0e5 → uint256
locker 0xd7b96d4e → address
owner 0x8da5cb5b → address
sFLYZ 0x8b33533d → address
totalBonus 0xa8dd07dc → uint256
warmupContract 0xed4acaa8 → address
warmupInfo 0x6746f4c2 → uint256, uint256, uint256, bool
warmupPeriod 0xdeac361a → uint256
Write Contract 13 functions
These functions modify contract state and require a wallet transaction to execute.
claim 0x1e83409a
address _recipient
forfeit 0xf3d86e4a
No parameters
giveLockBonus 0x03c23670
uint256 _amount
pullManagement 0x5a96ac0a
No parameters
pushManagement 0x46f68ee9
address newOwner_
rebase 0xaf14052c
No parameters
renounceManagement 0x089208d8
No parameters
returnLockBonus 0xf62ae76a
uint256 _amount
setContract 0x865e6fd3
uint8 _contract
address _address
setWarmup 0xc9f464ff
uint256 _warmupPeriod
stake 0x7acb7757
uint256 _amount
address _recipient
returns: bool
toggleDepositLock 0x8f077b83
No parameters
unstake 0x9ebea88c
uint256 _amount
bool _trigger
Recent Transactions
No transactions found for this address