Source Code
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Cross-Chain Transactions
Loading...
Loading
Contract Name:
RewardsDistributor
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import {IRewardDistributor} from "@synthetixio/main/contracts/interfaces/external/IRewardDistributor.sol";
import {AccessError} from "@synthetixio/core-contracts/contracts/errors/AccessError.sol";
import {ParameterError} from "@synthetixio/core-contracts/contracts/errors/ParameterError.sol";
import {ERC20Helper} from "@synthetixio/core-contracts/contracts/token/ERC20Helper.sol";
import {IERC165} from "@synthetixio/core-contracts/contracts/interfaces/IERC165.sol";
import {IERC20} from "@synthetixio/core-contracts/contracts/interfaces/IERC20.sol";
import {ISynthetixCore} from "./interfaces/ISynthetixCore.sol";
contract RewardsDistributor is IRewardDistributor {
error NotEnoughRewardsLeft(uint256 amountRequested, uint256 amountLeft);
error NotEnoughBalance(uint256 amountRequested, uint256 currentBalance);
using ERC20Helper for address;
address public rewardManager;
uint128 public poolId;
address public collateralType;
address public payoutToken;
string public name;
uint256 public precision;
uint256 public constant SYSTEM_PRECISION = 10 ** 18;
bool public shouldFailPayout;
// Internal tracking for the remaining rewards, it keeps value in payoutToken precision
uint256 public rewardsAmount = 0;
constructor(
address rewardManager_,
uint128 poolId_,
address collateralType_,
address payoutToken_,
uint8 payoutTokenDecimals_,
string memory name_
) {
rewardManager = rewardManager_; // Synthetix CoreProxy
poolId = poolId_;
collateralType = collateralType_;
payoutToken = payoutToken_;
name = name_;
(bool success, bytes memory data) = payoutToken_.staticcall(
abi.encodeWithSignature("decimals()")
);
if (success && data.length > 0 && abi.decode(data, (uint8)) != payoutTokenDecimals_) {
revert ParameterError.InvalidParameter(
"payoutTokenDecimals",
"Specified token decimals do not match actual token decimals"
);
}
// Fallback to the specified token decimals skipping the check if token does not support decimals method
precision = 10 ** payoutTokenDecimals_;
}
function token() public view returns (address) {
return payoutToken;
}
function setShouldFailPayout(bool shouldFailPayout_) external {
if (msg.sender != ISynthetixCore(rewardManager).getPoolOwner(poolId)) {
revert AccessError.Unauthorized(msg.sender);
}
shouldFailPayout = shouldFailPayout_;
}
function payout(
uint128, // accountId,
uint128 poolId_,
address collateralType_,
address payoutTarget_, // msg.sender of claimRewards() call, payout target address
uint256 payoutAmount_
) external returns (bool) {
if (shouldFailPayout) {
return false;
}
// IMPORTANT: In production, this function should revert if msg.sender is not the Synthetix CoreProxy address.
if (msg.sender != rewardManager) {
revert AccessError.Unauthorized(msg.sender);
}
if (poolId_ != poolId) {
revert ParameterError.InvalidParameter(
"poolId",
"Pool does not match the rewards pool"
);
}
if (collateralType_ != collateralType) {
revert ParameterError.InvalidParameter(
"collateralType",
"Collateral does not match the rewards token"
);
}
// payoutAmount_ is always in 18 decimals precision, adjust actual payout amount to match payout token decimals
uint256 adjustedAmount = (payoutAmount_ * precision) / SYSTEM_PRECISION;
if (adjustedAmount > rewardsAmount) {
revert NotEnoughRewardsLeft(adjustedAmount, rewardsAmount);
}
rewardsAmount = rewardsAmount - adjustedAmount;
payoutToken.safeTransfer(payoutTarget_, adjustedAmount);
return true;
}
function distributeRewards(
uint128 poolId_,
address collateralType_,
uint256 amount_,
uint64 start_,
uint32 duration_
) public {
if (msg.sender != ISynthetixCore(rewardManager).getPoolOwner(poolId)) {
revert AccessError.Unauthorized(msg.sender);
}
if (poolId_ != poolId) {
revert ParameterError.InvalidParameter(
"poolId",
"Pool does not match the rewards pool"
);
}
if (collateralType_ != collateralType) {
revert ParameterError.InvalidParameter(
"collateralType",
"Collateral does not match the rewards token"
);
}
rewardsAmount = rewardsAmount + amount_;
uint256 balance = IERC20(payoutToken).balanceOf(address(this));
if (rewardsAmount > balance) {
revert NotEnoughBalance(amount_, balance);
}
// amount_ is in payout token decimals precision, adjust actual distribution amount to 18 decimals that core is making its calculations in
// this is necessary to avoid rounding issues when doing actual payouts
uint256 adjustedAmount = (amount_ * SYSTEM_PRECISION) / precision;
ISynthetixCore(rewardManager).distributeRewards(
poolId_,
collateralType_,
adjustedAmount,
start_,
duration_
);
}
function onPositionUpdated(
uint128, // accountId,
uint128, // poolId,
address, // collateralType,
uint256 // actorSharesD18
) external {}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(
bytes4 interfaceId
) public view virtual override(IERC165) returns (bool) {
return
interfaceId == type(IRewardDistributor).interfaceId ||
interfaceId == this.supportsInterface.selector;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.11 <0.9.0;
import "@synthetixio/core-contracts/contracts/interfaces/IERC165.sol";
/// @title Interface a reward distributor.
interface IRewardDistributor is IERC165 {
/// @notice Returns a human-readable name for the reward distributor
function name() external returns (string memory);
/// @notice This function should revert if ERC2771Context._msgSender() is not the Synthetix CoreProxy address.
/// @return whether or not the payout was executed
function payout(
uint128 accountId,
uint128 poolId,
address collateralType,
address sender,
uint256 amount
) external returns (bool);
/// @notice This function is called by the Synthetix Core Proxy whenever
/// a position is updated on a pool which this distributor is registered
function onPositionUpdated(
uint128 accountId,
uint128 poolId,
address collateralType,
uint256 newShares
) external;
/// @notice Address to ERC-20 token distributed by this distributor, for display purposes only
/// @dev Return address(0) if providing non ERC-20 rewards
function token() external returns (address);
}//SPDX-License-Identifier: MIT
pragma solidity >=0.8.11 <0.9.0;
/**
* @title Library for access related errors.
*/
library AccessError {
/**
* @dev Thrown when an address tries to perform an unauthorized action.
* @param addr The address that attempts the action.
*/
error Unauthorized(address addr);
}//SPDX-License-Identifier: MIT
pragma solidity >=0.8.11 <0.9.0;
/**
* @title Library for errors related with expected function parameters.
*/
library ParameterError {
/**
* @dev Thrown when an invalid parameter is used in a function.
* @param parameter The name of the parameter.
* @param reason The reason why the received parameter is invalid.
*/
error InvalidParameter(string parameter, string reason);
}//SPDX-License-Identifier: MIT
pragma solidity >=0.8.11 <0.9.0;
/**
* @title ERC165 interface for determining if a contract supports a given interface.
*/
interface IERC165 {
/**
* @notice Determines if the contract in question supports the specified interface.
* @param interfaceID XOR of all selectors in the contract.
* @return True if the contract supports the specified interface.
*/
function supportsInterface(bytes4 interfaceID) external view returns (bool);
}//SPDX-License-Identifier: MIT
pragma solidity >=0.8.11 <0.9.0;
/**
* @title ERC20 token implementation.
*/
interface IERC20 {
/**
* @notice Emitted when tokens have been transferred.
* @param from The address that originally owned the tokens.
* @param to The address that received the tokens.
* @param amount The number of tokens that were transferred.
*/
event Transfer(address indexed from, address indexed to, uint amount);
/**
* @notice Emitted when a user has provided allowance to another user for transferring tokens on its behalf.
* @param owner The address that is providing the allowance.
* @param spender The address that received the allowance.
* @param amount The number of tokens that were added to `spender`'s allowance.
*/
event Approval(address indexed owner, address indexed spender, uint amount);
/**
* @notice Thrown when the address interacting with the contract does not have sufficient allowance to transfer tokens from another contract.
* @param required The necessary allowance.
* @param existing The current allowance.
*/
error InsufficientAllowance(uint required, uint existing);
/**
* @notice Thrown when the address interacting with the contract does not have sufficient tokens.
* @param required The necessary balance.
* @param existing The current balance.
*/
error InsufficientBalance(uint required, uint existing);
/**
* @notice Retrieves the name of the token, e.g. "Synthetix Network Token".
* @return A string with the name of the token.
*/
function name() external view returns (string memory);
/**
* @notice Retrieves the symbol of the token, e.g. "SNX".
* @return A string with the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @notice Retrieves the number of decimals used by the token. The default is 18.
* @return The number of decimals.
*/
function decimals() external view returns (uint8);
/**
* @notice Returns the total number of tokens in circulation (minted - burnt).
* @return The total number of tokens.
*/
function totalSupply() external view returns (uint);
/**
* @notice Returns the balance of a user.
* @param owner The address whose balance is being retrieved.
* @return The number of tokens owned by the user.
*/
function balanceOf(address owner) external view returns (uint);
/**
* @notice Returns how many tokens a user has allowed another user to transfer on its behalf.
* @param owner The user who has given the allowance.
* @param spender The user who was given the allowance.
* @return The amount of tokens `spender` can transfer on `owner`'s behalf.
*/
function allowance(address owner, address spender) external view returns (uint);
/**
* @notice Transfer tokens from one address to another.
* @param to The address that will receive the tokens.
* @param amount The amount of tokens to be transferred.
* @return A boolean which is true if the operation succeeded.
*/
function transfer(address to, uint amount) external returns (bool);
/**
* @notice Allows users to provide allowance to other users so that they can transfer tokens on their behalf.
* @param spender The address that is receiving the allowance.
* @param amount The amount of tokens that are being added to the allowance.
* @return A boolean which is true if the operation succeeded.
*/
function approve(address spender, uint amount) external returns (bool);
/**
* @notice Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
/**
* @notice Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
/**
* @notice Allows a user who has been given allowance to transfer tokens on another user's behalf.
* @param from The address that owns the tokens that are being transferred.
* @param to The address that will receive the tokens.
* @param amount The number of tokens to transfer.
* @return A boolean which is true if the operation succeeded.
*/
function transferFrom(address from, address to, uint amount) external returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity >=0.8.11 <0.9.0;
import "../interfaces/IERC20.sol";
library ERC20Helper {
error FailedTransfer(address from, address to, uint value);
function safeTransfer(address token, address to, uint value) internal {
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(IERC20.transfer.selector, to, value)
);
if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
revert FailedTransfer(address(this), to, value);
}
}
function safeTransferFrom(address token, address from, address to, uint value) internal {
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)
);
if (!success || (data.length != 0 && !abi.decode(data, (bool)))) {
revert FailedTransfer(from, to, value);
}
}
}// SPDX-License-Identifier: UNLICENSED
// !! THIS FILE WAS AUTOGENERATED BY abi-to-sol v0.8.0. SEE SOURCE BELOW. !!
pragma solidity ^0.8.4;
interface ISynthetixCore {
error ImplementationIsSterile(address implementation);
error NoChange();
error NotAContract(address contr);
error NotNominated(address addr);
error Unauthorized(address addr);
error UpgradeSimulationFailed();
error ZeroAddress();
event OwnerChanged(address oldOwner, address newOwner);
event OwnerNominated(address newOwner);
event Upgraded(address indexed self, address implementation);
function acceptOwnership() external;
function getImplementation() external view returns (address);
function nominateNewOwner(address newNominatedOwner) external;
function nominatedOwner() external view returns (address);
function owner() external view returns (address);
function renounceNomination() external;
function simulateUpgradeTo(address newImplementation) external;
function upgradeTo(address newImplementation) external;
error ValueAlreadyInSet();
error ValueNotInSet();
event FeatureFlagAllowAllSet(bytes32 indexed feature, bool allowAll);
event FeatureFlagAllowlistAdded(bytes32 indexed feature, address account);
event FeatureFlagAllowlistRemoved(bytes32 indexed feature, address account);
event FeatureFlagDeniersReset(bytes32 indexed feature, address[] deniers);
event FeatureFlagDenyAllSet(bytes32 indexed feature, bool denyAll);
function addToFeatureFlagAllowlist(bytes32 feature, address account) external;
function getDeniers(bytes32 feature) external view returns (address[] memory);
function getFeatureFlagAllowAll(bytes32 feature) external view returns (bool);
function getFeatureFlagAllowlist(bytes32 feature) external view returns (address[] memory);
function getFeatureFlagDenyAll(bytes32 feature) external view returns (bool);
function isFeatureAllowed(bytes32 feature, address account) external view returns (bool);
function removeFromFeatureFlagAllowlist(bytes32 feature, address account) external;
function setDeniers(bytes32 feature, address[] memory deniers) external;
function setFeatureFlagAllowAll(bytes32 feature, bool allowAll) external;
function setFeatureFlagDenyAll(bytes32 feature, bool denyAll) external;
error FeatureUnavailable(bytes32 which);
error InvalidAccountId(uint128 accountId);
error InvalidPermission(bytes32 permission);
error OnlyAccountTokenProxy(address origin);
error PermissionDenied(uint128 accountId, bytes32 permission, address target);
error PermissionNotGranted(uint128 accountId, bytes32 permission, address user);
error PositionOutOfBounds();
event AccountCreated(uint128 indexed accountId, address indexed owner);
event PermissionGranted(
uint128 indexed accountId,
bytes32 indexed permission,
address indexed user,
address sender
);
event PermissionRevoked(
uint128 indexed accountId,
bytes32 indexed permission,
address indexed user,
address sender
);
function createAccount() external returns (uint128 accountId);
function createAccount(uint128 requestedAccountId) external;
function getAccountLastInteraction(uint128 accountId) external view returns (uint256);
function getAccountOwner(uint128 accountId) external view returns (address);
function getAccountPermissions(
uint128 accountId
) external view returns (IAccountModule.AccountPermissions[] memory accountPerms);
function getAccountTokenAddress() external view returns (address);
function grantPermission(uint128 accountId, bytes32 permission, address user) external;
function hasPermission(
uint128 accountId,
bytes32 permission,
address user
) external view returns (bool);
function isAuthorized(
uint128 accountId,
bytes32 permission,
address user
) external view returns (bool);
function notifyAccountTransfer(address to, uint128 accountId) external;
function renouncePermission(uint128 accountId, bytes32 permission) external;
function revokePermission(uint128 accountId, bytes32 permission, address user) external;
error AccountNotFound(uint128 accountId);
error EmptyDistribution();
error InsufficientCollateralRatio(
uint256 collateralValue,
uint256 debt,
uint256 ratio,
uint256 minRatio
);
error MarketNotFound(uint128 marketId);
error NotFundedByPool(uint256 marketId, uint256 poolId);
error OverflowInt256ToInt128();
error OverflowInt256ToUint256();
error OverflowUint128ToInt128();
error OverflowUint256ToInt256();
error OverflowUint256ToUint128();
event DebtAssociated(
uint128 indexed marketId,
uint128 indexed poolId,
address indexed collateralType,
uint128 accountId,
uint256 amount,
int256 updatedDebt
);
function associateDebt(
uint128 marketId,
uint128 poolId,
address collateralType,
uint128 accountId,
uint256 amount
) external returns (int256);
error MismatchAssociatedSystemKind(bytes32 expected, bytes32 actual);
error MissingAssociatedSystem(bytes32 id);
event AssociatedSystemSet(
bytes32 indexed kind,
bytes32 indexed id,
address proxy,
address impl
);
function getAssociatedSystem(bytes32 id) external view returns (address addr, bytes32 kind);
function initOrUpgradeNft(
bytes32 id,
string memory name,
string memory symbol,
string memory uri,
address impl
) external;
function initOrUpgradeToken(
bytes32 id,
string memory name,
string memory symbol,
uint8 decimals,
address impl
) external;
function registerUnmanagedSystem(bytes32 id, address endpoint) external;
error InvalidMessage();
error NotCcipRouter(address);
error UnsupportedNetwork(uint64);
function ccipReceive(CcipClient.Any2EVMMessage memory message) external;
error AccountActivityTimeoutPending(
uint128 accountId,
uint256 currentTime,
uint256 requiredTime
);
error CollateralDepositDisabled(address collateralType);
error CollateralNotFound();
error FailedTransfer(address from, address to, uint256 value);
error InsufficentAvailableCollateral(
uint256 amountAvailableForDelegationD18,
uint256 amountD18
);
error InsufficientAccountCollateral(uint256 amount);
error InsufficientAllowance(uint256 required, uint256 existing);
error InvalidParameter(string parameter, string reason);
error OverflowUint256ToUint64();
error PrecisionLost(uint256 tokenAmount, uint8 decimals);
event CollateralLockCreated(
uint128 indexed accountId,
address indexed collateralType,
uint256 tokenAmount,
uint64 expireTimestamp
);
event CollateralLockExpired(
uint128 indexed accountId,
address indexed collateralType,
uint256 tokenAmount,
uint64 expireTimestamp
);
event Deposited(
uint128 indexed accountId,
address indexed collateralType,
uint256 tokenAmount,
address indexed sender
);
event Withdrawn(
uint128 indexed accountId,
address indexed collateralType,
uint256 tokenAmount,
address indexed sender
);
function cleanExpiredLocks(
uint128 accountId,
address collateralType,
uint256 offset,
uint256 count
) external returns (uint256 cleared);
function createLock(
uint128 accountId,
address collateralType,
uint256 amount,
uint64 expireTimestamp
) external;
function deposit(uint128 accountId, address collateralType, uint256 tokenAmount) external;
function getAccountAvailableCollateral(
uint128 accountId,
address collateralType
) external view returns (uint256);
function getAccountCollateral(
uint128 accountId,
address collateralType
) external view returns (uint256 totalDeposited, uint256 totalAssigned, uint256 totalLocked);
function getLocks(
uint128 accountId,
address collateralType,
uint256 offset,
uint256 count
) external view returns (CollateralLock.Data[] memory locks);
function withdraw(uint128 accountId, address collateralType, uint256 tokenAmount) external;
event CollateralConfigured(address indexed collateralType, CollateralConfiguration.Data config);
function configureCollateral(CollateralConfiguration.Data memory config) external;
function getCollateralConfiguration(
address collateralType
) external pure returns (CollateralConfiguration.Data memory);
function getCollateralConfigurations(
bool hideDisabled
) external view returns (CollateralConfiguration.Data[] memory);
function getCollateralPrice(address collateralType) external view returns (uint256);
error InsufficientCcipFee(uint256 requiredAmount, uint256 availableAmount);
event TransferCrossChainInitiated(
uint64 indexed destChainId,
uint256 indexed amount,
address sender
);
function transferCrossChain(
uint64 destChainId,
uint256 amount
) external payable returns (uint256 gasTokenUsed);
error InsufficientDebt(int256 currentDebt);
error PoolNotFound(uint128 poolId);
event IssuanceFeePaid(
uint128 indexed accountId,
uint128 indexed poolId,
address collateralType,
uint256 feeAmount
);
event UsdBurned(
uint128 indexed accountId,
uint128 indexed poolId,
address collateralType,
uint256 amount,
address indexed sender
);
event UsdMinted(
uint128 indexed accountId,
uint128 indexed poolId,
address collateralType,
uint256 amount,
address indexed sender
);
function burnUsd(
uint128 accountId,
uint128 poolId,
address collateralType,
uint256 amount
) external;
function mintUsd(
uint128 accountId,
uint128 poolId,
address collateralType,
uint256 amount
) external;
error CannotScaleEmptyMapping();
error IneligibleForLiquidation(
uint256 collateralValue,
int256 debt,
uint256 currentCRatio,
uint256 cratio
);
error InsufficientMappedAmount();
error MustBeVaultLiquidated();
error OverflowInt128ToUint128();
event Liquidation(
uint128 indexed accountId,
uint128 indexed poolId,
address indexed collateralType,
ILiquidationModule.LiquidationData liquidationData,
uint128 liquidateAsAccountId,
address sender
);
event VaultLiquidation(
uint128 indexed poolId,
address indexed collateralType,
ILiquidationModule.LiquidationData liquidationData,
uint128 liquidateAsAccountId,
address sender
);
function isPositionLiquidatable(
uint128 accountId,
uint128 poolId,
address collateralType
) external returns (bool);
function isVaultLiquidatable(uint128 poolId, address collateralType) external returns (bool);
function liquidate(
uint128 accountId,
uint128 poolId,
address collateralType,
uint128 liquidateAsAccountId
) external returns (ILiquidationModule.LiquidationData memory liquidationData);
function liquidateVault(
uint128 poolId,
address collateralType,
uint128 liquidateAsAccountId,
uint256 maxUsd
) external returns (ILiquidationModule.LiquidationData memory liquidationData);
error InsufficientMarketCollateralDepositable(
uint128 marketId,
address collateralType,
uint256 tokenAmountToDeposit
);
error InsufficientMarketCollateralWithdrawable(
uint128 marketId,
address collateralType,
uint256 tokenAmountToWithdraw
);
event MarketCollateralDeposited(
uint128 indexed marketId,
address indexed collateralType,
uint256 tokenAmount,
address indexed sender,
int128 creditCapacity,
int128 netIssuance,
uint256 depositedCollateralValue,
uint256 reportedDebt
);
event MarketCollateralWithdrawn(
uint128 indexed marketId,
address indexed collateralType,
uint256 tokenAmount,
address indexed sender,
int128 creditCapacity,
int128 netIssuance,
uint256 depositedCollateralValue,
uint256 reportedDebt
);
event MaximumMarketCollateralConfigured(
uint128 indexed marketId,
address indexed collateralType,
uint256 systemAmount,
address indexed owner
);
function configureMaximumMarketCollateral(
uint128 marketId,
address collateralType,
uint256 amount
) external;
function depositMarketCollateral(
uint128 marketId,
address collateralType,
uint256 tokenAmount
) external;
function getMarketCollateralAmount(
uint128 marketId,
address collateralType
) external view returns (uint256 collateralAmountD18);
function getMarketCollateralValue(uint128 marketId) external view returns (uint256);
function getMaximumMarketCollateral(
uint128 marketId,
address collateralType
) external view returns (uint256);
function withdrawMarketCollateral(
uint128 marketId,
address collateralType,
uint256 tokenAmount
) external;
error IncorrectMarketInterface(address market);
error NotEnoughLiquidity(uint128 marketId, uint256 amount);
event MarketRegistered(
address indexed market,
uint128 indexed marketId,
address indexed sender
);
event MarketSystemFeePaid(uint128 indexed marketId, uint256 feeAmount);
event MarketUsdDeposited(
uint128 indexed marketId,
address indexed target,
uint256 amount,
address indexed market,
int128 creditCapacity,
int128 netIssuance,
uint256 depositedCollateralValue,
uint256 reportedDebt
);
event MarketUsdWithdrawn(
uint128 indexed marketId,
address indexed target,
uint256 amount,
address indexed market,
int128 creditCapacity,
int128 netIssuance,
uint256 depositedCollateralValue,
uint256 reportedDebt
);
event SetMarketMinLiquidityRatio(uint128 indexed marketId, uint256 minLiquidityRatio);
event SetMinDelegateTime(uint128 indexed marketId, uint32 minDelegateTime);
function depositMarketUsd(
uint128 marketId,
address target,
uint256 amount
) external returns (uint256 feeAmount);
function distributeDebtToPools(uint128 marketId, uint256 maxIter) external returns (bool);
function getMarketAddress(uint128 marketId) external view returns (address);
function getMarketCollateral(uint128 marketId) external view returns (uint256);
function getMarketDebtPerShare(uint128 marketId) external returns (int256);
function getMarketFees(
uint128,
uint256 amount
) external view returns (uint256 depositFeeAmount, uint256 withdrawFeeAmount);
function getMarketMinDelegateTime(uint128 marketId) external view returns (uint32);
function getMarketNetIssuance(uint128 marketId) external view returns (int128);
function getMarketPoolDebtDistribution(
uint128 marketId,
uint128 poolId
) external returns (uint256 sharesD18, uint128 totalSharesD18, int128 valuePerShareD27);
function getMarketPools(
uint128 marketId
) external returns (uint128[] memory inRangePoolIds, uint128[] memory outRangePoolIds);
function getMarketReportedDebt(uint128 marketId) external view returns (uint256);
function getMarketTotalDebt(uint128 marketId) external view returns (int256);
function getMinLiquidityRatio(uint128 marketId) external view returns (uint256);
function getOracleManager() external view returns (address);
function getUsdToken() external view returns (address);
function getWithdrawableMarketUsd(uint128 marketId) external view returns (uint256);
function isMarketCapacityLocked(uint128 marketId) external view returns (bool);
function registerMarket(address market) external returns (uint128 marketId);
function setMarketMinDelegateTime(uint128 marketId, uint32 minDelegateTime) external;
function setMinLiquidityRatio(uint128 marketId, uint256 minLiquidityRatio) external;
function withdrawMarketUsd(
uint128 marketId,
address target,
uint256 amount
) external returns (uint256 feeAmount);
error DeniedMulticallTarget(address);
error RecursiveMulticall(address);
function multicall(bytes[] memory data) external returns (bytes[] memory results);
event PoolApprovedAdded(uint256 poolId);
event PoolApprovedRemoved(uint256 poolId);
event PreferredPoolSet(uint256 poolId);
function addApprovedPool(uint128 poolId) external;
function getApprovedPools() external view returns (uint256[] memory);
function getPreferredPool() external view returns (uint128);
function removeApprovedPool(uint128 poolId) external;
function setPreferredPool(uint128 poolId) external;
error CapacityLocked(uint256 marketId);
error MinDelegationTimeoutPending(uint128 poolId, uint32 timeRemaining);
error PoolAlreadyExists(uint128 poolId);
event PoolCollateralConfigurationUpdated(
uint128 indexed poolId,
address collateralType,
PoolCollateralConfiguration.Data config
);
event PoolCollateralDisabledByDefaultSet(uint128 poolId, bool disabled);
event PoolConfigurationSet(
uint128 indexed poolId,
MarketConfiguration.Data[] markets,
address indexed sender
);
event PoolCreated(uint128 indexed poolId, address indexed owner, address indexed sender);
event PoolNameUpdated(uint128 indexed poolId, string name, address indexed sender);
event PoolNominationRenounced(uint128 indexed poolId, address indexed owner);
event PoolNominationRevoked(uint128 indexed poolId, address indexed owner);
event PoolOwnerNominated(
uint128 indexed poolId,
address indexed nominatedOwner,
address indexed owner
);
event PoolOwnershipAccepted(uint128 indexed poolId, address indexed owner);
event SetMinLiquidityRatio(uint256 minLiquidityRatio);
function acceptPoolOwnership(uint128 poolId) external;
function createPool(uint128 requestedPoolId, address owner) external;
function getMinLiquidityRatio() external view returns (uint256);
function getNominatedPoolOwner(uint128 poolId) external view returns (address);
function getPoolCollateralConfiguration(
uint128 poolId,
address collateralType
) external view returns (PoolCollateralConfiguration.Data memory config);
function getPoolCollateralIssuanceRatio(
uint128 poolId,
address collateral
) external view returns (uint256);
function getPoolConfiguration(
uint128 poolId
) external view returns (MarketConfiguration.Data[] memory);
function getPoolName(uint128 poolId) external view returns (string memory poolName);
function getPoolOwner(uint128 poolId) external view returns (address);
function nominatePoolOwner(address nominatedOwner, uint128 poolId) external;
function rebalancePool(uint128 poolId, address optionalCollateralType) external;
function renouncePoolNomination(uint128 poolId) external;
function revokePoolNomination(uint128 poolId) external;
function setMinLiquidityRatio(uint256 minLiquidityRatio) external;
function setPoolCollateralConfiguration(
uint128 poolId,
address collateralType,
PoolCollateralConfiguration.Data memory newConfig
) external;
function setPoolCollateralDisabledByDefault(uint128 poolId, bool disabled) external;
function setPoolConfiguration(
uint128 poolId,
MarketConfiguration.Data[] memory newMarketConfigurations
) external;
function setPoolName(uint128 poolId, string memory name) external;
error OverflowUint256ToUint32();
error OverflowUint32ToInt32();
error OverflowUint64ToInt64();
error RewardDistributorNotFound();
error RewardUnavailable(address distributor);
event RewardsClaimed(
uint128 indexed accountId,
uint128 indexed poolId,
address indexed collateralType,
address distributor,
uint256 amount
);
event RewardsDistributed(
uint128 indexed poolId,
address indexed collateralType,
address distributor,
uint256 amount,
uint256 start,
uint256 duration
);
event RewardsDistributorRegistered(
uint128 indexed poolId,
address indexed collateralType,
address indexed distributor
);
event RewardsDistributorRemoved(
uint128 indexed poolId,
address indexed collateralType,
address indexed distributor
);
function claimRewards(
uint128 accountId,
uint128 poolId,
address collateralType,
address distributor
) external returns (uint256);
function distributeRewards(
uint128 poolId,
address collateralType,
uint256 amount,
uint64 start,
uint32 duration
) external;
function getRewardRate(
uint128 poolId,
address collateralType,
address distributor
) external view returns (uint256);
function registerRewardsDistributor(
uint128 poolId,
address collateralType,
address distributor
) external;
function removeRewardsDistributor(
uint128 poolId,
address collateralType,
address distributor
) external;
function updateRewards(
uint128 poolId,
address collateralType,
uint128 accountId
) external returns (uint256[] memory, address[] memory);
event NewSupportedCrossChainNetwork(uint64 newChainId);
function configureChainlinkCrossChain(address ccipRouter, address ccipTokenPool) external;
function configureOracleManager(address oracleManagerAddress) external;
function getConfig(bytes32 k) external view returns (bytes32 v);
function getConfigAddress(bytes32 k) external view returns (address v);
function getConfigUint(bytes32 k) external view returns (uint256 v);
function getTrustedForwarder() external pure returns (address);
function isTrustedForwarder(address forwarder) external pure returns (bool);
function setConfig(bytes32 k, bytes32 v) external;
function setSupportedCrossChainNetworks(
uint64[] memory supportedNetworks,
uint64[] memory ccipSelectors
) external returns (uint256 numRegistered);
function supportsInterface(bytes4 interfaceId) external view returns (bool);
error InsufficientDelegation(uint256 minDelegation);
error InvalidCollateralAmount();
error InvalidLeverage(uint256 leverage);
error PoolCollateralLimitExceeded(
uint128 poolId,
address collateralType,
uint256 currentCollateral,
uint256 maxCollateral
);
event DelegationUpdated(
uint128 indexed accountId,
uint128 indexed poolId,
address collateralType,
uint256 amount,
uint256 leverage,
address indexed sender
);
function delegateCollateral(
uint128 accountId,
uint128 poolId,
address collateralType,
uint256 newCollateralAmountD18,
uint256 leverage
) external;
function getPosition(
uint128 accountId,
uint128 poolId,
address collateralType
)
external
returns (
uint256 collateralAmount,
uint256 collateralValue,
int256 debt,
uint256 collateralizationRatio
);
function getPositionCollateral(
uint128 accountId,
uint128 poolId,
address collateralType
) external view returns (uint256 amount);
function getPositionCollateralRatio(
uint128 accountId,
uint128 poolId,
address collateralType
) external returns (uint256);
function getPositionDebt(
uint128 accountId,
uint128 poolId,
address collateralType
) external returns (int256 debt);
function getVaultCollateral(
uint128 poolId,
address collateralType
) external view returns (uint256 amount, uint256 value);
function getVaultCollateralRatio(
uint128 poolId,
address collateralType
) external returns (uint256);
function getVaultDebt(uint128 poolId, address collateralType) external returns (int256);
}
interface IAccountModule {
struct AccountPermissions {
address user;
bytes32[] permissions;
}
}
interface CcipClient {
struct EVMTokenAmount {
address token;
uint256 amount;
}
struct Any2EVMMessage {
bytes32 messageId;
uint64 sourceChainSelector;
bytes sender;
bytes data;
EVMTokenAmount[] tokenAmounts;
}
}
interface CollateralLock {
struct Data {
uint128 amountD18;
uint64 lockExpirationTime;
}
}
interface CollateralConfiguration {
struct Data {
bool depositingEnabled;
uint256 issuanceRatioD18;
uint256 liquidationRatioD18;
uint256 liquidationRewardD18;
bytes32 oracleNodeId;
address tokenAddress;
uint256 minDelegationD18;
}
}
interface ILiquidationModule {
struct LiquidationData {
uint256 debtLiquidated;
uint256 collateralLiquidated;
uint256 amountRewarded;
}
}
interface PoolCollateralConfiguration {
struct Data {
uint256 collateralLimitD18;
uint256 issuanceRatioD18;
}
}
interface MarketConfiguration {
struct Data {
uint128 marketId;
uint128 weightD18;
int128 maxDebtShareValueD18;
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "paris",
"remappings": [
"@synthetixio/core-contracts/=lib/synthetix-v3/utils/core-contracts/",
"@synthetixio/main/=lib/synthetix-v3/protocol/synthetix/",
"ds-test/=lib/ds-test/src/",
"forge-std/=lib/forge-std/src/",
"synthetix-v3/=lib/synthetix-v3/auxiliary/TrustedMulticallForwarder/src/"
],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"rewardManager_","type":"address"},{"internalType":"uint128","name":"poolId_","type":"uint128"},{"internalType":"address","name":"collateralType_","type":"address"},{"internalType":"address","name":"payoutToken_","type":"address"},{"internalType":"uint8","name":"payoutTokenDecimals_","type":"uint8"},{"internalType":"string","name":"name_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"FailedTransfer","type":"error"},{"inputs":[{"internalType":"string","name":"parameter","type":"string"},{"internalType":"string","name":"reason","type":"string"}],"name":"InvalidParameter","type":"error"},{"inputs":[{"internalType":"uint256","name":"amountRequested","type":"uint256"},{"internalType":"uint256","name":"currentBalance","type":"uint256"}],"name":"NotEnoughBalance","type":"error"},{"inputs":[{"internalType":"uint256","name":"amountRequested","type":"uint256"},{"internalType":"uint256","name":"amountLeft","type":"uint256"}],"name":"NotEnoughRewardsLeft","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"SYSTEM_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralType","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"poolId_","type":"uint128"},{"internalType":"address","name":"collateralType_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint64","name":"start_","type":"uint64"},{"internalType":"uint32","name":"duration_","type":"uint32"}],"name":"distributeRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"","type":"uint128"},{"internalType":"uint128","name":"","type":"uint128"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"onPositionUpdated","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"","type":"uint128"},{"internalType":"uint128","name":"poolId_","type":"uint128"},{"internalType":"address","name":"collateralType_","type":"address"},{"internalType":"address","name":"payoutTarget_","type":"address"},{"internalType":"uint256","name":"payoutAmount_","type":"uint256"}],"name":"payout","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"payoutToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolId","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"precision","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"shouldFailPayout_","type":"bool"}],"name":"setShouldFailPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shouldFailPayout","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405260006007553480156200001657600080fd5b506040516200134d3803806200134d83398101604081905262000039916200029d565b600080546001600160a01b03199081166001600160a01b0389811691909117909255600180546001600160801b0319166001600160801b038916179055600280548216878416179055600380549091169185169190911790556004620000a0828262000451565b5060408051600481526024810182526020810180516001600160e01b031663313ce56760e01b179052905160009182916001600160a01b03871691620000e6916200051d565b600060405180830381855afa9150503d806000811462000123576040519150601f19603f3d011682016040523d82523d6000602084013e62000128565b606091505b50915091508180156200013c575060008151115b80156200016457508360ff16818060200190518101906200015e91906200053b565b60ff1614155b15620002135760408051634bab873760e11b81526004810191909152601360448201527f7061796f7574546f6b656e446563696d616c7300000000000000000000000000606482015260806024820152603b60848201527f53706563696669656420746f6b656e20646563696d616c7320646f206e6f742060a48201527f6d617463682061637475616c20746f6b656e20646563696d616c73000000000060c482015260e40160405180910390fd5b6200022084600a62000675565b60055550620006869650505050505050565b80516001600160a01b03811681146200024a57600080fd5b919050565b805160ff811681146200024a57600080fd5b634e487b7160e01b600052604160045260246000fd5b60005b83811015620002945781810151838201526020016200027a565b50506000910152565b60008060008060008060c08789031215620002b757600080fd5b620002c28762000232565b60208801519096506001600160801b0381168114620002e057600080fd5b9450620002f06040880162000232565b9350620003006060880162000232565b925062000310608088016200024f565b60a08801519092506001600160401b03808211156200032e57600080fd5b818901915089601f8301126200034357600080fd5b81518181111562000358576200035862000261565b604051601f8201601f19908116603f0116810190838211818310171562000383576200038362000261565b816040528281528c60208487010111156200039d57600080fd5b620003b083602083016020880162000277565b80955050505050509295509295509295565b600181811c90821680620003d757607f821691505b602082108103620003f857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200044c57600081815260208120601f850160051c81016020861015620004275750805b601f850160051c820191505b81811015620004485782815560010162000433565b5050505b505050565b81516001600160401b038111156200046d576200046d62000261565b62000485816200047e8454620003c2565b84620003fe565b602080601f831160018114620004bd5760008415620004a45750858301515b600019600386901b1c1916600185901b17855562000448565b600085815260208120601f198616915b82811015620004ee57888601518255948401946001909101908401620004cd565b50858210156200050d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600082516200053181846020870162000277565b9190910192915050565b6000602082840312156200054e57600080fd5b62000559826200024f565b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005b75781600019048211156200059b576200059b62000560565b80851615620005a957918102915b93841c93908002906200057b565b509250929050565b600082620005d0575060016200066f565b81620005df575060006200066f565b8160018114620005f85760028114620006035762000623565b60019150506200066f565b60ff84111562000617576200061762000560565b50506001821b6200066f565b5060208310610133831016604e8410600b841016171562000648575081810a6200066f565b62000654838362000576565b80600019048211156200066b576200066b62000560565b0290505b92915050565b60006200055960ff841683620005bf565b610cb780620006966000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80635a7ff7c511610097578063d3b5dc3b11610066578063d3b5dc3b14610213578063dba251611461021c578063e824600f1461022b578063fc0c546a1461023e57600080fd5b80635a7ff7c5146101c25780639a99916f146101d5578063c13d995c146101e9578063d221e7f21461020057600080fd5b80630f4ef8a6116100d35780630f4ef8a61461014457806310e23da41461016f5780633e0dc34e146101845780634efa82b6146101af57600080fd5b806301ffc9a7146100fa57806306fdde03146101225780630effe8b514610137575b600080fd5b61010d610108366004610880565b61024f565b60405190151581526020015b60405180910390f35b61012a610286565b60405161011991906108d5565b60065461010d9060ff1681565b600054610157906001600160a01b031681565b6040516001600160a01b039091168152602001610119565b61018261017d366004610919565b610314565b005b600154610197906001600160801b031681565b6040516001600160801b039091168152602001610119565b600354610157906001600160a01b031681565b6101826101d0366004610967565b6103d8565b6101826101e33660046109e3565b50505050565b6101f260075481565b604051908152602001610119565b61010d61020e366004610a30565b61064b565b6101f260055481565b6101f2670de0b6b3a764000081565b600254610157906001600160a01b031681565b6003546001600160a01b0316610157565b60006001600160e01b03198216632c927f3d60e21b148061028057506001600160e01b031982166301ffc9a760e01b145b92915050565b6004805461029390610a90565b80601f01602080910402602001604051908101604052809291908181526020018280546102bf90610a90565b801561030c5780601f106102e15761010080835404028352916020019161030c565b820191906000526020600020905b8154815290600101906020018083116102ef57829003601f168201915b505050505081565b600054600154604051635deebe2d60e11b81526001600160801b0390911660048201526001600160a01b039091169063bbdd7c5a90602401602060405180830381865afa158015610369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038d9190610aca565b6001600160a01b0316336001600160a01b0316146103c55760405163472511eb60e11b81523360048201526024015b60405180910390fd5b6006805460ff1916911515919091179055565b600054600154604051635deebe2d60e11b81526001600160801b0390911660048201526001600160a01b039091169063bbdd7c5a90602401602060405180830381865afa15801561042d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104519190610aca565b6001600160a01b0316336001600160a01b0316146104845760405163472511eb60e11b81523360048201526024016103bc565b6001546001600160801b038681169116146104b257604051634bab873760e11b81526004016103bc90610ae7565b6002546001600160a01b038581169116146104e057604051634bab873760e11b81526004016103bc90610b49565b826007546104ee9190610bd0565b6007556003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561053a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055e9190610be3565b905080600754111561058d57604051634787a10360e11b815260048101859052602481018290526044016103bc565b6005546000906105a5670de0b6b3a764000087610bfc565b6105af9190610c13565b600054604051635a7ff7c560e01b81526001600160801b038a1660048201526001600160a01b0389811660248301526044820184905267ffffffffffffffff8816606483015263ffffffff87166084830152929350911690635a7ff7c59060a401600060405180830381600087803b15801561062a57600080fd5b505af115801561063e573d6000803e3d6000fd5b5050505050505050505050565b60065460009060ff16156106615750600061076e565b6000546001600160a01b0316331461068e5760405163472511eb60e11b81523360048201526024016103bc565b6001546001600160801b038681169116146106bc57604051634bab873760e11b81526004016103bc90610ae7565b6002546001600160a01b038581169116146106ea57604051634bab873760e11b81526004016103bc90610b49565b6000670de0b6b3a7640000600554846107039190610bfc565b61070d9190610c13565b90506007548111156107405760075460405163a1b1d25960e01b81526103bc918391600401918252602082015260400190565b8060075461074e9190610c35565b600755600354610768906001600160a01b03168583610777565b60019150505b95945050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916107d39190610c48565b6000604051808303816000865af19150503d8060008114610810576040519150601f19603f3d011682016040523d82523d6000602084013e610815565b606091505b509150915081158061084357508051158015906108435750808060200190518101906108419190610c64565b155b1561087957604051633210e1d960e01b81523060048201526001600160a01b0385166024820152604481018490526064016103bc565b5050505050565b60006020828403121561089257600080fd5b81356001600160e01b0319811681146108aa57600080fd5b9392505050565b60005b838110156108cc5781810151838201526020016108b4565b50506000910152565b60208152600082518060208401526108f48160408501602087016108b1565b601f01601f19169190910160400192915050565b801515811461091657600080fd5b50565b60006020828403121561092b57600080fd5b81356108aa81610908565b80356001600160801b038116811461094d57600080fd5b919050565b6001600160a01b038116811461091657600080fd5b600080600080600060a0868803121561097f57600080fd5b61098886610936565b9450602086013561099881610952565b935060408601359250606086013567ffffffffffffffff811681146109bc57600080fd5b9150608086013563ffffffff811681146109d557600080fd5b809150509295509295909350565b600080600080608085870312156109f957600080fd5b610a0285610936565b9350610a1060208601610936565b92506040850135610a2081610952565b9396929550929360600135925050565b600080600080600060a08688031215610a4857600080fd5b610a5186610936565b9450610a5f60208701610936565b93506040860135610a6f81610952565b92506060860135610a7f81610952565b949793965091946080013592915050565b600181811c90821680610aa457607f821691505b602082108103610ac457634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215610adc57600080fd5b81516108aa81610952565b6040808252600690820152651c1bdbdb125960d21b60608201526080602082018190526024908201527f506f6f6c20646f6573206e6f74206d617463682074686520726577617264732060a0820152631c1bdbdb60e21b60c082015260e00190565b6040808252600e908201526d636f6c6c61746572616c5479706560901b6060820152608060208201819052602b908201527f436f6c6c61746572616c20646f6573206e6f74206d617463682074686520726560a08201526a3bb0b93239903a37b5b2b760a91b60c082015260e00190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561028057610280610bba565b600060208284031215610bf557600080fd5b5051919050565b808202811582820484141761028057610280610bba565b600082610c3057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561028057610280610bba565b60008251610c5a8184602087016108b1565b9190910192915050565b600060208284031215610c7657600080fd5b81516108aa8161090856fea2646970667358221220ff025f6d5838be6596ba2c13b71518ed50cbbc36538bdf85f714b90be05a35e164736f6c63430008150033000000000000000000000000ffffffaeff0b96ea8e4f94b2253f31abdd8758470000000000000000000000000000000000000000000000000000000000000001000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000912ce59144191c1204e64559fe8253a0e49e6548000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002c5370617274616e20436f756e63696c20506f6f6c20415242205265776172647320666f722055534443204c500000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c80635a7ff7c511610097578063d3b5dc3b11610066578063d3b5dc3b14610213578063dba251611461021c578063e824600f1461022b578063fc0c546a1461023e57600080fd5b80635a7ff7c5146101c25780639a99916f146101d5578063c13d995c146101e9578063d221e7f21461020057600080fd5b80630f4ef8a6116100d35780630f4ef8a61461014457806310e23da41461016f5780633e0dc34e146101845780634efa82b6146101af57600080fd5b806301ffc9a7146100fa57806306fdde03146101225780630effe8b514610137575b600080fd5b61010d610108366004610880565b61024f565b60405190151581526020015b60405180910390f35b61012a610286565b60405161011991906108d5565b60065461010d9060ff1681565b600054610157906001600160a01b031681565b6040516001600160a01b039091168152602001610119565b61018261017d366004610919565b610314565b005b600154610197906001600160801b031681565b6040516001600160801b039091168152602001610119565b600354610157906001600160a01b031681565b6101826101d0366004610967565b6103d8565b6101826101e33660046109e3565b50505050565b6101f260075481565b604051908152602001610119565b61010d61020e366004610a30565b61064b565b6101f260055481565b6101f2670de0b6b3a764000081565b600254610157906001600160a01b031681565b6003546001600160a01b0316610157565b60006001600160e01b03198216632c927f3d60e21b148061028057506001600160e01b031982166301ffc9a760e01b145b92915050565b6004805461029390610a90565b80601f01602080910402602001604051908101604052809291908181526020018280546102bf90610a90565b801561030c5780601f106102e15761010080835404028352916020019161030c565b820191906000526020600020905b8154815290600101906020018083116102ef57829003601f168201915b505050505081565b600054600154604051635deebe2d60e11b81526001600160801b0390911660048201526001600160a01b039091169063bbdd7c5a90602401602060405180830381865afa158015610369573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061038d9190610aca565b6001600160a01b0316336001600160a01b0316146103c55760405163472511eb60e11b81523360048201526024015b60405180910390fd5b6006805460ff1916911515919091179055565b600054600154604051635deebe2d60e11b81526001600160801b0390911660048201526001600160a01b039091169063bbdd7c5a90602401602060405180830381865afa15801561042d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104519190610aca565b6001600160a01b0316336001600160a01b0316146104845760405163472511eb60e11b81523360048201526024016103bc565b6001546001600160801b038681169116146104b257604051634bab873760e11b81526004016103bc90610ae7565b6002546001600160a01b038581169116146104e057604051634bab873760e11b81526004016103bc90610b49565b826007546104ee9190610bd0565b6007556003546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561053a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055e9190610be3565b905080600754111561058d57604051634787a10360e11b815260048101859052602481018290526044016103bc565b6005546000906105a5670de0b6b3a764000087610bfc565b6105af9190610c13565b600054604051635a7ff7c560e01b81526001600160801b038a1660048201526001600160a01b0389811660248301526044820184905267ffffffffffffffff8816606483015263ffffffff87166084830152929350911690635a7ff7c59060a401600060405180830381600087803b15801561062a57600080fd5b505af115801561063e573d6000803e3d6000fd5b5050505050505050505050565b60065460009060ff16156106615750600061076e565b6000546001600160a01b0316331461068e5760405163472511eb60e11b81523360048201526024016103bc565b6001546001600160801b038681169116146106bc57604051634bab873760e11b81526004016103bc90610ae7565b6002546001600160a01b038581169116146106ea57604051634bab873760e11b81526004016103bc90610b49565b6000670de0b6b3a7640000600554846107039190610bfc565b61070d9190610c13565b90506007548111156107405760075460405163a1b1d25960e01b81526103bc918391600401918252602082015260400190565b8060075461074e9190610c35565b600755600354610768906001600160a01b03168583610777565b60019150505b95945050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916107d39190610c48565b6000604051808303816000865af19150503d8060008114610810576040519150601f19603f3d011682016040523d82523d6000602084013e610815565b606091505b509150915081158061084357508051158015906108435750808060200190518101906108419190610c64565b155b1561087957604051633210e1d960e01b81523060048201526001600160a01b0385166024820152604481018490526064016103bc565b5050505050565b60006020828403121561089257600080fd5b81356001600160e01b0319811681146108aa57600080fd5b9392505050565b60005b838110156108cc5781810151838201526020016108b4565b50506000910152565b60208152600082518060208401526108f48160408501602087016108b1565b601f01601f19169190910160400192915050565b801515811461091657600080fd5b50565b60006020828403121561092b57600080fd5b81356108aa81610908565b80356001600160801b038116811461094d57600080fd5b919050565b6001600160a01b038116811461091657600080fd5b600080600080600060a0868803121561097f57600080fd5b61098886610936565b9450602086013561099881610952565b935060408601359250606086013567ffffffffffffffff811681146109bc57600080fd5b9150608086013563ffffffff811681146109d557600080fd5b809150509295509295909350565b600080600080608085870312156109f957600080fd5b610a0285610936565b9350610a1060208601610936565b92506040850135610a2081610952565b9396929550929360600135925050565b600080600080600060a08688031215610a4857600080fd5b610a5186610936565b9450610a5f60208701610936565b93506040860135610a6f81610952565b92506060860135610a7f81610952565b949793965091946080013592915050565b600181811c90821680610aa457607f821691505b602082108103610ac457634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215610adc57600080fd5b81516108aa81610952565b6040808252600690820152651c1bdbdb125960d21b60608201526080602082018190526024908201527f506f6f6c20646f6573206e6f74206d617463682074686520726577617264732060a0820152631c1bdbdb60e21b60c082015260e00190565b6040808252600e908201526d636f6c6c61746572616c5479706560901b6060820152608060208201819052602b908201527f436f6c6c61746572616c20646f6573206e6f74206d617463682074686520726560a08201526a3bb0b93239903a37b5b2b760a91b60c082015260e00190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561028057610280610bba565b600060208284031215610bf557600080fd5b5051919050565b808202811582820484141761028057610280610bba565b600082610c3057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561028057610280610bba565b60008251610c5a8184602087016108b1565b9190910192915050565b600060208284031215610c7657600080fd5b81516108aa8161090856fea2646970667358221220ff025f6d5838be6596ba2c13b71518ed50cbbc36538bdf85f714b90be05a35e164736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ffffffaeff0b96ea8e4f94b2253f31abdd8758470000000000000000000000000000000000000000000000000000000000000001000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831000000000000000000000000912ce59144191c1204e64559fe8253a0e49e6548000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000002c5370617274616e20436f756e63696c20506f6f6c20415242205265776172647320666f722055534443204c500000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : rewardManager_ (address): 0xffffffaEff0B96Ea8e4f94b2253f31abdD875847
Arg [1] : poolId_ (uint128): 1
Arg [2] : collateralType_ (address): 0xaf88d065e77c8cC2239327C5EDb3A432268e5831
Arg [3] : payoutToken_ (address): 0x912CE59144191C1204E64559FE8253a0e49E6548
Arg [4] : payoutTokenDecimals_ (uint8): 18
Arg [5] : name_ (string): Spartan Council Pool ARB Rewards for USDC LP
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000ffffffaeff0b96ea8e4f94b2253f31abdd875847
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 000000000000000000000000af88d065e77c8cc2239327c5edb3a432268e5831
Arg [3] : 000000000000000000000000912ce59144191c1204e64559fe8253a0e49e6548
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [6] : 000000000000000000000000000000000000000000000000000000000000002c
Arg [7] : 5370617274616e20436f756e63696c20506f6f6c204152422052657761726473
Arg [8] : 20666f722055534443204c500000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$91.64
Net Worth in ETH
0.032018
Token Allocations
ARB
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ARB | 100.00% | $0.169807 | 539.6455 | $91.64 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.