编译器
0.8.21+commit.d9974bed
文件 1 的 10:AuthorizableV08.sol
pragma solidity ^0.8;
import "./interfaces/IAuthorizableV08.sol";
import "./errors/LibRichErrorsV08.sol";
import "./errors/LibAuthorizableRichErrorsV08.sol";
import "./OwnableV08.sol";
contract AuthorizableV08 is OwnableV08, IAuthorizableV08 {
modifier onlyAuthorized() {
_assertSenderIsAuthorized();
_;
}
mapping(address => bool) public override authorized;
address[] public override authorities;
constructor() OwnableV08() {}
function addAuthorizedAddress(address target) external override onlyOwner {
_addAuthorizedAddress(target);
}
function removeAuthorizedAddress(address target) external override onlyOwner {
if (!authorized[target]) {
LibRichErrorsV08.rrevert(LibAuthorizableRichErrorsV08.TargetNotAuthorizedError(target));
}
for (uint256 i = 0; i < authorities.length; i++) {
if (authorities[i] == target) {
_removeAuthorizedAddressAtIndex(target, i);
break;
}
}
}
function removeAuthorizedAddressAtIndex(address target, uint256 index) external override onlyOwner {
_removeAuthorizedAddressAtIndex(target, index);
}
function getAuthorizedAddresses() external view override returns (address[] memory) {
return authorities;
}
function _assertSenderIsAuthorized() internal view {
if (!authorized[msg.sender]) {
LibRichErrorsV08.rrevert(LibAuthorizableRichErrorsV08.SenderNotAuthorizedError(msg.sender));
}
}
function _addAuthorizedAddress(address target) internal {
if (target == address(0)) {
LibRichErrorsV08.rrevert(LibAuthorizableRichErrorsV08.ZeroCantBeAuthorizedError());
}
if (authorized[target]) {
LibRichErrorsV08.rrevert(LibAuthorizableRichErrorsV08.TargetAlreadyAuthorizedError(target));
}
authorized[target] = true;
authorities.push(target);
emit AuthorizedAddressAdded(target, msg.sender);
}
function _removeAuthorizedAddressAtIndex(address target, uint256 index) internal {
if (!authorized[target]) {
LibRichErrorsV08.rrevert(LibAuthorizableRichErrorsV08.TargetNotAuthorizedError(target));
}
if (index >= authorities.length) {
LibRichErrorsV08.rrevert(LibAuthorizableRichErrorsV08.IndexOutOfBoundsError(index, authorities.length));
}
if (authorities[index] != target) {
LibRichErrorsV08.rrevert(
LibAuthorizableRichErrorsV08.AuthorizedAddressMismatchError(authorities[index], target)
);
}
delete authorized[target];
authorities[index] = authorities[authorities.length - 1];
authorities.pop();
emit AuthorizedAddressRemoved(target, msg.sender);
}
}
文件 2 的 10:IAuthorizableV08.sol
pragma solidity ^0.8;
import "./IOwnableV08.sol";
interface IAuthorizableV08 is IOwnableV08 {
event AuthorizedAddressAdded(address indexed target, address indexed caller);
event AuthorizedAddressRemoved(address indexed target, address indexed caller);
function addAuthorizedAddress(address target) external;
function removeAuthorizedAddress(address target) external;
function removeAuthorizedAddressAtIndex(address target, uint256 index) external;
function getAuthorizedAddresses() external view returns (address[] memory authorizedAddresses);
function authorized(address addr) external view returns (bool isAuthorized);
function authorities(uint256 idx) external view returns (address addr);
}
文件 3 的 10:IERC20.sol
pragma solidity ^0.8.20;
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 value) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transferFrom(address from, address to, uint256 value) external returns (bool);
}
文件 4 的 10:IMemecoinDelegate.sol
pragma solidity >=0.8.20;
interface IMemecoinDelegate {
function memecoin() external view returns (address);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function allowance(address user) external view returns (uint256);
function isAuthorized(address addr) external view returns (bool);
}
文件 5 的 10:IOwnableV08.sol
pragma solidity ^0.8;
interface IOwnableV08 {
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
function transferOwnership(address newOwner) external;
function owner() external view returns (address ownerAddress);
}
文件 6 的 10:LibAuthorizableRichErrorsV08.sol
pragma solidity ^0.8;
library LibAuthorizableRichErrorsV08 {
bytes4 internal constant AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR = 0x140a84db;
bytes4 internal constant INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR = 0xe9f83771;
bytes4 internal constant SENDER_NOT_AUTHORIZED_ERROR_SELECTOR = 0xb65a25b9;
bytes4 internal constant TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR = 0xde16f1a0;
bytes4 internal constant TARGET_NOT_AUTHORIZED_ERROR_SELECTOR = 0xeb5108a2;
bytes internal constant ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES = hex"57654fe4";
function AuthorizedAddressMismatchError(address authorized, address target) internal pure returns (bytes memory) {
return abi.encodeWithSelector(AUTHORIZED_ADDRESS_MISMATCH_ERROR_SELECTOR, authorized, target);
}
function IndexOutOfBoundsError(uint256 index, uint256 length) internal pure returns (bytes memory) {
return abi.encodeWithSelector(INDEX_OUT_OF_BOUNDS_ERROR_SELECTOR, index, length);
}
function SenderNotAuthorizedError(address sender) internal pure returns (bytes memory) {
return abi.encodeWithSelector(SENDER_NOT_AUTHORIZED_ERROR_SELECTOR, sender);
}
function TargetAlreadyAuthorizedError(address target) internal pure returns (bytes memory) {
return abi.encodeWithSelector(TARGET_ALREADY_AUTHORIZED_ERROR_SELECTOR, target);
}
function TargetNotAuthorizedError(address target) internal pure returns (bytes memory) {
return abi.encodeWithSelector(TARGET_NOT_AUTHORIZED_ERROR_SELECTOR, target);
}
function ZeroCantBeAuthorizedError() internal pure returns (bytes memory) {
return ZERO_CANT_BE_AUTHORIZED_ERROR_BYTES;
}
}
文件 7 的 10:LibOwnableRichErrorsV08.sol
pragma solidity ^0.8;
library LibOwnableRichErrorsV08 {
bytes4 internal constant ONLY_OWNER_ERROR_SELECTOR = 0x1de45ad1;
bytes internal constant TRANSFER_OWNER_TO_ZERO_ERROR_BYTES = hex"e69edc3e";
function OnlyOwnerError(address sender, address owner) internal pure returns (bytes memory) {
return abi.encodeWithSelector(ONLY_OWNER_ERROR_SELECTOR, sender, owner);
}
function TransferOwnerToZeroError() internal pure returns (bytes memory) {
return TRANSFER_OWNER_TO_ZERO_ERROR_BYTES;
}
}
文件 8 的 10:LibRichErrorsV08.sol
pragma solidity ^0.8;
library LibRichErrorsV08 {
bytes4 internal constant STANDARD_ERROR_SELECTOR = 0x08c379a0;
function StandardError(string memory message) internal pure returns (bytes memory) {
return abi.encodeWithSelector(STANDARD_ERROR_SELECTOR, bytes(message));
}
function rrevert(bytes memory errorData) internal pure {
assembly ("memory-safe") {
revert(add(errorData, 0x20), mload(errorData))
}
}
}
文件 9 的 10:MemecoinDelegate.sol
pragma solidity >=0.8.20;
import {AuthorizableV08} from "@0x/contracts-utils/contracts/src/v08/AuthorizableV08.sol";
import {IERC20} from "@openzeppelin5/contracts/token/ERC20/IERC20.sol";
import {IMemecoinDelegate} from "./interfaces/IMemecoinDelegate.sol";
contract MemecoinDelegate is AuthorizableV08, IMemecoinDelegate {
address public immutable memecoin;
constructor(address _memecoin) {
memecoin = _memecoin;
}
function transferFrom(address from, address to, uint256 amount) external onlyAuthorized returns (bool) {
return IERC20(memecoin).transferFrom(from, to, amount);
}
function allowance(address user) external view returns (uint256) {
return IERC20(memecoin).allowance(user, address(this));
}
function isAuthorized(address addr) external view returns (bool) {
return authorized[addr];
}
}
文件 10 的 10:OwnableV08.sol
pragma solidity ^0.8;
import "./interfaces/IOwnableV08.sol";
import "./errors/LibRichErrorsV08.sol";
import "./errors/LibOwnableRichErrorsV08.sol";
contract OwnableV08 is IOwnableV08 {
address public override owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
_assertSenderIsOwner();
_;
}
function transferOwnership(address newOwner) public override onlyOwner {
if (newOwner == address(0)) {
LibRichErrorsV08.rrevert(LibOwnableRichErrorsV08.TransferOwnerToZeroError());
} else {
owner = newOwner;
emit OwnershipTransferred(msg.sender, newOwner);
}
}
function _assertSenderIsOwner() internal view {
if (msg.sender != owner) {
LibRichErrorsV08.rrevert(LibOwnableRichErrorsV08.OnlyOwnerError(msg.sender, owner));
}
}
}
{
"compilationTarget": {
"contracts/memecoin/delegate/MemecoinDelegate.sol": "MemecoinDelegate"
},
"evmVersion": "shanghai",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_memecoin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"AuthorizedAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":true,"internalType":"address","name":"caller","type":"address"}],"name":"AuthorizedAddressRemoved","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":"address","name":"target","type":"address"}],"name":"addAuthorizedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"authorities","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAuthorizedAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memecoin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"removeAuthorizedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"removeAuthorizedAddressAtIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]