编译器
0.6.12+commit.27d51765
文件 1 的 7:Auction.sol
pragma solidity ^0.6.12;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "./interfaces/IMillionPieces.sol";
import "./interfaces/IAuction.sol";
import "./helpers/ProxyRegistry.sol";
contract Auction is IAuction, Ownable {
using SafeMath for uint256;
uint256 public constant BATCH_PURCHASE_LIMIT = 25;
uint256 public constant PRICE_FOR_SEGMENT = 0.1 ether;
address payable public fund;
address public immutable proxyRegistryAddress;
IMillionPieces public immutable millionPieces;
event NewPurchase(address purchaser, address receiver, uint256 tokenId, uint256 weiAmount);
constructor(
address _millionPieces,
address payable _fund,
address _proxyRegistryAddress
) public {
fund = _fund;
proxyRegistryAddress = _proxyRegistryAddress;
millionPieces = IMillionPieces(_millionPieces);
}
fallback () external payable { revert(); }
receive () external payable { revert(); }
function buySingle(address receiver, uint256 tokenId) external payable override {
require(msg.value >= PRICE_FOR_SEGMENT, "buySingle: Not enough ETH for purchase!");
_buySingle(receiver, tokenId);
}
function buyMany(
address[] calldata receivers,
uint256[] calldata tokenIds
) external payable override {
uint256 tokensCount = tokenIds.length;
require(tokensCount > 0 && tokensCount <= BATCH_PURCHASE_LIMIT, "buyMany: Arrays should bigger 0 and less then max limit!");
require(tokensCount == receivers.length, "buyMany: Arrays should be equal to each other!");
require(msg.value >= tokensCount.mul(PRICE_FOR_SEGMENT), "buyMany: Not enough ETH for purchase!");
_buyMany(receivers, tokenIds);
}
function mint(uint256 tokenId, address receiver) public {
ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
require(address(proxyRegistry.proxies(owner())) == msg.sender || owner() == msg.sender, "mint: Not auth!");
_buySingle(receiver, tokenId);
}
function changeFundAddress(address payable newFund) external onlyOwner {
require(newFund != address(0), "changeFundAddress: Empty fund address!");
fund = newFund;
}
function _buySingle(address receiver, uint256 tokenId) private {
_mintNft(receiver, tokenId);
emit NewPurchase(msg.sender, receiver, tokenId, msg.value);
_transferEth(fund, msg.value);
}
function _buyMany(address[] memory receivers, uint256[] memory tokenIds) private {
uint256 tokensCount = tokenIds.length;
uint256 actualPurchasedSegments = 0;
uint256 ethPerEachSegment = msg.value.div(tokensCount);
for (uint256 i = 0; i < tokensCount; i++) {
if (_isPurchasable(tokenIds[i])) {
_mintNft(receivers[i], tokenIds[i]);
actualPurchasedSegments++;
emit NewPurchase(msg.sender, receivers[i], tokenIds[i], ethPerEachSegment);
}
}
_transferEth(fund, actualPurchasedSegments.mul(ethPerEachSegment));
if (tokensCount != actualPurchasedSegments) {
_transferEth(msg.sender, (tokensCount.sub(actualPurchasedSegments)).mul(ethPerEachSegment));
}
}
function _transferEth(address receiver, uint256 amount) private {
(bool success, ) = receiver.call{value: amount}("");
require(success, "_transferEth: Failed to transfer funds!");
}
function _mintNft(address receiver, uint256 tokenId) private {
millionPieces.mintTo(receiver, tokenId);
}
function _isPurchasable(uint256 tokenId) private view returns (bool) {
return !millionPieces.exists(tokenId);
}
}
文件 2 的 7:Context.sol
pragma solidity >=0.6.0 <0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this;
return msg.data;
}
}
文件 3 的 7:IAuction.sol
pragma solidity ^0.6.12;
interface IAuction {
function buySingle(address receiver, uint256 tokenId) external payable;
function buyMany(address[] calldata receivers, uint256[] calldata tokenIds) external payable;
}
文件 4 的 7:IMillionPieces.sol
pragma solidity ^0.6.12;
interface IMillionPieces {
function mintTo(address to, uint256 tokenId) external;
function mintToSpecial(address to, uint256 tokenId) external;
function createArtwork(string calldata name) external;
function setTokenURI(uint256 tokenId, string calldata uri) external;
function setBaseURI(string calldata baseURI) external;
function exists(uint256 tokenId) external view returns (bool);
function isSpecialSegment(uint256 tokenId) external pure returns (bool);
function isValidArtworkSegment(uint256 tokenId) external view returns (bool);
function getArtworkName(uint256 id) external view returns (string memory);
}
文件 5 的 7:Ownable.sol
pragma solidity >=0.6.0 <0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor () internal {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
function owner() public view 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;
}
}
文件 6 的 7:ProxyRegistry.sol
pragma solidity ^0.6.12;
contract OwnableDelegateProxy {}
contract ProxyRegistry {
mapping(address => OwnableDelegateProxy) public proxies;
}
文件 7 的 7:SafeMath.sol
pragma solidity >=0.6.0 <0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}
{
"compilationTarget": {
"contracts/Auction.sol": "Auction"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 9999
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_millionPieces","type":"address"},{"internalType":"address payable","name":"_fund","type":"address"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"purchaser","type":"address"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"weiAmount","type":"uint256"}],"name":"NewPurchase","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"BATCH_PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_FOR_SEGMENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"buyMany","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"buySingle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newFund","type":"address"}],"name":"changeFundAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fund","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"millionPieces","outputs":[{"internalType":"contract IMillionPieces","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]