Skip to content

Commit

Permalink
feat: implement Splitter factory
Browse files Browse the repository at this point in the history
  • Loading branch information
filoozom committed Aug 17, 2023
1 parent 57ffa6d commit 9434f7f
Show file tree
Hide file tree
Showing 6 changed files with 118 additions and 1 deletion.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,6 @@
[submodule "lib/solmate"]
path = lib/solmate
url = https://github.com/transmissions11/solmate
[submodule "lib/openzeppelin-contracts"]
path = lib/openzeppelin-contracts
url = https://github.com/OpenZeppelin/openzeppelin-contracts
1 change: 1 addition & 0 deletions lib/openzeppelin-contracts
Submodule openzeppelin-contracts added at fd81a9
3 changes: 3 additions & 0 deletions remappings.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
ds-test/=lib/solmate/lib/ds-test/src/
erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/
forge-std/=lib/forge-std/src/
openzeppelin-contracts/=lib/openzeppelin-contracts/
openzeppelin/=lib/openzeppelin-contracts/contracts/
solmate/=lib/solmate/src/
39 changes: 39 additions & 0 deletions src/SplitterFactory.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.15;

// Solmate
import {ERC20} from "solmate/tokens/ERC20.sol";

// OpenZeppelin
import "openzeppelin/proxy/Clones.sol";

// Custom
import {Splitter} from "./Splitter.sol";

contract SplitterFactory {
event SplitterCreated(
address indexed addr,
bytes _metadata,
ERC20 _token,
address[] _members
);

address public masterSplitter;

constructor() {
masterSplitter = address(new Splitter());
}

function create(
bytes calldata _metadata,
ERC20 _token,
address[] calldata _members
) public returns (Splitter splitter) {
/// @dev create the Splitter
splitter = Splitter(Clones.clone(masterSplitter));
splitter.init(_metadata, _token, _members);

/// @dev emit SplitterCreated event
emit SplitterCreated(address(splitter), _metadata, _token, _members);
}
}
2 changes: 1 addition & 1 deletion test/Splitter.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
pragma solidity ^0.8.13;

import "forge-std/Test.sol";
import {Splitter, InvalidToken, AlreadyInitialized, AlreadyAMember, NoTargets, NotAMember, NoDebt} from "../src/Splitter.sol";
import {Splitter, InvalidToken, AlreadyInitialized, AlreadyAMember, NoTargets, NotAMember, NoDebt} from "src/Splitter.sol";

import {ERC20} from "solmate/tokens/ERC20.sol";
import {MockERC20} from "solmate/test/utils/mocks/MockERC20.sol";
Expand Down
71 changes: 71 additions & 0 deletions test/SplitterFactory.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.15;
import "forge-std/Test.sol";

// Solmate
import {Bytes32AddressLib} from "solmate/utils/Bytes32AddressLib.sol";
import {ERC20} from "solmate/tokens/ERC20.sol";

// Custom
import {Splitter} from "src/Splitter.sol";
import {SplitterFactory} from "src/SplitterFactory.sol";

contract SplitterFactoryTest is Test {
/// @dev Events
event SplitterCreated(
address indexed addr,
bytes _metadata,
ERC20 _token,
address[] _members
);

/// @dev Variables
address[] public users;
SplitterFactory public factory;

function setUp() public {
/// @dev initialize users
users.push(address(0x10));
users.push(address(0x11));
users.push(address(0x12));

/// @dev deploy factory
factory = new SplitterFactory();
}

function testCanCreateSplitter() public {
// Expect an event to be emitted
vm.expectEmit(false, false, false, true);
emit SplitterCreated(
address(0),
new bytes(123),
ERC20(address(234)),
users
);

// Create the marketplace and record logs
vm.recordLogs();
Splitter splitter = factory.create(
new bytes(123),
ERC20(address(234)),
users
);
Vm.Log[] memory logs = vm.getRecordedLogs();

// Check if the address emitted in the event is right
address emitted;

for (uint256 i = 0; i < logs.length; i++) {
if (logs[i].topics[0] == SplitterCreated.selector) {
emitted = Bytes32AddressLib.fromLast20Bytes(logs[i].topics[1]);
break;
}
}

// Check metadata
assertEq(splitter.metadata(), new bytes(123));
assertEq(address(splitter.token()), address(234));
assertEq(splitter.getMembers(), users);
assertEq(address(splitter), emitted);
}
}

0 comments on commit 9434f7f

Please sign in to comment.