1
1
"use strict" ;
2
2
3
+ const BigNumber = web3 . BigNumber ;
3
4
const CryptoCarzAuction = artifacts . require ( './CryptoCarzAuction.sol' ) ;
4
5
const CryptoCarzToken = artifacts . require ( "./CryptoCarzToken.sol" ) ;
5
6
import assertRevert from './assertRevert' ;
@@ -56,6 +57,15 @@ contract('CryptoCarzToken', function (accounts) {
56
57
}
57
58
}
58
59
60
+ async function assertedCreateAuction ( account ) {
61
+ const createAuction = await token . createAuction ( { from : account } ) ;
62
+ assert . equal ( createAuction . logs [ 0 ] . event , 'CreateAuction' ) ;
63
+ const auction = CryptoCarzAuction . at ( createAuction . logs [ 0 ] . args . contractAddress . valueOf ( ) ) ;
64
+ const initialized = await auction . initialized . call ( ) ;
65
+ assert . isBoolean ( initialized ) ;
66
+ assert . isFalse ( initialized ) ;
67
+ }
68
+
59
69
async function assertedTransferFrom ( token , from , to , tokenId , account ) {
60
70
const fromBalance = ( await token . balanceOf ( from ) ) . toNumber ( ) ;
61
71
const toBalance = ( await token . balanceOf ( to ) ) . toNumber ( ) ;
@@ -80,12 +90,26 @@ contract('CryptoCarzToken', function (accounts) {
80
90
const fromBalance = ( await token . balanceOf ( from ) ) . toNumber ( ) ;
81
91
const toBalance = ( await token . balanceOf ( to ) ) . toNumber ( ) ;
82
92
await checkTokensOwnedBy ( token , tokenIds , from ) ;
83
- await token . safeTransfersFrom ( from , to , tokenIds , { from : account } ) ;
93
+ const safeTransfersFrom = await token . safeTransfersFrom ( from , to , tokenIds , { from : account } ) ;
94
+ const lastIndex = safeTransfersFrom . logs . length - 1 ;
95
+ assert . equal ( safeTransfersFrom . logs [ lastIndex ] . event , 'SafeTransfersFrom' ) ;
96
+ assert . equal ( safeTransfersFrom . logs [ lastIndex ] . args . from . valueOf ( ) , from ) ;
97
+ assert . equal ( safeTransfersFrom . logs [ lastIndex ] . args . to . valueOf ( ) , to ) ;
98
+ assert . equal ( `${ safeTransfersFrom . logs [ lastIndex ] . args . tokenIds . valueOf ( ) } ` , `${ tokenIds } ` ) ;
84
99
await checkTokensOwnedBy ( token , tokenIds , to ) ;
85
100
assert . equal ( await token . balanceOf ( from ) , fromBalance - tokenIds . length ) ;
86
101
assert . equal ( await token . balanceOf ( to ) , toBalance + tokenIds . length ) ;
87
102
}
88
103
104
+ async function assertedUpgrade ( token , newTokenAddress , account ) {
105
+ const upgrade = await token . upgrade ( newTokenAddress , { from : account } ) ;
106
+ assert . equal ( await token . newContractAddress . call ( ) , newTokenAddress ) ;
107
+ assert . equal ( upgrade . logs [ 0 ] . event , 'ContractUpgrade' ) ;
108
+ assert . equal ( upgrade . logs [ 0 ] . args . newContractAddress . valueOf ( ) , newTokenAddress ) ;
109
+ assert . isTrue ( await token . paused . call ( ) ) ;
110
+ assert . equal ( upgrade . logs [ 1 ] . event , 'Pause' ) ;
111
+ }
112
+
89
113
beforeEach ( async function ( ) {
90
114
token = await CryptoCarzToken . new ( owner , manager , treasurer , { from : someoneElse } ) ;
91
115
const createSeries = await token . createSeries ( 4 , { from : manager } ) ;
@@ -157,6 +181,9 @@ contract('CryptoCarzToken', function (accounts) {
157
181
const carIds = [ 0 , 1 , 2 ] ;
158
182
const seriesId = 0 ;
159
183
await assertRevert ( token . createCars ( carIds , seriesId , { from : owner } ) ) ;
184
+ await assertRevert ( token . createCars ( carIds , seriesId , { from : someoneElse } ) ) ;
185
+ let createCars = await token . createCars ( carIds , seriesId , { from : manager } ) ;
186
+ await checkCreateCars ( token , createCars , carIds , seriesId , manager ) ;
160
187
} ) ;
161
188
162
189
it ( 'cannot create new cars when paused' , async function ( ) {
@@ -177,6 +204,18 @@ contract('CryptoCarzToken', function (accounts) {
177
204
await checkCreateCars ( token , createCars , carIds , seriesId , manager ) ;
178
205
} ) ;
179
206
207
+ it ( 'can add cars to a series' ,
208
+ async function ( ) {
209
+ let carIds = [ 0 , 1 , 2 ] ;
210
+ const seriesId = 0 ;
211
+
212
+ let createCars = await token . createCars ( carIds , seriesId , { from : manager } ) ;
213
+ await checkCreateCars ( token , createCars , carIds , seriesId , manager ) ;
214
+
215
+ carIds = [ 3 , 4 ] ;
216
+ await assertRevert ( token . createCars ( carIds , seriesId , { from : manager } ) ) ;
217
+ } ) ;
218
+
180
219
it ( 'cannot create more cars within a series than the series max number of cars' ,
181
220
async function ( ) {
182
221
let carIds = [ 0 , 1 , 2 ] ;
@@ -202,7 +241,8 @@ contract('CryptoCarzToken', function (accounts) {
202
241
203
242
describe ( 'series' , async function ( ) {
204
243
it ( 'create series' , async function ( ) {
205
- await assertRevert ( token . createSeries ( 0 , { from : manager } ) ) ;
244
+ let createSeries = await token . createSeries ( 1 , { from : manager } ) ;
245
+ checkCreateSeries ( token , createSeries , 1 , 1 ) ;
206
246
} ) ;
207
247
208
248
it ( 'cannot create a series of max 0 tokens' , async function ( ) {
@@ -252,16 +292,74 @@ contract('CryptoCarzToken', function (accounts) {
252
292
253
293
describe ( 'auction' , async function ( ) {
254
294
it ( 'can create auctions' , async function ( ) {
255
- const createAuction = await token . createAuction ( { from : manager } ) ;
256
- assert . equal ( createAuction . logs [ 0 ] . event , 'CreateAuction' ) ;
257
- const auction = CryptoCarzAuction . at ( createAuction . logs [ 0 ] . args . contractAddress . valueOf ( ) ) ;
258
- const initialized = await auction . initialized . call ( ) ;
259
- assert . isBoolean ( initialized ) ;
260
- assert . isFalse ( initialized ) ;
295
+ await assertedCreateAuction ( manager ) ;
261
296
} ) ;
262
297
} ) ;
263
298
264
299
describe ( 'upgrade' , async function ( ) {
265
- // TODO
300
+ let newTokenAddress ;
301
+
302
+ beforeEach ( async function ( ) {
303
+ newTokenAddress = ( await CryptoCarzToken . new ( owner , manager , treasurer , { from : someoneElse } ) ) . address ;
304
+ } ) ;
305
+
306
+ it ( 'can upgrade' , async function ( ) {
307
+ await assertedUpgrade ( token , newTokenAddress , owner ) ;
308
+ } ) ;
309
+
310
+ it ( 'can only be done by owner' , async function ( ) {
311
+ await assertRevert ( token . upgrade ( newTokenAddress , { from : manager } ) ) ;
312
+ await token . upgrade ( newTokenAddress , { from : owner } ) ;
313
+ } ) ;
314
+
315
+ it ( 'cannot upgrade to 0x0' , async function ( ) {
316
+ await assertRevert ( token . upgrade ( constants . ZERO_ADDRESS , { from : owner } ) ) ;
317
+ } ) ;
318
+
319
+ it ( 'cannot upgrade to itself' , async function ( ) {
320
+ await assertRevert ( token . upgrade ( token . address , { from : owner } ) ) ;
321
+ } ) ;
322
+
323
+ it ( 'can still call view functions' , async function ( ) {
324
+ const seriesId = 0 ;
325
+ const carIds = [ 0 , 1 , 2 , 3 ] ;
326
+ const createCars = await token . createCars ( carIds , seriesId , { from : manager } ) ;
327
+ await checkCreateCars ( token , createCars , carIds , seriesId , manager ) ;
328
+ await assertedSafeTransfersFrom ( token , manager , users [ 0 ] , [ 0 , 1 ] , manager ) ;
329
+ await assertedSafeTransfersFrom ( token , manager , users [ 1 ] , [ 2 , 3 ] , manager ) ;
330
+ await token . approve ( users [ 1 ] , 0 , { from : users [ 0 ] } ) ;
331
+ await token . approve ( users [ 0 ] , 2 , { from : users [ 1 ] } ) ;
332
+
333
+ await assertedUpgrade ( token , newTokenAddress , owner ) ;
334
+
335
+ // This should give us enough information to build a newToken.mintFromOldToken(address).
336
+ assert . deepEqual ( await Promise . all ( carIds . map ( carId => token . getCarSeries ( carId ) ) ) ,
337
+ carIds . map ( _ => new BigNumber ( seriesId ) ) , 'wrong car series' ) ;
338
+ assert . equal ( await token . balanceOf ( users [ 0 ] ) , 2 , 'wrong token balance' ) ;
339
+ assert . equal ( await token . balanceOf ( users [ 1 ] ) , 2 , 'wrong token balance' ) ;
340
+ assert . equal ( await token . tokenOfOwnerByIndex ( users [ 0 ] , 0 ) , 0 , 'wrong owned token ID' ) ;
341
+ assert . equal ( await token . tokenOfOwnerByIndex ( users [ 0 ] , 1 ) , 1 , 'wrong owned token ID' ) ;
342
+ assert . equal ( await token . tokenOfOwnerByIndex ( users [ 1 ] , 0 ) , 2 , 'wrong owned token ID' ) ;
343
+ assert . equal ( await token . tokenOfOwnerByIndex ( users [ 1 ] , 1 ) , 3 , 'wrong owned token ID' ) ;
344
+ assert . equal ( await token . getApproved ( 0 ) , users [ 1 ] , 'wrong approved address' ) ;
345
+ assert . equal ( await token . getApproved ( 2 ) , users [ 0 ] , 'wrong approved address' ) ;
346
+ // For setApprovalForAll(), we would probably just replay all ApprovalForAll events.
347
+ } ) ;
348
+
349
+ it ( 'cannot call ifNotPaused functions' , async function ( ) {
350
+ const seriesId = 0 ;
351
+ const carIds = [ 0 , 1 , 2 , 3 ] ;
352
+ const createCars = await token . createCars ( carIds , seriesId , { from : manager } ) ;
353
+ await checkCreateCars ( token , createCars , carIds , seriesId , manager ) ;
354
+ await assertedSafeTransfersFrom ( token , manager , users [ 0 ] , [ 0 , 1 , 2 , 3 ] , manager ) ;
355
+ await assertedCreateAuction ( manager ) ;
356
+
357
+ token = await CryptoCarzToken . new ( owner , manager , treasurer , { from : someoneElse } ) ;
358
+ await assertedUpgrade ( token , newTokenAddress , owner ) ;
359
+ await assertRevert ( token . createSeries ( 4 , { from : manager } ) ) ;
360
+ await assertRevert ( token . createCars ( carIds , seriesId , { from : manager } ) ) ;
361
+ await assertRevert ( token . safeTransfersFrom ( manager , users [ 0 ] , [ 0 , 1 , 2 , 3 ] , { from : manager } ) ) ;
362
+ await assertRevert ( token . createAuction ( { from : manager } ) ) ;
363
+ } ) ;
266
364
} ) ;
267
365
} ) ;
0 commit comments