文件 1 的 29:Address.sol
pragma solidity ^0.8.0;
library Address {
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly { size := extcodesize(account) }
return size > 0;
}
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");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
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 的 29:CloneNurseEnumerable.sol
pragma solidity ^0.8.0;
import "./ERC721.sol";
import "../interfaces/ICloneNurseEnumerable.sol";
abstract contract CloneNurseEnumerable is ERC721, ICloneNurseEnumerable {
mapping(address => mapping(uint256 => uint256)) private _ownedTokens;
mapping(uint256 => uint256) private _ownedTokensIndex;
function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
return _ownedTokens[owner][index];
}
function totalSupply() public view virtual override returns (uint256) {
}
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual override {
super._beforeTokenTransfer(from, to, tokenId);
if (from == address(0)) {
_addTokenToOwnerEnumeration(to, tokenId);
} else if (to == address(0)) {
_removeTokenFromOwnerEnumeration(from, tokenId);
} else {
_removeTokenFromOwnerEnumeration(from, tokenId);
_addTokenToOwnerEnumeration(to, tokenId);
}
}
function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
uint256 length = ERC721.balanceOf(to);
_ownedTokens[to][length] = tokenId;
_ownedTokensIndex[tokenId] = length;
}
function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
uint256 tokenIndex = _ownedTokensIndex[tokenId];
if (tokenIndex != lastTokenIndex) {
uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];
_ownedTokens[from][tokenIndex] = lastTokenId;
_ownedTokensIndex[lastTokenId] = tokenIndex;
}
delete _ownedTokensIndex[tokenId];
delete _ownedTokens[from][lastTokenIndex];
}
}
文件 3 的 29:CloneNurses.sol
pragma solidity ^0.8.5;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
import "./libraries/CloneNurseEnumerable.sol";
import "./interfaces/IERC1271.sol";
import "./interfaces/ICloneNurses.sol";
import "./interfaces/IERC2981.sol";
contract CloneNurses is
Ownable,
ERC721("MaidCoin Clone Nurses", "CNURSES"),
CloneNurseEnumerable,
ERC1155Holder,
IERC2981,
ICloneNurses
{
struct NurseType {
uint256 partCount;
uint256 destroyReturn;
uint256 power;
uint256 lifetime;
}
struct Nurse {
uint256 nurseType;
uint256 endBlock;
uint256 lastClaimedBlock;
}
INursePart public immutable override nursePart;
IMaidCoin public immutable override maidCoin;
ITheMaster public immutable override theMaster;
uint256 private immutable theMasterStartBlock;
mapping(uint256 => uint256) public override supportingRoute;
mapping(address => uint256) public override supportingTo;
mapping(uint256 => uint256) public override supportedPower;
mapping(uint256 => uint256) public override totalRewardsFromSupporters;
NurseType[] public override nurseTypes;
Nurse[] public override nurses;
uint256 private royaltyFee = 25;
address private royaltyReceiver;
constructor(
INursePart _nursePart,
IMaidCoin _maidCoin,
ITheMaster _theMaster,
address _royaltyReceiver
) {
nursePart = _nursePart;
maidCoin = _maidCoin;
theMaster = _theMaster;
royaltyReceiver = _royaltyReceiver;
theMasterStartBlock = _theMaster.startBlock();
}
function _baseURI() internal pure override returns (string memory) {
return "https://api.maidcoin.org/clonenurses/";
}
function totalSupply() public view override(CloneNurseEnumerable, ICloneNurseEnumerable) returns (uint256) {
return nurses.length;
}
function addNurseType(
uint256[] calldata partCounts,
uint256[] calldata destroyReturns,
uint256[] calldata powers,
uint256[] calldata lifetimes
) external onlyOwner returns (uint256[] memory) {
uint256 startId = nurseTypes.length;
uint256[] memory nurseType = new uint256[](partCounts.length);
for (uint256 i = 0; i < partCounts.length; i += 1) {
require(partCounts[i] > 1, "CloneNurses: Invalid partCount");
nurseTypes.push(
NurseType({
partCount: partCounts[i],
destroyReturn: destroyReturns[i],
power: powers[i],
lifetime: lifetimes[i]
})
);
nurseType[i] = (startId + i);
}
return nurseType;
}
function nurseTypeCount() external view override returns (uint256) {
return nurseTypes.length;
}
function assemble(uint256 _nurseType, uint256 _parts) public override {
NurseType storage nurseType = nurseTypes[_nurseType];
uint256 _partCount = nurseType.partCount;
require(_parts >= _partCount, "CloneNurses: Not enough parts");
nursePart.safeTransferFrom(msg.sender, address(this), _nurseType, _parts, "");
nursePart.burn(_nurseType, _parts);
uint256 lifetime = ((nurseType.lifetime * (_parts - 1)) / (_partCount - 1));
uint256 startblock = block.number > theMasterStartBlock ? block.number : theMasterStartBlock;
uint256 endBlock = startblock + lifetime;
uint256 id = totalSupply();
theMaster.deposit(2, nurseType.power, id);
nurses.push(Nurse({nurseType: _nurseType, endBlock: endBlock, lastClaimedBlock: startblock}));
supportingRoute[id] = id;
emit ChangeSupportingRoute(id, id);
_mint(msg.sender, id);
emit ElongateLifetime(id, lifetime, 0, endBlock);
}
function assembleWithPermit(
uint256 nurseType,
uint256 _parts,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external override {
nursePart.permit(msg.sender, address(this), deadline, v, r, s);
assemble(nurseType, _parts);
}
function elongateLifetime(uint256[] calldata ids, uint256[] calldata parts) external override {
require(ids.length == parts.length, "CloneNurses: Invalid parameters");
claim(ids);
for (uint256 i = 0; i < ids.length; i += 1) {
require(parts[i] > 0, "CloneNurses: Invalid amounts of parts");
Nurse storage nurse = nurses[ids[i]];
uint256 _nurseType = nurse.nurseType;
NurseType storage nurseType = nurseTypes[_nurseType];
nursePart.safeTransferFrom(msg.sender, address(this), _nurseType, parts[i], "");
nursePart.burn(_nurseType, parts[i]);
uint256 oldEndBlock = nurse.endBlock;
uint256 from;
if (block.number <= oldEndBlock) from = oldEndBlock;
else from = block.number;
uint256 rechagedLifetime = ((nurseType.lifetime * parts[i]) / (nurseType.partCount - 1));
uint256 newEndBlock = from + rechagedLifetime;
nurse.endBlock = newEndBlock;
emit ElongateLifetime(ids[i], rechagedLifetime, oldEndBlock, newEndBlock);
}
}
function destroy(uint256[] calldata ids, uint256[] calldata toIds) external override {
require(ids.length == toIds.length, "CloneNurses: Invalid parameters");
for (uint256 i = 0; i < ids.length; i += 1) {
require(msg.sender == ownerOf(ids[i]), "CloneNurses: Forbidden");
uint256 power = supportedPower[ids[i]];
if (power == 0) {
supportingRoute[ids[i]] = type(uint256).max;
emit ChangeSupportingRoute(ids[i], type(uint256).max);
} else {
require(toIds[i] != ids[i], "CloneNurses: Invalid id, toId");
require(_exists(toIds[i]), "CloneNurses: Invalid toId");
supportingRoute[ids[i]] = toIds[i];
emit ChangeSupportingRoute(ids[i], toIds[i]);
supportedPower[toIds[i]] += power;
supportedPower[ids[i]] = 0;
emit ChangeSupportedPower(toIds[i], int256(power));
}
NurseType storage nurseType = nurseTypes[nurses[ids[i]].nurseType];
uint256 balanceBefore = maidCoin.balanceOf(address(this));
theMaster.withdraw(2, nurseType.power, ids[i]);
uint256 balanceAfter = maidCoin.balanceOf(address(this));
uint256 reward = balanceAfter - balanceBefore;
_claim(ids[i], reward);
theMaster.mint(msg.sender, nurseType.destroyReturn);
_burn(ids[i]);
delete nurses[ids[i]];
}
}
function claim(uint256[] calldata ids) public override {
for (uint256 i = 0; i < ids.length; i += 1) {
require(msg.sender == ownerOf(ids[i]), "CloneNurses: Forbidden");
uint256 balanceBefore = maidCoin.balanceOf(address(this));
theMaster.deposit(2, 0, ids[i]);
uint256 balanceAfter = maidCoin.balanceOf(address(this));
uint256 reward = balanceAfter - balanceBefore;
_claim(ids[i], reward);
}
}
function _claim(uint256 id, uint256 reward) internal {
if (reward == 0) return;
else {
Nurse storage nurse = nurses[id];
uint256 endBlock = nurse.endBlock;
uint256 lastClaimedBlock = nurse.lastClaimedBlock;
uint256 burningReward;
uint256 claimableReward;
if (endBlock <= lastClaimedBlock) burningReward = reward;
else if (endBlock < block.number) {
claimableReward = (reward * (endBlock - lastClaimedBlock)) / (block.number - lastClaimedBlock);
burningReward = reward - claimableReward;
} else claimableReward = reward;
if (burningReward > 0) maidCoin.burn(burningReward);
if (claimableReward > 0) maidCoin.transfer(msg.sender, claimableReward);
nurse.lastClaimedBlock = block.number;
emit Claim(id, msg.sender, claimableReward);
}
}
function pendingReward(uint256 id) external view override returns (uint256 claimableReward) {
require(_exists(id), "CloneNurses: Invalid id");
uint256 reward = theMaster.pendingReward(2, id);
if (reward == 0) return 0;
else {
Nurse storage nurse = nurses[id];
uint256 endBlock = nurse.endBlock;
uint256 lastClaimedBlock = nurse.lastClaimedBlock;
if (endBlock <= lastClaimedBlock) return 0;
else if (endBlock < block.number) {
claimableReward = (reward * (endBlock - lastClaimedBlock)) / (block.number - lastClaimedBlock);
} else claimableReward = reward;
}
}
function setSupportingTo(
address supporter,
uint256 to,
uint256 amounts
) public override {
require(msg.sender == address(theMaster), "CloneNurses: Forbidden");
require(_exists(to), "CloneNurses: Invalid target");
supportingTo[supporter] = to;
emit SupportTo(supporter, to);
if (amounts > 0) {
supportedPower[to] += amounts;
emit ChangeSupportedPower(to, int256(amounts));
}
}
function findSupportingTo(address supporter) external view override returns (address, uint256) {
uint256 _supportingTo = supportingTo[supporter];
uint256 _route = supportingRoute[_supportingTo];
if (_route == _supportingTo) return (ownerOf(_supportingTo), _supportingTo);
while (_route != _supportingTo) {
_supportingTo = _route;
_route = supportingRoute[_supportingTo];
}
return (ownerOf(_supportingTo), _supportingTo);
}
function checkSupportingRoute(address supporter) public override returns (address, uint256) {
uint256 _supportingTo = supportingTo[supporter];
uint256 _route = supportingRoute[_supportingTo];
if (_route == _supportingTo) return (ownerOf(_supportingTo), _supportingTo);
uint256 initialSupportTo = _supportingTo;
while (_route != _supportingTo) {
_supportingTo = _route;
_route = supportingRoute[_supportingTo];
}
supportingTo[supporter] = _supportingTo;
supportingRoute[initialSupportTo] = _supportingTo;
emit ChangeSupportingRoute(initialSupportTo, _supportingTo);
emit SupportTo(supporter, _supportingTo);
return (ownerOf(_supportingTo), _supportingTo);
}
function changeSupportedPower(address supporter, int256 power) public override {
require(msg.sender == address(theMaster), "CloneNurses: Forbidden");
(, uint256 id) = checkSupportingRoute(supporter);
int256 _supportedPower = int256(supportedPower[id]);
if (power < 0) require(_supportedPower >= (-power), "CloneNurses: Outranged power");
_supportedPower += power;
supportedPower[id] = uint256(_supportedPower);
emit ChangeSupportedPower(id, power);
}
function recordRewardsTransfer(
address supporter,
uint256 id,
uint256 amounts
) internal {
totalRewardsFromSupporters[id] += amounts;
emit TransferSupportingRewards(supporter, id, amounts);
}
function shareRewards(
uint256 pending,
address supporter,
uint8 supportingRatio
) public override returns (address nurseOwner, uint256 amountToNurseOwner) {
require(msg.sender == address(theMaster), "CloneNurses: Forbidden");
amountToNurseOwner = (pending * supportingRatio) / 100;
uint256 _supportTo;
if (amountToNurseOwner > 0) {
(nurseOwner, _supportTo) = checkSupportingRoute(supporter);
recordRewardsTransfer(supporter, _supportTo, amountToNurseOwner);
}
}
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal override(ERC721, CloneNurseEnumerable) {
super._beforeTokenTransfer(from, to, tokenId);
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC1155Receiver, IERC165)
returns (bool)
{
return interfaceId == 0x2a55205a || super.supportsInterface(interfaceId);
}
function royaltyInfo(uint256, uint256 _salePrice) external view override returns (address, uint256) {
return (royaltyReceiver, (_salePrice * royaltyFee) / 1000);
}
function setRoyaltyInfo(address _receiver, uint256 _royaltyFee) external onlyOwner {
royaltyReceiver = _receiver;
royaltyFee = _royaltyFee;
}
function exists(uint256 id) external view override returns (bool) {
return _exists(id);
}
}
文件 4 的 29:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this;
return msg.data;
}
}
文件 5 的 29:ERC1155Holder.sol
pragma solidity ^0.8.0;
import "./ERC1155Receiver.sol";
contract ERC1155Holder is ERC1155Receiver {
function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual override returns (bytes4) {
return this.onERC1155Received.selector;
}
function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual override returns (bytes4) {
return this.onERC1155BatchReceived.selector;
}
}
文件 6 的 29:ERC1155Receiver.sol
pragma solidity ^0.8.0;
import "../IERC1155Receiver.sol";
import "../../../utils/introspection/ERC165.sol";
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return interfaceId == type(IERC1155Receiver).interfaceId
|| super.supportsInterface(interfaceId);
}
}
文件 7 的 29:ERC165.sol
pragma solidity ^0.8.0;
import "./IERC165.sol";
abstract contract ERC165 is IERC165 {
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
文件 8 的 29:ERC721.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
using Address for address;
using Strings for uint256;
string private _name;
string private _symbol;
mapping(uint256 => address) private _owners;
mapping(address => uint256) private _balances;
mapping(uint256 => address) private _tokenApprovals;
mapping(address => mapping(address => bool)) private _operatorApprovals;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
return
interfaceId == type(IERC721).interfaceId ||
interfaceId == type(IERC721Metadata).interfaceId ||
super.supportsInterface(interfaceId);
}
function balanceOf(address owner) public view virtual override returns (uint256) {
require(owner != address(0), "ERC721: balance query for the zero address");
return _balances[owner];
}
function ownerOf(uint256 tokenId) public view virtual override returns (address) {
address owner = _owners[tokenId];
require(owner != address(0), "ERC721: owner query for nonexistent token");
return owner;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
string memory baseURI = _baseURI();
return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
}
function _baseURI() internal view virtual returns (string memory) {
return "";
}
function approve(address to, uint256 tokenId) public virtual override {
address owner = ERC721.ownerOf(tokenId);
require(to != owner, "ERC721: approval to current owner");
require(
_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
"ERC721: approve caller is not owner nor approved for all"
);
_approve(to, tokenId);
}
function getApproved(uint256 tokenId) public view virtual override returns (address) {
require(_exists(tokenId), "ERC721: approved query for nonexistent token");
return _tokenApprovals[tokenId];
}
function _setApprovalForAll(
address owner,
address operator,
bool approved
) internal {
require(owner != operator, "ERC721: approve to caller");
_operatorApprovals[owner][operator] = approved;
emit ApprovalForAll(owner, operator, approved);
}
function setApprovalForAll(address operator, bool approved) public virtual override {
_setApprovalForAll(_msgSender(), operator, approved);
}
function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
return _operatorApprovals[owner][operator];
}
function transferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_transfer(from, to, tokenId);
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) public virtual override {
safeTransferFrom(from, to, tokenId, "");
}
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) public virtual override {
require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
_safeTransfer(from, to, tokenId, _data);
}
function _safeTransfer(
address from,
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_transfer(from, to, tokenId);
require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
}
function _exists(uint256 tokenId) internal view virtual returns (bool) {
return _owners[tokenId] != address(0);
}
function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
require(_exists(tokenId), "ERC721: operator query for nonexistent token");
address owner = ERC721.ownerOf(tokenId);
return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
}
function _safeMint(address to, uint256 tokenId) internal virtual {
_safeMint(to, tokenId, "");
}
function _safeMint(
address to,
uint256 tokenId,
bytes memory _data
) internal virtual {
_mint(to, tokenId);
require(
_checkOnERC721Received(address(0), to, tokenId, _data),
"ERC721: transfer to non ERC721Receiver implementer"
);
}
function _mint(address to, uint256 tokenId) internal virtual {
require(to != address(0), "ERC721: mint to the zero address");
require(!_exists(tokenId), "ERC721: token already minted");
_beforeTokenTransfer(address(0), to, tokenId);
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(address(0), to, tokenId);
}
function _burn(uint256 tokenId) internal virtual {
address owner = ERC721.ownerOf(tokenId);
_beforeTokenTransfer(owner, address(0), tokenId);
_approve(address(0), tokenId);
_balances[owner] -= 1;
delete _owners[tokenId];
emit Transfer(owner, address(0), tokenId);
}
function _transfer(
address from,
address to,
uint256 tokenId
) internal virtual {
require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
require(to != address(0), "ERC721: transfer to the zero address");
_beforeTokenTransfer(from, to, tokenId);
_approve(address(0), tokenId);
_balances[from] -= 1;
_balances[to] += 1;
_owners[tokenId] = to;
emit Transfer(from, to, tokenId);
}
function _approve(address to, uint256 tokenId) internal virtual {
_tokenApprovals[tokenId] = to;
emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
}
function _checkOnERC721Received(
address from,
address to,
uint256 tokenId,
bytes memory _data
) private returns (bool) {
if (to.isContract()) {
try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
return retval == IERC721Receiver(to).onERC721Received.selector;
} catch (bytes memory reason) {
if (reason.length == 0) {
revert("ERC721: transfer to non ERC721Receiver implementer");
} else {
assembly {
revert(add(32, reason), mload(reason))
}
}
}
} else {
return true;
}
}
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId
) internal virtual {}
}
文件 9 的 29:ICloneNurseEnumerable.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
interface ICloneNurseEnumerable is IERC721 {
function totalSupply() external view returns (uint256);
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
}
文件 10 的 29:ICloneNurses.sol
pragma solidity >=0.5.0;
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "./ICloneNurseEnumerable.sol";
import "./ISupportable.sol";
import "./INursePart.sol";
import "./IMaidCoin.sol";
import "./ITheMaster.sol";
interface ICloneNurses is IERC721, IERC721Metadata, ICloneNurseEnumerable, ISupportable {
event Claim(uint256 indexed id, address indexed claimer, uint256 reward);
event ElongateLifetime(uint256 indexed id, uint256 rechargedLifetime, uint256 lastEndBlock, uint256 newEndBlock);
function nursePart() external view returns (INursePart);
function maidCoin() external view returns (IMaidCoin);
function theMaster() external view returns (ITheMaster);
function nurseTypes(uint256 typeId)
external
view
returns (
uint256 partCount,
uint256 destroyReturn,
uint256 power,
uint256 lifetime
);
function nurseTypeCount() external view returns (uint256);
function nurses(uint256 id)
external
view
returns (
uint256 nurseType,
uint256 endBlock,
uint256 lastClaimedBlock
);
function assemble(uint256 nurseType, uint256 parts) external;
function assembleWithPermit(
uint256 nurseType,
uint256 parts,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function elongateLifetime(uint256[] calldata ids, uint256[] calldata parts) external;
function destroy(uint256[] calldata ids, uint256[] calldata toIds) external;
function claim(uint256[] calldata ids) external;
function pendingReward(uint256 id) external view returns (uint256);
function findSupportingTo(address supporter) external view returns (address, uint256);
function exists(uint256 id) external view returns (bool);
}
文件 11 的 29:IERC1155.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC1155 is IERC165 {
event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);
event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values);
event ApprovalForAll(address indexed account, address indexed operator, bool approved);
event URI(string value, uint256 indexed id);
function balanceOf(address account, uint256 id) external view returns (uint256);
function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory);
function setApprovalForAll(address operator, bool approved) external;
function isApprovedForAll(address account, address operator) external view returns (bool);
function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external;
function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external;
}
文件 12 的 29:IERC1155Receiver.sol
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
interface IERC1155Receiver is IERC165 {
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
)
external
returns(bytes4);
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
)
external
returns(bytes4);
}
文件 13 的 29:IERC1271.sol
pragma solidity >=0.5.0;
interface IERC1271 {
function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);
}
文件 14 的 29:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 15 的 29:IERC20.sol
pragma solidity ^0.8.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);
}
文件 16 的 29:IERC2981.sol
pragma solidity ^0.8.5;
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
interface IERC2981 is IERC165 {
function royaltyInfo(uint256 _tokenId, uint256 _salePrice)
external
view
returns (address receiver, uint256 royaltyAmount);
}
文件 17 的 29:IERC721.sol
pragma solidity ^0.8.0;
import "../../utils/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;
}
文件 18 的 29:IERC721Metadata.sol
pragma solidity ^0.8.0;
import "../IERC721.sol";
interface IERC721Metadata is IERC721 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function tokenURI(uint256 tokenId) external view returns (string memory);
}
文件 19 的 29:IERC721Receiver.sol
pragma solidity ^0.8.0;
interface IERC721Receiver {
function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
文件 20 的 29:IMaidCoin.sol
pragma solidity >=0.5.0;
interface IMaidCoin {
event Approval(address indexed owner, address indexed spender, uint256 value);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint256);
function INITIAL_SUPPLY() external pure returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint256);
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function mint(address to, uint256 amount) external;
function burn(uint256 amount) external;
}
文件 21 的 29:IMasterChef.sol
pragma solidity >=0.6.12;
pragma experimental ABIEncoderV2;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IMasterChef {
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
}
struct PoolInfo {
IERC20 lpToken;
uint256 allocPoint;
uint256 lastRewardBlock;
uint256 accSushiPerShare;
}
function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory);
function userInfo(uint256 pid, address user) external view returns (IMasterChef.UserInfo memory);
function pendingSushi(uint256 _pid, address _user) external view returns (uint256);
function deposit(uint256 _pid, uint256 _amount) external;
function withdraw(uint256 _pid, uint256 _amount) external;
}
文件 22 的 29:IMasterChefModule.sol
pragma solidity >=0.5.0;
import "./IMasterChef.sol";
import "../uniswapv2/interfaces/IUniswapV2Pair.sol";
interface IMasterChefModule {
function lpToken() external view returns (IUniswapV2Pair);
function sushi() external view returns (IERC20);
function sushiMasterChef() external view returns (IMasterChef);
function masterChefPid() external view returns (uint256);
function sushiLastRewardBlock() external view returns (uint256);
function accSushiPerShare() external view returns (uint256);
}
文件 23 的 29:INursePart.sol
pragma solidity >=0.5.0;
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
interface INursePart is IERC1155 {
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external view returns (bytes32);
function nonces(address owner) external view returns (uint256);
function mint(
address to,
uint256 id,
uint256 amount
) external;
function burn(uint256 id, uint256 amount) external;
function permit(
address owner,
address spender,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
}
文件 24 的 29:IRewardCalculator.sol
pragma solidity >=0.5.0;
interface IRewardCalculator {
function rewardPerBlock() external view returns (uint256);
}
文件 25 的 29:ISupportable.sol
pragma solidity >=0.5.0;
interface ISupportable {
event SupportTo(address indexed supporter, uint256 indexed to);
event ChangeSupportingRoute(uint256 indexed from, uint256 indexed to);
event ChangeSupportedPower(uint256 indexed id, int256 power);
event TransferSupportingRewards(address indexed supporter, uint256 indexed id, uint256 amounts);
function supportingRoute(uint256 id) external view returns (uint256);
function supportingTo(address supporter) external view returns (uint256);
function supportedPower(uint256 id) external view returns (uint256);
function totalRewardsFromSupporters(uint256 id) external view returns (uint256);
function setSupportingTo(
address supporter,
uint256 to,
uint256 amounts
) external;
function checkSupportingRoute(address supporter) external returns (address, uint256);
function changeSupportedPower(address supporter, int256 power) external;
function shareRewards(
uint256 pending,
address supporter,
uint8 supportingRatio
) external returns (address nurseOwner, uint256 amountToNurseOwner);
}
文件 26 的 29:ITheMaster.sol
pragma solidity >=0.5.0;
import "./IMaidCoin.sol";
import "./IRewardCalculator.sol";
import "./ISupportable.sol";
import "./IMasterChefModule.sol";
interface ITheMaster is IMasterChefModule {
event ChangeRewardCalculator(address addr);
event Add(
uint256 indexed pid,
address addr,
bool indexed delegate,
bool indexed mintable,
address supportable,
uint8 supportingRatio,
uint256 allocPoint
);
event Set(uint256 indexed pid, uint256 allocPoint);
event Deposit(uint256 indexed userId, uint256 indexed pid, uint256 amount);
event Withdraw(uint256 indexed userId, uint256 indexed pid, uint256 amount);
event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
event Support(address indexed supporter, uint256 indexed pid, uint256 amount);
event Desupport(address indexed supporter, uint256 indexed pid, uint256 amount);
event EmergencyDesupport(address indexed user, uint256 indexed pid, uint256 amount);
event SetIsSupporterPool(uint256 indexed pid, bool indexed status);
function initialRewardPerBlock() external view returns (uint256);
function decreasingInterval() external view returns (uint256);
function startBlock() external view returns (uint256);
function maidCoin() external view returns (IMaidCoin);
function rewardCalculator() external view returns (IRewardCalculator);
function poolInfo(uint256 pid)
external
view
returns (
address addr,
bool delegate,
ISupportable supportable,
uint8 supportingRatio,
uint256 allocPoint,
uint256 lastRewardBlock,
uint256 accRewardPerShare,
uint256 supply
);
function poolCount() external view returns (uint256);
function userInfo(uint256 pid, uint256 user) external view returns (uint256 amount, uint256 rewardDebt);
function mintableByAddr(address addr) external view returns (bool);
function totalAllocPoint() external view returns (uint256);
function pendingReward(uint256 pid, uint256 userId) external view returns (uint256);
function rewardPerBlock() external view returns (uint256);
function changeRewardCalculator(address addr) external;
function add(
address addr,
bool delegate,
bool mintable,
address supportable,
uint8 supportingRatio,
uint256 allocPoint
) external;
function set(uint256[] calldata pid, uint256[] calldata allocPoint) external;
function deposit(
uint256 pid,
uint256 amount,
uint256 userId
) external;
function depositWithPermit(
uint256 pid,
uint256 amount,
uint256 userId,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function depositWithPermitMax(
uint256 pid,
uint256 amount,
uint256 userId,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function withdraw(
uint256 pid,
uint256 amount,
uint256 userId
) external;
function emergencyWithdraw(uint256 pid) external;
function support(
uint256 pid,
uint256 amount,
uint256 supportTo
) external;
function supportWithPermit(
uint256 pid,
uint256 amount,
uint256 supportTo,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function supportWithPermitMax(
uint256 pid,
uint256 amount,
uint256 supportTo,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function desupport(uint256 pid, uint256 amount) external;
function emergencyDesupport(uint256 pid) external;
function mint(address to, uint256 amount) external;
function claimSushiReward(uint256 id) external;
function pendingSushiReward(uint256 id) external view returns (uint256);
}
文件 27 的 29:IUniswapV2Pair.sol
pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint256 value);
event Transfer(address indexed from, address indexed to, uint256 value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint256);
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
event Mint(address indexed sender, uint256 amount0, uint256 amount1);
event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);
event Swap(
address indexed sender,
uint256 amount0In,
uint256 amount1In,
uint256 amount0Out,
uint256 amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint256);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves()
external
view
returns (
uint112 reserve0,
uint112 reserve1,
uint32 blockTimestampLast
);
function price0CumulativeLast() external view returns (uint256);
function price1CumulativeLast() external view returns (uint256);
function kLast() external view returns (uint256);
function mint(address to) external returns (uint256 liquidity);
function burn(address to) external returns (uint256 amount0, uint256 amount1);
function swap(
uint256 amount0Out,
uint256 amount1Out,
address to,
bytes calldata data
) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}
文件 28 的 29:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view virtual 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;
}
}
文件 29 的 29:Strings.sol
pragma solidity ^0.8.0;
library Strings {
bytes16 private constant alphabet = "0123456789abcdef";
function toString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = alphabet[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
{
"compilationTarget": {
"contracts/CloneNurses.sol": "CloneNurses"
},
"evmVersion": "berlin",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"contract INursePart","name":"_nursePart","type":"address"},{"internalType":"contract IMaidCoin","name":"_maidCoin","type":"address"},{"internalType":"contract ITheMaster","name":"_theMaster","type":"address"},{"internalType":"address","name":"_royaltyReceiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"int256","name":"power","type":"int256"}],"name":"ChangeSupportedPower","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"from","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"to","type":"uint256"}],"name":"ChangeSupportingRoute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rechargedLifetime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastEndBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newEndBlock","type":"uint256"}],"name":"ElongateLifetime","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":"supporter","type":"address"},{"indexed":true,"internalType":"uint256","name":"to","type":"uint256"}],"name":"SupportTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"supporter","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amounts","type":"uint256"}],"name":"TransferSupportingRewards","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"partCounts","type":"uint256[]"},{"internalType":"uint256[]","name":"destroyReturns","type":"uint256[]"},{"internalType":"uint256[]","name":"powers","type":"uint256[]"},{"internalType":"uint256[]","name":"lifetimes","type":"uint256[]"}],"name":"addNurseType","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nurseType","type":"uint256"},{"internalType":"uint256","name":"_parts","type":"uint256"}],"name":"assemble","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nurseType","type":"uint256"},{"internalType":"uint256","name":"_parts","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"assembleWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"supporter","type":"address"},{"internalType":"int256","name":"power","type":"int256"}],"name":"changeSupportedPower","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"supporter","type":"address"}],"name":"checkSupportingRoute","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"toIds","type":"uint256[]"}],"name":"destroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"parts","type":"uint256[]"}],"name":"elongateLifetime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"supporter","type":"address"}],"name":"findSupportingTo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maidCoin","outputs":[{"internalType":"contract IMaidCoin","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nursePart","outputs":[{"internalType":"contract INursePart","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nurseTypeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nurseTypes","outputs":[{"internalType":"uint256","name":"partCount","type":"uint256"},{"internalType":"uint256","name":"destroyReturn","type":"uint256"},{"internalType":"uint256","name":"power","type":"uint256"},{"internalType":"uint256","name":"lifetime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nurses","outputs":[{"internalType":"uint256","name":"nurseType","type":"uint256"},{"internalType":"uint256","name":"endBlock","type":"uint256"},{"internalType":"uint256","name":"lastClaimedBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"claimableReward","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_royaltyFee","type":"uint256"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"supporter","type":"address"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"uint256","name":"amounts","type":"uint256"}],"name":"setSupportingTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pending","type":"uint256"},{"internalType":"address","name":"supporter","type":"address"},{"internalType":"uint8","name":"supportingRatio","type":"uint8"}],"name":"shareRewards","outputs":[{"internalType":"address","name":"nurseOwner","type":"address"},{"internalType":"uint256","name":"amountToNurseOwner","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedPower","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportingRoute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supportingTo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"theMaster","outputs":[{"internalType":"contract ITheMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalRewardsFromSupporters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]