Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 11633783 | 1444 days ago | IN | 0 ETH | 0.00185784 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
11633674 | 1444 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
MerkleRedeem
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-01-11 */ // File: @openzeppelin/contracts/cryptography/MerkleProof.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev These functions deal with verification of Merkle trees (hash trees), */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } // Check if the computed hash (root) is equal to the provided root return computedHash == root; } } // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol pragma solidity ^0.6.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]. */ 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 () internal { _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 make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 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://diligence.consensys.net/posts/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.5.11/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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @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 functionCall(target, data, "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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool); /** * @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); } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.0; /** * @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 SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @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' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @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"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @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 sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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 mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: localhost/contracts/erc20-redeemable/contracts/MerkleRedeem.sol pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; contract MerkleRedeem is Ownable { IERC20 public token; event Claimed(address _claimant, uint256 _balance); // Recorded weeks mapping(uint256 => bytes32) public weekMerkleRoots; mapping(uint256 => mapping(address => bool)) public claimed; constructor(address _token) public { token = IERC20(_token); } function disburse(address _liquidityProvider, uint256 _balance) private { if (_balance > 0) { emit Claimed(_liquidityProvider, _balance); require( token.transfer(_liquidityProvider, _balance), "ERR_TRANSFER_FAILED" ); } } function claimWeek( address _liquidityProvider, uint256 _week, uint256 _claimedBalance, bytes32[] memory _merkleProof ) public { require(!claimed[_week][_liquidityProvider]); require( verifyClaim( _liquidityProvider, _week, _claimedBalance, _merkleProof ), "Incorrect merkle proof" ); claimed[_week][_liquidityProvider] = true; disburse(_liquidityProvider, _claimedBalance); } struct Claim { uint256 week; uint256 balance; bytes32[] merkleProof; } function claimWeeks(address _liquidityProvider, Claim[] memory claims) public { uint256 totalBalance = 0; Claim memory claim; for (uint256 i = 0; i < claims.length; i++) { claim = claims[i]; require(!claimed[claim.week][_liquidityProvider]); require( verifyClaim( _liquidityProvider, claim.week, claim.balance, claim.merkleProof ), "Incorrect merkle proof" ); totalBalance += claim.balance; claimed[claim.week][_liquidityProvider] = true; } disburse(_liquidityProvider, totalBalance); } function claimStatus( address _liquidityProvider, uint256 _begin, uint256 _end ) external view returns (bool[] memory) { uint256 size = 1 + _end - _begin; bool[] memory arr = new bool[](size); for (uint256 i = 0; i < size; i++) { arr[i] = claimed[_begin + i][_liquidityProvider]; } return arr; } function merkleRoots(uint256 _begin, uint256 _end) external view returns (bytes32[] memory) { uint256 size = 1 + _end - _begin; bytes32[] memory arr = new bytes32[](size); for (uint256 i = 0; i < size; i++) { arr[i] = weekMerkleRoots[_begin + i]; } return arr; } function verifyClaim( address _liquidityProvider, uint256 _week, uint256 _claimedBalance, bytes32[] memory _merkleProof ) public view returns (bool valid) { bytes32 leaf = keccak256( abi.encodePacked(_liquidityProvider, _claimedBalance) ); return MerkleProof.verify(_merkleProof, weekMerkleRoots[_week], leaf); } function seedAllocations( uint256 _week, bytes32 _merkleRoot, uint256 _totalAllocation ) external onlyOwner { require( weekMerkleRoots[_week] == bytes32(0), "cannot rewrite merkle root" ); weekMerkleRoots[_week] = _merkleRoot; require( token.transferFrom(msg.sender, address(this), _totalAllocation), "ERR_TRANSFER_FAILED" ); } } // File: @openzeppelin/contracts/utils/Pausable.sol pragma solidity ^0.6.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: localhost/contracts/Staking.sol pragma solidity ^0.6.0; /** * @title The staking contract for Furucombo */ contract Staking is Ownable, Pausable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 public stakingToken; // The redeem contract location of claiming functions MerkleRedeem public redeemable; mapping(address => uint256) private _balances; mapping(address => mapping(address => bool)) private _approvals; event Staked( address indexed sender, address indexed onBehalfOf, uint256 amount ); event Unstaked( address indexed sender, address indexed onBehalfOf, uint256 amount ); event Approved(address indexed user, address indexed agent, bool approval); modifier onlyApproved(address owner) { require( _approvals[owner][msg.sender], "Furucombo staking: agent is not approved" ); _; } /** * @notice The redeem contract owner will be transferred to the deployer. */ constructor(address _stakingToken, address _rewardToken) public { stakingToken = IERC20(_stakingToken); redeemable = new MerkleRedeem(_rewardToken); redeemable.transferOwnership(msg.sender); _pause(); } /** * @notice Verify if the agent is approved by user. Approval is required to * perform `unstakeFor`. * @param user The user address. * @param agent The agent address to be verified. */ function isApproved(address user, address agent) external view returns (bool) { return _approvals[user][agent]; } /** * @notice Check the staked balance of user. * @param user The user address. * @return The staked balance. */ function balanceOf(address user) external view returns (uint256) { return _balances[user]; } /** * @notice Set the approval for agent. * @param agent The agent to be approved/disapproved. * @param approval The approval. */ function setApproval(address agent, bool approval) external { require(agent != address(0), "Furucombo staking: agent is 0"); require( _approvals[msg.sender][agent] != approval, "Furucombo staking: identical approval assigned" ); _approvals[msg.sender][agent] = approval; emit Approved(msg.sender, agent, approval); } /** * @notice The staking function. * @param amount The amount to be staked. */ function stake(uint256 amount) external nonReentrant whenNotPaused { _stakeInternal(msg.sender, amount); } /** * @notice The delegate staking function. * @param onBehalfOf The address to be staked. * @param amount The amount to be staked. */ function stakeFor(address onBehalfOf, uint256 amount) external nonReentrant whenNotPaused { _stakeInternal(onBehalfOf, amount); } /** * @notice The unstaking function. * @param amount The amount to be unstaked. */ function unstake(uint256 amount) external nonReentrant { _unstakeInternal(msg.sender, amount); } /** * @notice The delegate staking function. Approval is required. The * unstaked balance will be transferred to the caller. * @param onBehalfOf The address to be unstaked. * @param amount The amount to be unstaked. */ function unstakeFor(address onBehalfOf, uint256 amount) external nonReentrant onlyApproved(onBehalfOf) { _unstakeInternal(onBehalfOf, amount); } /** * @notice The claiming function. The function call is forwarded to the * redeem contract. */ function claimWeek( address user, uint256 week, uint256 balance, bytes32[] memory merkleProof ) public { redeemable.claimWeek(user, week, balance, merkleProof); } /** * @notice The claiming function. The function call is forwarded to the * redeem contract. */ function claimWeeks(address user, MerkleRedeem.Claim[] memory claims) public { redeemable.claimWeeks(user, claims); } /** * @notice The pausing funciton. Can only be triggered by owner. */ function pause() external onlyOwner { _pause(); } /** * */ function unpause() external onlyOwner { _unpause(); } function _stakeInternal(address user, uint256 amount) internal { require(amount > 0, "Furucombo staking: staking 0"); _balances[user] = _balances[user].add(amount); stakingToken.safeTransferFrom(msg.sender, address(this), amount); emit Staked(msg.sender, user, amount); } function _unstakeInternal(address user, uint256 amount) internal { require(amount > 0, "Furucombo staking: unstaking 0"); _balances[user] = _balances[user].sub(amount); stakingToken.safeTransfer(msg.sender, amount); emit Unstaked(msg.sender, user, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_claimant","type":"address"},{"indexed":false,"internalType":"uint256","name":"_balance","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"_liquidityProvider","type":"address"},{"internalType":"uint256","name":"_begin","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"claimStatus","outputs":[{"internalType":"bool[]","name":"","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityProvider","type":"address"},{"internalType":"uint256","name":"_week","type":"uint256"},{"internalType":"uint256","name":"_claimedBalance","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"claimWeek","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityProvider","type":"address"},{"components":[{"internalType":"uint256","name":"week","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"internalType":"struct MerkleRedeem.Claim[]","name":"claims","type":"tuple[]"}],"name":"claimWeeks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_begin","type":"uint256"},{"internalType":"uint256","name":"_end","type":"uint256"}],"name":"merkleRoots","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_week","type":"uint256"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"uint256","name":"_totalAllocation","type":"uint256"}],"name":"seedAllocations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_liquidityProvider","type":"address"},{"internalType":"uint256","name":"_week","type":"uint256"},{"internalType":"uint256","name":"_claimedBalance","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"verifyClaim","outputs":[{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"weekMerkleRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051610fae380380610fae83398101604081905261002f916100ac565b60006100396100a8565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b0319166001600160a01b03929092169190911790556100da565b3390565b6000602082840312156100bd578081fd5b81516001600160a01b03811681146100d3578182fd5b9392505050565b610ec5806100e96000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c80638da5cb5b116100715780638da5cb5b14610152578063c804c39a14610167578063dd8c9c9d1461017a578063eb0d07f51461019a578063f2fde38b146101ad578063fc0c546a146101c0576100b4565b8063120aa877146100b957806339436b00146100e257806347fb23c1146101025780634cd488ab1461012257806358b4e4b414610137578063715018a61461014a575b600080fd5b6100cc6100c7366004610b96565b6101c8565b6040516100d99190610d0d565b60405180910390f35b6100f56100f0366004610bed565b6101e8565b6040516100d99190610cd5565b610115610110366004610acb565b61027e565b6040516100d99190610c8f565b610135610130366004610bc2565b610332565b005b610135610145366004610afe565b610455565b6101356104ea565b61015a610569565b6040516100d99190610c3e565b610135610175366004610a2f565b610578565b61018d610188366004610b7e565b610659565b6040516100d99190610d18565b6100cc6101a8366004610afe565b61066b565b6101356101bb366004610a0d565b6106c1565b61015a610777565b600360209081526000928352604080842090915290825290205460ff1681565b6060828203600101818167ffffffffffffffff8111801561020857600080fd5b50604051908082528060200260200182016040528015610232578160200160208202803683370190505b50905060005b8281101561027357858101600090815260026020526040902054825183908390811061026057fe5b6020908102919091010152600101610238565b509150505b92915050565b6060828203600101818167ffffffffffffffff8111801561029e57600080fd5b506040519080825280602002602001820160405280156102c8578160200160208202803683370190505b50905060005b828110156103285785810160009081526003602090815260408083206001600160a01b038b168452909152902054825160ff9091169083908390811061031057fe5b911515602092830291909101909101526001016102ce565b5095945050505050565b61033a610786565b6000546001600160a01b039081169116146103705760405162461bcd60e51b815260040161036790610d97565b60405180910390fd5b6000838152600260205260409020541561039c5760405162461bcd60e51b815260040161036790610df9565b6000838152600260205260409081902083905560015490516323b872dd60e01b81526001600160a01b03909116906323b872dd906103e290339030908690600401610c52565b602060405180830381600087803b1580156103fc57600080fd5b505af1158015610410573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104349190610b5e565b6104505760405162461bcd60e51b815260040161036790610dcc565b505050565b60008381526003602090815260408083206001600160a01b038816845290915290205460ff161561048557600080fd5b6104918484848461066b565b6104ad5760405162461bcd60e51b815260040161036790610d67565b60008381526003602090815260408083206001600160a01b03881684529091529020805460ff191660011790556104e4848361078a565b50505050565b6104f2610786565b6000546001600160a01b0390811691161461051f5760405162461bcd60e51b815260040161036790610d97565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b600061058261090a565b60005b835181101561064e5783818151811061059a57fe5b602090810291909101810151805160009081526003835260408082206001600160a01b038a168352909352919091205490925060ff16156105da57600080fd5b6105f28583600001518460200151856040015161066b565b61060e5760405162461bcd60e51b815260040161036790610d67565b602080830151835160009081526003835260408082206001600160a01b038a16835290935291909120805460ff1916600190811790915593019201610585565b506104e4848361078a565b60026020526000908152604090205481565b6000808584604051602001610681929190610c0e565b6040516020818303038152906040528051906020012090506106b78360026000888152602001908152602001600020548361086d565b9695505050505050565b6106c9610786565b6000546001600160a01b039081169116146106f65760405162461bcd60e51b815260040161036790610d97565b6001600160a01b03811661071c5760405162461bcd60e51b815260040161036790610d21565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b3390565b8015610869577fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a82826040516107c1929190610c76565b60405180910390a160015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906107fb9085908590600401610c76565b602060405180830381600087803b15801561081557600080fd5b505af1158015610829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084d9190610b5e565b6108695760405162461bcd60e51b815260040161036790610dcc565b5050565b600081815b85518110156108ff57600086828151811061088957fe5b602002602001015190508083116108ca5782816040516020016108ad929190610c30565b6040516020818303038152906040528051906020012092506108f6565b80836040516020016108dd929190610c30565b6040516020818303038152906040528051906020012092505b50600101610872565b509092149392505050565b60405180606001604052806000815260200160008152602001606081525090565b80356001600160a01b038116811461027857600080fd5b600082601f830112610952578081fd5b813561096561096082610e57565b610e30565b81815291506020808301908481018184028601820187101561098657600080fd5b60005b848110156109a557813584529282019290820190600101610989565b505050505092915050565b6000606082840312156109c1578081fd5b6109cb6060610e30565b90508135815260208201356020820152604082013567ffffffffffffffff8111156109f557600080fd5b610a0184828501610942565b60408301525092915050565b600060208284031215610a1e578081fd5b610a28838361092b565b9392505050565b60008060408385031215610a41578081fd5b8235610a4c81610e77565b915060208381013567ffffffffffffffff811115610a68578283fd5b8401601f81018613610a78578283fd5b8035610a8661096082610e57565b81815283810190838501865b84811015610abb57610aa98b8884358901016109b0565b84529286019290860190600101610a92565b5096999098509650505050505050565b600080600060608486031215610adf578081fd5b610ae9858561092b565b95602085013595506040909401359392505050565b60008060008060808587031215610b13578081fd5b610b1d868661092b565b93506020850135925060408501359150606085013567ffffffffffffffff811115610b46578182fd5b610b5287828801610942565b91505092959194509250565b600060208284031215610b6f578081fd5b81518015158114610a28578182fd5b600060208284031215610b8f578081fd5b5035919050565b60008060408385031215610ba8578182fd5b82359150610bb9846020850161092b565b90509250929050565b600080600060608486031215610bd6578283fd5b505081359360208301359350604090920135919050565b60008060408385031215610bff578182fd5b50508035926020909101359150565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015610cc9578351151583529284019291840191600101610cab565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610cc957835183529284019291840191600101610cf1565b901515815260200190565b90815260200190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526016908201527524b731b7b93932b1ba1036b2b935b63290383937b7b360511b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526013908201527211549497d514905394d1915497d19052531151606a1b604082015260600190565b6020808252601a908201527f63616e6e6f742072657772697465206d65726b6c6520726f6f74000000000000604082015260600190565b60405181810167ffffffffffffffff81118282101715610e4f57600080fd5b604052919050565b600067ffffffffffffffff821115610e6d578081fd5b5060209081020190565b6001600160a01b0381168114610e8c57600080fd5b5056fea26469706673582212207074f4e13f39c54f61a24870b7c4d53e2328ce3a806a295e6db62a9c1e0e2c4e64736f6c634300060c0033000000000000000000000000ffffffff2ba8f66d4e51811c5190992176930278
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100b45760003560e01c80638da5cb5b116100715780638da5cb5b14610152578063c804c39a14610167578063dd8c9c9d1461017a578063eb0d07f51461019a578063f2fde38b146101ad578063fc0c546a146101c0576100b4565b8063120aa877146100b957806339436b00146100e257806347fb23c1146101025780634cd488ab1461012257806358b4e4b414610137578063715018a61461014a575b600080fd5b6100cc6100c7366004610b96565b6101c8565b6040516100d99190610d0d565b60405180910390f35b6100f56100f0366004610bed565b6101e8565b6040516100d99190610cd5565b610115610110366004610acb565b61027e565b6040516100d99190610c8f565b610135610130366004610bc2565b610332565b005b610135610145366004610afe565b610455565b6101356104ea565b61015a610569565b6040516100d99190610c3e565b610135610175366004610a2f565b610578565b61018d610188366004610b7e565b610659565b6040516100d99190610d18565b6100cc6101a8366004610afe565b61066b565b6101356101bb366004610a0d565b6106c1565b61015a610777565b600360209081526000928352604080842090915290825290205460ff1681565b6060828203600101818167ffffffffffffffff8111801561020857600080fd5b50604051908082528060200260200182016040528015610232578160200160208202803683370190505b50905060005b8281101561027357858101600090815260026020526040902054825183908390811061026057fe5b6020908102919091010152600101610238565b509150505b92915050565b6060828203600101818167ffffffffffffffff8111801561029e57600080fd5b506040519080825280602002602001820160405280156102c8578160200160208202803683370190505b50905060005b828110156103285785810160009081526003602090815260408083206001600160a01b038b168452909152902054825160ff9091169083908390811061031057fe5b911515602092830291909101909101526001016102ce565b5095945050505050565b61033a610786565b6000546001600160a01b039081169116146103705760405162461bcd60e51b815260040161036790610d97565b60405180910390fd5b6000838152600260205260409020541561039c5760405162461bcd60e51b815260040161036790610df9565b6000838152600260205260409081902083905560015490516323b872dd60e01b81526001600160a01b03909116906323b872dd906103e290339030908690600401610c52565b602060405180830381600087803b1580156103fc57600080fd5b505af1158015610410573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104349190610b5e565b6104505760405162461bcd60e51b815260040161036790610dcc565b505050565b60008381526003602090815260408083206001600160a01b038816845290915290205460ff161561048557600080fd5b6104918484848461066b565b6104ad5760405162461bcd60e51b815260040161036790610d67565b60008381526003602090815260408083206001600160a01b03881684529091529020805460ff191660011790556104e4848361078a565b50505050565b6104f2610786565b6000546001600160a01b0390811691161461051f5760405162461bcd60e51b815260040161036790610d97565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b600061058261090a565b60005b835181101561064e5783818151811061059a57fe5b602090810291909101810151805160009081526003835260408082206001600160a01b038a168352909352919091205490925060ff16156105da57600080fd5b6105f28583600001518460200151856040015161066b565b61060e5760405162461bcd60e51b815260040161036790610d67565b602080830151835160009081526003835260408082206001600160a01b038a16835290935291909120805460ff1916600190811790915593019201610585565b506104e4848361078a565b60026020526000908152604090205481565b6000808584604051602001610681929190610c0e565b6040516020818303038152906040528051906020012090506106b78360026000888152602001908152602001600020548361086d565b9695505050505050565b6106c9610786565b6000546001600160a01b039081169116146106f65760405162461bcd60e51b815260040161036790610d97565b6001600160a01b03811661071c5760405162461bcd60e51b815260040161036790610d21565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b3390565b8015610869577fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a82826040516107c1929190610c76565b60405180910390a160015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906107fb9085908590600401610c76565b602060405180830381600087803b15801561081557600080fd5b505af1158015610829573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061084d9190610b5e565b6108695760405162461bcd60e51b815260040161036790610dcc565b5050565b600081815b85518110156108ff57600086828151811061088957fe5b602002602001015190508083116108ca5782816040516020016108ad929190610c30565b6040516020818303038152906040528051906020012092506108f6565b80836040516020016108dd929190610c30565b6040516020818303038152906040528051906020012092505b50600101610872565b509092149392505050565b60405180606001604052806000815260200160008152602001606081525090565b80356001600160a01b038116811461027857600080fd5b600082601f830112610952578081fd5b813561096561096082610e57565b610e30565b81815291506020808301908481018184028601820187101561098657600080fd5b60005b848110156109a557813584529282019290820190600101610989565b505050505092915050565b6000606082840312156109c1578081fd5b6109cb6060610e30565b90508135815260208201356020820152604082013567ffffffffffffffff8111156109f557600080fd5b610a0184828501610942565b60408301525092915050565b600060208284031215610a1e578081fd5b610a28838361092b565b9392505050565b60008060408385031215610a41578081fd5b8235610a4c81610e77565b915060208381013567ffffffffffffffff811115610a68578283fd5b8401601f81018613610a78578283fd5b8035610a8661096082610e57565b81815283810190838501865b84811015610abb57610aa98b8884358901016109b0565b84529286019290860190600101610a92565b5096999098509650505050505050565b600080600060608486031215610adf578081fd5b610ae9858561092b565b95602085013595506040909401359392505050565b60008060008060808587031215610b13578081fd5b610b1d868661092b565b93506020850135925060408501359150606085013567ffffffffffffffff811115610b46578182fd5b610b5287828801610942565b91505092959194509250565b600060208284031215610b6f578081fd5b81518015158114610a28578182fd5b600060208284031215610b8f578081fd5b5035919050565b60008060408385031215610ba8578182fd5b82359150610bb9846020850161092b565b90509250929050565b600080600060608486031215610bd6578283fd5b505081359360208301359350604090920135919050565b60008060408385031215610bff578182fd5b50508035926020909101359150565b60609290921b6bffffffffffffffffffffffff19168252601482015260340190565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6020808252825182820181905260009190848201906040850190845b81811015610cc9578351151583529284019291840191600101610cab565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610cc957835183529284019291840191600101610cf1565b901515815260200190565b90815260200190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526016908201527524b731b7b93932b1ba1036b2b935b63290383937b7b360511b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526013908201527211549497d514905394d1915497d19052531151606a1b604082015260600190565b6020808252601a908201527f63616e6e6f742072657772697465206d65726b6c6520726f6f74000000000000604082015260600190565b60405181810167ffffffffffffffff81118282101715610e4f57600080fd5b604052919050565b600067ffffffffffffffff821115610e6d578081fd5b5060209081020190565b6001600160a01b0381168114610e8c57600080fd5b5056fea26469706673582212207074f4e13f39c54f61a24870b7c4d53e2328ce3a806a295e6db62a9c1e0e2c4e64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ffffffff2ba8f66d4e51811c5190992176930278
-----Decoded View---------------
Arg [0] : _token (address): 0xfFffFffF2ba8F66D4e51811C5190992176930278
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ffffffff2ba8f66d4e51811c5190992176930278
Deployed Bytecode Sourcemap
25437:3788:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25644:59;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27988:357;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27590:390::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28759:463::-;;;;;;:::i;:::-;;:::i;:::-;;26121:576;;;;;;:::i;:::-;;:::i;24741:148::-;;;:::i;24099:79::-;;;:::i;:::-;;;;;;;:::i;26815:767::-;;;;;;:::i;:::-;;:::i;25587:50::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;28353:398::-;;;;;;:::i;:::-;;:::i;25044:244::-;;;;;;:::i;:::-;;:::i;25477:19::-;;;:::i;25644:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27988:357::-;28089:16;28138:17;;;:1;:17;28089:16;28138:17;28189:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28189:19:0;;28166:42;;28224:9;28219:98;28243:4;28239:1;:8;28219:98;;;28294:10;;;28278:27;;;;:15;:27;;;;;;28269:6;;:3;;28303:1;;28269:6;;;;;;;;;;;;;;;:36;28249:3;;28219:98;;;-1:-1:-1;28334:3:0;-1:-1:-1;;27988:357:0;;;;;:::o;27590:390::-;27726:13;27767:17;;;:1;:17;27726:13;27767:17;27815:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27815:16:0;;27795:36;;27847:9;27842:110;27866:4;27862:1;:8;27842:110;;;27909:10;;;27901:19;;;;:7;:19;;;;;;;;-1:-1:-1;;;;;27901:39:0;;;;;;;;;;27892:6;;27901:39;;;;;27892:6;;27909:10;;27892:6;;;;;;:48;;;:6;;;;;;;;;;;:48;27872:3;;27842:110;;;-1:-1:-1;27969:3:0;27590:390;-1:-1:-1;;;;;27590:390:0:o;28759:463::-;24321:12;:10;:12::i;:::-;24311:6;;-1:-1:-1;;;;;24311:22:0;;;:6;;:22;24303:67;;;;-1:-1:-1;;;24303:67:0;;;;;;;:::i;:::-;;;;;;;;;28966:1:::1;28932:22:::0;;;:15:::1;:22;::::0;;;;;:36;28910:112:::1;;;::::0;-1:-1:-1;;;28910:112:0;;::::1;::::0;::::1;;;:::i;:::-;29033:22;::::0;;;:15:::1;:22;::::0;;;;;;:36;;;29104:5:::1;::::0;:63;;-1:-1:-1;;;29104:63:0;;-1:-1:-1;;;;;29104:5:0;;::::1;::::0;-1:-1:-1;;29104:63:0::1;::::0;29123:10:::1;::::0;29143:4:::1;::::0;29150:16;;29104:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29082:132;;;::::0;-1:-1:-1;;;29082:132:0;;::::1;::::0;::::1;;;:::i;:::-;28759:463:::0;;;:::o;26121:576::-;26309:14;;;;:7;:14;;;;;;;;-1:-1:-1;;;;;26309:34:0;;;;;;;;;;;;26308:35;26300:44;;;;;;26377:152;26407:18;26444:5;26468:15;26502:12;26377:11;:152::i;:::-;26355:224;;;;-1:-1:-1;;;26355:224:0;;;;;;;:::i;:::-;26592:14;;;;:7;:14;;;;;;;;-1:-1:-1;;;;;26592:34:0;;;;;;;;;:41;;-1:-1:-1;;26592:41:0;-1:-1:-1;26592:41:0;;;26644:45;26592:34;26673:15;26644:8;:45::i;:::-;26121:576;;;;:::o;24741:148::-;24321:12;:10;:12::i;:::-;24311:6;;-1:-1:-1;;;;;24311:22:0;;;:6;;:22;24303:67;;;;-1:-1:-1;;;24303:67:0;;;;;;;:::i;:::-;24848:1:::1;24832:6:::0;;24811:40:::1;::::0;-1:-1:-1;;;;;24832:6:0;;::::1;::::0;24811:40:::1;::::0;24848:1;;24811:40:::1;24879:1;24862:19:::0;;-1:-1:-1;;;;;;24862:19:0::1;::::0;;24741:148::o;24099:79::-;24137:7;24164:6;-1:-1:-1;;;;;24164:6:0;;24099:79::o;26815:767::-;26918:20;26953:18;;:::i;:::-;26987:9;26982:540;27006:6;:13;27002:1;:17;26982:540;;;27049:6;27056:1;27049:9;;;;;;;;;;;;;;;;;;;27092:10;;27084:19;;;;:7;:19;;;;;;-1:-1:-1;;;;;27084:39:0;;;;;;;;;;;;27049:9;;-1:-1:-1;27084:39:0;;27083:40;27075:49;;;;;;27165:180;27199:18;27240:5;:10;;;27273:5;:13;;;27309:5;:17;;;27165:11;:180::i;:::-;27139:264;;;;-1:-1:-1;;;27139:264:0;;;;;;;:::i;:::-;27436:13;;;;;27472:10;;27464:19;;;;:7;:19;;;;;;-1:-1:-1;;;;;27464:39:0;;;;;;;;;;;:46;;-1:-1:-1;;27464:46:0;-1:-1:-1;27464:46:0;;;;;;27420:29;;;27021:3;26982:540;;;;27532:42;27541:18;27561:12;27532:8;:42::i;25587:50::-;;;;;;;;;;;;;:::o;28353:398::-;28537:10;28560:12;28616:18;28636:15;28599:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28575:88;;;;;;28560:103;;28681:62;28700:12;28714:15;:22;28730:5;28714:22;;;;;;;;;;;;28738:4;28681:18;:62::i;:::-;28674:69;28353:398;-1:-1:-1;;;;;;28353:398:0:o;25044:244::-;24321:12;:10;:12::i;:::-;24311:6;;-1:-1:-1;;;;;24311:22:0;;;:6;;:22;24303:67;;;;-1:-1:-1;;;24303:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;25133:22:0;::::1;25125:73;;;::::0;-1:-1:-1;;;25125:73:0;;::::1;::::0;::::1;;;:::i;:::-;25235:6;::::0;;25214:38:::1;::::0;-1:-1:-1;;;;;25214:38:0;;::::1;::::0;25235:6;::::1;::::0;25214:38:::1;::::0;::::1;25263:6;:17:::0;;-1:-1:-1;;;;;;25263:17:0::1;-1:-1:-1::0;;;;;25263:17:0;;;::::1;::::0;;;::::1;::::0;;25044:244::o;25477:19::-;;;-1:-1:-1;;;;;25477:19:0;;:::o;22653:106::-;22741:10;22653:106;:::o;25796:317::-;25883:12;;25879:227;;25917:37;25925:18;25945:8;25917:37;;;;;;;:::i;:::-;;;;;;;;25995:5;;:44;;-1:-1:-1;;;25995:44:0;;-1:-1:-1;;;;;25995:5:0;;;;-1:-1:-1;;25995:44:0;;26010:18;;26030:8;;25995:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25969:125;;;;-1:-1:-1;;;25969:125:0;;;;;;;:::i;:::-;25796:317;;:::o;576:796::-;667:4;707;667;724:525;748:5;:12;744:1;:16;724:525;;;782:20;805:5;811:1;805:8;;;;;;;;;;;;;;782:31;;850:12;834;:28;830:408;;1004:12;1018;987:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;977:55;;;;;;962:70;;830:408;;;1194:12;1208;1177:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1167:55;;;;;;1152:70;;830:408;-1:-1:-1;762:3:0;;724:525;;;-1:-1:-1;1344:20:0;;;;576:796;-1:-1:-1;;;576:796:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;-1:-1;;;;;19630:54;;20960:35;;20950:2;;21009:1;;20999:12;160:707;;277:3;270:4;262:6;258:17;254:27;244:2;;-1:-1;;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;:::i;:::-;354:80;:::i;:::-;462:21;;;345:89;-1:-1;506:4;519:14;;;;494:17;;;608;;;599:27;;;;596:36;-1:-1;593:2;;;645:1;;635:12;593:2;670:1;655:206;680:6;677:1;674:13;655:206;;;1868:20;;748:50;;812:14;;;;840;;;;702:1;695:9;655:206;;;659:14;;;;;237:630;;;;:::o;1970:730::-;;2082:4;2070:9;2065:3;2061:19;2057:30;2054:2;;;-1:-1;;2090:12;2054:2;2118:20;2082:4;2118:20;:::i;:::-;2109:29;;2787:6;2774:20;2202:16;2195:75;2334:2;2392:9;2388:22;2774:20;2334:2;2353:5;2349:16;2342:75;2513:2;2502:9;2498:18;2485:32;2537:18;2529:6;2526:30;2523:2;;;-1:-1;;2559:12;2523:2;2604:74;2674:3;2665:6;2654:9;2650:22;2604:74;:::i;:::-;2513:2;2590:5;2586:16;2579:100;;2048:652;;;;:::o;2844:241::-;;2948:2;2936:9;2927:7;2923:23;2919:32;2916:2;;;-1:-1;;2954:12;2916:2;3016:53;3061:7;3037:22;3016:53;:::i;:::-;3006:63;2910:175;-1:-1;;;2910:175::o;3092:548::-;;;3261:2;3249:9;3240:7;3236:23;3232:32;3229:2;;;-1:-1;;3267:12;3229:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3319:63;-1:-1;3447:2;3432:18;;;3419:32;3471:18;3460:30;;3457:2;;;-1:-1;;3493:12;3457:2;3592:22;;1044:4;1032:17;;1028:27;-1:-1;1018:2;;-1:-1;;1059:12;1018:2;1106:6;1093:20;1128:103;1143:87;1223:6;1143:87;:::i;1128:103::-;1259:21;;;1316:14;;;;1291:17;;;-1:-1;1396:256;1421:6;1418:1;1415:13;1396:256;;;1528:60;1584:3;3447:2;1504:3;1491:17;1295:6;1479:30;;1528:60;:::i;:::-;1516:73;;1603:14;;;;1631;;;;1443:1;1436:9;1396:256;;;-1:-1;3223:417;;3513:111;;-1:-1;3223:417;-1:-1;;;;;;;3223:417::o;3647:491::-;;;;3785:2;3773:9;3764:7;3760:23;3756:32;3753:2;;;-1:-1;;3791:12;3753:2;3853:53;3898:7;3874:22;3853:53;:::i;:::-;3843:63;3943:2;3982:22;;2774:20;;-1:-1;4051:2;4090:22;;;2774:20;;3747:391;-1:-1;;;3747:391::o;4145:753::-;;;;;4325:3;4313:9;4304:7;4300:23;4296:33;4293:2;;;-1:-1;;4332:12;4293:2;4394:53;4439:7;4415:22;4394:53;:::i;:::-;4384:63;;4484:2;4527:9;4523:22;2774:20;4492:63;;4592:2;4635:9;4631:22;2774:20;4600:63;;4728:2;4717:9;4713:18;4700:32;4752:18;4744:6;4741:30;4738:2;;;-1:-1;;4774:12;4738:2;4804:78;4874:7;4865:6;4854:9;4850:22;4804:78;:::i;:::-;4794:88;;;4287:611;;;;;;;:::o;4905:257::-;;5017:2;5005:9;4996:7;4992:23;4988:32;4985:2;;;-1:-1;;5023:12;4985:2;1747:6;1741:13;21106:5;19463:13;19456:21;21084:5;21081:32;21071:2;;-1:-1;;21117:12;5169:241;;5273:2;5261:9;5252:7;5248:23;5244:32;5241:2;;;-1:-1;;5279:12;5241:2;-1:-1;2774:20;;5235:175;-1:-1;5235:175::o;5417:366::-;;;5538:2;5526:9;5517:7;5513:23;5509:32;5506:2;;;-1:-1;;5544:12;5506:2;2787:6;2774:20;5596:63;;5714:53;5759:7;5696:2;5739:9;5735:22;5714:53;:::i;:::-;5704:63;;5500:283;;;;;:::o;5790:491::-;;;;5928:2;5916:9;5907:7;5903:23;5899:32;5896:2;;;-1:-1;;5934:12;5896:2;-1:-1;;2774:20;;;6086:2;6125:22;;1868:20;;-1:-1;6194:2;6233:22;;;2774:20;;5890:391;-1:-1;5890:391::o;6288:366::-;;;6409:2;6397:9;6388:7;6384:23;6380:32;6377:2;;;-1:-1;;6415:12;6377:2;-1:-1;;2774:20;;;6567:2;6606:22;;;2774:20;;-1:-1;6371:283::o;11629:392::-;20873:2;20869:14;;;;-1:-1;;20869:14;7371:58;;11882:2;11873:12;;9142:37;11984:12;;;11773:248::o;12028:392::-;9142:37;;;12281:2;12272:12;;9142:37;12383:12;;;12172:248::o;12427:222::-;-1:-1;;;;;19630:54;;;;7233:37;;12554:2;12539:18;;12525:124::o;12656:460::-;-1:-1;;;;;19630:54;;;7092:58;;19630:54;;;;13019:2;13004:18;;7233:37;13102:2;13087:18;;9142:37;;;;12847:2;12832:18;;12818:298::o;13123:333::-;-1:-1;;;;;19630:54;;;;7233:37;;13442:2;13427:18;;9142:37;13278:2;13263:18;;13249:207::o;13463:358::-;13634:2;13648:47;;;18344:12;;13619:18;;;18872:19;;;13463:358;;13634:2;18043:14;;;;18912;;;;13463:358;7859:251;7884:6;7881:1;7878:13;7859:251;;;7945:13;;19463;19456:21;8924:34;;18615:14;;;;6803;;;;7906:1;7899:9;7859:251;;;-1:-1;13701:110;;13605:216;-1:-1;;;;;;13605:216::o;13828:370::-;14005:2;14019:47;;;18344:12;;13990:18;;;18872:19;;;13828:370;;14005:2;18043:14;;;;18912;;;;13828:370;8579:260;8604:6;8601:1;8598:13;8579:260;;;8665:13;;9142:37;;18615:14;;;;6985;;;;8626:1;8619:9;8579:260;;14205:210;19463:13;;19456:21;8924:34;;14326:2;14311:18;;14297:118::o;14422:222::-;9142:37;;;14549:2;14534:18;;14520:124::o;14908:416::-;15108:2;15122:47;;;9856:2;15093:18;;;18872:19;9892:34;18912:14;;;9872:55;-1:-1;;;9947:12;;;9940:30;9989:12;;;15079:245::o;15331:416::-;15531:2;15545:47;;;10240:2;15516:18;;;18872:19;-1:-1;;;18912:14;;;10256:45;10320:12;;;15502:245::o;15754:416::-;15954:2;15968:47;;;15939:18;;;18872:19;10607:34;18912:14;;;10587:55;10661:12;;;15925:245::o;16177:416::-;16377:2;16391:47;;;10912:2;16362:18;;;18872:19;-1:-1;;;18912:14;;;10928:42;10989:12;;;16348:245::o;16600:416::-;16800:2;16814:47;;;11240:2;16785:18;;;18872:19;11276:28;18912:14;;;11256:49;11324:12;;;16771:245::o;17023:256::-;17085:2;17079:9;17111:17;;;17186:18;17171:34;;17207:22;;;17168:62;17165:2;;;17243:1;;17233:12;17165:2;17085;17252:22;17063:216;;-1:-1;17063:216::o;17286:304::-;;17445:18;17437:6;17434:30;17431:2;;;-1:-1;;17467:12;17431:2;-1:-1;17512:4;17500:17;;;17565:15;;17368:222::o;20901:117::-;-1:-1;;;;;19630:54;;20960:35;;20950:2;;21009:1;;20999:12;20950:2;20944:74;:::o
Swarm Source
ipfs://7074f4e13f39c54f61a24870b7c4d53e2328ce3a806a295e6db62a9c1e0e2c4e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.004371 | 82,573.1987 | $360.97 |
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.