编译器
0.8.19+commit.7dd6d404
文件 1 的 17: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;
}
}
文件 2 的 17: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);
}
}
文件 3 的 17: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 的 17: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;
}
文件 5 的 17: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);
}
文件 6 的 17:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 7 的 17:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, 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 from, address to, uint256 amount) external returns (bool);
}
文件 8 的 17:IERC721.sol
pragma solidity ^0.8.0;
import "../token/ERC721/IERC721.sol";
文件 9 的 17:IERC721Receiver.sol
pragma solidity ^0.8.0;
interface IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
文件 10 的 17:IHYPC.sol
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IHYPC is IERC20 {
function burn(uint256 amount) external;
}
文件 11 的 17:IHYPCSwapV2.sol
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/interfaces/IERC721.sol";
interface IHYPCSwapV2 is IERC721 {
function addRootTokens(uint256 tokens) external;
function splitHeldToken(uint256 level, uint256 skipLevels) external;
function swapV2(uint256 level) external;
function redeem(uint256 tokenNumber) external;
function assignNumber(uint256 tokenNumber, uint256 targetNumber) external;
function assignString(uint256 tokenNumber, string memory data) external;
function burn(uint256 tokenNumber, string memory data) external;
function assign(uint256 tokenNumber, string memory data) external;
function swap() external;
function getAssignment(uint256 tokenNumber) external view returns (string memory);
function getAssignmentNumber(uint256 tokenNumber) external view returns (uint256);
function getAssignmentString(uint256 tokenNumber) external view returns (string memory);
function getBurnData(uint256 tokenNumber) external view returns (string memory);
function getAvailableToken(uint256 level, uint256 index) external view returns (uint256);
function getTokenLevel(uint256 tokenNumber) external view returns (uint256);
function getAssignmentTargetNumber(uint256 targetNumber) external view returns (uint256);
}
文件 12 的 17:IHyperCycleLicense.sol
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
interface IHyperCycleLicense is IERC721 {
function mint(
uint256 numTokens
) external;
function split(
uint256 tokenId
) external;
function burn(
uint256 tokenId,
string memory burnString
) external;
function merge(
uint256 tokenId
) external;
function getBurnData(
uint256 tokenId
) external view returns (string memory);
function getLicenseHeight(
uint256 licenseId
) external view returns (uint8);
function getLicenseStatus(
uint256 licenseId
) external view returns (uint256);
}
文件 13 的 17:IHyperCycleShareManager.sol
pragma solidity 0.8.19;
import {ShareManagerTypes as Types} from '../libs/ShareManagerTypes.sol';
interface IHyperCycleShareManager {
function sharesProposalsAmount() external returns (uint256);
function sharesProposalsCounter() external returns (uint256);
function startShareProposalMigration(
uint256 shareTokenNumber,
address hardwareOperator,
string memory operatorAssignedString
) external;
function finishShareTokenMigration(uint256 shareProposalId) external;
function getShareProposalHardwareOperator(uint256 shareProposalId) external view returns (address);
function getShareProposalData(uint256 shareProposalId) external view returns (Types.ShareProposalData memory);
}
文件 14 的 17:IHyperCycleShareTokens.sol
pragma solidity 0.8.19;
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
interface IHyperCycleShareTokens is IERC1155 {
struct PendingDeposit {
uint256 availableAtTimestamp;
uint256 amount;
}
function currentShareNumber() external returns (uint256);
function increaseShareLimit(uint256 number) external;
function createShareTokens(uint256 licenseNumber, uint256 chypcNumber, bool chypcTokenHeld, string memory startingMessage, uint256 maxRevenueDeposit) external;
function transferShareOwnership(uint256 shareNumber, address to) external;
function cancelShareTokens(uint256 shareNumber) external;
function depositRevenue(uint256 shareNumber, uint256 amt) external;
function claimRevenue(uint256 shareNumber) external;
function withdrawEarnings(uint256 shareNumber) external;
function claimAndWithdraw(uint256 shareNumber) external;
function setShareMessage(uint256 shareNumber, string memory message) external;
function burnRevenueTokens(uint256 shareNumber, uint256 amount) external;
function burnWealthTokens(uint256 shareNumber, uint256 amount) external;
function getShareLicenseId(uint256 shareNumber) external view returns (uint256);
function getShareCHyPCId(uint256 shareNumber) external view returns (uint256);
function getShareOwner(uint256 shareNumber) external view returns (address);
function getShareRevenueTokenId(uint256 shareNumber) external view returns (uint256);
function getShareWealthTokenId(uint256 shareNumber) external view returns (uint256);
function getShareTotalRevenue(uint256 shareNumber) external view returns (uint256);
function getShareStartTime(uint256 shareNumber) external view returns (uint256);
function getShareMessage(uint256 shareNumber) external view returns (string memory);
function isShareActive(uint256 shareNumber) external view returns (bool);
function shareCreated(uint256 shareNumber) external view returns (bool);
function getRevenueTokenTotalSupply(uint256 shareNumber) external view returns (uint256);
function getWealthTokenTotalSupply(uint256 shareNumber) external view returns (uint256);
function getPendingDeposit(uint256 shareNumber, uint256 index) external view returns (PendingDeposit memory);
function getPendingDepositsLength(uint256 shareNumber) external view returns (uint256);
}
文件 15 的 17:IHyperCycleShareTokensV2.sol
pragma solidity ^0.8.19;
import '@openzeppelin/contracts/token/ERC1155/IERC1155.sol';
interface IHyperCycleShareTokensV2 is IERC1155 {
struct PendingDeposit {
uint256 availableAtTimestamp;
uint256 amount;
}
function shareData(
uint256 shareNumber
)
external
pure
returns (
uint256 licenseId,
uint256 chypcId,
uint256 status,
address owner,
uint256 rTokenNumber,
uint256 wTokenNumber,
uint256 rTokenSupply,
uint256 wTokenSupply,
uint256 startTimestamp,
uint256 revenueDeposited,
uint256 revenueDepositDelay,
string memory message,
bool chypcTokenHeld
);
function currentShareNumber() external returns (uint256);
function increaseShareLimit(uint256 number) external;
function createShareTokens(
uint256 licenseNumber,
uint256 chypcNumber,
bool chypcTokenHeld,
string memory startingMessage,
uint256 maxRevenueDeposit
) external;
function changePendingRevenueDelay(uint256 shareNumber, uint256 newDelay) external;
function transferShareOwnership(uint256 shareNumber, address to) external;
function cancelShareTokens(uint256 shareNumber) external;
function depositRevenue(uint256 shareNumber, uint256 amt) external;
function claimRevenue(uint256 shareNumber) external;
function withdrawEarnings(uint256 shareNumber) external;
function claimAndWithdraw(uint256 shareNumber) external;
function setShareMessage(uint256 shareNumber, string memory message) external;
function burnRevenueTokens(uint256 shareNumber, uint256 amount) external;
function burnWealthTokens(uint256 shareNumber, uint256 amount) external;
function getShareLicenseId(uint256 shareNumber) external view returns (uint256);
function getShareCHyPCId(uint256 shareNumber) external view returns (uint256);
function getShareOwner(uint256 shareNumber) external view returns (address);
function getShareRevenueTokenId(uint256 shareNumber) external view returns (uint256);
function getShareWealthTokenId(uint256 shareNumber) external view returns (uint256);
function getShareTotalRevenue(uint256 shareNumber) external view returns (uint256);
function getShareStartTime(uint256 shareNumber) external view returns (uint256);
function getShareMessage(uint256 shareNumber) external view returns (string memory);
function isShareActive(uint256 shareNumber) external view returns (bool);
function shareCreated(uint256 shareNumber) external view returns (bool);
function getRevenueTokenTotalSupply(uint256 shareNumber) external view returns (uint256);
function getWealthTokenTotalSupply(uint256 shareNumber) external view returns (uint256);
function getPendingDeposit(uint256 shareNumber, uint256 index) external view returns (PendingDeposit memory);
function getPendingDepositsLength(uint256 shareNumber) external view returns (uint256);
function lastShareClaimRevenue(uint256 shareTokenNumber, address user) external view returns (uint256);
function withdrawableAmounts(uint256 shareTokenNUmber, address user) external view returns (uint256);
}
文件 16 的 17:MigrationHelper.sol
pragma solidity 0.8.19;
import '@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '../interfaces/IHyperCycleShareManager.sol';
import '../interfaces/IHyperCycleShareTokens.sol';
error ZeroAddressInConstructor();
error WrongHypershareId();
error InsufficientBalance(uint256 requiredBalance, uint256 currentBalance);
error NoOwnerRegistered();
error NoContractAllowed();
contract MigrationHelper is ERC1155Holder, IERC721Receiver {
IHyperCycleShareManager immutable hyperCycleShareManager;
IHyperCycleShareManager immutable oldHyperCycleShareManager;
IHyperCycleShareTokens immutable hyperShareTokens;
address immutable licenseContract;
mapping(uint256 => address) private licenseOwner;
event Migration(uint256 oldShareId, uint256 newShareId, uint256 shareNumber);
constructor(
address _hyperCycleShareManager,
address _oldHyperCycleShareManager,
address _hyperShareTokens,
address _licenseContract
) {
if (
_hyperCycleShareManager == address(0x0) ||
_oldHyperCycleShareManager == address(0x0) ||
_hyperShareTokens == address(0x0) ||
_licenseContract == address(0x0)
) {
revert ZeroAddressInConstructor();
}
hyperCycleShareManager = IHyperCycleShareManager(_hyperCycleShareManager);
oldHyperCycleShareManager = IHyperCycleShareManager(_oldHyperCycleShareManager);
hyperShareTokens = IHyperCycleShareTokens(_hyperShareTokens);
licenseContract = _licenseContract;
}
function migrate(uint256 shareId, uint256 oldHyperShareId) external {
Types.ShareProposalData memory oldProposalData = oldHyperCycleShareManager.getShareProposalData(
oldHyperShareId
);
uint256 shareIdInContract = oldProposalData.shareTokenData.shareTokenNumber;
if (shareIdInContract != shareId) {
revert WrongHypershareId();
}
licenseOwner[oldProposalData.licenseData.tokenNumber] = oldProposalData.licenseData.tokenOwner;
IHyperCycleShareManager manager = hyperCycleShareManager;
IHyperCycleShareTokens tokens = hyperShareTokens;
uint256 hypershareId = manager.sharesProposalsCounter();
string memory operatorString = tokens.getShareMessage(shareId);
address operatorAddress = oldHyperCycleShareManager.getShareProposalHardwareOperator(oldHyperShareId);
uint256 rTokensId = shareId * 2;
uint256 wTokensId = shareId * 2 + 1;
uint256 totalsupply = tokens.getRevenueTokenTotalSupply(shareId);
uint256 userBalance = tokens.balanceOf(msg.sender, rTokensId);
if (userBalance < (totalsupply * 69) / 100) {
revert InsufficientBalance((totalsupply * 69) / 100, userBalance);
}
uint256 contractBalance = tokens.balanceOf(address(this), wTokensId);
tokens.safeTransferFrom(address(this), msg.sender, wTokensId, contractBalance, '');
tokens.setApprovalForAll(address(manager), true);
manager.startShareProposalMigration(shareId, operatorAddress, operatorString);
tokens.transferShareOwnership(shareId, address(manager));
manager.finishShareTokenMigration(hypershareId);
emit Migration(oldHyperShareId, hypershareId, shareIdInContract);
}
function onERC721Received(address, address, uint256 tokenId, bytes calldata) external override returns (bytes4) {
if (msg.sender == licenseContract) {
IERC721(msg.sender).safeTransferFrom(address(this), licenseOwner[tokenId], tokenId);
} else {
revert NoContractAllowed();
}
return this.onERC721Received.selector;
}
}
文件 17 的 17:ShareManagerTypes.sol
pragma solidity ^0.8.19;
import {IHYPCSwapV2} from '../interfaces/IHYPCSwapV2.sol';
import {IHyperCycleLicense} from '../interfaces/IHyperCycleLicense.sol';
import {IHyperCycleShareTokensV2} from '../interfaces/IHyperCycleShareTokensV2.sol';
import {IHYPC} from '../interfaces/IHYPC.sol';
library ShareManagerTypes {
enum ShareProposalStatus {
NOT_CREATED,
PENDING,
STARTED,
ENDED
}
enum VotationOptions {
NULL_OPTION,
CANCEL_SHARE,
CHANGE_HARDWARE_OPERATOR_ADDRESS,
CHANGE_HARDWARE_OPERATOR_REVENUE,
CHANGE_MANAGER_CONTRACT,
CHANGE_DEPOSIT_REVENUE_DELAY
}
enum ConsensusOptions {
ONE_HUNDRED_PERCENT,
NINETY_PERCENT
}
struct ManagerData {
IHYPC hypcToken;
IHYPCSwapV2 chypcV2;
IHyperCycleLicense licenseContract;
IHyperCycleShareTokensV2 hypcShareTokens;
}
struct ShareProposalData {
ShareTokenData shareTokenData;
TokenHolderData licenseData;
TokenHolderData chypcData;
HardwareOperatorData operatorData;
ShareProposalStatus status;
uint256 hypcSurplus;
}
struct ShareTokenData {
uint256 validEndTimestamp;
uint256 shareTokenNumber;
uint256 rTokenId;
uint256 wTokenId;
uint256 revenueDepositDelay;
}
struct TokenHolderData {
uint256 tokenNumber;
uint256 tokenLevel;
uint256 initialRevenueTokens;
uint256 initialWealthTokens;
address tokenOwner;
}
struct HardwareOperatorData {
uint256 operatorRevenue;
string operatorAssignedString;
address operatorAddress;
}
struct Votation {
uint256 votationId;
uint256 votesFor;
uint256 votesAgainst;
uint256 deadline;
bytes proposedData;
VotationOptions option;
bool amountReached;
}
struct ShareData {
uint256 licenseId;
uint256 chypcId;
uint256 status;
address owner;
uint256 rTokenNumber;
uint256 wTokenNumber;
uint256 rTokenSupply;
uint256 wTokenSupply;
uint256 startTimestamp;
uint256 revenueDeposited;
uint256 revenueDepositDelay;
string message;
bool chypcTokenHeld;
}
}
{
"compilationTarget": {
"contracts/ethereum/core/MigrationHelper.sol": "MigrationHelper"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_hyperCycleShareManager","type":"address"},{"internalType":"address","name":"_oldHyperCycleShareManager","type":"address"},{"internalType":"address","name":"_hyperShareTokens","type":"address"},{"internalType":"address","name":"_licenseContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"requiredBalance","type":"uint256"},{"internalType":"uint256","name":"currentBalance","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"NoContractAllowed","type":"error"},{"inputs":[],"name":"WrongHypershareId","type":"error"},{"inputs":[],"name":"ZeroAddressInConstructor","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldShareId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newShareId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareNumber","type":"uint256"}],"name":"Migration","type":"event"},{"inputs":[{"internalType":"uint256","name":"shareId","type":"uint256"},{"internalType":"uint256","name":"oldHyperShareId","type":"uint256"}],"name":"migrate","outputs":[],"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":"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":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]