-
Notifications
You must be signed in to change notification settings - Fork 0
/
MerkledropFactory.sol
109 lines (84 loc) · 3.37 KB
/
MerkledropFactory.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;
import "solbase/utils/SafeMulticallable.sol";
import "solbase/utils/SelfPermit.sol";
import "solbase/utils/SafeTransferLib.sol";
import "solbase/utils/LibClone.sol";
contract MerkledropFactory is SelfPermit, SafeMulticallable {
/// -----------------------------------------------------------------------
/// Dependencies
/// -----------------------------------------------------------------------
using LibClone for address;
using SafeTransferLib for address;
/// -----------------------------------------------------------------------
/// Events
/// -----------------------------------------------------------------------
event NewMerkledrop(
address instance,
address asset,
bytes32 merkleRoot,
uint256 totalAirdrop
);
/// -----------------------------------------------------------------------
/// Immutables
/// -----------------------------------------------------------------------
address public immutable implementation;
constructor(address _implementation) {
implementation = _implementation;
}
/// -----------------------------------------------------------------------
/// Transfer Helper
/// -----------------------------------------------------------------------
function universalTransferFrom(
address token,
address from,
address to,
uint256 amount
) internal {
if (token != address(0)) {
token.safeTransferFrom(from, to, amount);
} else {
to.safeTransferETH(amount);
}
}
/// -----------------------------------------------------------------------
/// Merkledrop Creation
/// -----------------------------------------------------------------------
function create(address asset, bytes32 merkleRoot, uint256 totalAirdrop)
external
payable
returns (address merkledrop)
{
bytes memory immutables = abi.encode(msg.sender, asset, merkleRoot);
if (msg.value > 0) totalAirdrop = msg.value;
merkledrop = implementation.clone(immutables);
universalTransferFrom(asset, msg.sender, merkledrop, totalAirdrop);
emit NewMerkledrop(merkledrop, asset, merkleRoot, totalAirdrop);
}
function create(
address asset,
bytes32 merkleRoot,
uint256 totalAirdrop,
bytes32 salt
) external payable returns (address merkledrop) {
bytes memory immutables = abi.encode(msg.sender, asset, merkleRoot);
if (msg.value > 0) totalAirdrop = msg.value;
merkledrop = implementation.cloneDeterministic(immutables, salt);
universalTransferFrom(asset, msg.sender, merkledrop, totalAirdrop);
emit NewMerkledrop(merkledrop, asset, merkleRoot, totalAirdrop);
}
/// -----------------------------------------------------------------------
/// Viewables
/// -----------------------------------------------------------------------
function predictDeterministicAddress(
address creator,
address asset,
bytes32 merkleRoot,
bytes32 salt
) external view returns (address) {
bytes memory immutables = abi.encode(creator, asset, merkleRoot);
return implementation.predictDeterministicAddress(
immutables, salt, address(this)
);
}
}