mirror of
https://github.com/luxfi/uma.git
synced 2026-10-30 15:14:44 +00:00
185 lines
8.2 KiB
Solidity
185 lines
8.2 KiB
Solidity
// SPDX-License-Identifier: AGPL-3.0-only
|
||
pragma solidity ^0.8.0;
|
||
|
||
import "../../common/implementation/FixedPoint.sol";
|
||
|
||
/**
|
||
* @title Interface that voters must use to Vote on price request resolutions.
|
||
*/
|
||
abstract contract VotingAncillaryInterface {
|
||
struct PendingRequestAncillary {
|
||
bytes32 identifier;
|
||
uint256 time;
|
||
bytes ancillaryData;
|
||
}
|
||
|
||
// Captures the necessary data for making a commitment.
|
||
// Used as a parameter when making batch commitments.
|
||
// Not used as a data structure for storage.
|
||
struct CommitmentAncillary {
|
||
bytes32 identifier;
|
||
uint256 time;
|
||
bytes ancillaryData;
|
||
bytes32 hash;
|
||
bytes encryptedVote;
|
||
}
|
||
|
||
// Captures the necessary data for revealing a vote.
|
||
// Used as a parameter when making batch reveals.
|
||
// Not used as a data structure for storage.
|
||
struct RevealAncillary {
|
||
bytes32 identifier;
|
||
uint256 time;
|
||
int256 price;
|
||
bytes ancillaryData;
|
||
int256 salt;
|
||
}
|
||
|
||
// Note: the phases must be in order. Meaning the first enum value must be the first phase, etc.
|
||
// `NUM_PHASES` is to get the number of phases. It isn't an actual phase, and it should always be last.
|
||
enum Phase { Commit, Reveal, NUM_PHASES }
|
||
|
||
/**
|
||
* @notice Commit a vote for a price request for `identifier` at `time`.
|
||
* @dev `identifier`, `time` must correspond to a price request that's currently in the commit phase.
|
||
* Commits can be changed.
|
||
* @dev Since transaction data is public, the salt will be revealed with the vote. While this is the system’s expected behavior,
|
||
* voters should never reuse salts. If someone else is able to guess the voted price and knows that a salt will be reused, then
|
||
* they can determine the vote pre-reveal.
|
||
* @param identifier uniquely identifies the committed vote. E.G. BTC/USD price pair.
|
||
* @param time unix timestamp of the price being voted on.
|
||
* @param hash keccak256 hash of the `price`, `salt`, voter `address`, `time`, current `roundId`, and `identifier`.
|
||
*/
|
||
function commitVote(
|
||
bytes32 identifier,
|
||
uint256 time,
|
||
bytes memory ancillaryData,
|
||
bytes32 hash
|
||
) public virtual;
|
||
|
||
/**
|
||
* @notice Submit a batch of commits in a single transaction.
|
||
* @dev Using `encryptedVote` is optional. If included then commitment is stored on chain.
|
||
* Look at `project-root/common/Constants.js` for the tested maximum number of
|
||
* commitments that can fit in one transaction.
|
||
* @param commits array of structs that encapsulate an `identifier`, `time`, `hash` and optional `encryptedVote`.
|
||
*/
|
||
function batchCommit(CommitmentAncillary[] memory commits) public virtual;
|
||
|
||
/**
|
||
* @notice commits a vote and logs an event with a data blob, typically an encrypted version of the vote
|
||
* @dev An encrypted version of the vote is emitted in an event `EncryptedVote` to allow off-chain infrastructure to
|
||
* retrieve the commit. The contents of `encryptedVote` are never used on chain: it is purely for convenience.
|
||
* @param identifier unique price pair identifier. E.g. BTC/USD price pair.
|
||
* @param time unix timestamp of for the price request.
|
||
* @param hash keccak256 hash of the price you want to vote for and a `int256 salt`.
|
||
* @param encryptedVote offchain encrypted blob containing the voters amount, time and salt.
|
||
*/
|
||
function commitAndEmitEncryptedVote(
|
||
bytes32 identifier,
|
||
uint256 time,
|
||
bytes memory ancillaryData,
|
||
bytes32 hash,
|
||
bytes memory encryptedVote
|
||
) public virtual;
|
||
|
||
/**
|
||
* @notice snapshot the current round's token balances and lock in the inflation rate and GAT.
|
||
* @dev This function can be called multiple times but each round will only every have one snapshot at the
|
||
* time of calling `_freezeRoundVariables`.
|
||
* @param signature signature required to prove caller is an EOA to prevent flash loans from being included in the
|
||
* snapshot.
|
||
*/
|
||
function snapshotCurrentRound(bytes calldata signature) external virtual;
|
||
|
||
/**
|
||
* @notice Reveal a previously committed vote for `identifier` at `time`.
|
||
* @dev The revealed `price`, `salt`, `address`, `time`, `roundId`, and `identifier`, must hash to the latest `hash`
|
||
* that `commitVote()` was called with. Only the committer can reveal their vote.
|
||
* @param identifier voted on in the commit phase. EG BTC/USD price pair.
|
||
* @param time specifies the unix timestamp of the price is being voted on.
|
||
* @param price voted on during the commit phase.
|
||
* @param salt value used to hide the commitment price during the commit phase.
|
||
*/
|
||
function revealVote(
|
||
bytes32 identifier,
|
||
uint256 time,
|
||
int256 price,
|
||
bytes memory ancillaryData,
|
||
int256 salt
|
||
) public virtual;
|
||
|
||
/**
|
||
* @notice Reveal multiple votes in a single transaction.
|
||
* Look at `project-root/common/Constants.js` for the tested maximum number of reveals.
|
||
* that can fit in one transaction.
|
||
* @dev For more information on reveals, review the comment for `revealVote`.
|
||
* @param reveals array of the Reveal struct which contains an identifier, time, price and salt.
|
||
*/
|
||
function batchReveal(RevealAncillary[] memory reveals) public virtual;
|
||
|
||
/**
|
||
* @notice Gets the queries that are being voted on this round.
|
||
* @return pendingRequests `PendingRequest` array containing identifiers
|
||
* and timestamps for all pending requests.
|
||
*/
|
||
function getPendingRequests() external view virtual returns (PendingRequestAncillary[] memory);
|
||
|
||
/**
|
||
* @notice Returns the current voting phase, as a function of the current time.
|
||
* @return Phase to indicate the current phase. Either { Commit, Reveal, NUM_PHASES }.
|
||
*/
|
||
function getVotePhase() external view virtual returns (Phase);
|
||
|
||
/**
|
||
* @notice Returns the current round ID, as a function of the current time.
|
||
* @return uint256 representing the unique round ID.
|
||
*/
|
||
function getCurrentRoundId() external view virtual returns (uint256);
|
||
|
||
/**
|
||
* @notice Retrieves rewards owed for a set of resolved price requests.
|
||
* @dev Can only retrieve rewards if calling for a valid round and if the
|
||
* call is done within the timeout threshold (not expired).
|
||
* @param voterAddress voter for which rewards will be retrieved. Does not have to be the caller.
|
||
* @param roundId the round from which voting rewards will be retrieved from.
|
||
* @param toRetrieve array of PendingRequests which rewards are retrieved from.
|
||
* @return total amount of rewards returned to the voter.
|
||
*/
|
||
function retrieveRewards(
|
||
address voterAddress,
|
||
uint256 roundId,
|
||
PendingRequestAncillary[] memory toRetrieve
|
||
) public virtual returns (FixedPoint.Unsigned memory);
|
||
|
||
// Voting Owner functions.
|
||
|
||
/**
|
||
* @notice Disables this Voting contract in favor of the migrated one.
|
||
* @dev Can only be called by the contract owner.
|
||
* @param newVotingAddress the newly migrated contract address.
|
||
*/
|
||
function setMigrated(address newVotingAddress) external virtual;
|
||
|
||
/**
|
||
* @notice Resets the inflation rate. Note: this change only applies to rounds that have not yet begun.
|
||
* @dev This method is public because calldata structs are not currently supported by solidity.
|
||
* @param newInflationRate sets the next round's inflation rate.
|
||
*/
|
||
function setInflationRate(FixedPoint.Unsigned memory newInflationRate) public virtual;
|
||
|
||
/**
|
||
* @notice Resets the Gat percentage. Note: this change only applies to rounds that have not yet begun.
|
||
* @dev This method is public because calldata structs are not currently supported by solidity.
|
||
* @param newGatPercentage sets the next round's Gat percentage.
|
||
*/
|
||
function setGatPercentage(FixedPoint.Unsigned memory newGatPercentage) public virtual;
|
||
|
||
/**
|
||
* @notice Resets the rewards expiration timeout.
|
||
* @dev This change only applies to rounds that have not yet begun.
|
||
* @param NewRewardsExpirationTimeout how long a caller can wait before choosing to withdraw their rewards.
|
||
*/
|
||
function setRewardsExpirationTimeout(uint256 NewRewardsExpirationTimeout) public virtual;
|
||
}
|