编译器
0.8.13+commit.abaa5c0e
文件 1 的 3: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 的 3:DecouplingDucks.sol
pragma solidity 0.8.13;
import "@openzeppelin/contracts/access/Ownable.sol";
interface IERC721 {
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
function ownerOf(uint256 tokenId) external view returns (address owner);
}
contract DecouplingDucks is Ownable {
event Burned(address indexed owner, address indexed nft, uint256 indexed tokenId);
IERC721 private og;
IERC721 private hell;
address constant private _burnerAddress = 0x000000000000000000000000000000000000dEaD;
constructor(address ogAddress, address hellAddress) {
og = IERC721(ogAddress);
hell = IERC721(hellAddress);
}
function burn(uint256 tokenId, IERC721 nft) private {
nft.safeTransferFrom(_msgSender(), _burnerAddress, tokenId);
emit Burned(_msgSender(), address(nft), tokenId);
}
function decouple(uint256[] calldata ogIds, uint256[] calldata hellIds) public {
for(uint256 i = 0; i < ogIds.length; i++) {
burn(ogIds[i], og);
}
for(uint256 i = 0; i < hellIds.length; i++) {
burn(hellIds[i], hell);
}
}
}
文件 3 的 3:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_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 {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
{
"compilationTarget": {
"contracts/DecouplingDucks.sol": "DecouplingDucks"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"ogAddress","type":"address"},{"internalType":"address","name":"hellAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"nft","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Burned","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"},{"inputs":[{"internalType":"uint256[]","name":"ogIds","type":"uint256[]"},{"internalType":"uint256[]","name":"hellIds","type":"uint256[]"}],"name":"decouple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","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"}]