ETH Price: $1,581.72 (-1.39%)
 

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Update Oracle222646012025-04-14 3:40:472 days ago1744602047IN
0x222222fD...3524d0137
0 ETH0.000709662.38566776
Swap Exact Input222374942025-04-10 9:00:596 days ago1744275659IN
0x222222fD...3524d0137
0 ETH0.000392892.12874938
Update Oracle222041222025-04-05 17:11:3511 days ago1743873095IN
0x222222fD...3524d0137
0 ETH0.000710962.39003859
Swap Exact Input221688452025-03-31 19:00:5916 days ago1743447659IN
0x222222fD...3524d0137
0 ETH0.001081422.32044844
Swap Exact Input221613802025-03-30 18:00:4717 days ago1743357647IN
0x222222fD...3524d0137
0 ETH0.00099992.14492375
Update Oracle221129382025-03-23 23:40:4723 days ago1742773247IN
0x222222fD...3524d0137
0 ETH0.000693122.33005934
Swap Exact Input220889852025-03-20 15:30:5927 days ago1742484659IN
0x222222fD...3524d0137
0 ETH0.001194912.56317938
Swap Exact Input220888362025-03-20 15:01:1127 days ago1742482871IN
0x222222fD...3524d0137
0 ETH0.001201822.60693547
Update Oracle220574172025-03-16 5:40:4731 days ago1742103647IN
0x222222fD...3524d0137
0 ETH0.000718362.4148978
Swap Exact Input220393052025-03-13 17:00:5934 days ago1741885259IN
0x222222fD...3524d0137
0 ETH0.001116572.39580401
Swap Exact Input220315482025-03-12 15:01:1135 days ago1741791671IN
0x222222fD...3524d0137
0 ETH0.000526352.85220697
Swap Exact Input220309502025-03-12 13:01:1135 days ago1741784471IN
0x222222fD...3524d0137
0 ETH0.000483582.62006579
Update Oracle219879112025-03-06 12:40:4741 days ago1741264847IN
0x222222fD...3524d0137
0 ETH0.000954943.20552732
Swap Exact Input219230552025-02-25 11:30:4750 days ago1740483047IN
0x222222fD...3524d0137
0 ETH0.001573323.37497586
Update Oracle219126682025-02-24 0:40:4751 days ago1740357647IN
0x222222fD...3524d0137
0 ETH0.000790682.65414117
Swap Exact Input218667062025-02-17 14:30:5958 days ago1739802659IN
0x222222fD...3524d0137
0 ETH0.0410417288.03950789
Update Oracle218625952025-02-17 0:40:4758 days ago1739752847IN
0x222222fD...3524d0137
0 ETH0.000785712.63746056
Swap Exact Input218610552025-02-16 19:30:4759 days ago1739734247IN
0x222222fD...3524d0137
0 ETH0.001105572.37160095
Swap Exact Input218580812025-02-16 9:30:4759 days ago1739698247IN
0x222222fD...3524d0137
0 ETH0.001033492.21690944
Swap Exact Input218527292025-02-15 15:30:4760 days ago1739633447IN
0x222222fD...3524d0137
0 ETH0.001068292.29163154
Swap Exact Input218476822025-02-14 22:30:4760 days ago1739572247IN
0x222222fD...3524d0137
0 ETH0.001123352.40966712
Swap Exact Input218222502025-02-11 9:00:4764 days ago1739264447IN
0x222222fD...3524d0137
0 ETH0.001102132.36409993
Swap Exact Input217950932025-02-07 14:01:1168 days ago1738936871IN
0x222222fD...3524d0137
0 ETH0.000808224.37900962
Swap Exact Input217944942025-02-07 12:01:1168 days ago1738929671IN
0x222222fD...3524d0137
0 ETH0.000432742.3446607
Swap Exact Input217939002025-02-07 10:01:1168 days ago1738922471IN
0x222222fD...3524d0137
0 ETH0.000489512.65221215
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x60806040189761702024-01-10 11:11:47462 days ago1704885107  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DiamondProxy

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000 runs

Other Settings:
paris EvmVersion
File 1 of 13 : DiamondProxy.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.19;

import { LibDiamond } from "./libraries/LibDiamond.sol";
import { LibStorage as s } from "./libraries/LibStorage.sol";

import "../utils/Errors.sol";
import "./Storage.sol";

/// @title DiamondProxy
/// @author Angle Labs, Inc.
/// @notice Implementation of a Diamond Proxy
/// @dev Reference: EIP-2535 Diamonds
/// @dev Forked from https://github.com/mudgen/diamond-3/blob/master/contracts/Diamond.sol by mudgen
contract DiamondProxy {
    constructor(FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) payable {
        LibDiamond.diamondCut(_diamondCut, _init, _calldata);
    }

    /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                       FALLBACK                                                     
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    /// @dev 1. Find the facet for the function that is called.
    /// @dev 2. Delegate the execution to the found facet via `delegatecall`.
    fallback() external payable {
        DiamondStorage storage ds = s.diamondStorage();
        // Get facet from function selector
        address facetAddress = ds.selectorInfo[msg.sig].facetAddress;
        if (facetAddress == address(0)) {
            revert FunctionNotFound(msg.sig);
        }

        assembly {
            // The pointer to the free memory slot
            let ptr := mload(0x40)
            // Copy function signature and arguments from calldata at zero position into memory at pointer position
            calldatacopy(ptr, 0, calldatasize())
            // Delegatecall method of the implementation contract returns 0 on error
            let result := delegatecall(gas(), facetAddress, ptr, calldatasize(), 0, 0)
            // Get the size of the last return data
            let size := returndatasize()
            // Copy the size length of bytes from return data at zero position to pointer position
            returndatacopy(ptr, 0, size)
            // Depending on the result value
            switch result
            case 0 {
                // End execution and revert state changes
                revert(ptr, size)
            }
            default {
                // Return data with length of size at pointers position
                return(ptr, size)
            }
        }
    }
}

File 2 of 13 : LibDiamond.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import { LibStorage as s } from "./LibStorage.sol";

import "../../utils/Errors.sol";
import "../Storage.sol";

/// @title LibDiamond
/// @author Angle Labs, Inc.
/// @notice Helper library to deal with diamond proxies.
/// @dev Reference: EIP-2535 Diamonds
/// @dev Forked from https://github.com/mudgen/diamond-3/blob/master/contracts/libraries/LibDiamond.sol by mudgen
library LibDiamond {
    event DiamondCut(FacetCut[] _diamondCut, address _init, bytes _calldata);

    /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                  INTERNAL FUNCTIONS                                                
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    /// @notice Checks whether `admin` has the governor role
    function isGovernor(address admin) internal view returns (bool) {
        return s.diamondStorage().accessControlManager.isGovernor(admin);
    }

    /// @notice Checks whether `admin` has the guardian role
    function isGovernorOrGuardian(address admin) internal view returns (bool) {
        return s.diamondStorage().accessControlManager.isGovernorOrGuardian(admin);
    }

    /// @notice Internal function version of `diamondCut`
    function diamondCut(FacetCut[] memory _diamondCut, address _init, bytes memory _calldata) internal {
        uint256 diamondCutLength = _diamondCut.length;
        for (uint256 facetIndex; facetIndex < diamondCutLength; facetIndex++) {
            bytes4[] memory functionSelectors = _diamondCut[facetIndex].functionSelectors;
            address facetAddress = _diamondCut[facetIndex].facetAddress;

            if (functionSelectors.length == 0) {
                revert NoSelectorsProvidedForFacetForCut(facetAddress);
            }

            FacetCutAction action = _diamondCut[facetIndex].action;
            if (action == FacetCutAction.Add) {
                _addFunctions(facetAddress, functionSelectors);
            } else if (action == FacetCutAction.Replace) {
                _replaceFunctions(facetAddress, functionSelectors);
            } else if (action == FacetCutAction.Remove) {
                _removeFunctions(facetAddress, functionSelectors);
            }
        }

        emit DiamondCut(_diamondCut, _init, _calldata);
        _initializeDiamondCut(_init, _calldata);
    }

    /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                   PRIVATE FUNCTIONS                                                
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    /// @notice Does a delegate call on `_init` with `_calldata`
    function _initializeDiamondCut(address _init, bytes memory _calldata) private {
        if (_init == address(0)) {
            return;
        }
        _enforceHasContractCode(_init);
        (bool success, bytes memory error) = _init.delegatecall(_calldata);
        if (!success) {
            if (error.length > 0) {
                assembly {
                    let returndata_size := mload(error)
                    revert(add(32, error), returndata_size)
                }
            } else {
                revert InitializationFunctionReverted(_init, _calldata);
            }
        }
    }

    /// @notice Adds a new function to the diamond proxy
    /// @dev Reverts if selectors are already existing
    function _addFunctions(address _facetAddress, bytes4[] memory _functionSelectors) private {
        if (_facetAddress == address(0)) {
            revert CannotAddSelectorsToZeroAddress(_functionSelectors);
        }
        DiamondStorage storage ds = s.diamondStorage();
        uint16 selectorCount = uint16(ds.selectors.length);
        _enforceHasContractCode(_facetAddress);
        uint256 functionSelectorsLength = _functionSelectors.length;
        for (uint256 selectorIndex; selectorIndex < functionSelectorsLength; selectorIndex++) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds.selectorInfo[selector].facetAddress;
            if (oldFacetAddress != address(0)) {
                revert CannotAddFunctionToDiamondThatAlreadyExists(selector);
            }
            ds.selectorInfo[selector] = FacetInfo(_facetAddress, selectorCount);
            ds.selectors.push(selector);
            selectorCount++;
        }
    }

    /// @notice Upgrades a function in the diamond proxy
    /// @dev Reverts if selectors do not already exist
    function _replaceFunctions(address _facetAddress, bytes4[] memory _functionSelectors) private {
        DiamondStorage storage ds = s.diamondStorage();
        if (_facetAddress == address(0)) {
            revert CannotReplaceFunctionsFromFacetWithZeroAddress(_functionSelectors);
        }
        _enforceHasContractCode(_facetAddress);
        uint256 functionSelectorsLength = _functionSelectors.length;
        for (uint256 selectorIndex; selectorIndex < functionSelectorsLength; selectorIndex++) {
            bytes4 selector = _functionSelectors[selectorIndex];
            address oldFacetAddress = ds.selectorInfo[selector].facetAddress;
            // Can't replace immutable functions -- functions defined directly in the diamond in this case
            if (oldFacetAddress == address(this)) {
                revert CannotReplaceImmutableFunction(selector);
            }
            if (oldFacetAddress == _facetAddress) {
                revert CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet(selector);
            }
            if (oldFacetAddress == address(0)) {
                revert CannotReplaceFunctionThatDoesNotExists(selector);
            }
            // Replace old facet address
            ds.selectorInfo[selector].facetAddress = _facetAddress;
        }
    }

    /// @notice Removes a function in the diamond proxy
    /// @dev Reverts if selectors do not already exist
    function _removeFunctions(address _facetAddress, bytes4[] memory _functionSelectors) private {
        DiamondStorage storage ds = s.diamondStorage();
        uint256 selectorCount = ds.selectors.length;
        if (_facetAddress != address(0)) {
            revert RemoveFacetAddressMustBeZeroAddress(_facetAddress);
        }
        uint256 functionSelectorsLength = _functionSelectors.length;
        for (uint256 selectorIndex; selectorIndex < functionSelectorsLength; selectorIndex++) {
            bytes4 selector = _functionSelectors[selectorIndex];
            FacetInfo memory oldFacetAddressAndSelectorPosition = ds.selectorInfo[selector];
            if (oldFacetAddressAndSelectorPosition.facetAddress == address(0)) {
                revert CannotRemoveFunctionThatDoesNotExist(selector);
            }

            // Can't remove immutable functions -- functions defined directly in the diamond
            if (oldFacetAddressAndSelectorPosition.facetAddress == address(this)) {
                revert CannotRemoveImmutableFunction(selector);
            }
            // Replace selector with last selector
            selectorCount--;
            if (oldFacetAddressAndSelectorPosition.selectorPosition != selectorCount) {
                bytes4 lastSelector = ds.selectors[selectorCount];
                ds.selectors[oldFacetAddressAndSelectorPosition.selectorPosition] = lastSelector;
                ds.selectorInfo[lastSelector].selectorPosition = oldFacetAddressAndSelectorPosition.selectorPosition;
            }
            // Delete last selector
            ds.selectors.pop();
            delete ds.selectorInfo[selector];
        }
    }

    /// @notice Checks that an address has a non void bytecode
    function _enforceHasContractCode(address _contract) private view {
        uint256 contractSize;
        assembly {
            contractSize := extcodesize(_contract)
        }
        if (contractSize == 0) {
            revert ContractHasNoCode();
        }
    }
}

File 3 of 13 : LibStorage.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.19;

import "../../utils/Constants.sol";
import { DiamondStorage, ImplementationStorage, TransmuterStorage } from "../Storage.sol";

/// @title LibStorage
/// @author Angle Labs, Inc.
library LibStorage {
    /// @notice Returns the storage struct stored at the `DIAMOND_STORAGE_POSITION` slot
    /// @dev This struct handles the logic of the different facets used in the diamond proxy
    function diamondStorage() internal pure returns (DiamondStorage storage ds) {
        bytes32 position = DIAMOND_STORAGE_POSITION;
        assembly {
            ds.slot := position
        }
    }

    /// @notice Returns the storage struct stored at the `TRANSMUTER_STORAGE_POSITION` slot
    /// @dev This struct handles the particular logic of the Transmuter system
    function transmuterStorage() internal pure returns (TransmuterStorage storage ts) {
        bytes32 position = TRANSMUTER_STORAGE_POSITION;
        assembly {
            ts.slot := position
        }
    }

    /// @notice Returns the storage struct stored at the `IMPLEMENTATION_STORAGE_POSITION` slot
    /// @dev This struct handles the logic for making the contract easily usable on Etherscan
    function implementationStorage() internal pure returns (ImplementationStorage storage ims) {
        bytes32 position = IMPLEMENTATION_STORAGE_POSITION;
        assembly {
            ims.slot := position
        }
    }
}

File 4 of 13 : Errors.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.19;

error AlreadyAdded();
error CannotAddFunctionToDiamondThatAlreadyExists(bytes4 _selector);
error CannotAddSelectorsToZeroAddress(bytes4[] _selectors);
error CannotRemoveFunctionThatDoesNotExist(bytes4 _selector);
error CannotRemoveImmutableFunction(bytes4 _selector);
error CannotReplaceFunctionsFromFacetWithZeroAddress(bytes4[] _selectors);
error CannotReplaceFunctionThatDoesNotExists(bytes4 _selector);
error CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet(bytes4 _selector);
error CannotReplaceImmutableFunction(bytes4 _selector);
error ContractHasNoCode();
error FunctionNotFound(bytes4 _functionSelector);
error IncorrectFacetCutAction(uint8 _action);
error InitializationFunctionReverted(address _initializationContractAddress, bytes _calldata);
error InvalidChainlinkRate();
error InvalidLengths();
error InvalidNegativeFees();
error InvalidOracleType();
error InvalidParam();
error InvalidParams();
error InvalidRate();
error InvalidSwap();
error InvalidTokens();
error ManagerHasAssets();
error NoSelectorsProvidedForFacetForCut(address _facetAddress);
error NotAllowed();
error NotCollateral();
error NotGovernor();
error NotGovernorOrGuardian();
error NotTrusted();
error NotWhitelisted();
error OneInchSwapFailed();
error Paused();
error ReentrantCall();
error RemoveFacetAddressMustBeZeroAddress(address _facetAddress);
error TooBigAmountIn();
error TooLate();
error TooSmallAmountOut();
error ZeroAddress();
error ZeroAmount();

File 5 of 13 : Storage.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity ^0.8.19;

import { IERC20 } from "oz/token/ERC20/IERC20.sol";
import { IAccessControlManager } from "interfaces/IAccessControlManager.sol";
import { IAgToken } from "interfaces/IAgToken.sol";

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                        ENUMS                                                      
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

enum FacetCutAction {
    Add,
    Replace,
    Remove
}

enum ManagerType {
    EXTERNAL
}

enum ActionType {
    Mint,
    Burn,
    Redeem
}

enum TrustedType {
    Updater,
    Seller
}

enum QuoteType {
    MintExactInput,
    MintExactOutput,
    BurnExactInput,
    BurnExactOutput
}

enum OracleReadType {
    CHAINLINK_FEEDS,
    EXTERNAL,
    NO_ORACLE,
    STABLE,
    WSTETH,
    CBETH,
    RETH,
    SFRXETH,
    PYTH
}

enum OracleQuoteType {
    UNIT,
    TARGET
}

enum WhitelistType {
    BACKED
}

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                    STRUCTS                                                     
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

struct Permit2Details {
    address to;                                  // Address that will receive the funds
    uint256 nonce;                               // Nonce of the transaction
    bytes signature;                             // Permit signature of the user
}

struct FacetCut {
    address facetAddress;                        // Facet contract address
    FacetCutAction action;                       // Can be add, remove or replace
    bytes4[] functionSelectors;                  // Ex. bytes4(keccak256("transfer(address,uint256)"))
}

struct Facet {
    address facetAddress;                        // Facet contract address
    bytes4[] functionSelectors;                  // Ex. bytes4(keccak256("transfer(address,uint256)"))
}

struct FacetInfo {
    address facetAddress;                        // Facet contract address
    uint16 selectorPosition;                     // Position in the list of all selectors
}

struct DiamondStorage {
    bytes4[] selectors;                          // List of all available selectors
    mapping(bytes4 => FacetInfo) selectorInfo;   // Selector to (address, position in list)
    IAccessControlManager accessControlManager;  // Contract handling access control
}

struct ImplementationStorage {
    address implementation;                      // Dummy implementation address for Etherscan usability
}

struct ManagerStorage {
    IERC20[] subCollaterals;                     // Subtokens handled by the manager or strategies
    bytes config;                                // Additional configuration data
}

struct Collateral {
    uint8 isManaged;                             // If the collateral is managed through external strategies
    uint8 isMintLive;                            // If minting from this asset is unpaused
    uint8 isBurnLive;                            // If burning to this asset is unpaused
    uint8 decimals;                              // IERC20Metadata(collateral).decimals()
    uint8 onlyWhitelisted;                       // If only whitelisted addresses can burn or redeem for this token
    uint216 normalizedStables;                   // Normalized amount of stablecoins issued from this collateral
    uint64[] xFeeMint;                           // Increasing exposures in [0,BASE_9[
    int64[] yFeeMint;                            // Mint fees at the exposures specified in `xFeeMint`
    uint64[] xFeeBurn;                           // Decreasing exposures in ]0,BASE_9]
    int64[] yFeeBurn;                            // Burn fees at the exposures specified in `xFeeBurn`
    bytes oracleConfig;                          // Data about the oracle used for the collateral
    bytes whitelistData;                         // For whitelisted collateral, data used to verify whitelists
    ManagerStorage managerData;                  // For managed collateral, data used to handle the strategies
}

struct TransmuterStorage {
    IAgToken agToken;                            // agToken handled by the system
    uint8 isRedemptionLive;                      // If redemption is unpaused
    uint8 statusReentrant;                        // If call is reentrant or not
    uint128 normalizedStables;                   // Normalized amount of stablecoins issued by the system
    uint128 normalizer;                          // To reconcile `normalizedStables` values with the actual amount
    address[] collateralList;                    // List of collateral assets supported by the system
    uint64[] xRedemptionCurve;                   // Increasing collateral ratios > 0
    int64[] yRedemptionCurve;                    // Value of the redemption fees at `xRedemptionCurve`
    mapping(address => Collateral) collaterals;  // Maps a collateral asset to its parameters
    mapping(address => uint256) isTrusted;       // If an address is trusted to update the normalizer value
    mapping(address => uint256) isSellerTrusted; // If an address is trusted to sell accruing reward tokens
    mapping(WhitelistType => mapping(address => uint256)) isWhitelistedForType;
                                                 // Whether an address is whitelisted for a specific whitelist type
}

File 6 of 13 : Constants.sol
// SPDX-License-Identifier: BUSL-1.1

pragma solidity >=0.5.0;

import { ICbETH } from "interfaces/external/coinbase/ICbETH.sol";
import { ISfrxETH } from "interfaces/external/frax/ISfrxETH.sol";
import { IStETH } from "interfaces/external/lido/IStETH.sol";
import { IRETH } from "interfaces/external/rocketPool/IRETH.sol";

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                 STORAGE SLOTS                                                  
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

/// @dev Storage position of `DiamondStorage` structure
/// @dev Equals `keccak256("diamond.standard.diamond.storage") - 1`
bytes32 constant DIAMOND_STORAGE_POSITION = 0xc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131b;

/// @dev Storage position of `TransmuterStorage` structure
/// @dev Equals `keccak256("diamond.standard.transmuter.storage") - 1`
bytes32 constant TRANSMUTER_STORAGE_POSITION = 0xc1f2f38dde3351ac0a64934139e816326caa800303a1235dc53707d0de05d8bd;

/// @dev Storage position of `ImplementationStorage` structure
/// @dev Equals `keccak256("eip1967.proxy.implementation") - 1`
bytes32 constant IMPLEMENTATION_STORAGE_POSITION = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                     MATHS                                                      
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

uint256 constant BASE_6 = 1e6;
uint256 constant BASE_8 = 1e8;
uint256 constant BASE_9 = 1e9;
uint256 constant BASE_12 = 1e12;
uint256 constant BASE_18 = 1e18;
uint256 constant HALF_BASE_27 = 1e27 / 2;
uint256 constant BASE_27 = 1e27;
uint256 constant BASE_36 = 1e36;
uint256 constant MAX_BURN_FEE = 999_000_000;
uint256 constant MAX_MINT_FEE = BASE_12 - 1;

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                     REENTRANT                                                      
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint8 constant NOT_ENTERED = 1;
uint8 constant ENTERED = 2;

/*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                               COMMON ADDRESSES                                                 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

address constant PERMIT_2 = 0x000000000022D473030F116dDEE9F6B43aC78BA3;
address constant ONE_INCH_ROUTER = 0x1111111254EEB25477B68fb85Ed929f73A960582;
address constant AGEUR = 0x1a7e4e63778B4f12a199C062f3eFdD288afCBce8;
ICbETH constant CBETH = ICbETH(0xBe9895146f7AF43049ca1c1AE358B0541Ea49704);
IRETH constant RETH = IRETH(0xae78736Cd615f374D3085123A210448E74Fc6393);
IStETH constant STETH = IStETH(0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84);
ISfrxETH constant SFRXETH = ISfrxETH(0xac3E018457B222d93114458476f3E3416Abbe38F);

File 7 of 13 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 8 of 13 : IAccessControlManager.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

/// @title IAccessControlManager
/// @author Angle Labs, Inc.
interface IAccessControlManager {
    /// @notice Checks whether an address is governor of the Angle Protocol or not
    /// @param admin Address to check
    /// @return Whether the address has the `GOVERNOR_ROLE` or not
    function isGovernor(address admin) external view returns (bool);

    /// @notice Checks whether an address is governor or a guardian of the Angle Protocol or not
    /// @param admin Address to check
    /// @return Whether the address has the `GUARDIAN_ROLE` or not
    /// @dev Governance should make sure when adding a governor to also give this governor the guardian
    /// role by calling the `addGovernor` function
    function isGovernorOrGuardian(address admin) external view returns (bool);
}

File 9 of 13 : IAgToken.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

import { IERC20 } from "oz/token/ERC20/IERC20.sol";

/// @title IAgToken
/// @author Angle Labs, Inc.
/// @notice Interface for the stablecoins `AgToken` contracts
interface IAgToken is IERC20 {
    /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                              MINTER ROLE ONLY FUNCTIONS                                            
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    /// @notice Lets a whitelisted contract mint agTokens
    /// @param account Address to mint to
    /// @param amount Amount to mint
    function mint(address account, uint256 amount) external;

    /// @notice Burns `amount` tokens from a `burner` address after being asked to by `sender`
    /// @param amount Amount of tokens to burn
    /// @param burner Address to burn from
    /// @param sender Address which requested the burn from `burner`
    /// @dev This method is to be called by a contract with the minter right after being requested
    /// to do so by a `sender` address willing to burn tokens from another `burner` address
    /// @dev The method checks the allowance between the `sender` and the `burner`
    function burnFrom(uint256 amount, address burner, address sender) external;

    /// @notice Burns `amount` tokens from a `burner` address
    /// @param amount Amount of tokens to burn
    /// @param burner Address to burn from
    /// @dev This method is to be called by a contract with a minter right on the AgToken after being
    /// requested to do so by an address willing to burn tokens from its address
    function burnSelf(uint256 amount, address burner) external;

    /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                TREASURY ONLY FUNCTIONS                                             
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    /// @notice Adds a minter in the contract
    /// @param minter Minter address to add
    /// @dev Zero address checks are performed directly in the `Treasury` contract
    function addMinter(address minter) external;

    /// @notice Removes a minter from the contract
    /// @param minter Minter address to remove
    /// @dev This function can also be called by a minter wishing to revoke itself
    function removeMinter(address minter) external;

    /// @notice Sets a new treasury contract
    /// @param _treasury New treasury address
    function setTreasury(address _treasury) external;

    /*//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
                                                  EXTERNAL FUNCTIONS                                                
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

    /// @notice Checks whether an address has the right to mint agTokens
    /// @param minter Address for which the minting right should be checked
    /// @return Whether the address has the right to mint agTokens or not
    function isMinter(address minter) external view returns (bool);

    /// @notice Amount of decimals of the stablecoin
    function decimals() external view returns (uint8);
}

File 10 of 13 : ICbETH.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

/// @title ICbETH
/// @notice Interface for the `cbETH` contract
interface ICbETH {
    function exchangeRate() external view returns (uint256);
}

File 11 of 13 : ISfrxETH.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

/// @title ISfrxETH
/// @notice Interface for the `sfrxETH` contract
interface ISfrxETH {
    function pricePerShare() external view returns (uint256);
}

File 12 of 13 : IStETH.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

/// @title IStETH
/// @notice Interface for the `StETH` contract
interface IStETH {
    function getPooledEthByShares(uint256 _sharesAmount) external view returns (uint256);

    function submit(address) external payable returns (uint256);

    function getSharesByPooledEth(uint256 _ethAmount) external view returns (uint256);
}

File 13 of 13 : IRETH.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.5.0;

/// @title IRETH
/// @notice Interface for the `rETH` contract
interface IRETH {
    function getExchangeRate() external view returns (uint256);
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "stringutils/=lib/solidity-stringutils/",
    "contracts/=contracts/",
    "test/=test/",
    "interfaces/=contracts/interfaces/",
    "oz/=lib/openzeppelin-contracts/contracts/",
    "oz-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "mock/=test/mock/",
    "prb/math/=lib/prb-math/src/",
    "borrow/=lib/borrow-contracts/contracts/",
    "@chainlink/=lib/borrow-contracts/node_modules/@chainlink/",
    "@ensdomains/=lib/borrow-contracts/node_modules/@ensdomains/",
    "@prb/test/=lib/prb-math/lib/prb-test/src/",
    "@uniswap/=lib/borrow-contracts/node_modules/@uniswap/",
    "borrow-contracts/=lib/borrow-contracts/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "prb-math/=lib/prb-math/src/",
    "prb-test/=lib/prb-math/lib/prb-test/src/",
    "solidity-stringutils/=lib/solidity-stringutils/",
    "src/=lib/prb-math/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": true,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"components":[{"internalType":"address","name":"facetAddress","type":"address"},{"internalType":"enum FacetCutAction","name":"action","type":"uint8"},{"internalType":"bytes4[]","name":"functionSelectors","type":"bytes4[]"}],"internalType":"struct FacetCut[]","name":"_diamondCut","type":"tuple[]"},{"internalType":"address","name":"_init","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"stateMutability":"payable","type":"constructor"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"CannotAddFunctionToDiamondThatAlreadyExists","type":"error"},{"inputs":[{"internalType":"bytes4[]","name":"_selectors","type":"bytes4[]"}],"name":"CannotAddSelectorsToZeroAddress","type":"error"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"CannotRemoveFunctionThatDoesNotExist","type":"error"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"CannotRemoveImmutableFunction","type":"error"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"CannotReplaceFunctionThatDoesNotExists","type":"error"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"CannotReplaceFunctionWithTheSameFunctionFromTheSameFacet","type":"error"},{"inputs":[{"internalType":"bytes4[]","name":"_selectors","type":"bytes4[]"}],"name":"CannotReplaceFunctionsFromFacetWithZeroAddress","type":"error"},{"inputs":[{"internalType":"bytes4","name":"_selector","type":"bytes4"}],"name":"CannotReplaceImmutableFunction","type":"error"},{"inputs":[],"name":"ContractHasNoCode","type":"error"},{"inputs":[{"internalType":"bytes4","name":"_functionSelector","type":"bytes4"}],"name":"FunctionNotFound","type":"error"},{"inputs":[{"internalType":"address","name":"_initializationContractAddress","type":"address"},{"internalType":"bytes","name":"_calldata","type":"bytes"}],"name":"InitializationFunctionReverted","type":"error"},{"inputs":[{"internalType":"address","name":"_facetAddress","type":"address"}],"name":"NoSelectorsProvidedForFacetForCut","type":"error"},{"inputs":[{"internalType":"address","name":"_facetAddress","type":"address"}],"name":"RemoveFacetAddressMustBeZeroAddress","type":"error"},{"stateMutability":"payable","type":"fallback"}]

6080604052610de5803803806100148161021e565b928339606090818382810103126100da578251916001600160401b0383116100da57818401601f8486010112156100da578284015161005a61005582610243565b61021e565b93602085838152019084870160208460051b838a010101116100da57602081880101915b60208460051b838a01010183106100df5787878761009e6020840161025a565b6040840151939091906001600160401b0385116100da576100cc946100c692820191016102ac565b9161049e565b60405160f19081610cb48239f35b600080fd5b82516001600160401b0381116100da578289010185601f1982898c010301126100da5761010a6101db565b906101176020820161025a565b8252604081015160038110156100da57602083015280870151906001600160401b0382116100da5701878a01603f820112156100da5760208101519061015f61005583610243565b91602083828152018a8d0160408360051b850101116100da5760408301905b60408360051b85010182106101a45750505050604082015281526020928301920161007e565b81516001600160e01b0319811681036100da5781526020918201910161017e565b634e487b7160e01b600052604160045260246000fd5b60405190606082016001600160401b038111838210176101fa57604052565b6101c5565b60408051919082016001600160401b038111838210176101fa57604052565b6040519190601f01601f191682016001600160401b038111838210176101fa57604052565b6001600160401b0381116101fa5760051b60200190565b51906001600160a01b03821682036100da57565b6001600160401b0381116101fa57601f01601f191660200190565b60005b83811061029c5750506000910152565b818101518382015260200161028c565b81601f820112156100da5780516102c56100558261026e565b92818452602082840101116100da576102e49160208085019101610289565b90565b634e487b7160e01b600052601160045260246000fd5b600019811461030c5760010190565b6102e7565b634e487b7160e01b600052603260045260246000fd5b805182101561033b5760209160051b010190565b610311565b6003111561034a57565b634e487b7160e01b600052602160045260246000fd5b51600381101561034a5790565b90815180825260208080930193019160005b82811061038d575050505090565b83516001600160e01b0319168552938101939281019260010161037f565b906020916103c481518092818552858086019101610289565b601f01601f1916010190565b93929091936060928382019380835281518095526080830160808660051b85010195602080940192600080915b83831061042f575050505050506102e494956104229183019060018060a01b03169052565b60408184039101526103ab565b909192939498607f1988820301865289519060018060a01b03825116815287820151600381101561048a5761047c60019385848c959486809601528160408094015193820152019061036d565b9b01960194930191906103fd565b634e487b7160e01b85526021600452602485fd5b929190835160005b8181106104f05750507f8faa70878671ccd212d20771b795c50af8fd3ff6cf27f4bde57e5d4de0aeb673816104ee94956104e685604051938493846103d0565b0390a16105eb565b565b6040806104fd8389610327565b51015161051b61050d848a610327565b51516001600160a01b031690565b918151156105a65750908291610540602061053961055d968c610327565b5101610360565b61054981610340565b80610562575061055891610751565b6102fd565b6104a6565b61056b81610340565b6001810361057d5750610558916108a9565b80610589600292610340565b14610596575b50506102fd565b61059f91610a81565b388061058f565b5163e767f91f60e01b81526001600160a01b0383166004820152602490fd5b0390fd5b6001600160a01b0390911681526040602082018190526102e4929101906103ab565b906001600160a01b0382161561066e5761060482610c99565b600080825160208401855af4913d15610666573d926106256100558561026e565b9384523d6000602086013e5b1561063b57505050565b82511561064a57825160208401fd5b6105c560405192839263192105d760e01b8452600484016105c9565b606092610631565b5050565b9060206102e492818152019061036d565b8151815460209093015161ffff60a01b60a09190911b166001600160b01b03199093166001600160a01b0390911617919091179055565b90600080516020610dc5833981519152805483101561033b57600052601c60206000208360031c019260021b1690565b600080516020610dc583398151915290815491680100000000000000008310156101fa57826107219160016104ee950190556106ba565b90919063ffffffff83549160031b9260e01c831b921b1916179055565b61ffff80911690811461030c5760010190565b906001600160a01b0382161561088c57600080516020610dc58339815191525461ffff1661077e83610c99565b8151916000915b838310610793575050505050565b6107ae6107a08484610327565b516001600160e01b03191690565b6107f76107eb6107de8363ffffffff60e01b16600052600080516020610da5833981519152602052604060002090565b546001600160a01b031690565b6001600160a01b031690565b610868576108629161085761085c926108526108116101ff565b6001600160a01b038b16815261ffff851660208201526001600160e01b031983166000908152600080516020610da583398151915260205260409020610683565b6106ea565b61073e565b926102fd565b91610785565b60405163ebbf5d0760e01b81526001600160e01b0319919091166004820152602490fd5b6040516302b8da0760e21b81529081906105c59060048301610672565b6001600160a01b038116919082156109e6576108c481610c99565b81519160005b8381106108d8575050505050565b6108e56107a08284610327565b6109156107eb6107de8363ffffffff60e01b16600052600080516020610da5833981519152602052604060002090565b3081146109c4578681146109a2571561097e57906105588461095a6109799463ffffffff60e01b16600052600080516020610da5833981519152602052604060002090565b80546001600160a01b0319166001600160a01b03909216919091179055565b6108ca565b604051637479f93960e01b81526001600160e01b0319919091166004820152602490fd5b604051631ac6ce8d60e11b81526001600160e01b031983166004820152602490fd5b604051632901806d60e11b81526001600160e01b031983166004820152602490fd5b60405163cd98a96f60e01b8152806105c58460048301610672565b9061ffff610a0d6101ff565b92546001600160a01b038116845260a01c166020830152565b801561030c576000190190565b600080516020610dc583398151915280548015610a6b576000190190610a58826106ba565b63ffffffff82549160031b1b1916905555565b634e487b7160e01b600052603160045260246000fd5b600080516020610dc58339815191525491906001600160a01b038116610c765750809291925190600090815b838110610abc57505050509050565b610ac96107a08284610327565b95610afc610af78863ffffffff60e01b16600052600080516020610da5833981519152602052604060002090565b610a01565b8051909190610b13906001600160a01b03166107eb565b15610c545781513090610b2e906001600160a01b03166107eb565b14610c3257610b9460209798610b9a9493610b498894610a26565b998a91018161ffff610b5d835161ffff1690565b1603610ba2575b5050610b6e610a33565b63ffffffff60e01b16600052600080516020610da5833981519152602052604060002090565b556102fd565b949394610aad565b610c0c610be5610bc4610bb7610c2b956106ba565b90549060031b1c60e01b90565b92610bdd84610721610bd8845161ffff1690565b6106ba565b5161ffff1690565b9163ffffffff60e01b16600052600080516020610da5833981519152602052604060002090565b805461ffff60a01b191660a09290921b61ffff60a01b16919091179055565b8838610b64565b604051630df5fd6160e31b81526001600160e01b031989166004820152602490fd5b604051637a08a22d60e01b81526001600160e01b031989166004820152602490fd5b60405163d091bc8160e01b81526001600160a01b03919091166004820152602490fd5b3b15610ca157565b60405163c1df45cf60e01b8152600490fdfe60007fffffffff000000000000000000000000000000000000000000000000000000008135168082527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c60205273ffffffffffffffffffffffffffffffffffffffff604083205416908115608e57508180913682608037608036915af43d809260803e15608a576080f35b6080fd5b7f5416eb980000000000000000000000000000000000000000000000000000000060805260845260246080fdfea2646970667358221220f7555e579d1647bd1a1a6ec8c28b11a5e145ccb1b2ed6f6b2426d5c9f004de4364736f6c63430008130033c8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131cc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131b00000000000000000000000000000000000000000000000000000000000000600000000000000000000000009c70c6c8efd84084f9e6ded91790318b8edff4b40000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000053b7d70013dec21a97f216e80eefcf45f25c29000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000011f931c1c00000000000000000000000000000000000000000000000000000000000000000000000000000000fa94cd9d711de75695693c877beca5473462cf120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000025c60da1b00000000000000000000000000000000000000000000000000000000c39aa07d0000000000000000000000000000000000000000000000000000000000000000000000000000000065ddeedf8e68f26d787b678e28af13fde0249967000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed62700000000000000000000000000000000000000000000000000000000000000000000000000000000d1b575ed715e4630340bfdc4fb8a37df3383c84a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000016b4a0bdf300000000000000000000000000000000000000000000000000000000ee565a6300000000000000000000000000000000000000000000000000000000847da7be00000000000000000000000000000000000000000000000000000000eb7aac5f000000000000000000000000000000000000000000000000000000003335221000000000000000000000000000000000000000000000000000000000b718136100000000000000000000000000000000000000000000000000000000b85780bc00000000000000000000000000000000000000000000000000000000cd377c5300000000000000000000000000000000000000000000000000000000782513bd0000000000000000000000000000000000000000000000000000000094e35d9e000000000000000000000000000000000000000000000000000000004ea3e3430000000000000000000000000000000000000000000000000000000010d3d22e0000000000000000000000000000000000000000000000000000000038c269eb00000000000000000000000000000000000000000000000000000000adc9d1f7000000000000000000000000000000000000000000000000000000008db9653f000000000000000000000000000000000000000000000000000000000d1266270000000000000000000000000000000000000000000000000000000096d6487900000000000000000000000000000000000000000000000000000000fe7d0c540000000000000000000000000000000000000000000000000000000077dc342900000000000000000000000000000000000000000000000000000000f9839d8900000000000000000000000000000000000000000000000000000000a52aefd40000000000000000000000000000000000000000000000000000000099eeca4900000000000000000000000000000000000000000000000000000000000000000000000000000000770756e43b9ac742538850003791def3020211f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000105b41934000000000000000000000000000000000000000000000000000000000000000000000000000000001f37f93c6aa7d987ae04786145d3066eab8eeb4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000af0d2d5a800000000000000000000000000000000000000000000000000000000c1cdee7e0000000000000000000000000000000000000000000000000000000087c8ab7a000000000000000000000000000000000000000000000000000000005c3eebda000000000000000000000000000000000000000000000000000000001f0ec8ee000000000000000000000000000000000000000000000000000000000e32cb860000000000000000000000000000000000000000000000000000000081ee2deb00000000000000000000000000000000000000000000000000000000b13b0847000000000000000000000000000000000000000000000000000000001b0c7182000000000000000000000000000000000000000000000000000000007c0343a100000000000000000000000000000000000000000000000000000000000000000000000000000000dda8f002925a0dfb151c0eacb48d7136ce6a999f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004629feb62000000000000000000000000000000000000000000000000000000004eec47b900000000000000000000000000000000000000000000000000000000a9e6a1a400000000000000000000000000000000000000000000000000000000b607d0990000000000000000000000000000000000000000000000000000000000000000000000000000000006c33a0c80c3970cbedde641c7a6419d703d93d70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000064583aea6000000000000000000000000000000000000000000000000000000009525f3ab000000000000000000000000000000000000000000000000000000003b6a1fe000000000000000000000000000000000000000000000000000000000d92c6cb200000000000000000000000000000000000000000000000000000000b92567fa00000000000000000000000000000000000000000000000000000000c10a6287000000000000000000000000000000000000000000000000000000000000000000000000000000001e45b65cdd3712fef0024d063d6574a609985e59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004d703a0cd00000000000000000000000000000000000000000000000000000000815822c1000000000000000000000000000000000000000000000000000000002e7639bc00000000000000000000000000000000000000000000000000000000fd7daaf8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000003fc5a1bd4d0a435c55374208a6a81535a19230390000000000000000000000000000206329b97db379d5e1bf586bbdb969c632740000000000000000000000005d34839a3d4051f630d36e26698d53c58dd3907200000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60007fffffffff000000000000000000000000000000000000000000000000000000008135168082527fc8fcad8db84d3cc18b4c41d551ea0ee66dd599cde068d998e57d5e09332c131c60205273ffffffffffffffffffffffffffffffffffffffff604083205416908115608e57508180913682608037608036915af43d809260803e15608a576080f35b6080fd5b7f5416eb980000000000000000000000000000000000000000000000000000000060805260845260246080fdfea2646970667358221220f7555e579d1647bd1a1a6ec8c28b11a5e145ccb1b2ed6f6b2426d5c9f004de4364736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000000600000000000000000000000009c70c6c8efd84084f9e6ded91790318b8edff4b40000000000000000000000000000000000000000000000000000000000000ce00000000000000000000000000000000000000000000000000000000000000009000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c00000000000000000000000000000000000000000000000000000000000000280000000000000000000000000000000000000000000000000000000000000038000000000000000000000000000000000000000000000000000000000000006c0000000000000000000000000000000000000000000000000000000000000076000000000000000000000000000000000000000000000000000000000000009200000000000000000000000000000000000000000000000000000000000000a200000000000000000000000000000000000000000000000000000000000000b6000000000000000000000000053b7d70013dec21a97f216e80eefcf45f25c29000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000011f931c1c00000000000000000000000000000000000000000000000000000000000000000000000000000000fa94cd9d711de75695693c877beca5473462cf120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000025c60da1b00000000000000000000000000000000000000000000000000000000c39aa07d0000000000000000000000000000000000000000000000000000000000000000000000000000000065ddeedf8e68f26d787b678e28af13fde0249967000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004cdffacc60000000000000000000000000000000000000000000000000000000052ef6b2c00000000000000000000000000000000000000000000000000000000adfca15e000000000000000000000000000000000000000000000000000000007a0ed62700000000000000000000000000000000000000000000000000000000000000000000000000000000d1b575ed715e4630340bfdc4fb8a37df3383c84a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000016b4a0bdf300000000000000000000000000000000000000000000000000000000ee565a6300000000000000000000000000000000000000000000000000000000847da7be00000000000000000000000000000000000000000000000000000000eb7aac5f000000000000000000000000000000000000000000000000000000003335221000000000000000000000000000000000000000000000000000000000b718136100000000000000000000000000000000000000000000000000000000b85780bc00000000000000000000000000000000000000000000000000000000cd377c5300000000000000000000000000000000000000000000000000000000782513bd0000000000000000000000000000000000000000000000000000000094e35d9e000000000000000000000000000000000000000000000000000000004ea3e3430000000000000000000000000000000000000000000000000000000010d3d22e0000000000000000000000000000000000000000000000000000000038c269eb00000000000000000000000000000000000000000000000000000000adc9d1f7000000000000000000000000000000000000000000000000000000008db9653f000000000000000000000000000000000000000000000000000000000d1266270000000000000000000000000000000000000000000000000000000096d6487900000000000000000000000000000000000000000000000000000000fe7d0c540000000000000000000000000000000000000000000000000000000077dc342900000000000000000000000000000000000000000000000000000000f9839d8900000000000000000000000000000000000000000000000000000000a52aefd40000000000000000000000000000000000000000000000000000000099eeca4900000000000000000000000000000000000000000000000000000000000000000000000000000000770756e43b9ac742538850003791def3020211f300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000105b41934000000000000000000000000000000000000000000000000000000000000000000000000000000001f37f93c6aa7d987ae04786145d3066eab8eeb4300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000af0d2d5a800000000000000000000000000000000000000000000000000000000c1cdee7e0000000000000000000000000000000000000000000000000000000087c8ab7a000000000000000000000000000000000000000000000000000000005c3eebda000000000000000000000000000000000000000000000000000000001f0ec8ee000000000000000000000000000000000000000000000000000000000e32cb860000000000000000000000000000000000000000000000000000000081ee2deb00000000000000000000000000000000000000000000000000000000b13b0847000000000000000000000000000000000000000000000000000000001b0c7182000000000000000000000000000000000000000000000000000000007c0343a100000000000000000000000000000000000000000000000000000000000000000000000000000000dda8f002925a0dfb151c0eacb48d7136ce6a999f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004629feb62000000000000000000000000000000000000000000000000000000004eec47b900000000000000000000000000000000000000000000000000000000a9e6a1a400000000000000000000000000000000000000000000000000000000b607d0990000000000000000000000000000000000000000000000000000000000000000000000000000000006c33a0c80c3970cbedde641c7a6419d703d93d70000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000064583aea6000000000000000000000000000000000000000000000000000000009525f3ab000000000000000000000000000000000000000000000000000000003b6a1fe000000000000000000000000000000000000000000000000000000000d92c6cb200000000000000000000000000000000000000000000000000000000b92567fa00000000000000000000000000000000000000000000000000000000c10a6287000000000000000000000000000000000000000000000000000000000000000000000000000000001e45b65cdd3712fef0024d063d6574a609985e59000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000004d703a0cd00000000000000000000000000000000000000000000000000000000815822c1000000000000000000000000000000000000000000000000000000002e7639bc00000000000000000000000000000000000000000000000000000000fd7daaf8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064c0c53b8b0000000000000000000000003fc5a1bd4d0a435c55374208a6a81535a19230390000000000000000000000000000206329b97db379d5e1bf586bbdb969c632740000000000000000000000005d34839a3d4051f630d36e26698d53c58dd3907200000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _diamondCut (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : _init (address): 0x9C70c6c8EFD84084F9E6DeD91790318B8eDfF4B4
Arg [2] : _calldata (bytes): 0xc0c53b8b0000000000000000000000003fc5a1bd4d0a435c55374208a6a81535a19230390000000000000000000000000000206329b97db379d5e1bf586bbdb969c632740000000000000000000000005d34839a3d4051f630d36e26698d53c58dd39072

-----Encoded View---------------
108 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000009c70c6c8efd84084f9e6ded91790318b8edff4b4
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000ce0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [5] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000280
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000380
Arg [8] : 00000000000000000000000000000000000000000000000000000000000006c0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000760
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000920
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000a20
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000b60
Arg [13] : 00000000000000000000000053b7d70013dec21a97f216e80eefcf45f25c2900
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [17] : 1f931c1c00000000000000000000000000000000000000000000000000000000
Arg [18] : 000000000000000000000000fa94cd9d711de75695693c877beca5473462cf12
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [22] : 5c60da1b00000000000000000000000000000000000000000000000000000000
Arg [23] : c39aa07d00000000000000000000000000000000000000000000000000000000
Arg [24] : 00000000000000000000000065ddeedf8e68f26d787b678e28af13fde0249967
Arg [25] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [28] : cdffacc600000000000000000000000000000000000000000000000000000000
Arg [29] : 52ef6b2c00000000000000000000000000000000000000000000000000000000
Arg [30] : adfca15e00000000000000000000000000000000000000000000000000000000
Arg [31] : 7a0ed62700000000000000000000000000000000000000000000000000000000
Arg [32] : 000000000000000000000000d1b575ed715e4630340bfdc4fb8a37df3383c84a
Arg [33] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [36] : b4a0bdf300000000000000000000000000000000000000000000000000000000
Arg [37] : ee565a6300000000000000000000000000000000000000000000000000000000
Arg [38] : 847da7be00000000000000000000000000000000000000000000000000000000
Arg [39] : eb7aac5f00000000000000000000000000000000000000000000000000000000
Arg [40] : 3335221000000000000000000000000000000000000000000000000000000000
Arg [41] : b718136100000000000000000000000000000000000000000000000000000000
Arg [42] : b85780bc00000000000000000000000000000000000000000000000000000000
Arg [43] : cd377c5300000000000000000000000000000000000000000000000000000000
Arg [44] : 782513bd00000000000000000000000000000000000000000000000000000000
Arg [45] : 94e35d9e00000000000000000000000000000000000000000000000000000000
Arg [46] : 4ea3e34300000000000000000000000000000000000000000000000000000000
Arg [47] : 10d3d22e00000000000000000000000000000000000000000000000000000000
Arg [48] : 38c269eb00000000000000000000000000000000000000000000000000000000
Arg [49] : adc9d1f700000000000000000000000000000000000000000000000000000000
Arg [50] : 8db9653f00000000000000000000000000000000000000000000000000000000
Arg [51] : 0d12662700000000000000000000000000000000000000000000000000000000
Arg [52] : 96d6487900000000000000000000000000000000000000000000000000000000
Arg [53] : fe7d0c5400000000000000000000000000000000000000000000000000000000
Arg [54] : 77dc342900000000000000000000000000000000000000000000000000000000
Arg [55] : f9839d8900000000000000000000000000000000000000000000000000000000
Arg [56] : a52aefd400000000000000000000000000000000000000000000000000000000
Arg [57] : 99eeca4900000000000000000000000000000000000000000000000000000000
Arg [58] : 000000000000000000000000770756e43b9ac742538850003791def3020211f3
Arg [59] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [60] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [61] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [62] : 05b4193400000000000000000000000000000000000000000000000000000000
Arg [63] : 0000000000000000000000001f37f93c6aa7d987ae04786145d3066eab8eeb43
Arg [64] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [65] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [66] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [67] : f0d2d5a800000000000000000000000000000000000000000000000000000000
Arg [68] : c1cdee7e00000000000000000000000000000000000000000000000000000000
Arg [69] : 87c8ab7a00000000000000000000000000000000000000000000000000000000
Arg [70] : 5c3eebda00000000000000000000000000000000000000000000000000000000
Arg [71] : 1f0ec8ee00000000000000000000000000000000000000000000000000000000
Arg [72] : 0e32cb8600000000000000000000000000000000000000000000000000000000
Arg [73] : 81ee2deb00000000000000000000000000000000000000000000000000000000
Arg [74] : b13b084700000000000000000000000000000000000000000000000000000000
Arg [75] : 1b0c718200000000000000000000000000000000000000000000000000000000
Arg [76] : 7c0343a100000000000000000000000000000000000000000000000000000000
Arg [77] : 000000000000000000000000dda8f002925a0dfb151c0eacb48d7136ce6a999f
Arg [78] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [79] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [80] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [81] : 629feb6200000000000000000000000000000000000000000000000000000000
Arg [82] : 4eec47b900000000000000000000000000000000000000000000000000000000
Arg [83] : a9e6a1a400000000000000000000000000000000000000000000000000000000
Arg [84] : b607d09900000000000000000000000000000000000000000000000000000000
Arg [85] : 00000000000000000000000006c33a0c80c3970cbedde641c7a6419d703d93d7
Arg [86] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [87] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [88] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [89] : 4583aea600000000000000000000000000000000000000000000000000000000
Arg [90] : 9525f3ab00000000000000000000000000000000000000000000000000000000
Arg [91] : 3b6a1fe000000000000000000000000000000000000000000000000000000000
Arg [92] : d92c6cb200000000000000000000000000000000000000000000000000000000
Arg [93] : b92567fa00000000000000000000000000000000000000000000000000000000
Arg [94] : c10a628700000000000000000000000000000000000000000000000000000000
Arg [95] : 0000000000000000000000001e45b65cdd3712fef0024d063d6574a609985e59
Arg [96] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [97] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [98] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [99] : d703a0cd00000000000000000000000000000000000000000000000000000000
Arg [100] : 815822c100000000000000000000000000000000000000000000000000000000
Arg [101] : 2e7639bc00000000000000000000000000000000000000000000000000000000
Arg [102] : fd7daaf800000000000000000000000000000000000000000000000000000000
Arg [103] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [104] : c0c53b8b0000000000000000000000003fc5a1bd4d0a435c55374208a6a81535
Arg [105] : a19230390000000000000000000000000000206329b97db379d5e1bf586bbdb9
Arg [106] : 69c632740000000000000000000000005d34839a3d4051f630d36e26698d53c5
Arg [107] : 8dd3907200000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.