Overview
S Balance
0 S
S Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
3064293 | 28 days ago | Contract Creation | 0 S |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
RewardClaimers
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 1633 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.26; import {INonfungiblePositionManager} from "../CL/periphery/interfaces/INonfungiblePositionManager.sol"; import {IGauge} from "../interfaces/IGauge.sol"; import {IGaugeV3} from "../CL/gauge/interfaces/IGaugeV3.sol"; import {IVoteModule} from "../interfaces/IVoteModule.sol"; import {IFeeDistributor} from "../interfaces/IFeeDistributor.sol"; /// @title RewardClaimers /// @notice Reward claimers logic for Voter /// @dev Used to reduce Voter contract size by moving all reward claiming logic to a library library RewardClaimers { error NOT_AUTHORIZED(); function claimClGaugeRewards( address nfpManager, address[] calldata _gauges, address[][] calldata _tokens, uint256[][] calldata _nfpTokenIds ) external { for (uint256 i; i < _gauges.length; ++i) { for (uint256 j; j < _nfpTokenIds[i].length; ++j) { require( msg.sender == INonfungiblePositionManager(nfpManager).ownerOf( _nfpTokenIds[i][j] ) || msg.sender == INonfungiblePositionManager(nfpManager).getApproved( _nfpTokenIds[i][j] ) || INonfungiblePositionManager(nfpManager) .isApprovedForAll( INonfungiblePositionManager(nfpManager).ownerOf( _nfpTokenIds[i][j] ), msg.sender ) ); IGaugeV3(_gauges[i]).getRewardForOwner( _nfpTokenIds[i][j], _tokens[i] ); } } } function claimIncentives( address voteModule, address owner, address[] calldata _feeDistributors, address[][] calldata _tokens ) external { IVoteModule(voteModule).isAdminFor(msg.sender, owner); for (uint256 i; i < _feeDistributors.length; ++i) { IFeeDistributor(_feeDistributors[i]).getRewardForOwner( owner, _tokens[i] ); } } function claimRewards( address[] calldata _gauges, address[][] calldata _tokens ) external { for (uint256 i; i < _gauges.length; ++i) { IGauge(_gauges[i]).getReward(msg.sender, _tokens[i]); } } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.7.5; pragma abicoder v2; import {IPoolInitializer} from './IPoolInitializer.sol'; import {IPeripheryPayments} from './IPeripheryPayments.sol'; import {IPeripheryImmutableState} from './IPeripheryImmutableState.sol'; import {PoolAddress} from '../libraries/PoolAddress.sol'; import {IERC721} from '@openzeppelin/contracts/token/ERC721/IERC721.sol'; import {IERC721Metadata} from '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol'; import {IERC721Enumerable} from '@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol'; import {IPeripheryErrors} from './IPeripheryErrors.sol'; /// @title Non-fungible token for positions /// @notice Wraps Uniswap V3 positions in a non-fungible token interface which allows for them to be transferred /// and authorized. interface INonfungiblePositionManager is IPeripheryErrors, IPoolInitializer, IPeripheryPayments, IPeripheryImmutableState, IERC721, IERC721Metadata, IERC721Enumerable { /// @notice Emitted when liquidity is increased for a position NFT /// @dev Also emitted when a token is minted /// @param tokenId The ID of the token for which liquidity was increased /// @param liquidity The amount by which liquidity for the NFT position was increased /// @param amount0 The amount of token0 that was paid for the increase in liquidity /// @param amount1 The amount of token1 that was paid for the increase in liquidity event IncreaseLiquidity(uint256 indexed tokenId, uint128 liquidity, uint256 amount0, uint256 amount1); /// @notice Emitted when liquidity is decreased for a position NFT /// @param tokenId The ID of the token for which liquidity was decreased /// @param liquidity The amount by which liquidity for the NFT position was decreased /// @param amount0 The amount of token0 that was accounted for the decrease in liquidity /// @param amount1 The amount of token1 that was accounted for the decrease in liquidity event DecreaseLiquidity(uint256 indexed tokenId, uint128 liquidity, uint256 amount0, uint256 amount1); /// @notice Emitted when tokens are collected for a position NFT /// @dev The amounts reported may not be exactly equivalent to the amounts transferred, due to rounding behavior /// @param tokenId The ID of the token for which underlying tokens were collected /// @param recipient The address of the account that received the collected tokens /// @param amount0 The amount of token0 owed to the position that was collected /// @param amount1 The amount of token1 owed to the position that was collected event Collect(uint256 indexed tokenId, address recipient, uint256 amount0, uint256 amount1); /// @notice Returns the position information associated with a given token ID. /// @dev Throws if the token ID is not valid. /// @param tokenId The ID of the token that represents the position /// @return token0 The address of the token0 for a specific pool /// @return token1 The address of the token1 for a specific pool /// @return tickSpacing The tickSpacing the pool /// @return tickLower The lower end of the tick range for the position /// @return tickUpper The higher end of the tick range for the position /// @return liquidity The liquidity of the position /// @return feeGrowthInside0LastX128 The fee growth of token0 as of the last action on the individual position /// @return feeGrowthInside1LastX128 The fee growth of token1 as of the last action on the individual position /// @return tokensOwed0 The uncollected amount of token0 owed to the position as of the last computation /// @return tokensOwed1 The uncollected amount of token1 owed to the position as of the last computation function positions( uint256 tokenId ) external view returns ( address token0, address token1, int24 tickSpacing, int24 tickLower, int24 tickUpper, uint128 liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1 ); struct MintParams { address token0; address token1; int24 tickSpacing; int24 tickLower; int24 tickUpper; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; address recipient; uint256 deadline; } /// @notice Creates a new position wrapped in a NFT /// @dev Call this when the pool does exist and is initialized. Note that if the pool is created but not initialized /// a method does not exist, i.e. the pool is assumed to be initialized. /// @param params The params necessary to mint a position, encoded as `MintParams` in calldata /// @return tokenId The ID of the token that represents the minted position /// @return liquidity The amount of liquidity for this position /// @return amount0 The amount of token0 /// @return amount1 The amount of token1 function mint( MintParams calldata params ) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1); struct IncreaseLiquidityParams { uint256 tokenId; uint256 amount0Desired; uint256 amount1Desired; uint256 amount0Min; uint256 amount1Min; uint256 deadline; } /// @notice Increases the amount of liquidity in a position, with tokens paid by the `msg.sender` /// @param params tokenId The ID of the token for which liquidity is being increased, /// amount0Desired The desired amount of token0 to be spent, /// amount1Desired The desired amount of token1 to be spent, /// amount0Min The minimum amount of token0 to spend, which serves as a slippage check, /// amount1Min The minimum amount of token1 to spend, which serves as a slippage check, /// deadline The time by which the transaction must be included to effect the change /// @return liquidity The new liquidity amount as a result of the increase /// @return amount0 The amount of token0 to acheive resulting liquidity /// @return amount1 The amount of token1 to acheive resulting liquidity function increaseLiquidity( IncreaseLiquidityParams calldata params ) external payable returns (uint128 liquidity, uint256 amount0, uint256 amount1); struct DecreaseLiquidityParams { uint256 tokenId; uint128 liquidity; uint256 amount0Min; uint256 amount1Min; uint256 deadline; } /// @notice Decreases the amount of liquidity in a position and accounts it to the position /// @param params tokenId The ID of the token for which liquidity is being decreased, /// amount The amount by which liquidity will be decreased, /// amount0Min The minimum amount of token0 that should be accounted for the burned liquidity, /// amount1Min The minimum amount of token1 that should be accounted for the burned liquidity, /// deadline The time by which the transaction must be included to effect the change /// @return amount0 The amount of token0 accounted to the position's tokens owed /// @return amount1 The amount of token1 accounted to the position's tokens owed function decreaseLiquidity( DecreaseLiquidityParams calldata params ) external payable returns (uint256 amount0, uint256 amount1); struct CollectParams { uint256 tokenId; address recipient; uint128 amount0Max; uint128 amount1Max; } /// @notice Collects up to a maximum amount of fees owed to a specific position to the recipient /// @param params tokenId The ID of the NFT for which tokens are being collected, /// recipient The account that should receive the tokens, /// amount0Max The maximum amount of token0 to collect, /// amount1Max The maximum amount of token1 to collect /// @return amount0 The amount of fees collected in token0 /// @return amount1 The amount of fees collected in token1 function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1); /// @notice Burns a token ID, which deletes it from the NFT contract. The token must have 0 liquidity and all tokens /// must be collected first. /// @param tokenId The ID of the token that is being burned function burn(uint256 tokenId) external payable; /// @notice Claims gauge rewards from liquidity incentives for a specific tokenId /// @param tokenId The ID of the token to claim rewards from /// @param tokens an array of reward tokens to claim function getReward(uint256 tokenId, address[] calldata tokens) external; }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.26; interface IGauge { error ZERO_AMOUNT(); error CANT_NOTIFY_STAKE(); error REWARD_TOO_HIGH(); error NOT_GREATER_THAN_REMAINING(uint256 amount, uint256 remaining); error TOKEN_ERROR(address token); error NOT_WHITELISTED(); error NOT_AUTHORIZED(); event Deposit(address indexed from, uint256 amount); event Withdraw(address indexed from, uint256 amount); event NotifyReward( address indexed from, address indexed reward, uint256 amount ); event ClaimRewards( address indexed from, address indexed reward, uint256 amount ); event RewardWhitelisted(address indexed reward, bool whitelisted); /// @notice returns an array with all the addresses of the rewards /// @return _rewards array of addresses for rewards function rewardsList() external view returns (address[] memory _rewards); /// @notice number of different rewards the gauge has facilitated that are 'active' /// @return _length the number of individual rewards function rewardsListLength() external view returns (uint256 _length); /// @notice returns the last time the reward was modified or periodFinish if the reward has ended /// @param token address of the token /// @return ltra last time reward applicable function lastTimeRewardApplicable( address token ) external view returns (uint256 ltra); /// @notice displays the data struct of rewards for a token /// @param token the address of the token /// @return data rewards struct function rewardData( address token ) external view returns (Reward memory data); /// @notice calculates the amount of tokens earned for an address /// @param token address of the token to check /// @param account address to check /// @return _reward amount of token claimable function earned( address token, address account ) external view returns (uint256 _reward); /// @notice claims rewards (emissionsToken + any external LP Incentives) /// @param account the address to claim for /// @param tokens an array of the tokens to claim function getReward(address account, address[] calldata tokens) external; /// @notice calculates the token amounts earned per lp token /// @param token address of the token to check /// @return rpt reward per token function rewardPerToken(address token) external view returns (uint256 rpt); /// @notice deposit all LP tokens from msg.sender's wallet to the gauge function depositAll() external; /// @param recipient the address of who to deposit on behalf of /// @param amount the amount of LP tokens to withdraw function depositFor(address recipient, uint256 amount) external; /// @notice deposit LP tokens to the gauge /// @param amount the amount of LP tokens to withdraw function deposit(uint256 amount) external; /// @notice withdraws all fungible LP tokens from legacy gauges function withdrawAll() external; /// @notice withdraws fungible LP tokens from legacy gauges /// @param amount the amount of LP tokens to withdraw function withdraw(uint256 amount) external; /// @notice calculates how many tokens are left to be distributed /// @dev reduces per second /// @param token the address of the token function left(address token) external view returns (uint256); /// @notice add a reward to the whitelist /// @param _reward address of the reward function whitelistReward(address _reward) external; /// @notice remove rewards from the whitelist /// @param _reward address of the reward function removeRewardWhitelist(address _reward) external; /** * @notice amount must be greater than left() for the token, this is to prevent griefing attacks * @notice notifying rewards is completely permissionless * @notice if nobody registers for a newly added reward for the period it will remain in the contract indefinitely */ function notifyRewardAmount(address token, uint256 amount) external; struct Reward { /// @dev tokens per second uint256 rewardRate; /// @dev 7 days after start uint256 periodFinish; uint256 lastUpdateTime; uint256 rewardPerTokenStored; } /// @notice checks if a reward is whitelisted /// @param reward the address of the reward /// @return true if the reward is whitelisted, false otherwise function isWhitelisted(address reward) external view returns (bool); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.26; interface IGaugeV3 { error NOT_AUTHORIZED(); error NOT_VOTER(); error NOT_GT_ZERO(uint256 amt); error CANT_CLAIM_FUTURE(); error RETRO(); /// @notice Emitted when a reward notification is made. /// @param from The address from which the reward is notified. /// @param reward The address of the reward token. /// @param amount The amount of rewards notified. /// @param period The period for which the rewards are notified. event NotifyReward( address indexed from, address indexed reward, uint256 amount, uint256 period ); /// @notice Emitted when a bribe is made. /// @param from The address from which the bribe is made. /// @param reward The address of the reward token. /// @param amount The amount of tokens bribed. /// @param period The period for which the bribe is made. event Bribe( address indexed from, address indexed reward, uint256 amount, uint256 period ); /// @notice Emitted when rewards are claimed. /// @param period The period for which the rewards are claimed. /// @param _positionHash The identifier of the NFP for which rewards are claimed. /// @param receiver The address of the receiver of the claimed rewards. /// @param reward The address of the reward token. /// @param amount The amount of rewards claimed. event ClaimRewards( uint256 period, bytes32 _positionHash, address receiver, address reward, uint256 amount ); /// @notice Emitted when a new reward token was pushed to the rewards array event RewardAdded(address reward); /// @notice Emitted when a reward token was removed from the rewards array event RewardRemoved(address reward); /// @notice Retrieves the value of the firstPeriod variable. /// @return The value of the firstPeriod variable. function firstPeriod() external returns (uint256); /// @notice Retrieves the total supply of a specific token for a given period. /// @param period The period for which to retrieve the total supply. /// @param token The address of the token for which to retrieve the total supply. /// @return The total supply of the specified token for the given period. function tokenTotalSupplyByPeriod( uint256 period, address token ) external view returns (uint256); /// @notice Retrieves the getTokenTotalSupplyByPeriod of the current period. /// @dev included to support voter's left() check during distribute(). /// @param token The address of the token for which to retrieve the remaining amount. /// @return The amount of tokens left to distribute in this period. function left(address token) external view returns (uint256); /// @notice Retrieves the reward rate for a specific reward address. /// @dev this method returns the base rate without boost /// @param token The address of the reward for which to retrieve the reward rate. /// @return The reward rate for the specified reward address. function rewardRate(address token) external view returns (uint256); /// @notice Retrieves the claimed amount for a specific period, position hash, and user address. /// @param period The period for which to retrieve the claimed amount. /// @param _positionHash The identifier of the NFP for which to retrieve the claimed amount. /// @param reward The address of the token for the claimed amount. /// @return The claimed amount for the specified period, token ID, and user address. function periodClaimedAmount( uint256 period, bytes32 _positionHash, address reward ) external view returns (uint256); /// @notice Retrieves the last claimed period for a specific token, token ID combination. /// @param token The address of the reward token for which to retrieve the last claimed period. /// @param _positionHash The identifier of the NFP for which to retrieve the last claimed period. /// @return The last claimed period for the specified token and token ID. function lastClaimByToken( address token, bytes32 _positionHash ) external view returns (uint256); /// @notice Retrieves the reward address at the specified index in the rewards array. /// @param index The index of the reward address to retrieve. /// @return The reward address at the specified index. function rewards(uint256 index) external view returns (address); /// @notice Checks if a given address is a valid reward. /// @param reward The address to check. /// @return A boolean indicating whether the address is a valid reward. function isReward(address reward) external view returns (bool); /// @notice Returns an array of reward token addresses. /// @return An array of reward token addresses. function getRewardTokens() external view returns (address[] memory); /// @notice Returns the hash used to store positions in a mapping /// @param owner The address of the position owner /// @param index The index of the position /// @param tickLower The lower tick boundary of the position /// @param tickUpper The upper tick boundary of the position /// @return _hash The hash used to store positions in a mapping function positionHash( address owner, uint256 index, int24 tickLower, int24 tickUpper ) external pure returns (bytes32); /* /// @notice Retrieves the liquidity and boosted liquidity for a specific NFP. /// @param tokenId The identifier of the NFP. /// @return liquidity The liquidity of the position token. function positionInfo( uint256 tokenId ) external view returns (uint128 liquidity); */ /// @notice Returns the amount of rewards earned for an NFP. /// @param token The address of the token for which to retrieve the earned rewards. /// @param tokenId The identifier of the specific NFP for which to retrieve the earned rewards. /// @return reward The amount of rewards earned for the specified NFP and tokens. function earned( address token, uint256 tokenId ) external view returns (uint256 reward); /// @notice Returns the amount of rewards earned during a period for an NFP. /// @param period The period for which to retrieve the earned rewards. /// @param token The address of the token for which to retrieve the earned rewards. /// @param tokenId The identifier of the specific NFP for which to retrieve the earned rewards. /// @return reward The amount of rewards earned for the specified NFP and tokens. function periodEarned( uint256 period, address token, uint256 tokenId ) external view returns (uint256); /// @notice Retrieves the earned rewards for a specific period, token, owner, index, tickLower, and tickUpper. /// @param period The period for which to retrieve the earned rewards. /// @param token The address of the token for which to retrieve the earned rewards. /// @param owner The address of the owner for which to retrieve the earned rewards. /// @param index The index for which to retrieve the earned rewards. /// @param tickLower The tick lower bound for which to retrieve the earned rewards. /// @param tickUpper The tick upper bound for which to retrieve the earned rewards. /// @return The earned rewards for the specified period, token, owner, index, tickLower, and tickUpper. function periodEarned( uint256 period, address token, address owner, uint256 index, int24 tickLower, int24 tickUpper ) external view returns (uint256); /// @notice Retrieves the earned rewards for a specific period, token, owner, index, tickLower, and tickUpper. /// @dev used by getReward() and saves gas by saving states /// @param period The period for which to retrieve the earned rewards. /// @param token The address of the token for which to retrieve the earned rewards. /// @param owner The address of the owner for which to retrieve the earned rewards. /// @param index The index for which to retrieve the earned rewards. /// @param tickLower The tick lower bound for which to retrieve the earned rewards. /// @param tickUpper The tick upper bound for which to retrieve the earned rewards. /// @param caching Whether to cache the results or not. /// @return The earned rewards for the specified period, token, owner, index, tickLower, and tickUpper. function cachePeriodEarned( uint256 period, address token, address owner, uint256 index, int24 tickLower, int24 tickUpper, bool caching ) external returns (uint256); /// @notice Notifies the contract about the amount of rewards to be distributed for a specific token. /// @param token The address of the token for which to notify the reward amount. /// @param amount The amount of rewards to be distributed. function notifyRewardAmount(address token, uint256 amount) external; /// @notice Retrieves the reward amount for a specific period, NFP, and token addresses. /// @param period The period for which to retrieve the reward amount. /// @param tokens The addresses of the tokens for which to retrieve the reward amount. /// @param tokenId The identifier of the specific NFP for which to retrieve the reward amount. /// @param receiver The address of the receiver of the reward amount. function getPeriodReward( uint256 period, address[] calldata tokens, uint256 tokenId, address receiver ) external; /// @notice Retrieves the rewards for a specific period, set of tokens, owner, index, tickLower, tickUpper, and receiver. /// @param period The period for which to retrieve the rewards. /// @param tokens An array of token addresses for which to retrieve the rewards. /// @param owner The address of the owner for which to retrieve the rewards. /// @param index The index for which to retrieve the rewards. /// @param tickLower The tick lower bound for which to retrieve the rewards. /// @param tickUpper The tick upper bound for which to retrieve the rewards. /// @param receiver The address of the receiver of the rewards. function getPeriodReward( uint256 period, address[] calldata tokens, address owner, uint256 index, int24 tickLower, int24 tickUpper, address receiver ) external; /// @notice retrieves rewards based on an NFP id and an array of tokens function getReward(uint256 tokenId, address[] memory tokens) external; /// @notice retrieves rewards based on an array of NFP ids and an array of tokens function getReward( uint256[] calldata tokenIds, address[] memory tokens ) external; /// @notice get reward for an owner of an NFP function getRewardForOwner( uint256 tokenId, address[] memory tokens ) external; function addRewards(address reward) external; function removeRewards(address reward) external; /// @notice Notifies rewards for periods greater than current period /// @dev does not push fees /// @dev requires reward token to be whitelisted function notifyRewardAmountForPeriod( address token, uint256 amount, uint256 period ) external; /// @notice Notifies rewards for the next period /// @dev does not push fees /// @dev requires reward token to be whitelisted function notifyRewardAmountNextPeriod( address token, uint256 amount ) external; }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.8.26; interface IVoteModule { /** Custom Errors */ /// @dev == 0 error ZERO_AMOUNT(); /// @dev if address is not xShadow error NOT_XSHADOW(); /// @dev error for when the cooldown period has not been passed yet error COOLDOWN_ACTIVE(); /// @dev error for when you try to deposit or withdraw for someone who isn't the msg.sender error NOT_VOTEMODULE(); /// @dev error for when the caller is not authorized error UNAUTHORIZED(); /// @dev error for accessHub gated functions error NOT_ACCESSHUB(); /// @dev error for when there is no change of state error NO_CHANGE(); /// @dev error for when address is invalid error INVALID_ADDRESS(); /** Events */ event Deposit(address indexed from, uint256 amount); event Withdraw(address indexed from, uint256 amount); event NotifyReward(address indexed from, uint256 amount); event ClaimRewards(address indexed from, uint256 amount); event ExemptedFromCooldown(address indexed candidate, bool status); event NewDuration(uint256 oldDuration, uint256 newDuration); event NewCooldown(uint256 oldCooldown, uint256 newCooldown); event Delegate( address indexed delegator, address indexed delegatee, bool indexed isAdded ); event SetAdmin( address indexed owner, address indexed operator, bool indexed isAdded ); /** Functions */ function delegates(address) external view returns (address); /// @notice mapping for admins for a specific address /// @param owner the owner to check against /// @return operator the address that is designated as an admin/operator function admins(address owner) external view returns (address operator); function accessHub() external view returns(address); /// @notice returns the last time the reward was modified or periodFinish if the reward has ended function lastTimeRewardApplicable() external view returns (uint256 _ltra); function earned(address account) external view returns (uint256 _reward); /// @notice the time which users can deposit and withdraw function unlockTime() external view returns (uint256 _timestamp); /// @notice the accumulated dust in the contract from precision rollover function dust() external view returns (uint256 _dust); /// @notice claims pending rebase rewards function getReward() external; function rewardPerToken() external view returns (uint256 _rewardPerToken); /// @notice deposits all xShadow in the caller's wallet function depositAll() external; /// @notice deposit a specified amount of xShadow function deposit(uint256 amount) external; /// @notice withdraw all xShadow function withdrawAll() external; /// @notice withdraw a specified amount of xShadow function withdraw(uint256 amount) external; /// @notice check for admin perms /// @param operator the address to check /// @param owner the owner to check against for permissions function isAdminFor( address operator, address owner ) external view returns (bool approved); /// @notice check for delegations /// @param delegate the address to check /// @param owner the owner to check against for permissions function isDelegateFor( address delegate, address owner ) external view returns (bool approved); /// @notice rewards pending to be distributed for the reward period /// @return _left rewards remaining in the period function left() external view returns (uint256 _left); /// @notice used by the xShadow contract to notify pending rebases /// @param amount the amount of Shadow to be notified from exit penalties function notifyRewardAmount(uint256 amount) external; /// @notice the address of the xShadow token (staking/voting token) /// @return _xShadow the address function xShadow() external view returns (address _xShadow); /// @notice address of the voter contract /// @return _voter the voter contract address function voter() external view returns (address _voter); /// @notice returns the total voting power (equal to total supply in the VoteModule) /// @return _totalSupply the total voting power function totalSupply() external view returns (uint256 _totalSupply); /// @notice last time the rewards system was updated function lastUpdateTime() external view returns (uint256 _lastUpdateTime); /// @notice rewards per xShadow /// @return _rewardPerToken the amount of rewards per xShadow function rewardPerTokenStored() external view returns (uint256 _rewardPerToken); /// @notice when the 1800 seconds after notifying are up function periodFinish() external view returns (uint256 _periodFinish); /// @notice calculates the rewards per second /// @return _rewardRate the rewards distributed per second function rewardRate() external view returns (uint256 _rewardRate); /// @notice voting power /// @param user the address to check /// @return amount the staked balance function balanceOf(address user) external view returns (uint256 amount); /// @notice rewards per amount of xShadow's staked function userRewardPerTokenStored( address user ) external view returns (uint256 rewardPerToken); /// @notice the amount of rewards claimable for the user /// @param user the address of the user to check /// @return rewards the stored rewards function storedRewardsPerUser( address user ) external view returns (uint256 rewards); /// @notice delegate voting perms to another address /// @param delegatee who you delegate to /// @dev set address(0) to revoke function delegate(address delegatee) external; /// @notice give admin permissions to a another address /// @param operator the address to give administrative perms to /// @dev set address(0) to revoke function setAdmin(address operator) external; function cooldownExempt(address) external view returns (bool); function setCooldownExemption(address, bool) external; function setNewDuration(uint) external; function setNewCooldown(uint) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.26; interface IFeeDistributor { error NOT_AUTHORIZED(); error ZERO_AMOUNT(); error NOT_FINALIZED(); error TOKEN_ERROR(address); event Deposit(address owner, uint256 amount); event Withdraw(address owner, uint256 amount); event NotifyReward( address indexed from, address indexed reward, uint256 amount, uint256 period ); event VotesIncentivized( address indexed from, address indexed reward, uint256 amount, uint256 period ); event ClaimRewards( uint256 period, address owner, address receiver, address reward, uint256 amount ); event RewardsRemoved(address _reward); /// @notice the address of the voter contract function voter() external view returns (address); /// @notice the address of the voting module function voteModule() external view returns (address); /// @notice the address of the feeRecipient contract function feeRecipient() external view returns (address); /// @notice the first period (epoch) that this contract was deployed function firstPeriod() external view returns (uint256); /// @notice balance of the voting power for a user /// @param owner the owner /// @return amount the amount of voting share function balanceOf(address owner) external view returns (uint256 amount); /// @notice total cumulative amount of voting power per epoch /// @param period the period to check /// @return weight the amount of total voting power function votes(uint256 period) external view returns (uint256 weight); /// @notice "internal" function gated to voter to add votes /// @dev internal notation inherited from original solidly, kept for continuity function _deposit(uint256 amount, address owner) external; /// @notice "internal" function gated to voter to remove votes /// @dev internal notation inherited from original solidly, kept for continuity function _withdraw(uint256 amount, address owner) external; /// @notice function to claim rewards on behalf of another /// @param owner owner's address /// @param tokens an array of the tokens function getRewardForOwner(address owner, address[] memory tokens) external; /// @notice function for sending fees directly to be claimable (in system where fees are distro'd through the week) /// @dev for lumpsum - this would operate similarly to incentivize /// @param token the address of the token to send for notifying /// @param amount the amount of token to send function notifyRewardAmount(address token, uint256 amount) external; /// @notice gives an array of reward tokens for the feedist /// @return _rewards array of rewards function getRewardTokens() external view returns (address[] memory _rewards); /// @notice shows the earned incentives in the feedist /// @param token the token address to check /// @param owner owner's address /// @return reward the amount earned/claimable function earned( address token, address owner ) external view returns (uint256 reward); /// @notice function to submit incentives to voters for the upcoming flip /// @param token the address of the token to send for incentivization /// @param amount the amount of token to send function incentivize(address token, uint256 amount) external; /// @notice get the rewards for a specific period /// @param owner owner's address function getPeriodReward( uint256 period, address owner, address token ) external; /// @notice get the fees and incentives function getReward(address owner, address[] memory tokens) external; /// @notice remove a reward from the set function removeReward(address _token) external; }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.7.5; pragma abicoder v2; /// @title Creates and initializes V3 Pools /// @notice Provides a method for creating and initializing a pool, if necessary, for bundling with other methods that /// require the pool to exist. interface IPoolInitializer { /// @notice Creates a new pool if it does not exist, then initializes if not initialized /// @dev This method can be bundled with others via IMulticall for the first action (e.g. mint) performed against a pool /// @param token0 The contract address of token0 of the pool /// @param token1 The contract address of token1 of the pool /// @param tickSpacing The tickSpacing of the v3 pool for the specified token pair /// @param sqrtPriceX96 The initial square root price of the pool as a Q64.96 value /// @return pool Returns the pool address based on the pair of tokens and fee, will return the newly created pool address if necessary function createAndInitializePoolIfNecessary( address token0, address token1, int24 tickSpacing, uint160 sqrtPriceX96 ) external payable returns (address pool); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.7.5; /// @title Periphery Payments /// @notice Functions to ease deposits and withdrawals of ETH interface IPeripheryPayments { /// @notice Unwraps the contract's WETH9 balance and sends it to recipient as ETH. /// @dev The amountMinimum parameter prevents malicious contracts from stealing WETH9 from users. /// @param amountMinimum The minimum amount of WETH9 to unwrap /// @param recipient The address receiving ETH function unwrapWETH9(uint256 amountMinimum, address recipient) external payable; /// @notice Refunds any ETH balance held by this contract to the `msg.sender` /// @dev Useful for bundling with mint or increase liquidity that uses ether, or exact output swaps /// that use ether for the input amount function refundETH() external payable; /// @notice Transfers the full amount of a token held by this contract to recipient /// @dev The amountMinimum parameter prevents malicious contracts from stealing the token from users /// @param token The contract address of the token which will be transferred to `recipient` /// @param amountMinimum The minimum amount of token required for a transfer /// @param recipient The destination address of the token function sweepToken( address token, uint256 amountMinimum, address recipient ) external payable; }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.5.0; /// @title Immutable state /// @notice Functions that return immutable state of the router interface IPeripheryImmutableState { /// @return Returns the address of the Uniswap V3 deployer function deployer() external view returns (address); /// @return Returns the address of WETH9 function WETH9() external view returns (address); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.5.0; /// @title Provides functions for deriving a pool address from the deployer, tokens, and the fee library PoolAddress { bytes32 internal constant POOL_INIT_CODE_HASH = 0xc701ee63862761c31d620a4a083c61bdc1e81761e6b9c9267fd19afd22e0821d; /// @notice The identifying key of the pool struct PoolKey { address token0; address token1; int24 tickSpacing; } /// @notice Returns PoolKey: the ordered tokens with the matched fee levels /// @param tokenA The first token of a pool, unsorted /// @param tokenB The second token of a pool, unsorted /// @param tickSpacing The tickSpacing of the pool /// @return Poolkey The pool details with ordered token0 and token1 assignments function getPoolKey(address tokenA, address tokenB, int24 tickSpacing) internal pure returns (PoolKey memory) { if (tokenA > tokenB) (tokenA, tokenB) = (tokenB, tokenA); return PoolKey({token0: tokenA, token1: tokenB, tickSpacing: tickSpacing}); } /// @notice Deterministically computes the pool address given the deployer and PoolKey /// @param deployer The Uniswap V3 deployer contract address /// @param key The PoolKey /// @return pool The contract address of the V3 pool function computeAddress(address deployer, PoolKey memory key) internal pure returns (address pool) { require(key.token0 < key.token1, "!TokenOrder"); pool = address( uint160( uint256( keccak256( abi.encodePacked( hex'ff', deployer, keccak256(abi.encode(key.token0, key.token1, key.tickSpacing)), POOL_INIT_CODE_HASH ) ) ) ) ); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.20; import {IERC165} from "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC-721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC-721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or * {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon * a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC-721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the address zero. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.20; import {IERC721} from "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.20; import {IERC721} from "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.5.0; /// @title Errors emitted by the NonFungiblePositionManager /// @notice Contains all events emitted by the NfpManager interface IPeripheryErrors { error InvalidTokenId(uint256 tokenId); error CheckSlippage(); error NotCleared(); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "remappings": [ "@openzeppelin-contracts-5.1.0/=dependencies/@openzeppelin-contracts-5.1.0/", "@openzeppelin-contracts-upgradeable-5.1.0/=dependencies/@openzeppelin-contracts-upgradeable-5.1.0/", "@forge-std-1.9.4/=dependencies/forge-std-1.9.4/", "@layerzerolabs/=node_modules/@layerzerolabs/", "@layerzerolabs/lz-evm-protocol-v2/=node_modules/@layerzerolabs/lz-evm-protocol-v2/", "@openzeppelin-contracts-upgradeable/=dependencies/@openzeppelin-contracts-upgradeable-5.1.0/", "@openzeppelin-contracts/contracts/=dependencies/@openzeppelin-contracts-5.1.0/", "@openzeppelin/contracts/=dependencies/@openzeppelin-contracts-5.1.0/", "erc4626-tests/=dependencies/erc4626-property-tests-1.0/", "forge-std/=dependencies/forge-std-1.9.4/src/", "permit2/=lib/permit2/", "@openzeppelin-3.4.2/=node_modules/@openzeppelin-3.4.2/", "@openzeppelin-contracts-5.1.0/=dependencies/@openzeppelin-contracts-5.1.0/", "@openzeppelin-contracts-upgradeable-5.1.0/=dependencies/@openzeppelin-contracts-upgradeable-5.1.0/", "@uniswap/=node_modules/@uniswap/", "base64-sol/=node_modules/base64-sol/", "ds-test/=node_modules/ds-test/", "erc4626-property-tests-1.0/=dependencies/erc4626-property-tests-1.0/", "eth-gas-reporter/=node_modules/eth-gas-reporter/", "forge-std-1.9.4/=dependencies/forge-std-1.9.4/src/", "hardhat/=node_modules/hardhat/", "solidity-bytes-utils/=node_modules/solidity-bytes-utils/", "solmate/=node_modules/solmate/" ], "optimizer": { "enabled": true, "runs": 1633 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "cancun", "viaIR": true, "libraries": { "contracts/libraries/RewardClaimers.sol": { "RewardClaimers": "0x6D2fC04561107a8aaE638499D0d692E3Da424Bc8" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract Creation Code
60808060405234601b5761081a90816100208239308160070152f35b5f80fdfe6080604052307f0000000000000000000000000000000000000000000000000000000000000000146004361015610034575f80fd5b5f3560e01c806320b1cb6f1461055b578063e55c5391146103d75763f66c4a2a1461005d575f80fd5b6102285760803660031901126102285761007561067c565b60243567ffffffffffffffff81116102285761009590369060040161064b565b909160443567ffffffffffffffff8111610228576100b790369060040161064b565b92909160643567ffffffffffffffff8111610228576100da90369060040161064b565b9490956001600160a01b035f9316955b8484106100f357005b5f5b61010085838b6106ca565b90508110156103cc5761011e8161011887858d6106ca565b90610692565b35604051906331a9108f60e11b825260048201526020816024818c5afa801561021d576001600160a01b03915f916103ae575b50163314801561032b575b801561022c575b1561022857806101958a9261011888866001600160a01b0361018e610189848f8d610692565b6106b6565b16966106ca565b356101a187878b6106ca565b93803b15610228576101f3945f8094604051978895869485937fa7852afa0000000000000000000000000000000000000000000000000000000085526004850152604060248501526044840191610745565b03925af191821561021d5760019261020d575b50016100f5565b5f6102179161070f565b5f610206565b6040513d5f823e3d90fd5b5f80fd5b5061023c8161011887858d6106ca565b35604051906331a9108f60e11b825260048201526020816024818c5afa90811561021d576102b7916020915f916102fe575b506040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015233602482015291829081906044820190565b03818c5afa90811561021d575f916102d0575b50610163565b6102f1915060203d81116102f7575b6102e9818361070f565b8101906107ad565b5f6102ca565b503d6102df565b61031e9150823d8111610324575b610316818361070f565b8101906107c5565b5f61026e565b503d61030c565b5061033b8161011887858d6106ca565b35604051907f081812fc00000000000000000000000000000000000000000000000000000000825260048201526020816024818c5afa801561021d576001600160a01b03915f91610390575b5016331461015c565b6103a8915060203d811161032457610316818361070f565b5f610387565b6103c6915060203d811161032457610316818361070f565b5f610151565b5092600101926100ea565b50610228576080366003190112610228576103f061067c565b6024356001600160a01b03811681036102285760443567ffffffffffffffff81116102285761042390369060040161064b565b60649291923567ffffffffffffffff81116102285761044690369060040161064b565b6040517f4b4104590000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0385811660248301529296919592909160209183916044918391165afa801561021d5761053e575b505f5b8281106104ad57005b6001600160a01b036104c3610189838686610692565b16906104d08187896106ca565b833b1561022857610514935f92836040518097819582947fe943da8a0000000000000000000000000000000000000000000000000000000084528d6004850161078a565b03925af191821561021d5760019261052e575b50016104a4565b5f6105389161070f565b5f610527565b6105569060203d6020116102f7576102e9818361070f565b6104a1565b506102285760403660031901126102285760043567ffffffffffffffff81116102285761058c90369060040161064b565b60243567ffffffffffffffff8111610228576105ac90369060040161064b565b9190925f5b8281106105ba57005b6001600160a01b036105d0610189838686610692565b16906105dd8186886106ca565b833b1561022857610621935f92836040518097819582947f31279d3d000000000000000000000000000000000000000000000000000000008452336004850161078a565b03925af191821561021d5760019261063b575b50016105b1565b5f6106459161070f565b5f610634565b9181601f840112156102285782359167ffffffffffffffff8311610228576020808501948460051b01011161022857565b600435906001600160a01b038216820361022857565b91908110156106a25760051b0190565b634e487b7160e01b5f52603260045260245ffd5b356001600160a01b03811681036102285790565b91908110156106a25760051b81013590601e198136030182121561022857019081359167ffffffffffffffff8311610228576020018260051b36038113610228579190565b90601f8019910116810190811067ffffffffffffffff82111761073157604052565b634e487b7160e01b5f52604160045260245ffd5b916020908281520191905f905b80821061075f5750505090565b9091928335906001600160a01b03821680920361022857602081600193829352019401920190610752565b6040906001600160a01b036107aa95931681528160208201520191610745565b90565b90816020910312610228575180151581036102285790565b9081602091031261022857516001600160a01b0381168103610228579056fea2646970667358221220ae440ace7dce6fb036cee97fed77197c08b9fb6124aacab1be0defd5a2df291664736f6c634300081c0033
Deployed Bytecode
0x6080604052307f0000000000000000000000006d2fc04561107a8aae638499d0d692e3da424bc8146004361015610034575f80fd5b5f3560e01c806320b1cb6f1461055b578063e55c5391146103d75763f66c4a2a1461005d575f80fd5b6102285760803660031901126102285761007561067c565b60243567ffffffffffffffff81116102285761009590369060040161064b565b909160443567ffffffffffffffff8111610228576100b790369060040161064b565b92909160643567ffffffffffffffff8111610228576100da90369060040161064b565b9490956001600160a01b035f9316955b8484106100f357005b5f5b61010085838b6106ca565b90508110156103cc5761011e8161011887858d6106ca565b90610692565b35604051906331a9108f60e11b825260048201526020816024818c5afa801561021d576001600160a01b03915f916103ae575b50163314801561032b575b801561022c575b1561022857806101958a9261011888866001600160a01b0361018e610189848f8d610692565b6106b6565b16966106ca565b356101a187878b6106ca565b93803b15610228576101f3945f8094604051978895869485937fa7852afa0000000000000000000000000000000000000000000000000000000085526004850152604060248501526044840191610745565b03925af191821561021d5760019261020d575b50016100f5565b5f6102179161070f565b5f610206565b6040513d5f823e3d90fd5b5f80fd5b5061023c8161011887858d6106ca565b35604051906331a9108f60e11b825260048201526020816024818c5afa90811561021d576102b7916020915f916102fe575b506040517fe985e9c50000000000000000000000000000000000000000000000000000000081526001600160a01b03909116600482015233602482015291829081906044820190565b03818c5afa90811561021d575f916102d0575b50610163565b6102f1915060203d81116102f7575b6102e9818361070f565b8101906107ad565b5f6102ca565b503d6102df565b61031e9150823d8111610324575b610316818361070f565b8101906107c5565b5f61026e565b503d61030c565b5061033b8161011887858d6106ca565b35604051907f081812fc00000000000000000000000000000000000000000000000000000000825260048201526020816024818c5afa801561021d576001600160a01b03915f91610390575b5016331461015c565b6103a8915060203d811161032457610316818361070f565b5f610387565b6103c6915060203d811161032457610316818361070f565b5f610151565b5092600101926100ea565b50610228576080366003190112610228576103f061067c565b6024356001600160a01b03811681036102285760443567ffffffffffffffff81116102285761042390369060040161064b565b60649291923567ffffffffffffffff81116102285761044690369060040161064b565b6040517f4b4104590000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0385811660248301529296919592909160209183916044918391165afa801561021d5761053e575b505f5b8281106104ad57005b6001600160a01b036104c3610189838686610692565b16906104d08187896106ca565b833b1561022857610514935f92836040518097819582947fe943da8a0000000000000000000000000000000000000000000000000000000084528d6004850161078a565b03925af191821561021d5760019261052e575b50016104a4565b5f6105389161070f565b5f610527565b6105569060203d6020116102f7576102e9818361070f565b6104a1565b506102285760403660031901126102285760043567ffffffffffffffff81116102285761058c90369060040161064b565b60243567ffffffffffffffff8111610228576105ac90369060040161064b565b9190925f5b8281106105ba57005b6001600160a01b036105d0610189838686610692565b16906105dd8186886106ca565b833b1561022857610621935f92836040518097819582947f31279d3d000000000000000000000000000000000000000000000000000000008452336004850161078a565b03925af191821561021d5760019261063b575b50016105b1565b5f6106459161070f565b5f610634565b9181601f840112156102285782359167ffffffffffffffff8311610228576020808501948460051b01011161022857565b600435906001600160a01b038216820361022857565b91908110156106a25760051b0190565b634e487b7160e01b5f52603260045260245ffd5b356001600160a01b03811681036102285790565b91908110156106a25760051b81013590601e198136030182121561022857019081359167ffffffffffffffff8311610228576020018260051b36038113610228579190565b90601f8019910116810190811067ffffffffffffffff82111761073157604052565b634e487b7160e01b5f52604160045260245ffd5b916020908281520191905f905b80821061075f5750505090565b9091928335906001600160a01b03821680920361022857602081600193829352019401920190610752565b6040906001600160a01b036107aa95931681528160208201520191610745565b90565b90816020910312610228575180151581036102285790565b9081602091031261022857516001600160a01b0381168103610228579056fea2646970667358221220ae440ace7dce6fb036cee97fed77197c08b9fb6124aacab1be0defd5a2df291664736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.