编译器
0.8.10+commit.fc410830
文件 1 的 14: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) {
return msg.data;
}
}
文件 2 的 14:ERC1155Receiver.sol
pragma solidity ^0.8.0;
import "IERC1155Receiver.sol";
import "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);
}
}
文件 3 的 14: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;
}
}
文件 4 的 14:HeroesUpgraderV2.sol
pragma solidity ^0.8.6;
import "Ownable.sol";
import "Strings.sol";
import "ERC1155Receiver.sol";
import "IERC1155.sol";
import "IHero.sol";
import "IRandom.sol";
import "IRarity.sol";
contract HeroesUpgraderV2 is ERC1155Receiver, Ownable {
enum Rarity {Simple, SimpleUpgraded, Rare, Legendary, F1, F2, F3}
struct Modification {
address sourceContract;
Rarity sourceRarity;
address destinitionContract;
Rarity destinitionRarity;
uint256 balanceForUpgrade;
bool enabled;
}
bool internal chainLink;
address public chainLinkAdapter;
address internal whiteListBalancer = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;
address public externalStorage;
mapping(address => mapping(uint256 => Modification)) public enabledModifications;
mapping(address => bool) public sourceContracts;
mapping(address => mapping(uint256 => Rarity)) public rarity;
event Upgraded(address destinitionContract, uint256 oldHero, uint256 newHero, Rarity newRarity);
event ModificationChange(address modifierContract, uint256 modifierId);
function upgrade(uint256 oldHero, address modifierContract, uint256 modifierId) public virtual{
require(
enabledModifications[modifierContract][modifierId].enabled
, "Unknown modificator"
);
require(
rarity[
enabledModifications[modifierContract][modifierId].sourceContract
][oldHero] == enabledModifications[modifierContract][modifierId].sourceRarity,
"Cant modify twice or from your rarity"
);
require(
IHero(
enabledModifications[modifierContract][modifierId].sourceContract
).ownerOf(oldHero) == msg.sender,
"You need own hero for upgrade"
);
IERC1155(modifierContract).safeTransferFrom(
msg.sender,
address(this),
modifierId,
enabledModifications[modifierContract][modifierId].balanceForUpgrade,
'0'
);
(uint256 limit, uint256 minted) =
IHero(
enabledModifications[modifierContract][modifierId].destinitionContract
).partnersLimit(address(this));
IHero(
enabledModifications[modifierContract][modifierId].destinitionContract
).setPartner(address(this), limit + 1);
uint256 newToken = IHero(
enabledModifications[modifierContract][modifierId].destinitionContract
).totalSupply();
IHero(
enabledModifications[modifierContract][modifierId].destinitionContract
).multiMint();
IHero(
enabledModifications[modifierContract][modifierId].destinitionContract
).transferFrom(address(this), msg.sender, newToken);
IHero(
enabledModifications[modifierContract][modifierId].destinitionContract
).setPartner(whiteListBalancer, limit);
IHero(
enabledModifications[modifierContract][modifierId].destinitionContract
).setPartner(whiteListBalancer, limit);
IHero(
enabledModifications[modifierContract][modifierId].destinitionContract
).setPartner(whiteListBalancer, limit);
IHero(
enabledModifications[modifierContract][modifierId].destinitionContract
).setPartner(whiteListBalancer, 0);
rarity[
enabledModifications[modifierContract][modifierId].sourceContract
][oldHero] = Rarity.SimpleUpgraded;
rarity[
enabledModifications[modifierContract][modifierId].sourceContract
][newToken] = enabledModifications[modifierContract][modifierId].destinitionRarity;
emit Upgraded(
enabledModifications[modifierContract][modifierId].destinitionContract,
oldHero,
newToken,
enabledModifications[modifierContract][modifierId].destinitionRarity
);
if (chainLink) {
IRandom(chainLinkAdapter).requestChainLinkEntropy();
}
}
function upgradeBatch(uint256[] memory oldHeroes, address modifierContract, uint256 modifierId) public virtual {
require(oldHeroes.length <= 10, "Not more then 10");
for (uint256 i; i < oldHeroes.length; i ++) {
upgrade(oldHeroes[i], modifierContract, modifierId);
}
}
function getRarity(address _contract, uint256 _tokenId) public view returns(Rarity r) {
r = rarity[_contract][_tokenId];
if (externalStorage != address(0)) {
uint8 extRar = IRarity(externalStorage).getRarity(_contract, _tokenId);
if (Rarity(extRar) > r) {
r = Rarity(extRar);
}
}
return r;
}
function getRarity2(address _contract, uint256 _tokenId) public view returns(Rarity r) {
require(sourceContracts[_contract], "Unknown source contract");
require(
IHero(_contract).ownerOf(_tokenId) != address(0),
"Seems like token not exist"
);
return getRarity(_contract, _tokenId);
}
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 value,
bytes calldata data
)
external
override
returns(bytes4)
{
return bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"));
}
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata values,
bytes calldata data
)
external
override
returns(bytes4)
{
return bytes4(keccak256("onERC1155BatchReceived(address,address,uint256,uint256,bytes)"));
}
function setModification(
address _modifierContract,
uint256 _modifierId,
address _sourceContract,
Rarity _sourceRarity,
address _destinitionContract,
Rarity _destinitionRarity,
uint256 _balanceForUpgrade,
bool _isEnabled
) external onlyOwner {
require(_modifierContract != address(0), "No zero");
enabledModifications[_modifierContract][_modifierId].sourceContract = _sourceContract;
enabledModifications[_modifierContract][_modifierId].sourceRarity = _sourceRarity;
enabledModifications[_modifierContract][_modifierId].destinitionContract = _destinitionContract;
enabledModifications[_modifierContract][_modifierId].destinitionRarity = _destinitionRarity;
enabledModifications[_modifierContract][_modifierId].balanceForUpgrade = _balanceForUpgrade;
enabledModifications[_modifierContract][_modifierId].enabled = _isEnabled;
sourceContracts[_sourceContract] = _isEnabled;
emit ModificationChange(_modifierContract, _modifierId);
}
function setModificationState(
address _modifierContract,
uint256 _modifierId,
bool _isEnabled
) external onlyOwner {
require(_modifierContract != address(0), "No zero");
enabledModifications[_modifierContract][_modifierId].enabled = _isEnabled;
sourceContracts[
enabledModifications[_modifierContract][_modifierId].sourceContract
] = _isEnabled;
emit ModificationChange(_modifierContract, _modifierId);
}
function revokeOwnership(address _contract) external onlyOwner {
IHero(_contract).transferOwnership(owner());
}
function setChainLink(bool _isOn) external onlyOwner {
require(chainLinkAdapter != address(0), "Set adapter address first");
chainLink = _isOn;
}
function setChainLinkAdapter(address _adapter) external onlyOwner {
chainLinkAdapter = _adapter;
}
function setPartnerProxy(
address _contract,
address _partner,
uint256 _newLimit
)
external
onlyOwner
{
IHero(_contract).setPartner(_partner, _newLimit);
}
function setWLBalancer(address _balancer) external onlyOwner {
require(_balancer != address(0));
whiteListBalancer = _balancer;
}
function loadRaritiesBatch(address _contract, uint256[] memory _tokens, Rarity[] memory _rarities) external onlyOwner {
require(_contract != address(0), "No Zero Address");
require(_tokens.length == _rarities.length);
for (uint256 i; i < _tokens.length; i ++) {
rarity[_contract][_tokens[i]] = _rarities[i];
}
}
function setExternalStorage(address _storage) external onlyOwner {
externalStorage = _storage;
}
}
文件 5 的 14:HeroesUpgraderV3.sol
pragma solidity ^0.8.6;
import "HeroesUpgraderV2.sol";
contract HeroesUpgraderV3 is HeroesUpgraderV2 {
bool public writeToExternal;
function upgrade(uint256 oldHero, address modifierContract, uint256 modifierId) public override{
super.upgrade(oldHero, modifierContract, modifierId);
if (writeToExternal) {
uint256 justMintedToken = IHero(
enabledModifications[modifierContract][modifierId].destinitionContract
).totalSupply() - 1;
uint256[] memory tokens = new uint256[](2);
uint8[] memory rarities = new uint8[](2);
tokens[0] = oldHero;
tokens[1] = justMintedToken;
rarities[0] = uint8(Rarity.SimpleUpgraded);
rarities[1] = uint8(enabledModifications[modifierContract][modifierId].destinitionRarity);
IRarity(externalStorage).loadRaritiesBatch(
enabledModifications[modifierContract][modifierId].sourceContract,
tokens,
rarities
);
}
}
function upgradeBatch(uint256[] memory oldHeroes, address modifierContract, uint256 modifierId) public override {
require(oldHeroes.length <= 10, "Not more then 10");
for (uint256 i; i < oldHeroes.length; i ++) {
upgrade(oldHeroes[i], modifierContract, modifierId);
}
}
function setWriteToExternal(bool _write) external onlyOwner {
writeToExternal = _write;
}
}
文件 6 的 14:IERC1155.sol
pragma solidity ^0.8.0;
import "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;
}
文件 7 的 14:IERC1155Receiver.sol
pragma solidity ^0.8.0;
import "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);
}
文件 8 的 14:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 9 的 14:IERC721.sol
pragma solidity ^0.8.0;
import "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;
}
文件 10 的 14:IHero.sol
pragma solidity ^0.8.6;
import "IERC721.sol";
interface IHero is IERC721 {
function multiMint() external;
function setPartner(address _partner, uint256 _limit) external;
function transferOwnership(address newOwner) external;
function partnersLimit(address _partner) external view returns(uint256, uint256);
function totalSupply() external view returns(uint256);
function reservedForPartners() external view returns(uint256);
}
文件 11 的 14:IRandom.sol
pragma solidity ^0.8.6;
interface IRandom {
function requestChainLinkEntropy() external returns (bytes32 requestId);
}
文件 12 的 14:IRarity.sol
pragma solidity ^0.8.6;
interface IRarity {
function loadRaritiesBatch(address _contract, uint256[] memory _tokens, uint8[] memory _rarities) external;
function getRarity(address _contract, uint256 _tokenId) external view returns(uint8 r);
function getRarity2(address _contract, uint256 _tokenId) external view returns(uint8 r);
}
文件 13 的 14:Ownable.sol
pragma solidity ^0.8.0;
import "Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_setOwner(_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 {
_setOwner(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 14 的 14:Strings.sol
pragma solidity ^0.8.0;
library Strings {
bytes16 private constant _HEX_SYMBOLS = "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] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
{
"compilationTarget": {
"HeroesUpgraderV3.sol": "HeroesUpgraderV3"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"modifierContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"modifierId","type":"uint256"}],"name":"ModificationChange","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":false,"internalType":"address","name":"destinitionContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldHero","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newHero","type":"uint256"},{"indexed":false,"internalType":"enum HeroesUpgraderV2.Rarity","name":"newRarity","type":"uint8"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"chainLinkAdapter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"enabledModifications","outputs":[{"internalType":"address","name":"sourceContract","type":"address"},{"internalType":"enum HeroesUpgraderV2.Rarity","name":"sourceRarity","type":"uint8"},{"internalType":"address","name":"destinitionContract","type":"address"},{"internalType":"enum HeroesUpgraderV2.Rarity","name":"destinitionRarity","type":"uint8"},{"internalType":"uint256","name":"balanceForUpgrade","type":"uint256"},{"internalType":"bool","name":"enabled","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"externalStorage","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getRarity","outputs":[{"internalType":"enum HeroesUpgraderV2.Rarity","name":"r","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getRarity2","outputs":[{"internalType":"enum HeroesUpgraderV2.Rarity","name":"r","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"uint256[]","name":"_tokens","type":"uint256[]"},{"internalType":"enum HeroesUpgraderV2.Rarity[]","name":"_rarities","type":"uint8[]"}],"name":"loadRaritiesBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","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":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarity","outputs":[{"internalType":"enum HeroesUpgraderV2.Rarity","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isOn","type":"bool"}],"name":"setChainLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_adapter","type":"address"}],"name":"setChainLinkAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_storage","type":"address"}],"name":"setExternalStorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_modifierContract","type":"address"},{"internalType":"uint256","name":"_modifierId","type":"uint256"},{"internalType":"address","name":"_sourceContract","type":"address"},{"internalType":"enum HeroesUpgraderV2.Rarity","name":"_sourceRarity","type":"uint8"},{"internalType":"address","name":"_destinitionContract","type":"address"},{"internalType":"enum HeroesUpgraderV2.Rarity","name":"_destinitionRarity","type":"uint8"},{"internalType":"uint256","name":"_balanceForUpgrade","type":"uint256"},{"internalType":"bool","name":"_isEnabled","type":"bool"}],"name":"setModification","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_modifierContract","type":"address"},{"internalType":"uint256","name":"_modifierId","type":"uint256"},{"internalType":"bool","name":"_isEnabled","type":"bool"}],"name":"setModificationState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"address","name":"_partner","type":"address"},{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setPartnerProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_balancer","type":"address"}],"name":"setWLBalancer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_write","type":"bool"}],"name":"setWriteToExternal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sourceContracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"oldHero","type":"uint256"},{"internalType":"address","name":"modifierContract","type":"address"},{"internalType":"uint256","name":"modifierId","type":"uint256"}],"name":"upgrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"oldHeroes","type":"uint256[]"},{"internalType":"address","name":"modifierContract","type":"address"},{"internalType":"uint256","name":"modifierId","type":"uint256"}],"name":"upgradeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"writeToExternal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]