编译器
0.6.12+commit.27d51765
文件 1 的 22:Address.sol
pragma solidity ^0.6.2;
library Address {
function isContract(address account) internal view returns (bool) {
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
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");
}
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");
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
文件 2 的 22:BaseRelayRecipient.sol
pragma solidity ^0.6.2;
import "./interfaces/IRelayRecipient.sol";
abstract contract BaseRelayRecipient is IRelayRecipient {
address public trustedForwarder;
function isTrustedForwarder(address forwarder) public override view returns(bool) {
return forwarder == trustedForwarder;
}
function _msgSender() internal override virtual view returns (address payable ret) {
if (msg.data.length >= 24 && isTrustedForwarder(msg.sender)) {
assembly {
ret := shr(96,calldataload(sub(calldatasize(),20)))
}
} else {
return msg.sender;
}
}
function _msgData() internal override virtual view returns (bytes memory ret) {
if (msg.data.length >= 24 && isTrustedForwarder(msg.sender)) {
assembly {
let ptr := mload(0x40)
let size := sub(calldatasize(),20)
mstore(ptr, 0x20)
mstore(add(ptr,32), size)
calldatacopy(add(ptr,64), 0, size)
return(ptr, add(size,64))
}
} else {
return msg.data;
}
}
}
文件 3 的 22:Bitwise.sol
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);
}
function hasBit(uint32 a, uint32 n) internal pure returns (bool) {
return a & shiftLeft(0x01, n) != 0;
}
function setBit(uint32 a, uint32 n) internal pure returns (uint32) {
return a | shiftLeft(0x01, n);
}
function clearBit(uint32 a, uint32 n) internal pure returns (uint32) {
uint32 mask = negate(shiftLeft(0x01, n));
return a & mask;
}
}
文件 4 的 22:BlackholePrevention.sol
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";
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);
}
}
}
文件 5 的 22:ChargedState.sol
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";
contract ChargedState is
IChargedState,
Ownable,
RelayRecipient,
BlackholePrevention
{
using SafeMath for uint256;
using TokenInfo for address;
using Bitwise for uint32;
uint32 constant internal PERM_RESTRICT_ENERGIZE_FROM_ALL = 1;
uint32 constant internal PERM_ALLOW_DISCHARGE_FROM_ALL = 2;
uint32 constant internal PERM_ALLOW_RELEASE_FROM_ALL = 4;
uint32 constant internal PERM_RESTRICT_BOND_FROM_ALL = 8;
uint32 constant internal PERM_ALLOW_BREAK_BOND_FROM_ALL = 16;
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;
mapping (uint256 => NftState) internal _nftState;
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;
}
}
function isApprovedForDischarge(address contractAddress, uint256 tokenId, address operator) external virtual override view returns (bool) {
return _isApprovedForDischarge(contractAddress, tokenId, operator);
}
function isApprovedForRelease(address contractAddress, uint256 tokenId, address operator) external virtual override view returns (bool) {
return _isApprovedForRelease(contractAddress, tokenId, operator);
}
function isApprovedForBreakBond(address contractAddress, uint256 tokenId, address operator) external virtual override view returns (bool) {
return _isApprovedForBreakBond(contractAddress, tokenId, operator);
}
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;
}
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);
}
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);
}
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);
}
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);
}
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);
}
function setPermsForRestrictCharge(address contractAddress, uint256 tokenId, bool state)
external
virtual
override
onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender())
{
_setPermsForRestrictCharge(contractAddress, tokenId, state);
}
function setPermsForAllowDischarge(address contractAddress, uint256 tokenId, bool state)
external
virtual
override
onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender())
{
_setPermsForAllowDischarge(contractAddress, tokenId, state);
}
function setPermsForAllowRelease(address contractAddress, uint256 tokenId, bool state)
external
virtual
override
onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender())
{
_setPermsForAllowRelease(contractAddress, tokenId, state);
}
function setPermsForRestrictBond(address contractAddress, uint256 tokenId, bool state)
external
virtual
override
onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender())
{
_setPermsForRestrictBond(contractAddress, tokenId, state);
}
function setPermsForAllowBreakBond(address contractAddress, uint256 tokenId, bool state)
external
virtual
override
onlyErc721OwnerOrOperator(contractAddress, tokenId, _msgSender())
{
_setPermsForAllowBreakBond(contractAddress, tokenId, state);
}
function setDischargeTimelock(
address contractAddress,
uint256 tokenId,
uint256 unlockBlock
)
external
override
virtual
{
address sender = _msgSender();
uint256 tokenUuid = contractAddress.getTokenUUID(tokenId);
if (unlockBlock == 0 && _nftState[tokenUuid].dischargeTimelock.lockedBy == sender) {
delete _nftState[tokenUuid].dischargeTimelock.unlockBlock;
delete _nftState[tokenUuid].dischargeTimelock.lockedBy;
}
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);
}
function setReleaseTimelock(
address contractAddress,
uint256 tokenId,
uint256 unlockBlock
)
external
override
virtual
{
address sender = _msgSender();
uint256 tokenUuid = contractAddress.getTokenUUID(tokenId);
if (unlockBlock == 0 && _nftState[tokenUuid].releaseTimelock.lockedBy == sender) {
delete _nftState[tokenUuid].releaseTimelock.unlockBlock;
delete _nftState[tokenUuid].releaseTimelock.lockedBy;
}
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);
}
function setBreakBondTimelock(
address contractAddress,
uint256 tokenId,
uint256 unlockBlock
)
external
override
virtual
{
address sender = _msgSender();
uint256 tokenUuid = contractAddress.getTokenUUID(tokenId);
if (unlockBlock == 0 && _nftState[tokenUuid].breakBondTimelock.lockedBy == sender) {
delete _nftState[tokenUuid].breakBondTimelock.unlockBlock;
delete _nftState[tokenUuid].breakBondTimelock.lockedBy;
}
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);
}
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);
}
function setChargedSettings(address settingsController) external virtual onlyOwner {
_chargedSettings = IChargedSettings(settingsController);
emit ChargedSettingsSet(settingsController);
}
function setTrustedForwarder(address _trustedForwarder) external onlyOwner {
trustedForwarder = _trustedForwarder;
}
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);
}
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;
}
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;
}
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;
}
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;
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
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);
}
function _msgSender()
internal
view
virtual
override(BaseRelayRecipient, Context)
returns (address payable)
{
return BaseRelayRecipient._msgSender();
}
function _msgData()
internal
view
virtual
override(BaseRelayRecipient, Context)
returns (bytes memory)
{
return BaseRelayRecipient._msgData();
}
modifier onlyErc721OwnerOrOperator(address contractAddress, uint256 tokenId, address sender) {
require(contractAddress.isErc721OwnerOrOperator(tokenId, sender), "CP:E-105");
_;
}
}
文件 6 的 22:Context.sol
pragma solidity ^0.6.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this;
return msg.data;
}
}
文件 7 的 22:IBasketManager.sol
pragma solidity >=0.6.0;
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;
}
文件 8 的 22:IChargedSettings.sol
pragma solidity >=0.6.0;
import "./IWalletManager.sol";
import "./IBasketManager.sol";
interface IChargedSettings {
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);
function isWalletManagerEnabled(string calldata walletManagerId) external view returns (bool);
function getWalletManager(string calldata walletManagerId) external view returns (IWalletManager);
function isNftBasketEnabled(string calldata basketId) external view returns (bool);
function getBasketManager(string calldata basketId) external view returns (IBasketManager);
function setCreatorAnnuities(address contractAddress, uint256 tokenId, address creator, uint256 annuityPercent) external;
function setCreatorAnnuitiesRedirect(address contractAddress, uint256 tokenId, address creator, address receiver) external;
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;
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;
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);
}
文件 9 的 22:IChargedState.sol
pragma solidity >=0.6.0;
import "./IChargedSettings.sol";
interface IChargedState {
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);
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;
function setTemporaryLock(
address contractAddress,
uint256 tokenId,
bool isLocked
) external;
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);
}
文件 10 的 22:IERC165.sol
pragma solidity ^0.6.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 11 的 22:IERC165Upgradeable.sol
pragma solidity >=0.6.0 <0.8.0;
interface IERC165Upgradeable {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 12 的 22:IERC20.sol
pragma solidity ^0.6.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 13 的 22:IERC20Upgradeable.sol
pragma solidity >=0.6.0 <0.8.0;
interface IERC20Upgradeable {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 14 的 22:IERC721.sol
pragma solidity ^0.6.2;
import "../../introspection/IERC165.sol";
interface IERC721 is IERC165 {
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
function balanceOf(address owner) external view returns (uint256 balance);
function ownerOf(uint256 tokenId) external view returns (address owner);
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 owner, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
文件 15 的 22:IERC721Chargeable.sol
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;
}
文件 16 的 22:IRelayRecipient.sol
pragma solidity ^0.6.2;
abstract contract IRelayRecipient {
function isTrustedForwarder(address forwarder) public virtual view returns(bool);
function _msgSender() internal virtual view returns (address payable);
function _msgData() internal virtual view returns (bytes memory);
function versionRecipient() external virtual view returns (string memory);
}
文件 17 的 22:IWalletManager.sol
pragma solidity >=0.6.0;
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;
}
文件 18 的 22:Ownable.sol
pragma solidity ^0.6.0;
import "../GSN/Context.sol";
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view returns (address) {
return _owner;
}
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
文件 19 的 22:RelayRecipient.sol
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";
}
}
文件 20 的 22:SafeERC20.sol
pragma solidity ^0.6.0;
import "./IERC20.sol";
import "../../math/SafeMath.sol";
import "../../utils/Address.sol";
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));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
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));
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
文件 21 的 22:SafeMath.sol
pragma solidity ^0.6.0;
library SafeMath {
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
return c;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
文件 22 的 22:TokenInfo.sol
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);
}
function isContractOwner(address contractAddress, address account) internal view virtual returns (bool) {
address contractOwner = IERC721Chargeable(contractAddress).owner();
return contractOwner != address(0x0) && contractOwner == account;
}
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);
}
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);
}
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));
}
function isContract(address account) internal view returns (bool) {
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "TokenInfo: insufficient balance");
(bool success, ) = recipient.call{ value: amount }("");
require(success, "TokenInfo: unable to send value, recipient may have reverted");
}
}
{
"compilationTarget": {
"contracts/ChargedState.sol": "ChargedState"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"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"}]