Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- SimpleFtsoExample
- Optimization enabled
- true
- Compiler version
- v0.8.20+commit.a1b79de6
- Optimization runs
- 200
- EVM Version
- london
- Verified at
- 2023-10-28T23:51:57.759982Z
contracts/SimpelFtsoExample.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.6; import {IFtsoRegistry} from "@flarenetwork/flare-periphery-contracts/coston2/ftso/userInterfaces/IFtsoRegistry.sol"; import {FlareContractsRegistryLibrary} from "@flarenetwork/flare-periphery-contracts/coston2/util-contracts/ContractRegistryLibrary.sol"; contract SimpleFtsoExample { function getCurrentTokenPriceWithDecimals( string memory foreignTokenSymbol ) public view returns (uint256 _price, uint256 _timestamp, uint256 _decimals) { IFtsoRegistry ftsoRegistry = FlareContractsRegistryLibrary .getFtsoRegistry(); (_price, _timestamp, _decimals) = ftsoRegistry .getCurrentPriceWithDecimals(foreignTokenSymbol); } function getTokenPriceInUSDWei( string memory foreignTokenSymbol ) public view returns (uint256 _priceInUSDWei, uint256 _finalizedTimestamp) { IFtsoRegistry ftsoRegistry = FlareContractsRegistryLibrary .getFtsoRegistry(); (uint256 _price, uint256 _timestamp, uint256 _decimals) = ftsoRegistry .getCurrentPriceWithDecimals(foreignTokenSymbol); require(_decimals <= 18, "decimals > 18"); _priceInUSDWei = _price * (10 ** (18 - _decimals)); return (_priceInUSDWei, _timestamp); } function getTokenPairPrice( string memory token1, string memory token2 ) public view returns (uint256 _price1, uint256 _price2, uint256 _timestamp) { IFtsoRegistry ftsoRegistry = FlareContractsRegistryLibrary .getFtsoRegistry(); ( uint256 _tPrice1, uint256 _timestamp1, uint256 decimals1 ) = ftsoRegistry.getCurrentPriceWithDecimals(token1); ( uint256 _tPrice2, uint256 _timestamp2, uint256 decimals2 ) = ftsoRegistry.getCurrentPriceWithDecimals(token2); require(decimals1 <= 18, "decimals1 > 18"); require(decimals2 <= 18, "decimals2 > 18"); _price1 = _tPrice1 * (10 ** (18 - decimals1)); _price2 = _tPrice2 * (10 ** (18 - decimals2)); // This holds for V1 require(_timestamp1 == _timestamp2, "timestamps not equal"); return (_price1, _price2, _timestamp1); } // Checks if token1/token2 price ratio is higher than numerator/denominator // May overflow function isPriceRatioHigherThan( string memory token1, string memory token2, uint256 numerator, uint256 denominator ) public view returns (uint256 _price1, uint256 _price2, bool _is_higher) { (_price1, _price2, ) = getTokenPairPrice(token1, token2); _is_higher = _price1 * denominator > _price2 * numerator; } }
@flarenetwork/flare-periphery-contracts/coston2/distribution/userInterfaces/IDistributionToDelegators.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; pragma abicoder v2; interface IDistributionToDelegators { // Events event UseGoodRandomSet(bool useGoodRandom, uint256 maxWaitForGoodRandomSeconds); event EntitlementStart(uint256 entitlementStartTs); event AccountClaimed(address indexed whoClaimed, address indexed sentTo, uint256 month, uint256 amountWei); event AccountOptOut(address indexed theAccount, bool confirmed); // Methods /** * @notice Allows the sender to claim or wrap rewards for reward owner. * @notice The caller does not have to be the owner, but must be approved by the owner to claim on his behalf, * this approval is done by calling `setClaimExecutors`. * @notice It is actually safe for this to be called by anybody (nothing can be stolen), but by limiting who can * call, we allow the owner to control the timing of the calls. * @notice Reward owner can claim to any `_recipient`, while the executor can only claim to the reward owner, * reward owners's personal delegation account or one of the addresses set by `setAllowedClaimRecipients`. * @param _rewardOwner address of the reward owner * @param _recipient address to transfer funds to * @param _month last month to claim for * @param _wrap should reward be wrapped immediately * @return _rewardAmount amount of total claimed rewards */ function claim(address _rewardOwner, address _recipient, uint256 _month, bool _wrap) external returns(uint256 _rewardAmount); /** * @notice Allows batch claiming for the list of '_rewardOwners' up to given '_month'. * @notice If reward owner has enabled delegation account, rewards are also claimed for that delegation account and * total claimed amount is sent to that delegation account, otherwise claimed amount is sent to owner's account. * @notice Claimed amount is automatically wrapped. * @notice Method can be used by reward owner or executor. If executor is registered with fee > 0, * then fee is paid to executor for each claimed address from the list. * @param _rewardOwners list of reward owners to claim for * @param _month last month to claim for */ function autoClaim(address[] calldata _rewardOwners, uint256 _month) external; /** * @notice Method to opt-out of receiving airdrop rewards */ function optOutOfAirdrop() external; /** * @notice Returns the next claimable month for '_rewardOwner'. * @param _rewardOwner address of the reward owner */ function nextClaimableMonth(address _rewardOwner) external view returns (uint256); /** * @notice get claimable amount of wei for requesting account for specified month * @param _month month of interest * @return _amountWei amount of wei available for this account and provided month */ function getClaimableAmount(uint256 _month) external view returns(uint256 _amountWei); /** * @notice get claimable amount of wei for account for specified month * @param _account the address of an account we want to get the claimable amount of wei * @param _month month of interest * @return _amountWei amount of wei available for provided account and month */ function getClaimableAmountOf(address _account, uint256 _month) external view returns(uint256 _amountWei); /** * @notice Returns the current month * @return _currentMonth Current month, 0 before entitlementStartTs */ function getCurrentMonth() external view returns (uint256 _currentMonth); /** * @notice Returns the month that will expire next * @return _monthToExpireNext Month that will expire next, 1100 when last month expired */ function getMonthToExpireNext() external view returns (uint256 _monthToExpireNext); /** * @notice Returns claimable months - reverts if none * @return _startMonth first claimable month * @return _endMonth last claimable month */ function getClaimableMonths() external view returns(uint256 _startMonth, uint256 _endMonth); }
@flarenetwork/flare-periphery-contracts/coston2/ftso/ftso/interface/IIFtso.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; import "../../genesis/interface/IFtsoGenesis.sol"; import "../../userInterfaces/IFtso.sol"; import "../../../util-contracts/token/token/interface/IIVPToken.sol"; interface IIFtso is IFtso, IFtsoGenesis { /// function finalizePriceReveal /// called by reward manager only on correct timing. /// if price reveal period for epoch x ended. finalize. /// iterate list of price submissions /// find weighted median /// find adjucant 50% of price submissions. /// Allocate reward for any price submission which is same as a "winning" submission function finalizePriceEpoch(uint256 _epochId, bool _returnRewardData) external returns( address[] memory _eligibleAddresses, uint256[] memory _natWeights, uint256 _totalNatWeight ); function fallbackFinalizePriceEpoch(uint256 _epochId) external; function forceFinalizePriceEpoch(uint256 _epochId) external; // activateFtso will be called by ftso manager once ftso is added // before this is done, FTSO can't run function activateFtso( uint256 _firstEpochStartTs, uint256 _submitPeriodSeconds, uint256 _revealPeriodSeconds ) external; function deactivateFtso() external; // update initial price and timestamp - only if not active function updateInitialPrice(uint256 _initialPriceUSD, uint256 _initialPriceTimestamp) external; function configureEpochs( uint256 _maxVotePowerNatThresholdFraction, uint256 _maxVotePowerAssetThresholdFraction, uint256 _lowAssetUSDThreshold, uint256 _highAssetUSDThreshold, uint256 _highAssetTurnoutThresholdBIPS, uint256 _lowNatTurnoutThresholdBIPS, uint256 _elasticBandRewardBIPS, uint256 _elasticBandWidthPPM, address[] memory _trustedAddresses ) external; function setAsset(IIVPToken _asset) external; function setAssetFtsos(IIFtso[] memory _assetFtsos) external; // current vote power block will update per reward epoch. // the FTSO doesn't have notion of reward epochs. // reward manager only can set this data. function setVotePowerBlock(uint256 _blockNumber) external; function initializeCurrentEpochStateForReveal(uint256 _circulatingSupplyNat, bool _fallbackMode) external; /** * @notice Returns ftso manager address */ function ftsoManager() external view returns (address); /** * @notice Returns the FTSO asset * @dev Asset is null in case of multi-asset FTSO */ function getAsset() external view returns (IIVPToken); /** * @notice Returns the Asset FTSOs * @dev AssetFtsos is not null only in case of multi-asset FTSO */ function getAssetFtsos() external view returns (IIFtso[] memory); /** * @notice Returns current configuration of epoch state * @return _maxVotePowerNatThresholdFraction High threshold for native token vote power per voter * @return _maxVotePowerAssetThresholdFraction High threshold for asset vote power per voter * @return _lowAssetUSDThreshold Threshold for low asset vote power * @return _highAssetUSDThreshold Threshold for high asset vote power * @return _highAssetTurnoutThresholdBIPS Threshold for high asset turnout * @return _lowNatTurnoutThresholdBIPS Threshold for low nat turnout * @return _elasticBandRewardBIPS Hybrid reward band, where _elasticBandRewardBIPS goes to the elastic band (prices within _elasticBandWidthPPM of the median) and 10000 - elasticBandRewardBIPS to the IQR * @return _elasticBandWidthPPM Prices within _elasticBandWidthPPM of median are rewarded * @return _trustedAddresses Trusted addresses - use their prices if low nat turnout is not achieved */ function epochsConfiguration() external view returns ( uint256 _maxVotePowerNatThresholdFraction, uint256 _maxVotePowerAssetThresholdFraction, uint256 _lowAssetUSDThreshold, uint256 _highAssetUSDThreshold, uint256 _highAssetTurnoutThresholdBIPS, uint256 _lowNatTurnoutThresholdBIPS, uint256 _elasticBandRewardBIPS, uint256 _elasticBandWidthPPM, address[] memory _trustedAddresses ); /** * @notice Returns parameters necessary for approximately replicating vote weighting. * @return _assets the list of Assets that are accounted in vote * @return _assetMultipliers weight of each asset in (multiasset) ftso, mutiplied by TERA * @return _totalVotePowerNat total native token vote power at block * @return _totalVotePowerAsset total combined asset vote power at block * @return _assetWeightRatio ratio of combined asset vp vs. native token vp (in BIPS) * @return _votePowerBlock vote powewr block for given epoch */ function getVoteWeightingParameters() external view returns ( IIVPToken[] memory _assets, uint256[] memory _assetMultipliers, uint256 _totalVotePowerNat, uint256 _totalVotePowerAsset, uint256 _assetWeightRatio, uint256 _votePowerBlock ); function wNat() external view returns (IIVPToken); }
@flarenetwork/flare-periphery-contracts/coston2/ftso/genesis/interface/IFtsoGenesis.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; interface IFtsoGenesis { /** * @notice Reveals submitted price during epoch reveal period - only price submitter * @param _voter Voter address * @param _epochId Id of the epoch in which the price hash was submitted * @param _price Submitted price in USD * @notice The hash of _price and _random must be equal to the submitted hash * @notice Emits PriceRevealed event */ function revealPriceSubmitter( address _voter, uint256 _epochId, uint256 _price, uint256 _wNatVP ) external; /** * @notice Get (and cache) wNat vote power for specified voter and given epoch id * @param _voter Voter address * @param _epochId Id of the epoch in which the price hash was submitted * @return wNat vote power */ function wNatVotePowerCached(address _voter, uint256 _epochId) external returns (uint256); }
@flarenetwork/flare-periphery-contracts/coston2/ftso/genesis/interface/IFtsoManagerGenesis.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; interface IFtsoManagerGenesis { function getCurrentPriceEpochId() external view returns (uint256 _priceEpochId); }
@flarenetwork/flare-periphery-contracts/coston2/ftso/genesis/interface/IFtsoRegistryGenesis.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; import "./IFtsoGenesis.sol"; interface IFtsoRegistryGenesis { function getFtsos(uint256[] memory _indices) external view returns(IFtsoGenesis[] memory _ftsos); }
@flarenetwork/flare-periphery-contracts/coston2/ftso/userInterfaces/IFtso.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; interface IFtso { enum PriceFinalizationType { // initial state NOT_FINALIZED, // median calculation used to find price WEIGHTED_MEDIAN, // low turnout - price calculated from median of trusted addresses TRUSTED_ADDRESSES, // low turnout + no votes from trusted addresses - price copied from previous epoch PREVIOUS_PRICE_COPIED, // price calculated from median of trusted addresses - triggered due to an exception TRUSTED_ADDRESSES_EXCEPTION, // previous price copied - triggered due to an exception PREVIOUS_PRICE_COPIED_EXCEPTION } event PriceRevealed( address indexed voter, uint256 indexed epochId, uint256 price, uint256 timestamp, uint256 votePowerNat, uint256 votePowerAsset ); event PriceFinalized( uint256 indexed epochId, uint256 price, bool rewardedFtso, uint256 lowIQRRewardPrice, uint256 highIQRRewardPrice, uint256 lowElasticBandRewardPrice, uint256 highElasticBandRewardPrice, PriceFinalizationType finalizationType, uint256 timestamp ); event PriceEpochInitializedOnFtso( uint256 indexed epochId, uint256 endTime, uint256 timestamp ); event LowTurnout( uint256 indexed epochId, uint256 natTurnout, uint256 lowNatTurnoutThresholdBIPS, uint256 timestamp ); /** * @notice Returns if FTSO is active */ function active() external view returns (bool); /** * @notice Returns the FTSO symbol */ function symbol() external view returns (string memory); /** * @notice Returns current epoch id */ function getCurrentEpochId() external view returns (uint256); /** * @notice Returns id of the epoch which was opened for price submission at the specified timestamp * @param _timestamp Timestamp as seconds from unix epoch */ function getEpochId(uint256 _timestamp) external view returns (uint256); /** * @notice Returns random number of the specified epoch * @param _epochId Id of the epoch */ function getRandom(uint256 _epochId) external view returns (uint256); /** * @notice Returns asset price consented in specific epoch * @param _epochId Id of the epoch * @return Price in USD multiplied by ASSET_PRICE_USD_DECIMALS */ function getEpochPrice(uint256 _epochId) external view returns (uint256); /** * @notice Returns current epoch data * @return _epochId Current epoch id * @return _epochSubmitEndTime End time of the current epoch price submission as seconds from unix epoch * @return _epochRevealEndTime End time of the current epoch price reveal as seconds from unix epoch * @return _votePowerBlock Vote power block for the current epoch * @return _fallbackMode Current epoch in fallback mode - only votes from trusted addresses will be used * @dev half-closed intervals - end time not included */ function getPriceEpochData() external view returns ( uint256 _epochId, uint256 _epochSubmitEndTime, uint256 _epochRevealEndTime, uint256 _votePowerBlock, bool _fallbackMode ); /** * @notice Returns current epoch data * @return _firstEpochStartTs First epoch start timestamp * @return _submitPeriodSeconds Submit period in seconds * @return _revealPeriodSeconds Reveal period in seconds */ function getPriceEpochConfiguration() external view returns ( uint256 _firstEpochStartTs, uint256 _submitPeriodSeconds, uint256 _revealPeriodSeconds ); /** * @notice Returns asset price submitted by voter in specific epoch * @param _epochId Id of the epoch * @param _voter Address of the voter * @return Price in USD multiplied by ASSET_PRICE_USD_DECIMALS */ function getEpochPriceForVoter(uint256 _epochId, address _voter) external view returns (uint256); /** * @notice Returns current asset price * @return _price Price in USD multiplied by ASSET_PRICE_USD_DECIMALS * @return _timestamp Time when price was updated for the last time */ function getCurrentPrice() external view returns (uint256 _price, uint256 _timestamp); /** * @notice Returns current asset price and number of decimals * @return _price Price in USD multiplied by ASSET_PRICE_USD_DECIMALS * @return _timestamp Time when price was updated for the last time * @return _assetPriceUsdDecimals Number of decimals used for USD price */ function getCurrentPriceWithDecimals() external view returns ( uint256 _price, uint256 _timestamp, uint256 _assetPriceUsdDecimals ); /** * @notice Returns current asset price calculated from trusted providers * @return _price Price in USD multiplied by ASSET_PRICE_USD_DECIMALS * @return _timestamp Time when price was updated for the last time */ function getCurrentPriceFromTrustedProviders() external view returns (uint256 _price, uint256 _timestamp); /** * @notice Returns current asset price calculated from trusted providers and number of decimals * @return _price Price in USD multiplied by ASSET_PRICE_USD_DECIMALS * @return _timestamp Time when price was updated for the last time * @return _assetPriceUsdDecimals Number of decimals used for USD price */ function getCurrentPriceWithDecimalsFromTrustedProviders() external view returns ( uint256 _price, uint256 _timestamp, uint256 _assetPriceUsdDecimals ); /** * @notice Returns current asset price details * @return _price Price in USD multiplied by ASSET_PRICE_USD_DECIMALS * @return _priceTimestamp Time when price was updated for the last time * @return _priceFinalizationType Finalization type when price was updated for the last time * @return _lastPriceEpochFinalizationTimestamp Time when last price epoch was finalized * @return _lastPriceEpochFinalizationType Finalization type of last finalized price epoch */ function getCurrentPriceDetails() external view returns ( uint256 _price, uint256 _priceTimestamp, PriceFinalizationType _priceFinalizationType, uint256 _lastPriceEpochFinalizationTimestamp, PriceFinalizationType _lastPriceEpochFinalizationType ); /** * @notice Returns current random number */ function getCurrentRandom() external view returns (uint256); }
@flarenetwork/flare-periphery-contracts/coston2/ftso/userInterfaces/IFtsoManager.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; import "../ftso/interface/IIFtso.sol"; import "../genesis/interface/IFtsoManagerGenesis.sol"; interface IFtsoManager is IFtsoManagerGenesis { event FtsoAdded(IIFtso ftso, bool add); event FallbackMode(bool fallbackMode); event FtsoFallbackMode(IIFtso ftso, bool fallbackMode); event RewardEpochFinalized(uint256 votepowerBlock, uint256 startBlock); event PriceEpochFinalized(address chosenFtso, uint256 rewardEpochId); event InitializingCurrentEpochStateForRevealFailed(IIFtso ftso, uint256 epochId); event FinalizingPriceEpochFailed(IIFtso ftso, uint256 epochId, IFtso.PriceFinalizationType failingType); event DistributingRewardsFailed(address ftso, uint256 epochId); event AccruingUnearnedRewardsFailed(uint256 epochId); event UseGoodRandomSet(bool useGoodRandom, uint256 maxWaitForGoodRandomSeconds); function active() external view returns (bool); function getCurrentRewardEpoch() external view returns (uint256); function getRewardEpochVotePowerBlock(uint256 _rewardEpoch) external view returns (uint256); function getRewardEpochToExpireNext() external view returns (uint256); function getCurrentPriceEpochData() external view returns ( uint256 _priceEpochId, uint256 _priceEpochStartTimestamp, uint256 _priceEpochEndTimestamp, uint256 _priceEpochRevealEndTimestamp, uint256 _currentTimestamp ); function getFtsos() external view returns (IIFtso[] memory _ftsos); function getPriceEpochConfiguration() external view returns ( uint256 _firstPriceEpochStartTs, uint256 _priceEpochDurationSeconds, uint256 _revealEpochDurationSeconds ); function getRewardEpochConfiguration() external view returns ( uint256 _firstRewardEpochStartTs, uint256 _rewardEpochDurationSeconds ); function getFallbackMode() external view returns ( bool _fallbackMode, IIFtso[] memory _ftsos, bool[] memory _ftsoInFallbackMode ); }
@flarenetwork/flare-periphery-contracts/coston2/ftso/userInterfaces/IFtsoRegistry.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; pragma abicoder v2; import "../ftso/interface/IIFtso.sol"; import "../genesis/interface/IFtsoRegistryGenesis.sol"; interface IFtsoRegistry is IFtsoRegistryGenesis { struct PriceInfo { uint256 ftsoIndex; uint256 price; uint256 decimals; uint256 timestamp; } function getFtso(uint256 _ftsoIndex) external view returns(IIFtso _activeFtsoAddress); function getFtsoBySymbol(string memory _symbol) external view returns(IIFtso _activeFtsoAddress); function getSupportedIndices() external view returns(uint256[] memory _supportedIndices); function getSupportedSymbols() external view returns(string[] memory _supportedSymbols); function getSupportedFtsos() external view returns(IIFtso[] memory _ftsos); function getFtsoIndex(string memory _symbol) external view returns (uint256 _assetIndex); function getFtsoSymbol(uint256 _ftsoIndex) external view returns (string memory _symbol); function getCurrentPrice(uint256 _ftsoIndex) external view returns(uint256 _price, uint256 _timestamp); function getCurrentPrice(string memory _symbol) external view returns(uint256 _price, uint256 _timestamp); function getCurrentPriceWithDecimals(uint256 _assetIndex) external view returns(uint256 _price, uint256 _timestamp, uint256 _assetPriceUsdDecimals); function getCurrentPriceWithDecimals(string memory _symbol) external view returns(uint256 _price, uint256 _timestamp, uint256 _assetPriceUsdDecimals); function getAllCurrentPrices() external view returns (PriceInfo[] memory); function getCurrentPricesByIndices(uint256[] memory _indices) external view returns (PriceInfo[] memory); function getCurrentPricesBySymbols(string[] memory _symbols) external view returns (PriceInfo[] memory); function getSupportedIndicesAndFtsos() external view returns(uint256[] memory _supportedIndices, IIFtso[] memory _ftsos); function getSupportedSymbolsAndFtsos() external view returns(string[] memory _supportedSymbols, IIFtso[] memory _ftsos); function getSupportedIndicesAndSymbols() external view returns(uint256[] memory _supportedIndices, string[] memory _supportedSymbols); function getSupportedIndicesSymbolsAndFtsos() external view returns(uint256[] memory _supportedIndices, string[] memory _supportedSymbols, IIFtso[] memory _ftsos); }
@flarenetwork/flare-periphery-contracts/coston2/ftso/userInterfaces/IFtsoRewardManager.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; interface IFtsoRewardManager { event RewardClaimed( address indexed dataProvider, address indexed whoClaimed, address indexed sentTo, uint256 rewardEpoch, uint256 amount ); event UnearnedRewardsAccrued( uint256 epochId, uint256 reward ); event RewardsDistributed( address indexed ftso, uint256 epochId, address[] addresses, uint256[] rewards ); event RewardClaimsEnabled( uint256 rewardEpochId ); event FeePercentageChanged( address indexed dataProvider, uint256 value, uint256 validFromEpoch ); event RewardClaimsExpired( uint256 rewardEpochId ); event FtsoRewardManagerActivated(address ftsoRewardManager); event FtsoRewardManagerDeactivated(address ftsoRewardManager); /** * @notice Allows a percentage delegator to claim rewards. * @notice This function is intended to be used to claim rewards in case of delegation by percentage. * @param _recipient address to transfer funds to * @param _rewardEpochs array of reward epoch numbers to claim for * @return _rewardAmount amount of total claimed rewards * @dev Reverts if `msg.sender` is delegating by amount * @dev Claims for all unclaimed reward epochs to the 'max(_rewardEpochs)'. * @dev Retained for backward compatibility. * @dev This function is deprecated - use `claim` instead. */ function claimReward( address payable _recipient, uint256[] calldata _rewardEpochs ) external returns (uint256 _rewardAmount); /** * @notice Allows the sender to claim or wrap rewards for reward owner. * @notice This function is intended to be used to claim rewards in case of delegation by percentage. * @notice The caller does not have to be the owner, but must be approved by the owner to claim on his behalf, * this approval is done by calling `setClaimExecutors`. * @notice It is actually safe for this to be called by anybody (nothing can be stolen), but by limiting who can * call, we allow the owner to control the timing of the calls. * @notice Reward owner can claim to any `_recipient`, while the executor can only claim to the reward owner, * reward owners's personal delegation account or one of the addresses set by `setAllowedClaimRecipients`. * @param _rewardOwner address of the reward owner * @param _recipient address to transfer funds to * @param _rewardEpoch last reward epoch to claim for * @param _wrap should reward be wrapped immediately * @return _rewardAmount amount of total claimed rewards * @dev Reverts if `msg.sender` is delegating by amount */ function claim( address _rewardOwner, address payable _recipient, uint256 _rewardEpoch, bool _wrap ) external returns (uint256 _rewardAmount); /** * @notice Allows the sender to claim rewards from specified data providers. * @notice This function is intended to be used to claim rewards in case of delegation by amount. * @param _recipient address to transfer funds to * @param _rewardEpochs array of reward epoch numbers to claim for * @param _dataProviders array of addresses representing data providers to claim the reward from * @return _rewardAmount amount of total claimed rewards * @dev Function can only be used for explicit delegations. * @dev This function is deprecated - use `claimFromDataProviders` instead. */ function claimRewardFromDataProviders( address payable _recipient, uint256[] calldata _rewardEpochs, address[] calldata _dataProviders ) external returns (uint256 _rewardAmount); /** * @notice Allows the sender to claim or wrap rewards for reward owner from specified data providers. * @notice This function is intended to be used to claim rewards in case of delegation by amount. * @notice The caller does not have to be the owner, but must be approved by the owner to claim on his behalf, * this approval is done by calling `setClaimExecutors`. * @notice It is actually safe for this to be called by anybody (nothing can be stolen), but by limiting who can * call, we allow the owner to control the timing of the calls. * @notice Reward owner can claim to any `_recipient`, while the executor can only claim to the reward owner, * reward owners's personal delegation account or one of the addresses set by `setAllowedClaimRecipients`. * @param _rewardOwner address of the reward owner * @param _recipient address to transfer funds to * @param _rewardEpochs array of reward epoch numbers to claim for * @param _dataProviders array of addresses representing data providers to claim the reward from * @param _wrap should reward be wrapped immediately * @return _rewardAmount amount of total claimed rewards * @dev Function can only be used for explicit delegations. */ function claimFromDataProviders( address _rewardOwner, address payable _recipient, uint256[] calldata _rewardEpochs, address[] calldata _dataProviders, bool _wrap ) external returns (uint256 _rewardAmount); /** * @notice Allows batch claiming for the list of '_rewardOwners' and for all unclaimed epochs <= '_rewardEpoch'. * @notice If reward owner has enabled delegation account, rewards are also claimed for that delegation account and * total claimed amount is sent to that delegation account, otherwise claimed amount is sent to owner's account. * @notice Claimed amount is automatically wrapped. * @notice Method can be used by reward owner or executor. If executor is registered with fee > 0, * then fee is paid to executor for each claimed address from the list. * @param _rewardOwners list of reward owners to claim for * @param _rewardEpoch last reward epoch to claim for */ function autoClaim(address[] calldata _rewardOwners, uint256 _rewardEpoch) external; /** * @notice Allows data provider to set (or update last) fee percentage. * @param _feePercentageBIPS number representing fee percentage in BIPS * @return _validFromEpoch reward epoch number when the setting becomes effective. */ function setDataProviderFeePercentage(uint256 _feePercentageBIPS) external returns (uint256 _validFromEpoch); /** * @notice Allows reward claiming */ function active() external view returns (bool); /** * @notice Returns the current fee percentage of `_dataProvider` * @param _dataProvider address representing data provider */ function getDataProviderCurrentFeePercentage(address _dataProvider) external view returns (uint256 _feePercentageBIPS); /** * @notice Returns the fee percentage of `_dataProvider` at `_rewardEpoch` * @param _dataProvider address representing data provider * @param _rewardEpoch reward epoch number */ function getDataProviderFeePercentage( address _dataProvider, uint256 _rewardEpoch ) external view returns (uint256 _feePercentageBIPS); /** * @notice Returns the scheduled fee percentage changes of `_dataProvider` * @param _dataProvider address representing data provider * @return _feePercentageBIPS positional array of fee percentages in BIPS * @return _validFromEpoch positional array of block numbers the fee settings are effective from * @return _fixed positional array of boolean values indicating if settings are subjected to change */ function getDataProviderScheduledFeePercentageChanges(address _dataProvider) external view returns ( uint256[] memory _feePercentageBIPS, uint256[] memory _validFromEpoch, bool[] memory _fixed ); /** * @notice Returns information on epoch reward * @param _rewardEpoch reward epoch number * @return _totalReward number representing the total epoch reward * @return _claimedReward number representing the amount of total epoch reward that has been claimed */ function getEpochReward(uint256 _rewardEpoch) external view returns (uint256 _totalReward, uint256 _claimedReward); /** * @notice Returns the state of rewards for `_beneficiary` at `_rewardEpoch` * @param _beneficiary address of reward beneficiary * @param _rewardEpoch reward epoch number * @return _dataProviders positional array of addresses representing data providers * @return _rewardAmounts positional array of reward amounts * @return _claimed positional array of boolean values indicating if reward is claimed * @return _claimable boolean value indicating if rewards are claimable * @dev Reverts when queried with `_beneficiary` delegating by amount */ function getStateOfRewards( address _beneficiary, uint256 _rewardEpoch ) external view returns ( address[] memory _dataProviders, uint256[] memory _rewardAmounts, bool[] memory _claimed, bool _claimable ); /** * @notice Returns the state of rewards for `_beneficiary` at `_rewardEpoch` from `_dataProviders` * @param _beneficiary address of reward beneficiary * @param _rewardEpoch reward epoch number * @param _dataProviders positional array of addresses representing data providers * @return _rewardAmounts positional array of reward amounts * @return _claimed positional array of boolean values indicating if reward is claimed * @return _claimable boolean value indicating if rewards are claimable */ function getStateOfRewardsFromDataProviders( address _beneficiary, uint256 _rewardEpoch, address[] calldata _dataProviders ) external view returns ( uint256[] memory _rewardAmounts, bool[] memory _claimed, bool _claimable ); /** * @notice Returns the start and the end of the reward epoch range for which the reward is claimable * @param _startEpochId the oldest epoch id that allows reward claiming * @param _endEpochId the newest epoch id that allows reward claiming */ function getEpochsWithClaimableRewards() external view returns ( uint256 _startEpochId, uint256 _endEpochId ); /** * @notice Returns the next claimable reward epoch for '_rewardOwner'. * @param _rewardOwner address of the reward owner */ function nextClaimableRewardEpoch(address _rewardOwner) external view returns (uint256); /** * @notice Returns the array of claimable epoch ids for which the reward has not yet been claimed * @param _beneficiary address of reward beneficiary * @return _epochIds array of epoch ids * @dev Reverts when queried with `_beneficiary` delegating by amount */ function getEpochsWithUnclaimedRewards(address _beneficiary) external view returns ( uint256[] memory _epochIds ); /** * @notice Returns the information on claimed reward of `_dataProvider` for `_rewardEpoch` by `_claimer` * @param _rewardEpoch reward epoch number * @param _dataProvider address representing the data provider * @param _claimer address representing the claimer * @return _claimed boolean indicating if reward has been claimed * @return _amount number representing the claimed amount */ function getClaimedReward( uint256 _rewardEpoch, address _dataProvider, address _claimer ) external view returns ( bool _claimed, uint256 _amount ); /** * @notice Return reward epoch that will expire, when new reward epoch will start * @return Reward epoch id that will expire next */ function getRewardEpochToExpireNext() external view returns (uint256); /** * @notice Return reward epoch vote power block * @param _rewardEpoch reward epoch number */ function getRewardEpochVotePowerBlock(uint256 _rewardEpoch) external view returns (uint256); /** * @notice Return current reward epoch number */ function getCurrentRewardEpoch() external view returns (uint256); /** * @notice Return initial reward epoch number */ function getInitialRewardEpoch() external view returns (uint256); /** * @notice Returns the information on rewards and initial vote power of `_dataProvider` for `_rewardEpoch` * @param _rewardEpoch reward epoch number * @param _dataProvider address representing the data provider * @return _rewardAmount number representing the amount of rewards * @return _votePowerIgnoringRevocation number representing the vote power ignoring revocations */ function getDataProviderPerformanceInfo( uint256 _rewardEpoch, address _dataProvider ) external view returns ( uint256 _rewardAmount, uint256 _votePowerIgnoringRevocation ); }
@flarenetwork/flare-periphery-contracts/coston2/ftso/userInterfaces/IPriceSubmitter.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; import "../genesis/interface/IFtsoGenesis.sol"; import "../genesis/interface/IFtsoRegistryGenesis.sol"; import "../genesis/interface/IFtsoManagerGenesis.sol"; interface IPriceSubmitter { /** * Event emitted when hash was submitted through PriceSubmitter. * @param submitter the address of the sender * @param epochId current price epoch id * @param hash the submitted hash * @param timestamp current block timestamp */ event HashSubmitted( address indexed submitter, uint256 indexed epochId, bytes32 hash, uint256 timestamp ); /** * Event emitted when prices were revealed through PriceSubmitter. * @param voter the address of the sender * @param epochId id of the epoch in which the price hash was submitted * @param ftsos array of ftsos that correspond to the indexes in the call * @param prices the submitted prices * @param timestamp current block timestamp */ event PricesRevealed( address indexed voter, uint256 indexed epochId, IFtsoGenesis[] ftsos, uint256[] prices, uint256 random, uint256 timestamp ); /** * @notice Submits hash for current epoch * @param _epochId Target epoch id to which hash is submitted * @param _hash Hash of ftso indices, prices, random number and voter address * @notice Emits HashSubmitted event */ function submitHash( uint256 _epochId, bytes32 _hash ) external; /** * @notice Reveals submitted prices during epoch reveal period * @param _epochId Id of the epoch in which the price hashes was submitted * @param _ftsoIndices List of increasing ftso indices * @param _prices List of submitted prices in USD * @param _random Submitted random number * @notice The hash of ftso indices, prices, random number and voter address must be equal to the submitted hash * @notice Emits PricesRevealed event */ function revealPrices( uint256 _epochId, uint256[] memory _ftsoIndices, uint256[] memory _prices, uint256 _random ) external; /** * Returns bitmap of all ftso's for which `_voter` is allowed to submit prices/hashes. * If voter is allowed to vote for ftso at index (see *_FTSO_INDEX), the corrsponding * bit in the result will be 1. */ function voterWhitelistBitmap(address _voter) external view returns (uint256); function getVoterWhitelister() external view returns (address); function getFtsoRegistry() external view returns (IFtsoRegistryGenesis); function getFtsoManager() external view returns (IFtsoManagerGenesis); /** * @notice Returns current random number */ function getCurrentRandom() external view returns (uint256); /** * @notice Returns random number of the specified epoch * @param _epochId Id of the epoch */ function getRandom(uint256 _epochId) external view returns (uint256); }
@flarenetwork/flare-periphery-contracts/coston2/ftso/userInterfaces/IVoterWhitelister.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; interface IVoterWhitelister { /** * Raised when an account is removed from the voter whitelist. */ event VoterWhitelisted(address voter, uint256 ftsoIndex); /** * Raised when an account is removed from the voter whitelist. */ event VoterRemovedFromWhitelist(address voter, uint256 ftsoIndex); /** * Raised when an account is chilled from the voter whitelist. */ event VoterChilled(address voter, uint256 untilRewardEpoch); /** * Request to whitelist `_voter` account to ftso at `_ftsoIndex`. Will revert if vote power too low. * May be called by any address. */ function requestWhitelistingVoter(address _voter, uint256 _ftsoIndex) external; /** * Request to whitelist `_voter` account to all active ftsos. * May be called by any address. * It returns an array of supported ftso indices and success flag per index. */ function requestFullVoterWhitelisting( address _voter ) external returns ( uint256[] memory _supportedIndices, bool[] memory _success ); /** * Maximum number of voters in the whitelist for a new FTSO. */ function defaultMaxVotersForFtso() external view returns (uint256); /** * Maximum number of voters in the whitelist for FTSO at index `_ftsoIndex`. */ function maxVotersForFtso(uint256 _ftsoIndex) external view returns (uint256); /** * Get whitelisted price providers for ftso with `_symbol` */ function getFtsoWhitelistedPriceProvidersBySymbol(string memory _symbol) external view returns (address[] memory); /** * Get whitelisted price providers for ftso at `_ftsoIndex` */ function getFtsoWhitelistedPriceProviders(uint256 _ftsoIndex) external view returns (address[] memory); /** * In case of providing bad prices (e.g. collusion), the voter can be chilled for a few reward epochs. * A voter can whitelist again from a returned reward epoch onwards. */ function chilledUntilRewardEpoch(address _voter) external view returns (uint256); }
@flarenetwork/flare-periphery-contracts/coston2/governance/userInterfaces/IGovernanceVotePower.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; /** * Interface for contracts delegating their governance vote power. */ interface IGovernanceVotePower { /** * Delegates all governance vote power of `msg.sender` to address `_to`. * @param _to The address of the recipient. */ function delegate(address _to) external; /** * Undelegates all governance vote power of `msg.sender`. */ function undelegate() external; /** * Gets the governance vote power of an address at a given block number, including * all delegations made to it. * @param _who The address being queried. * @param _blockNumber The block number at which to fetch the vote power. * @return Governance vote power of `_who` at `_blockNumber`. */ function votePowerOfAt(address _who, uint256 _blockNumber) external view returns(uint256); /** * Gets the governance vote power of an address at the latest block, including * all delegations made to it. * @param _who The address being queried. * @return Governance vote power of `account` at the lastest block. */ function getVotes(address _who) external view returns (uint256); /** * Gets the address an account is delegating its governance vote power to, at a given block number. * @param _who The address being queried. * @param _blockNumber The block number at which to fetch the address. * @return Address where `_who` was delegating its governance vote power at block `_blockNumber`. */ function getDelegateOfAt(address _who, uint256 _blockNumber) external view returns (address); /** * Gets the address an account is delegating its governance vote power to, at the latest block number. * @param _who The address being queried. * @return Address where `_who` is currently delegating its governance vote power. */ function getDelegateOfAtNow(address _who) external view returns (address); }
@flarenetwork/flare-periphery-contracts/coston2/stateConnector/interface/IStateConnector.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; // solhint-disable func-name-mixedcase interface IStateConnector { event AttestationRequest( address sender, uint256 timestamp, bytes data ); event RoundFinalised( uint256 indexed roundId, bytes32 merkleRoot ); /** * The method to call for requesting a new attestation. * Emits event `AttestationRequest`, which triggers work by attestation providers. */ function requestAttestations(bytes calldata _data) external; /** * Last finalized round id. */ function lastFinalizedRoundId() external view returns (uint256 _roundId); /** * Get Merkle root for the round and check for buffer overflows. */ function merkleRoot(uint256 _roundId) external view returns (bytes32); /** * The first buffer timestamp * (start time in seconds for converting the timestamp into a round number). */ function BUFFER_TIMESTAMP_OFFSET() external view returns (uint256); /** * Amount of time a buffer is active before cycling to the next one * (round length in seconds for converting the timestamp into a round number). */ function BUFFER_WINDOW() external view returns (uint256); }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/ContractRegistryLibrary.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import {IFlareContractRegistry} from "./userInterfaces/IFlareContractRegistry.sol"; // Auto generated imports // AUTO GENERATED - DO NOT EDIT BELOW THIS LINE import {IStateConnector} from "../stateConnector/interface/IStateConnector.sol"; import {IPriceSubmitter} from "../ftso/userInterfaces/IPriceSubmitter.sol"; import {IFtsoRewardManager} from "../ftso/userInterfaces/IFtsoRewardManager.sol"; import {IFtsoRegistry} from "../ftso/userInterfaces/IFtsoRegistry.sol"; import {IVoterWhitelister} from "../ftso/userInterfaces/IVoterWhitelister.sol"; import {IDistributionToDelegators} from "../distribution/userInterfaces/IDistributionToDelegators.sol"; import {IFtsoManager} from "../ftso/userInterfaces/IFtsoManager.sol"; import {IWNat} from "../util-contracts/token/userInterfaces/IWNat.sol"; import {IGenericRewardManager} from "../util-contracts/tokenPools/userInterfaces/IGenericRewardManager.sol"; // END AUTO GENERATED - DO NOT EDIT ABOVE THIS LINE // Library is intended to be used inline, so the strings are all memory allocated (instead of calldata) library FlareContractsRegistryLibrary { address internal constant FLARE_CONTRACT_REGISTRY_ADDRESS = 0xaD67FE66660Fb8dFE9d6b1b4240d8650e30F6019; IFlareContractRegistry internal constant FLARE_CONTRACT_REGISTRY = IFlareContractRegistry(FLARE_CONTRACT_REGISTRY_ADDRESS); /** * @notice Returns contract address for the given name - might be address(0) * @param _name name of the contract */ function getContractAddressByName( string memory _name ) internal view returns (address) { return FLARE_CONTRACT_REGISTRY.getContractAddressByName(_name); } /** * @notice Returns contract address for the given name hash - might be address(0) * @param _nameHash hash of the contract name (keccak256(abi.encode(name)) */ function getContractAddressByHash( bytes32 _nameHash ) internal view returns (address) { return FLARE_CONTRACT_REGISTRY.getContractAddressByHash(_nameHash); } /** * @notice Returns contract addresses for the given names - might be address(0) * @param _names names of the contracts */ function getContractAddressesByName( string[] memory _names ) internal view returns (address[] memory) { return FLARE_CONTRACT_REGISTRY.getContractAddressesByName(_names); } /** * @notice Returns contract addresses for the given name hashes - might be address(0) * @param _nameHashes hashes of the contract names (keccak256(abi.encode(name)) */ function getContractAddressesByHash( bytes32[] memory _nameHashes ) internal view returns (address[] memory) { return FLARE_CONTRACT_REGISTRY.getContractAddressesByHash(_nameHashes); } /** * @notice Returns all contract names and corresponding addresses */ function getAllContracts() internal view returns (string[] memory _names, address[] memory _addresses) { return FLARE_CONTRACT_REGISTRY.getAllContracts(); } // Nice typed getters for all the important contracts // AUTO GENERATED - DO NOT EDIT BELOW THIS LINE function getStateConnector() internal view returns (IStateConnector) { return IStateConnector( FLARE_CONTRACT_REGISTRY.getContractAddressByName( "StateConnector" ) ); } function getPriceSubmitter() internal view returns (IPriceSubmitter) { return IPriceSubmitter( FLARE_CONTRACT_REGISTRY.getContractAddressByName( "PriceSubmitter" ) ); } function getFtsoRewardManager() internal view returns (IFtsoRewardManager) { return IFtsoRewardManager( FLARE_CONTRACT_REGISTRY.getContractAddressByName( "FtsoRewardManager" ) ); } function getFtsoRegistry() internal view returns (IFtsoRegistry) { return IFtsoRegistry( FLARE_CONTRACT_REGISTRY.getContractAddressByName("FtsoRegistry") ); } function getVoterWhitelister() internal view returns (IVoterWhitelister) { return IVoterWhitelister( FLARE_CONTRACT_REGISTRY.getContractAddressByName( "VoterWhitelister" ) ); } function getDistributionToDelegators() internal view returns (IDistributionToDelegators) { return IDistributionToDelegators( FLARE_CONTRACT_REGISTRY.getContractAddressByName( "DistributionToDelegators" ) ); } function getFtsoManager() internal view returns (IFtsoManager) { return IFtsoManager( FLARE_CONTRACT_REGISTRY.getContractAddressByName("FtsoManager") ); } function getWNat() internal view returns (IWNat) { return IWNat(FLARE_CONTRACT_REGISTRY.getContractAddressByName("WNat")); } function getValidatorRewardManager() internal view returns (IGenericRewardManager) { return IGenericRewardManager( FLARE_CONTRACT_REGISTRY.getContractAddressByName( "ValidatorRewardManager" ) ); } // END AUTO GENERATED - DO NOT EDIT ABOVE THIS LINE }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/infrastructure/userInterfaces/IPChainStakeMirror.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; pragma abicoder v2; import "./IPChainVotePower.sol"; import "./IPChainStakeMirrorVerifier.sol"; /** * Interface for the `PChainStakeMirror` contract. */ interface IPChainStakeMirror is IPChainVotePower { /** * Event emitted when max updates per block is set. * @param maxUpdatesPerBlock new number of max updated per block */ event MaxUpdatesPerBlockSet(uint256 maxUpdatesPerBlock); /** * Event emitted when the stake is confirmed. * @param owner The address who opened the stake. * @param nodeId Node id to which the stake was added. * @param txHash Unique tx hash - keccak256(abi.encode(PChainStake.txId, PChainStake.inputAddress)); * @param amountWei Stake amount (in wei). * @param pChainTxId P-chain transaction id. */ event StakeConfirmed( address indexed owner, bytes20 indexed nodeId, bytes32 indexed txHash, uint256 amountWei, bytes32 pChainTxId ); /** * Event emitted when the stake has ended. * @param owner The address whose stake has ended. * @param nodeId Node id from which the stake was removed. * @param txHash Unique tx hash - keccak256(abi.encode(PChainStake.txId, PChainStake.inputAddress)); * @param amountWei Stake amount (in wei). */ event StakeEnded( address indexed owner, bytes20 indexed nodeId, bytes32 indexed txHash, uint256 amountWei ); /** * Event emitted when the stake was revoked. * @param owner The address whose stake has ended. * @param nodeId Node id from which the stake was removed. * @param txHash Unique tx hash - keccak256(abi.encode(PChainStake.txId, PChainStake.inputAddress)); * @param amountWei Stake amount (in wei). */ event StakeRevoked( address indexed owner, bytes20 indexed nodeId, bytes32 indexed txHash, uint256 amountWei ); /** * Method for P-chain stake mirroring using `PChainStake` data and Merkle proof. * @param _stakeData Information about P-chain stake. * @param _merkleProof Merkle proof that should be used to prove the P-chain stake. */ function mirrorStake( IPChainStakeMirrorVerifier.PChainStake calldata _stakeData, bytes32[] calldata _merkleProof ) external; /** * Method for checking if active stake (stake start time <= block.timestamp < stake end time) was already mirrored. * @param _txId P-chain stake transaction id. * @param _inputAddress P-chain address that opened stake. * @return True if stake is active and mirrored. */ function isActiveStakeMirrored(bytes32 _txId, bytes20 _inputAddress) external view returns(bool); /** * Total amount of tokens at current block. * @return The current total amount of tokens. **/ function totalSupply() external view returns (uint256); /** * Total amount of tokens at a specific `_blockNumber`. * @param _blockNumber The block number when the totalSupply is queried. * @return The total amount of tokens at `_blockNumber`. **/ function totalSupplyAt(uint _blockNumber) external view returns(uint256); /** * Queries the token balance of `_owner` at current block. * @param _owner The address from which the balance will be retrieved. * @return The current balance. **/ function balanceOf(address _owner) external view returns (uint256); /** * Queries the token balance of `_owner` at a specific `_blockNumber`. * @param _owner The address from which the balance will be retrieved. * @param _blockNumber The block number when the balance is queried. * @return The balance at `_blockNumber`. **/ function balanceOfAt(address _owner, uint _blockNumber) external view returns (uint256); }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/infrastructure/userInterfaces/IPChainStakeMirrorVerifier.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; pragma abicoder v2; /** * Interface with structure for P-chain stake mirror verifications. */ interface IPChainStakeMirrorVerifier { /** * Structure describing the P-chain stake. */ struct PChainStake { // Hash of the transaction on the underlying chain. bytes32 txId; // Type of the staking/delegation transaction: '0' for 'ADD_VALIDATOR_TX' and '1' for 'ADD_DELEGATOR_TX'. uint8 stakingType; // Input address that triggered the staking or delegation transaction. // See https://support.avax.network/en/articles/4596397-what-is-an-address for address definition for P-chain. bytes20 inputAddress; // NodeID to which staking or delegation is done. // For definitions, see https://github.com/ava-labs/avalanchego/blob/master/ids/node_id.go. bytes20 nodeId; // Start time of the staking/delegation in seconds (Unix epoch). uint64 startTime; // End time of the staking/delegation in seconds (Unix epoch). uint64 endTime; // Staked or delegated amount in Gwei (nano FLR). uint64 weight; } }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/infrastructure/userInterfaces/IPChainVotePower.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; /** * Interface for the vote power part of the `PChainStakeMirror` contract. */ interface IPChainVotePower { /** * Event triggered when a stake is confirmed or at the time it ends. * Definition: `votePowerFromTo(owner, nodeId)` is `changed` from `priorVotePower` to `newVotePower`. * @param owner The account that has changed the amount of vote power it is staking. * @param nodeId The node id whose received vote power has changed. * @param priorVotePower The vote power originally on that node id. * @param newVotePower The new vote power that triggered this event. */ event VotePowerChanged( address indexed owner, bytes20 indexed nodeId, uint256 priorVotePower, uint256 newVotePower ); /** * Emitted when a vote power cache entry is created. * Allows history cleaners to track vote power cache cleanup opportunities off-chain. * @param nodeId The node id whose vote power has just been cached. * @param blockNumber The block number at which the vote power has been cached. */ event VotePowerCacheCreated(bytes20 nodeId, uint256 blockNumber); /** * Get the vote power of `_owner` at block `_blockNumber` using cache. * It tries to read the cached value and if not found, reads the actual value and stores it in cache. * Can only be used if _blockNumber is in the past, otherwise reverts. * @param _owner The node id to get voting power. * @param _blockNumber The block number at which to fetch. * @return Vote power of `_owner` at `_blockNumber`. */ function votePowerOfAtCached(bytes20 _owner, uint256 _blockNumber) external returns(uint256); /** * Get the total vote power at block `_blockNumber` using cache. * It tries to read the cached value and if not found, reads the actual value and stores it in cache. * Can only be used if `_blockNumber` is in the past, otherwise reverts. * @param _blockNumber The block number at which to fetch. * @return The total vote power at the block (sum of all accounts' vote powers). */ function totalVotePowerAtCached(uint256 _blockNumber) external returns(uint256); /** * Get the current total vote power. * @return The current total vote power (sum of all accounts' vote powers). */ function totalVotePower() external view returns(uint256); /** * Get the total vote power at block `_blockNumber` * @param _blockNumber The block number at which to fetch. * @return The total vote power at the block (sum of all accounts' vote powers). */ function totalVotePowerAt(uint _blockNumber) external view returns(uint256); /** * Get the amounts and node ids being staked to by a vote power owner. * @param _owner The address being queried. * @return _nodeIds Array of node ids. * @return _amounts Array of staked amounts, for each node id. */ function stakesOf(address _owner) external view returns ( bytes20[] memory _nodeIds, uint256[] memory _amounts ); /** * Get the amounts and node ids being staked to by a vote power owner, * at a given block. * @param _owner The address being queried. * @param _blockNumber The block number being queried. * @return _nodeIds Array of node ids. * @return _amounts Array of staked amounts, for each node id. */ function stakesOfAt( address _owner, uint256 _blockNumber ) external view returns ( bytes20[] memory _nodeIds, uint256[] memory _amounts ); /** * Get the current vote power of `_nodeId`. * @param _nodeId The node id to get voting power. * @return Current vote power of `_nodeId`. */ function votePowerOf(bytes20 _nodeId) external view returns(uint256); /** * Get the vote power of `_nodeId` at block `_blockNumber` * @param _nodeId The node id to get voting power. * @param _blockNumber The block number at which to fetch. * @return Vote power of `_nodeId` at `_blockNumber`. */ function votePowerOfAt(bytes20 _nodeId, uint256 _blockNumber) external view returns(uint256); /** * Get current staked vote power from `_owner` staked to `_nodeId`. * @param _owner Address of vote power owner. * @param _nodeId Node id. * @return The staked vote power. */ function votePowerFromTo(address _owner, bytes20 _nodeId) external view returns(uint256); /** * Get current staked vote power from `_owner` staked to `_nodeId` at `_blockNumber`. * @param _owner Address of vote power owner. * @param _nodeId Node id. * @param _blockNumber The block number at which to fetch. * @return The staked vote power. */ function votePowerFromToAt(address _owner, bytes20 _nodeId, uint _blockNumber) external view returns(uint256); /** * Return vote powers for several node ids in a batch. * @param _nodeIds The list of node ids to fetch vote power of. * @param _blockNumber The block number at which to fetch. * @return A list of vote powers. */ function batchVotePowerOfAt( bytes20[] memory _nodeIds, uint256 _blockNumber ) external view returns(uint256[] memory); }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/token/token/interface/IICleanable.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; interface IICleanable { /** * Set the contract that is allowed to call history cleaning methods. */ function setCleanerContract(address _cleanerContract) external; /** * Set the cleanup block number. * Historic data for the blocks before `cleanupBlockNumber` can be erased, * history before that block should never be used since it can be inconsistent. * In particular, cleanup block number must be before current vote power block. * @param _blockNumber The new cleanup block number. */ function setCleanupBlockNumber(uint256 _blockNumber) external; /** * Get the current cleanup block number. */ function cleanupBlockNumber() external view returns (uint256); }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/token/token/interface/IIGovernanceVotePower.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; import "../../userInterfaces/IVPToken.sol"; import "../../../infrastructure/userInterfaces/IPChainStakeMirror.sol"; import "../../../../governance/userInterfaces/IGovernanceVotePower.sol"; /** * Internal interface for contracts delegating their governance vote power. */ interface IIGovernanceVotePower is IGovernanceVotePower { /** * Emitted when a delegate's vote power changes, as a result of a new delegation * or a token transfer, for example. * * The event is always emitted from a `GovernanceVotePower` contract. * @param delegate The account receiving the changing delegated vote power. * @param previousBalance Delegated vote power before the change. * @param newBalance Delegated vote power after the change. */ event DelegateVotesChanged( address indexed delegate, uint256 previousBalance, uint256 newBalance ); /** * Emitted when an account starts delegating vote power or switches its delegation * to another address. * * The event is always emitted from a `GovernanceVotePower` contract. * @param delegator Account delegating its vote power. * @param fromDelegate Account receiving the delegation before the change. * Can be address(0) if there was no previous delegation. * @param toDelegate Account receiving the delegation after the change. * Can be address(0) if `delegator` just undelegated all its vote power. */ event DelegateChanged( address indexed delegator, address indexed fromDelegate, address indexed toDelegate ); /** * Update governance vote power of all involved delegates after tokens are transferred. * * This function **MUST** be called after each governance token transfer for the * delegates to reflect the correct balance. * @param _from Source address of the transfer. * @param _to Destination address of the transfer. * @param _fromBalance _Ignored._ * @param _toBalance _Ignored._ * @param _amount Amount being transferred. */ function updateAtTokenTransfer( address _from, address _to, uint256 _fromBalance, uint256 _toBalance, uint256 _amount ) external; /** * Set the cleanup block number. * Historic data for the blocks before `cleanupBlockNumber` can be erased. * History before that block should never be used since it can be inconsistent. * In particular, cleanup block number must be lower than the current vote power block. * @param _blockNumber The new cleanup block number. */ function setCleanupBlockNumber(uint256 _blockNumber) external; /** * Set the contract that is allowed to call history cleaning methods. * @param _cleanerContract Address of the cleanup contract. * Usually this will be an instance of `CleanupBlockNumberManager`. */ function setCleanerContract(address _cleanerContract) external; /** * Get the token that this governance vote power contract belongs to. * @return The IVPToken interface owning this contract. */ function ownerToken() external view returns (IVPToken); /** * Get the stake mirror contract that this governance vote power contract belongs to. * @return The IPChainStakeMirror interface owning this contract. */ function pChainStakeMirror() external view returns (IPChainStakeMirror); /** * Get the current cleanup block number set with `setCleanupBlockNumber()`. * @return The currently set cleanup block number. */ function getCleanupBlockNumber() external view returns(uint256); }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/token/token/interface/IIVPContract.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; import "../../userInterfaces/IVPToken.sol"; import "../../userInterfaces/IVPContractEvents.sol"; import "./IICleanable.sol"; interface IIVPContract is IICleanable, IVPContractEvents { /** * Update vote powers when tokens are transfered. * Also update delegated vote powers for percentage delegation * and check for enough funds for explicit delegations. **/ function updateAtTokenTransfer( address _from, address _to, uint256 _fromBalance, uint256 _toBalance, uint256 _amount ) external; /** * @notice Delegate `_bips` percentage of voting power to `_to` from `_from` * @param _from The address of the delegator * @param _to The address of the recipient * @param _balance The delegator's current balance * @param _bips The percentage of voting power to be delegated expressed in basis points (1/100 of one percent). * Not cumulative - every call resets the delegation value (and value of 0 revokes delegation). **/ function delegate( address _from, address _to, uint256 _balance, uint256 _bips ) external; /** * @notice Explicitly delegate `_amount` of voting power to `_to` from `msg.sender`. * @param _from The address of the delegator * @param _to The address of the recipient * @param _balance The delegator's current balance * @param _amount An explicit vote power amount to be delegated. * Not cumulative - every call resets the delegation value (and value of 0 undelegates `to`). **/ function delegateExplicit( address _from, address _to, uint256 _balance, uint _amount ) external; /** * @notice Revoke all delegation from sender to `_who` at given block. * Only affects the reads via `votePowerOfAtCached()` in the block `_blockNumber`. * Block `_blockNumber` must be in the past. * This method should be used only to prevent rogue delegate voting in the current voting block. * To stop delegating use delegate/delegateExplicit with value of 0 or undelegateAll/undelegateAllExplicit. * @param _from The address of the delegator * @param _who Address of the delegatee * @param _balance The delegator's current balance * @param _blockNumber The block number at which to revoke delegation. **/ function revokeDelegationAt( address _from, address _who, uint256 _balance, uint _blockNumber ) external; /** * @notice Undelegate all voting power for delegates of `msg.sender` * Can only be used with percentage delegation. * Does not reset delegation mode back to NOTSET. * @param _from The address of the delegator **/ function undelegateAll( address _from, uint256 _balance ) external; /** * @notice Undelegate all explicit vote power by amount delegates for `msg.sender`. * Can only be used with explicit delegation. * Does not reset delegation mode back to NOTSET. * @param _from The address of the delegator * @param _delegateAddresses Explicit delegation does not store delegatees' addresses, * so the caller must supply them. * @return The amount still delegated (in case the list of delegates was incomplete). */ function undelegateAllExplicit( address _from, address[] memory _delegateAddresses ) external returns (uint256); /** * @notice Get the vote power of `_who` at block `_blockNumber` * Reads/updates cache and upholds revocations. * @param _who The address to get voting power. * @param _blockNumber The block number at which to fetch. * @return Vote power of `_who` at `_blockNumber`. */ function votePowerOfAtCached(address _who, uint256 _blockNumber) external returns(uint256); /** * @notice Get the current vote power of `_who`. * @param _who The address to get voting power. * @return Current vote power of `_who`. */ function votePowerOf(address _who) external view returns(uint256); /** * @notice Get the vote power of `_who` at block `_blockNumber` * @param _who The address to get voting power. * @param _blockNumber The block number at which to fetch. * @return Vote power of `_who` at `_blockNumber`. */ function votePowerOfAt(address _who, uint256 _blockNumber) external view returns(uint256); /** * @notice Get the vote power of `_who` at block `_blockNumber`, ignoring revocation information (and cache). * @param _who The address to get voting power. * @param _blockNumber The block number at which to fetch. * @return Vote power of `_who` at `_blockNumber`. Result doesn't change if vote power is revoked. */ function votePowerOfAtIgnoringRevocation(address _who, uint256 _blockNumber) external view returns(uint256); /** * Return vote powers for several addresses in a batch. * @param _owners The list of addresses to fetch vote power of. * @param _blockNumber The block number at which to fetch. * @return A list of vote powers. */ function batchVotePowerOfAt( address[] memory _owners, uint256 _blockNumber ) external view returns(uint256[] memory); /** * @notice Get current delegated vote power `_from` delegator delegated `_to` delegatee. * @param _from Address of delegator * @param _to Address of delegatee * @param _balance The delegator's current balance * @return The delegated vote power. */ function votePowerFromTo( address _from, address _to, uint256 _balance ) external view returns(uint256); /** * @notice Get delegated the vote power `_from` delegator delegated `_to` delegatee at `_blockNumber`. * @param _from Address of delegator * @param _to Address of delegatee * @param _balance The delegator's current balance * @param _blockNumber The block number at which to fetch. * @return The delegated vote power. */ function votePowerFromToAt( address _from, address _to, uint256 _balance, uint _blockNumber ) external view returns(uint256); /** * @notice Compute the current undelegated vote power of `_owner` * @param _owner The address to get undelegated voting power. * @param _balance Owner's current balance * @return The unallocated vote power of `_owner` */ function undelegatedVotePowerOf( address _owner, uint256 _balance ) external view returns(uint256); /** * @notice Get the undelegated vote power of `_owner` at given block. * @param _owner The address to get undelegated voting power. * @param _blockNumber The block number at which to fetch. * @return The undelegated vote power of `_owner` (= owner's own balance minus all delegations from owner) */ function undelegatedVotePowerOfAt( address _owner, uint256 _balance, uint256 _blockNumber ) external view returns(uint256); /** * @notice Get the delegation mode for '_who'. This mode determines whether vote power is * allocated by percentage or by explicit value. * @param _who The address to get delegation mode. * @return Delegation mode (NOTSET=0, PERCENTAGE=1, AMOUNT=2)) */ function delegationModeOf(address _who) external view returns (uint256); /** * @notice Get the vote power delegation `_delegateAddresses` * and `pcts` of an `_owner`. Returned in two separate positional arrays. * @param _owner The address to get delegations. * @return _delegateAddresses Positional array of delegation addresses. * @return _bips Positional array of delegation percents specified in basis points (1/100 or 1 percent) * @return _count The number of delegates. * @return _delegationMode The mode of the delegation (NOTSET=0, PERCENTAGE=1, AMOUNT=2). */ function delegatesOf( address _owner ) external view returns ( address[] memory _delegateAddresses, uint256[] memory _bips, uint256 _count, uint256 _delegationMode ); /** * @notice Get the vote power delegation `delegationAddresses` * and `pcts` of an `_owner`. Returned in two separate positional arrays. * @param _owner The address to get delegations. * @param _blockNumber The block for which we want to know the delegations. * @return _delegateAddresses Positional array of delegation addresses. * @return _bips Positional array of delegation percents specified in basis points (1/100 or 1 percent) * @return _count The number of delegates. * @return _delegationMode The mode of the delegation (NOTSET=0, PERCENTAGE=1, AMOUNT=2). */ function delegatesOfAt( address _owner, uint256 _blockNumber ) external view returns ( address[] memory _delegateAddresses, uint256[] memory _bips, uint256 _count, uint256 _delegationMode ); /** * The VPToken (or some other contract) that owns this VPContract. * All state changing methods may be called only from this address. * This is because original msg.sender is sent in `_from` parameter * and we must be sure that it cannot be faked by directly calling VPContract. * Owner token is also used in case of replacement to recover vote powers from balances. */ function ownerToken() external view returns (IVPToken); /** * Return true if this IIVPContract is configured to be used as a replacement for other contract. * It means that vote powers are not necessarily correct at the initialization, therefore * every method that reads vote power must check whether it is initialized for that address and block. */ function isReplacement() external view returns (bool); }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/token/token/interface/IIVPToken.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; import "../../userInterfaces/IVPToken.sol"; import "../../../../governance/userInterfaces/IGovernanceVotePower.sol"; import "./IIVPContract.sol"; import "./IIGovernanceVotePower.sol"; import "./IICleanable.sol"; interface IIVPToken is IVPToken, IICleanable { /** * Set the contract that is allowed to set cleanupBlockNumber. * Usually this will be an instance of CleanupBlockNumberManager. */ function setCleanupBlockNumberManager(address _cleanupBlockNumberManager) external; /** * Sets new governance vote power contract that allows token owners to participate in governance voting * and delegate governance vote power. */ function setGovernanceVotePower(IIGovernanceVotePower _governanceVotePower) external; /** * @notice Get the total vote power at block `_blockNumber` using cache. * It tries to read the cached value and if not found, reads the actual value and stores it in cache. * Can only be used if `_blockNumber` is in the past, otherwise reverts. * @param _blockNumber The block number at which to fetch. * @return The total vote power at the block (sum of all accounts' vote powers). */ function totalVotePowerAtCached(uint256 _blockNumber) external returns(uint256); /** * @notice Get the vote power of `_owner` at block `_blockNumber` using cache. * It tries to read the cached value and if not found, reads the actual value and stores it in cache. * Can only be used if _blockNumber is in the past, otherwise reverts. * @param _owner The address to get voting power. * @param _blockNumber The block number at which to fetch. * @return Vote power of `_owner` at `_blockNumber`. */ function votePowerOfAtCached(address _owner, uint256 _blockNumber) external returns(uint256); /** * Return vote powers for several addresses in a batch. * @param _owners The list of addresses to fetch vote power of. * @param _blockNumber The block number at which to fetch. * @return A list of vote powers. */ function batchVotePowerOfAt( address[] memory _owners, uint256 _blockNumber ) external view returns(uint256[] memory); }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/token/userInterfaces/IVPContractEvents.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; interface IVPContractEvents { /** * Event triggered when an account delegates or undelegates another account. * Definition: `votePowerFromTo(from, to)` is `changed` from `priorVotePower` to `newVotePower`. * For undelegation, `newVotePower` is 0. * * Note: the event is always emitted from VPToken's `writeVotePowerContract`. */ event Delegate(address indexed from, address indexed to, uint256 priorVotePower, uint256 newVotePower); /** * Event triggered only when account `delegator` revokes delegation to `delegatee` * for a single block in the past (typically the current vote block). * * Note: the event is always emitted from VPToken's `writeVotePowerContract` and/or `readVotePowerContract`. */ event Revoke(address indexed delegator, address indexed delegatee, uint256 votePower, uint256 blockNumber); }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/token/userInterfaces/IVPToken.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "../../../governance/userInterfaces/IGovernanceVotePower.sol"; import "./IVPContractEvents.sol"; interface IVPToken is IERC20 { /** * @notice Delegate by percentage `_bips` of voting power to `_to` from `msg.sender`. * @param _to The address of the recipient * @param _bips The percentage of voting power to be delegated expressed in basis points (1/100 of one percent). * Not cumulative - every call resets the delegation value (and value of 0 undelegates `to`). **/ function delegate(address _to, uint256 _bips) external; /** * @notice Undelegate all percentage delegations from the sender and then delegate corresponding * `_bips` percentage of voting power from the sender to each member of `_delegatees`. * @param _delegatees The addresses of the new recipients. * @param _bips The percentages of voting power to be delegated expressed in basis points (1/100 of one percent). * Total of all `_bips` values must be at most 10000. **/ function batchDelegate(address[] memory _delegatees, uint256[] memory _bips) external; /** * @notice Explicitly delegate `_amount` of voting power to `_to` from `msg.sender`. * @param _to The address of the recipient * @param _amount An explicit vote power amount to be delegated. * Not cumulative - every call resets the delegation value (and value of 0 undelegates `to`). **/ function delegateExplicit(address _to, uint _amount) external; /** * @notice Revoke all delegation from sender to `_who` at given block. * Only affects the reads via `votePowerOfAtCached()` in the block `_blockNumber`. * Block `_blockNumber` must be in the past. * This method should be used only to prevent rogue delegate voting in the current voting block. * To stop delegating use delegate/delegateExplicit with value of 0 or undelegateAll/undelegateAllExplicit. * @param _who Address of the delegatee * @param _blockNumber The block number at which to revoke delegation. */ function revokeDelegationAt(address _who, uint _blockNumber) external; /** * @notice Undelegate all voting power for delegates of `msg.sender` * Can only be used with percentage delegation. * Does not reset delegation mode back to NOTSET. **/ function undelegateAll() external; /** * @notice Undelegate all explicit vote power by amount delegates for `msg.sender`. * Can only be used with explicit delegation. * Does not reset delegation mode back to NOTSET. * @param _delegateAddresses Explicit delegation does not store delegatees' addresses, * so the caller must supply them. * @return The amount still delegated (in case the list of delegates was incomplete). */ function undelegateAllExplicit(address[] memory _delegateAddresses) external returns (uint256); /** * @dev Should be compatible with ERC20 method */ function name() external view returns (string memory); /** * @dev Should be compatible with ERC20 method */ function symbol() external view returns (string memory); /** * @dev Should be compatible with ERC20 method */ function decimals() external view returns (uint8); /** * @notice Total amount of tokens at a specific `_blockNumber`. * @param _blockNumber The block number when the totalSupply is queried * @return The total amount of tokens at `_blockNumber` **/ function totalSupplyAt(uint _blockNumber) external view returns(uint256); /** * @dev Queries the token balance of `_owner` at a specific `_blockNumber`. * @param _owner The address from which the balance will be retrieved. * @param _blockNumber The block number when the balance is queried. * @return The balance at `_blockNumber`. **/ function balanceOfAt(address _owner, uint _blockNumber) external view returns (uint256); /** * @notice Get the current total vote power. * @return The current total vote power (sum of all accounts' vote powers). */ function totalVotePower() external view returns(uint256); /** * @notice Get the total vote power at block `_blockNumber` * @param _blockNumber The block number at which to fetch. * @return The total vote power at the block (sum of all accounts' vote powers). */ function totalVotePowerAt(uint _blockNumber) external view returns(uint256); /** * @notice Get the current vote power of `_owner`. * @param _owner The address to get voting power. * @return Current vote power of `_owner`. */ function votePowerOf(address _owner) external view returns(uint256); /** * @notice Get the vote power of `_owner` at block `_blockNumber` * @param _owner The address to get voting power. * @param _blockNumber The block number at which to fetch. * @return Vote power of `_owner` at `_blockNumber`. */ function votePowerOfAt(address _owner, uint256 _blockNumber) external view returns(uint256); /** * @notice Get the vote power of `_owner` at block `_blockNumber`, ignoring revocation information (and cache). * @param _owner The address to get voting power. * @param _blockNumber The block number at which to fetch. * @return Vote power of `_owner` at `_blockNumber`. Result doesn't change if vote power is revoked. */ function votePowerOfAtIgnoringRevocation(address _owner, uint256 _blockNumber) external view returns(uint256); /** * @notice Get the delegation mode for '_who'. This mode determines whether vote power is * allocated by percentage or by explicit value. Once the delegation mode is set, * it never changes, even if all delegations are removed. * @param _who The address to get delegation mode. * @return delegation mode: 0 = NOTSET, 1 = PERCENTAGE, 2 = AMOUNT (i.e. explicit) */ function delegationModeOf(address _who) external view returns(uint256); /** * @notice Get current delegated vote power `_from` delegator delegated `_to` delegatee. * @param _from Address of delegator * @param _to Address of delegatee * @return The delegated vote power. */ function votePowerFromTo(address _from, address _to) external view returns(uint256); /** * @notice Get delegated the vote power `_from` delegator delegated `_to` delegatee at `_blockNumber`. * @param _from Address of delegator * @param _to Address of delegatee * @param _blockNumber The block number at which to fetch. * @return The delegated vote power. */ function votePowerFromToAt(address _from, address _to, uint _blockNumber) external view returns(uint256); /** * @notice Compute the current undelegated vote power of `_owner` * @param _owner The address to get undelegated voting power. * @return The unallocated vote power of `_owner` */ function undelegatedVotePowerOf(address _owner) external view returns(uint256); /** * @notice Get the undelegated vote power of `_owner` at given block. * @param _owner The address to get undelegated voting power. * @param _blockNumber The block number at which to fetch. * @return The undelegated vote power of `_owner` (= owner's own balance minus all delegations from owner) */ function undelegatedVotePowerOfAt(address _owner, uint256 _blockNumber) external view returns(uint256); /** * @notice Get the vote power delegation `delegationAddresses` * and `_bips` of `_who`. Returned in two separate positional arrays. * @param _who The address to get delegations. * @return _delegateAddresses Positional array of delegation addresses. * @return _bips Positional array of delegation percents specified in basis points (1/100 or 1 percent) * @return _count The number of delegates. * @return _delegationMode The mode of the delegation (NOTSET=0, PERCENTAGE=1, AMOUNT=2). */ function delegatesOf(address _who) external view returns ( address[] memory _delegateAddresses, uint256[] memory _bips, uint256 _count, uint256 _delegationMode ); /** * @notice Get the vote power delegation `delegationAddresses` * and `pcts` of `_who`. Returned in two separate positional arrays. * @param _who The address to get delegations. * @param _blockNumber The block for which we want to know the delegations. * @return _delegateAddresses Positional array of delegation addresses. * @return _bips Positional array of delegation percents specified in basis points (1/100 or 1 percent) * @return _count The number of delegates. * @return _delegationMode The mode of the delegation (NOTSET=0, PERCENTAGE=1, AMOUNT=2). */ function delegatesOfAt(address _who, uint256 _blockNumber) external view returns ( address[] memory _delegateAddresses, uint256[] memory _bips, uint256 _count, uint256 _delegationMode ); /** * Returns VPContract used for readonly operations (view methods). * The only non-view method that might be called on it is `revokeDelegationAt`. * * @notice `readVotePowerContract` is almost always equal to `writeVotePowerContract` * except during upgrade from one VPContract to a new version (which should happen * rarely or never and will be anounced before). * * @notice You shouldn't call any methods on VPContract directly, all are exposed * via VPToken (and state changing methods are forbidden from direct calls). * This is the reason why this method returns `IVPContractEvents` - it should only be used * for listening to events (`Revoke` only). */ function readVotePowerContract() external view returns (IVPContractEvents); /** * Returns VPContract used for state changing operations (non-view methods). * The only non-view method that might be called on it is `revokeDelegationAt`. * * @notice `writeVotePowerContract` is almost always equal to `readVotePowerContract` * except during upgrade from one VPContract to a new version (which should happen * rarely or never and will be anounced before). In the case of upgrade, * `writeVotePowerContract` will be replaced first to establish delegations, and * after some perio (e.g. after a reward epoch ends) `readVotePowerContract` will be set equal to it. * * @notice You shouldn't call any methods on VPContract directly, all are exposed * via VPToken (and state changing methods are forbidden from direct calls). * This is the reason why this method returns `IVPContractEvents` - it should only be used * for listening to events (`Delegate` and `Revoke` only). */ function writeVotePowerContract() external view returns (IVPContractEvents); /** * When set, allows token owners to participate in governance voting * and delegate governance vote power. */ function governanceVotePower() external view returns (IGovernanceVotePower); }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/token/userInterfaces/IWNat.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; interface IWNat { /** * @notice Deposit native token and mint WNAT ERC20. */ function deposit() external payable; /** * @notice Withdraw native token and burn WNAT ERC20. * @param _amount The amount to withdraw. */ function withdraw(uint256 _amount) external; /** * @notice Deposit native token from msg.sender and mint WNAT ERC20. * @param _recipient An address to receive minted WNAT. */ function depositTo(address _recipient) external payable; /** * @notice Withdraw WNAT from an owner and send NAT to msg.sender given an allowance. * @param _owner An address spending the native tokens. * @param _amount The amount to spend. * * Requirements: * * - `_owner` must have a balance of at least `_amount`. * - the caller must have allowance for `_owners`'s tokens of at least * `_amount`. */ function withdrawFrom(address _owner, uint256 _amount) external; }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/tokenPools/userInterfaces/IGenericRewardManager.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; interface IGenericRewardManager { event RewardClaimed( address indexed beneficiary, address indexed sentTo, uint256 amount ); event RewardsDistributed( address[] addresses, uint256[] rewards ); event ClaimExecutorsChanged( address rewardOwner, address[] executors ); event AllowedClaimRecipientsChanged( address rewardOwner, address[] recipients ); event RewardManagerActivated(address rewardManager); event RewardManagerDeactivated(address rewardManager); /** * @notice Allows the sender to claim or wrap rewards for reward owner. * @notice The caller does not have to be the owner, but must be approved by the owner to claim on his behalf. * this approval is done by calling `setClaimExecutors`. * @notice It is actually safe for this to be called by anybody (nothing can be stolen), but by limiting who can * call, we allow the owner to control the timing of the calls. * @notice Reward owner can claim to any `_recipient`, while the executor can only claim to the reward owner or * one of the addresses set by `setAllowedClaimRecipients`. * @param _rewardOwner address of the reward owner * @param _recipient address to transfer funds to * @param _rewardAmount amount of rewards to claim * @param _wrap should reward be wrapped immediately */ function claim(address _rewardOwner, address payable _recipient, uint256 _rewardAmount, bool _wrap) external; /** * Set the addresses of executors, who are allowed to call `claim`. * @param _executors The new executors. All old executors will be deleted and replaced by these. */ function setClaimExecutors(address[] memory _executors) external; /** * Set the addresses of allowed recipients in the methods `claim`. * Apart from these, the reward owner is always an allowed recipient. * @param _recipients The new allowed recipients. All old recipients will be deleted and replaced by these. */ function setAllowedClaimRecipients(address[] memory _recipients) external; /** * @notice Allows reward claiming */ function active() external view returns (bool); /** * @notice Returns information of beneficiary rewards * @param _beneficiary beneficiary address * @return _totalReward number representing the total reward * @return _claimedReward number representing the amount of total reward that has been claimed */ function getStateOfRewards( address _beneficiary ) external view returns ( uint256 _totalReward, uint256 _claimedReward ); /** * Get the addresses of executors, who are allowed to call `claim`. */ function claimExecutors(address _rewardOwner) external view returns (address[] memory); /** * Get the addresses of allowed recipients in the methods `claim`. * Apart from these, the reward owner is always an allowed recipient. */ function allowedClaimRecipients(address _rewardOwner) external view returns (address[] memory); }
@flarenetwork/flare-periphery-contracts/coston2/util-contracts/userInterfaces/IFlareContractRegistry.sol
// SPDX-License-Identifier: MIT pragma solidity >=0.7.6 <0.9; pragma abicoder v2; interface IFlareContractRegistry { /** * @notice Returns contract address for the given name - might be address(0) * @param _name name of the contract */ function getContractAddressByName(string calldata _name) external view returns(address); /** * @notice Returns contract address for the given name hash - might be address(0) * @param _nameHash hash of the contract name (keccak256(abi.encode(name)) */ function getContractAddressByHash(bytes32 _nameHash) external view returns(address); /** * @notice Returns contract addresses for the given names - might be address(0) * @param _names names of the contracts */ function getContractAddressesByName(string[] calldata _names) external view returns(address[] memory); /** * @notice Returns contract addresses for the given name hashes - might be address(0) * @param _nameHashes hashes of the contract names (keccak256(abi.encode(name)) */ function getContractAddressesByHash(bytes32[] calldata _nameHashes) external view returns(address[] memory); /** * @notice Returns all contract names and corresponding addresses */ function getAllContracts() external view returns(string[] memory _names, address[] memory _addresses); }
@openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
Compiler Settings
{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers"]}},"optimizer":{"runs":200,"enabled":true},"metadata":{"useLiteralContent":true},"libraries":{},"evmVersion":"london"}
Contract ABI
[{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"_price","internalType":"uint256"},{"type":"uint256","name":"_timestamp","internalType":"uint256"},{"type":"uint256","name":"_decimals","internalType":"uint256"}],"name":"getCurrentTokenPriceWithDecimals","inputs":[{"type":"string","name":"foreignTokenSymbol","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"_price1","internalType":"uint256"},{"type":"uint256","name":"_price2","internalType":"uint256"},{"type":"uint256","name":"_timestamp","internalType":"uint256"}],"name":"getTokenPairPrice","inputs":[{"type":"string","name":"token1","internalType":"string"},{"type":"string","name":"token2","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"_priceInUSDWei","internalType":"uint256"},{"type":"uint256","name":"_finalizedTimestamp","internalType":"uint256"}],"name":"getTokenPriceInUSDWei","inputs":[{"type":"string","name":"foreignTokenSymbol","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"_price1","internalType":"uint256"},{"type":"uint256","name":"_price2","internalType":"uint256"},{"type":"bool","name":"_is_higher","internalType":"bool"}],"name":"isPriceRatioHigherThan","inputs":[{"type":"string","name":"token1","internalType":"string"},{"type":"string","name":"token2","internalType":"string"},{"type":"uint256","name":"numerator","internalType":"uint256"},{"type":"uint256","name":"denominator","internalType":"uint256"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b50610931806100206000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c80630efe8a4c146100515780635a460ee1146100845780637044237414610097578063e4bcd0f3146100bf575b600080fd5b61006461005f366004610604565b6100ef565b604080519384526020840192909252908201526060015b60405180910390f35b610064610092366004610668565b610312565b6100aa6100a5366004610668565b61039e565b6040805192835260208301919091520161007b565b6100d26100cd3660046106a5565b610493565b60408051938452602084019290925215159082015260600161007b565b6000806000806100fd6104c9565b90506000806000836001600160a01b031663a69afdc68a6040518263ffffffff1660e01b81526004016101309190610719565b606060405180830381865afa15801561014d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101719190610767565b9250925092506000806000866001600160a01b031663a69afdc68c6040518263ffffffff1660e01b81526004016101a89190610719565b606060405180830381865afa1580156101c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e99190610767565b92509250925060128411156102365760405162461bcd60e51b815260206004820152600e60248201526d0c8cac6d2dac2d8e662407c4062760931b60448201526064015b60405180910390fd5b60128111156102785760405162461bcd60e51b815260206004820152600e60248201526d0c8cac6d2dac2d8e664407c4062760931b604482015260640161022d565b6102838460126107ab565b61028e90600a6108a8565b61029890876108bb565b99506102a58160126107ab565b6102b090600a6108a8565b6102ba90846108bb565b98508185146103025760405162461bcd60e51b81526020600482015260146024820152731d1a5b595cdd185b5c1cc81b9bdd08195c5d585b60621b604482015260640161022d565b5092955050505050509250925092565b6000806000806103206104c9565b60405163534d7ee360e11b81529091506001600160a01b0382169063a69afdc69061034f908890600401610719565b606060405180830381865afa15801561036c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103909190610767565b919790965090945092505050565b60008060006103ab6104c9565b90506000806000836001600160a01b031663a69afdc6886040518263ffffffff1660e01b81526004016103de9190610719565b606060405180830381865afa1580156103fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041f9190610767565b92509250925060128111156104665760405162461bcd60e51b815260206004820152600d60248201526c0c8cac6d2dac2d8e6407c40627609b1b604482015260640161022d565b6104718160126107ab565b61047c90600a6108a8565b61048690846108bb565b9791965090945050505050565b60008060006104a287876100ef565b5090935091506104b285836108bb565b6104bc85856108bb565b1190509450945094915050565b60405163413b07e560e11b815260206004820152600c60248201526b4674736f526567697374727960a01b604482015260009073ad67fe66660fb8dfe9d6b1b4240d8650e30f6019906382760fca90606401602060405180830381865afa158015610538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055c91906108d2565b905090565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261058857600080fd5b813567ffffffffffffffff808211156105a3576105a3610561565b604051601f8301601f19908116603f011681019082821181831017156105cb576105cb610561565b816040528381528660208588010111156105e457600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561061757600080fd5b823567ffffffffffffffff8082111561062f57600080fd5b61063b86838701610577565b9350602085013591508082111561065157600080fd5b5061065e85828601610577565b9150509250929050565b60006020828403121561067a57600080fd5b813567ffffffffffffffff81111561069157600080fd5b61069d84828501610577565b949350505050565b600080600080608085870312156106bb57600080fd5b843567ffffffffffffffff808211156106d357600080fd5b6106df88838901610577565b955060208701359150808211156106f557600080fd5b5061070287828801610577565b949794965050505060408301359260600135919050565b600060208083528351808285015260005b818110156107465785810183015185820160400152820161072a565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060006060848603121561077c57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b818103818111156107be576107be610795565b92915050565b600181815b808511156107ff5781600019048211156107e5576107e5610795565b808516156107f257918102915b93841c93908002906107c9565b509250929050565b600082610816575060016107be565b81610823575060006107be565b816001811461083957600281146108435761085f565b60019150506107be565b60ff84111561085457610854610795565b50506001821b6107be565b5060208310610133831016604e8410600b8410161715610882575081810a6107be565b61088c83836107c4565b80600019048211156108a0576108a0610795565b029392505050565b60006108b48383610807565b9392505050565b80820281158282048414176107be576107be610795565b6000602082840312156108e457600080fd5b81516001600160a01b03811681146108b457600080fdfea26469706673582212201e6c572d390ee13d0f213c2a231fbc53f6c9a1184f2f5bcd70df7003d4d38c4b64736f6c63430008140033
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061004c5760003560e01c80630efe8a4c146100515780635a460ee1146100845780637044237414610097578063e4bcd0f3146100bf575b600080fd5b61006461005f366004610604565b6100ef565b604080519384526020840192909252908201526060015b60405180910390f35b610064610092366004610668565b610312565b6100aa6100a5366004610668565b61039e565b6040805192835260208301919091520161007b565b6100d26100cd3660046106a5565b610493565b60408051938452602084019290925215159082015260600161007b565b6000806000806100fd6104c9565b90506000806000836001600160a01b031663a69afdc68a6040518263ffffffff1660e01b81526004016101309190610719565b606060405180830381865afa15801561014d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101719190610767565b9250925092506000806000866001600160a01b031663a69afdc68c6040518263ffffffff1660e01b81526004016101a89190610719565b606060405180830381865afa1580156101c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e99190610767565b92509250925060128411156102365760405162461bcd60e51b815260206004820152600e60248201526d0c8cac6d2dac2d8e662407c4062760931b60448201526064015b60405180910390fd5b60128111156102785760405162461bcd60e51b815260206004820152600e60248201526d0c8cac6d2dac2d8e664407c4062760931b604482015260640161022d565b6102838460126107ab565b61028e90600a6108a8565b61029890876108bb565b99506102a58160126107ab565b6102b090600a6108a8565b6102ba90846108bb565b98508185146103025760405162461bcd60e51b81526020600482015260146024820152731d1a5b595cdd185b5c1cc81b9bdd08195c5d585b60621b604482015260640161022d565b5092955050505050509250925092565b6000806000806103206104c9565b60405163534d7ee360e11b81529091506001600160a01b0382169063a69afdc69061034f908890600401610719565b606060405180830381865afa15801561036c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103909190610767565b919790965090945092505050565b60008060006103ab6104c9565b90506000806000836001600160a01b031663a69afdc6886040518263ffffffff1660e01b81526004016103de9190610719565b606060405180830381865afa1580156103fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041f9190610767565b92509250925060128111156104665760405162461bcd60e51b815260206004820152600d60248201526c0c8cac6d2dac2d8e6407c40627609b1b604482015260640161022d565b6104718160126107ab565b61047c90600a6108a8565b61048690846108bb565b9791965090945050505050565b60008060006104a287876100ef565b5090935091506104b285836108bb565b6104bc85856108bb565b1190509450945094915050565b60405163413b07e560e11b815260206004820152600c60248201526b4674736f526567697374727960a01b604482015260009073ad67fe66660fb8dfe9d6b1b4240d8650e30f6019906382760fca90606401602060405180830381865afa158015610538573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055c91906108d2565b905090565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261058857600080fd5b813567ffffffffffffffff808211156105a3576105a3610561565b604051601f8301601f19908116603f011681019082821181831017156105cb576105cb610561565b816040528381528660208588010111156105e457600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000806040838503121561061757600080fd5b823567ffffffffffffffff8082111561062f57600080fd5b61063b86838701610577565b9350602085013591508082111561065157600080fd5b5061065e85828601610577565b9150509250929050565b60006020828403121561067a57600080fd5b813567ffffffffffffffff81111561069157600080fd5b61069d84828501610577565b949350505050565b600080600080608085870312156106bb57600080fd5b843567ffffffffffffffff808211156106d357600080fd5b6106df88838901610577565b955060208701359150808211156106f557600080fd5b5061070287828801610577565b949794965050505060408301359260600135919050565b600060208083528351808285015260005b818110156107465785810183015185820160400152820161072a565b506000604082860101526040601f19601f8301168501019250505092915050565b60008060006060848603121561077c57600080fd5b8351925060208401519150604084015190509250925092565b634e487b7160e01b600052601160045260246000fd5b818103818111156107be576107be610795565b92915050565b600181815b808511156107ff5781600019048211156107e5576107e5610795565b808516156107f257918102915b93841c93908002906107c9565b509250929050565b600082610816575060016107be565b81610823575060006107be565b816001811461083957600281146108435761085f565b60019150506107be565b60ff84111561085457610854610795565b50506001821b6107be565b5060208310610133831016604e8410600b8410161715610882575081810a6107be565b61088c83836107c4565b80600019048211156108a0576108a0610795565b029392505050565b60006108b48383610807565b9392505050565b80820281158282048414176107be576107be610795565b6000602082840312156108e457600080fd5b81516001600160a01b03811681146108b457600080fdfea26469706673582212201e6c572d390ee13d0f213c2a231fbc53f6c9a1184f2f5bcd70df7003d4d38c4b64736f6c63430008140033