文件 1 的 4: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 的 4:IRoyaltyFeeRegistry.sol
pragma solidity ^0.8.0;
interface IRoyaltyFeeRegistry {
function updateRoyaltyInfoForCollection(
address collection,
address setter,
address receiver,
uint256 fee
) external;
function updateRoyaltyFeeLimit(uint256 _royaltyFeeLimit) external;
function royaltyInfo(address collection, uint256 amount) external view returns (address, uint256);
function royaltyFeeInfoCollection(address collection)
external
view
returns (
address,
address,
uint256
);
}
文件 3 的 4: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);
}
}
文件 4 的 4:RoyaltyFeeRegistry.sol
pragma solidity ^0.8.0;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IRoyaltyFeeRegistry} from "../interfaces/IRoyaltyFeeRegistry.sol";
contract RoyaltyFeeRegistry is IRoyaltyFeeRegistry, Ownable {
struct FeeInfo {
address setter;
address receiver;
uint256 fee;
}
uint256 public royaltyFeeLimit;
mapping(address => FeeInfo) private _royaltyFeeInfoCollection;
event NewRoyaltyFeeLimit(uint256 royaltyFeeLimit);
event RoyaltyFeeUpdate(address indexed collection, address indexed setter, address indexed receiver, uint256 fee);
constructor(uint256 _royaltyFeeLimit) {
require(_royaltyFeeLimit <= 9500, "Owner: Royalty fee limit too high");
royaltyFeeLimit = _royaltyFeeLimit;
}
function updateRoyaltyFeeLimit(uint256 _royaltyFeeLimit) external override onlyOwner {
require(_royaltyFeeLimit <= 9500, "Owner: Royalty fee limit too high");
royaltyFeeLimit = _royaltyFeeLimit;
emit NewRoyaltyFeeLimit(_royaltyFeeLimit);
}
function updateRoyaltyInfoForCollection(
address collection,
address setter,
address receiver,
uint256 fee
) external override onlyOwner {
require(fee <= royaltyFeeLimit, "Registry: Royalty fee too high");
_royaltyFeeInfoCollection[collection] = FeeInfo({setter: setter, receiver: receiver, fee: fee});
emit RoyaltyFeeUpdate(collection, setter, receiver, fee);
}
function royaltyInfo(address collection, uint256 amount) external view override returns (address, uint256) {
return (
_royaltyFeeInfoCollection[collection].receiver,
(amount * _royaltyFeeInfoCollection[collection].fee) / 10000
);
}
function royaltyFeeInfoCollection(address collection)
external
view
override
returns (
address,
address,
uint256
)
{
return (
_royaltyFeeInfoCollection[collection].setter,
_royaltyFeeInfoCollection[collection].receiver,
_royaltyFeeInfoCollection[collection].fee
);
}
}
{
"compilationTarget": {
"contracts/royaltyFeeHelpers/RoyaltyFeeRegistry.sol": "RoyaltyFeeRegistry"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 888888
},
"remappings": []
}
[{"inputs":[{"internalType":"uint256","name":"_royaltyFeeLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"royaltyFeeLimit","type":"uint256"}],"name":"NewRoyaltyFeeLimit","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":"address","name":"collection","type":"address"},{"indexed":true,"internalType":"address","name":"setter","type":"address"},{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"RoyaltyFeeUpdate","type":"event"},{"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":"collection","type":"address"}],"name":"royaltyFeeInfoCollection","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyFeeLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_royaltyFeeLimit","type":"uint256"}],"name":"updateRoyaltyFeeLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"collection","type":"address"},{"internalType":"address","name":"setter","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"updateRoyaltyInfoForCollection","outputs":[],"stateMutability":"nonpayable","type":"function"}]