Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
JumpRateModelV2
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BSD-3-Clause pragma solidity 0.8.25; import { IAccessControlManagerV8 } from "@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.sol"; import { TimeManagerV8 } from "@venusprotocol/solidity-utilities/contracts/TimeManagerV8.sol"; import { InterestRateModel } from "./InterestRateModel.sol"; import { EXP_SCALE, MANTISSA_ONE } from "./lib/constants.sol"; /** * @title JumpRateModelV2 * @author Compound (modified by Dharma Labs, Arr00 and Venus) * @notice An interest rate model with a steep increase after a certain utilization threshold called **kink** is reached. * The parameters of this interest rate model can be adjusted by the owner. Version 2 modifies Version 1 by enabling updateable parameters */ contract JumpRateModelV2 is InterestRateModel, TimeManagerV8 { /** * @notice The address of the AccessControlManager contract */ IAccessControlManagerV8 public accessControlManager; /** * @notice The multiplier of utilization rate per block or second that gives the slope of the interest rate */ uint256 public multiplierPerBlock; /** * @notice The base interest rate per block or second which is the y-intercept when utilization rate is 0 */ uint256 public baseRatePerBlock; /** * @notice The multiplier per block or second after hitting a specified utilization point */ uint256 public jumpMultiplierPerBlock; /** * @notice The utilization point at which the jump multiplier is applied */ uint256 public kink; event NewInterestParams( uint256 baseRatePerBlockOrTimestamp, uint256 multiplierPerBlockOrTimestamp, uint256 jumpMultiplierPerBlockOrTimestamp, uint256 kink ); /** * @notice Thrown when the action is prohibited by AccessControlManager */ error Unauthorized(address sender, address calledContract, string methodSignature); /** * @notice Construct an interest rate model * @param baseRatePerYear_ The approximate target base APR, as a mantissa (scaled by EXP_SCALE) * @param multiplierPerYear_ The rate of increase in interest rate wrt utilization (scaled by EXP_SCALE) * @param jumpMultiplierPerYear_ The multiplier after hitting a specified utilization point * @param kink_ The utilization point at which the jump multiplier is applied * @param accessControlManager_ The address of the AccessControlManager contract * @param timeBased_ A boolean indicating whether the contract is based on time or block. * @param blocksPerYear_ The number of blocks per year */ constructor( uint256 baseRatePerYear_, uint256 multiplierPerYear_, uint256 jumpMultiplierPerYear_, uint256 kink_, IAccessControlManagerV8 accessControlManager_, bool timeBased_, uint256 blocksPerYear_ ) TimeManagerV8(timeBased_, blocksPerYear_) { require(address(accessControlManager_) != address(0), "invalid ACM address"); accessControlManager = accessControlManager_; _updateJumpRateModel(baseRatePerYear_, multiplierPerYear_, jumpMultiplierPerYear_, kink_); } /** * @notice Update the parameters of the interest rate model * @param baseRatePerYear The approximate target base APR, as a mantissa (scaled by EXP_SCALE) * @param multiplierPerYear The rate of increase in interest rate wrt utilization (scaled by EXP_SCALE) * @param jumpMultiplierPerYear The multiplierPerBlockOrTimestamp after hitting a specified utilization point * @param kink_ The utilization point at which the jump multiplier is applied * @custom:error Unauthorized if the sender is not allowed to call this function * @custom:access Controlled by AccessControlManager */ function updateJumpRateModel( uint256 baseRatePerYear, uint256 multiplierPerYear, uint256 jumpMultiplierPerYear, uint256 kink_ ) external virtual { string memory signature = "updateJumpRateModel(uint256,uint256,uint256,uint256)"; bool isAllowedToCall = accessControlManager.isAllowedToCall(msg.sender, signature); if (!isAllowedToCall) { revert Unauthorized(msg.sender, address(this), signature); } _updateJumpRateModel(baseRatePerYear, multiplierPerYear, jumpMultiplierPerYear, kink_); } /** * @notice Calculates the current borrow rate per slot (block or second) * @param cash The amount of cash in the market * @param borrows The amount of borrows in the market * @param reserves The amount of reserves in the market * @param badDebt The amount of badDebt in the market * @return The borrow rate percentage per slot (block or second) as a mantissa (scaled by 1e18) */ function getBorrowRate( uint256 cash, uint256 borrows, uint256 reserves, uint256 badDebt ) external view override returns (uint256) { return _getBorrowRate(cash, borrows, reserves, badDebt); } /** * @notice Calculates the current supply rate per slot (block or second) * @param cash The amount of cash in the market * @param borrows The amount of borrows in the market * @param reserves The amount of reserves in the market * @param reserveFactorMantissa The current reserve factor for the market * @param badDebt The amount of badDebt in the market * @return The supply rate percentage per slot (block or second) as a mantissa (scaled by EXP_SCALE) */ function getSupplyRate( uint256 cash, uint256 borrows, uint256 reserves, uint256 reserveFactorMantissa, uint256 badDebt ) public view virtual override returns (uint256) { uint256 oneMinusReserveFactor = MANTISSA_ONE - reserveFactorMantissa; uint256 borrowRate = _getBorrowRate(cash, borrows, reserves, badDebt); uint256 rateToPool = (borrowRate * oneMinusReserveFactor) / EXP_SCALE; uint256 incomeToDistribute = borrows * rateToPool; uint256 supply = cash + borrows + badDebt - reserves; return incomeToDistribute / supply; } /** * @notice Calculates the utilization rate of the market: `(borrows + badDebt) / (cash + borrows + badDebt - reserves)` * @param cash The amount of cash in the market * @param borrows The amount of borrows in the market * @param reserves The amount of reserves in the market (currently unused) * @param badDebt The amount of badDebt in the market * @return The utilization rate as a mantissa between [0, MANTISSA_ONE] */ function utilizationRate( uint256 cash, uint256 borrows, uint256 reserves, uint256 badDebt ) public pure returns (uint256) { // Utilization rate is 0 when there are no borrows and badDebt if ((borrows + badDebt) == 0) { return 0; } uint256 rate = ((borrows + badDebt) * EXP_SCALE) / (cash + borrows + badDebt - reserves); if (rate > EXP_SCALE) { rate = EXP_SCALE; } return rate; } /** * @notice Internal function to update the parameters of the interest rate model * @param baseRatePerYear The approximate target base APR, as a mantissa (scaled by EXP_SCALE) * @param multiplierPerYear The rate of increase in interest rate wrt utilization (scaled by EXP_SCALE) * @param jumpMultiplierPerYear The multiplierPerBlockOrTimestamp after hitting a specified utilization point * @param kink_ The utilization point at which the jump multiplier is applied */ function _updateJumpRateModel( uint256 baseRatePerYear, uint256 multiplierPerYear, uint256 jumpMultiplierPerYear, uint256 kink_ ) internal { baseRatePerBlock = baseRatePerYear / blocksOrSecondsPerYear; multiplierPerBlock = multiplierPerYear / blocksOrSecondsPerYear; jumpMultiplierPerBlock = jumpMultiplierPerYear / blocksOrSecondsPerYear; kink = kink_; emit NewInterestParams(baseRatePerBlock, multiplierPerBlock, jumpMultiplierPerBlock, kink); } /** * @notice Calculates the current borrow rate per slot (block or second), with the error code expected by the market * @param cash The amount of cash in the market * @param borrows The amount of borrows in the market * @param reserves The amount of reserves in the market * @param badDebt The amount of badDebt in the market * @return The borrow rate percentage per slot (block or second) as a mantissa (scaled by EXP_SCALE) */ function _getBorrowRate( uint256 cash, uint256 borrows, uint256 reserves, uint256 badDebt ) internal view returns (uint256) { uint256 util = utilizationRate(cash, borrows, reserves, badDebt); uint256 kink_ = kink; if (util <= kink_) { return ((util * multiplierPerBlock) / EXP_SCALE) + baseRatePerBlock; } uint256 normalRate = ((kink_ * multiplierPerBlock) / EXP_SCALE) + baseRatePerBlock; uint256 excessUtil; unchecked { excessUtil = util - kink_; } return ((excessUtil * jumpMultiplierPerBlock) / EXP_SCALE) + normalRate; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: BSD-3-Clause pragma solidity ^0.8.25; import "@openzeppelin/contracts/access/IAccessControl.sol"; /** * @title IAccessControlManagerV8 * @author Venus * @notice Interface implemented by the `AccessControlManagerV8` contract. */ interface IAccessControlManagerV8 is IAccessControl { function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external; function revokeCallPermission( address contractAddress, string calldata functionSig, address accountToRevoke ) external; function isAllowedToCall(address account, string calldata functionSig) external view returns (bool); function hasPermission( address account, address contractAddress, string calldata functionSig ) external view returns (bool); }
// SPDX-License-Identifier: BSD-3-Clause pragma solidity ^0.8.25; /// @dev Base unit for computations, usually used in scaling (multiplications, divisions) uint256 constant EXP_SCALE = 1e18; /// @dev A unit (literal one) in EXP_SCALE, usually used in additions/subtractions uint256 constant MANTISSA_ONE = EXP_SCALE; /// @dev The approximate number of seconds per year uint256 constant SECONDS_PER_YEAR = 31_536_000;
// SPDX-License-Identifier: BSD-3-Clause pragma solidity 0.8.25; import { SECONDS_PER_YEAR } from "./constants.sol"; abstract contract TimeManagerV8 { /// @notice Stores blocksPerYear if isTimeBased is true else secondsPerYear is stored /// @custom:oz-upgrades-unsafe-allow state-variable-immutable uint256 public immutable blocksOrSecondsPerYear; /// @notice Acknowledges if a contract is time based or not /// @custom:oz-upgrades-unsafe-allow state-variable-immutable bool public immutable isTimeBased; /// @notice Stores the current block timestamp or block number depending on isTimeBased /// @custom:oz-upgrades-unsafe-allow state-variable-immutable function() view returns (uint256) private immutable _getCurrentSlot; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[48] private __gap; /// @notice Thrown when blocks per year is invalid error InvalidBlocksPerYear(); /// @notice Thrown when time based but blocks per year is provided error InvalidTimeBasedConfiguration(); /** * @param timeBased_ A boolean indicating whether the contract is based on time or block * If timeBased is true than blocksPerYear_ param is ignored as blocksOrSecondsPerYear is set to SECONDS_PER_YEAR * @param blocksPerYear_ The number of blocks per year * @custom:error InvalidBlocksPerYear is thrown if blocksPerYear entered is zero and timeBased is false * @custom:error InvalidTimeBasedConfiguration is thrown if blocksPerYear entered is non zero and timeBased is true * @custom:oz-upgrades-unsafe-allow constructor */ constructor(bool timeBased_, uint256 blocksPerYear_) { if (!timeBased_ && blocksPerYear_ == 0) { revert InvalidBlocksPerYear(); } if (timeBased_ && blocksPerYear_ != 0) { revert InvalidTimeBasedConfiguration(); } isTimeBased = timeBased_; blocksOrSecondsPerYear = timeBased_ ? SECONDS_PER_YEAR : blocksPerYear_; _getCurrentSlot = timeBased_ ? _getBlockTimestamp : _getBlockNumber; } /** * @dev Function to simply retrieve block number or block timestamp * @return Current block number or block timestamp */ function getBlockNumberOrTimestamp() public view virtual returns (uint256) { return _getCurrentSlot(); } /** * @dev Returns the current timestamp in seconds * @return The current timestamp */ function _getBlockTimestamp() private view returns (uint256) { return block.timestamp; } /** * @dev Returns the current block number * @return The current block number */ function _getBlockNumber() private view returns (uint256) { return block.number; } }
// SPDX-License-Identifier: BSD-3-Clause pragma solidity 0.8.25; /** * @title Compound's InterestRateModel Interface * @author Compound */ abstract contract InterestRateModel { /** * @notice Calculates the current borrow interest rate per slot (block or second) * @param cash The total amount of cash the market has * @param borrows The total amount of borrows the market has outstanding * @param reserves The total amount of reserves the market has * @param badDebt The amount of badDebt in the market * @return The borrow rate percentage per slot (block or second) as a mantissa (scaled by EXP_SCALE) */ function getBorrowRate( uint256 cash, uint256 borrows, uint256 reserves, uint256 badDebt ) external view virtual returns (uint256); /** * @notice Calculates the current supply interest rate per slot (block or second) * @param cash The total amount of cash the market has * @param borrows The total amount of borrows the market has outstanding * @param reserves The total amount of reserves the market has * @param reserveFactorMantissa The current reserve factor the market has * @param badDebt The amount of badDebt in the market * @return The supply rate percentage per slot (block or second) as a mantissa (scaled by EXP_SCALE) */ function getSupplyRate( uint256 cash, uint256 borrows, uint256 reserves, uint256 reserveFactorMantissa, uint256 badDebt ) external view virtual returns (uint256); /** * @notice Indicator that this is an InterestRateModel contract (for inspection) * @return Always true */ function isInterestRateModel() external pure virtual returns (bool) { return true; } }
// SPDX-License-Identifier: BSD-3-Clause pragma solidity ^0.8.25; /// @dev The approximate number of seconds per year uint256 constant SECONDS_PER_YEAR = 31_536_000; /// @dev Base unit for computations, usually used in scaling (multiplications, divisions) uint256 constant EXP_SCALE = 1e18; /// @dev A unit (literal one) in EXP_SCALE, usually used in additions/subtractions uint256 constant MANTISSA_ONE = EXP_SCALE;
{ "optimizer": { "enabled": true, "runs": 200, "details": { "yul": true } }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"baseRatePerYear_","type":"uint256"},{"internalType":"uint256","name":"multiplierPerYear_","type":"uint256"},{"internalType":"uint256","name":"jumpMultiplierPerYear_","type":"uint256"},{"internalType":"uint256","name":"kink_","type":"uint256"},{"internalType":"contract IAccessControlManagerV8","name":"accessControlManager_","type":"address"},{"internalType":"bool","name":"timeBased_","type":"bool"},{"internalType":"uint256","name":"blocksPerYear_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidBlocksPerYear","type":"error"},{"inputs":[],"name":"InvalidTimeBasedConfiguration","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"calledContract","type":"address"},{"internalType":"string","name":"methodSignature","type":"string"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"baseRatePerBlockOrTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"multiplierPerBlockOrTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"jumpMultiplierPerBlockOrTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"kink","type":"uint256"}],"name":"NewInterestParams","type":"event"},{"inputs":[],"name":"accessControlManager","outputs":[{"internalType":"contract IAccessControlManagerV8","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseRatePerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blocksOrSecondsPerYear","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBlockNumberOrTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"borrows","type":"uint256"},{"internalType":"uint256","name":"reserves","type":"uint256"},{"internalType":"uint256","name":"badDebt","type":"uint256"}],"name":"getBorrowRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"borrows","type":"uint256"},{"internalType":"uint256","name":"reserves","type":"uint256"},{"internalType":"uint256","name":"reserveFactorMantissa","type":"uint256"},{"internalType":"uint256","name":"badDebt","type":"uint256"}],"name":"getSupplyRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInterestRateModel","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"isTimeBased","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jumpMultiplierPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kink","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiplierPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"baseRatePerYear","type":"uint256"},{"internalType":"uint256","name":"multiplierPerYear","type":"uint256"},{"internalType":"uint256","name":"jumpMultiplierPerYear","type":"uint256"},{"internalType":"uint256","name":"kink_","type":"uint256"}],"name":"updateJumpRateModel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"cash","type":"uint256"},{"internalType":"uint256","name":"borrows","type":"uint256"},{"internalType":"uint256","name":"reserves","type":"uint256"},{"internalType":"uint256","name":"badDebt","type":"uint256"}],"name":"utilizationRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60e060405234801561001057600080fd5b50604051610abd380380610abd83398101604081905261002f916101ed565b81818115801561003d575080155b1561005b576040516302723dfb60e21b815260040160405180910390fd5b81801561006757508015155b156100855760405163ae0fcab360e01b815260040160405180910390fd5b81151560a05281610096578061009c565b6301e133805b608052816100b35761015960201b61042c176100be565b61015d60201b610430175b6001600160401b031660c05250506001600160a01b0383166101265760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642041434d206164647265737300000000000000000000000000604482015260640160405180910390fd5b603080546001600160a01b0319166001600160a01b03851617905561014d87878787610161565b5050505050505061028c565b4390565b4290565b60805161016e908561026a565b60325560805161017e908461026a565b60315560805161018e908361026a565b60338190556034829055603254603154604080519283526020830191909152810191909152606081018290527f6960ab234c7ef4b0c9197100f5393cfcde7c453ac910a27bd2000aa1dd4c068d9060800160405180910390a150505050565b600080600080600080600060e0888a03121561020857600080fd5b8751602089015160408a015160608b015160808c0151939a50919850965094506001600160a01b038116811461023d57600080fd5b60a0890151909350801515811461025357600080fd5b8092505060c0880151905092959891949750929550565b60008261028757634e487b7160e01b600052601260045260246000fd5b500490565b60805160a05160c0516107ed6102d06000396000610400015260006101b101526000818161013a015281816104fe0152818161052b015261055801526107ed6000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638726bb891161008c578063c7ad089511610066578063c7ad0895146101ac578063e1d146fb146101d3578063f14039de146101db578063fd2da339146101e457600080fd5b80638726bb891461016f578063b4a0bdf314610178578063b9f9850a146101a357600080fd5b8063073b8a74146100d45780630cde8d1c146100fa5780632037f3e71461010d5780632191f92a146101225780636857249c1461013557806370d3c43f1461015c575b600080fd5b6100e76100e23660046105dc565b6101ed565b6040519081526020015b60405180910390f35b6100e761010836600461060e565b610206565b61012061011b3660046105dc565b610299565b005b60015b60405190151581526020016100f1565b6100e77f000000000000000000000000000000000000000000000000000000000000000081565b6100e761016a3660046105dc565b610370565b6100e760315481565b60305461018b906001600160a01b031681565b6040516001600160a01b0390911681526020016100f1565b6100e760335481565b6101257f000000000000000000000000000000000000000000000000000000000000000081565b6100e76103f9565b6100e760325481565b6100e760345481565b60006101fb85858585610434565b90505b949350505050565b60008061021b84670de0b6b3a764000061065f565b9050600061022b88888887610434565b90506000670de0b6b3a76400006102428484610678565b61024c919061068f565b9050600061025a828a610678565b90506000888761026a8c8e6106b1565b61027491906106b1565b61027e919061065f565b905061028a818361068f565b9b9a5050505050505050505050565b6000604051806060016040528060348152602001610784603491396030546040516318c5e8ab60e01b81529192506000916001600160a01b03909116906318c5e8ab906102ec903390869060040161070a565b602060405180830381865afa158015610309573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032d919061072e565b90508061035c57333083604051634a3fa29360e01b815260040161035393929190610757565b60405180910390fd5b610368868686866104f9565b505050505050565b600061037c82856106b1565b60000361038b575060006101fe565b6000838361039987896106b1565b6103a391906106b1565b6103ad919061065f565b670de0b6b3a76400006103c085886106b1565b6103ca9190610678565b6103d4919061068f565b9050670de0b6b3a76400008111156101fb5750670de0b6b3a764000095945050505050565b60006104277f000000000000000000000000000000000000000000000000000000000000000063ffffffff16565b905090565b4390565b4290565b60008061044386868686610370565b60345490915080821161048757603254670de0b6b3a76400006031548461046a9190610678565b610474919061068f565b61047e91906106b1565b925050506101fe565b6000603254670de0b6b3a7640000603154846104a39190610678565b6104ad919061068f565b6104b791906106b1565b90506000828403905081670de0b6b3a7640000603354836104d89190610678565b6104e2919061068f565b6104ec91906106b1565b9998505050505050505050565b6105237f00000000000000000000000000000000000000000000000000000000000000008561068f565b6032556105507f00000000000000000000000000000000000000000000000000000000000000008461068f565b60315561057d7f00000000000000000000000000000000000000000000000000000000000000008361068f565b60338190556034829055603254603154604080519283526020830191909152810191909152606081018290527f6960ab234c7ef4b0c9197100f5393cfcde7c453ac910a27bd2000aa1dd4c068d9060800160405180910390a150505050565b600080600080608085870312156105f257600080fd5b5050823594602084013594506040840135936060013592509050565b600080600080600060a0868803121561062657600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067257610672610649565b92915050565b808202811582820484141761067257610672610649565b6000826106ac57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561067257610672610649565b6000815180845260005b818110156106ea576020818501810151868301820152016106ce565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190526000906101fe908301846106c4565b60006020828403121561074057600080fd5b8151801515811461075057600080fd5b9392505050565b6001600160a01b038481168252831660208201526060604082018190526000906101fb908301846106c456fe7570646174654a756d70526174654d6f64656c2875696e743235362c75696e743235362c75696e743235362c75696e7432353629a2646970667358221220c93e2af3e05152d7c10d83dd7b48d9708df3ad5d5901502bf132652935f6e78164736f6c6343000819003300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000136dcc951d8c00000000000000000000000000000000000000000000000000022b1c8c1227a00000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000230058da2d23eb8836ec5db7037ef7250c56e25e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002819a0
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100cf5760003560e01c80638726bb891161008c578063c7ad089511610066578063c7ad0895146101ac578063e1d146fb146101d3578063f14039de146101db578063fd2da339146101e457600080fd5b80638726bb891461016f578063b4a0bdf314610178578063b9f9850a146101a357600080fd5b8063073b8a74146100d45780630cde8d1c146100fa5780632037f3e71461010d5780632191f92a146101225780636857249c1461013557806370d3c43f1461015c575b600080fd5b6100e76100e23660046105dc565b6101ed565b6040519081526020015b60405180910390f35b6100e761010836600461060e565b610206565b61012061011b3660046105dc565b610299565b005b60015b60405190151581526020016100f1565b6100e77f00000000000000000000000000000000000000000000000000000000002819a081565b6100e761016a3660046105dc565b610370565b6100e760315481565b60305461018b906001600160a01b031681565b6040516001600160a01b0390911681526020016100f1565b6100e760335481565b6101257f000000000000000000000000000000000000000000000000000000000000000081565b6100e76103f9565b6100e760325481565b6100e760345481565b60006101fb85858585610434565b90505b949350505050565b60008061021b84670de0b6b3a764000061065f565b9050600061022b88888887610434565b90506000670de0b6b3a76400006102428484610678565b61024c919061068f565b9050600061025a828a610678565b90506000888761026a8c8e6106b1565b61027491906106b1565b61027e919061065f565b905061028a818361068f565b9b9a5050505050505050505050565b6000604051806060016040528060348152602001610784603491396030546040516318c5e8ab60e01b81529192506000916001600160a01b03909116906318c5e8ab906102ec903390869060040161070a565b602060405180830381865afa158015610309573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061032d919061072e565b90508061035c57333083604051634a3fa29360e01b815260040161035393929190610757565b60405180910390fd5b610368868686866104f9565b505050505050565b600061037c82856106b1565b60000361038b575060006101fe565b6000838361039987896106b1565b6103a391906106b1565b6103ad919061065f565b670de0b6b3a76400006103c085886106b1565b6103ca9190610678565b6103d4919061068f565b9050670de0b6b3a76400008111156101fb5750670de0b6b3a764000095945050505050565b60006104277f000000000000000000000000000000000000000000000000000001590000042c63ffffffff16565b905090565b4390565b4290565b60008061044386868686610370565b60345490915080821161048757603254670de0b6b3a76400006031548461046a9190610678565b610474919061068f565b61047e91906106b1565b925050506101fe565b6000603254670de0b6b3a7640000603154846104a39190610678565b6104ad919061068f565b6104b791906106b1565b90506000828403905081670de0b6b3a7640000603354836104d89190610678565b6104e2919061068f565b6104ec91906106b1565b9998505050505050505050565b6105237f00000000000000000000000000000000000000000000000000000000002819a08561068f565b6032556105507f00000000000000000000000000000000000000000000000000000000002819a08461068f565b60315561057d7f00000000000000000000000000000000000000000000000000000000002819a08361068f565b60338190556034829055603254603154604080519283526020830191909152810191909152606081018290527f6960ab234c7ef4b0c9197100f5393cfcde7c453ac910a27bd2000aa1dd4c068d9060800160405180910390a150505050565b600080600080608085870312156105f257600080fd5b5050823594602084013594506040840135936060013592509050565b600080600080600060a0868803121561062657600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561067257610672610649565b92915050565b808202811582820484141761067257610672610649565b6000826106ac57634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561067257610672610649565b6000815180845260005b818110156106ea576020818501810151868301820152016106ce565b506000602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190526000906101fe908301846106c4565b60006020828403121561074057600080fd5b8151801515811461075057600080fd5b9392505050565b6001600160a01b038481168252831660208201526060604082018190526000906101fb908301846106c456fe7570646174654a756d70526174654d6f64656c2875696e743235362c75696e743235362c75696e743235362c75696e7432353629a2646970667358221220c93e2af3e05152d7c10d83dd7b48d9708df3ad5d5901502bf132652935f6e78164736f6c63430008190033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000136dcc951d8c00000000000000000000000000000000000000000000000000022b1c8c1227a00000000000000000000000000000000000000000000000000000b1a2bc2ec500000000000000000000000000000230058da2d23eb8836ec5db7037ef7250c56e25e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002819a0
-----Decoded View---------------
Arg [0] : baseRatePerYear_ (uint256): 0
Arg [1] : multiplierPerYear_ (uint256): 87500000000000000
Arg [2] : jumpMultiplierPerYear_ (uint256): 2500000000000000000
Arg [3] : kink_ (uint256): 800000000000000000
Arg [4] : accessControlManager_ (address): 0x230058da2D23eb8836EC5DB7037ef7250c56E25E
Arg [5] : timeBased_ (bool): False
Arg [6] : blocksPerYear_ (uint256): 2628000
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [1] : 0000000000000000000000000000000000000000000000000136dcc951d8c000
Arg [2] : 00000000000000000000000000000000000000000000000022b1c8c1227a0000
Arg [3] : 0000000000000000000000000000000000000000000000000b1a2bc2ec500000
Arg [4] : 000000000000000000000000230058da2d23eb8836ec5db7037ef7250c56e25e
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 00000000000000000000000000000000000000000000000000000000002819a0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.