Token sale proposal
function createTier(
IGovPool govPool,
ITokenSaleProposal tokenSaleProposal,
IERC20Gov govToken
) external {
address[] memory purchaseTokenAddresses = new address[](1);
uint256[] memory exchangeRates = new uint256[](1);
/// @dev 1 GovToken = 2 ETH
purchaseTokenAddresses[0] = ETHEREUM_ADDRESS;
exchangeRates[0] = 2 * PRECISION;
uint256 totalTokenProvided = 100 ether;
ITokenSaleProposal.TierInitParams memory _tierInitParams = ITokenSaleProposal
.TierInitParams({
metadata: ITokenSaleProposal.TierMetadata({name: "", description: ""}),
totalTokenProvided: totalTokenProvided,
saleStartTime: uint64(block.timestamp + 2 days),
saleEndTime: uint64(block.timestamp + 9 days),
claimLockDuration: 0,
saleTokenAddress: address(govToken),
purchaseTokenAddresses: purchaseTokenAddresses,
exchangeRates: exchangeRates,
minAllocationPerUser: 0,
maxAllocationPerUser: 0,
vestingSettings: ITokenSaleProposal.VestingSettings({
vestingPercentage: 0,
vestingDuration: 0,
cliffPeriod: 0,
unlockStep: 0
}),
participationDetails: new ITokenSaleProposal.ParticipationDetails[](0)
});
ITokenSaleProposal.TierInitParams[]
memory tierInitParams = new ITokenSaleProposal.TierInitParams[](1);
tierInitParams[0] = _tierInitParams;
IGovPool.ProposalAction[] memory actionsFor = new IGovPool.ProposalAction[](2);
actionsFor[0] = IGovPool.ProposalAction({
executor: address(govToken),
value: 0,
data: abi.encodeWithSelector(
IERC20.approve.selector,
address(tokenSaleProposal),
totalTokenProvided
)
});
actionsFor[1] = IGovPool.ProposalAction({
executor: address(tokenSaleProposal),
value: 0,
data: abi.encodeWithSelector(ITokenSaleProposal.createTiers.selector, tierInitParams)
});
IGovPool.ProposalAction[] memory actionsAgainst = new IGovPool.ProposalAction[](0);
govPool.createProposal("Create tier", actionsFor, actionsAgainst);
}