1
1
import { task } from 'hardhat/config' ;
2
+ import { BigNumber as BN } from 'ethers' ;
2
3
import { expect } from 'chai' ;
3
4
import fs from 'fs' ;
4
5
@@ -11,6 +12,8 @@ import {
11
12
TimelockController ,
12
13
ArenaGovernor__factory ,
13
14
ArenaGovernor ,
15
+ TokenSale__factory ,
16
+ TokenSale ,
14
17
} from '../typechain' ;
15
18
16
19
import { allConfigs } from './config' ;
@@ -20,6 +23,7 @@ let token: ArenaToken;
20
23
let revokableTokenLock : RevokableTokenLock ;
21
24
let timelock : TimelockController ;
22
25
let governor : ArenaGovernor ;
26
+ let tokenSale : TokenSale ;
23
27
24
28
// see OZ docs: https://docs.openzeppelin.com/contracts/4.x/api/governance#timelock-roles
25
29
const ADMIN_ROLE = '0x5f58e3a2316349923ce3780f8d587db2d72378aed66a8261c916544fa6846ca5' ;
@@ -77,6 +81,21 @@ task('deploy', 'deploy contracts').setAction(async (taskArgs, hre) => {
77
81
await governor . deployed ( ) ;
78
82
console . log ( `governor address: ${ governor . address } ` ) ;
79
83
84
+ console . log ( `deploying tokensale...` ) ;
85
+ const TokenSaleFactory = ( await hre . ethers . getContractFactory ( 'TokenSale' ) ) as TokenSale__factory ;
86
+ tokenSale = await TokenSaleFactory . deploy (
87
+ config . TOKEN_SALE_USDC ,
88
+ token . address ,
89
+ config . TOKEN_SALE_START ,
90
+ config . TOKEN_SALE_DURATION ,
91
+ config . TOKEN_SALE_ARENA_PRICE ,
92
+ config . TOKEN_SALE_RECIPIENT ,
93
+ revokableTokenLock . address ,
94
+ config . VEST_DURATION
95
+ ) ;
96
+ await tokenSale . deployed ( ) ;
97
+ console . log ( `tokensale address: ${ tokenSale . address } ` ) ;
98
+
80
99
// give governor proposer role
81
100
// https://docs.openzeppelin.com/contracts/4.x/api/governance#timelock-proposer
82
101
await timelock . grantRole ( PROPOSER_ROLE , governor . address ) ;
@@ -92,12 +111,25 @@ task('deploy', 'deploy contracts').setAction(async (taskArgs, hre) => {
92
111
93
112
// set revoker role in TokenLock to timelock
94
113
await revokableTokenLock . setRevoker ( timelock . address ) ;
114
+ // set token sale in TokenLock
115
+ await revokableTokenLock . setTokenSale ( tokenSale . address ) ;
95
116
96
117
// transfer tokenlock admin role to timelock
97
118
await revokableTokenLock . transferOwnership ( timelock . address ) ;
98
119
99
- // transfer all tokens held by deployer to timelock
100
- await token . transfer ( timelock . address , config . FREE_SUPPLY ) ;
120
+ // set up token sale whitelist
121
+ await tokenSale . changeWhiteList (
122
+ config . TOKEN_SALE_WHITELIST . map ( ( { buyer} ) => buyer ) ,
123
+ config . TOKEN_SALE_WHITELIST . map ( ( { arenaAmount} ) => arenaAmount )
124
+ ) ;
125
+ // transfer token sale admin role to timelock
126
+ await tokenSale . transferOwnership ( timelock . address ) ;
127
+
128
+ // transfer all tokens held by deployer to token sale and timelock
129
+ const TOKEN_SALE_SUPPLY = config . TOKEN_SALE_WHITELIST . reduce ( ( sum , el ) => sum . add ( el . arenaAmount ) , BN . from ( `0` ) ) ;
130
+ console . log ( `transferring ${ TOKEN_SALE_SUPPLY . toString ( ) } ARENA to TokenSale. Remaining back to Timelock` ) ;
131
+ await token . transfer ( tokenSale . address , TOKEN_SALE_SUPPLY ) ;
132
+ await token . transfer ( timelock . address , config . FREE_SUPPLY . sub ( TOKEN_SALE_SUPPLY ) ) ;
101
133
102
134
// transfer token admin role to timelock
103
135
await token . transferOwnership ( timelock . address ) ;
@@ -109,6 +141,7 @@ task('deploy', 'deploy contracts').setAction(async (taskArgs, hre) => {
109
141
tokenLock : revokableTokenLock . address ,
110
142
timelock : timelock . address ,
111
143
governor : governor . address ,
144
+ tokenSale : tokenSale . address ,
112
145
} ;
113
146
let exportJson = JSON . stringify ( addressesToExport , null , 2 ) ;
114
147
fs . writeFileSync ( config . EXPORT_FILENAME , exportJson ) ;
@@ -136,6 +169,9 @@ task('deploy', 'deploy contracts').setAction(async (taskArgs, hre) => {
136
169
// TokenLock revoker should be timelock
137
170
expect ( await revokableTokenLock . revoker ( ) ) . to . be . eq ( timelock . address ) ;
138
171
172
+ // TokenLock token sale should be set
173
+ expect ( await revokableTokenLock . tokenSale ( ) ) . to . be . eq ( tokenSale . address ) ;
174
+
139
175
// TokenLock owner should be timelock
140
176
expect ( await revokableTokenLock . owner ( ) ) . to . be . eq ( timelock . address ) ;
141
177
@@ -145,6 +181,11 @@ task('deploy', 'deploy contracts').setAction(async (taskArgs, hre) => {
145
181
// check Token's tokenlock has been set
146
182
expect ( await token . tokenLock ( ) ) . to . be . eq ( revokableTokenLock . address ) ;
147
183
184
+ // check TokenSale's tokenlock has been set
185
+ expect ( await tokenSale . tokenLock ( ) ) . to . be . eq ( revokableTokenLock . address ) ;
186
+ // Token's owner should be timelock
187
+ expect ( await tokenSale . owner ( ) ) . to . be . eq ( timelock . address ) ;
188
+
148
189
/////////////////////////
149
190
// CONFIG VERIFICATION //
150
191
/////////////////////////
@@ -153,8 +194,11 @@ task('deploy', 'deploy contracts').setAction(async (taskArgs, hre) => {
153
194
// check ArenaToken's token balance == AIRDROP_SUPPLY
154
195
expect ( await token . balanceOf ( token . address ) ) . to . be . eq ( config . AIRDROP_SUPPLY ) ;
155
196
156
- // check timelock's token balance == FREE_SUPPLY
157
- expect ( await token . balanceOf ( timelock . address ) ) . to . be . eq ( config . FREE_SUPPLY ) ;
197
+ // check timelock's token balance == TOKEN_SALE_SUPPLY
198
+ expect ( await token . balanceOf ( tokenSale . address ) ) . to . be . eq ( TOKEN_SALE_SUPPLY ) ;
199
+
200
+ // check timelock's token balance == FREE_SUPPLY - TOKEN_SALE_SUPPLY (rest of it)
201
+ expect ( await token . balanceOf ( timelock . address ) ) . to . be . eq ( config . FREE_SUPPLY . sub ( TOKEN_SALE_SUPPLY ) ) ;
158
202
159
203
// check timelock's minDelay
160
204
expect ( await timelock . getMinDelay ( ) ) . to . be . eq ( config . TIMELOCK_DELAY ) ;
0 commit comments