Source Code
Overview
S Balance
More Info
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 24 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
22745338 | 14 days ago | 0 S | ||||
22745338 | 14 days ago | 0 S | ||||
22745338 | 14 days ago | 0 S | ||||
22745338 | 14 days ago | 0 S | ||||
22745338 | 14 days ago | 0 S | ||||
22745338 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744571 | 14 days ago | 0 S | ||||
22744559 | 14 days ago | 0 S |
Loading...
Loading
Contract Name:
MCR
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.18; import "@openzeppelin/contracts-v4/token/ERC20/IERC20.sol"; import "../../abstract/MasterAwareV2.sol"; import "../../interfaces/ICover.sol"; import "../../interfaces/IMCR.sol"; import "../../interfaces/IPool.sol"; import "../../interfaces/IPriceFeedOracle.sol"; import "../../libraries/Math.sol"; import "../../libraries/SafeUintCast.sol"; contract MCR is IMCR, MasterAwareV2 { using SafeUintCast for uint; // the following values are expressed in basis points uint16 public maxMCRIncrement = 500; uint24 public gearingFactor = 48000; // min update between MCR updates in seconds uint16 public minUpdateTime = 3600; uint80 public mcr; uint80 public desiredMCR; uint32 public lastUpdateTime; IMCR public previousMCR; event MCRUpdated( uint mcr, uint desiredMCR, uint mcrFloor, // unused uint mcrETHWithGear, uint totalSumAssured ); uint public constant MAX_MCR_ADJUSTMENT = 100; uint public constant BASIS_PRECISION = 10000; uint public immutable MCR_UPDATE_DEADLINE; constructor (address masterAddress, uint mcrUpdateDeadline) { changeMasterAddress(masterAddress); MCR_UPDATE_DEADLINE = mcrUpdateDeadline; if (masterAddress != address(0)) { previousMCR = IMCR(master.getLatestAddress("MC")); } } /* ========== DEPENDENCIES ========== */ function pool() internal view returns (IPool) { return IPool(internalContracts[uint(ID.P1)]); } function memberRoles() internal view returns (IMemberRoles) { return IMemberRoles(internalContracts[uint(ID.MR)]); } function cover() internal view returns (ICover) { return ICover(internalContracts[uint(ID.CO)]); } function changeDependentContractAddress() external override { internalContracts[uint(ID.P1)] = master.getLatestAddress("P1"); internalContracts[uint(ID.MR)] = master.getLatestAddress("MR"); internalContracts[uint(ID.CO)] = master.getLatestAddress("CO"); initialize(); } function initialize() internal { address currentMCR = master.getLatestAddress("MC"); if (address(previousMCR) == address(0) || currentMCR != address(this)) { // already initialized or not ready for initialization return; } // copy over values mcr = previousMCR.mcr(); desiredMCR = previousMCR.desiredMCR(); lastUpdateTime = previousMCR.lastUpdateTime(); // copy over parameters maxMCRIncrement = previousMCR.maxMCRIncrement(); gearingFactor = previousMCR.gearingFactor(); minUpdateTime = previousMCR.minUpdateTime(); previousMCR = IMCR(address(0)); } /** * @dev We need to move the mcr way below the current value otherwise swaps * won't work for a while until mcr moves down by itself * @dev Remove this code after the tokenomics upgrade. */ function teleportMCR() external { require(address(previousMCR) == address(0), "MCR: not yet initialized"); require(mcr > 10_000 ether, "MCR: already updated"); require(block.timestamp < MCR_UPDATE_DEADLINE, "MCR: Deadline has passed"); mcr = 10_000 ether; desiredMCR = 10_000 ether; lastUpdateTime = block.timestamp.toUint32(); } /** * @dev Gets total sum assured (in ETH). * @return amount of sum assured */ function getTotalActiveCoverAmount() public view returns (uint) { IPool _pool = pool(); IPriceFeedOracle priceFeed = _pool.priceFeedOracle(); ICover _cover = cover(); uint totalActiveCoverAmountInEth = _cover.totalActiveCoverInAsset(0); Asset[] memory assets = _pool.getAssets(); // the first asset is ETH. skip it, it's already counted for (uint i = 1; i < assets.length; i++) { uint activeCoverAmount = _cover.totalActiveCoverInAsset(i); uint assetAmountInEth = priceFeed.getEthForAsset(assets[i].assetAddress, activeCoverAmount); totalActiveCoverAmountInEth += assetAmountInEth; } return totalActiveCoverAmountInEth; } /* * @dev trigger an MCR update. Current virtual MCR value is synced to storage * and a new desiredMCR value to move towards is set. * */ function updateMCR() whenNotPaused public { _updateMCR(false); } function updateMCRInternal(bool forceUpdate) public onlyInternal { _updateMCR(forceUpdate); } function _updateMCR(bool forceUpdate) internal { uint _gearingFactor = gearingFactor; uint _minUpdateTime = minUpdateTime; // read with 1 SLOAD uint112 _mcr = mcr; uint112 _desiredMCR = desiredMCR; uint32 _lastUpdateTime = lastUpdateTime; if (!forceUpdate && _lastUpdateTime + _minUpdateTime > block.timestamp) { return; } // sync the current virtual MCR value to storage uint80 newMCR = getMCR().toUint80(); if (newMCR != _mcr) { mcr = newMCR; } uint totalSumAssured = getTotalActiveCoverAmount(); uint gearedMCR = totalSumAssured * BASIS_PRECISION / _gearingFactor; uint80 newDesiredMCR = gearedMCR.toUint80(); if (newDesiredMCR != _desiredMCR) { desiredMCR = newDesiredMCR; } lastUpdateTime = uint32(block.timestamp); emit MCRUpdated(mcr, desiredMCR, 0, gearedMCR, totalSumAssured); } /** * @dev Calculates the current virtual MCR value. The virtual MCR value moves towards the desiredMCR value away * from the stored mcr value at constant velocity based on how much time passed from the lastUpdateTime. * The total change in virtual MCR cannot exceed 1% of stored mcr. * * This approach allows for the MCR to change smoothly across time without sudden jumps between values, while * always progressing towards the desiredMCR goal. The desiredMCR can change subject to the call of _updateMCR * so the virtual MCR value may change direction and start decreasing instead of increasing or vice-versa. * * @return mcr */ function getMCR() public view returns (uint) { // read with 1 SLOAD uint _mcr = mcr; uint _desiredMCR = desiredMCR; uint _lastUpdateTime = lastUpdateTime; uint _maxMCRIncrement = maxMCRIncrement; if (block.timestamp == _lastUpdateTime) { return _mcr; } uint basisPointsAdjustment = _maxMCRIncrement * (block.timestamp - _lastUpdateTime) / 1 days; basisPointsAdjustment = Math.min(basisPointsAdjustment, MAX_MCR_ADJUSTMENT); if (_desiredMCR > _mcr) { return Math.min(_mcr * (basisPointsAdjustment + BASIS_PRECISION) / BASIS_PRECISION, _desiredMCR); } // in case desiredMCR <= mcr return Math.max(_mcr * (BASIS_PRECISION - basisPointsAdjustment) / (BASIS_PRECISION), _desiredMCR); } function getGearedMCR() external view returns (uint) { return getTotalActiveCoverAmount() * BASIS_PRECISION / gearingFactor; } /** * @dev Updates Uint Parameters * @param code parameter code * @param value new value */ function updateUintParameters(bytes8 code, uint value) public onlyGovernance { if (code == "MMIC") { maxMCRIncrement = value.toUint16(); } else if (code == "GEAR") { gearingFactor = value.toUint24(); } else if (code == "MUTI") { minUpdateTime = value.toUint16(); } else { revert("Invalid param code"); } } }
// 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.18; import "../interfaces/ISAFURAMaster.sol"; import "../interfaces/IMasterAwareV2.sol"; import "../interfaces/IMemberRoles.sol"; abstract contract MasterAwareV2 is IMasterAwareV2 { ISAFURAMaster public master; mapping(uint => address payable) public internalContracts; modifier onlyMember { require( IMemberRoles(internalContracts[uint(ID.MR)]).checkRole( msg.sender, uint(IMemberRoles.Role.Member) ), "Caller is not a member" ); _; } modifier onlyAdvisoryBoard { require( IMemberRoles(internalContracts[uint(ID.MR)]).checkRole( msg.sender, uint(IMemberRoles.Role.AdvisoryBoard) ), "Caller is not an advisory board member" ); _; } modifier onlyInternal { require(master.isInternal(msg.sender), "Caller is not an internal contract"); _; } modifier onlyMaster { if (address(master) != address(0)) { require(address(master) == msg.sender, "Not master"); } _; } modifier onlyGovernance { require( master.checkIsAuthToGoverned(msg.sender), "Caller is not authorized to govern" ); _; } modifier onlyEmergencyAdmin { require( msg.sender == master.emergencyAdmin(), "Caller is not emergency admin" ); _; } modifier whenPaused { require(master.isPause(), "System is not paused"); _; } modifier whenNotPaused { require(!master.isPause(), "System is paused"); _; } function getInternalContractAddress(ID id) internal view returns (address payable) { return internalContracts[uint(id)]; } function changeMasterAddress(address masterAddress) public onlyMaster { master = ISAFURAMaster(masterAddress); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; import "./IStakingPoolFactory.sol"; /** * @dev IStakingPoolFactory is missing the changeOperator() and operator() functions. * @dev Any change to the original interface will affect staking pool addresses * @dev This interface is created to add the missing functions so it can be used in other contracts. */ interface ICompleteStakingPoolFactory is IStakingPoolFactory { function operator() external view returns (address); function changeOperator(address newOperator) external; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; import "./ICoverNFT.sol"; import "./IStakingNFT.sol"; import "./IStakingPool.sol"; import "./ICompleteStakingPoolFactory.sol"; /* io structs */ enum ClaimMethod { IndividualClaims, YieldTokenIncidents } struct PoolAllocationRequest { uint40 poolId; bool skip; uint coverAmountInAsset; } struct BuyCoverParams { uint coverId; address owner; uint24 productId; uint8 coverAsset; uint96 amount; uint32 period; uint maxPremiumInAsset; uint8 paymentAsset; uint16 commissionRatio; address commissionDestination; string ipfsData; } /* storage structs */ struct PoolAllocation { uint40 poolId; uint96 coverAmountInNXM; uint96 premiumInNXM; uint24 allocationId; } struct CoverData { uint24 productId; uint8 coverAsset; uint96 amountPaidOut; } struct CoverSegment { uint96 amount; uint32 start; uint32 period; // seconds uint32 gracePeriod; // seconds uint24 globalRewardsRatio; uint24 globalCapacityRatio; } interface ICover { /* ========== DATA STRUCTURES ========== */ /* internal structs */ struct RequestAllocationVariables { uint previousPoolAllocationsLength; uint previousPremiumInNXM; uint refund; uint coverAmountInNXM; } /* storage structs */ struct ActiveCover { // Global active cover amount per asset. uint192 totalActiveCoverInAsset; // The last time activeCoverExpirationBuckets was updated uint64 lastBucketUpdateId; } /* ========== VIEWS ========== */ function coverData(uint coverId) external view returns (CoverData memory); function coverDataCount() external view returns (uint); function coverSegmentsCount(uint coverId) external view returns (uint); function coverSegments(uint coverId) external view returns (CoverSegment[] memory); function coverSegmentWithRemainingAmount( uint coverId, uint segmentId ) external view returns (CoverSegment memory); function recalculateActiveCoverInAsset(uint coverAsset) external; function totalActiveCoverInAsset(uint coverAsset) external view returns (uint); function getGlobalCapacityRatio() external view returns (uint); function getGlobalRewardsRatio() external view returns (uint); function getGlobalMinPriceRatio() external pure returns (uint); function getGlobalCapacityAndPriceRatios() external view returns ( uint _globalCapacityRatio, uint _globalMinPriceRatio ); function GLOBAL_MIN_PRICE_RATIO() external view returns (uint); /* === MUTATIVE FUNCTIONS ==== */ function buyCover( BuyCoverParams calldata params, PoolAllocationRequest[] calldata coverChunkRequests ) external payable returns (uint coverId); function burnStake( uint coverId, uint segmentId, uint amount ) external returns (address coverOwner); function changeStakingPoolFactoryOperator() external; function coverNFT() external returns (ICoverNFT); function stakingNFT() external returns (IStakingNFT); function stakingPoolFactory() external returns (ICompleteStakingPoolFactory); /* ========== EVENTS ========== */ event CoverEdited(uint indexed coverId, uint indexed productId, uint indexed segmentId, address buyer, string ipfsMetadata); // Auth error OnlyOwnerOrApproved(); // Cover details error CoverPeriodTooShort(); error CoverPeriodTooLong(); error CoverOutsideOfTheGracePeriod(); error CoverAmountIsZero(); // Products error ProductNotFound(); error ProductDeprecated(); error UnexpectedProductId(); // Cover and payment assets error CoverAssetNotSupported(); error InvalidPaymentAsset(); error UnexpectedCoverAsset(); error UnexpectedEthSent(); error EditNotSupported(); // Price & Commission error PriceExceedsMaxPremiumInAsset(); error CommissionRateTooHigh(); // ETH transfers error InsufficientEthSent(); error SendingEthToPoolFailed(); error SendingEthToCommissionDestinationFailed(); error ReturningEthRemainderToSenderFailed(); // Misc error ExpiredCoversCannotBeEdited(); error CoverNotYetExpired(uint coverId); error InsufficientCoverAmountAllocated(); error UnexpectedPoolId(); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; import "@openzeppelin/contracts-v4/token/ERC721/IERC721.sol"; interface ICoverNFT is IERC721 { function isApprovedOrOwner(address spender, uint tokenId) external returns (bool); function mint(address to) external returns (uint tokenId); function changeOperator(address newOperator) external; function changeNFTDescriptor(address newNFTDescriptor) external; function totalSupply() external view returns (uint); function name() external view returns (string memory); error NotOperator(); error NotMinted(); error WrongFrom(); error InvalidRecipient(); error InvalidNewOperatorAddress(); error InvalidNewNFTDescriptorAddress(); error NotAuthorized(); error UnsafeRecipient(); error AlreadyMinted(); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IMasterAwareV2 { // TODO: if you update this enum, update lib/constants.js as well enum ID { TC, // TokenController.sol P1, // Pool.sol MR, // MemberRoles.sol MC, // MCR.sol CO, // Cover.sol SP, // StakingProducts.sol PS, // LegacyPooledStaking.sol GV, // Governance.sol GW, // LegacyGateway.sol - removed CL, // CoverMigrator.sol - removed AS, // Assessment.sol CI, // IndividualClaims.sol - Claims for Individuals CG, // YieldTokenIncidents.sol - Claims for Groups RA, // Ramm.sol ST, // SafeTracker.sol CP // CoverProducts.sol } function changeMasterAddress(address masterAddress) external; function changeDependentContractAddress() external; function internalContracts(uint) external view returns (address payable); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IMCR { function updateMCRInternal(bool forceUpdate) external; function getMCR() external view returns (uint); function mcr() external view returns (uint80); function desiredMCR() external view returns (uint80); function lastUpdateTime() external view returns (uint32); function maxMCRIncrement() external view returns (uint16); function gearingFactor() external view returns (uint24); function minUpdateTime() external view returns (uint16); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IMemberRoles { enum Role {Unassigned, AdvisoryBoard, Member, Owner, Auditor} function join(address _userAddress, uint nonce, bytes calldata signature) external payable; function switchMembership(address _newAddress) external; function switchMembershipAndAssets( address newAddress, uint[] calldata coverIds, uint[] calldata stakingTokenIds ) external; function switchMembershipOf(address member, address _newAddress) external; function totalRoles() external view returns (uint256); function changeAuthorized(uint _roleId, address _newAuthorized) external; function setKycAuthAddress(address _add) external; function members(uint _memberRoleId) external view returns (uint, address[] memory memberArray); function numberOfMembers(uint _memberRoleId) external view returns (uint); function authorized(uint _memberRoleId) external view returns (address); function roles(address _memberAddress) external view returns (uint[] memory); function checkRole(address _memberAddress, uint _roleId) external view returns (bool); function getMemberLengthForAllRoles() external view returns (uint[] memory totalMembers); function memberAtIndex(uint _memberRoleId, uint index) external view returns (address, bool); function membersLength(uint _memberRoleId) external view returns (uint); event MemberRole(uint256 indexed roleId, bytes32 roleName, string roleDescription); event MemberJoined(address indexed newMember, uint indexed nonce); event switchedMembership(address indexed previousMember, address indexed newMember, uint timeStamp); event MembershipWithdrawn(address indexed member, uint timestamp); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; import "./IPriceFeedOracle.sol"; struct SwapDetails { uint104 minAmount; uint104 maxAmount; uint32 lastSwapTime; // 2 decimals of precision. 0.01% -> 0.0001 -> 1e14 uint16 maxSlippageRatio; } struct Asset { address assetAddress; bool isCoverAsset; bool isAbandoned; } interface IPool { function swapOperator() external view returns (address); function getAsset(uint assetId) external view returns (Asset memory); function getAssets() external view returns (Asset[] memory); function transferAssetToSwapOperator(address asset, uint amount) external; function setSwapDetailsLastSwapTime(address asset, uint32 lastSwapTime) external; function getAssetSwapDetails(address assetAddress) external view returns (SwapDetails memory); function sendPayout(uint assetIndex, address payable payoutAddress, uint amount, uint ethDepositAmount) external; function sendEth(address payoutAddress, uint amount) external; function upgradeCapitalPool(address payable newPoolAddress) external; function priceFeedOracle() external view returns (IPriceFeedOracle); function getPoolValueInEth() external view returns (uint); function calculateMCRRatio(uint totalAssetValue, uint mcrEth) external pure returns (uint); function getInternalTokenPriceInAsset(uint assetId) external view returns (uint tokenPrice); function getInternalTokenPriceInAssetAndUpdateTwap(uint assetId) external returns (uint tokenPrice); function getTokenPrice() external view returns (uint tokenPrice); function getMCRRatio() external view returns (uint); function setSwapValue(uint value) external; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface Aggregator { function decimals() external view returns (uint8); function latestAnswer() external view returns (int); } interface IPriceFeedOracle { struct OracleAsset { Aggregator aggregator; uint8 decimals; } function ETH() external view returns (address); function assets(address) external view returns (Aggregator, uint8); function getAssetToEthRate(address asset) external view returns (uint); function getAssetForEth(address asset, uint ethIn) external view returns (uint); function getEthForAsset(address asset, uint amount) external view returns (uint); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface ISAFURAMaster { function tokenAddress() external view returns (address); function owner() external view returns (address); function emergencyAdmin() external view returns (address); function masterInitialized() external view returns (bool); function isInternal(address _add) external view returns (bool); function isPause() external view returns (bool check); function isMember(address _add) external view returns (bool); function checkIsAuthToGoverned(address _add) external view returns (bool); function getLatestAddress(bytes2 _contractName) external view returns (address payable contractAddress); function contractAddresses(bytes2 code) external view returns (address payable); function upgradeMultipleContracts( bytes2[] calldata _contractCodes, address payable[] calldata newAddresses ) external; function removeContracts(bytes2[] calldata contractCodesToRemove) external; function addNewInternalContracts( bytes2[] calldata _contractCodes, address payable[] calldata newAddresses, uint[] calldata _types ) external; function updateOwnerParameters(bytes8 code, address payable val) external; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; import "@openzeppelin/contracts-v4/token/ERC721/IERC721.sol"; interface IStakingNFT is IERC721 { function isApprovedOrOwner(address spender, uint tokenId) external returns (bool); function mint(uint poolId, address to) external returns (uint tokenId); function changeOperator(address newOperator) external; function changeNFTDescriptor(address newNFTDescriptor) external; function totalSupply() external returns (uint); function tokenInfo(uint tokenId) external view returns (uint poolId, address owner); function stakingPoolOf(uint tokenId) external view returns (uint poolId); function stakingPoolFactory() external view returns (address); function name() external view returns (string memory); error NotOperator(); error NotMinted(); error WrongFrom(); error InvalidRecipient(); error InvalidNewOperatorAddress(); error InvalidNewNFTDescriptorAddress(); error NotAuthorized(); error UnsafeRecipient(); error AlreadyMinted(); error NotStakingPool(); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; /* structs for io */ struct AllocationRequest { uint productId; uint coverId; uint allocationId; uint period; uint gracePeriod; bool useFixedPrice; uint previousStart; uint previousExpiration; uint previousRewardsRatio; uint globalCapacityRatio; uint capacityReductionRatio; uint rewardRatio; uint globalMinPrice; } struct BurnStakeParams { uint allocationId; uint productId; uint start; uint period; uint deallocationAmount; } interface IStakingPool { /* structs for storage */ // stakers are grouped in tranches based on the timelock expiration // tranche index is calculated based on the expiration date // the initial proposal is to have 4 tranches per year (1 tranche per quarter) struct Tranche { uint128 stakeShares; uint128 rewardsShares; } struct ExpiredTranche { uint96 accNxmPerRewardShareAtExpiry; uint96 stakeAmountAtExpiry; // nxm total supply is 6.7e24 and uint96.max is 7.9e28 uint128 stakeSharesSupplyAtExpiry; } struct Deposit { uint96 lastAccNxmPerRewardShare; uint96 pendingRewards; uint128 stakeShares; uint128 rewardsShares; } function initialize( bool isPrivatePool, uint initialPoolFee, uint maxPoolFee, uint _poolId, string memory ipfsDescriptionHash ) external; function processExpirations(bool updateUntilCurrentTimestamp) external; function requestAllocation( uint amount, uint previousPremium, AllocationRequest calldata request ) external returns (uint premium, uint allocationId); function burnStake(uint amount, BurnStakeParams calldata params) external; function depositTo( uint amount, uint trancheId, uint requestTokenId, address destination ) external returns (uint tokenId); function withdraw( uint tokenId, bool withdrawStake, bool withdrawRewards, uint[] memory trancheIds ) external returns (uint withdrawnStake, uint withdrawnRewards); function isPrivatePool() external view returns (bool); function isHalted() external view returns (bool); function manager() external view returns (address); function getPoolId() external view returns (uint); function getPoolFee() external view returns (uint); function getMaxPoolFee() external view returns (uint); function getActiveStake() external view returns (uint); function getStakeSharesSupply() external view returns (uint); function getRewardsSharesSupply() external view returns (uint); function getRewardPerSecond() external view returns (uint); function getAccNxmPerRewardsShare() external view returns (uint); function getLastAccNxmUpdate() external view returns (uint); function getFirstActiveTrancheId() external view returns (uint); function getFirstActiveBucketId() external view returns (uint); function getNextAllocationId() external view returns (uint); function getDeposit(uint tokenId, uint trancheId) external view returns ( uint lastAccNxmPerRewardShare, uint pendingRewards, uint stakeShares, uint rewardsShares ); function getTranche(uint trancheId) external view returns ( uint stakeShares, uint rewardsShares ); function getExpiredTranche(uint trancheId) external view returns ( uint accNxmPerRewardShareAtExpiry, uint stakeAmountAtExpiry, uint stakeShareSupplyAtExpiry ); function setPoolFee(uint newFee) external; function setPoolPrivacy(bool isPrivatePool) external; function getActiveAllocations( uint productId ) external view returns (uint[] memory trancheAllocations); function getTrancheCapacities( uint productId, uint firstTrancheId, uint trancheCount, uint capacityRatio, uint reductionRatio ) external view returns (uint[] memory trancheCapacities); /* ========== EVENTS ========== */ event StakeDeposited(address indexed user, uint256 amount, uint256 trancheId, uint256 tokenId); event DepositExtended(address indexed user, uint256 tokenId, uint256 initialTrancheId, uint256 newTrancheId, uint256 topUpAmount); event PoolPrivacyChanged(address indexed manager, bool isPrivate); event PoolFeeChanged(address indexed manager, uint newFee); event PoolDescriptionSet(string ipfsDescriptionHash); event Withdraw(address indexed user, uint indexed tokenId, uint tranche, uint amountStakeWithdrawn, uint amountRewardsWithdrawn); event StakeBurned(uint amount); event Deallocated(uint productId); event BucketExpired(uint bucketId); event TrancheExpired(uint trancheId); // Auth error OnlyCoverContract(); error OnlyStakingProductsContract(); error OnlyManager(); error PrivatePool(); error SystemPaused(); error PoolHalted(); // Fees error PoolFeeExceedsMax(); error MaxPoolFeeAbove100(); // Voting error NxmIsLockedForGovernanceVote(); error ManagerNxmIsLockedForGovernanceVote(); // Deposit error InsufficientDepositAmount(); error RewardRatioTooHigh(); // Staking NFTs error InvalidTokenId(); error NotTokenOwnerOrApproved(); error InvalidStakingPoolForToken(); // Tranche & capacity error NewTrancheEndsBeforeInitialTranche(); error RequestedTrancheIsNotYetActive(); error RequestedTrancheIsExpired(); error InsufficientCapacity(); // Allocation error AlreadyDeallocated(uint allocationId); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IStakingPoolFactory { function stakingPoolCount() external view returns (uint); function beacon() external view returns (address); function create(address beacon) external returns (uint poolId, address stakingPoolAddress); event StakingPoolCreated(uint indexed poolId, address indexed stakingPoolAddress); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.18; /** * @dev Simple library that defines min, max and babylonian sqrt functions */ library Math { function min(uint a, uint b) internal pure returns (uint) { return a < b ? a : b; } function max(uint a, uint b) internal pure returns (uint) { return a > b ? a : b; } function sum(uint[] memory items) internal pure returns (uint) { uint count = items.length; uint total; for (uint i = 0; i < count; i++) { total += items[i]; } return total; } function divRound(uint a, uint b) internal pure returns (uint) { return (a + b / 2) / b; } function divCeil(uint a, uint b) internal pure returns (uint) { return (a + b - 1) / b; } function roundUp(uint a, uint b) internal pure returns (uint) { return divCeil(a, b) * b; } // babylonian method function sqrt(uint y) internal pure returns (uint) { if (y > 3) { uint z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } return z; } if (y != 0) { return 1; } return 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.18; /** * @dev Wrappers over Solidity's uintXX casting operators with added overflow * checks. * * Downcasting from uint256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeUintCast { /** * @dev Returns the downcasted uint248 from uint256, reverting on * overflow (when the input is greater than largest uint248). * * Counterpart to Solidity's `uint248` operator. * * Requirements: * * - input must fit into 248 bits */ function toUint248(uint256 value) internal pure returns (uint248) { require(value < 2**248, "SafeCast: value doesn\'t fit in 248 bits"); return uint248(value); } /** * @dev Returns the downcasted uint240 from uint256, reverting on * overflow (when the input is greater than largest uint240). * * Counterpart to Solidity's `uint240` operator. * * Requirements: * * - input must fit into 240 bits */ function toUint240(uint256 value) internal pure returns (uint240) { require(value < 2**240, "SafeCast: value doesn\'t fit in 240 bits"); return uint240(value); } /** * @dev Returns the downcasted uint232 from uint256, reverting on * overflow (when the input is greater than largest uint232). * * Counterpart to Solidity's `uint232` operator. * * Requirements: * * - input must fit into 232 bits */ function toUint232(uint256 value) internal pure returns (uint232) { require(value < 2**232, "SafeCast: value doesn\'t fit in 232 bits"); return uint232(value); } /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits */ function toUint224(uint256 value) internal pure returns (uint224) { require(value < 2**224, "SafeCast: value doesn\'t fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint216 from uint256, reverting on * overflow (when the input is greater than largest uint216). * * Counterpart to Solidity's `uint216` operator. * * Requirements: * * - input must fit into 216 bits */ function toUint216(uint256 value) internal pure returns (uint216) { require(value < 2**216, "SafeCast: value doesn\'t fit in 216 bits"); return uint216(value); } /** * @dev Returns the downcasted uint208 from uint256, reverting on * overflow (when the input is greater than largest uint208). * * Counterpart to Solidity's `uint208` operator. * * Requirements: * * - input must fit into 208 bits */ function toUint208(uint256 value) internal pure returns (uint208) { require(value < 2**208, "SafeCast: value doesn\'t fit in 208 bits"); return uint208(value); } /** * @dev Returns the downcasted uint200 from uint256, reverting on * overflow (when the input is greater than largest uint200). * * Counterpart to Solidity's `uint200` operator. * * Requirements: * * - input must fit into 200 bits */ function toUint200(uint256 value) internal pure returns (uint200) { require(value < 2**200, "SafeCast: value doesn\'t fit in 200 bits"); return uint200(value); } /** * @dev Returns the downcasted uint192 from uint256, reverting on * overflow (when the input is greater than largest uint192). * * Counterpart to Solidity's `uint192` operator. * * Requirements: * * - input must fit into 192 bits */ function toUint192(uint256 value) internal pure returns (uint192) { require(value < 2**192, "SafeCast: value doesn\'t fit in 192 bits"); return uint192(value); } /** * @dev Returns the downcasted uint184 from uint256, reverting on * overflow (when the input is greater than largest uint184). * * Counterpart to Solidity's `uint184` operator. * * Requirements: * * - input must fit into 184 bits */ function toUint184(uint256 value) internal pure returns (uint184) { require(value < 2**184, "SafeCast: value doesn\'t fit in 184 bits"); return uint184(value); } /** * @dev Returns the downcasted uint176 from uint256, reverting on * overflow (when the input is greater than largest uint176). * * Counterpart to Solidity's `uint176` operator. * * Requirements: * * - input must fit into 176 bits */ function toUint176(uint256 value) internal pure returns (uint176) { require(value < 2**176, "SafeCast: value doesn\'t fit in 176 bits"); return uint176(value); } /** * @dev Returns the downcasted uint168 from uint256, reverting on * overflow (when the input is greater than largest uint168). * * Counterpart to Solidity's `uint168` operator. * * Requirements: * * - input must fit into 168 bits */ function toUint168(uint256 value) internal pure returns (uint168) { require(value < 2**168, "SafeCast: value doesn\'t fit in 168 bits"); return uint168(value); } /** * @dev Returns the downcasted uint160 from uint256, reverting on * overflow (when the input is greater than largest uint160). * * Counterpart to Solidity's `uint160` operator. * * Requirements: * * - input must fit into 160 bits */ function toUint160(uint256 value) internal pure returns (uint160) { require(value < 2**160, "SafeCast: value doesn\'t fit in 160 bits"); return uint160(value); } /** * @dev Returns the downcasted uint152 from uint256, reverting on * overflow (when the input is greater than largest uint152). * * Counterpart to Solidity's `uint152` operator. * * Requirements: * * - input must fit into 152 bits */ function toUint152(uint256 value) internal pure returns (uint152) { require(value < 2**152, "SafeCast: value doesn\'t fit in 152 bits"); return uint152(value); } /** * @dev Returns the downcasted uint144 from uint256, reverting on * overflow (when the input is greater than largest uint144). * * Counterpart to Solidity's `uint144` operator. * * Requirements: * * - input must fit into 144 bits */ function toUint144(uint256 value) internal pure returns (uint144) { require(value < 2**144, "SafeCast: value doesn\'t fit in 144 bits"); return uint144(value); } /** * @dev Returns the downcasted uint136 from uint256, reverting on * overflow (when the input is greater than largest uint136). * * Counterpart to Solidity's `uint136` operator. * * Requirements: * * - input must fit into 136 bits */ function toUint136(uint256 value) internal pure returns (uint136) { require(value < 2**136, "SafeCast: value doesn\'t fit in 136 bits"); return uint136(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint120 from uint256, reverting on * overflow (when the input is greater than largest uint120). * * Counterpart to Solidity's `uint120` operator. * * Requirements: * * - input must fit into 120 bits */ function toUint120(uint256 value) internal pure returns (uint120) { require(value < 2**120, "SafeCast: value doesn\'t fit in 120 bits"); return uint120(value); } /** * @dev Returns the downcasted uint112 from uint256, reverting on * overflow (when the input is greater than largest uint112). * * Counterpart to Solidity's `uint112` operator. * * Requirements: * * - input must fit into 112 bits */ function toUint112(uint256 value) internal pure returns (uint112) { require(value < 2**112, "SafeCast: value doesn\'t fit in 112 bits"); return uint112(value); } /** * @dev Returns the downcasted uint104 from uint256, reverting on * overflow (when the input is greater than largest uint104). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 104 bits */ function toUint104(uint256 value) internal pure returns (uint104) { require(value < 2**104, "SafeCast: value doesn\'t fit in 104 bits"); return uint104(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 96 bits */ function toUint96(uint256 value) internal pure returns (uint96) { require(value < 2**96, "SafeCast: value doesn\'t fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint88 from uint256, reverting on * overflow (when the input is greater than largest uint88). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 88 bits */ function toUint88(uint256 value) internal pure returns (uint88) { require(value < 2**88, "SafeCast: value doesn\'t fit in 88 bits"); return uint88(value); } /** * @dev Returns the downcasted uint80 from uint256, reverting on * overflow (when the input is greater than largest uint80). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 80 bits */ function toUint80(uint256 value) internal pure returns (uint80) { require(value < 2**80, "SafeCast: value doesn\'t fit in 80 bits"); return uint80(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint56 from uint256, reverting on * overflow (when the input is greater than largest uint56). * * Counterpart to Solidity's `uint56` operator. * * Requirements: * * - input must fit into 56 bits */ function toUint56(uint256 value) internal pure returns (uint56) { require(value < 2**56, "SafeCast: value doesn\'t fit in 56 bits"); return uint56(value); } /** * @dev Returns the downcasted uint48 from uint256, reverting on * overflow (when the input is greater than largest uint48). * * Counterpart to Solidity's `uint48` operator. * * Requirements: * * - input must fit into 48 bits */ function toUint48(uint256 value) internal pure returns (uint48) { require(value < 2**48, "SafeCast: value doesn\'t fit in 48 bits"); return uint48(value); } /** * @dev Returns the downcasted uint40 from uint256, reverting on * overflow (when the input is greater than largest uint40). * * Counterpart to Solidity's `uint40` operator. * * Requirements: * * - input must fit into 40 bits */ function toUint40(uint256 value) internal pure returns (uint40) { require(value < 2**40, "SafeCast: value doesn\'t fit in 40 bits"); return uint40(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint24 from uint256, reverting on * overflow (when the input is greater than largest uint24). * * Counterpart to Solidity's `uint24` operator. * * Requirements: * * - input must fit into 24 bits */ function toUint24(uint256 value) internal pure returns (uint24) { require(value < 2**24, "SafeCast: value doesn\'t fit in 24 bits"); return uint24(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits"); return uint8(value); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"masterAddress","type":"address"},{"internalType":"uint256","name":"mcrUpdateDeadline","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mcr","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"desiredMCR","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mcrFloor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mcrETHWithGear","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalSumAssured","type":"uint256"}],"name":"MCRUpdated","type":"event"},{"inputs":[],"name":"BASIS_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MCR_ADJUSTMENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MCR_UPDATE_DEADLINE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changeDependentContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"masterAddress","type":"address"}],"name":"changeMasterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"desiredMCR","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gearingFactor","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGearedMCR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMCR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalActiveCoverAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"internalContracts","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"master","outputs":[{"internalType":"contract ISAFURAMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMCRIncrement","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mcr","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minUpdateTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"previousMCR","outputs":[{"internalType":"contract IMCR","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teleportMCR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateMCR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"forceUpdate","type":"bool"}],"name":"updateMCRInternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes8","name":"code","type":"bytes8"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateUintParameters","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526002805466ffffffffffffff1916660e1000bb8001f41790553480156200002a57600080fd5b5060405162001c4038038062001c408339810160408190526200004d91620001a2565b620000588262000109565b60808190526001600160a01b0382161562000101576000546040516227050b60e31b8152614d4360f01b60048201526001600160a01b0390911690630138285890602401602060405180830381865afa158015620000ba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000e09190620001d3565b600380546001600160a01b0319166001600160a01b03929092169190911790555b5050620001fa565b6000546001600160a01b03161562000167576000546001600160a01b03163314620001675760405162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b604482015260640160405180910390fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811681146200019f57600080fd5b50565b60008060408385031215620001b657600080fd5b8251620001c38162000189565b6020939093015192949293505050565b600060208284031215620001e657600080fd5b8151620001f38162000189565b9392505050565b608051611a236200021d6000396000818161031001526107f80152611a236000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c80639dd86e0f116100b8578063d46655f41161007c578063d46655f4146102ac578063dd386e94146102bf578063eb2fe983146102c7578063eb962360146102cf578063ee97f7f3146102f8578063fa57798d1461030b57600080fd5b80639dd86e0f1461021c578063a399af0f1461022f578063a8a41a681461023d578063b8caedc414610266578063c8f33c911461028057600080fd5b806344936b10116100ff57806344936b10146101d157806349edd0c7146101d957806369da148d146101e25780636ec210d91461020c57806390c8c6851461021457600080fd5b8063017e7d8f1461013c578063024687fd146101735780630ea9c9841461019e57806333b385ae146101a8578063364c45fe146101be575b600080fd5b60025461015690600160881b90046001600160501b031681565b6040516001600160501b0390911681526020015b60405180910390f35b600354610186906001600160a01b031681565b6040516001600160a01b03909116815260200161016a565b6101a6610332565b005b6101b0606481565b60405190815260200161016a565b6101a66101cc366004611657565b610552565b6101b0610626565b6101b061271081565b6002546101f99065010000000000900461ffff1681565b60405161ffff909116815260200161016a565b6101b0610705565b6101a661073a565b6101a661022a36600461167b565b6108bd565b6002546101f99061ffff1681565b6002546102529062010000900462ffffff1681565b60405162ffffff909116815260200161016a565b60025461015690600160381b90046001600160501b031681565b60025461029790600160d81b900463ffffffff1681565b60405163ffffffff909116815260200161016a565b6101a66102ba3660046116c9565b610a7b565b6101b0610af5565b6101a6610d92565b6101866102dd3660046116e6565b6001602052600090815260409020546001600160a01b031681565b600054610186906001600160a01b031681565b6101b07f000000000000000000000000000000000000000000000000000000000000000081565b6000546040516227050b60e31b815261503160f01b60048201526001600160a01b0390911690630138285890602401602060405180830381865afa15801561037e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a291906116ff565b600160008181526020919091527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80546001600160a01b039384166001600160a01b0319909116179055546040516227050b60e31b81526126a960f11b6004820152911690630138285890602401602060405180830381865afa15801561042d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045191906116ff565b6002600090815260016020527fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f80546001600160a01b039384166001600160a01b0319909116179055546040516227050b60e31b815261434f60f01b6004820152911690630138285890602401602060405180830381865afa1580156104db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ff91906116ff565b600460005260016020527fedc95719e9a3b28dd8e80877cb5880a9be7de1a13fc8b05e7999683b6b56764380546001600160a01b0319166001600160a01b0392909216919091179055610550610e51565b565b6000546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be919061171c565b61061a5760405162461bcd60e51b815260206004820152602260248201527f43616c6c6572206973206e6f7420616e20696e7465726e616c20636f6e74726160448201526118dd60f21b60648201526084015b60405180910390fd5b61062381611286565b50565b6002546000906001600160501b03600160381b8204811691600160881b81049091169063ffffffff600160d81b8204169061ffff164282900361066c5750919392505050565b60006201518061067c844261174f565b6106869084611762565b6106909190611779565b905061069d81606461145a565b9050848411156106db576106d16127106106b7818461179b565b6106c19088611762565b6106cb9190611779565b8561145a565b9550505050505090565b6106d16127106106eb838261174f565b6106f59088611762565b6106ff9190611779565b85611474565b60025460009062010000900462ffffff16612710610721610af5565b61072b9190611762565b6107359190611779565b905090565b6003546001600160a01b0316156107935760405162461bcd60e51b815260206004820152601860248201527f4d43523a206e6f742079657420696e697469616c697a656400000000000000006044820152606401610611565b60025469021e19e0c9bab2400000600160381b9091046001600160501b0316116107f65760405162461bcd60e51b81526020600482015260146024820152731350d48e88185b1c9958591e481d5c19185d195960621b6044820152606401610611565b7f000000000000000000000000000000000000000000000000000000000000000042106108655760405162461bcd60e51b815260206004820152601860248201527f4d43523a20446561646c696e65206861732070617373656400000000000000006044820152606401610611565b60028054670100000000000000600160d81b031916700878678326eac90000000878678326eac9604e1b17905561089b42611483565b6002601b6101000a81548163ffffffff021916908363ffffffff160217905550565b600054604051632c1a733d60e11b81523360048201526001600160a01b0390911690635834e67a90602401602060405180830381865afa158015610905573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610929919061171c565b6109805760405162461bcd60e51b815260206004820152602260248201527f43616c6c6572206973206e6f7420617574686f72697a656420746f20676f7665604482015261393760f11b6064820152608401610611565b6001600160c01b03198216634d4d494360e01b036109bb576109a1816114ec565b6002805461ffff191661ffff929092169190911790555050565b6001600160c01b031982166323a2a0a960e11b036109fd576109dc8161154f565b6002806101000a81548162ffffff021916908362ffffff1602179055505050565b6001600160c01b03198216634d55544960e01b03610a3e57610a1e816114ec565b600260056101000a81548161ffff021916908361ffff1602179055505050565b60405162461bcd60e51b8152602060048201526012602482015271496e76616c696420706172616d20636f646560701b6044820152606401610611565b6000546001600160a01b031615610ad3576000546001600160a01b03163314610ad35760405162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b6044820152606401610611565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080610b006115b3565b90506000816001600160a01b031663b9ab99276040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6691906116ff565b90506000610b726115d9565b60405163f480b7b960e01b81526000600482018190529192506001600160a01b0383169063f480b7b990602401602060405180830381865afa158015610bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be091906117ae565b90506000846001600160a01b03166367e4ac2c6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c4a9190810190611837565b905060015b8151811015610d875760405163f480b7b960e01b8152600481018290526000906001600160a01b0386169063f480b7b990602401602060405180830381865afa158015610ca0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc491906117ae565b90506000866001600160a01b031663bbff4e5a858581518110610ce957610ce9611926565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401602060405180830381865afa158015610d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6491906117ae565b9050610d70818661179b565b945050508080610d7f9061193c565b915050610c4f565b509095945050505050565b60008054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e07919061171c565b15610e475760405162461bcd60e51b815260206004820152601060248201526f14de5cdd195b481a5cc81c185d5cd95960821b6044820152606401610611565b6105506000611286565b600080546040516227050b60e31b8152614d4360f01b60048201526001600160a01b0390911690630138285890602401602060405180830381865afa158015610e9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec291906116ff565b6003549091506001600160a01b03161580610ee657506001600160a01b0381163014155b15610eee5750565b600360009054906101000a90046001600160a01b03166001600160a01b031663b8caedc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190611955565b600260076101000a8154816001600160501b0302191690836001600160501b03160217905550600360009054906101000a90046001600160a01b03166001600160a01b031663017e7d8f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fde573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110029190611955565b600260116101000a8154816001600160501b0302191690836001600160501b03160217905550600360009054906101000a90046001600160a01b03166001600160a01b031663c8f33c916040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109f919061197e565b6002601b6101000a81548163ffffffff021916908363ffffffff160217905550600360009054906101000a90046001600160a01b03166001600160a01b031663a399af0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611112573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113691906119a4565b6002805461ffff191661ffff9290921691909117905560035460408051631514834d60e31b815290516001600160a01b039092169163a8a41a68916004808201926020929091908290030181865afa158015611196573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ba91906119c8565b6002806101000a81548162ffffff021916908362ffffff160217905550600360009054906101000a90046001600160a01b03166001600160a01b03166369da148d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e91906119a4565b6002805461ffff92909216650100000000000266ffff00000000001990921691909117905550600380546001600160a01b0319169055565b60025462ffffff620100008204169061ffff65010000000000820416906001600160501b03600160381b8204811691600160881b81049091169063ffffffff600160d81b90910416851580156112ea5750426112e88563ffffffff841661179b565b115b156112f757505050505050565b6000611309611304610626565b6115e5565b9050836001600160701b0316816001600160501b031614611350576002805470ffffffffffffffffffff000000000000001916600160381b6001600160501b038416021790555b600061135a610af5565b905060008761136b61271084611762565b6113759190611779565b90506000611382826115e5565b9050856001600160701b0316816001600160501b0316146113c5576002805469ffffffffffffffffffff60881b1916600160881b6001600160501b038416021790555b6002805463ffffffff60d81b1916600160d81b4263ffffffff1602179081905560408051600160381b83046001600160501b039081168252600160881b909304909216602083015260009082015260608101839052608081018490527f6e87c25e322c4ad68faf7916d0788baaf714d806fe887a84ee4b84ad9666f6869060a00160405180910390a150505050505050505050565b6000818310611469578161146b565b825b90505b92915050565b6000818311611469578161146b565b600064010000000082106114e85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610611565b5090565b60006201000082106114e85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203160448201526536206269747360d01b6064820152608401610611565b6000630100000082106114e85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201526534206269747360d01b6064820152608401610611565b6000600181815b81526020810191909152604001600020546001600160a01b0316919050565b600060018160046115ba565b6000600160501b82106114e85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203860448201526530206269747360d01b6064820152608401610611565b801515811461062357600080fd5b60006020828403121561166957600080fd5b813561167481611649565b9392505050565b6000806040838503121561168e57600080fd5b82356001600160c01b0319811681146116a657600080fd5b946020939093013593505050565b6001600160a01b038116811461062357600080fd5b6000602082840312156116db57600080fd5b8135611674816116b4565b6000602082840312156116f857600080fd5b5035919050565b60006020828403121561171157600080fd5b8151611674816116b4565b60006020828403121561172e57600080fd5b815161167481611649565b634e487b7160e01b600052601160045260246000fd5b8181038181111561146e5761146e611739565b808202811582820484141761146e5761146e611739565b60008261179657634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561146e5761146e611739565b6000602082840312156117c057600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611800576118006117c7565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561182f5761182f6117c7565b604052919050565b6000602080838503121561184a57600080fd5b825167ffffffffffffffff8082111561186257600080fd5b818501915085601f83011261187657600080fd5b815181811115611888576118886117c7565b611896848260051b01611806565b818152848101925060609182028401850191888311156118b557600080fd5b938501935b8285101561191a5780858a0312156118d25760008081fd5b6118da6117dd565b85516118e5816116b4565b8152858701516118f481611649565b8188015260408681015161190781611649565b90820152845293840193928501926118ba565b50979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161194e5761194e611739565b5060010190565b60006020828403121561196757600080fd5b81516001600160501b038116811461167457600080fd5b60006020828403121561199057600080fd5b815163ffffffff8116811461167457600080fd5b6000602082840312156119b657600080fd5b815161ffff8116811461167457600080fd5b6000602082840312156119da57600080fd5b815162ffffff8116811461167457600080fdfea2646970667358221220e255d5d248a3ebdd2144f6ee3d33b7b4ad00f423765f850eed21c3c879549e2464736f6c634300081200330000000000000000000000008ccaeded6fb1cb5bf69f7c8f16b0cf7e7885880c0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c80639dd86e0f116100b8578063d46655f41161007c578063d46655f4146102ac578063dd386e94146102bf578063eb2fe983146102c7578063eb962360146102cf578063ee97f7f3146102f8578063fa57798d1461030b57600080fd5b80639dd86e0f1461021c578063a399af0f1461022f578063a8a41a681461023d578063b8caedc414610266578063c8f33c911461028057600080fd5b806344936b10116100ff57806344936b10146101d157806349edd0c7146101d957806369da148d146101e25780636ec210d91461020c57806390c8c6851461021457600080fd5b8063017e7d8f1461013c578063024687fd146101735780630ea9c9841461019e57806333b385ae146101a8578063364c45fe146101be575b600080fd5b60025461015690600160881b90046001600160501b031681565b6040516001600160501b0390911681526020015b60405180910390f35b600354610186906001600160a01b031681565b6040516001600160a01b03909116815260200161016a565b6101a6610332565b005b6101b0606481565b60405190815260200161016a565b6101a66101cc366004611657565b610552565b6101b0610626565b6101b061271081565b6002546101f99065010000000000900461ffff1681565b60405161ffff909116815260200161016a565b6101b0610705565b6101a661073a565b6101a661022a36600461167b565b6108bd565b6002546101f99061ffff1681565b6002546102529062010000900462ffffff1681565b60405162ffffff909116815260200161016a565b60025461015690600160381b90046001600160501b031681565b60025461029790600160d81b900463ffffffff1681565b60405163ffffffff909116815260200161016a565b6101a66102ba3660046116c9565b610a7b565b6101b0610af5565b6101a6610d92565b6101866102dd3660046116e6565b6001602052600090815260409020546001600160a01b031681565b600054610186906001600160a01b031681565b6101b07f000000000000000000000000000000000000000000000000000000000000000081565b6000546040516227050b60e31b815261503160f01b60048201526001600160a01b0390911690630138285890602401602060405180830381865afa15801561037e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103a291906116ff565b600160008181526020919091527fcc69885fda6bcc1a4ace058b4a62bf5e179ea78fd58a1ccd71c22cc9b688792f80546001600160a01b039384166001600160a01b0319909116179055546040516227050b60e31b81526126a960f11b6004820152911690630138285890602401602060405180830381865afa15801561042d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061045191906116ff565b6002600090815260016020527fd9d16d34ffb15ba3a3d852f0d403e2ce1d691fb54de27ac87cd2f993f3ec330f80546001600160a01b039384166001600160a01b0319909116179055546040516227050b60e31b815261434f60f01b6004820152911690630138285890602401602060405180830381865afa1580156104db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ff91906116ff565b600460005260016020527fedc95719e9a3b28dd8e80877cb5880a9be7de1a13fc8b05e7999683b6b56764380546001600160a01b0319166001600160a01b0392909216919091179055610550610e51565b565b6000546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa15801561059a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105be919061171c565b61061a5760405162461bcd60e51b815260206004820152602260248201527f43616c6c6572206973206e6f7420616e20696e7465726e616c20636f6e74726160448201526118dd60f21b60648201526084015b60405180910390fd5b61062381611286565b50565b6002546000906001600160501b03600160381b8204811691600160881b81049091169063ffffffff600160d81b8204169061ffff164282900361066c5750919392505050565b60006201518061067c844261174f565b6106869084611762565b6106909190611779565b905061069d81606461145a565b9050848411156106db576106d16127106106b7818461179b565b6106c19088611762565b6106cb9190611779565b8561145a565b9550505050505090565b6106d16127106106eb838261174f565b6106f59088611762565b6106ff9190611779565b85611474565b60025460009062010000900462ffffff16612710610721610af5565b61072b9190611762565b6107359190611779565b905090565b6003546001600160a01b0316156107935760405162461bcd60e51b815260206004820152601860248201527f4d43523a206e6f742079657420696e697469616c697a656400000000000000006044820152606401610611565b60025469021e19e0c9bab2400000600160381b9091046001600160501b0316116107f65760405162461bcd60e51b81526020600482015260146024820152731350d48e88185b1c9958591e481d5c19185d195960621b6044820152606401610611565b7f000000000000000000000000000000000000000000000000000000000000000042106108655760405162461bcd60e51b815260206004820152601860248201527f4d43523a20446561646c696e65206861732070617373656400000000000000006044820152606401610611565b60028054670100000000000000600160d81b031916700878678326eac90000000878678326eac9604e1b17905561089b42611483565b6002601b6101000a81548163ffffffff021916908363ffffffff160217905550565b600054604051632c1a733d60e11b81523360048201526001600160a01b0390911690635834e67a90602401602060405180830381865afa158015610905573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610929919061171c565b6109805760405162461bcd60e51b815260206004820152602260248201527f43616c6c6572206973206e6f7420617574686f72697a656420746f20676f7665604482015261393760f11b6064820152608401610611565b6001600160c01b03198216634d4d494360e01b036109bb576109a1816114ec565b6002805461ffff191661ffff929092169190911790555050565b6001600160c01b031982166323a2a0a960e11b036109fd576109dc8161154f565b6002806101000a81548162ffffff021916908362ffffff1602179055505050565b6001600160c01b03198216634d55544960e01b03610a3e57610a1e816114ec565b600260056101000a81548161ffff021916908361ffff1602179055505050565b60405162461bcd60e51b8152602060048201526012602482015271496e76616c696420706172616d20636f646560701b6044820152606401610611565b6000546001600160a01b031615610ad3576000546001600160a01b03163314610ad35760405162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b6044820152606401610611565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080610b006115b3565b90506000816001600160a01b031663b9ab99276040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6691906116ff565b90506000610b726115d9565b60405163f480b7b960e01b81526000600482018190529192506001600160a01b0383169063f480b7b990602401602060405180830381865afa158015610bbc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610be091906117ae565b90506000846001600160a01b03166367e4ac2c6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610c22573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c4a9190810190611837565b905060015b8151811015610d875760405163f480b7b960e01b8152600481018290526000906001600160a01b0386169063f480b7b990602401602060405180830381865afa158015610ca0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc491906117ae565b90506000866001600160a01b031663bbff4e5a858581518110610ce957610ce9611926565b6020908102919091010151516040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101859052604401602060405180830381865afa158015610d40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6491906117ae565b9050610d70818661179b565b945050508080610d7f9061193c565b915050610c4f565b509095945050505050565b60008054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610de3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e07919061171c565b15610e475760405162461bcd60e51b815260206004820152601060248201526f14de5cdd195b481a5cc81c185d5cd95960821b6044820152606401610611565b6105506000611286565b600080546040516227050b60e31b8152614d4360f01b60048201526001600160a01b0390911690630138285890602401602060405180830381865afa158015610e9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec291906116ff565b6003549091506001600160a01b03161580610ee657506001600160a01b0381163014155b15610eee5750565b600360009054906101000a90046001600160a01b03166001600160a01b031663b8caedc46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190611955565b600260076101000a8154816001600160501b0302191690836001600160501b03160217905550600360009054906101000a90046001600160a01b03166001600160a01b031663017e7d8f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fde573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110029190611955565b600260116101000a8154816001600160501b0302191690836001600160501b03160217905550600360009054906101000a90046001600160a01b03166001600160a01b031663c8f33c916040518163ffffffff1660e01b8152600401602060405180830381865afa15801561107b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109f919061197e565b6002601b6101000a81548163ffffffff021916908363ffffffff160217905550600360009054906101000a90046001600160a01b03166001600160a01b031663a399af0f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611112573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113691906119a4565b6002805461ffff191661ffff9290921691909117905560035460408051631514834d60e31b815290516001600160a01b039092169163a8a41a68916004808201926020929091908290030181865afa158015611196573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111ba91906119c8565b6002806101000a81548162ffffff021916908362ffffff160217905550600360009054906101000a90046001600160a01b03166001600160a01b03166369da148d6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561122a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124e91906119a4565b6002805461ffff92909216650100000000000266ffff00000000001990921691909117905550600380546001600160a01b0319169055565b60025462ffffff620100008204169061ffff65010000000000820416906001600160501b03600160381b8204811691600160881b81049091169063ffffffff600160d81b90910416851580156112ea5750426112e88563ffffffff841661179b565b115b156112f757505050505050565b6000611309611304610626565b6115e5565b9050836001600160701b0316816001600160501b031614611350576002805470ffffffffffffffffffff000000000000001916600160381b6001600160501b038416021790555b600061135a610af5565b905060008761136b61271084611762565b6113759190611779565b90506000611382826115e5565b9050856001600160701b0316816001600160501b0316146113c5576002805469ffffffffffffffffffff60881b1916600160881b6001600160501b038416021790555b6002805463ffffffff60d81b1916600160d81b4263ffffffff1602179081905560408051600160381b83046001600160501b039081168252600160881b909304909216602083015260009082015260608101839052608081018490527f6e87c25e322c4ad68faf7916d0788baaf714d806fe887a84ee4b84ad9666f6869060a00160405180910390a150505050505050505050565b6000818310611469578161146b565b825b90505b92915050565b6000818311611469578161146b565b600064010000000082106114e85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401610611565b5090565b60006201000082106114e85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203160448201526536206269747360d01b6064820152608401610611565b6000630100000082106114e85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203260448201526534206269747360d01b6064820152608401610611565b6000600181815b81526020810191909152604001600020546001600160a01b0316919050565b600060018160046115ba565b6000600160501b82106114e85760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203860448201526530206269747360d01b6064820152608401610611565b801515811461062357600080fd5b60006020828403121561166957600080fd5b813561167481611649565b9392505050565b6000806040838503121561168e57600080fd5b82356001600160c01b0319811681146116a657600080fd5b946020939093013593505050565b6001600160a01b038116811461062357600080fd5b6000602082840312156116db57600080fd5b8135611674816116b4565b6000602082840312156116f857600080fd5b5035919050565b60006020828403121561171157600080fd5b8151611674816116b4565b60006020828403121561172e57600080fd5b815161167481611649565b634e487b7160e01b600052601160045260246000fd5b8181038181111561146e5761146e611739565b808202811582820484141761146e5761146e611739565b60008261179657634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561146e5761146e611739565b6000602082840312156117c057600080fd5b5051919050565b634e487b7160e01b600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715611800576118006117c7565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561182f5761182f6117c7565b604052919050565b6000602080838503121561184a57600080fd5b825167ffffffffffffffff8082111561186257600080fd5b818501915085601f83011261187657600080fd5b815181811115611888576118886117c7565b611896848260051b01611806565b818152848101925060609182028401850191888311156118b557600080fd5b938501935b8285101561191a5780858a0312156118d25760008081fd5b6118da6117dd565b85516118e5816116b4565b8152858701516118f481611649565b8188015260408681015161190781611649565b90820152845293840193928501926118ba565b50979650505050505050565b634e487b7160e01b600052603260045260246000fd5b60006001820161194e5761194e611739565b5060010190565b60006020828403121561196757600080fd5b81516001600160501b038116811461167457600080fd5b60006020828403121561199057600080fd5b815163ffffffff8116811461167457600080fd5b6000602082840312156119b657600080fd5b815161ffff8116811461167457600080fd5b6000602082840312156119da57600080fd5b815162ffffff8116811461167457600080fdfea2646970667358221220e255d5d248a3ebdd2144f6ee3d33b7b4ad00f423765f850eed21c3c879549e2464736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008ccaeded6fb1cb5bf69f7c8f16b0cf7e7885880c0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : masterAddress (address): 0x8CCaedEd6fB1cB5Bf69f7C8F16B0cf7e7885880c
Arg [1] : mcrUpdateDeadline (uint256): 0
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008ccaeded6fb1cb5bf69f7c8f16b0cf7e7885880c
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.