ETH Price: $2,862.01 (-2.70%)

Contract

0x8B6D6416017de3d1dCac4158Fe8a401C6B951fA8
Transaction Hash
Block
From
To

There are no matching entries

> 10 Token Transfers found.

Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RewardsDistributor

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
// 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);
}

File 3 of 8 : AccessError.sol
//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);
}

File 4 of 8 : ParameterError.sol
//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);
        }
    }
}

File 8 of 8 : ISynthetixCore.sol
// 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;
    }
}

Settings
{
  "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

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"}]

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


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.