Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Revoke Role | 15440834 | 750 days ago | IN | 0 ETH | 0.00103928 | ||||
Revoke Role | 15440834 | 750 days ago | IN | 0 ETH | 0.00103928 | ||||
Grant Role | 15435363 | 751 days ago | IN | 0 ETH | 0.00150878 | ||||
Grant Role | 15435300 | 751 days ago | IN | 0 ETH | 0.00185267 | ||||
Grant Role | 15435290 | 751 days ago | IN | 0 ETH | 0.00200938 | ||||
Set Dynamic NFT ... | 15403709 | 756 days ago | IN | 0 ETH | 0.00195387 | ||||
0x60806040 | 15403538 | 756 days ago | IN | 0 ETH | 0.03093782 |
Latest 20 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16155657 | 648 days ago | 2 ETH | ||||
15998035 | 670 days ago | 2 ETH | ||||
15993556 | 671 days ago | 2 ETH | ||||
15870642 | 688 days ago | 2 ETH | ||||
15776477 | 701 days ago | 2 ETH | ||||
15776462 | 701 days ago | 2 ETH | ||||
15776458 | 701 days ago | 2 ETH | ||||
15770279 | 702 days ago | 2 ETH | ||||
15770273 | 702 days ago | 2 ETH | ||||
15770265 | 702 days ago | 2 ETH | ||||
15769582 | 702 days ago | 2 ETH | ||||
15768643 | 702 days ago | 2 ETH | ||||
15648115 | 719 days ago | 2 ETH | ||||
15634620 | 721 days ago | 2 ETH | ||||
15546886 | 733 days ago | 2 ETH | ||||
15528636 | 736 days ago | 2 ETH | ||||
15404547 | 756 days ago | 2 ETH | ||||
15404440 | 756 days ago | 6 ETH | ||||
15404439 | 756 days ago | 6 ETH | ||||
15404427 | 756 days ago | 2 ETH |
Loading...
Loading
Contract Name:
Treasury
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "./interfaces/ITreasury.sol"; import "./interfaces/INft.sol"; import "./Dynamic.sol"; contract Treasury is ITreasury, AccessControl, ReentrancyGuard { bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); address private cap3Wallet; address private genesisAddress; address private dynamicNftAddress; bool public isShutdown; mapping(address => uint256) private projectBalances; constructor(address _cap3Wallet, address _genesisAddress) { require(_cap3Wallet != address(0), "ADDRESS ZERO"); require(_genesisAddress != address(0), "ADDRESS ZERO"); cap3Wallet = _cap3Wallet; genesisAddress = _genesisAddress; _setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE); _setRoleAdmin(EXECUTOR_ROLE, ADMIN_ROLE); _setupRole(ADMIN_ROLE, _msgSender()); _setupRole(ADMIN_ROLE, address(this)); } /*------ Events -------*/ event Received(address sender, uint256 amount); event WithdrawnToProjectWallet(address _projectWallet, uint256 _amount); event Shutdown(); event DynamicNftAddressSet(address dynamicNftAddress, string Role1); event GenesisLimitSet(uint256 genesisCap); event ProjectBalanceSet(address projectWallet, uint256 balance); event FundsMovedToCap3Wallet(uint256 amount, address wallet); event UpdatedCoreContractAddress(address coreContractAddress, string Role); event Refunded(address to, uint256 _amount); /* ----- State changing functions ------ */ function shutdown(bool _isShutdown) public onlyRole(ADMIN_ROLE) { isShutdown = _isShutdown; emit Shutdown(); } function setDynamicNFTAddress(address _dynamicNftAddress) public onlyRole(ADMIN_ROLE) { require(_dynamicNftAddress != address(0), "ADDRESS ZERO"); dynamicNftAddress = _dynamicNftAddress; _setupRole(EXECUTOR_ROLE, _dynamicNftAddress); // _setupRole(ADMIN_ROLE, _dynamicNftAddress); emit DynamicNftAddressSet(_dynamicNftAddress, "EXECUTOR_ROLE"); } function setProjectBalance(address _projectWallet, uint256 _balance) public onlyRole(EXECUTOR_ROLE) { require(_projectWallet != address(0), "ADDRESS ZERO"); projectBalances[_projectWallet] = _balance; emit ProjectBalanceSet(_projectWallet, _balance); } function setAdminRole(address _adminAddress) public onlyRole(ADMIN_ROLE) { _setupRole(ADMIN_ROLE, _adminAddress); } function withdrawToProjectWallet(address _projectWallet, uint256 _amount) public onlyRole(EXECUTOR_ROLE) notShutdown nonReentrant { require(_projectWallet != address(0), "NO ZERO ADDRESS WITHDRAWAL"); require(address(this).balance >= _amount, "INSUFFICIENT FUNDS"); require(_amount > 0, "CANNOT WITHDRAW ZERO"); require(_amount <= projectBalances[_projectWallet], "INSUFFICIENT FUNDS ALLOCATION"); projectBalances[_projectWallet] -= _amount; (bool sent, ) = _projectWallet.call{value: _amount}(""); require(sent, "FAILED TO SEND ETHER"); emit WithdrawnToProjectWallet(_projectWallet, _amount); } function moveFundsOutOfTreasury() public onlyRole(ADMIN_ROLE) notShutdown nonReentrant { require(dynamicNftAddress != address(0), "DYNAMIC ADDRESS NOT SET"); INft genesisNFT = INft(genesisAddress); DynamicNft dynamicContract = DynamicNft(dynamicNftAddress); require(genesisNFT.totalSupply() == dynamicContract.getGenesisSupply(), "GENESIS NFT SALE NOT COMPLETED"); _moveFundsOutOfTreasury(); } function payRefund(address _to, uint256 _amount) external nonReentrant onlyRole(EXECUTOR_ROLE) { (bool sent, ) = _to.call{value: _amount}(""); require(sent, "FAILED TO SEND ETHER"); emit Refunded(_to, _amount); } receive() external payable { emit Received(msg.sender, msg.value); } /* ------ View Functions ------*/ function viewFundsInTreasury() public view onlyRole(ADMIN_ROLE) returns (uint256) { return address(this).balance; } function getProjectBalance(address _projectWallet) public view onlyRole(ADMIN_ROLE) returns (uint256) { return projectBalances[_projectWallet]; } /*------ Internal functions ------*/ function _moveFundsOutOfTreasury() internal { uint256 _amount = address(this).balance; (bool sent, ) = cap3Wallet.call{value: _amount}(""); require(sent, "FAILED TO SEND ETHER"); emit FundsMovedToCap3Wallet(_amount, cap3Wallet); } /*------ Modifiers ------*/ modifier notShutdown() { require(!isShutdown, "TREASURY IS SHUTDOWN"); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @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) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @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) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @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 revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; interface ITreasury { function withdrawToProjectWallet(address projectWallet, uint256 amount) external; function shutdown(bool _isShutdown) external; function viewFundsInTreasury() external view returns (uint256); function payRefund(address _to, uint256 _amount) external; function setProjectBalance(address _projectWallet, uint256 _balance) external; function moveFundsOutOfTreasury() external; function setAdminRole(address _adminAddress) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; import "erc721a/contracts/IERC721A.sol"; interface INft is IERC721A{ function mint(address to, uint256 amount) external; function burn(uint256 tokenId) external; function currentIndex() external returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; import "@openzeppelin/contracts/access/AccessControl.sol"; import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; import "./interfaces/ITreasury.sol"; import "./interfaces/IDynamic.sol"; import "./interfaces/INft.sol"; import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol"; contract DynamicNft is AccessControl, IDynamic { bytes32 public constant EXECUTOR_ROLE = keccak256("EXECUTOR_ROLE"); bytes32 public constant NFT_ROLE = keccak256("NFT_ROLE"); bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); bytes32 public merkleRoot; bytes32 public constant ZEROSTATE = 0x0000000000000000000000000000000000000000000000000000000000000000; address public immutable treasuryAddress; address private cap3Wallet; address public genesisContractAddress; address public subsContractAddress; uint256 public genesisPrice = 2 ether; uint256 public subscriptionPrice = 1 ether; uint256 private projectId = 1; uint256 public genesisSupply = 2000; uint256 public subscriptionSupply = 7000; uint256 private genesisVotingPower = 2; uint256 private subscriptionVotingPower = 1; uint256 private treasuryLimit = 5e6; bool public genesisStatus = true; bool public subscriptionStatus; bool public refundFlag; struct Genesis { uint256 tokenId; address owner; } struct Subscription { uint256 tokenId; uint256 renewalExpire; address owner; bool expired; bool renewed; } struct Project { string id; string description; address author; bool funded; } enum TOKEN { GENESIS, SUBSCRIPTION } /*------ Events -------*/ event SubscriptionMintStateUpdated(bool state); event GenesisMintStateUpdated(bool state); event GenesisMinted(address to, uint256 id); event SubscriptionMinted(address to, uint256 id); event SubscriptionRenewed(address holder, uint256 tokenId); event ExpiredSubscription(address holder, uint256 renewalExpire, uint256 tokenId); event MerkleRootSet(bytes32 _merkleRoot); event Refunded(address owner, uint256[] tokenIds); event TreasuryLimitSet(uint256 newLimit, uint256 oldLimit); event SubscriptionBalanceUpdated(uint256 TokenSupply, uint256 tokenId); event ProposalApproved(string id, string _title, address author, uint256 amount); event ProposalFunded(string id, uint256 amount); event UpdatedBackendAddress(address backendAddress, string Role); event RefundStateUpdated(bool _state); event NftTransfered(address to, uint256 tokenId, bool isGenesis); mapping(string => Project) private proposals; mapping(uint256 => Genesis) public genesisHolder; mapping(uint256 => Subscription) public subsHolder; AggregatorV3Interface internal priceFeed; constructor( address _genesis, address _subscription, address _treasury, address _cap3Wallet, address _priceFeedAggregator ) { require(_genesis != address(0), "ADDRESS ZERO"); require(_subscription != address(0), "ADDRESS ZERO"); require(_treasury != address(0), "ADDRESS ZERO"); require(_cap3Wallet != address(0), "ADDRESS ZERO"); require(_priceFeedAggregator != address(0), "ADDRESS ZER0"); subsContractAddress = _subscription; genesisContractAddress = _genesis; treasuryAddress = _treasury; cap3Wallet = _cap3Wallet; priceFeed = AggregatorV3Interface(_priceFeedAggregator); _setRoleAdmin(ADMIN_ROLE, ADMIN_ROLE); _setRoleAdmin(EXECUTOR_ROLE, ADMIN_ROLE); _setupRole(ADMIN_ROLE, _msgSender()); _setupRole(ADMIN_ROLE, address(this)); _setupRole(NFT_ROLE, _genesis); _setupRole(NFT_ROLE, _subscription); } /*------- State Changing Functions ------*/ function mintGenesis(address _to, bytes32[] calldata _merkleProof, uint256 amount) public payable { INft GenesisNft = INft(genesisContractAddress); require(msg.value >= (genesisPrice * amount), "INSUFFICIENT MINTING VALUE"); require(genesisStatus, "GENESIS MINT CURRENTLY INACTIVE"); require(GenesisNft.totalSupply() + amount <= genesisSupply, "INSUFICIENT GENESIS STOCK"); if (merkleRoot != ZEROSTATE){ require(MerkleProof.verify(_merkleProof, merkleRoot, keccak256(abi.encodePacked(_to))), "INVALID MERKLE PROOF"); } for (uint256 _id = GenesisNft.currentIndex(); _id < (amount + GenesisNft.currentIndex()); _id++) { genesisHolder[_id] = Genesis({tokenId: _id, owner: _to}); emit GenesisMinted(_to, _id); } GenesisNft.mint(_to, amount); (bool success, ) = treasuryAddress.call{value: msg.value}(""); require(success, "MINT:ETH TRANSFER FAILED"); ITreasury treasury = ITreasury(payable(treasuryAddress)); if (GenesisNft.totalSupply() == genesisSupply) { treasury.moveFundsOutOfTreasury(); genesisStatus = false; } } function mintSubscription(address _to, uint256 amount) public payable { INft SubscriptionNft = INft(subsContractAddress); require(msg.value >= (subscriptionPrice * amount), "INSUFFICIENT MINTING VALUE"); require(subscriptionStatus, "SUBS MINT CURRENTLY INACTIVE"); require(SubscriptionNft.totalSupply() + amount <= subscriptionSupply, "INSUFICIENT SUBSCRIPTION STOCK"); for (uint256 _id = SubscriptionNft.currentIndex(); _id < (amount + SubscriptionNft.currentIndex()); _id++) { subsHolder[_id] = Subscription({ tokenId: _id, owner: _to, expired: false, renewed: false, renewalExpire: 0 }); emit SubscriptionMinted(_to, _id); } SubscriptionNft.mint(_to, amount); cap3TreasuryFundShare(msg.value); } function refund(bool _state) public onlyRole(ADMIN_ROLE) { require(genesisStatus == false, "GENESIS MINT STILL OPEN"); string memory boolString = _state == true ? "true" : "false"; require(refundFlag != _state, string(abi.encodePacked("Refund Flag already ", boolString))); refundFlag = _state; emit RefundStateUpdated(_state); } function claimRefund(uint256[] calldata tokenIds) public { INft GenesisNft = INft(genesisContractAddress); ITreasury treasury = ITreasury(treasuryAddress); require(genesisStatus == false, "GENESIS MINT STILL OPEN"); require(refundFlag == true, "REFUND NOT OPEN"); uint256 arrayLength = tokenIds.length; uint256[] memory refundedTokens = new uint256[](arrayLength); for (uint256 i = 0; i < tokenIds.length; i++){ uint256 tokenId = tokenIds[i]; if (GenesisNft.ownerOf(tokenId) == msg.sender){ uint256 toRefund = genesisPrice; GenesisNft.burn(tokenId); delete (genesisHolder[tokenId]); treasury.payRefund(msg.sender, toRefund); refundedTokens[i] = tokenId; } } emit Refunded(msg.sender, refundedTokens); } function transferNft(address _to, uint256 _tokenId) public onlyRole(NFT_ROLE) { if (msg.sender == genesisContractAddress) { Genesis storage token = genesisHolder[_tokenId]; token.owner = _to; emit NftTransfered(_to, _tokenId, true); } else if (msg.sender == subsContractAddress) { Subscription storage token = subsHolder[_tokenId]; token.owner = _to; emit NftTransfered(_to, _tokenId, false); } } function subscriptionExpiry(uint256 _tokenId) external onlyRole(EXECUTOR_ROLE) { Subscription storage token = subsHolder[_tokenId]; require(token.expired == false, "CANT CALL ON ALREADY EXPIRED TOKEN"); token.expired = true; if (token.renewed == true) { _updateSubscriptionMintBalance(_tokenId); token.renewalExpire = 0; } else token.renewalExpire = block.timestamp + 7 days; emit ExpiredSubscription(token.owner, token.renewalExpire, token.tokenId); } function renewSubscription(uint256 _tokenId) public payable { require(msg.value >= (subscriptionPrice), "INSUFFICIENT MINTING VALUE"); Subscription storage token = subsHolder[_tokenId]; require(token.renewalExpire > 0, "SUBSCRIPTION NOT EXPIRED"); require(block.timestamp <= token.renewalExpire, "RENEWAL DATE HAS EXPIRED"); require(token.renewed == false, "ALREADY RENEWED"); cap3TreasuryFundShare(msg.value); token.renewed = true; token.expired = false; emit SubscriptionRenewed(msg.sender, token.tokenId); } function updateSubscriptionMintBalance(uint256 _tokenId) public onlyRole(EXECUTOR_ROLE) { _updateSubscriptionMintBalance(_tokenId); } function _updateSubscriptionMintBalance(uint256 _tokenId) internal { Subscription storage token = subsHolder[_tokenId]; require(token.expired == true, "NON EXPIRED TOKEN"); require(block.timestamp >= token.renewalExpire, "RENEWAL DATELINE NOT PASSED"); unchecked { subscriptionSupply++; } emit SubscriptionBalanceUpdated(subscriptionSupply, _tokenId); } function addApprovedProposal( string memory _id, string memory _title, address _author, uint256 _funds ) public onlyRole(ADMIN_ROLE) { proposals[_id] = Project({id: _id, description: _title, author: _author, funded: false}); ITreasury treasury = ITreasury(payable(treasuryAddress)); treasury.setProjectBalance(_author, _funds); emit ProposalApproved(_id, _title, _author, _funds); } function fundProposal(string memory _id, uint256 _amount) public onlyRole(ADMIN_ROLE) { Project memory proposal = proposals[_id]; require(proposal.funded == false, "PROJECT HAS BEEN FUNDED"); proposal.funded = true; ITreasury treasury = ITreasury(treasuryAddress); treasury.withdrawToProjectWallet(proposal.author, _amount); emit ProposalFunded(_id, _amount); } function cap3TreasuryFundShare(uint256 _amount) internal { uint256 dollarValueOfEth = getLatestPrice(); uint256 limitInEth = (treasuryLimit * 10**18) / dollarValueOfEth; if (address(treasuryAddress).balance > limitInEth) { uint256 extraBalance = address(treasuryAddress).balance - limitInEth; ITreasury treasury = ITreasury(payable(treasuryAddress)); treasury.payRefund(cap3Wallet, extraBalance); (bool success, ) = cap3Wallet.call{value: _amount}(""); require(success, "MINT:ETH TRANSFER FAILED"); } else if (address(treasuryAddress).balance == limitInEth) { (bool success, ) = cap3Wallet.call{value: _amount}(""); require(success, "MINT:ETH TRANSFER FAILED"); } else if ((address(treasuryAddress).balance + _amount) > limitInEth) { uint256 treasuryAmount = limitInEth - address(treasuryAddress).balance; uint256 cap3amount = _amount - treasuryAmount; (bool success, ) = treasuryAddress.call{value: treasuryAmount}(""); require(success, "MINT:ETH TRANSFER FAILED"); (success, ) = cap3Wallet.call{value: cap3amount}(""); require(success, "MINT:ETH TRANSFER FAILED"); } else if ((address(treasuryAddress).balance + _amount) <= limitInEth) { (bool success, ) = treasuryAddress.call{value: _amount}(""); require(success, "MINT:ETH TRANSFER FAILED"); } } function setTreasuryLimit(uint256 _newLimit) public onlyRole(ADMIN_ROLE) { _setTreasuryLimit(_newLimit); } function switchGenesisMint(bool _state) public onlyRole(ADMIN_ROLE) { string memory boolString = _state == true ? "true" : "false"; require(genesisStatus != _state, string(abi.encodePacked("Genesis Flag already ", boolString))); genesisStatus = _state; emit GenesisMintStateUpdated(_state); } function switchSubscriptionMint(bool _state) public onlyRole(ADMIN_ROLE) { string memory boolString = _state == true ? "true" : "false"; require(subscriptionStatus != _state, string(abi.encodePacked("Subscription Flag already ", boolString))); subscriptionStatus = _state; emit SubscriptionMintStateUpdated(_state); } function setMerkleRoot(bytes32 _merkleRoot) public onlyRole(ADMIN_ROLE) { merkleRoot = _merkleRoot; emit MerkleRootSet(_merkleRoot); } function setBackendAdress(address _backendAddress) public onlyRole(ADMIN_ROLE) { require(_backendAddress != address(0), "ADDRESS ZERO"); _setupRole(EXECUTOR_ROLE, _backendAddress); emit UpdatedBackendAddress(_backendAddress, "EXECUTOR_ROLE"); } function setGenesisVotingPower(uint256 newVotingPower) public onlyRole(ADMIN_ROLE) { genesisVotingPower = newVotingPower; } function setAdminRole(address _adminAddress) public onlyRole(ADMIN_ROLE) { _setupRole(ADMIN_ROLE, _adminAddress); } function setGenesisPrice(uint256 price) public onlyRole(ADMIN_ROLE) { genesisPrice = price * 10**18 ; } function setSubscriptionPrice(uint256 price) public onlyRole(ADMIN_ROLE) { subscriptionPrice = price * 10**18; } function setSubscriptionVotingPower(uint256 newVotingPower) public onlyRole(ADMIN_ROLE) { subscriptionVotingPower = newVotingPower; } function setGenesisSupply(uint256 _newGenesisSupply) public onlyRole(ADMIN_ROLE) { INft GenesisNft = INft(genesisContractAddress); require(_newGenesisSupply >= GenesisNft.totalSupply()); genesisSupply = _newGenesisSupply; } function setGenesisMintPublic() public onlyRole(ADMIN_ROLE) { merkleRoot = ZEROSTATE; emit MerkleRootSet(merkleRoot); } function setSubscriptionSupply(uint256 _newSubscriptionSupply) public onlyRole(ADMIN_ROLE) { INft SubscriptionNft = INft(subsContractAddress); require(_newSubscriptionSupply >= SubscriptionNft.totalSupply()); subscriptionSupply = _newSubscriptionSupply; } /*------ View Functions -------*/ function getGenesisSupply() public view returns (uint256) { return genesisSupply; } function getSubscriptionSupply() public view returns (uint256) { return subscriptionSupply; } function getGenesisHolder(uint256 _tokenId) public view returns (Genesis memory) { return genesisHolder[_tokenId]; } function getSubscriptionHolder(uint256 _tokenId) public view returns (Subscription memory) { return subsHolder[_tokenId]; } function getTreasuryLimit() public view returns (uint256) { return treasuryLimit; } function getCap3WalletAddress() public view returns (address) { return cap3Wallet; } function subscriptionHasExpired(uint256 _tokenId) public view returns (bool) { Subscription storage token = subsHolder[_tokenId]; return token.expired; } function userVotingPower(address _holder) public view returns (uint256) { INft GenesisNft = INft(genesisContractAddress); uint256 votingPower = 0; votingPower += getValidSubscriptions(_holder) * subscriptionVotingPower; votingPower += GenesisNft.balanceOf(_holder) * genesisVotingPower; return votingPower; } function getValidSubscriptions(address _holder) public view returns (uint256) { INft SubscriptionNft = INft(subsContractAddress); uint256 subscriptionsValid = 0; uint256 subscriptionsIndex = 1; uint256 subscriptionsChecked = 0; while (subscriptionsChecked < SubscriptionNft.balanceOf(_holder)) { if (SubscriptionNft.ownerOf(subscriptionsIndex) == _holder) { if (!subscriptionHasExpired(subscriptionsIndex)) { subscriptionsValid++; } subscriptionsChecked++; } subscriptionsIndex++; } return subscriptionsValid; } function getLatestPrice() public view returns (uint256) { ( , /*uint80 roundID*/ int256 price, /*uint startedAt*/ /*uint timeStamp*/ /*uint80 answeredInRound*/ , , ) = priceFeed.latestRoundData(); return uint256(price / 10**8); } /*------ Internal Functions -------*/ function _setTreasuryLimit(uint256 _newLimit) internal { uint256 oldLimit = treasuryLimit; treasuryLimit = _newLimit; emit TreasuryLimitSet(_newLimit, oldLimit); } }
// 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: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// 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: MIT // ERC721A Contracts v4.2.2 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of ERC721A. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the * ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); // ============================================================= // STRUCTS // ============================================================= struct TokenOwnership { // The address of the owner. address addr; // Stores the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}. uint24 extraData; } // ============================================================= // TOKEN COUNTERS // ============================================================= /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see {_totalMinted}. */ function totalSupply() external view returns (uint256); // ============================================================= // IERC165 // ============================================================= /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================================================= // IERC721 // ============================================================= /** * @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`, * 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 be 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, bytes calldata data ) external; /** * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` 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); // ============================================================= // IERC721Metadata // ============================================================= /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); // ============================================================= // IERC2309 // ============================================================= /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` * (inclusive) is transferred from `from` to `to`, as defined in the * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard. * * See {_mintERC2309} for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.11; interface IDynamic { function renewSubscription(uint256 tokenid) external payable; function mintGenesis(address to, bytes32[] calldata _merkleProof, uint256 amount) external payable; function mintSubscription(address to, uint256 amount) external payable; function refund(bool state) external; function subscriptionExpiry(uint256 tokenId) external; function updateSubscriptionMintBalance(uint256 tokenId) external; function addApprovedProposal( string memory id, string memory title, address author, uint256 funds ) external; function transferNft(address _to, uint256 _tokenId) external; function fundProposal(string memory id, uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); // getRoundData and latestRoundData should both raise "No data present" // if they do not have data to report, instead of returning unset values // which could be misinterpreted as actual reported values. function getRoundData(uint80 _roundId) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_cap3Wallet","type":"address"},{"internalType":"address","name":"_genesisAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"dynamicNftAddress","type":"address"},{"indexed":false,"internalType":"string","name":"Role1","type":"string"}],"name":"DynamicNftAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"wallet","type":"address"}],"name":"FundsMovedToCap3Wallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"genesisCap","type":"uint256"}],"name":"GenesisLimitSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"projectWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"ProjectBalanceSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[],"name":"Shutdown","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"coreContractAddress","type":"address"},{"indexed":false,"internalType":"string","name":"Role","type":"string"}],"name":"UpdatedCoreContractAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_projectWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"WithdrawnToProjectWallet","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXECUTOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_projectWallet","type":"address"}],"name":"getProjectBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isShutdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"moveFundsOutOfTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"payRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adminAddress","type":"address"}],"name":"setAdminRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dynamicNftAddress","type":"address"}],"name":"setDynamicNFTAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_projectWallet","type":"address"},{"internalType":"uint256","name":"_balance","type":"uint256"}],"name":"setProjectBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isShutdown","type":"bool"}],"name":"shutdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewFundsInTreasury","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_projectWallet","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToProjectWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001ada38038062001ada8339810160408190526200003491620002a6565b600180556001600160a01b038216620000835760405162461bcd60e51b815260206004820152600c60248201526b41444452455353205a45524f60a01b60448201526064015b60405180910390fd5b6001600160a01b038116620000ca5760405162461bcd60e51b815260206004820152600c60248201526b41444452455353205a45524f60a01b60448201526064016200007a565b600280546001600160a01b038085166001600160a01b03199283161790925560038054928416929091169190911790556200011560008051602062001aba833981519152806200018e565b620001507fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6360008051602062001aba8339815191526200018e565b6200016b60008051602062001aba83398151915233620001d9565b6200018660008051602062001aba83398151915230620001d9565b5050620002de565b600082815260208190526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b620001e58282620001e9565b5050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff16620001e5576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002453390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b80516001600160a01b0381168114620002a157600080fd5b919050565b60008060408385031215620002ba57600080fd5b620002c58362000289565b9150620002d56020840162000289565b90509250929050565b6117cc80620002ee6000396000f3fe6080604052600436106101485760003560e01c80635db20cb3116100c0578063a217fddf11610074578063d28ace9911610059578063d28ace99146103f8578063d547741f14610418578063ff8b01571461043857600080fd5b8063a217fddf146103c2578063bf86d690146103d757600080fd5b806375b238fc116100a557806375b238fc1461032a5780638ca954041461035e57806391d148541461037e57600080fd5b80635db20cb3146102ea57806363d454be1461030a57600080fd5b80632856c5701161011757806336568abe116100fc57806336568abe146102955780634adc7cfd146102b5578063538f4b07146102d557600080fd5b80632856c570146102555780632f2ff15d1461027557600080fd5b806301ffc9a71461018c57806307bd0265146101c157806312ca4e5314610203578063248a9ca31461022557600080fd5b3661018757604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561019857600080fd5b506101ac6101a73660046114e8565b61044d565b60405190151581526020015b60405180910390f35b3480156101cd57600080fd5b506101f57fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b6040519081526020016101b8565b34801561020f57600080fd5b5061022361021e36600461152a565b6104e6565b005b34801561023157600080fd5b506101f561024036600461154c565b60009081526020819052604090206001015490565b34801561026157600080fd5b506101f5610270366004611581565b61056f565b34801561028157600080fd5b5061022361029036600461159c565b6105b8565b3480156102a157600080fd5b506102236102b036600461159c565b6105e2565b3480156102c157600080fd5b506102236102d0366004611581565b610673565b3480156102e157600080fd5b506101f56106c7565b3480156102f657600080fd5b506102236103053660046115c8565b6106fa565b34801561031657600080fd5b50610223610325366004611581565b61086c565b34801561033657600080fd5b506101f57fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b34801561036a57600080fd5b506102236103793660046115c8565b6109b0565b34801561038a57600080fd5b506101ac61039936600461159c565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156103ce57600080fd5b506101f5600081565b3480156103e357600080fd5b506004546101ac90600160a01b900460ff1681565b34801561040457600080fd5b506102236104133660046115c8565b610cf7565b34801561042457600080fd5b5061022361043336600461159c565b610dbf565b34801561044457600080fd5b50610223610de4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806104e057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561051081611065565b600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b841515021790556040517f4426aa1fb73e391071491fcfe21a88b5c38a0a0333a1f6e77161470439704cf890600090a15050565b60007fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561059b81611065565b50506001600160a01b031660009081526005602052604090205490565b6000828152602081905260409020600101546105d381611065565b6105dd8383611072565b505050565b6001600160a01b03811633146106655760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b61066f8282611110565b5050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561069d81611065565b61066f7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217758361118f565b60007fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756106f381611065565b4791505090565b6002600154141561074d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065c565b60026001557fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6361077c81611065565b6000836001600160a01b03168360405160006040518083038185875af1925050503d80600081146107c9576040519150601f19603f3d011682016040523d82523d6000602084013e6107ce565b606091505b505090508061081f5760405162461bcd60e51b815260206004820152601460248201527f4641494c454420544f2053454e44204554484552000000000000000000000000604482015260640161065c565b604080516001600160a01b0386168152602081018590527fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d065191015b60405180910390a15050600180555050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561089681611065565b6001600160a01b0382166108db5760405162461bcd60e51b815260206004820152600c60248201526b41444452455353205a45524f60a01b604482015260640161065c565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384161790556109387fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e638361118f565b604080516001600160a01b038416815260208101829052600d918101919091527f4558454355544f525f524f4c450000000000000000000000000000000000000060608201527f71c980be59f2fb8d4cd9d588ef218579b87773323993db56e335b9767968531b906080015b60405180910390a15050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636109da81611065565b600454600160a01b900460ff1615610a345760405162461bcd60e51b815260206004820152601460248201527f54524541535552592049532053485554444f574e000000000000000000000000604482015260640161065c565b60026001541415610a875760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065c565b60026001556001600160a01b038316610ae25760405162461bcd60e51b815260206004820152601a60248201527f4e4f205a45524f2041444452455353205749544844524157414c000000000000604482015260640161065c565b81471015610b325760405162461bcd60e51b815260206004820152601260248201527f494e53554646494349454e542046554e44530000000000000000000000000000604482015260640161065c565b60008211610b825760405162461bcd60e51b815260206004820152601460248201527f43414e4e4f54205749544844524157205a45524f000000000000000000000000604482015260640161065c565b6001600160a01b038316600090815260056020526040902054821115610bea5760405162461bcd60e51b815260206004820152601d60248201527f494e53554646494349454e542046554e445320414c4c4f434154494f4e000000604482015260640161065c565b6001600160a01b03831660009081526005602052604081208054849290610c12908490611608565b90915550506040516000906001600160a01b0385169084908381818185875af1925050503d8060008114610c62576040519150601f19603f3d011682016040523d82523d6000602084013e610c67565b606091505b5050905080610cb85760405162461bcd60e51b815260206004820152601460248201527f4641494c454420544f2053454e44204554484552000000000000000000000000604482015260640161065c565b604080516001600160a01b0386168152602081018590527fddd8616cd9b7299640435375ce3c5994fe405fa2fc64bf3e5d9b1e3185937907910161085a565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610d2181611065565b6001600160a01b038316610d665760405162461bcd60e51b815260206004820152600c60248201526b41444452455353205a45524f60a01b604482015260640161065c565b6001600160a01b038316600081815260056020908152604091829020859055815192835282018490527fd18a2dce24e78d187d751e76f56fd164845cce7e3dc6a84ccc7e8b969cfbd863910160405180910390a1505050565b600082815260208190526040902060010154610dda81611065565b6105dd8383611110565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610e0e81611065565b600454600160a01b900460ff1615610e685760405162461bcd60e51b815260206004820152601460248201527f54524541535552592049532053485554444f574e000000000000000000000000604482015260640161065c565b60026001541415610ebb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065c565b60026001556004546001600160a01b0316610f185760405162461bcd60e51b815260206004820152601760248201527f44594e414d49432041444452455353204e4f5420534554000000000000000000604482015260640161065c565b60035460048054604080517f5fce793e00000000000000000000000000000000000000000000000000000000815290516001600160a01b0394851694909216928392635fce793e9280830192602092918290030181865afa158015610f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa5919061161f565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fe3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611007919061161f565b146110545760405162461bcd60e51b815260206004820152601e60248201527f47454e45534953204e46542053414c45204e4f5420434f4d504c455445440000604482015260640161065c565b61105c611199565b50506001805550565b61106f8133611282565b50565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661066f576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556110cc3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff161561066f576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61066f8282611072565b60025460405147916000916001600160a01b039091169083908381818185875af1925050503d80600081146111ea576040519150601f19603f3d011682016040523d82523d6000602084013e6111ef565b606091505b50509050806112405760405162461bcd60e51b815260206004820152601460248201527f4641494c454420544f2053454e44204554484552000000000000000000000000604482015260640161065c565b600254604080518481526001600160a01b0390921660208301527fade485d2f07f0a90a1f67f1182562d63d08b15a1d4b36b4f96b419e21df9ef9391016109a4565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661066f576112be816001600160a01b03166014611300565b6112c9836020611300565b6040516020016112da929190611668565b60408051601f198184030181529082905262461bcd60e51b825261065c916004016116e9565b6060600061130f83600261171c565b61131a90600261173b565b67ffffffffffffffff81111561133257611332611753565b6040519080825280601f01601f19166020018201604052801561135c576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061139357611393611769565b60200101906001600160f81b031916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106113de576113de611769565b60200101906001600160f81b031916908160001a905350600061140284600261171c565b61140d90600161173b565b90505b6001811115611492577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061144e5761144e611769565b1a60f81b82828151811061146457611464611769565b60200101906001600160f81b031916908160001a90535060049490941c9361148b8161177f565b9050611410565b5083156114e15760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161065c565b9392505050565b6000602082840312156114fa57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146114e157600080fd5b60006020828403121561153c57600080fd5b813580151581146114e157600080fd5b60006020828403121561155e57600080fd5b5035919050565b80356001600160a01b038116811461157c57600080fd5b919050565b60006020828403121561159357600080fd5b6114e182611565565b600080604083850312156115af57600080fd5b823591506115bf60208401611565565b90509250929050565b600080604083850312156115db57600080fd5b6115e483611565565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561161a5761161a6115f2565b500390565b60006020828403121561163157600080fd5b5051919050565b60005b8381101561165357818101518382015260200161163b565b83811115611662576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516116a0816017850160208801611638565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516116dd816028840160208801611638565b01602801949350505050565b6020815260008251806020840152611708816040850160208701611638565b601f01601f19169190910160400192915050565b6000816000190483118215151615611736576117366115f2565b500290565b6000821982111561174e5761174e6115f2565b500190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008161178e5761178e6115f2565b50600019019056fea2646970667358221220cc9b3cb595e2f2ddd63bc86e3c48e188fec61319cfc3c62318a1bb97500259d064736f6c634300080b0033a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775000000000000000000000000168fe4ebf3ba698d60b5b5f9189fc2d3bece2217000000000000000000000000a624bc508d347a96c49e184c61b0f15ea868778c
Deployed Bytecode
0x6080604052600436106101485760003560e01c80635db20cb3116100c0578063a217fddf11610074578063d28ace9911610059578063d28ace99146103f8578063d547741f14610418578063ff8b01571461043857600080fd5b8063a217fddf146103c2578063bf86d690146103d757600080fd5b806375b238fc116100a557806375b238fc1461032a5780638ca954041461035e57806391d148541461037e57600080fd5b80635db20cb3146102ea57806363d454be1461030a57600080fd5b80632856c5701161011757806336568abe116100fc57806336568abe146102955780634adc7cfd146102b5578063538f4b07146102d557600080fd5b80632856c570146102555780632f2ff15d1461027557600080fd5b806301ffc9a71461018c57806307bd0265146101c157806312ca4e5314610203578063248a9ca31461022557600080fd5b3661018757604080513381523460208201527f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f88525874910160405180910390a1005b600080fd5b34801561019857600080fd5b506101ac6101a73660046114e8565b61044d565b60405190151581526020015b60405180910390f35b3480156101cd57600080fd5b506101f57fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6381565b6040519081526020016101b8565b34801561020f57600080fd5b5061022361021e36600461152a565b6104e6565b005b34801561023157600080fd5b506101f561024036600461154c565b60009081526020819052604090206001015490565b34801561026157600080fd5b506101f5610270366004611581565b61056f565b34801561028157600080fd5b5061022361029036600461159c565b6105b8565b3480156102a157600080fd5b506102236102b036600461159c565b6105e2565b3480156102c157600080fd5b506102236102d0366004611581565b610673565b3480156102e157600080fd5b506101f56106c7565b3480156102f657600080fd5b506102236103053660046115c8565b6106fa565b34801561031657600080fd5b50610223610325366004611581565b61086c565b34801561033657600080fd5b506101f57fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b34801561036a57600080fd5b506102236103793660046115c8565b6109b0565b34801561038a57600080fd5b506101ac61039936600461159c565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b3480156103ce57600080fd5b506101f5600081565b3480156103e357600080fd5b506004546101ac90600160a01b900460ff1681565b34801561040457600080fd5b506102236104133660046115c8565b610cf7565b34801561042457600080fd5b5061022361043336600461159c565b610dbf565b34801561044457600080fd5b50610223610de4565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b0000000000000000000000000000000000000000000000000000000014806104e057507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561051081611065565b600480547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b841515021790556040517f4426aa1fb73e391071491fcfe21a88b5c38a0a0333a1f6e77161470439704cf890600090a15050565b60007fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561059b81611065565b50506001600160a01b031660009081526005602052604090205490565b6000828152602081905260409020600101546105d381611065565b6105dd8383611072565b505050565b6001600160a01b03811633146106655760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201527f20726f6c657320666f722073656c66000000000000000000000000000000000060648201526084015b60405180910390fd5b61066f8282611110565b5050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561069d81611065565b61066f7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217758361118f565b60007fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756106f381611065565b4791505090565b6002600154141561074d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065c565b60026001557fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e6361077c81611065565b6000836001600160a01b03168360405160006040518083038185875af1925050503d80600081146107c9576040519150601f19603f3d011682016040523d82523d6000602084013e6107ce565b606091505b505090508061081f5760405162461bcd60e51b815260206004820152601460248201527f4641494c454420544f2053454e44204554484552000000000000000000000000604482015260640161065c565b604080516001600160a01b0386168152602081018590527fd7dee2702d63ad89917b6a4da9981c90c4d24f8c2bdfd64c604ecae57d8d065191015b60405180910390a15050600180555050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561089681611065565b6001600160a01b0382166108db5760405162461bcd60e51b815260206004820152600c60248201526b41444452455353205a45524f60a01b604482015260640161065c565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0384161790556109387fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e638361118f565b604080516001600160a01b038416815260208101829052600d918101919091527f4558454355544f525f524f4c450000000000000000000000000000000000000060608201527f71c980be59f2fb8d4cd9d588ef218579b87773323993db56e335b9767968531b906080015b60405180910390a15050565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e636109da81611065565b600454600160a01b900460ff1615610a345760405162461bcd60e51b815260206004820152601460248201527f54524541535552592049532053485554444f574e000000000000000000000000604482015260640161065c565b60026001541415610a875760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065c565b60026001556001600160a01b038316610ae25760405162461bcd60e51b815260206004820152601a60248201527f4e4f205a45524f2041444452455353205749544844524157414c000000000000604482015260640161065c565b81471015610b325760405162461bcd60e51b815260206004820152601260248201527f494e53554646494349454e542046554e44530000000000000000000000000000604482015260640161065c565b60008211610b825760405162461bcd60e51b815260206004820152601460248201527f43414e4e4f54205749544844524157205a45524f000000000000000000000000604482015260640161065c565b6001600160a01b038316600090815260056020526040902054821115610bea5760405162461bcd60e51b815260206004820152601d60248201527f494e53554646494349454e542046554e445320414c4c4f434154494f4e000000604482015260640161065c565b6001600160a01b03831660009081526005602052604081208054849290610c12908490611608565b90915550506040516000906001600160a01b0385169084908381818185875af1925050503d8060008114610c62576040519150601f19603f3d011682016040523d82523d6000602084013e610c67565b606091505b5050905080610cb85760405162461bcd60e51b815260206004820152601460248201527f4641494c454420544f2053454e44204554484552000000000000000000000000604482015260640161065c565b604080516001600160a01b0386168152602081018590527fddd8616cd9b7299640435375ce3c5994fe405fa2fc64bf3e5d9b1e3185937907910161085a565b7fd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63610d2181611065565b6001600160a01b038316610d665760405162461bcd60e51b815260206004820152600c60248201526b41444452455353205a45524f60a01b604482015260640161065c565b6001600160a01b038316600081815260056020908152604091829020859055815192835282018490527fd18a2dce24e78d187d751e76f56fd164845cce7e3dc6a84ccc7e8b969cfbd863910160405180910390a1505050565b600082815260208190526040902060010154610dda81611065565b6105dd8383611110565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610e0e81611065565b600454600160a01b900460ff1615610e685760405162461bcd60e51b815260206004820152601460248201527f54524541535552592049532053485554444f574e000000000000000000000000604482015260640161065c565b60026001541415610ebb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065c565b60026001556004546001600160a01b0316610f185760405162461bcd60e51b815260206004820152601760248201527f44594e414d49432041444452455353204e4f5420534554000000000000000000604482015260640161065c565b60035460048054604080517f5fce793e00000000000000000000000000000000000000000000000000000000815290516001600160a01b0394851694909216928392635fce793e9280830192602092918290030181865afa158015610f81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa5919061161f565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610fe3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611007919061161f565b146110545760405162461bcd60e51b815260206004820152601e60248201527f47454e45534953204e46542053414c45204e4f5420434f4d504c455445440000604482015260640161065c565b61105c611199565b50506001805550565b61106f8133611282565b50565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661066f576000828152602081815260408083206001600160a01b03851684529091529020805460ff191660011790556110cc3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152602081815260408083206001600160a01b038516845290915290205460ff161561066f576000828152602081815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61066f8282611072565b60025460405147916000916001600160a01b039091169083908381818185875af1925050503d80600081146111ea576040519150601f19603f3d011682016040523d82523d6000602084013e6111ef565b606091505b50509050806112405760405162461bcd60e51b815260206004820152601460248201527f4641494c454420544f2053454e44204554484552000000000000000000000000604482015260640161065c565b600254604080518481526001600160a01b0390921660208301527fade485d2f07f0a90a1f67f1182562d63d08b15a1d4b36b4f96b419e21df9ef9391016109a4565b6000828152602081815260408083206001600160a01b038516845290915290205460ff1661066f576112be816001600160a01b03166014611300565b6112c9836020611300565b6040516020016112da929190611668565b60408051601f198184030181529082905262461bcd60e51b825261065c916004016116e9565b6060600061130f83600261171c565b61131a90600261173b565b67ffffffffffffffff81111561133257611332611753565b6040519080825280601f01601f19166020018201604052801561135c576020820181803683370190505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061139357611393611769565b60200101906001600160f81b031916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106113de576113de611769565b60200101906001600160f81b031916908160001a905350600061140284600261171c565b61140d90600161173b565b90505b6001811115611492577f303132333435363738396162636465660000000000000000000000000000000085600f166010811061144e5761144e611769565b1a60f81b82828151811061146457611464611769565b60200101906001600160f81b031916908160001a90535060049490941c9361148b8161177f565b9050611410565b5083156114e15760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161065c565b9392505050565b6000602082840312156114fa57600080fd5b81357fffffffff00000000000000000000000000000000000000000000000000000000811681146114e157600080fd5b60006020828403121561153c57600080fd5b813580151581146114e157600080fd5b60006020828403121561155e57600080fd5b5035919050565b80356001600160a01b038116811461157c57600080fd5b919050565b60006020828403121561159357600080fd5b6114e182611565565b600080604083850312156115af57600080fd5b823591506115bf60208401611565565b90509250929050565b600080604083850312156115db57600080fd5b6115e483611565565b946020939093013593505050565b634e487b7160e01b600052601160045260246000fd5b60008282101561161a5761161a6115f2565b500390565b60006020828403121561163157600080fd5b5051919050565b60005b8381101561165357818101518382015260200161163b565b83811115611662576000848401525b50505050565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516116a0816017850160208801611638565b7f206973206d697373696e6720726f6c652000000000000000000000000000000060179184019182015283516116dd816028840160208801611638565b01602801949350505050565b6020815260008251806020840152611708816040850160208701611638565b601f01601f19169190910160400192915050565b6000816000190483118215151615611736576117366115f2565b500290565b6000821982111561174e5761174e6115f2565b500190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60008161178e5761178e6115f2565b50600019019056fea2646970667358221220cc9b3cb595e2f2ddd63bc86e3c48e188fec61319cfc3c62318a1bb97500259d064736f6c634300080b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000168fe4ebf3ba698d60b5b5f9189fc2d3bece2217000000000000000000000000a624bc508d347a96c49e184c61b0f15ea868778c
-----Decoded View---------------
Arg [0] : _cap3Wallet (address): 0x168FE4EBf3ba698d60b5B5f9189Fc2d3beCE2217
Arg [1] : _genesisAddress (address): 0xa624BC508D347A96C49E184C61B0f15EA868778c
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000168fe4ebf3ba698d60b5b5f9189fc2d3bece2217
Arg [1] : 000000000000000000000000a624bc508d347a96c49e184c61b0f15ea868778c
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.