编译器
0.8.17+commit.8df45f5f
文件 1 的 3:Clones.sol
pragma solidity ^0.8.0;
library Clones {
function clone(address implementation) internal returns (address instance) {
assembly {
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create(0, 0x09, 0x37)
}
require(instance != address(0), "ERC1167: create failed");
}
function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
assembly {
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create2(0, 0x09, 0x37, salt)
}
require(instance != address(0), "ERC1167: create2 failed");
}
function predictDeterministicAddress(
address implementation,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
assembly {
let ptr := mload(0x40)
mstore(add(ptr, 0x38), deployer)
mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff)
mstore(add(ptr, 0x14), implementation)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73)
mstore(add(ptr, 0x58), salt)
mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37))
predicted := keccak256(add(ptr, 0x43), 0x55)
}
}
function predictDeterministicAddress(address implementation, bytes32 salt)
internal
view
returns (address predicted)
{
return predictDeterministicAddress(implementation, salt, address(this));
}
}
文件 2 的 3:Ownable.sol
pragma solidity ^0.8.13;
interface IOwnableEvents {
event OwnershipTransferred(
address indexed previousOwner,
address indexed newOwner
);
}
interface IOwnable {
function transferOwnership(address nextOwner_) external;
function cancelOwnershipTransfer() external;
function acceptOwnership() external;
function renounceOwnership() external;
function isOwner() external view returns (bool);
function isNextOwner() external view returns (bool);
}
contract Ownable is IOwnable, IOwnableEvents {
address public owner;
address private nextOwner;
modifier onlyOwner() {
require(isOwner(), "caller is not the owner.");
_;
}
modifier onlyNextOwner() {
require(isNextOwner(), "current owner must set caller as next owner.");
_;
}
constructor(address owner_) {
_setInitialOwner(owner_);
}
function transferOwnership(address nextOwner_) external override onlyOwner {
require(nextOwner_ != address(0), "Next owner is the zero address.");
nextOwner = nextOwner_;
}
function cancelOwnershipTransfer() external override onlyOwner {
delete nextOwner;
}
function acceptOwnership() external override onlyNextOwner {
delete nextOwner;
owner = msg.sender;
emit OwnershipTransferred(owner, msg.sender);
}
function renounceOwnership() external override onlyOwner {
_renounceOwnership();
}
function isOwner() public view override returns (bool) {
return msg.sender == owner;
}
function isNextOwner() public view override returns (bool) {
return msg.sender == nextOwner;
}
function _setOwner(address previousOwner, address newOwner) internal {
owner = newOwner;
emit OwnershipTransferred(previousOwner, owner);
}
function _setInitialOwner(address newOwner) internal {
owner = newOwner;
emit OwnershipTransferred(address(0), newOwner);
}
function _renounceOwnership() internal {
emit OwnershipTransferred(owner, address(0));
owner = address(0);
}
}
文件 3 的 3:SignatureDropDeployer.sol
pragma solidity ^0.8.13;
import "openzeppelin-contracts/contracts/proxy/Clones.sol";
import "./Ownable.sol";
interface ITWFactory {
function deployProxyByImplementation(
address _implementation,
bytes memory _data,
bytes32 _salt
) external returns (address);
}
interface ITWTokenERC1155 {
function initialize(
address _defaultAdmin,
string memory _name,
string memory _symbol,
string memory _contractURI,
address[] memory _trustedForwarders,
address _primarySaleRecipient,
address _royaltyRecipient,
uint128 _royaltyBps,
uint128 _platformFeeBps,
address _platformFeeRecipient
) external;
function mintTo(
address to,
uint256 tokenId,
string calldata uri,
uint256 amount
) external;
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function setOwner(address _newOwner) external;
function setFlatPlatformFeeInfo(
address _platformFeeRecipient,
uint256 _flatFee
) external;
enum PlatformFeeType {
Bps,
FLAT
}
function setPlatformFeeType(PlatformFeeType _feeType) external;
}
interface ISignatureDropDeployer {
event ProxyDeployed(
address indexed proxyAddress,
address indexed admin,
bytes32 salt
);
event NewMinter(address indexed oldMinter, address indexed newMinter);
struct DeployParams {
address admin;
string _name;
string _symbol;
string _contractURI;
string _uri;
address[] _trustedForwarders;
address _primarySaleRecipient;
address _royaltyRecipient;
uint128 _royaltyBps;
uint256 _platformFee;
address _platformFeeRecipient;
bytes32 salt;
}
function setMinter(address _newMinter) external;
function deploy(DeployParams memory params) external returns (address);
function predictDeterministicAddress(bytes32 _salt)
external
view
returns (address);
}
contract SignatureDropDeployer is ISignatureDropDeployer, Ownable {
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant TRANSFER_ROLE = keccak256("TRANSFER_ROLE");
address public immutable TWFactoryAddress;
address public immutable TWEditionImplementationAddress;
address public minter;
constructor(
address _owner,
address _minter,
address _factory,
address _implementation
) Ownable(_owner) {
_setMinter(_minter);
TWFactoryAddress = _factory;
TWEditionImplementationAddress = _implementation;
}
function setMinter(address _newMinter) public override onlyOwner {
_setMinter(_newMinter);
}
function deploy(DeployParams memory params)
public
override
returns (address)
{
bytes memory callData = abi.encodeWithSelector(
ITWTokenERC1155.initialize.selector,
address(this),
params._name,
params._symbol,
params._contractURI,
params._trustedForwarders,
params._primarySaleRecipient,
params._royaltyRecipient,
params._royaltyBps,
0,
params._platformFeeRecipient
);
address proxyAddress = _deployProxy(callData, params.salt);
ITWTokenERC1155(proxyAddress).mintTo(
params.admin,
type(uint256).max,
params._uri,
0
);
_setFees(
proxyAddress,
params._platformFeeRecipient,
params._platformFee
);
_setRoles(proxyAddress, params.admin);
emit ProxyDeployed(proxyAddress, params.admin, params.salt);
return proxyAddress;
}
function predictDeterministicAddress(bytes32 _salt)
public
view
override
returns (address)
{
return
Clones.predictDeterministicAddress(
TWEditionImplementationAddress,
keccak256(abi.encodePacked(address(this), _salt)),
TWFactoryAddress
);
}
function _setMinter(address _newMinter) internal {
emit NewMinter(minter, _newMinter);
minter = _newMinter;
}
function _deployProxy(bytes memory callData, bytes32 salt)
internal
returns (address)
{
return
ITWFactory(TWFactoryAddress).deployProxyByImplementation(
TWEditionImplementationAddress,
callData,
salt
);
}
function _setFees(
address proxyAddress,
address _platformFeeRecipient,
uint256 _platformFee
) internal {
ITWTokenERC1155(proxyAddress).setFlatPlatformFeeInfo(
_platformFeeRecipient,
_platformFee
);
ITWTokenERC1155(proxyAddress).setPlatformFeeType(
ITWTokenERC1155.PlatformFeeType.FLAT
);
}
function _setRoles(address proxyAddress, address admin) internal {
ITWTokenERC1155(proxyAddress).grantRole(MINTER_ROLE, minter);
ITWTokenERC1155(proxyAddress).grantRole(DEFAULT_ADMIN_ROLE, admin);
ITWTokenERC1155(proxyAddress).grantRole(MINTER_ROLE, admin);
ITWTokenERC1155(proxyAddress).grantRole(TRANSFER_ROLE, admin);
ITWTokenERC1155(proxyAddress).revokeRole(MINTER_ROLE, address(this));
ITWTokenERC1155(proxyAddress).revokeRole(TRANSFER_ROLE, address(this));
ITWTokenERC1155(proxyAddress).setOwner(admin);
ITWTokenERC1155(proxyAddress).revokeRole(
DEFAULT_ADMIN_ROLE,
address(this)
);
}
}
{
"compilationTarget": {
"src/SignatureDropDeployer.sol": "SignatureDropDeployer"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":ds-test/=lib/forge-std/lib/ds-test/src/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/"
]
}
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_minter","type":"address"},{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_implementation","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMinter","type":"address"},{"indexed":true,"internalType":"address","name":"newMinter","type":"address"}],"name":"NewMinter","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":"proxyAddress","type":"address"},{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"ProxyDeployed","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TWEditionImplementationAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TWFactoryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cancelOwnershipTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address[]","name":"_trustedForwarders","type":"address[]"},{"internalType":"address","name":"_primarySaleRecipient","type":"address"},{"internalType":"address","name":"_royaltyRecipient","type":"address"},{"internalType":"uint128","name":"_royaltyBps","type":"uint128"},{"internalType":"uint256","name":"_platformFee","type":"uint256"},{"internalType":"address","name":"_platformFeeRecipient","type":"address"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"internalType":"struct ISignatureDropDeployer.DeployParams","name":"params","type":"tuple"}],"name":"deploy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isNextOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minter","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":"bytes32","name":"_salt","type":"bytes32"}],"name":"predictDeterministicAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newMinter","type":"address"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"nextOwner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]