Source Code
Latest 25 from a total of 385 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Claim All | 27368749 | 70 days ago | IN | 0 ETH | 0 | ||||
| Claim All | 27368738 | 70 days ago | IN | 0 ETH | 0 | ||||
| Claim All | 23006334 | 171 days ago | IN | 0 ETH | 0.00000002 | ||||
| Withdraw | 21652195 | 203 days ago | IN | 0 ETH | 0 | ||||
| Claim All | 21652178 | 203 days ago | IN | 0 ETH | 0 | ||||
| Claim All | 21571291 | 205 days ago | IN | 0 ETH | 0.00000018 | ||||
| Claim All | 21568171 | 205 days ago | IN | 0 ETH | 0.00000016 | ||||
| Claim All | 21567747 | 205 days ago | IN | 0 ETH | 0.00000008 | ||||
| Withdraw | 21567162 | 205 days ago | IN | 0 ETH | 0.00000008 | ||||
| Claim All | 21567157 | 205 days ago | IN | 0 ETH | 0.00000012 | ||||
| Claim All | 21566380 | 205 days ago | IN | 0 ETH | 0.00000004 | ||||
| Claim All | 21566318 | 205 days ago | IN | 0 ETH | 0.00000004 | ||||
| Withdraw | 21565748 | 205 days ago | IN | 0 ETH | 0.00000002 | ||||
| Withdraw | 21565704 | 205 days ago | IN | 0 ETH | 0.00000002 | ||||
| Withdraw | 21565693 | 205 days ago | IN | 0 ETH | 0.00000002 | ||||
| Claim All | 21565681 | 205 days ago | IN | 0 ETH | 0.00000005 | ||||
| Claim All | 21565446 | 205 days ago | IN | 0 ETH | 0.00000025 | ||||
| Claim All | 21565301 | 205 days ago | IN | 0 ETH | 0.00000004 | ||||
| Claim All | 20600443 | 227 days ago | IN | 0 ETH | 0.00000021 | ||||
| Withdraw | 18975413 | 265 days ago | IN | 0 ETH | 0.00000015 | ||||
| Claim All | 18975403 | 265 days ago | IN | 0 ETH | 0.00000033 | ||||
| Stake | 18975214 | 265 days ago | IN | 0.8 ETH | 0.00000023 | ||||
| Withdraw | 18651930 | 272 days ago | IN | 0 ETH | 0.00000415 | ||||
| Claim All | 18651855 | 272 days ago | IN | 0 ETH | 0.00000553 | ||||
| Stake | 18283258 | 281 days ago | IN | 5.66 ETH | 0.00000284 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 26898099 | 81 days ago | 0.00000045 ETH | ||||
| 26898055 | 81 days ago | 0.00000035 ETH | ||||
| 25658520 | 110 days ago | 0.00000128 ETH | ||||
| 25658465 | 110 days ago | 0.00000121 ETH | ||||
| 25658378 | 110 days ago | 0.00000121 ETH | ||||
| 25658333 | 110 days ago | 0.00000077 ETH | ||||
| 25656900 | 110 days ago | 0.00000058 ETH | ||||
| 23864712 | 151 days ago | 0.00000033 ETH | ||||
| 23117338 | 169 days ago | 0.00000282 ETH | ||||
| 23060049 | 170 days ago | 0.0002936 ETH | ||||
| 21694144 | 202 days ago | 0.0029906 ETH | ||||
| 21652210 | 203 days ago | 0.00001598 ETH | ||||
| 21652195 | 203 days ago | 0.12021808 ETH | ||||
| 21578931 | 204 days ago | 0.00000005 ETH | ||||
| 21578897 | 204 days ago | 0.00083243 ETH | ||||
| 21572636 | 205 days ago | 0.00313529 ETH | ||||
| 21572270 | 205 days ago | 0.00243938 ETH | ||||
| 21572011 | 205 days ago | 0.01595125 ETH | ||||
| 21568289 | 205 days ago | 0.00003574 ETH | ||||
| 21567970 | 205 days ago | 0.00562786 ETH | ||||
| 21567162 | 205 days ago | 0 ETH | ||||
| 21566449 | 205 days ago | 0.00944096 ETH | ||||
| 21566348 | 205 days ago | 0.00402837 ETH | ||||
| 21566280 | 205 days ago | 0.01999829 ETH | ||||
| 21566146 | 205 days ago | 0.00807601 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PtyPoolSellHighV2
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import "hardhat/console.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/math/Math.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "../libs/Constants.sol";
import "../libs/TokensTransfer.sol";
import "../interfaces/IBlast.sol";
import "../interfaces/IBlastPoints.sol";
import "../interfaces/IProtocolSettings.sol";
import "../interfaces/IUsb.sol";
import "../interfaces/IVault.sol";
import "../interfaces/IWandProtocol.sol";
import "../settings/ProtocolOwner.sol";
contract PtyPoolSellHighV2 is ProtocolOwner, ReentrancyGuard {
using SafeMath for uint256;
using SafeERC20 for IERC20;
/* ========== STATE VARIABLES ========== */
IProtocolSettings public immutable settings;
IVault internal immutable _vault;
address internal _stakingAssetToken; // $ETH / $WBTC / ...
address internal _matchingUsbToken; // $USB
address internal _stakingYieldsAssetToken; // $ETH / $WBTC / ...
address internal _matchingYieldsMarginToken; // $ETHx / $WBTCx / ...
uint256 internal _totalStakingShares; // $ETH shares
mapping(address => uint256) internal _userStakingShares;
uint256 internal _accruedMatchingYields; // $ETHx ...
uint256 internal _matchingYieldsPerShare; // $ETHx per $ETH staking share
mapping(address => uint256) internal _userMatchingYieldsPerSharePaid;
mapping(address => uint256) internal _userMatchingYields;
uint256 internal _usbSharesPerStakingShare; // $USB shares
mapping(address => uint256) internal _userUsbSharesPerStakingSharePaid;
mapping(address => uint256) internal _userUsbShares;
/* ========== CONSTRUCTOR ========== */
constructor(
address _wandProtocol,
address _settings,
address _vault_,
address _stakingYieldsToken_, // $ETH
address _matchingYieldsToken_ // $ETHx
) ProtocolOwner(_wandProtocol) {
settings = IProtocolSettings(_settings);
_vault = IVault(_vault_);
_stakingAssetToken = _vault.assetToken();
_matchingUsbToken = wandProtocol.usbToken();
_stakingYieldsAssetToken = _stakingYieldsToken_;
_matchingYieldsMarginToken = _matchingYieldsToken_;
require(_stakingAssetToken == _stakingYieldsAssetToken, "PtyPoolSellHighV2: staking token and staking yields token mismatch");
}
receive() external payable {}
/* ========== VIEWS ========== */
function vault() public view returns (address) {
return address(_vault);
}
function stakingToken() public view returns (address) {
return _stakingAssetToken;
}
function targetToken() public view returns (address) {
return _matchingUsbToken;
}
function stakingYieldsToken() public view returns (address) {
return _stakingYieldsAssetToken;
}
function matchingYieldsToken() public view returns (address) {
return _matchingYieldsMarginToken;
}
function totalStakingShares() public view returns (uint256) {
return _totalStakingShares;
}
// $ETH
function totalStakingBalance() external view returns (uint256) {
return _totalStakingBalance(0);
}
function userStakingShares(address account) public view returns (uint256) {
return _userStakingShares[account];
}
// $ETH
function userStakingBalance(address account) external view returns (uint256) {
return _userStakingBalance(account, 0);
}
// $ETHx
function earnedMatchingYields(address account) public view returns (uint256) {
return _userStakingShares[account].mul(_matchingYieldsPerShare.sub(_userMatchingYieldsPerSharePaid[account])).div(1e18).add(_userMatchingYields[account]);
}
// $USB
function earnedMatchedToken(address account) public view returns (uint256) {
uint256 earnedMatchedUsbShares = _earnedMatchedTokenShares(account);
return IUsb(_matchingUsbToken).getBalanceByShares(earnedMatchedUsbShares);
}
// $USB shares
function _earnedMatchedTokenShares(address account) internal view returns (uint256) {
return _userStakingShares[account].mul(_usbSharesPerStakingShare.sub(_userUsbSharesPerStakingSharePaid[account])).div(1e18).add(_userUsbShares[account]);
}
function getStakingSharesByBalance(uint256 stakingBalance) external view returns (uint256) {
return _getStakingSharesByBalance(stakingBalance, 0);
}
function getStakingBalanceByShares(uint256 stakingShares) external view returns (uint256) {
return _getStakingBalanceByShares(stakingShares, 0);
}
// $ETHx
function getAccruedMatchingYields() public view returns(uint256){
return _accruedMatchingYields;
}
/* ========== MUTATIVE FUNCTIONS ========== */
function stake(uint256 amount) external payable nonReentrant onUserAction
updateMatchingYields(_msgSender()) updateTargetTokens(_msgSender()) {
require(amount > 0, "Cannot stake 0");
if (_stakingAssetToken == Constants.NATIVE_TOKEN) {
require(msg.value == amount, "Incorrect msg.value");
}
else {
require(msg.value == 0, "msg.value should be 0");
}
uint256 sharesAmount = _getStakingSharesByBalance(amount, msg.value);
_totalStakingShares = _totalStakingShares.add(sharesAmount);
_userStakingShares[_msgSender()] = _userStakingShares[_msgSender()].add(sharesAmount);
TokensTransfer.transferTokens(_stakingAssetToken, _msgSender(), address(this), amount);
emit Staked(_msgSender(), amount);
}
function withdraw(uint256 amount) public nonReentrant onUserAction
updateMatchingYields(_msgSender()) updateTargetTokens(_msgSender()) {
require(amount > 0, "Cannot withdraw 0");
require(amount <= _userStakingBalance(_msgSender(), 0), "Insufficient balance");
uint256 sharesAmount = _getStakingSharesByBalance(amount, 0);
_totalStakingShares = _totalStakingShares.sub(sharesAmount);
_userStakingShares[_msgSender()] = _userStakingShares[_msgSender()].sub(sharesAmount);
TokensTransfer.transferTokens(_stakingAssetToken, address(this), _msgSender(), amount);
emit Withdrawn(_msgSender(), amount);
}
// $ETHx
function getMatchingYields() public nonReentrant onUserAction updateMatchingYields(_msgSender()) {
uint256 userYields = _userMatchingYields[_msgSender()];
if (userYields > 0) {
_userMatchingYields[_msgSender()] = 0;
TokensTransfer.transferTokens(_matchingYieldsMarginToken, address(this), _msgSender(), userYields);
emit MatchingYieldsPaid(_msgSender(), userYields);
}
}
// $USB
function getMatchingOutTokens() public nonReentrant onUserAction updateTargetTokens(_msgSender()) {
uint256 userUsbShares = _userUsbShares[_msgSender()];
if (userUsbShares > 0) {
_userUsbShares[_msgSender()] = 0;
IUsb(_matchingUsbToken).transferShares(_msgSender(), userUsbShares);
emit MatchedTokenPaid(_msgSender(), IUsb(_matchingUsbToken).getBalanceByShares(userUsbShares));
}
}
function getMatchingTokensAndYields() external {
getMatchingOutTokens();
getMatchingYields();
}
function claimAll() external {
getMatchingOutTokens();
getMatchingYields();
}
function exit() external {
withdraw(_userStakingBalance(_msgSender(), 0));
getMatchingYields();
getMatchingOutTokens();
}
/* ========== RESTRICTED FUNCTIONS ========== */
/**
* Rescue tokens that are accidently sent to this contract
*/
function rescue(address token, address recipient) external nonReentrant onlyOwner {
require(token != address(0) && recipient != address(0), "Zero address detected");
require(token != _stakingAssetToken && token != _matchingUsbToken && token != _stakingYieldsAssetToken && token != _matchingYieldsMarginToken, "Cannot rescue staking or yield tokens");
uint256 amount;
if (token == Constants.NATIVE_TOKEN) {
amount = address(this).balance;
}
else {
amount = IERC20(token).balanceOf(address(this));
}
require(amount > 0, "No tokens to rescue");
TokensTransfer.transferTokens(token, address(this), recipient, amount);
emit TokenRescued(token, recipient, amount);
}
function configureBlastYieldsAndGas() external nonReentrant onlyVault {
address blastAddress = wandProtocol.blastAddress();
if (blastAddress != address(0)) {
IBlast blast = IBlast(wandProtocol.blastAddress());
if (_stakingAssetToken == Constants.NATIVE_TOKEN) {
blast.configureAutomaticYield();
}
blast.configureClaimableGas();
}
}
function configureBlastPoints() external nonReentrant onlyVault {
address blastPointsAddress = wandProtocol.blastPointsAddress();
address blastPointsOperatorAddress = wandProtocol.blastPointsOperator();
if (blastPointsAddress != address(0) && blastPointsOperatorAddress != address(0)) {
IBlastPoints blastPoints = IBlastPoints(blastPointsAddress);
blastPoints.configurePointsOperator(blastPointsOperatorAddress);
}
}
// $ETH; $ETH should be transferred to this contract before calling this function
function addStakingYields(uint256 yieldsAmount) external nonReentrant onlyVault {
require(yieldsAmount > 0, "Too small yields amount");
require(_totalStakingShares > 0, "No user stakes");
emit StakingYieldsAdded(yieldsAmount);
}
// $ETHx; $ETHx should be transferred to this contract before calling this function
function addMatchingYields(uint256 yieldsAmount) external nonReentrant updateMatchingYields(address(0)) onlyVault {
require(yieldsAmount > 0, "Too small yields amount");
require(_totalStakingShares > 0, "No user stakes");
_accruedMatchingYields = _accruedMatchingYields.add(yieldsAmount);
emit MatchingYieldsAdded(yieldsAmount);
}
// $USB; $USB should be minted to this contract before calling this function
function notifySellHighTriggered(uint256 assetAmountMatched, uint256 usbSharesReceived, address assetRecipient) external nonReentrant updateTargetTokens(address(0)) onlyVault {
// require(_vault.vaultMode() == Constants.VaultMode.AdjustmentAboveAARU, "Vault not in adjustment above AARU mode");
TokensTransfer.transferTokens(_stakingAssetToken, address(this), assetRecipient, assetAmountMatched);
_usbSharesPerStakingShare = _usbSharesPerStakingShare.add(usbSharesReceived.mul(1e18).div(_totalStakingShares));
emit MatchedTokensAdded(usbSharesReceived);
// $ETHx
if (_accruedMatchingYields > 0) {
_matchingYieldsPerShare = _matchingYieldsPerShare.add(_accruedMatchingYields.mul(1e18).div(_totalStakingShares));
_accruedMatchingYields = 0;
}
}
/* ================= INTERNAL Functions ================ */
function _userStakingBalance(address account, uint256 msgValue) internal view returns (uint256) {
return _getStakingBalanceByShares(_userStakingShares[account], msgValue);
}
function _totalStakingBalance(uint256 msgValue) internal view returns (uint256) {
if (_stakingAssetToken == Constants.NATIVE_TOKEN) {
return address(this).balance.sub(msgValue);
}
else {
return IERC20(_stakingAssetToken).balanceOf(address(this));
}
}
function _getStakingSharesByBalance(uint256 stakingBalance, uint256 msgValue) internal view returns (uint256) {
if (_totalStakingBalance(msgValue) == 0 || _totalStakingShares == 0) return stakingBalance;
return stakingBalance
.mul(_totalStakingShares)
.div(_totalStakingBalance(msgValue));
}
function _getStakingBalanceByShares(uint256 stakingShares, uint256 msgValue) internal view returns (uint256) {
if (_totalStakingShares == 0) return 0;
return stakingShares
.mul(_totalStakingBalance(msgValue))
.div(_totalStakingShares);
}
/* ========== MODIFIERS ========== */
modifier onUserAction() {
_;
address blastAddress = wandProtocol.blastAddress();
if (blastAddress != address(0)) {
IBlast blast = IBlast(blastAddress);
(uint256 etherSeconds, uint256 etherBalance, ,) = blast.readGasParams(address(this));
if (etherSeconds > 0 && etherBalance > 0) {
blast.claimAllGas(address(this), settings.treasury());
}
}
}
modifier onlyVault() {
require(_msgSender() == address(_vault), "Caller is not Vault");
_;
}
modifier updateMatchingYields(address account) {
if (account != address(0)) {
_userMatchingYields[account] = earnedMatchingYields(account);
_userMatchingYieldsPerSharePaid[account] = _matchingYieldsPerShare;
}
_;
}
modifier updateTargetTokens(address account) {
if (account != address(0)) {
_userUsbShares[account] = _earnedMatchedTokenShares(account);
_userUsbSharesPerStakingSharePaid[account] = _usbSharesPerStakingShare;
}
_;
}
/* ========== EVENTS ========== */
event Staked(address indexed user, uint256 amount);
event Withdrawn(address indexed user, uint256 amount);
event StakingYieldsAdded(uint256 yields);
event MatchingYieldsAdded(uint256 yields);
event MatchedTokensAdded(uint256 amount);
event StakingYieldsPaid(address indexed user, uint256 yields);
event MatchingYieldsPaid(address indexed user, uint256 yields);
event MatchedTokenPaid(address indexed user, uint256 amount);
event TokenRescued(address indexed token, address indexed recipient, uint256 amount);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
*
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
* presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
* need to send a transaction, and thus is not required to hold Ether at all.
*/
interface IERC20Permit {
/**
* @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
* given ``owner``'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/**
* @dev Returns the current nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases ``owner``'s nonce by one. This
* prevents a signature from being used multiple times.
*/
function nonces(address owner) external view returns (uint256);
/**
* @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
*/
// solhint-disable-next-line func-name-mixedcase
function DOMAIN_SEPARATOR() external view returns (bytes32);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
/**
* @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
/**
* @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
* calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
*/
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
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));
}
/**
* @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
/**
* @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful.
*/
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
/**
* @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
* non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to
* 0 before setting it to a non-zero value.
*/
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
/**
* @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`.
* Revert on invalid signature.
*/
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*
* This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
// and not revert is the subcall reverts.
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)
pragma solidity ^0.8.1;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
*
* Furthermore, `isContract` will also return true if the target contract within
* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
* which only has an effect at the end of a transaction.
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
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");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1, "Math: mulDiv overflow");
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the subtraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
enum YieldMode {
AUTOMATIC,
VOID,
CLAIMABLE
}
enum GasMode {
VOID,
CLAIMABLE
}
interface IBlast{
// configure
function configureContract(address contractAddress, YieldMode _yield, GasMode gasMode, address governor) external;
function configure(YieldMode _yield, GasMode gasMode, address governor) external;
// base configuration options
function configureClaimableYield() external;
function configureClaimableYieldOnBehalf(address contractAddress) external;
function configureAutomaticYield() external;
function configureAutomaticYieldOnBehalf(address contractAddress) external;
function configureVoidYield() external;
function configureVoidYieldOnBehalf(address contractAddress) external;
function configureClaimableGas() external;
function configureClaimableGasOnBehalf(address contractAddress) external;
function configureVoidGas() external;
function configureVoidGasOnBehalf(address contractAddress) external;
function configureGovernor(address _governor) external;
function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external;
// claim yield
function claimYield(address contractAddress, address recipientOfYield, uint256 amount) external returns (uint256);
function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256);
// claim gas
function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256);
function claimGasAtMinClaimRate(address contractAddress, address recipientOfGas, uint256 minClaimRateBips) external returns (uint256);
function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256);
function claimGas(address contractAddress, address recipientOfGas, uint256 gasToClaim, uint256 gasSecondsToConsume) external returns (uint256);
// read functions
function readClaimableYield(address contractAddress) external view returns (uint256);
function readYieldConfiguration(address contractAddress) external view returns (uint8);
function readGasParams(address contractAddress) external view returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode);
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
interface IBlastPoints {
function configurePointsOperator(address operator) external;
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
interface IProtocolSettings {
function treasury() external view returns (address);
function decimals() external view returns (uint256);
function isValidParam(bytes32 param, uint256 value) external view returns (bool);
function paramDefaultValue(bytes32 param) external view returns (uint256);
function vaultParamValue(address vault, bytes32 param) external view returns (uint256);
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IUsb is IERC20 {
function decimals() external view returns (uint8);
function getBalanceByShares(uint256 sharesAmount) external view returns (uint256);
function getSharesByBalance(uint256 balance) external view returns (uint256);
function configureBlastYieldsAndGas() external;
function mint(address to, uint256 amount) external returns (uint256);
function burn(address account, uint256 amount) external returns (uint256);
function transferShares(address to, uint256 sharesAmount) external returns (uint256);
function rebase(uint256 addedSupply) external;
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import "../libs/Constants.sol";
interface IVault {
function vaultType() external pure returns (Constants.VaultType);
function AARDecimals() external pure returns (uint256);
function usbToken() external view returns (address);
function assetToken() external view returns (address);
function assetTokenDecimals() external view returns (uint8);
function assetTokenPrice() external view returns (uint256, uint256);
function assetBalance() external view returns (uint256);
function usbTotalSupply() external view returns (uint256);
function marginToken() external view returns (address);
function vaultMode() external view returns (Constants.VaultMode);
function paramValue(bytes32 param) external view returns (uint256);
function AARBelowSafeLineTime() external view returns (uint256);
function AARBelowCircuitBreakerLineTime() external view returns (uint256);
function configureBlastYieldsAndGas() external;
function configureBlastPoints() external;
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
interface IWandProtocol {
function protocolOwner() external view returns (address);
function usbToken() external view returns (address);
function blastAddress() external view returns (address);
function blastPointsAddress() external view returns (address);
function blastPointsOperator() external view returns (address);
function isVault(address vaultAddress) external view returns (bool);
function isVaultAsset(address assetToken) external view returns (bool);
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
library Constants {
/**
* @notice The address interpreted as native token of the chain.
*/
address public constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
uint256 public constant PROTOCOL_DECIMALS = 10;
struct Terms {
uint256 T1;
uint256 T2;
uint256 T3;
uint256 T4;
uint256 T5;
uint256 T6;
uint256 T7;
uint256 T8;
}
enum VaultType {
Volatile,
Stable
}
enum VaultMode {
Empty,
Stability,
AdjustmentBelowAARS,
AdjustmentAboveAARU
}
struct VaultState {
uint256 M_ETH;
uint256 P_ETH;
uint256 P_ETH_DECIMALS;
uint256 M_USB_ETH;
uint256 M_ETHx;
uint256 aar;
uint256 AART;
uint256 AARS;
uint256 AARU;
uint256 AARC;
uint256 AARDecimals;
uint256 RateR;
uint256 AARBelowSafeLineTime;
uint256 AARBelowCircuitBreakerLineTime;
}
struct StableVaultState {
uint256 M_USDC;
uint256 P_USDC;
uint256 P_USDC_DECIMALS;
uint256 M_USB_USDC;
uint256 M_USDCx;
uint256 aar;
// uint256 AART;
uint256 AARS;
// uint256 AARU;
// uint256 AARC;
uint256 AARDecimals;
uint256 RateR;
uint256 AARBelowSafeLineTime;
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "./Constants.sol";
library TokensTransfer {
using SafeERC20 for IERC20;
/// @dev Transfers a given amount of token.
function transferTokens(
address token,
address from,
address to,
uint256 amount
) internal {
if (token == Constants.NATIVE_TOKEN) {
safeTransferNativeToken(from, to, amount);
}
else {
safeTransferERC20(token, from, to, amount);
}
}
/// @dev Transfers `amount` of native token to `to`.
function safeTransferNativeToken(address from, address to, uint256 amount) internal {
require(from != to, "Same address");
require(from != address(0) && to != address(0), "Zero address");
require(from == address(this) || to == address(this), "One of the addresses must be this contract");
require(amount > 0, "Amount must be greater than 0");
if (to == address(this)) {
require(msg.value == amount, "Incorrect msg.value");
return;
}
// solhint-disable avoid-low-level-calls
// slither-disable-next-line low-level-calls
(bool success, ) = to.call{ value: amount }("");
require(success, "Native token transfer failed");
}
/// @dev Transfer `amount` of ERC20 token from `from` to `to`.
function safeTransferERC20(
address token,
address from,
address to,
uint256 amount
) internal {
require(from != to, "Same address");
require(from != address(0) && to != address(0), "Zero address");
// require(from == address(this) || to == address(this), "One of the addresses must be this contract");
require(amount > 0, "Amount must be greater than 0");
if (from == address(this)) {
IERC20(token).safeTransfer(to, amount);
}
else {
IERC20(token).safeTransferFrom(from, to, amount);
}
}
}// SPDX-License-Identifier: Apache-2.0
pragma solidity ^0.8.18;
import "@openzeppelin/contracts/utils/Context.sol";
import "../interfaces/IWandProtocol.sol";
abstract contract ProtocolOwner is Context {
IWandProtocol public immutable wandProtocol;
constructor(address _wandProtocol_) {
require(_wandProtocol_ != address(0), "Zero address detected");
wandProtocol = IWandProtocol(_wandProtocol_);
}
modifier onlyProtocol() {
require(_msgSender() == address(wandProtocol), "Ownable: caller is not the protocol");
_;
}
modifier onlyOwner() {
require(_msgSender() == IWandProtocol(wandProtocol).protocolOwner(), "Ownable: caller is not the owner");
_;
}
function owner() public view returns(address) {
return IWandProtocol(wandProtocol).protocolOwner();
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS =
0x000000000000000000636F6e736F6c652e6c6f67;
function _sendLogPayloadImplementation(bytes memory payload) internal view {
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
pop(
staticcall(
gas(),
consoleAddress,
add(payload, 32),
mload(payload),
0,
0
)
)
}
}
function _castToPure(
function(bytes memory) internal view fnIn
) internal pure returns (function(bytes memory) pure fnOut) {
assembly {
fnOut := fnIn
}
}
function _sendLogPayload(bytes memory payload) internal pure {
_castToPure(_sendLogPayloadImplementation)(payload);
}
function log() internal pure {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
}
function logUint(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function logString(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function log(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint256 p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
}
function log(uint256 p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
}
function log(uint256 p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
}
function log(uint256 p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
}
function log(string memory p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
}
function log(string memory p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
}
function log(bool p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
}
function log(address p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
}
function log(uint256 p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
}
function log(uint256 p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
}
function log(uint256 p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
}
function log(uint256 p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
}
function log(uint256 p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
}
function log(uint256 p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
}
function log(uint256 p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
}
function log(uint256 p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
}
function log(bool p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
}
function log(bool p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
}
function log(bool p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
}
function log(address p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
}
function log(address p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
}
function log(address p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}{
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 100,
"details": {
"yulDetails": {
"optimizerSteps": "u"
}
}
},
"viaIR": true,
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_wandProtocol","type":"address"},{"internalType":"address","name":"_settings","type":"address"},{"internalType":"address","name":"_vault_","type":"address"},{"internalType":"address","name":"_stakingYieldsToken_","type":"address"},{"internalType":"address","name":"_matchingYieldsToken_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MatchedTokenPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MatchedTokensAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"yields","type":"uint256"}],"name":"MatchingYieldsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"yields","type":"uint256"}],"name":"MatchingYieldsPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"yields","type":"uint256"}],"name":"StakingYieldsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"yields","type":"uint256"}],"name":"StakingYieldsPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenRescued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint256","name":"yieldsAmount","type":"uint256"}],"name":"addMatchingYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"yieldsAmount","type":"uint256"}],"name":"addStakingYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureBlastPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureBlastYieldsAndGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earnedMatchedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earnedMatchingYields","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAccruedMatchingYields","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMatchingOutTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMatchingTokensAndYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMatchingYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakingShares","type":"uint256"}],"name":"getStakingBalanceByShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakingBalance","type":"uint256"}],"name":"getStakingSharesByBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"matchingYieldsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetAmountMatched","type":"uint256"},{"internalType":"uint256","name":"usbSharesReceived","type":"uint256"},{"internalType":"address","name":"assetRecipient","type":"address"}],"name":"notifySellHighTriggered","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settings","outputs":[{"internalType":"contract IProtocolSettings","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingYieldsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"userStakingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"userStakingShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wandProtocol","outputs":[{"internalType":"contract IWandProtocol","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60e0604052346200008057620000226200001862000163565b939290926200028f565b6040516128fb62000526823960805181818161038e015281816106e501528181610b3a01528181611d58015281816121460152612352015260a0518181816105e70152610c32015260c05181818161076e015261211401526128fb90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b03821117620000bd57604052565b62000085565b90620000da620000d260405190565b92836200009b565b565b6001600160a01b031690565b90565b6001600160a01b038116036200008057565b90505190620000da82620000eb565b919060a0838203126200008057620001258184620000fd565b92620001358260208301620000fd565b92620000e8620001498460408501620000fd565b93620001598160608601620000fd565b93608001620000fd565b6200018662002e21803803806200017a81620000c3565b9283398101906200010c565b9091929394565b620000e890620000dc906001600160a01b031682565b620000e8906200018d565b620000e890620001a3565b906020828203126200008057620000e891620000fd565b6040513d6000823e3d90fd5b906001600160a01b03905b9181191691161790565b9062000205620000e86200020d92620001ae565b8254620001dc565b9055565b156200021957565b60405162461bcd60e51b815260206004820152604260248201527f507479506f6f6c53656c6c4869676856323a207374616b696e6720746f6b656e60448201527f20616e64207374616b696e67207969656c647320746f6b656e206d69736d61746064820152610c6d60f31b608482015260a490fd5b91620002b0620002b992620002aa620002ee9796956200046c565b620001ae565b60a052620001ae565b60c0526020620002d5620002aa60c0516001600160a01b031690565b631083f76190620002e560405190565b95869260e01b90565b825260049082905afa928315620004005762000344936200031b9160009162000406575b506001620001f1565b602062000334620002aa6080516001600160a01b031690565b632e20712190620002e560405190565b825260049082905afa9081156200040057620003756200037d926200038595600091620003cb575b506002620001f1565b6003620001f1565b6004620001f1565b620000da6200039c6001546001600160a01b031690565b620003c4620003b7620000dc6003546001600160a01b031690565b916001600160a01b031690565b1462000211565b620003f1915060203d8111620003f8575b620003e881836200009b565b810190620001b9565b386200036c565b503d620003dc565b620001d0565b62000422915060203d8111620003f857620003e881836200009b565b3862000312565b620000e8620000e8620000e89290565b620000e8600162000429565b9060001990620001e7565b9062000464620000e86200020d9262000429565b825462000445565b6200047790620004f5565b620000da6200048562000439565b600062000450565b620000dc620000e8620000e89290565b620000e8906200048d565b15620004b057565b60405162461bcd60e51b815260206004820152601560248201527f5a65726f206164647265737320646574656374656400000000000000000000006044820152606490fd5b6200052090620002aa6200050e620000dc60006200049d565b6001600160a01b0383161415620004a8565b60805256fe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630245f319146101f65780630777e629146101f15780630e58f7ab146101ec5780631b2a1914146101e75780632e1a7d4d146101e2578063327107f7146101dd57806339db85c5146101d85780633fef6dc1146101d35780634e29a333146101ce5780634eb711dc146101c95780634fdf5d1d146101c45780636e9b6bf7146101bf57806370c6a17e146101ba57806372f702f3146101b557806374b0244a146101b057806389a2166a146101ab5780638da5cb5b146101a6578063966d13ee146101a1578063a61fa6771461019c578063a694fc3a14610197578063ba4ef6d514610192578063c55bc29f1461018d578063d1058e591461018d578063d9a023e014610188578063ddef195314610183578063e06174e41461017e578063e766c83514610179578063e833e07c14610174578063e9fad8ee1461016f5763fbfa77cf0361000e57610656565b61063e565b610626565b61060b565b6105d2565b6105ba565b61059f565b610587565b61056c565b610559565b61053e565b610523565b610508565b6104ed565b6104d2565b6104a3565b610488565b61046d565b610454565b610418565b6103ba565b610379565b610322565b610307565b6102ef565b6102d7565b6102b0565b61025f565b61020b565b600091031261020657565b600080fd5b346102065761021b3660046101fb565b610223611b24565b604051005b0390f35b805b0361020657565b905035906102428261022c565b565b906020828203126102065761025891610235565b90565b9052565b346102065761022861027a610275366004610244565b610a51565b6040515b9182918290815260200190565b6001600160a01b031690565b61025b9061028b565b6020810192916102429190610297565b34610206576102c03660046101fb565b6102286102cb6107b9565b604051918291826102a0565b34610206576102236102ea366004610244565b6125b2565b3461020657610223610302366004610244565b611a4f565b34610206576103173660046101fb565b6102286102cb6107af565b3461020657610223610335366004610244565b61266d565b6102589061028b906001600160a01b031682565b6102589061033a565b6102589061034e565b61025b90610357565b6020810192916102429190610360565b34610206576103893660046101fb565b6102287f00000000000000000000000000000000000000000000000000000000000000005b60405191829182610369565b34610206576103ca3660046101fb565b61022361232e565b61022e8161028b565b90503590610242826103d2565b9091606082840312610206576102586104018484610235565b9361040f8160208601610235565b936040016103db565b346102065761022361042b3660046103e8565b916127b0565b9190604083820312610206576102589061044b81856103db565b936020016103db565b3461020657610223610467366004610431565b906120a8565b346102065761022861027a610483366004610244565b610a65565b34610206576104983660046101fb565b61022861027a6107de565b34610206576104b33660046101fb565b6102286102cb6107a5565b9060208282031261020657610258916103db565b346102065761022861027a6104e83660046104be565b61081f565b34610206576104fd3660046101fb565b6102286102cb6107c3565b34610206576105183660046101fb565b6102286102cb6106db565b346102065761022861027a6105393660046104be565b61083b565b346102065761054e3660046101fb565b61022861027a610a79565b610223610567366004610244565b611025565b346102065761022861027a6105823660046104be565b61084f565b34610206576105973660046101fb565b610223611cb8565b346102065761022861027a6105b53660046104be565b61097a565b34610206576105ca3660046101fb565b6102236124a2565b34610206576105e23660046101fb565b6102287f00000000000000000000000000000000000000000000000000000000000000006103ae565b346102065761061b3660046101fb565b61022861027a6107f5565b34610206576106363660046101fb565b610223611cb0565b346102065761064e3660046101fb565b610223611cc8565b34610206576106663660046101fb565b6102286102cb610769565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff8211176106a957604052565b610671565b90505190610242826103d2565b9060208282031261020657610258916106ae565b6040513d6000823e3d90fd5b61072160206107097f0000000000000000000000000000000000000000000000000000000000000000610357565b63c1d6ba699061071860405190565b93849260e01b90565b825260049082905afa9081156107645760009161073c575090565b610258915060203d811161075d575b6107558183610687565b8101906106bb565b503d61074b565b6106cf565b6102587f0000000000000000000000000000000000000000000000000000000000000000610357565b6102589061028b565b6102589054610792565b610258600161079b565b610258600261079b565b610258600361079b565b610258600461079b565b6102589081565b61025890546107cd565b61025860056107d4565b6102586102586102589290565b61025861080260006107e8565b6127d3565b9061081190610357565b600052602052604060002090565b6108366102589161082e600090565b506006610807565b6107d4565b6102589061084960006107e8565b906127bb565b610258906108b36108366108ab61089461086d610836866006610807565b61088e61087a60086107d4565b610888610836896009610807565b906108f8565b90610915565b6108a5670de0b6b3a76400006107e8565b9061094f565b92600a610807565b906108e1565b634e487b7160e01b600052601160045260246000fd5b919082018092116108dc57565b6108b9565b61025891906108cf565b919082039182116108dc57565b61025891906108eb565b818102929181159184041417156108dc57565b6102589190610902565b634e487b7160e01b600052601260045260246000fd5b9061093f565b9190565b90811561094a570490565b61091f565b6102589190610935565b905051906102428261022c565b906020828203126102065761025891610959565b60206109916109d29261098b600090565b50610a10565b6109a66109a16109a1600261079b565b610357565b6109c463db977f956109b760405190565b9586948593849360e01b90565b835260048301526024820190565b03915afa908115610764576000916109e8575090565b610258915060203d8111610a09575b610a018183610687565b810190610966565b503d6109f7565b610258906108b3610836610a49610894610a2e610836866006610807565b61088e610a3b600b6107d4565b61088861083689600c610807565b92600d610807565b61025890610a5f60006107e8565b9061282b565b61025890610a7360006107e8565b90612889565b61025860076107d4565b610a9490610a8f611084565b610b27565b6102426110b6565b61028b6102586102589290565b61025890610a9c565b6002111561020657565b9050519061024282610ab2565b60808183031261020657610add8282610959565b92610258610aee8460208501610959565b93610afc8160408601610959565b93606001610abc565b916020610242929493610b2060408201966000830190610297565b0190610297565b610b3090610d7e565b610b6d6020610b5e7f0000000000000000000000000000000000000000000000000000000000000000610357565b6349d3d5e19061071860405190565b825260049082905afa90811561076457600091610d4c575b50600090610b9a610b9583610aa9565b61028b565b610ba38261028b565b03610bac575050565b6109a1610bb891610357565b63dde798a4610bc630610357565b90610bda610bd360405190565b9160e01b90565b815260808180610bed85600483016102a0565b0381865afa8015610764576000918291610d19575b50610c0f61093b866107e8565b119081610d04575b50610c2157505050565b610c6e9163954fa5ee936020610c567f0000000000000000000000000000000000000000000000000000000000000000610357565b6361d027b390610c6560405190565b96879260e01b90565b825260049082905afa93841561076457600094610cde575b50610ca89060209495610cb3610c9b60405190565b9788968795869460e01b90565b845260048401610b05565b03925af1801561076457610cc45750565b610cdb9060203d8111610a0957610a018183610687565b50565b6020945090610cfc610ca892863d811161075d576107558183610687565b945090610c86565b9050610d1261093b856107e8565b1138610c17565b9050610d3c915060803d8111610d45575b610d348183610687565b810190610ac9565b50919091610c02565b503d610d2a565b610d64915060203d811161075d576107558183610687565b38610b85565b90610258610258610d7a926107e8565b9055565b6102429033610d90610b956000610aa9565b610d998261028b565b03610da5575b50610de0565b80610dc5610db5610dda9361084f565b610dc083600a610807565b610d6a565b610dc0610dd260086107d4565b916009610807565b38610d9f565b6102429033610df2610b956000610aa9565b610dfb8261028b565b03610e07575b50610f08565b80610e22610e17610e3793610a10565b610dc083600d610807565b610dc0610e2f600b6107d4565b91600c610807565b38610e01565b0190565b15610e4857565b60405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b6044820152606490fd5b0390fd5b15610e8957565b60405162461bcd60e51b815260206004820152601560248201527406d73672e76616c75652073686f756c64206265203605c1b6044820152606490fd5b15610ecd57565b60405162461bcd60e51b8152602060048201526013602482015272496e636f7272656374206d73672e76616c756560681b6044820152606490fd5b6000610f1d610f16826107e8565b8311610e41565b610f27600161079b565b610f4d610f4773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61028b565b9161028b565b036110095750610f5f81345b14610ec6565b610fa9610faf610f6f348461282b565b610f8c610f8582610f8060056107d4565b6108e1565b6005610d6a565b610dc0600691610f993390565b948591610f806108368487610807565b92610807565b610fcd82610fbd600161079b565b83610fc730610357565b916110c1565b611004610ffa7f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d92610357565b9261027e60405190565b0390a2565b6110209061101a61093b34926107e8565b14610e82565b610f5f565b61024290610a83565b61025860026107e8565b1561103f57565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b61024261109160006107d4565b6110a561109c61102e565b91821415611038565b6000610d6a565b61025860016107e8565b6102426110a56110ac565b9291906110e173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61028b565b6110ea8561028b565b036110f95761024293506112d6565b610242936113dd565b1561110957565b60405162461bcd60e51b815260206004820152600c60248201526b53616d65206164647265737360a01b6044820152606490fd5b1561114457565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b1561117f57565b60405162461bcd60e51b815260206004820152602a60248201527f4f6e65206f662074686520616464726573736573206d757374206265207468696044820152691cc818dbdb9d1c9858dd60b21b6064820152608490fd5b156111de57565b60405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b9061024261123060405190565b9283610687565b67ffffffffffffffff81116106a957602090601f01601f19160190565b9061126661126183611237565b611223565b918252565b3d156112855761127a3d611254565b903d6000602084013e565b606090565b1561129157565b60405162461bcd60e51b815260206004820152601c60248201527f4e617469766520746f6b656e207472616e73666572206661696c6564000000006044820152606490fd5b906112f36112e38261028b565b6112ec8461028b565b1415611102565b61136160009261132661130585610aa9565b61130e8161028b565b6113178461028b565b141590816113c2575b5061113d565b61132f30610357565b9061133c610f478361028b565b1480156113a4575b61134d90611178565b610b95611359856107e8565b865b116111d7565b61136a8261028b565b146113935781906102429361137e60405190565b90818003925af161138d61126b565b5061128a565b505061024290610f5961093b349290565b5061134d6113b18261028b565b6113ba8561028b565b149050611344565b6113cc915061028b565b6113d58561028b565b141538611320565b9291906113f56113ec8361028b565b6112ec8361028b565b61143461142e600061142961140982610aa9565b6114128161028b565b61141b8761028b565b14159081611471575061113d565b6107e8565b8461135b565b611440610b9530610357565b6114498261028b565b03611460575061145b61024293610357565b6114c9565b61146c61024294610357565b61153b565b61147b915061028b565b6113d58761028b565b61149d6114976102589263ffffffff1690565b60e01b90565b6001600160e01b03191690565b9160206102429294936114c560408201966000830190610297565b0152565b61150c6004926114fd610242956114e363a9059cbb611484565b926114ed60405190565b96879460208601908152016114aa565b60208201810382520383610687565b611634565b6040906114c5610242949695939661153160608401986000850190610297565b6020830190610297565b9061150c906114fd610242956004956115576323b872dd611484565b9361156160405190565b9788956020870190815201611511565b61157b6020611254565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602082015290565b610258611571565b80151561022e565b90505190610242826115ac565b9060208282031261020657610258916115b4565b156115dc57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6102429161164461165392610357565b9061164d6115a4565b91611691565b805161166261093b60006107e8565b14908115611671575b506115d5565b61168b91506020611680825190565b8183010191016115c1565b3861166b565b61025892916116a060006107e8565b91611701565b156116ad57565b60405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608490fd5b90600061025894938192611713606090565b5061172a61172030610357565b83903110156116a6565b60208101905191855af161173c61126b565b9161178e565b1561174957565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b919290156117c0575081516117a661093b60006107e8565b146117af575090565b6117bb610258916117c6565b611742565b82611840565b3b6117d461093b60006107e8565b1190565b60005b8381106117eb5750506000910152565b81810151838201526020016117db565b61181c611825602093610e3d93611810815190565b80835293849260200190565b958691016117d8565b601f01601f191690565b6020808252610258929101906117fb565b90611849825190565b61185661093b60006107e8565b11156118655750805190602001fd5b610e7e9061187260405190565b62461bcd60e51b81529182916004830161182f565b610a9490611893611084565b610b309061024290336118a9610b956000610aa9565b6118b28261028b565b036118be575b506118d4565b80610dc5610db56118ce9361084f565b386118b8565b61024290336118e6610b956000610aa9565b6118ef8261028b565b036118fb575b50611994565b80610e22610e1761190b93610a10565b386118f5565b1561191857565b60405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b6044820152606490fd5b1561195857565b60405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606490fd5b60006119a96119a2826107e8565b8311611911565b611a046119d76119b933936107e8565b6119d16119c961025883876127bb565b861115611951565b8461282b565b6119ed610f85826119e860056107d4565b6108f8565b610dc083610fa96006936119e86108368487610807565b611a228282611a13600161079b565b611a1c30610357565b906110c1565b611004610ffa7f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d592610357565b61024290611887565b611a60611084565b610a94610b3033611a74610b956000610aa9565b611a7d8261028b565b03611a8c575b50610242611aa2565b80610dc5610db5611a9c9361084f565b38611a83565b600a33611ab26108368284610807565b91600090611abf826107e8565b8411611acc575b50505050565b610dc083610fa9611adc946107e8565b611aeb8282611a13600461079b565b611b18610ffa7f16170af92486b13822506c799b60d90566db7dd7a9948d206c487895e7f1c7a792610357565b0390a238808080611ac6565b610242611a58565b611b34611084565b610a94610b3033611b48610b956000610aa9565b611b518261028b565b03611b60575b50610242611b76565b80610e22610e17611b7093610a10565b38611b57565b600d33611b866108368284610807565b600092611b92846107e8565b8211611b9e5750505050565b611baf90610dc084610fa9876107e8565b6020611bdd611bc46109a16109a1600261079b565b638fcb4e5b611bd260405190565b968793849260e01b90565b825281611bee8789600484016114aa565b03925af190811561076457611c3493602092611c95575b50611c166109a16109a1600261079b565b6109c463db977f95611c2760405190565b9687948593849360e01b90565b03915afa91821561076457600092611c75575b50611b18610ffa7f028a7618a2d8f77fcfce10a6c69e1a551ddbdcc42846c1041a449b94d2f0166092610357565b611c8e91925060203d8111610a0957610a018183610687565b9038611c47565b611cab90833d8111610a0957610a018183610687565b611c05565b610242611b2c565b611cc0611cb0565b610242611b24565b611cd96103023361084960006107e8565b611ce1611b24565b610242611cb0565b90610a9491611cf6611084565b611d4b565b15611d0257565b60405162461bcd60e51b815280610e7e600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b903391611d7c60206107097f0000000000000000000000000000000000000000000000000000000000000000610357565b825260049082905afa93841561076457611da8610f4761024296611dae94600091611db3575b5061028b565b14611cfb565b611eb1565b611dcb915060203d811161075d576107558183610687565b38611da2565b15611dd857565b60405162461bcd60e51b815260206004820152601560248201527416995c9bc81859191c995cdcc819195d1958dd1959605a1b6044820152606490fd5b15611e1c57565b60405162461bcd60e51b815260206004820152602560248201527f43616e6e6f7420726573637565207374616b696e67206f72207969656c6420746044820152646f6b656e7360d81b6064820152608490fd5b15611e7657565b60405162461bcd60e51b81526020600482015260136024820152724e6f20746f6b656e7320746f2072657363756560681b6044820152606490fd5b90600091611ee2611ec184610aa9565b611eca8161028b565b611ed38461028b565b1415908161208d575b50611dd1565b611eef610b95600161079b565b611ef88261028b565b14158061206f575b80612051575b8061202e575b611f1590611e15565b611f3273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61028b565b611f3b8261028b565b03611fb657611f5d611f56611f4f30610357565b31946107e8565b8411611e6f565b611f718383611f6b30610357565b846110c1565b611fb1611fa7611fa17f4143f7b5cb6ea007914c32b8a3e64cebc051d7f493fa0755454da1e47701e12593610357565b93610357565b9361027e60405190565b0390a3565b611fee6020611fc76109a184610357565b6370a0823190611fe3611fd930610357565b926109b760405190565b8352600483016102a0565b03915afa90811561076457611f5d91611f5691600091612010575b50946107e8565b612028915060203d8111610a0957610a018183610687565b38612009565b50611f1561203f610b95600461079b565b6120488361028b565b14159050611f0c565b5061205f610b95600361079b565b6120688261028b565b1415611f06565b5061207d610b95600261079b565b6120868261028b565b1415611f00565b612097915061028b565b6120a08461028b565b141538611edc565b9061024291611ce9565b6120ba611084565b610a94612104565b156120c957565b60405162461bcd60e51b815260206004820152601360248201527210d85b1b195c881a5cc81b9bdd0815985d5b1d606a1b6044820152606490fd5b61213e335b612138610f47610b957f0000000000000000000000000000000000000000000000000000000000000000610357565b146120c2565b61024261216a7f0000000000000000000000000000000000000000000000000000000000000000610357565b6349d3d5e161217860405190565b916121838260e01b90565b8352602083600481845afa9283156107645760009361230e575b506000926121b0610f47610b9586610aa9565b036121ba57505050565b6121ca9160209161071860405190565b825260049082905afa8015610764576121eb916000916122f0575b50610357565b6121f5600161079b565b612215610f4773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61028b565b14612282575b61222490610357565b634e606c4790803b156102065761224091839161071860405190565b8252818381600481015b03925af180156107645761225c575050565b8161024292903d1061227b575b6122738183610687565b8101906101fb565b503d612269565b61228b81610357565b90637114177a91803b15610206576122b19284916122a860405190565b94859260e01b90565b8252600490829084905af191821561076457612224926122d4575b50905061221b565b6122ea90843d861161227b576122738183610687565b386122cc565b612308915060203d811161075d576107558183610687565b386121e5565b61232791935060203d811161075d576107558183610687565b913861219d565b6102426120b2565b61233e611084565b610a9461234a33612109565b6102426123767f0000000000000000000000000000000000000000000000000000000000000000610357565b63095f363c9061238f61238860405190565b9260e01b90565b8252602082600481845afa9182156107645760009261247c575b5060206123bf916340ae3e149061071860405190565b825260049082905afa9081156107645760009161245e575b506000916123e483610aa9565b6123ed8161028b565b6123f68361028b565b14159081612443575b5061240957505050565b6109a161241591610357565b906336b91f2b90823b156102065761224a92611fe385809461243660405190565b9687958694859360e01b90565b61244d915061028b565b6124568361028b565b1415386123ff565b612476915060203d811161075d576107558183610687565b386123d7565b6123bf91925061249a602091823d811161075d576107558183610687565b9291506123a9565b610242612336565b610a94906124b6611084565b610242906124c333612109565b61254b565b156124cf57565b60405162461bcd60e51b8152602060048201526017602482015276151bdbc81cdb585b1b081e5a595b191cc8185b5bdd5b9d604a1b6044820152606490fd5b1561251557565b60405162461bcd60e51b815260206004820152600e60248201526d4e6f2075736572207374616b657360901b6044820152606490fd5b61257f600061256361255c826107e8565b84116124c8565b61257961093b61257360056107d4565b926107e8565b1161250e565b6125ad7fef9997e3cc5a6aa364e4fcd642a78d1829153c8cc7d9c1d1f8a4d8a8f550340b9161027e60405190565b0390a1565b610242906124aa565b610a94906125c7611084565b610242906125d56000610aa9565b6125de8161028b565b6125e78261028b565b036125f3575b50612609565b80610dc5610db56126039361084f565b386125ed565b6102429061261633612109565b612627600061256361255c826107e8565b61263f61263882610f8060076107d4565b6007610d6a565b6125ad7f2c73fdf4d1f9c370b0d2bf8570e6b5e4d9fbb6369480509c6c4f6f2e01e090c69161027e60405190565b610242906125bb565b90610a949291612684611084565b9061024292916126946000610aa9565b61269d8161028b565b6126a68261028b565b036126b2575b506126c8565b80610e22610e176126c293610a10565b386126ac565b6102429291906126d733612109565b6126e69192611a13600161079b565b6126f0600b6107d4565b90612727612720612708670de0b6b3a76400006107e8565b936108b36127168686610915565b6108a560056107d4565b600b610d6a565b6127557f548c13486a320e74478d352afe4d4686c434957a45d93c376a871a8a4b9fa6f99161027e60405190565b0390a161276260076107d4565b9060009161277261093b846107e8565b1161277b575050565b610242916114296127a9612638936108b361271661279960086107d4565b926127a460076107d4565b610915565b6008610d6a565b906102429291612676565b906127ce6108366102589361082e600090565b612889565b6127dd600161079b565b6127fd610f4773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61028b565b03612815576102589061280f30610357565b316108f8565b506109d26020611fc76109a16109a1600161079b565b90612835816127d3565b60009061284461093b836107e8565b14908115612870575b5061286c576108a56128666102589361088e60056107d4565b916127d3565b5090565b905061288261093b61257360056107d4565b143861284d565b9061289460056107d4565b6000906128a361093b836107e8565b146128b957506102589161088e612716926127d3565b905061025891506107e856fea264697066735822122000ca5c578fa7e45dca0ab1d8b82d5baece35938e1a5070a0fb0339d121e2be2364736f6c6343000812003300000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f87933000000000000000000000000691867213c0d43c167e7c035e489ae36f3286141000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000d79d6fe06f4c2b17291015169d1443f50d0c2838
Deployed Bytecode
0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630245f319146101f65780630777e629146101f15780630e58f7ab146101ec5780631b2a1914146101e75780632e1a7d4d146101e2578063327107f7146101dd57806339db85c5146101d85780633fef6dc1146101d35780634e29a333146101ce5780634eb711dc146101c95780634fdf5d1d146101c45780636e9b6bf7146101bf57806370c6a17e146101ba57806372f702f3146101b557806374b0244a146101b057806389a2166a146101ab5780638da5cb5b146101a6578063966d13ee146101a1578063a61fa6771461019c578063a694fc3a14610197578063ba4ef6d514610192578063c55bc29f1461018d578063d1058e591461018d578063d9a023e014610188578063ddef195314610183578063e06174e41461017e578063e766c83514610179578063e833e07c14610174578063e9fad8ee1461016f5763fbfa77cf0361000e57610656565b61063e565b610626565b61060b565b6105d2565b6105ba565b61059f565b610587565b61056c565b610559565b61053e565b610523565b610508565b6104ed565b6104d2565b6104a3565b610488565b61046d565b610454565b610418565b6103ba565b610379565b610322565b610307565b6102ef565b6102d7565b6102b0565b61025f565b61020b565b600091031261020657565b600080fd5b346102065761021b3660046101fb565b610223611b24565b604051005b0390f35b805b0361020657565b905035906102428261022c565b565b906020828203126102065761025891610235565b90565b9052565b346102065761022861027a610275366004610244565b610a51565b6040515b9182918290815260200190565b6001600160a01b031690565b61025b9061028b565b6020810192916102429190610297565b34610206576102c03660046101fb565b6102286102cb6107b9565b604051918291826102a0565b34610206576102236102ea366004610244565b6125b2565b3461020657610223610302366004610244565b611a4f565b34610206576103173660046101fb565b6102286102cb6107af565b3461020657610223610335366004610244565b61266d565b6102589061028b906001600160a01b031682565b6102589061033a565b6102589061034e565b61025b90610357565b6020810192916102429190610360565b34610206576103893660046101fb565b6102287f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b5b60405191829182610369565b34610206576103ca3660046101fb565b61022361232e565b61022e8161028b565b90503590610242826103d2565b9091606082840312610206576102586104018484610235565b9361040f8160208601610235565b936040016103db565b346102065761022361042b3660046103e8565b916127b0565b9190604083820312610206576102589061044b81856103db565b936020016103db565b3461020657610223610467366004610431565b906120a8565b346102065761022861027a610483366004610244565b610a65565b34610206576104983660046101fb565b61022861027a6107de565b34610206576104b33660046101fb565b6102286102cb6107a5565b9060208282031261020657610258916103db565b346102065761022861027a6104e83660046104be565b61081f565b34610206576104fd3660046101fb565b6102286102cb6107c3565b34610206576105183660046101fb565b6102286102cb6106db565b346102065761022861027a6105393660046104be565b61083b565b346102065761054e3660046101fb565b61022861027a610a79565b610223610567366004610244565b611025565b346102065761022861027a6105823660046104be565b61084f565b34610206576105973660046101fb565b610223611cb8565b346102065761022861027a6105b53660046104be565b61097a565b34610206576105ca3660046101fb565b6102236124a2565b34610206576105e23660046101fb565b6102287f0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f879336103ae565b346102065761061b3660046101fb565b61022861027a6107f5565b34610206576106363660046101fb565b610223611cb0565b346102065761064e3660046101fb565b610223611cc8565b34610206576106663660046101fb565b6102286102cb610769565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff8211176106a957604052565b610671565b90505190610242826103d2565b9060208282031261020657610258916106ae565b6040513d6000823e3d90fd5b61072160206107097f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b610357565b63c1d6ba699061071860405190565b93849260e01b90565b825260049082905afa9081156107645760009161073c575090565b610258915060203d811161075d575b6107558183610687565b8101906106bb565b503d61074b565b6106cf565b6102587f000000000000000000000000691867213c0d43c167e7c035e489ae36f3286141610357565b6102589061028b565b6102589054610792565b610258600161079b565b610258600261079b565b610258600361079b565b610258600461079b565b6102589081565b61025890546107cd565b61025860056107d4565b6102586102586102589290565b61025861080260006107e8565b6127d3565b9061081190610357565b600052602052604060002090565b6108366102589161082e600090565b506006610807565b6107d4565b6102589061084960006107e8565b906127bb565b610258906108b36108366108ab61089461086d610836866006610807565b61088e61087a60086107d4565b610888610836896009610807565b906108f8565b90610915565b6108a5670de0b6b3a76400006107e8565b9061094f565b92600a610807565b906108e1565b634e487b7160e01b600052601160045260246000fd5b919082018092116108dc57565b6108b9565b61025891906108cf565b919082039182116108dc57565b61025891906108eb565b818102929181159184041417156108dc57565b6102589190610902565b634e487b7160e01b600052601260045260246000fd5b9061093f565b9190565b90811561094a570490565b61091f565b6102589190610935565b905051906102428261022c565b906020828203126102065761025891610959565b60206109916109d29261098b600090565b50610a10565b6109a66109a16109a1600261079b565b610357565b6109c463db977f956109b760405190565b9586948593849360e01b90565b835260048301526024820190565b03915afa908115610764576000916109e8575090565b610258915060203d8111610a09575b610a018183610687565b810190610966565b503d6109f7565b610258906108b3610836610a49610894610a2e610836866006610807565b61088e610a3b600b6107d4565b61088861083689600c610807565b92600d610807565b61025890610a5f60006107e8565b9061282b565b61025890610a7360006107e8565b90612889565b61025860076107d4565b610a9490610a8f611084565b610b27565b6102426110b6565b61028b6102586102589290565b61025890610a9c565b6002111561020657565b9050519061024282610ab2565b60808183031261020657610add8282610959565b92610258610aee8460208501610959565b93610afc8160408601610959565b93606001610abc565b916020610242929493610b2060408201966000830190610297565b0190610297565b610b3090610d7e565b610b6d6020610b5e7f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b610357565b6349d3d5e19061071860405190565b825260049082905afa90811561076457600091610d4c575b50600090610b9a610b9583610aa9565b61028b565b610ba38261028b565b03610bac575050565b6109a1610bb891610357565b63dde798a4610bc630610357565b90610bda610bd360405190565b9160e01b90565b815260808180610bed85600483016102a0565b0381865afa8015610764576000918291610d19575b50610c0f61093b866107e8565b119081610d04575b50610c2157505050565b610c6e9163954fa5ee936020610c567f0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f87933610357565b6361d027b390610c6560405190565b96879260e01b90565b825260049082905afa93841561076457600094610cde575b50610ca89060209495610cb3610c9b60405190565b9788968795869460e01b90565b845260048401610b05565b03925af1801561076457610cc45750565b610cdb9060203d8111610a0957610a018183610687565b50565b6020945090610cfc610ca892863d811161075d576107558183610687565b945090610c86565b9050610d1261093b856107e8565b1138610c17565b9050610d3c915060803d8111610d45575b610d348183610687565b810190610ac9565b50919091610c02565b503d610d2a565b610d64915060203d811161075d576107558183610687565b38610b85565b90610258610258610d7a926107e8565b9055565b6102429033610d90610b956000610aa9565b610d998261028b565b03610da5575b50610de0565b80610dc5610db5610dda9361084f565b610dc083600a610807565b610d6a565b610dc0610dd260086107d4565b916009610807565b38610d9f565b6102429033610df2610b956000610aa9565b610dfb8261028b565b03610e07575b50610f08565b80610e22610e17610e3793610a10565b610dc083600d610807565b610dc0610e2f600b6107d4565b91600c610807565b38610e01565b0190565b15610e4857565b60405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b6044820152606490fd5b0390fd5b15610e8957565b60405162461bcd60e51b815260206004820152601560248201527406d73672e76616c75652073686f756c64206265203605c1b6044820152606490fd5b15610ecd57565b60405162461bcd60e51b8152602060048201526013602482015272496e636f7272656374206d73672e76616c756560681b6044820152606490fd5b6000610f1d610f16826107e8565b8311610e41565b610f27600161079b565b610f4d610f4773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61028b565b9161028b565b036110095750610f5f81345b14610ec6565b610fa9610faf610f6f348461282b565b610f8c610f8582610f8060056107d4565b6108e1565b6005610d6a565b610dc0600691610f993390565b948591610f806108368487610807565b92610807565b610fcd82610fbd600161079b565b83610fc730610357565b916110c1565b611004610ffa7f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d92610357565b9261027e60405190565b0390a2565b6110209061101a61093b34926107e8565b14610e82565b610f5f565b61024290610a83565b61025860026107e8565b1561103f57565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b61024261109160006107d4565b6110a561109c61102e565b91821415611038565b6000610d6a565b61025860016107e8565b6102426110a56110ac565b9291906110e173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61028b565b6110ea8561028b565b036110f95761024293506112d6565b610242936113dd565b1561110957565b60405162461bcd60e51b815260206004820152600c60248201526b53616d65206164647265737360a01b6044820152606490fd5b1561114457565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b1561117f57565b60405162461bcd60e51b815260206004820152602a60248201527f4f6e65206f662074686520616464726573736573206d757374206265207468696044820152691cc818dbdb9d1c9858dd60b21b6064820152608490fd5b156111de57565b60405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b9061024261123060405190565b9283610687565b67ffffffffffffffff81116106a957602090601f01601f19160190565b9061126661126183611237565b611223565b918252565b3d156112855761127a3d611254565b903d6000602084013e565b606090565b1561129157565b60405162461bcd60e51b815260206004820152601c60248201527f4e617469766520746f6b656e207472616e73666572206661696c6564000000006044820152606490fd5b906112f36112e38261028b565b6112ec8461028b565b1415611102565b61136160009261132661130585610aa9565b61130e8161028b565b6113178461028b565b141590816113c2575b5061113d565b61132f30610357565b9061133c610f478361028b565b1480156113a4575b61134d90611178565b610b95611359856107e8565b865b116111d7565b61136a8261028b565b146113935781906102429361137e60405190565b90818003925af161138d61126b565b5061128a565b505061024290610f5961093b349290565b5061134d6113b18261028b565b6113ba8561028b565b149050611344565b6113cc915061028b565b6113d58561028b565b141538611320565b9291906113f56113ec8361028b565b6112ec8361028b565b61143461142e600061142961140982610aa9565b6114128161028b565b61141b8761028b565b14159081611471575061113d565b6107e8565b8461135b565b611440610b9530610357565b6114498261028b565b03611460575061145b61024293610357565b6114c9565b61146c61024294610357565b61153b565b61147b915061028b565b6113d58761028b565b61149d6114976102589263ffffffff1690565b60e01b90565b6001600160e01b03191690565b9160206102429294936114c560408201966000830190610297565b0152565b61150c6004926114fd610242956114e363a9059cbb611484565b926114ed60405190565b96879460208601908152016114aa565b60208201810382520383610687565b611634565b6040906114c5610242949695939661153160608401986000850190610297565b6020830190610297565b9061150c906114fd610242956004956115576323b872dd611484565b9361156160405190565b9788956020870190815201611511565b61157b6020611254565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602082015290565b610258611571565b80151561022e565b90505190610242826115ac565b9060208282031261020657610258916115b4565b156115dc57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6102429161164461165392610357565b9061164d6115a4565b91611691565b805161166261093b60006107e8565b14908115611671575b506115d5565b61168b91506020611680825190565b8183010191016115c1565b3861166b565b61025892916116a060006107e8565b91611701565b156116ad57565b60405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608490fd5b90600061025894938192611713606090565b5061172a61172030610357565b83903110156116a6565b60208101905191855af161173c61126b565b9161178e565b1561174957565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b919290156117c0575081516117a661093b60006107e8565b146117af575090565b6117bb610258916117c6565b611742565b82611840565b3b6117d461093b60006107e8565b1190565b60005b8381106117eb5750506000910152565b81810151838201526020016117db565b61181c611825602093610e3d93611810815190565b80835293849260200190565b958691016117d8565b601f01601f191690565b6020808252610258929101906117fb565b90611849825190565b61185661093b60006107e8565b11156118655750805190602001fd5b610e7e9061187260405190565b62461bcd60e51b81529182916004830161182f565b610a9490611893611084565b610b309061024290336118a9610b956000610aa9565b6118b28261028b565b036118be575b506118d4565b80610dc5610db56118ce9361084f565b386118b8565b61024290336118e6610b956000610aa9565b6118ef8261028b565b036118fb575b50611994565b80610e22610e1761190b93610a10565b386118f5565b1561191857565b60405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b6044820152606490fd5b1561195857565b60405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606490fd5b60006119a96119a2826107e8565b8311611911565b611a046119d76119b933936107e8565b6119d16119c961025883876127bb565b861115611951565b8461282b565b6119ed610f85826119e860056107d4565b6108f8565b610dc083610fa96006936119e86108368487610807565b611a228282611a13600161079b565b611a1c30610357565b906110c1565b611004610ffa7f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d592610357565b61024290611887565b611a60611084565b610a94610b3033611a74610b956000610aa9565b611a7d8261028b565b03611a8c575b50610242611aa2565b80610dc5610db5611a9c9361084f565b38611a83565b600a33611ab26108368284610807565b91600090611abf826107e8565b8411611acc575b50505050565b610dc083610fa9611adc946107e8565b611aeb8282611a13600461079b565b611b18610ffa7f16170af92486b13822506c799b60d90566db7dd7a9948d206c487895e7f1c7a792610357565b0390a238808080611ac6565b610242611a58565b611b34611084565b610a94610b3033611b48610b956000610aa9565b611b518261028b565b03611b60575b50610242611b76565b80610e22610e17611b7093610a10565b38611b57565b600d33611b866108368284610807565b600092611b92846107e8565b8211611b9e5750505050565b611baf90610dc084610fa9876107e8565b6020611bdd611bc46109a16109a1600261079b565b638fcb4e5b611bd260405190565b968793849260e01b90565b825281611bee8789600484016114aa565b03925af190811561076457611c3493602092611c95575b50611c166109a16109a1600261079b565b6109c463db977f95611c2760405190565b9687948593849360e01b90565b03915afa91821561076457600092611c75575b50611b18610ffa7f028a7618a2d8f77fcfce10a6c69e1a551ddbdcc42846c1041a449b94d2f0166092610357565b611c8e91925060203d8111610a0957610a018183610687565b9038611c47565b611cab90833d8111610a0957610a018183610687565b611c05565b610242611b2c565b611cc0611cb0565b610242611b24565b611cd96103023361084960006107e8565b611ce1611b24565b610242611cb0565b90610a9491611cf6611084565b611d4b565b15611d0257565b60405162461bcd60e51b815280610e7e600482016020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b903391611d7c60206107097f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b610357565b825260049082905afa93841561076457611da8610f4761024296611dae94600091611db3575b5061028b565b14611cfb565b611eb1565b611dcb915060203d811161075d576107558183610687565b38611da2565b15611dd857565b60405162461bcd60e51b815260206004820152601560248201527416995c9bc81859191c995cdcc819195d1958dd1959605a1b6044820152606490fd5b15611e1c57565b60405162461bcd60e51b815260206004820152602560248201527f43616e6e6f7420726573637565207374616b696e67206f72207969656c6420746044820152646f6b656e7360d81b6064820152608490fd5b15611e7657565b60405162461bcd60e51b81526020600482015260136024820152724e6f20746f6b656e7320746f2072657363756560681b6044820152606490fd5b90600091611ee2611ec184610aa9565b611eca8161028b565b611ed38461028b565b1415908161208d575b50611dd1565b611eef610b95600161079b565b611ef88261028b565b14158061206f575b80612051575b8061202e575b611f1590611e15565b611f3273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61028b565b611f3b8261028b565b03611fb657611f5d611f56611f4f30610357565b31946107e8565b8411611e6f565b611f718383611f6b30610357565b846110c1565b611fb1611fa7611fa17f4143f7b5cb6ea007914c32b8a3e64cebc051d7f493fa0755454da1e47701e12593610357565b93610357565b9361027e60405190565b0390a3565b611fee6020611fc76109a184610357565b6370a0823190611fe3611fd930610357565b926109b760405190565b8352600483016102a0565b03915afa90811561076457611f5d91611f5691600091612010575b50946107e8565b612028915060203d8111610a0957610a018183610687565b38612009565b50611f1561203f610b95600461079b565b6120488361028b565b14159050611f0c565b5061205f610b95600361079b565b6120688261028b565b1415611f06565b5061207d610b95600261079b565b6120868261028b565b1415611f00565b612097915061028b565b6120a08461028b565b141538611edc565b9061024291611ce9565b6120ba611084565b610a94612104565b156120c957565b60405162461bcd60e51b815260206004820152601360248201527210d85b1b195c881a5cc81b9bdd0815985d5b1d606a1b6044820152606490fd5b61213e335b612138610f47610b957f000000000000000000000000691867213c0d43c167e7c035e489ae36f3286141610357565b146120c2565b61024261216a7f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b610357565b6349d3d5e161217860405190565b916121838260e01b90565b8352602083600481845afa9283156107645760009361230e575b506000926121b0610f47610b9586610aa9565b036121ba57505050565b6121ca9160209161071860405190565b825260049082905afa8015610764576121eb916000916122f0575b50610357565b6121f5600161079b565b612215610f4773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61028b565b14612282575b61222490610357565b634e606c4790803b156102065761224091839161071860405190565b8252818381600481015b03925af180156107645761225c575050565b8161024292903d1061227b575b6122738183610687565b8101906101fb565b503d612269565b61228b81610357565b90637114177a91803b15610206576122b19284916122a860405190565b94859260e01b90565b8252600490829084905af191821561076457612224926122d4575b50905061221b565b6122ea90843d861161227b576122738183610687565b386122cc565b612308915060203d811161075d576107558183610687565b386121e5565b61232791935060203d811161075d576107558183610687565b913861219d565b6102426120b2565b61233e611084565b610a9461234a33612109565b6102426123767f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b610357565b63095f363c9061238f61238860405190565b9260e01b90565b8252602082600481845afa9182156107645760009261247c575b5060206123bf916340ae3e149061071860405190565b825260049082905afa9081156107645760009161245e575b506000916123e483610aa9565b6123ed8161028b565b6123f68361028b565b14159081612443575b5061240957505050565b6109a161241591610357565b906336b91f2b90823b156102065761224a92611fe385809461243660405190565b9687958694859360e01b90565b61244d915061028b565b6124568361028b565b1415386123ff565b612476915060203d811161075d576107558183610687565b386123d7565b6123bf91925061249a602091823d811161075d576107558183610687565b9291506123a9565b610242612336565b610a94906124b6611084565b610242906124c333612109565b61254b565b156124cf57565b60405162461bcd60e51b8152602060048201526017602482015276151bdbc81cdb585b1b081e5a595b191cc8185b5bdd5b9d604a1b6044820152606490fd5b1561251557565b60405162461bcd60e51b815260206004820152600e60248201526d4e6f2075736572207374616b657360901b6044820152606490fd5b61257f600061256361255c826107e8565b84116124c8565b61257961093b61257360056107d4565b926107e8565b1161250e565b6125ad7fef9997e3cc5a6aa364e4fcd642a78d1829153c8cc7d9c1d1f8a4d8a8f550340b9161027e60405190565b0390a1565b610242906124aa565b610a94906125c7611084565b610242906125d56000610aa9565b6125de8161028b565b6125e78261028b565b036125f3575b50612609565b80610dc5610db56126039361084f565b386125ed565b6102429061261633612109565b612627600061256361255c826107e8565b61263f61263882610f8060076107d4565b6007610d6a565b6125ad7f2c73fdf4d1f9c370b0d2bf8570e6b5e4d9fbb6369480509c6c4f6f2e01e090c69161027e60405190565b610242906125bb565b90610a949291612684611084565b9061024292916126946000610aa9565b61269d8161028b565b6126a68261028b565b036126b2575b506126c8565b80610e22610e176126c293610a10565b386126ac565b6102429291906126d733612109565b6126e69192611a13600161079b565b6126f0600b6107d4565b90612727612720612708670de0b6b3a76400006107e8565b936108b36127168686610915565b6108a560056107d4565b600b610d6a565b6127557f548c13486a320e74478d352afe4d4686c434957a45d93c376a871a8a4b9fa6f99161027e60405190565b0390a161276260076107d4565b9060009161277261093b846107e8565b1161277b575050565b610242916114296127a9612638936108b361271661279960086107d4565b926127a460076107d4565b610915565b6008610d6a565b906102429291612676565b906127ce6108366102589361082e600090565b612889565b6127dd600161079b565b6127fd610f4773eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee61028b565b03612815576102589061280f30610357565b316108f8565b506109d26020611fc76109a16109a1600161079b565b90612835816127d3565b60009061284461093b836107e8565b14908115612870575b5061286c576108a56128666102589361088e60056107d4565b916127d3565b5090565b905061288261093b61257360056107d4565b143861284d565b9061289460056107d4565b6000906128a361093b836107e8565b146128b957506102589161088e612716926127d3565b905061025891506107e856fea264697066735822122000ca5c578fa7e45dca0ab1d8b82d5baece35938e1a5070a0fb0339d121e2be2364736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f87933000000000000000000000000691867213c0d43c167e7c035e489ae36f3286141000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000d79d6fe06f4c2b17291015169d1443f50d0c2838
-----Decoded View---------------
Arg [0] : _wandProtocol (address): 0x31e9026bf3A20FA3250a94caD5E6BFbE203B001B
Arg [1] : _settings (address): 0x7449dc43a03e70050c4AcD3F8A6acab9A7F87933
Arg [2] : _vault_ (address): 0x691867213C0d43C167E7C035e489Ae36F3286141
Arg [3] : _stakingYieldsToken_ (address): 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
Arg [4] : _matchingYieldsToken_ (address): 0xd79d6Fe06F4C2b17291015169d1443f50D0C2838
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b
Arg [1] : 0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f87933
Arg [2] : 000000000000000000000000691867213c0d43c167e7c035e489ae36f3286141
Arg [3] : 000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Arg [4] : 000000000000000000000000d79d6fe06f4c2b17291015169d1443f50d0c2838
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$11.46
Net Worth in ETH
0.003882
Token Allocations
ETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| BLAST | 100.00% | $2,950.2 | 0.00388288 | $11.46 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.