Polygon Sponsored slots available. Book your slot here!
Contract Overview
My Name Tag:
Not Available, login to update
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xd06f3b73a5c875da9dfa8ee9540e267abea7bd15518a7cf9974f8a82db967d67 | Set Release Time... | 27568832 | 405 days 4 hrs ago | 0x6d46b37708da7ed4e5c4509495768fecd3d17c01 | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.006676729606 | |
0xd3911f43608cfb0ac3f0d29b0cb733f35d0bc09168f944da5607e5559a55188d | Set Release Time... | 27568816 | 405 days 4 hrs ago | 0x6d46b37708da7ed4e5c4509495768fecd3d17c01 | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.0045259762 | |
0xf07f6c2f7c2da05234b86301ebfed6c7d144e2979e19a17dabca5ff1c6f6a39c | Set Release Time... | 27028844 | 418 days 23 hrs ago | Reverse: Deployer | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.003002275228 | |
0x41d1080dd5e782a92dd2dfddd1beb66610ec34f421373a4d2a36bbab326f643c | Set Release Time... | 27028812 | 418 days 23 hrs ago | Reverse: Deployer | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.003431171688 | |
0xe9c8ebaa49d9fe5e2f98a61b11234cc7269a92f45a735ab88bc84d380725679a | Set Release Time... | 27028785 | 418 days 23 hrs ago | Reverse: Deployer | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.003915228953 | |
0x61b0565e6463c97690eebf16f71b452f7b53fca1205fb12831518bc8f28f55b4 | Set Release Time... | 27028750 | 418 days 23 hrs ago | Reverse: Deployer | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.00318356136 | |
0x73aa2af6a766f73bf3bd91ebf28487d608d7074a3a6857a8e381b18040985ed5 | Set Release Time... | 27028005 | 418 days 23 hrs ago | Reverse: Deployer | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.003056543759 | |
0x46ed2649a667dab7a3a694f434344e8eb753f962e7131c674a7b0379a9ad23a8 | Set Release Time... | 27027966 | 418 days 23 hrs ago | Reverse: Deployer | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.002971639765 | |
0x47ecb78f73afd6f75a651bf81eecd0f9aeb9b3fa202760096395badd3a36c36d | Set Release Time... | 27027526 | 418 days 23 hrs ago | Reverse: Deployer | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.002717779347 | |
0xfe284611d37196c51271d26fc6dc50b9a5b104feb252e2c192fec0aafdc81cdd | Set Release Time... | 27021775 | 419 days 3 hrs ago | Reverse: Deployer | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.002888486369 | |
0xdfa26cee342c952814b1c281c076fdc0057ea714863bc9fd946b761047c7c9a3 | Set Release Time... | 27021632 | 419 days 3 hrs ago | Reverse: Deployer | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.002818383982 | |
0x6538d56514dd9425869c2efb1aead0f466fc6dd4fa2e15a2d0c64dd2ad7c5619 | Set Release Time... | 27021323 | 419 days 3 hrs ago | Reverse: Deployer | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.00280095648 | |
0x4af1df46407cd15d4b30205fb052a500d026d29d4c40e3aa2343e55e8916ee6b | Set Release Time... | 27020917 | 419 days 3 hrs ago | Reverse: Deployer | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.002942229722 | |
0x4555d2a6c3e4a3f291c09af2f86c89cee395c0ce08e4532ccdd0d58e4c736a68 | Set Release Time... | 26860202 | 423 days 6 hrs ago |
| IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.003108161153 | |
0x0908d2589d248f11c3bfcd0b12babce21989b726df6e17d973c94c37a7954029 | Set Release Time... | 26860133 | 423 days 6 hrs ago |
| IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.002885762874 | |
0xe24c9fe8fa1aa2fd0e513d80b8b8a655aa54b11d2c87d5c1c618c989e49ca61b | Set Release Time... | 26794721 | 424 days 22 hrs ago | 0xda12b68a9c056b9fd4f0382abdf9cd81899923b7 | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.003148188456 | |
0x72bddb6a730171fe60599e7815e4e49435de5508404f0b938c477673bf2d8879 | Set Release Time... | 26790981 | 425 days 56 mins ago | 0xda12b68a9c056b9fd4f0382abdf9cd81899923b7 | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.002840152364 | |
0x36679dd455575d2a718bc37e0d9d813c72d7523258cc415d9bf93d2c9cba7b88 | Set Release Time... | 25744314 | 452 days 23 hrs ago | 0x3e9dba40101fa4968397761880f337a6c397d7fa | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.008082708564 | |
0xa188688f95505fa593b06708ee313dabe2cf2e6b7ac9aa823d901ac401107c69 | Set Release Time... | 25088460 | 471 days 6 hrs ago | 0xd5b3988ed0ab5ec375e51bb6fd10e205cec16a2e | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.002793372424 | |
0x9a283682645b85e69656ae4125b77604c60011b737433f52c43e100204b51198 | Set Release Time... | 24505137 | 486 days 8 hrs ago | 0x21759d4dba5acc6976fb8ae88f0c477109bef660 | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.003449685695 | |
0x377182009f8afe39f58932462868bfc6267c5e8dd4a442ab89218eb6cbe8ffb4 | Set Release Time... | 24362836 | 489 days 23 hrs ago | 0x06435e88c4fbb33df51c9db695ef736ae77d1ee5 | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.00330104345 | |
0x444788b29ed04253e6ba40a981328415637614e3733a59c66f9733e5cca9177d | Set Release Time... | 24162333 | 495 days 1 hr ago | 0xf1686a0a06aa168144126009136d0efcf3a4196d | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.001452946626 | |
0xc427a0efacf36d78c25b139d1609275c5730ff67d35326e388c4fd1381cc2e1c | Set Release Time... | 24130408 | 495 days 20 hrs ago | 0xf1686a0a06aa168144126009136d0efcf3a4196d | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.003380918604 | |
0x299f0f242994c8e05b9e9807bc7d66f2529df1e88916805d4d0373e166261466 | Set Release Time... | 24095997 | 496 days 17 hrs ago | 0xbcd980d37293cbee62bf5f93a26a0b744c18964d | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.003189697355 | |
0x6a37302787da429b5e438303891be8b068e9c603e7893fc35a7f4869eecd6d99 | Set Release Time... | 23741098 | 505 days 15 hrs ago | 0x9745f56dcd3f0e2c769584e72b15c139a0cfb933 | IN | 0xab1a1410ea40930755c1330cc0fb3367897c8c41 | 0 MATIC | 0.00270711 |
[ Download CSV Export ]
Contract Name:
ChargedState
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // ChargedState.sol -- Part of the Charged Particles Protocol // Copyright (c) 2021 Firma Lux, Inc. <https://charged.fi> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. pragma solidity 0.6.12; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "./interfaces/IChargedState.sol"; import "./lib/Bitwise.sol"; import "./lib/TokenInfo.sol"; import "./lib/RelayRecipient.sol"; import "./lib/BlackholePrevention.sol"; /** * @notice Charged Particles Settings Contract */ contract ChargedState is IChargedState, Ownable, RelayRecipient, BlackholePrevention { using SafeMath for uint256; using TokenInfo for address; using Bitwise for uint32; // NftState - actionPerms uint32 constant internal PERM_RESTRICT_ENERGIZE_FROM_ALL = 1; // NFTs that have Restrictions on Energize uint32 constant internal PERM_ALLOW_DISCHARGE_FROM_ALL = 2; // NFTs that allow Discharge by anyone uint32 constant internal PERM_ALLOW_RELEASE_FROM_ALL = 4; // NFTs that allow Release by anyone uint32 constant internal PERM_RESTRICT_BOND_FROM_ALL = 8; // NFTs that have Restrictions on Covalent Bonds uint32 constant internal PERM_ALLOW_BREAK_BOND_FROM_ALL = 16; // NFTs that allow Breaking Covalent Bonds by anyone struct NftTimelock { uint256 unlockBlock; address lockedBy; } struct NftState { uint32 actionPerms; NftTimelock dischargeTimelock; NftTimelock releaseTimelock; NftTimelock breakBondTimelock; uint256 tempLockExpiry; mapping (address => address) dischargeApproval; mapping (address => address) releaseApproval; mapping (address => address) breakBondApproval; mapping (address => address) timelockApproval; } IChargedSettings internal _chargedSettings; // State of individual NFTs (by Token UUID) mapping (uint256 => NftState) internal _nftState; /***********************************| | Public | |__________________________________*/ function getDischargeTimelockExpiry(address contractAddress, uint256 tokenId) external view virtual override returns (uint256 lockExpiry) { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); if (_nftState[tokenUuid].dischargeTimelock.unlockBlock > block.number) { lockExpiry = _nftState[tokenUuid].dischargeTimelock.unlockBlock; } if (_nftState[tokenUuid].tempLockExpiry > block.number && _nftState[tokenUuid].tempLockExpiry > lockExpiry) { lockExpiry = _nftState[tokenUuid].tempLockExpiry; } } function getReleaseTimelockExpiry(address contractAddress, uint256 tokenId) external view virtual override returns (uint256 lockExpiry) { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); if (_nftState[tokenUuid].releaseTimelock.unlockBlock > block.number) { lockExpiry = _nftState[tokenUuid].releaseTimelock.unlockBlock; } if (_nftState[tokenUuid].tempLockExpiry > block.number && _nftState[tokenUuid].tempLockExpiry > lockExpiry) { lockExpiry = _nftState[tokenUuid].tempLockExpiry; } } function getBreakBondTimelockExpiry(address contractAddress, uint256 tokenId) external view virtual override returns (uint256 lockExpiry) { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); if (_nftState[tokenUuid].breakBondTimelock.unlockBlock > block.number) { lockExpiry = _nftState[tokenUuid].breakBondTimelock.unlockBlock; } if (_nftState[tokenUuid].tempLockExpiry > block.number && _nftState[tokenUuid].tempLockExpiry > lockExpiry) { lockExpiry = _nftState[tokenUuid].tempLockExpiry; } } /// @notice Checks if an operator is allowed to Discharge a specific Token /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param operator The Address of the operator to check /// @return True if the operator is Approved function isApprovedForDischarge(address contractAddress, uint256 tokenId, address operator) external virtual override view returns (bool) { return _isApprovedForDischarge(contractAddress, tokenId, operator); } /// @notice Checks if an operator is allowed to Release a specific Token /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param operator The Address of the operator to check /// @return True if the operator is Approved function isApprovedForRelease(address contractAddress, uint256 tokenId, address operator) external virtual override view returns (bool) { return _isApprovedForRelease(contractAddress, tokenId, operator); } /// @notice Checks if an operator is allowed to Break Covalent Bonds on a specific Token /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param operator The Address of the operator to check /// @return True if the operator is Approved function isApprovedForBreakBond(address contractAddress, uint256 tokenId, address operator) external virtual override view returns (bool) { return _isApprovedForBreakBond(contractAddress, tokenId, operator); } /// @notice Checks if an operator is allowed to Timelock a specific Token /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param operator The Address of the operator to check /// @return True if the operator is Approved function isApprovedForTimelock(address contractAddress, uint256 tokenId, address operator) external virtual override view returns (bool) { return _isApprovedForTimelock(contractAddress, tokenId, operator); } function isEnergizeRestricted(address contractAddress, uint256 tokenId) external virtual override view returns (bool) { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); return _nftState[tokenUuid].actionPerms.hasBit(PERM_RESTRICT_ENERGIZE_FROM_ALL); } function isCovalentBondRestricted(address contractAddress, uint256 tokenId) external virtual override view returns (bool) { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); return _nftState[tokenUuid].actionPerms.hasBit(PERM_RESTRICT_BOND_FROM_ALL); } function getDischargeState(address contractAddress, uint256 tokenId, address sender) external view virtual override returns ( bool allowFromAll, bool isApproved, uint256 timelock, uint256 tempLockExpiry ) { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); allowFromAll = _nftState[tokenUuid].actionPerms.hasBit(PERM_ALLOW_DISCHARGE_FROM_ALL); isApproved = _isApprovedForDischarge(contractAddress, tokenId, sender); timelock = _nftState[tokenUuid].dischargeTimelock.unlockBlock; tempLockExpiry = _nftState[tokenUuid].tempLockExpiry; } function getReleaseState(address contractAddress, uint256 tokenId, address sender) external view virtual override returns ( bool allowFromAll, bool isApproved, uint256 timelock, uint256 tempLockExpiry ) { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); allowFromAll = _nftState[tokenUuid].actionPerms.hasBit(PERM_ALLOW_RELEASE_FROM_ALL); isApproved = _isApprovedForRelease(contractAddress, tokenId, sender); timelock = _nftState[tokenUuid].releaseTimelock.unlockBlock; tempLockExpiry = _nftState[tokenUuid].tempLockExpiry; } function getBreakBondState(address contractAddress, uint256 tokenId, address sender) external view virtual override returns ( bool allowFromAll, bool isApproved, uint256 timelock, uint256 tempLockExpiry ) { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); allowFromAll = _nftState[tokenUuid].actionPerms.hasBit(PERM_ALLOW_BREAK_BOND_FROM_ALL); isApproved = _isApprovedForBreakBond(contractAddress, tokenId, sender); timelock = _nftState[tokenUuid].breakBondTimelock.unlockBlock; tempLockExpiry = _nftState[tokenUuid].tempLockExpiry; } /***********************************| | Only NFT Owner/Operator | |__________________________________*/ /// @notice Sets an Operator as Approved to Discharge a specific Token /// This allows an operator to withdraw the interest-portion only /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param operator The Address of the Operator to Approve function setDischargeApproval( address contractAddress, uint256 tokenId, address operator ) external virtual override onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender()) { address tokenOwner = contractAddress.getTokenOwner(tokenId); require(operator != tokenOwner, "CP:E-106"); _setDischargeApproval(contractAddress, tokenId, tokenOwner, operator); } /// @notice Sets an Operator as Approved to Release a specific Token /// This allows an operator to withdraw the principal + interest /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param operator The Address of the Operator to Approve function setReleaseApproval( address contractAddress, uint256 tokenId, address operator ) external virtual override onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender()) { address tokenOwner = contractAddress.getTokenOwner(tokenId); require(operator != tokenOwner, "CP:E-106"); _setReleaseApproval(contractAddress, tokenId, tokenOwner, operator); } /// @notice Sets an Operator as Approved to Break Covalent Bonds on a specific Token /// This allows an operator to withdraw Basket NFTs /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param operator The Address of the Operator to Approve function setBreakBondApproval( address contractAddress, uint256 tokenId, address operator ) external virtual override onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender()) { address tokenOwner = contractAddress.getTokenOwner(tokenId); require(operator != tokenOwner, "CP:E-106"); _setBreakBondApproval(contractAddress, tokenId, tokenOwner, operator); } /// @notice Sets an Operator as Approved to Timelock a specific Token /// This allows an operator to timelock the principal or interest /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param operator The Address of the Operator to Approve function setTimelockApproval( address contractAddress, uint256 tokenId, address operator ) external virtual override onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender()) { address tokenOwner = contractAddress.getTokenOwner(tokenId); require(operator != tokenOwner, "CP:E-106"); _setTimelockApproval(contractAddress, tokenId, tokenOwner, operator); } /// @notice Sets an Operator as Approved to Discharge/Release/Timelock a specific Token /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param operator The Address of the Operator to Approve function setApprovalForAll( address contractAddress, uint256 tokenId, address operator ) external virtual override onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender()) { address tokenOwner = contractAddress.getTokenOwner(tokenId); require(operator != tokenOwner, "CP:E-106"); _setDischargeApproval(contractAddress, tokenId, tokenOwner, operator); _setReleaseApproval(contractAddress, tokenId, tokenOwner, operator); _setBreakBondApproval(contractAddress, tokenId, tokenOwner, operator); _setTimelockApproval(contractAddress, tokenId, tokenOwner, operator); } /// @dev Updates Restrictions on Energizing an NFT function setPermsForRestrictCharge(address contractAddress, uint256 tokenId, bool state) external virtual override onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender()) { _setPermsForRestrictCharge(contractAddress, tokenId, state); } /// @dev Updates Allowance on Discharging an NFT by Anyone function setPermsForAllowDischarge(address contractAddress, uint256 tokenId, bool state) external virtual override onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender()) { _setPermsForAllowDischarge(contractAddress, tokenId, state); } /// @dev Updates Allowance on Discharging an NFT by Anyone function setPermsForAllowRelease(address contractAddress, uint256 tokenId, bool state) external virtual override onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender()) { _setPermsForAllowRelease(contractAddress, tokenId, state); } /// @dev Updates Restrictions on Covalent Bonds on an NFT function setPermsForRestrictBond(address contractAddress, uint256 tokenId, bool state) external virtual override onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender()) { _setPermsForRestrictBond(contractAddress, tokenId, state); } /// @dev Updates Allowance on Breaking Covalent Bonds on an NFT by Anyone function setPermsForAllowBreakBond(address contractAddress, uint256 tokenId, bool state) external virtual override onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender()) { _setPermsForAllowBreakBond(contractAddress, tokenId, state); } /// @notice Sets a Timelock on the ability to Discharge the Interest of a Particle /// @param contractAddress The Address to the NFT to Timelock /// @param tokenId The token ID of the NFT to Timelock /// @param unlockBlock The Ethereum Block-number to Timelock until (~15 seconds per block) function setDischargeTimelock( address contractAddress, uint256 tokenId, uint256 unlockBlock ) external override virtual { address sender = _msgSender(); uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); // Clear Timelock if (unlockBlock == 0 && _nftState[tokenUuid].dischargeTimelock.lockedBy == sender) { delete _nftState[tokenUuid].dischargeTimelock.unlockBlock; delete _nftState[tokenUuid].dischargeTimelock.lockedBy; } // Set Timelock else { require(_isApprovedForTimelock(contractAddress, tokenId, sender), "CP:E-105"); require(block.number >= _nftState[tokenUuid].dischargeTimelock.unlockBlock, "CP:E-302"); _nftState[tokenUuid].dischargeTimelock.unlockBlock = unlockBlock; _nftState[tokenUuid].dischargeTimelock.lockedBy = sender; } emit TokenDischargeTimelock(contractAddress, tokenId, sender, unlockBlock); } /// @notice Sets a Timelock on the ability to Release the Assets of a Particle /// @param contractAddress The Address to the NFT to Timelock /// @param tokenId The token ID of the NFT to Timelock /// @param unlockBlock The Ethereum Block-number to Timelock until (~15 seconds per block) function setReleaseTimelock( address contractAddress, uint256 tokenId, uint256 unlockBlock ) external override virtual { address sender = _msgSender(); uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); // Clear Timelock if (unlockBlock == 0 && _nftState[tokenUuid].releaseTimelock.lockedBy == sender) { delete _nftState[tokenUuid].releaseTimelock.unlockBlock; delete _nftState[tokenUuid].releaseTimelock.lockedBy; } // Set Timelock else { require(_isApprovedForTimelock(contractAddress, tokenId, sender), "CP:E-105"); require(block.number >= _nftState[tokenUuid].releaseTimelock.unlockBlock, "CP:E-302"); _nftState[tokenUuid].releaseTimelock.unlockBlock = unlockBlock; _nftState[tokenUuid].releaseTimelock.lockedBy = sender; } emit TokenReleaseTimelock(contractAddress, tokenId, sender, unlockBlock); } /// @notice Sets a Timelock on the ability to Break the Covalent Bond of a Particle /// @param contractAddress The Address to the NFT to Timelock /// @param tokenId The token ID of the NFT to Timelock /// @param unlockBlock The Ethereum Block-number to Timelock until (~15 seconds per block) function setBreakBondTimelock( address contractAddress, uint256 tokenId, uint256 unlockBlock ) external override virtual { address sender = _msgSender(); uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); // Clear Timelock if (unlockBlock == 0 && _nftState[tokenUuid].breakBondTimelock.lockedBy == sender) { delete _nftState[tokenUuid].breakBondTimelock.unlockBlock; delete _nftState[tokenUuid].breakBondTimelock.lockedBy; } // Set Timelock else { require(_isApprovedForTimelock(contractAddress, tokenId, sender), "CP:E-105"); require(block.number >= _nftState[tokenUuid].breakBondTimelock.unlockBlock, "CP:E-302"); _nftState[tokenUuid].breakBondTimelock.unlockBlock = unlockBlock; _nftState[tokenUuid].breakBondTimelock.lockedBy = sender; } emit TokenBreakBondTimelock(contractAddress, tokenId, sender, unlockBlock); } /***********************************| | Only NFT Contract | |__________________________________*/ /// @notice Sets a Temporary-Lock on the ability to Release/Discharge the Assets of a Particle /// @param contractAddress The Address to the NFT to Timelock /// @param tokenId The token ID of the NFT to Timelock /// @param isLocked The locked state; contracts are expected to disable this lock before expiry function setTemporaryLock( address contractAddress, uint256 tokenId, bool isLocked ) external override virtual { require(msg.sender == contractAddress, "CP:E-112"); uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); uint256 unlockBlock; if (isLocked && _nftState[tokenUuid].tempLockExpiry == 0) { unlockBlock = block.number.add(_chargedSettings.getTempLockExpiryBlocks()); _nftState[tokenUuid].tempLockExpiry = unlockBlock; } if (!isLocked) { _nftState[tokenUuid].tempLockExpiry = 0; } emit TokenTempLock(contractAddress, tokenId, unlockBlock); } /***********************************| | Only Admin/DAO | |__________________________________*/ /// @dev Setup the Charged-Settings Controller function setChargedSettings(address settingsController) external virtual onlyOwner { _chargedSettings = IChargedSettings(settingsController); emit ChargedSettingsSet(settingsController); } function setTrustedForwarder(address _trustedForwarder) external onlyOwner { trustedForwarder = _trustedForwarder; } /***********************************| | Only Admin/DAO | | (blackhole prevention) | |__________________________________*/ function withdrawEther(address payable receiver, uint256 amount) external virtual onlyOwner { _withdrawEther(receiver, amount); } function withdrawErc20(address payable receiver, address tokenAddress, uint256 amount) external virtual onlyOwner { _withdrawERC20(receiver, tokenAddress, amount); } function withdrawERC721(address payable receiver, address tokenAddress, uint256 tokenId) external virtual onlyOwner { _withdrawERC721(receiver, tokenAddress, tokenId); } /***********************************| | Private Functions | |__________________________________*/ /// @dev See {ChargedParticles-isApprovedForDischarge}. function _isApprovedForDischarge(address contractAddress, uint256 tokenId, address operator) internal view virtual returns (bool) { address tokenOwner = contractAddress.getTokenOwner(tokenId); uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); return contractAddress == operator || tokenOwner == operator || _nftState[tokenUuid].dischargeApproval[tokenOwner] == operator; } /// @dev See {ChargedParticles-isApprovedForRelease}. function _isApprovedForRelease(address contractAddress, uint256 tokenId, address operator) internal view virtual returns (bool) { address tokenOwner = contractAddress.getTokenOwner(tokenId); uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); return contractAddress == operator || tokenOwner == operator || _nftState[tokenUuid].releaseApproval[tokenOwner] == operator; } /// @dev See {ChargedParticles-isApprovedForBreakBond}. function _isApprovedForBreakBond(address contractAddress, uint256 tokenId, address operator) internal view virtual returns (bool) { address tokenOwner = contractAddress.getTokenOwner(tokenId); uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); return contractAddress == operator || tokenOwner == operator || _nftState[tokenUuid].breakBondApproval[tokenOwner] == operator; } /// @dev See {ChargedParticles-isApprovedForTimelock}. function _isApprovedForTimelock(address contractAddress, uint256 tokenId, address operator) internal view virtual returns (bool) { (bool timelockAny, bool timelockOwn) = _chargedSettings.getTimelockApprovals(operator); if (timelockAny || (timelockOwn && contractAddress == operator)) { return true; } address tokenOwner = contractAddress.getTokenOwner(tokenId); uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); return tokenOwner == operator || _nftState[tokenUuid].timelockApproval[tokenOwner] == operator; } /// @notice Sets an Operator as Approved to Discharge a specific Token /// This allows an operator to withdraw the interest-portion only /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param tokenOwner The Owner Address of the Token /// @param operator The Address of the Operator to Approve function _setDischargeApproval( address contractAddress, uint256 tokenId, address tokenOwner, address operator ) internal virtual { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); _nftState[tokenUuid].dischargeApproval[tokenOwner] = operator; emit DischargeApproval(contractAddress, tokenId, tokenOwner, operator); } /// @notice Sets an Operator as Approved to Release a specific Token /// This allows an operator to withdraw the principal + interest /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param tokenOwner The Owner Address of the Token /// @param operator The Address of the Operator to Approve function _setReleaseApproval( address contractAddress, uint256 tokenId, address tokenOwner, address operator ) internal virtual { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); _nftState[tokenUuid].releaseApproval[tokenOwner] = operator; emit ReleaseApproval(contractAddress, tokenId, tokenOwner, operator); } /// @notice Sets an Operator as Approved to Break Covalent Bonds on a specific Token /// This allows an operator to withdraw Basket NFTs /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param tokenOwner The Owner Address of the Token /// @param operator The Address of the Operator to Approve function _setBreakBondApproval( address contractAddress, uint256 tokenId, address tokenOwner, address operator ) internal virtual { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); _nftState[tokenUuid].breakBondApproval[tokenOwner] = operator; emit BreakBondApproval(contractAddress, tokenId, tokenOwner, operator); } /// @notice Sets an Operator as Approved to Timelock a specific Token /// This allows an operator to timelock the principal or interest /// @param contractAddress The Address to the Contract of the Token /// @param tokenId The ID of the Token /// @param tokenOwner The Owner Address of the Token /// @param operator The Address of the Operator to Approve function _setTimelockApproval( address contractAddress, uint256 tokenId, address tokenOwner, address operator ) internal virtual { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); _nftState[tokenUuid].timelockApproval[tokenOwner] = operator; emit TimelockApproval(contractAddress, tokenId, tokenOwner, operator); } /// @dev Updates Restrictions on Energizing an NFT function _setPermsForRestrictCharge(address contractAddress, uint256 tokenId, bool state) internal virtual { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); if (state) { _nftState[tokenUuid].actionPerms = _nftState[tokenUuid].actionPerms.setBit(PERM_RESTRICT_ENERGIZE_FROM_ALL); } else { _nftState[tokenUuid].actionPerms = _nftState[tokenUuid].actionPerms.clearBit(PERM_RESTRICT_ENERGIZE_FROM_ALL); } emit PermsSetForRestrictCharge(contractAddress, tokenId, state); } /// @dev Updates Allowance on Discharging an NFT by Anyone function _setPermsForAllowDischarge(address contractAddress, uint256 tokenId, bool state) internal virtual { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); if (state) { _nftState[tokenUuid].actionPerms = _nftState[tokenUuid].actionPerms.setBit(PERM_ALLOW_DISCHARGE_FROM_ALL); } else { _nftState[tokenUuid].actionPerms = _nftState[tokenUuid].actionPerms.clearBit(PERM_ALLOW_DISCHARGE_FROM_ALL); } emit PermsSetForAllowDischarge(contractAddress, tokenId, state); } /// @dev Updates Allowance on Discharging an NFT by Anyone function _setPermsForAllowRelease(address contractAddress, uint256 tokenId, bool state) internal virtual { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); if (state) { _nftState[tokenUuid].actionPerms = _nftState[tokenUuid].actionPerms.setBit(PERM_ALLOW_RELEASE_FROM_ALL); } else { _nftState[tokenUuid].actionPerms = _nftState[tokenUuid].actionPerms.clearBit(PERM_ALLOW_RELEASE_FROM_ALL); } emit PermsSetForAllowRelease(contractAddress, tokenId, state); } /// @dev Updates Restrictions on Covalent Bonds on an NFT function _setPermsForRestrictBond(address contractAddress, uint256 tokenId, bool state) internal virtual { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); if (state) { _nftState[tokenUuid].actionPerms = _nftState[tokenUuid].actionPerms.setBit(PERM_RESTRICT_BOND_FROM_ALL); } else { _nftState[tokenUuid].actionPerms = _nftState[tokenUuid].actionPerms.clearBit(PERM_RESTRICT_BOND_FROM_ALL); } emit PermsSetForRestrictBond(contractAddress, tokenId, state); } /// @dev Updates Allowance on Breaking Covalent Bonds on an NFT by Anyone function _setPermsForAllowBreakBond(address contractAddress, uint256 tokenId, bool state) internal virtual { uint256 tokenUuid = contractAddress.getTokenUUID(tokenId); if (state) { _nftState[tokenUuid].actionPerms = _nftState[tokenUuid].actionPerms.setBit(PERM_ALLOW_BREAK_BOND_FROM_ALL); } else { _nftState[tokenUuid].actionPerms = _nftState[tokenUuid].actionPerms.clearBit(PERM_ALLOW_BREAK_BOND_FROM_ALL); } emit PermsSetForAllowBreakBond(contractAddress, tokenId, state); } /***********************************| | GSN/MetaTx Relay | |__________________________________*/ /// @dev See {BaseRelayRecipient-_msgSender}. function _msgSender() internal view virtual override(BaseRelayRecipient, Context) returns (address payable) { return BaseRelayRecipient._msgSender(); } /// @dev See {BaseRelayRecipient-_msgData}. function _msgData() internal view virtual override(BaseRelayRecipient, Context) returns (bytes memory) { return BaseRelayRecipient._msgData(); } /***********************************| | Modifiers | |__________________________________*/ modifier onlyErc721OwnerOrOperator(address contractAddress, uint256 tokenId, address sender) { require(contractAddress.isErc721OwnerOrOperator(tokenId, sender), "CP:E-105"); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "../GSN/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when 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 SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT // IChargedSettings.sol -- Part of the Charged Particles Protocol // Copyright (c) 2021 Firma Lux, Inc. <https://charged.fi> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. pragma solidity >=0.6.0; import "./IChargedSettings.sol"; /** * @notice Interface for Charged State */ interface IChargedState { /***********************************| | Public API | |__________________________________*/ function getDischargeTimelockExpiry(address contractAddress, uint256 tokenId) external view returns (uint256 lockExpiry); function getReleaseTimelockExpiry(address contractAddress, uint256 tokenId) external view returns (uint256 lockExpiry); function getBreakBondTimelockExpiry(address contractAddress, uint256 tokenId) external view returns (uint256 lockExpiry); function isApprovedForDischarge(address contractAddress, uint256 tokenId, address operator) external view returns (bool); function isApprovedForRelease(address contractAddress, uint256 tokenId, address operator) external view returns (bool); function isApprovedForBreakBond(address contractAddress, uint256 tokenId, address operator) external view returns (bool); function isApprovedForTimelock(address contractAddress, uint256 tokenId, address operator) external view returns (bool); function isEnergizeRestricted(address contractAddress, uint256 tokenId) external view returns (bool); function isCovalentBondRestricted(address contractAddress, uint256 tokenId) external view returns (bool); function getDischargeState(address contractAddress, uint256 tokenId, address sender) external view returns (bool allowFromAll, bool isApproved, uint256 timelock, uint256 tempLockExpiry); function getReleaseState(address contractAddress, uint256 tokenId, address sender) external view returns (bool allowFromAll, bool isApproved, uint256 timelock, uint256 tempLockExpiry); function getBreakBondState(address contractAddress, uint256 tokenId, address sender) external view returns (bool allowFromAll, bool isApproved, uint256 timelock, uint256 tempLockExpiry); /***********************************| | Only NFT Owner/Operator | |__________________________________*/ function setDischargeApproval(address contractAddress, uint256 tokenId, address operator) external; function setReleaseApproval(address contractAddress, uint256 tokenId, address operator) external; function setBreakBondApproval(address contractAddress, uint256 tokenId, address operator) external; function setTimelockApproval(address contractAddress, uint256 tokenId, address operator) external; function setApprovalForAll(address contractAddress, uint256 tokenId, address operator) external; function setPermsForRestrictCharge(address contractAddress, uint256 tokenId, bool state) external; function setPermsForAllowDischarge(address contractAddress, uint256 tokenId, bool state) external; function setPermsForAllowRelease(address contractAddress, uint256 tokenId, bool state) external; function setPermsForRestrictBond(address contractAddress, uint256 tokenId, bool state) external; function setPermsForAllowBreakBond(address contractAddress, uint256 tokenId, bool state) external; function setDischargeTimelock( address contractAddress, uint256 tokenId, uint256 unlockBlock ) external; function setReleaseTimelock( address contractAddress, uint256 tokenId, uint256 unlockBlock ) external; function setBreakBondTimelock( address contractAddress, uint256 tokenId, uint256 unlockBlock ) external; /***********************************| | Only NFT Contract | |__________________________________*/ function setTemporaryLock( address contractAddress, uint256 tokenId, bool isLocked ) external; /***********************************| | Particle Events | |__________________________________*/ event ChargedSettingsSet(address indexed settingsController); event DischargeApproval(address indexed contractAddress, uint256 indexed tokenId, address indexed owner, address operator); event ReleaseApproval(address indexed contractAddress, uint256 indexed tokenId, address indexed owner, address operator); event BreakBondApproval(address indexed contractAddress, uint256 indexed tokenId, address indexed owner, address operator); event TimelockApproval(address indexed contractAddress, uint256 indexed tokenId, address indexed owner, address operator); event TokenDischargeTimelock(address indexed contractAddress, uint256 indexed tokenId, address indexed operator, uint256 unlockBlock); event TokenReleaseTimelock(address indexed contractAddress, uint256 indexed tokenId, address indexed operator, uint256 unlockBlock); event TokenBreakBondTimelock(address indexed contractAddress, uint256 indexed tokenId, address indexed operator, uint256 unlockBlock); event TokenTempLock(address indexed contractAddress, uint256 indexed tokenId, uint256 unlockBlock); event PermsSetForRestrictCharge(address indexed contractAddress, uint256 indexed tokenId, bool state); event PermsSetForAllowDischarge(address indexed contractAddress, uint256 indexed tokenId, bool state); event PermsSetForAllowRelease(address indexed contractAddress, uint256 indexed tokenId, bool state); event PermsSetForRestrictBond(address indexed contractAddress, uint256 indexed tokenId, bool state); event PermsSetForAllowBreakBond(address indexed contractAddress, uint256 indexed tokenId, bool state); }
// SPDX-License-Identifier: MIT // Bitwise.sol -- Part of the Charged Particles Protocol // Copyright (c) 2021 Firma Lux, Inc. <https://charged.fi> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. pragma solidity 0.6.12; library Bitwise { function negate(uint32 a) internal pure returns (uint32) { return a ^ maxInt(); } function shiftLeft(uint32 a, uint32 n) internal pure returns (uint32) { return a * uint32(2) ** n; } function shiftRight(uint32 a, uint32 n) internal pure returns (uint32) { return a / uint32(2) ** n; } function maxInt() internal pure returns (uint32) { return uint32(-1); } // Get bit value at position function hasBit(uint32 a, uint32 n) internal pure returns (bool) { return a & shiftLeft(0x01, n) != 0; } // Set bit value at position function setBit(uint32 a, uint32 n) internal pure returns (uint32) { return a | shiftLeft(0x01, n); } // Set the bit into state "false" function clearBit(uint32 a, uint32 n) internal pure returns (uint32) { uint32 mask = negate(shiftLeft(0x01, n)); return a & mask; } }
// SPDX-License-Identifier: MIT // TokenInfo.sol -- Part of the Charged Particles Protocol // Copyright (c) 2021 Firma Lux, Inc. <https://charged.fi> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. pragma solidity 0.6.12; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "../interfaces/IERC721Chargeable.sol"; library TokenInfo { function getTokenUUID(address contractAddress, uint256 tokenId) internal pure virtual returns (uint256) { return uint256(keccak256(abi.encodePacked(contractAddress, tokenId))); } function getTokenOwner(address contractAddress, uint256 tokenId) internal view virtual returns (address) { IERC721Chargeable tokenInterface = IERC721Chargeable(contractAddress); return tokenInterface.ownerOf(tokenId); } function getTokenCreator(address contractAddress, uint256 tokenId) internal view virtual returns (address) { IERC721Chargeable tokenInterface = IERC721Chargeable(contractAddress); return tokenInterface.creatorOf(tokenId); } /// @dev Checks if an account is the Owner of an External NFT contract /// @param contractAddress The Address to the Contract of the NFT to check /// @param account The Address of the Account to check /// @return True if the account owns the contract function isContractOwner(address contractAddress, address account) internal view virtual returns (bool) { address contractOwner = IERC721Chargeable(contractAddress).owner(); return contractOwner != address(0x0) && contractOwner == account; } /// @dev Checks if an account is the Creator of a Proton-based NFT /// @param contractAddress The Address to the Contract of the Proton-based NFT to check /// @param tokenId The Token ID of the Proton-based NFT to check /// @param sender The Address of the Account to check /// @return True if the account is the creator of the Proton-based NFT function isTokenCreator(address contractAddress, uint256 tokenId, address sender) internal view virtual returns (bool) { IERC721Chargeable tokenInterface = IERC721Chargeable(contractAddress); address tokenCreator = tokenInterface.creatorOf(tokenId); return (sender == tokenCreator); } /// @dev Checks if an account is the Creator of a Proton-based NFT or the Contract itself /// @param contractAddress The Address to the Contract of the Proton-based NFT to check /// @param tokenId The Token ID of the Proton-based NFT to check /// @param sender The Address of the Account to check /// @return True if the account is the creator of the Proton-based NFT or the Contract itself function isTokenContractOrCreator(address contractAddress, uint256 tokenId, address creator, address sender) internal view virtual returns (bool) { IERC721Chargeable tokenInterface = IERC721Chargeable(contractAddress); address tokenCreator = tokenInterface.creatorOf(tokenId); if (sender == contractAddress && creator == tokenCreator) { return true; } return (sender == tokenCreator); } /// @dev Checks if an account is the Owner or Operator of an External NFT /// @param contractAddress The Address to the Contract of the External NFT to check /// @param tokenId The Token ID of the External NFT to check /// @param sender The Address of the Account to check /// @return True if the account is the Owner or Operator of the External NFT function isErc721OwnerOrOperator(address contractAddress, uint256 tokenId, address sender) internal view virtual returns (bool) { IERC721Chargeable tokenInterface = IERC721Chargeable(contractAddress); address tokenOwner = tokenInterface.ownerOf(tokenId); return (sender == tokenOwner || tokenInterface.isApprovedForAll(tokenOwner, sender)); } /** * @dev Returns true if `account` is a contract. * @dev Taken from OpenZeppelin library * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * @dev Taken from OpenZeppelin library * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "TokenInfo: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "TokenInfo: unable to send value, recipient may have reverted"); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; import "@opengsn/gsn/contracts/BaseRelayRecipient.sol"; contract RelayRecipient is BaseRelayRecipient { function versionRecipient() external override view returns (string memory) { return "1.0.0-beta.1/charged-particles.relay.recipient"; } }
// SPDX-License-Identifier: MIT // BlackholePrevention.sol -- Part of the Charged Particles Protocol // Copyright (c) 2021 Firma Lux, Inc. <https://charged.fi> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. pragma solidity >=0.6.0; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; /** * @notice Prevents ETH or Tokens from getting stuck in a contract by allowing * the Owner/DAO to pull them out on behalf of a user * This is only meant to contracts that are not expected to hold tokens, but do handle transferring them. */ contract BlackholePrevention { using Address for address payable; using SafeERC20 for IERC20; event WithdrawStuckEther(address indexed receiver, uint256 amount); event WithdrawStuckERC20(address indexed receiver, address indexed tokenAddress, uint256 amount); event WithdrawStuckERC721(address indexed receiver, address indexed tokenAddress, uint256 indexed tokenId); function _withdrawEther(address payable receiver, uint256 amount) internal virtual { require(receiver != address(0x0), "BHP:E-403"); if (address(this).balance >= amount) { receiver.sendValue(amount); emit WithdrawStuckEther(receiver, amount); } } function _withdrawERC20(address payable receiver, address tokenAddress, uint256 amount) internal virtual { require(receiver != address(0x0), "BHP:E-403"); if (IERC20(tokenAddress).balanceOf(address(this)) >= amount) { IERC20(tokenAddress).safeTransfer(receiver, amount); emit WithdrawStuckERC20(receiver, tokenAddress, amount); } } function _withdrawERC721(address payable receiver, address tokenAddress, uint256 tokenId) internal virtual { require(receiver != address(0x0), "BHP:E-403"); if (IERC721(tokenAddress).ownerOf(tokenId) == address(this)) { IERC721(tokenAddress).transferFrom(address(this), receiver, tokenId); emit WithdrawStuckERC721(receiver, tokenAddress, tokenId); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT // IChargedSettings.sol -- Part of the Charged Particles Protocol // Copyright (c) 2021 Firma Lux, Inc. <https://charged.fi> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. pragma solidity >=0.6.0; import "./IWalletManager.sol"; import "./IBasketManager.sol"; /** * @notice Interface for Charged Settings */ interface IChargedSettings { /***********************************| | Public API | |__________________________________*/ function isContractOwner(address contractAddress, address account) external view returns (bool); function getCreatorAnnuities(address contractAddress, uint256 tokenId) external view returns (address creator, uint256 annuityPct); function getCreatorAnnuitiesRedirect(address contractAddress, uint256 tokenId) external view returns (address); function getTempLockExpiryBlocks() external view returns (uint256); function getTimelockApprovals(address operator) external view returns (bool timelockAny, bool timelockOwn); function getAssetRequirements(address contractAddress, address assetToken) external view returns (string memory requiredWalletManager, bool energizeEnabled, bool restrictedAssets, bool validAsset, uint256 depositCap, uint256 depositMin, uint256 depositMax); function getNftAssetRequirements(address contractAddress, address nftTokenAddress) external view returns (string memory requiredBasketManager, bool basketEnabled, uint256 maxNfts); // ERC20 function isWalletManagerEnabled(string calldata walletManagerId) external view returns (bool); function getWalletManager(string calldata walletManagerId) external view returns (IWalletManager); // ERC721 function isNftBasketEnabled(string calldata basketId) external view returns (bool); function getBasketManager(string calldata basketId) external view returns (IBasketManager); /***********************************| | Only NFT Creator | |__________________________________*/ function setCreatorAnnuities(address contractAddress, uint256 tokenId, address creator, uint256 annuityPercent) external; function setCreatorAnnuitiesRedirect(address contractAddress, uint256 tokenId, address creator, address receiver) external; /***********************************| | Only NFT Contract Owner | |__________________________________*/ function setRequiredWalletManager(address contractAddress, string calldata walletManager) external; function setRequiredBasketManager(address contractAddress, string calldata basketManager) external; function setAssetTokenRestrictions(address contractAddress, bool restrictionsEnabled) external; function setAllowedAssetToken(address contractAddress, address assetToken, bool isAllowed) external; function setAssetTokenLimits(address contractAddress, address assetToken, uint256 depositMin, uint256 depositMax) external; function setMaxNfts(address contractAddress, address nftTokenAddress, uint256 maxNfts) external; /***********************************| | Only Admin/DAO | |__________________________________*/ function enableNftContracts(address[] calldata contracts) external; function setPermsForCharge(address contractAddress, bool state) external; function setPermsForBasket(address contractAddress, bool state) external; function setPermsForTimelockAny(address contractAddress, bool state) external; function setPermsForTimelockSelf(address contractAddress, bool state) external; /***********************************| | Particle Events | |__________________________________*/ event DepositCapSet(address assetToken, uint256 depositCap); event TempLockExpirySet(uint256 expiryBlocks); event WalletManagerRegistered(string indexed walletManagerId, address indexed walletManager); event BasketManagerRegistered(string indexed basketId, address indexed basketManager); event RequiredWalletManagerSet(address indexed contractAddress, string walletManager); event RequiredBasketManagerSet(address indexed contractAddress, string basketManager); event AssetTokenRestrictionsSet(address indexed contractAddress, bool restrictionsEnabled); event AllowedAssetTokenSet(address indexed contractAddress, address assetToken, bool isAllowed); event AssetTokenLimitsSet(address indexed contractAddress, address assetToken, uint256 assetDepositMin, uint256 assetDepositMax); event MaxNftsSet(address indexed contractAddress, address indexed nftTokenAddress, uint256 maxNfts); event TokenCreatorConfigsSet(address indexed contractAddress, uint256 indexed tokenId, address indexed creatorAddress, uint256 annuityPercent); event TokenCreatorAnnuitiesRedirected(address indexed contractAddress, uint256 indexed tokenId, address indexed redirectAddress); event PermsSetForCharge(address indexed contractAddress, bool state); event PermsSetForBasket(address indexed contractAddress, bool state); event PermsSetForTimelockAny(address indexed contractAddress, bool state); event PermsSetForTimelockSelf(address indexed contractAddress, bool state); }
// SPDX-License-Identifier: MIT // IWalletManager.sol -- Part of the Charged Particles Protocol // Copyright (c) 2021 Firma Lux, Inc. <https://charged.fi> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. pragma solidity >=0.6.0; /** * @title Particle Wallet Manager interface * @dev The wallet-manager for underlying assets attached to Charged Particles * @dev Manages the link between NFTs and their respective Smart-Wallets */ interface IWalletManager { event ControllerSet(address indexed controller); event PausedStateSet(bool isPaused); event NewSmartWallet(address indexed contractAddress, uint256 indexed tokenId, address indexed smartWallet, address creator, uint256 annuityPct); event WalletEnergized(address indexed contractAddress, uint256 indexed tokenId, address indexed assetToken, uint256 assetAmount, uint256 yieldTokensAmount); event WalletDischarged(address indexed contractAddress, uint256 indexed tokenId, address indexed assetToken, uint256 creatorAmount, uint256 receiverAmount); event WalletDischargedForCreator(address indexed contractAddress, uint256 indexed tokenId, address indexed assetToken, address creator, uint256 receiverAmount); event WalletReleased(address indexed contractAddress, uint256 indexed tokenId, address indexed receiver, address assetToken, uint256 principalAmount, uint256 creatorAmount, uint256 receiverAmount); event WalletRewarded(address indexed contractAddress, uint256 indexed tokenId, address indexed receiver, address rewardsToken, uint256 rewardsAmount); function isPaused() external view returns (bool); function isReserveActive(address contractAddress, uint256 tokenId, address assetToken) external view returns (bool); function getReserveInterestToken(address contractAddress, uint256 tokenId, address assetToken) external view returns (address); function getTotal(address contractAddress, uint256 tokenId, address assetToken) external returns (uint256); function getPrincipal(address contractAddress, uint256 tokenId, address assetToken) external returns (uint256); function getInterest(address contractAddress, uint256 tokenId, address assetToken) external returns (uint256 creatorInterest, uint256 ownerInterest); function getRewards(address contractAddress, uint256 tokenId, address rewardToken) external returns (uint256); function energize(address contractAddress, uint256 tokenId, address assetToken, uint256 assetAmount) external returns (uint256 yieldTokensAmount); function discharge(address receiver, address contractAddress, uint256 tokenId, address assetToken, address creatorRedirect) external returns (uint256 creatorAmount, uint256 receiverAmount); function dischargeAmount(address receiver, address contractAddress, uint256 tokenId, address assetToken, uint256 assetAmount, address creatorRedirect) external returns (uint256 creatorAmount, uint256 receiverAmount); function dischargeAmountForCreator(address receiver, address contractAddress, uint256 tokenId, address creator, address assetToken, uint256 assetAmount) external returns (uint256 receiverAmount); function release(address receiver, address contractAddress, uint256 tokenId, address assetToken, address creatorRedirect) external returns (uint256 principalAmount, uint256 creatorAmount, uint256 receiverAmount); function releaseAmount(address receiver, address contractAddress, uint256 tokenId, address assetToken, uint256 assetAmount, address creatorRedirect) external returns (uint256 principalAmount, uint256 creatorAmount, uint256 receiverAmount); function withdrawRewards(address receiver, address contractAddress, uint256 tokenId, address rewardsToken, uint256 rewardsAmount) external returns (uint256 amount); function executeForAccount(address contractAddress, uint256 tokenId, address externalAddress, uint256 ethValue, bytes memory encodedParams) external returns (bytes memory); function getWalletAddressById(address contractAddress, uint256 tokenId, address creator, uint256 annuityPct) external returns (address); function withdrawEther(address contractAddress, uint256 tokenId, address payable receiver, uint256 amount) external; function withdrawERC20(address contractAddress, uint256 tokenId, address payable receiver, address tokenAddress, uint256 amount) external; function withdrawERC721(address contractAddress, uint256 tokenId, address payable receiver, address nftTokenAddress, uint256 nftTokenId) external; }
// SPDX-License-Identifier: MIT // IBasketManager.sol -- Part of the Charged Particles Protocol // Copyright (c) 2021 Firma Lux, Inc. <https://charged.fi> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. pragma solidity >=0.6.0; /** * @title Particle Basket Manager interface * @dev The basket-manager for underlying assets attached to Charged Particles * @dev Manages the link between NFTs and their respective Smart-Baskets */ interface IBasketManager { event ControllerSet(address indexed controller); event PausedStateSet(bool isPaused); event NewSmartBasket(address indexed contractAddress, uint256 indexed tokenId, address indexed smartBasket); event BasketAdd(address indexed contractAddress, uint256 indexed tokenId, address basketTokenAddress, uint256 basketTokenId); event BasketRemove(address indexed receiver, address indexed contractAddress, uint256 indexed tokenId, address basketTokenAddress, uint256 basketTokenId); function isPaused() external view returns (bool); function getTokenTotalCount(address contractAddress, uint256 tokenId) external view returns (uint256); function getTokenCountByType(address contractAddress, uint256 tokenId, address basketTokenAddress, uint256 basketTokenId) external returns (uint256); function addToBasket(address contractAddress, uint256 tokenId, address basketTokenAddress, uint256 basketTokenId) external returns (bool); function removeFromBasket(address receiver, address contractAddress, uint256 tokenId, address basketTokenAddress, uint256 basketTokenId) external returns (bool); function executeForAccount(address contractAddress, uint256 tokenId, address externalAddress, uint256 ethValue, bytes memory encodedParams) external returns (bytes memory); function getBasketAddressById(address contractAddress, uint256 tokenId) external returns (address); function withdrawEther(address contractAddress, uint256 tokenId, address payable receiver, uint256 amount) external; function withdrawERC20(address contractAddress, uint256 tokenId, address payable receiver, address tokenAddress, uint256 amount) external; function withdrawERC721(address contractAddress, uint256 tokenId, address payable receiver, address nftTokenAddress, uint256 nftTokenId) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool); /** * @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); }
// SPDX-License-Identifier: MIT // IERC721Chargeable.sol -- Part of the Charged Particles Protocol // Copyright (c) 2021 Firma Lux, Inc. <https://charged.fi> // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. pragma solidity >=0.6.0; import "@openzeppelin/contracts-upgradeable/introspection/IERC165Upgradeable.sol"; interface IERC721Chargeable is IERC165Upgradeable { function owner() external view returns (address); function creatorOf(uint256 tokenId) external view returns (address); function balanceOf(address tokenOwner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address tokenOwner); function safeTransferFrom(address from, address to, uint256 tokenId) external; function transferFrom(address from, address to, uint256 tokenId) external; function approve(address to, uint256 tokenId) external; function getApproved(uint256 tokenId) external view returns (address operator); function setApprovalForAll(address operator, bool _approved) external; function isApprovedForAll(address tokenOwner, address operator) external view returns (bool); function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <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 IERC165Upgradeable { /** * @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 // solhint-disable no-inline-assembly pragma solidity ^0.6.2; import "./interfaces/IRelayRecipient.sol"; /** * A base contract to be inherited by any contract that want to receive relayed transactions * A subclass must use "_msgSender()" instead of "msg.sender" */ abstract contract BaseRelayRecipient is IRelayRecipient { /* * Forwarder singleton we accept calls from */ address public trustedForwarder; function isTrustedForwarder(address forwarder) public override view returns(bool) { return forwarder == trustedForwarder; } /** * return the sender of this call. * if the call came through our trusted forwarder, return the original sender. * otherwise, return `msg.sender`. * should be used in the contract anywhere instead of msg.sender */ function _msgSender() internal override virtual view returns (address payable ret) { if (msg.data.length >= 24 && isTrustedForwarder(msg.sender)) { // At this point we know that the sender is a trusted forwarder, // so we trust that the last bytes of msg.data are the verified sender address. // extract sender address from the end of msg.data assembly { ret := shr(96,calldataload(sub(calldatasize(),20))) } } else { return msg.sender; } } /** * return the msg.data of this call. * if the call came through our trusted forwarder, then the real sender was appended as the last 20 bytes * of the msg.data - so this method will strip those 20 bytes off. * otherwise, return `msg.data` * should be used in the contract instead of msg.data, where the difference matters (e.g. when explicitly * signing or hashing the */ function _msgData() internal override virtual view returns (bytes memory ret) { if (msg.data.length >= 24 && isTrustedForwarder(msg.sender)) { // At this point we know that the sender is a trusted forwarder, // we copy the msg.data , except the last 20 bytes (and update the total length) assembly { let ptr := mload(0x40) // copy only size-20 bytes let size := sub(calldatasize(),20) // structure RLP data as <offset> <length> <bytes> mstore(ptr, 0x20) mstore(add(ptr,32), size) calldatacopy(add(ptr,64), 0, size) return(ptr, add(size,64)) } } else { return msg.data; } } }
// SPDX-License-Identifier:MIT pragma solidity ^0.6.2; /** * a contract must implement this interface in order to support relayed transaction. * It is better to inherit the BaseRelayRecipient as its implementation. */ abstract contract IRelayRecipient { /** * return if the forwarder is trusted to forward relayed transactions to us. * the forwarder is required to verify the sender's signature, and verify * the call is not a replay. */ function isTrustedForwarder(address forwarder) public virtual view returns(bool); /** * return the sender of this call. * if the call came through our trusted forwarder, then the real sender is appended as the last 20 bytes * of the msg.data. * otherwise, return `msg.sender` * should be used in the contract anywhere instead of msg.sender */ function _msgSender() internal virtual view returns (address payable); /** * return the msg.data of this call. * if the call came through our trusted forwarder, then the real sender was appended as the last 20 bytes * of the msg.data - so this method will strip those 20 bytes off. * otherwise, return `msg.data` * should be used in the contract instead of msg.data, where the difference matters (e.g. when explicitly * signing or hashing the */ function _msgData() internal virtual view returns (bytes memory); function versionRecipient() external virtual view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, 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 `sender` to `recipient` 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 sender, address recipient, uint256 amount) external returns (bool); /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "./IERC20.sol"; import "../../math/SafeMath.sol"; import "../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; import "../../introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transfered 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) 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 Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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 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); /** * @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; }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.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); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"BreakBondApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"settingsController","type":"address"}],"name":"ChargedSettingsSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"DischargeApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"PermsSetForAllowBreakBond","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"PermsSetForAllowDischarge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"PermsSetForAllowRelease","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"PermsSetForRestrictBond","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"PermsSetForRestrictCharge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"ReleaseApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"TimelockApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockBlock","type":"uint256"}],"name":"TokenBreakBondTimelock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockBlock","type":"uint256"}],"name":"TokenDischargeTimelock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"unlockBlock","type":"uint256"}],"name":"TokenReleaseTimelock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockBlock","type":"uint256"}],"name":"TokenTempLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawStuckERC20","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"WithdrawStuckERC721","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawStuckEther","type":"event"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"getBreakBondState","outputs":[{"internalType":"bool","name":"allowFromAll","type":"bool"},{"internalType":"bool","name":"isApproved","type":"bool"},{"internalType":"uint256","name":"timelock","type":"uint256"},{"internalType":"uint256","name":"tempLockExpiry","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getBreakBondTimelockExpiry","outputs":[{"internalType":"uint256","name":"lockExpiry","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"getDischargeState","outputs":[{"internalType":"bool","name":"allowFromAll","type":"bool"},{"internalType":"bool","name":"isApproved","type":"bool"},{"internalType":"uint256","name":"timelock","type":"uint256"},{"internalType":"uint256","name":"tempLockExpiry","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDischargeTimelockExpiry","outputs":[{"internalType":"uint256","name":"lockExpiry","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"sender","type":"address"}],"name":"getReleaseState","outputs":[{"internalType":"bool","name":"allowFromAll","type":"bool"},{"internalType":"bool","name":"isApproved","type":"bool"},{"internalType":"uint256","name":"timelock","type":"uint256"},{"internalType":"uint256","name":"tempLockExpiry","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getReleaseTimelockExpiry","outputs":[{"internalType":"uint256","name":"lockExpiry","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForBreakBond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForDischarge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForRelease","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForTimelock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isCovalentBondRestricted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isEnergizeRestricted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"operator","type":"address"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"operator","type":"address"}],"name":"setBreakBondApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"unlockBlock","type":"uint256"}],"name":"setBreakBondTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"settingsController","type":"address"}],"name":"setChargedSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"operator","type":"address"}],"name":"setDischargeApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"unlockBlock","type":"uint256"}],"name":"setDischargeTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setPermsForAllowBreakBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setPermsForAllowDischarge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setPermsForAllowRelease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setPermsForRestrictBond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setPermsForRestrictCharge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"operator","type":"address"}],"name":"setReleaseApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"unlockBlock","type":"uint256"}],"name":"setReleaseTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bool","name":"isLocked","type":"bool"}],"name":"setTemporaryLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"operator","type":"address"}],"name":"setTimelockApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_trustedForwarder","type":"address"}],"name":"setTrustedForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"trustedForwarder","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"versionRecipient","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"withdrawERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEther","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060006200001e6200006e565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000d7565b6000620000856200008b60201b62001e121760201c565b90505b90565b600060183610801590620000a55750620000a533620000c3565b15620000bb575060131936013560601c62000088565b503362000088565b6001546001600160a01b0390811691161490565b6133b380620000e76000396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80637d2c5166116101305780639b9f2c9f116100b8578063d4bf57f11161007c578063d4bf57f1146108a5578063d4bf9916146108db578063da7422281461090f578063f2fde38b14610935578063fcedc4f01461095b57610227565b80639b9f2c9f146107a9578063ab296421146107dd578063bd3d500614610813578063c95d099814610849578063d4a0195f1461086f57610227565b8063887ed284116100ff578063887ed284146106d95780638da5cb5b1461070f5780639079900114610717578063976bd5f7146107495780639abeceab1461077557610227565b80637d2c51661461061f5780637da0a8771461064b578063807c56891461066f57806387cb154c146106a557610227565b8063522f6815116101b35780635d5942cb116101825780635d5942cb1461052357806364d95cbc146105815780636cc61e16146105ad57806370f84fbc146105e3578063715018a61461061757610227565b8063522f68151461046557806355f0ab2114610491578063572b6c05146104c75780635d00020d146104ed57610227565b80632ed47e59116101fa5780632ed47e591461030a578063332340be146103365780634025feb2146103685780634677b99a1461039e578063486ff0cd146103e857610227565b8063090003d21461022c57806313682c71146102605780631593dee11461029657806315cedecd146102cc575b600080fd5b61025e6004803603606081101561024257600080fd5b506001600160a01b03813516906020810135906040013561098f565b005b61025e6004803603606081101561027657600080fd5b506001600160a01b03813581169160208101359160409091013516610b2e565b61025e600480360360608110156102ac57600080fd5b506001600160a01b03813581169160208101359091169060400135610c06565b6102f8600480360360408110156102e257600080fd5b506001600160a01b038135169060200135610c6e565b60408051918252519081900360200190f35b6102f86004803603604081101561032057600080fd5b506001600160a01b038135169060200135610d06565b61025e6004803603606081101561034c57600080fd5b506001600160a01b038135169060208101359060400135610d92565b61025e6004803603606081101561037e57600080fd5b506001600160a01b03813581169160208101359091169060400135610f2d565b6103d4600480360360608110156103b457600080fd5b506001600160a01b03813581169160208101359160409091013516610f90565b604080519115158252519081900360200190f35b6103f0610fa7565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561042a578181015183820152602001610412565b50505050905090810190601f1680156104575780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61025e6004803603604081101561047b57600080fd5b506001600160a01b038135169060200135610fc8565b6103d4600480360360608110156104a757600080fd5b506001600160a01b0381358116916020810135916040909101351661102e565b6103d4600480360360208110156104dd57600080fd5b50356001600160a01b031661103b565b6103d46004803603606081101561050357600080fd5b506001600160a01b0381358116916020810135916040909101351661104f565b6105596004803603606081101561053957600080fd5b506001600160a01b0381358116916020810135916040909101351661105c565b6040805194151585529215156020850152838301919091526060830152519081900360800190f35b6103d46004803603604081101561059757600080fd5b506001600160a01b0381351690602001356110d3565b6103d4600480360360608110156105c357600080fd5b506001600160a01b03813581169160208101359160409091013516611119565b61025e600480360360608110156105f957600080fd5b506001600160a01b0381351690602081013590604001351515611126565b61025e611193565b6102f86004803603604081101561063557600080fd5b506001600160a01b038135169060200135611235565b6106536112be565b604080516001600160a01b039092168252519081900360200190f35b61025e6004803603606081101561068557600080fd5b506001600160a01b038135811691602081013591604090910135166112cd565b61025e600480360360608110156106bb57600080fd5b506001600160a01b03813516906020810135906040013515156113c0565b61025e600480360360608110156106ef57600080fd5b506001600160a01b03813581169160208101359160409091013516611425565b6106536114f4565b61025e6004803603606081101561072d57600080fd5b506001600160a01b038135169060208101359060400135611503565b6103d46004803603604081101561075f57600080fd5b506001600160a01b03813516906020013561169e565b61025e6004803603606081101561078b57600080fd5b506001600160a01b03813516906020810135906040013515156116dc565b61025e600480360360608110156107bf57600080fd5b506001600160a01b0381351690602081013590604001351515611741565b61025e600480360360608110156107f357600080fd5b506001600160a01b038135811691602081013591604090910135166117a6565b6105596004803603606081101561082957600080fd5b506001600160a01b03813581169160208101359160409091013516611869565b61025e6004803603602081101561085f57600080fd5b50356001600160a01b03166118e0565b61025e6004803603606081101561088557600080fd5b506001600160a01b03813581169160208101359160409091013516611982565b610559600480360360608110156108bb57600080fd5b506001600160a01b03813581169160208101359160409091013516611a51565b61025e600480360360608110156108f157600080fd5b506001600160a01b0381351690602081013590604001351515611aca565b61025e6004803603602081101561092557600080fd5b50356001600160a01b0316611c3b565b61025e6004803603602081101561094b57600080fd5b50356001600160a01b0316611cb5565b61025e6004803603606081101561097157600080fd5b506001600160a01b0381351690602081013590604001351515611dad565b6000610999611e44565b905060006109b06001600160a01b03861685611e53565b9050821580156109dc57506000818152600360205260409020600401546001600160a01b038381169116145b15610a0e57600081815260036020819052604082209081019190915560040180546001600160a01b0319169055610adb565b610a19858584611e97565b610a55576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b60008181526003602081905260409091200154431015610aa7576040805162461bcd60e51b815260206004820152600860248201526721a81d229699981960c11b604482015290519081900360640190fd5b600081815260036020819052604090912090810184905560040180546001600160a01b0319166001600160a01b0384161790555b816001600160a01b031684866001600160a01b03167f5e0dabff697f9743e52ccc618312a1c2e1ed16ef7f22f44dfd1ba9cf5458c035866040518082815260200191505060405180910390a45050505050565b8282610b38611e44565b610b4c6001600160a01b0384168383611fda565b610b88576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b6000610b9d6001600160a01b038816876120fe565b9050806001600160a01b0316856001600160a01b03161415610bf1576040805162461bcd60e51b815260206004820152600860248201526721a81d229698981b60c11b604482015290519081900360640190fd5b610bfd8787838861217c565b50505050505050565b610c0e611e44565b6000546001600160a01b03908116911614610c5e576040805162461bcd60e51b81526020600482018190526024820152600080516020613306833981519152604482015290519081900360640190fd5b610c6983838361220f565b505050565b600080610c846001600160a01b03851684611e53565b600081815260036020526040902060010154909150431015610cb55760008181526003602052604090206001015491505b60008181526003602052604090206007015443108015610ce5575060008181526003602052604090206007015482105b15610cff5760008181526003602052604090206007015491505b5092915050565b600080610d1c6001600160a01b03851684611e53565b60008181526003602081905260409091200154909150431015610cb55760008181526003602081905260409091209081015460079091015490925043108015610ce55750600081815260036020526040902060070154821015610cff576000908152600360205260409020600701549392505050565b6000610d9c611e44565b90506000610db36001600160a01b03861685611e53565b905082158015610ddf57506000818152600360205260409020600201546001600160a01b038381169116145b15610e10576000818152600360205260408120600181019190915560020180546001600160a01b0319169055610eda565b610e1b858584611e97565b610e57576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b600081815260036020526040902060010154431015610ea8576040805162461bcd60e51b815260206004820152600860248201526721a81d229699981960c11b604482015290519081900360640190fd5b60008181526003602052604090206001810184905560020180546001600160a01b0319166001600160a01b0384161790555b816001600160a01b031684866001600160a01b03167f21f4b7d7136878f9dd97a01489ac4d8ffcab738da5a683f02c6b0f6f02971224866040518082815260200191505060405180910390a45050505050565b610f35611e44565b6000546001600160a01b03908116911614610f85576040805162461bcd60e51b81526020600482018190526024820152600080516020613306833981519152604482015290519081900360640190fd5b610c69838383612339565b6000610f9d8484846124bf565b90505b9392505050565b60606040518060600160405280602e8152602001613326602e913990505b90565b610fd0611e44565b6000546001600160a01b03908116911614611020576040805162461bcd60e51b81526020600482018190526024820152600080516020613306833981519152604482015290519081900360640190fd5b61102a828261255b565b5050565b6000610f9d8484846125fe565b6001546001600160a01b0390811691161490565b6000610f9d848484611e97565b6000808080806110756001600160a01b03891688611e53565b60008181526003602052604090205490915061109d9063ffffffff9081169060029061269a16565b94506110aa8888886126bb565b600091825260036020526040909120600181015460079091015495999198509650939450505050565b6000806110e96001600160a01b03851684611e53565b6000818152600360205260409020549091506111119063ffffffff9081169060089061269a16565b949350505050565b6000610f9d8484846126bb565b8282611130611e44565b6111446001600160a01b0384168383611fda565b611180576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b61118b868686612757565b505050505050565b61119b611e44565b6000546001600160a01b039081169116146111eb576040805162461bcd60e51b81526020600482018190526024820152600080516020613306833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60008061124b6001600160a01b03851684611e53565b600081815260036020526040902060050154909150431015610cb5576000818152600360205260409020600581015460079091015490925043108015610ce55750600081815260036020526040902060070154821015610cff576000908152600360205260409020600701549392505050565b6001546001600160a01b031681565b82826112d7611e44565b6112eb6001600160a01b0384168383611fda565b611327576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b600061133c6001600160a01b038816876120fe565b9050806001600160a01b0316856001600160a01b03161415611390576040805162461bcd60e51b815260206004820152600860248201526721a81d229698981b60c11b604482015290519081900360640190fd5b61139c87878388612858565b6113a8878783886128eb565b6113b48787838861217c565b610bfd8787838861297e565b82826113ca611e44565b6113de6001600160a01b0384168383611fda565b61141a576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b61118b868686612a11565b828261142f611e44565b6114436001600160a01b0384168383611fda565b61147f576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b60006114946001600160a01b038816876120fe565b9050806001600160a01b0316856001600160a01b031614156114e8576040805162461bcd60e51b815260206004820152600860248201526721a81d229698981b60c11b604482015290519081900360640190fd5b610bfd878783886128eb565b6000546001600160a01b031690565b600061150d611e44565b905060006115246001600160a01b03861685611e53565b90508215801561155057506000818152600360205260409020600601546001600160a01b038381169116145b15611581576000818152600360205260408120600581019190915560060180546001600160a01b031916905561164b565b61158c858584611e97565b6115c8576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b600081815260036020526040902060050154431015611619576040805162461bcd60e51b815260206004820152600860248201526721a81d229699981960c11b604482015290519081900360640190fd5b60008181526003602052604090206005810184905560060180546001600160a01b0319166001600160a01b0384161790555b816001600160a01b031684866001600160a01b03167f758077f0101f3c7abec72875f1cd7ea8386e31c97cea81676acd97e5652ef124866040518082815260200191505060405180910390a45050505050565b6000806116b46001600160a01b03851684611e53565b6000818152600360205260409020549091506111119063ffffffff9081169060019061269a16565b82826116e6611e44565b6116fa6001600160a01b0384168383611fda565b611736576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b61118b868686612b12565b828261174b611e44565b61175f6001600160a01b0384168383611fda565b61179b576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b61118b868686612c13565b82826117b0611e44565b6117c46001600160a01b0384168383611fda565b611800576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b60006118156001600160a01b038816876120fe565b9050806001600160a01b0316856001600160a01b031614156113b4576040805162461bcd60e51b815260206004820152600860248201526721a81d229698981b60c11b604482015290519081900360640190fd5b6000808080806118826001600160a01b03891688611e53565b6000818152600360205260409020549091506118aa9063ffffffff9081169060109061269a16565b94506118b78888886125fe565b600091825260036020526040909120600581015460079091015495999198509650939450505050565b6118e8611e44565b6000546001600160a01b03908116911614611938576040805162461bcd60e51b81526020600482018190526024820152600080516020613306833981519152604482015290519081900360640190fd5b600280546001600160a01b0319166001600160a01b0383169081179091556040517f7ad4c1bc3e874ec0bf47846feb5648b384e8511dc9e5f9803578c9d2b4ec9e6e90600090a250565b828261198c611e44565b6119a06001600160a01b0384168383611fda565b6119dc576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b60006119f16001600160a01b038816876120fe565b9050806001600160a01b0316856001600160a01b03161415611a45576040805162461bcd60e51b815260206004820152600860248201526721a81d229698981b60c11b604482015290519081900360640190fd5b610bfd87878388612858565b600080808080611a6a6001600160a01b03891688611e53565b600081815260036020526040902054909150611a929063ffffffff9081169060049061269a16565b9450611a9f8888886124bf565b6000918252600360208190526040909220918201546007909201549599909850909650939450505050565b336001600160a01b03841614611b12576040805162461bcd60e51b815260206004820152600860248201526721a81d229698989960c11b604482015290519081900360640190fd5b6000611b276001600160a01b03851684611e53565b90506000828015611b475750600082815260036020526040902060070154155b15611bdc576002546040805163cf74fe6160e01b81529051611bc5926001600160a01b03169163cf74fe61916004808301926020929190829003018186803b158015611b9257600080fd5b505afa158015611ba6573d6000803e3d6000fd5b505050506040513d6020811015611bbc57600080fd5b50514390612d14565b600083815260036020526040902060070181905590505b82611bf4576000828152600360205260408120600701555b60408051828152905185916001600160a01b038816917f0b5c7a4085b6a300c607444f618613634e56ee3d37a141f747f24e670eddd0ff9181900360200190a35050505050565b611c43611e44565b6000546001600160a01b03908116911614611c93576040805162461bcd60e51b81526020600482018190526024820152600080516020613306833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b611cbd611e44565b6000546001600160a01b03908116911614611d0d576040805162461bcd60e51b81526020600482018190526024820152600080516020613306833981519152604482015290519081900360640190fd5b6001600160a01b038116611d525760405162461bcd60e51b81526004018080602001828103825260268152602001806132a66026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b8282611db7611e44565b611dcb6001600160a01b0384168383611fda565b611e07576040805162461bcd60e51b815260206004820152600860248201526743503a452d31303560c01b604482015290519081900360640190fd5b61118b868686612d6e565b600060183610801590611e295750611e293361103b565b15611e3d575060131936013560601c610fc5565b5033610fc5565b6000611e4e611e12565b905090565b6040805160609390931b6bffffffffffffffffffffffff19166020808501919091526034808501939093528151808503909301835260549093019052805191012090565b6002546040805163070d9e4f60e41b81526001600160a01b03848116600483015282516000948594859493909116926370d9e4f09260248083019392829003018186803b158015611ee757600080fd5b505afa158015611efb573d6000803e3d6000fd5b505050506040513d6040811015611f1157600080fd5b50805160209091015190925090508180611f445750808015611f445750836001600160a01b0316866001600160a01b0316145b15611f5457600192505050610fa0565b6000611f696001600160a01b038816876120fe565b90506000611f806001600160a01b03891688611e53565b9050856001600160a01b0316826001600160a01b03161480611fce575060008181526003602090815260408083206001600160a01b038681168552600b909101909252909120548116908716145b98975050505050505050565b6000808490506000816001600160a01b0316636352211e866040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561202657600080fd5b505afa15801561203a573d6000803e3d6000fd5b505050506040513d602081101561205057600080fd5b505190506001600160a01b0384811690821614806120f45750816001600160a01b031663e985e9c582866040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156120c757600080fd5b505afa1580156120db573d6000803e3d6000fd5b505050506040513d60208110156120f157600080fd5b50515b9695505050505050565b600080839050806001600160a01b0316636352211e846040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561214857600080fd5b505afa15801561215c573d6000803e3d6000fd5b505050506040513d602081101561217257600080fd5b5051949350505050565b60006121916001600160a01b03861685611e53565b60008181526003602090815260408083206001600160a01b03888116808652600a90920184529382902080546001600160a01b031916888616908117909155825190815291519495509388938a16927fd1d8262a7c0385d940cfc858eddede2109c33acd42d02175201d3c0c73f23714928290030190a45050505050565b6001600160a01b038316612256576040805162461bcd60e51b81526020600482015260096024820152684248503a452d34303360b81b604482015290519081900360640190fd5b80826001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156122a457600080fd5b505afa1580156122b8573d6000803e3d6000fd5b505050506040513d60208110156122ce57600080fd5b505110610c69576122e96001600160a01b0383168483612e6f565b816001600160a01b0316836001600160a01b03167f6c9d637297625e945b296ff73a71fcfbd0a9e062652b6491a921c4c60194176b836040518082815260200191505060405180910390a3505050565b6001600160a01b038316612380576040805162461bcd60e51b81526020600482015260096024820152684248503a452d34303360b81b604482015290519081900360640190fd5b306001600160a01b0316826001600160a01b0316636352211e836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156123ce57600080fd5b505afa1580156123e2573d6000803e3d6000fd5b505050506040513d60208110156123f857600080fd5b50516001600160a01b03161415610c6957604080516323b872dd60e01b81523060048201526001600160a01b038581166024830152604482018490529151918416916323b872dd9160648082019260009290919082900301818387803b15801561246157600080fd5b505af1158015612475573d6000803e3d6000fd5b5050505080826001600160a01b0316846001600160a01b03167ffefe036cac4ee3a4aca074a81cbcc4376e1484693289078dbec149c890101d5b60405160405180910390a4505050565b6000806124d56001600160a01b038616856120fe565b905060006124ec6001600160a01b03871686611e53565b9050836001600160a01b0316866001600160a01b0316148061251f5750836001600160a01b0316826001600160a01b0316145b806120f4575060009081526003602090815260408083206001600160a01b03948516845260090190915290205481169216919091149392505050565b6001600160a01b0382166125a2576040805162461bcd60e51b81526020600482015260096024820152684248503a452d34303360b81b604482015290519081900360640190fd5b80471061102a576125bc6001600160a01b03831682612ec1565b6040805182815290516001600160a01b038416917eddb683bb45cd5d0ad8a200c6fae7152b1c236ee90a4a37db692407f5cc38bd919081900360200190a25050565b6000806126146001600160a01b038616856120fe565b9050600061262b6001600160a01b03871686611e53565b9050836001600160a01b0316866001600160a01b0316148061265e5750836001600160a01b0316826001600160a01b0316145b806120f4575060009081526003602090815260408083206001600160a01b039485168452600a0190915290205481169216919091149392505050565b60006126a7600183612fa6565b831663ffffffff1660001415905092915050565b6000806126d16001600160a01b038616856120fe565b905060006126e86001600160a01b03871686611e53565b9050836001600160a01b0316866001600160a01b0316148061271b5750836001600160a01b0316826001600160a01b0316145b806120f4575060009081526003602090815260408083206001600160a01b03948516845260080190915290205481169216919091149392505050565b600061276c6001600160a01b03851684611e53565b905081156127c4576000818152600360205260409020546127999063ffffffff90811690600490612fb316565b6000828152600360205260409020805463ffffffff191663ffffffff92909216919091179055612810565b6000818152600360205260409020546127e99063ffffffff90811690600490612fc916565b6000828152600360205260409020805463ffffffff191663ffffffff929092169190911790555b604080518315158152905184916001600160a01b038716917f60b065401831ca3775c611d50407d2d9e7e615a8b398776f217cffe08e25fc259181900360200190a350505050565b600061286d6001600160a01b03861685611e53565b60008181526003602090815260408083206001600160a01b03888116808652600890920184529382902080546001600160a01b031916888616908117909155825190815291519495509388938a16927fe37a9a01b315d1c563b8ac93eeb4e09b640626e6460050dec5a60baa1c3b30aa928290030190a45050505050565b60006129006001600160a01b03861685611e53565b60008181526003602090815260408083206001600160a01b03888116808652600990920184529382902080546001600160a01b031916888616908117909155825190815291519495509388938a16927fd802cd84562e02fc8bc0204a289d2965ccffd71b7ed25363be2ca74dd9e523ee928290030190a45050505050565b60006129936001600160a01b03861685611e53565b60008181526003602090815260408083206001600160a01b03888116808652600b90920184529382902080546001600160a01b031916888616908117909155825190815291519495509388938a16927f55a70bf11ae9c3741ac5aeab2504a3e79626c53205130f80f441a0acd44fc09b928290030190a45050505050565b6000612a266001600160a01b03851684611e53565b90508115612a7e57600081815260036020526040902054612a539063ffffffff90811690600190612fb316565b6000828152600360205260409020805463ffffffff191663ffffffff92909216919091179055612aca565b600081815260036020526040902054612aa39063ffffffff90811690600190612fc916565b6000828152600360205260409020805463ffffffff191663ffffffff929092169190911790555b604080518315158152905184916001600160a01b038716917f6fa629b4e45691a0208dc92254c095c4e2c7c58046dbc976fa149cb034de62109181900360200190a350505050565b6000612b276001600160a01b03851684611e53565b90508115612b7f57600081815260036020526040902054612b549063ffffffff90811690600290612fb316565b6000828152600360205260409020805463ffffffff191663ffffffff92909216919091179055612bcb565b600081815260036020526040902054612ba49063ffffffff90811690600290612fc916565b6000828152600360205260409020805463ffffffff191663ffffffff929092169190911790555b604080518315158152905184916001600160a01b038716917fa3238936997a7f1288b3cd08147c59dfb6a0dadb9a618cf89146e0972654645a9181900360200190a350505050565b6000612c286001600160a01b03851684611e53565b90508115612c8057600081815260036020526040902054612c559063ffffffff90811690601090612fb316565b6000828152600360205260409020805463ffffffff191663ffffffff92909216919091179055612ccc565b600081815260036020526040902054612ca59063ffffffff90811690601090612fc916565b6000828152600360205260409020805463ffffffff191663ffffffff929092169190911790555b604080518315158152905184916001600160a01b038716917f7ec1a86903b11ee157701f0396f3b20f9b74a6ce9b5185aea79ef7f8f063f2b09181900360200190a350505050565b600082820183811015610fa0576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000612d836001600160a01b03851684611e53565b90508115612ddb57600081815260036020526040902054612db09063ffffffff90811690600890612fb316565b6000828152600360205260409020805463ffffffff191663ffffffff92909216919091179055612e27565b600081815260036020526040902054612e009063ffffffff90811690600890612fc916565b6000828152600360205260409020805463ffffffff191663ffffffff929092169190911790555b604080518315158152905184916001600160a01b038716917f6ec38741515d4750763d848e355368717861814d782e6f0182de492e529c24c39181900360200190a350505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610c69908490612fe9565b80471015612f16576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612f61576040519150601f19603f3d011682016040523d82523d6000602084013e612f66565b606091505b5050905080610c695760405162461bcd60e51b815260040180806020018281038252603a8152602001806132cc603a913960400191505060405180910390fd5b63ffffffff1660020a0290565b6000612fc0600183612fa6565b90921792915050565b600080612fdf612fda600185612fa6565b61309a565b9093169392505050565b606061303e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166130ac9092919063ffffffff16565b805190915015610c695780806020019051602081101561305d57600080fd5b5051610c695760405162461bcd60e51b815260040180806020018281038252602a815260200180613354602a913960400191505060405180910390fd5b60006130a46130bb565b909118919050565b6060610f9d84846000856130c1565b60001990565b60606130cc8561326c565b61311d576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b6020831061315c5780518252601f19909201916020918201910161313d565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146131be576040519150601f19603f3d011682016040523d82523d6000602084013e6131c3565b606091505b509150915081156131d75791506111119050565b8051156131e75780518082602001fd5b8360405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613231578181015183820152602001613219565b50505050905090810190601f16801561325e5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061111157505015159291505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d617920686176652072657665727465644f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572312e302e302d626574612e312f636861726765642d7061727469636c65732e72656c61792e726563697069656e745361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220db44dd369c089ee0de6cd3fcbc207b93eb8cf0d9d78ae6a3093ff4ad90c4be3864736f6c634300060c0033
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.