diff --git a/src/grants/Deployer.sol b/src/grants/Deployer.sol new file mode 100644 index 0000000..891c06f --- /dev/null +++ b/src/grants/Deployer.sol @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: MIT + +pragma solidity 0.8.18; + +import { IERC20 } from "@oz/token/ERC20/IERC20.sol"; + +import { GrantFund } from "./GrantFund.sol"; + +contract Deployer { + + GrantFund public grantFund; + + function deployGrantFund(address ajnaToken_, uint256 treasury_) public returns (GrantFund) { + + IERC20(ajnaToken_).transferFrom(msg.sender, address(this), treasury_); + + grantFund = new GrantFund(ajnaToken_); + + IERC20(ajnaToken_).approve(address(grantFund), treasury_); + + grantFund.fundTreasury(treasury_); + + grantFund.startNewDistributionPeriod(); + return grantFund; + } +} \ No newline at end of file diff --git a/test/unit/Deployer.t.sol b/test/unit/Deployer.t.sol new file mode 100644 index 0000000..346e70c --- /dev/null +++ b/test/unit/Deployer.t.sol @@ -0,0 +1,32 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.18; + +import { Test } from "@std/Test.sol"; + +import { Deployer } from "../../src/grants/Deployer.sol"; +import { GrantFund } from "../../src/grants/GrantFund.sol"; +import { TestAjnaToken } from "../utils/harness/TestAjnaToken.sol"; + +contract DeployerTest is Test { + + function testGrantFundDeployment() external { + address owner = makeAddr("owner"); + vm.startPrank(owner); + + uint256 treasury = 50_000_000 * 1e18; + + TestAjnaToken ajnaToken = new TestAjnaToken(); + ajnaToken.mint(owner, treasury); + + Deployer deployer = new Deployer(); + ajnaToken.approve(address(deployer), treasury); + + GrantFund grantFund = deployer.deployGrantFund(address(ajnaToken), treasury); + + assertEq(grantFund.getDistributionId(), 1); + + (,,,uint256 fundAvailable,,) = grantFund.getDistributionPeriodInfo(1); + + assertEq(grantFund.treasury(), treasury - fundAvailable); + } +} \ No newline at end of file