编译器
0.8.17+commit.8df45f5f
文件 1 的 12:Context.sol
pragma solidity >=0.8.0 <0.9.0;
import { Initializable } from "./Initializable.sol";
abstract contract Context is Initializable {
function __Context_init() internal initializer {
__Context_init_unchained();
}
function __Context_init_unchained() internal initializer {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 12:Errors.sol
pragma solidity >=0.8.4 <0.9.0;
library Errors {
error LinkError();
error ArrayMismatch();
error OutOfRange(uint256 value);
error OutOfRangeSigned(int256 value);
error UnsignedOverflow(uint256 value);
error SignedOverflow(int256 value);
error DuplicateCall();
error NotAContract();
error InterfaceNotSupported();
error NotInitialized();
error AlreadyInitialized();
error BadSender(address expected, address caller);
error AddressTarget(address target);
error UserPermissions();
error InvalidHash();
error InvalidSignature();
error InvalidSignatureLength();
error InvalidSignatureS();
error InsufficientBalance(uint256 available, uint256 required);
error InsufficientSupply(uint256 supply, uint256 available, int256 requested);
error InsufficientAvailable(uint256 available, uint256 requested);
error InvalidToken(uint256 tokenId);
error TokenNotMintable(uint256 tokenId);
error InvalidTokenType();
error ERC1155Receiver();
error ContractPaused();
error PaymentFailed(uint256 amount);
error IncorrectPayment(uint256 required, uint256 provided);
error TooManyForTransaction(uint256 mintLimit, uint256 amount);
error AuctionInactive(uint256 auctionId);
error AuctionActive(uint256 auctionId);
error InvalidBid(uint256 auctionId, uint256 amount);
error BidTooLow(uint256 auctionId, uint256 bid, uint256 minBid);
error AuctionClosed(uint256 auctionId);
error AuctionInExtendedBidding(uint256 auctionId);
error AuctionAborted(uint256 auctionId);
error AlreadyClaimed(uint256 lotId);
}
文件 3 的 12:Escrow.sol
pragma solidity ^0.8.9;
import { IERC20 } from "./interfaces/IERC20.sol";
import { IERC721 } from "./interfaces/IERC721.sol";
import { IERC1155 } from "./interfaces/IERC1155.sol";
import { IERC721Receiver } from "./interfaces/IERC721Receiver.sol";
import { IERC1155Receiver } from "./interfaces/IERC1155Receiver.sol";
import { IERC165 } from "./interfaces/IERC165.sol";
import { EscrowOwnable } from "./utils/EscrowOwnable.sol";
import { Context } from "./oz-simplified/Context.sol";
import { Initializable } from "./oz-simplified/Initializable.sol";
import { IEscrow } from "./interfaces/IEscrow.sol";
import { Errors } from "./library/errors/Errors.sol";
contract Escrow is IEscrow, IERC165, IERC721Receiver, IERC1155Receiver, EscrowOwnable {
struct PrizeToken {
uint256 tokenId;
address token;
uint8 tokenType;
uint16 quantity;
}
uint8 constant TYPE_ERC721 = 2;
uint8 constant TYPE_ERC1155 = 3;
IERC20 private _currencyContract;
uint256 private _lastId;
mapping(uint256 => PrizeToken[]) private _prizes;
mapping(uint256 => address) private _claims;
constructor(address currency) {
if (currency.code.length == 0) {
revert Errors.NotAContract();
}
_currencyContract = IERC20(currency);
}
function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165) returns (bool) {
return (
interfaceId == type(IEscrow).interfaceId
|| interfaceId == type(IERC721Receiver).interfaceId
|| interfaceId == type(IERC1155Receiver).interfaceId
|| interfaceId == type(IERC165).interfaceId
);
}
function updateCurrency(address newCurrencyAddress) external onlyOwner {
if (newCurrencyAddress.code.length == 0) {
revert Errors.NotAContract();
}
_currencyContract = IERC20(newCurrencyAddress);
}
function currencyBalance() public view returns (uint256) {
return _currencyContract.balanceOf(address(this));
}
function deposit(address spender, uint256 amount) public onlyAuthorized {
_currencyContract.transferFrom(spender, address(this), amount);
emit Deposit(amount, spender);
}
function withdraw(address recipient, uint256 amount) public onlyAuthorized {
_currencyContract.transfer(recipient, amount);
emit Withdrawal(amount, recipient);
}
function getPrizeInfo(uint256 claimId) public view returns (PrizeToken[] memory) {
return _prizes[claimId];
}
function addPrize(
address[] calldata tokens,
uint256[] calldata tokenIds,
uint8[] calldata tokenTypes,
uint16[] calldata quantities
) public onlyAuthorized {
uint256 arrayLength = tokens.length;
if (
arrayLength != tokenIds.length
|| arrayLength != tokenTypes.length
|| arrayLength != quantities.length
) {
revert Errors.ArrayMismatch();
}
uint256 claimId = ++_lastId;
for (uint256 i = 0; i < arrayLength;) {
PrizeToken storage prize = _prizes[claimId].push();
prize.token = tokens[i];
prize.tokenId = tokenIds[i];
prize.tokenType = tokenTypes[i];
prize.quantity = quantities[i];
unchecked {
++i;
}
}
_transferPrize(claimId, msg.sender, address(this));
emit PrizeAdded(claimId);
}
function removePrize(uint256 claimId, address to) public onlyAuthorized {
_transferPrize(claimId, address(this), to);
delete _prizes[claimId];
emit PrizeRemoved(claimId, to);
}
function authorizeClaim(uint256 claimId, address claimant) public onlyAuthorized {
if ( _prizes[ claimId ].length == 0) {
revert Errors.AlreadyClaimed(claimId);
}
_claims[claimId] = claimant;
emit ClaimAuthorized(claimId, claimant);
}
function authorizedClaimant(uint256 claimId) public view returns (address) {
return _claims[claimId];
}
function claim(uint256 claimId, address destination) public {
_claim(claimId, msg.sender, destination);
}
function claimFor(address claimant, uint256 claimId, address destination) onlyAuthorized public {
_claim(claimId, claimant, destination);
}
function _claim(uint256 claimId, address claimant, address recipient) internal {
if (claimant != _claims[claimId]) {
revert Errors.BadSender(_claims[claimId], claimant);
}
_transferPrize(claimId, address(this), recipient);
emit PrizeReceived(claimId, recipient);
_claims[claimId] = address(0);
delete _prizes[claimId];
}
function _transferPrize(uint256 claimId, address from, address to) internal {
PrizeToken[] memory prize = _prizes[claimId];
for (uint256 i = 0; i < prize.length;) {
if (prize[i].tokenType == TYPE_ERC721) {
IERC721 ct = IERC721(prize[i].token);
ct.safeTransferFrom(from, to, prize[i].tokenId);
} else if (prize[i].tokenType == TYPE_ERC1155) {
IERC1155 ct = IERC1155(prize[i].token);
ct.safeTransferFrom(from, to, prize[i].tokenId, prize[i].quantity, new bytes(0));
} else {
revert Errors.InvalidTokenType();
}
unchecked {
++i;
}
}
}
function onERC721Received(
address,
address from,
uint256,
bytes calldata
) public view returns (bytes4 selector) {
if (banker() == from) {
selector = IERC721Receiver.onERC721Received.selector;
}
}
function onERC1155Received(
address,
address from,
uint256,
uint256,
bytes calldata
) public view returns (bytes4 selector) {
if (banker() == from) {
selector = IERC1155Receiver.onERC1155Received.selector;
}
}
function onERC1155BatchReceived(
address,
address from,
uint256[] calldata,
uint256[] calldata,
bytes calldata
) public view returns (bytes4 selector) {
if (banker() == from) {
selector = IERC1155Receiver.onERC1155BatchReceived.selector;
}
}
}
文件 4 的 12:EscrowOwnable.sol
pragma solidity >=0.8.4 <0.9.0;
import { Errors } from "../library/errors/Errors.sol";
abstract contract EscrowOwnable {
address private _owner;
address private _proxy;
address private _banker;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_setOwner(msg.sender);
}
function owner() public view virtual returns (address) {
return _owner;
}
function proxy() public view virtual returns (address) {
return _proxy;
}
function banker() public view virtual returns (address) {
return _banker;
}
modifier onlyOwner() {
if (owner() != msg.sender) revert Errors.UserPermissions();
_;
}
modifier onlyAuthorized() {
if (
proxy() != msg.sender &&
banker() != msg.sender &&
owner() != msg.sender
) revert Errors.UserPermissions();
_;
}
function transferOwnership(address newOwner) public virtual onlyOwner {
if (newOwner == address(0)) revert Errors.AddressTarget(newOwner);
_setOwner(newOwner);
}
function setProxy(address newProxy) public virtual onlyOwner {
_proxy = newProxy;
}
function setBanker(address newBanker) public virtual onlyOwner {
_banker = newBanker;
}
function _setOwner(address newOwner) internal {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 5 的 12: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;
}
文件 6 的 12: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);
}
文件 7 的 12:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 8 的 12: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);
}
文件 9 的 12: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,
bytes calldata data
) external;
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 setApprovalForAll(address operator, bool _approved) external;
function getApproved(uint256 tokenId) external view returns (address operator);
function isApprovedForAll(address owner, address operator) external view returns (bool);
}
文件 10 的 12:IERC721Receiver.sol
pragma solidity ^0.8.0;
interface IERC721Receiver {
function onERC721Received(
address operator,
address from,
uint256 tokenId,
bytes calldata data
) external returns (bytes4);
}
文件 11 的 12:IEscrow.sol
pragma solidity ^0.8.9;
interface IEscrow {
event Withdrawal(uint256 indexed amount, address indexed withdrawer);
event Deposit(uint256 indexed amount, address indexed depositer);
event ClaimAuthorized(uint256 indexed claimId, address indexed claimant);
event PrizeAdded(uint256 indexed claimId);
event PrizeRemoved(uint256 indexed claimId, address indexed recipient);
event PrizeReceived(uint256 indexed claimId, address indexed recipient);
function currencyBalance() external returns (uint256);
function deposit(address spender, uint256 amount) external;
function withdraw(address recipient, uint256 amount) external;
function authorizeClaim(uint256 claimId, address claimant) external;
function claimFor(address claimant, uint256 claimId, address recipient) external;
}
文件 12 的 12:Initializable.sol
pragma solidity >=0.8.4 <0.9.0;
import { Errors } from "../library/errors/Errors.sol";
abstract contract Initializable {
bool private _initialized;
bool private _initializing;
modifier initializer() {
if (!_initializing && _initialized) revert Errors.AlreadyInitialized();
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
}
{
"compilationTarget": {
"contracts/Escrow.sol": "Escrow"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"currency","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressTarget","type":"error"},{"inputs":[{"internalType":"uint256","name":"lotId","type":"uint256"}],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"ArrayMismatch","type":"error"},{"inputs":[{"internalType":"address","name":"expected","type":"address"},{"internalType":"address","name":"caller","type":"address"}],"name":"BadSender","type":"error"},{"inputs":[],"name":"InvalidTokenType","type":"error"},{"inputs":[],"name":"NotAContract","type":"error"},{"inputs":[],"name":"UserPermissions","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"claimId","type":"uint256"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"}],"name":"ClaimAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"depositer","type":"address"}],"name":"Deposit","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":"uint256","name":"claimId","type":"uint256"}],"name":"PrizeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"claimId","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"PrizeReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"claimId","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"PrizeRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"withdrawer","type":"address"}],"name":"Withdrawal","type":"event"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint8[]","name":"tokenTypes","type":"uint8[]"},{"internalType":"uint16[]","name":"quantities","type":"uint16[]"}],"name":"addPrize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimId","type":"uint256"},{"internalType":"address","name":"claimant","type":"address"}],"name":"authorizeClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimId","type":"uint256"}],"name":"authorizedClaimant","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"banker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimId","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"claimant","type":"address"},{"internalType":"uint256","name":"claimId","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"claimFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currencyBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimId","type":"uint256"}],"name":"getPrizeInfo","outputs":[{"components":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint8","name":"tokenType","type":"uint8"},{"internalType":"uint16","name":"quantity","type":"uint16"}],"internalType":"struct Escrow.PrizeToken[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"selector","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"claimId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"removePrize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBanker","type":"address"}],"name":"setBanker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newProxy","type":"address"}],"name":"setProxy","outputs":[],"stateMutability":"nonpayable","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":"address","name":"newCurrencyAddress","type":"address"}],"name":"updateCurrency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]