编译器
0.8.14+commit.80d49f37
文件 1 的 8:ConfirmedOwner.sol
pragma solidity ^0.8.7;
import "./ConfirmedOwnerWithProposal.sol";
contract ConfirmedOwner is ConfirmedOwnerWithProposal {
constructor(address newOwner) ConfirmedOwnerWithProposal(newOwner, address(0)) {}
}
文件 2 的 8:ConfirmedOwnerWithProposal.sol
pragma solidity ^0.8.7;
import "../interfaces/OwnableInterface.sol";
contract ConfirmedOwnerWithProposal is OwnableInterface {
address private s_owner;
address private s_pendingOwner;
event OwnershipTransferRequested(address indexed from, address indexed to);
event OwnershipTransferred(address indexed from, address indexed to);
constructor(address newOwner, address pendingOwner) {
require(newOwner != address(0), "Cannot set owner to zero");
s_owner = newOwner;
if (pendingOwner != address(0)) {
_transferOwnership(pendingOwner);
}
}
function transferOwnership(address to) public override onlyOwner {
_transferOwnership(to);
}
function acceptOwnership() external override {
require(msg.sender == s_pendingOwner, "Must be proposed owner");
address oldOwner = s_owner;
s_owner = msg.sender;
s_pendingOwner = address(0);
emit OwnershipTransferred(oldOwner, msg.sender);
}
function owner() public view override returns (address) {
return s_owner;
}
function _transferOwnership(address to) private {
require(to != msg.sender, "Cannot transfer to self");
s_pendingOwner = to;
emit OwnershipTransferRequested(s_owner, to);
}
modifier onlyOwner() {
require(msg.sender == s_owner, "Only callable by owner");
_;
}
}
文件 3 的 8:Deposit.sol
pragma solidity ^0.8.7;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "./interfaces/DepositInterface.sol";
import "./lib/ConfirmedOwner.sol";
import {DepositItem} from "./lib/DepositStructs.sol";
contract Deposit is DepositInterface, ConfirmedOwner {
bool public isEnabled;
address public recipient;
modifier checkEnabled() {
require(isEnabled, "Deposit suspended");
_;
}
constructor(address _recipient, address _owner) ConfirmedOwner(_owner) {
recipient = _recipient;
isEnabled = true;
}
function updateRecipient(address _recipient) external override onlyOwner {
require(_recipient != recipient, "Not changed");
require(_recipient != address(0), "Cannot set recipient to zero");
address oldRecipient = recipient;
recipient = _recipient;
emit UpdateRecipient(oldRecipient, recipient);
}
function enableDeposit() external override onlyOwner {
if (!isEnabled) {
isEnabled = true;
emit EnableDeposit();
}
}
function disableDeposit() external override onlyOwner {
if (isEnabled) {
isEnabled = false;
emit DisableDeposit();
}
}
function bulkDeposit(DepositItem[] calldata items, uint256 requestId) external override checkEnabled {
require(items.length > 0, "Deposit items cannot be empty");
for (uint256 i = 0; i < items.length; ++i) {
DepositItem calldata item = items[i];
IERC721(item.token).safeTransferFrom(msg.sender, recipient, item.identifier);
}
emit BulkDeposit(requestId);
}
}
文件 4 的 8:DepositInterface.sol
pragma solidity ^0.8.7;
import {DepositItem} from "../lib/DepositStructs.sol";
interface DepositInterface {
event UpdateRecipient(address indexed from, address indexed to);
event EnableDeposit();
event DisableDeposit();
event BulkDeposit(uint256 indexed requestId);
function updateRecipient(address recipient) external;
function enableDeposit() external;
function disableDeposit() external;
function bulkDeposit(DepositItem[] calldata items, uint256 requestId) external;
}
文件 5 的 8:DepositStructs.sol
pragma solidity ^0.8.7;
struct DepositItem {
address token;
uint256 identifier;
}
文件 6 的 8:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 7 的 8: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,
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);
}
文件 8 的 8:OwnableInterface.sol
pragma solidity ^0.8.7;
interface OwnableInterface {
function owner() external returns (address);
function transferOwnership(address recipient) external;
function acceptOwnership() external;
}
{
"compilationTarget": {
"contracts/Deposit.sol": "Deposit"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 1000000
},
"remappings": [],
"viaIR": true
}
[{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"BulkDeposit","type":"event"},{"anonymous":false,"inputs":[],"name":"DisableDeposit","type":"event"},{"anonymous":false,"inputs":[],"name":"EnableDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"UpdateRecipient","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"identifier","type":"uint256"}],"internalType":"struct DepositItem[]","name":"items","type":"tuple[]"},{"internalType":"uint256","name":"requestId","type":"uint256"}],"name":"bulkDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"updateRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"}]