11/* globals artifacts */
22
3+ const { BN } = require ( "bn.js" ) ;
34const chai = require ( "chai" ) ;
45const bnChai = require ( "bn-chai" ) ;
56const { ethers } = require ( "ethers" ) ;
@@ -168,13 +169,38 @@ contract("Korporatio", (accounts) => {
168169 await checkErrorRevert ( korporatio . deprecate ( true , { from : USER1 } ) , "ds-auth-unauthorized" ) ;
169170 await checkErrorRevert ( korporatio . uninstall ( { from : USER1 } ) , "ds-auth-unauthorized" ) ;
170171 } ) ;
172+
173+ it ( "cannot create applications unless initialised" , async ( ) => {
174+ await checkErrorRevert (
175+ korporatio . createApplication ( domain1Key , domain1Value , domain1Mask , domain1Siblings , user0Key , user0Value , user0Mask , user0Siblings , {
176+ from : USER0 ,
177+ } ) ,
178+ "korporatio-not-initialised"
179+ ) ;
180+ } ) ;
171181 } ) ;
172182
173183 describe ( "creating applications" , async ( ) => {
174184 beforeEach ( async ( ) => {
185+ await colony . approveStake ( korporatio . address , 1 , WAD , { from : USER0 } ) ;
186+
175187 await korporatio . initialise ( token . address , APPLICATION_FEE , WAD . divn ( 100 ) , SECONDS_PER_DAY , { from : USER0 } ) ;
188+ } ) ;
176189
177- await colony . approveStake ( korporatio . address , 1 , WAD , { from : USER0 } ) ;
190+ it ( "can re-initialise until first application is created" , async ( ) => {
191+ await korporatio . initialise ( token . address , APPLICATION_FEE , WAD . divn ( 10 ) , SECONDS_PER_DAY , { from : USER0 } ) ;
192+
193+ const stakeFraction = await korporatio . getStakeFraction ( ) ;
194+ expect ( stakeFraction ) . to . eq . BN ( WAD . divn ( 10 ) ) ;
195+
196+ await korporatio . createApplication ( domain1Key , domain1Value , domain1Mask , domain1Siblings , user0Key , user0Value , user0Mask , user0Siblings , {
197+ from : USER0 ,
198+ } ) ;
199+
200+ await checkErrorRevert (
201+ korporatio . initialise ( token . address , APPLICATION_FEE , WAD . divn ( 100 ) , SECONDS_PER_DAY , { from : USER1 } ) ,
202+ "korporatio-cannot-initialise"
203+ ) ;
178204 } ) ;
179205
180206 it ( "can query for configuration params" , async ( ) => {
@@ -256,7 +282,7 @@ contract("Korporatio", (accounts) => {
256282 const applicationId = await korporatio . getNumApplications ( ) ;
257283
258284 // Only applicant can cancel
259- await checkErrorRevert ( korporatio . cancelApplication ( applicationId , { from : USER1 } ) , "korporatio-cannot-cancel " ) ;
285+ await checkErrorRevert ( korporatio . cancelApplication ( applicationId , { from : USER1 } ) , "korporatio-not-applicant " ) ;
260286
261287 const tx = await korporatio . cancelApplication ( applicationId , { from : USER0 } ) ;
262288 const blockTime = await getBlockTime ( tx . receipt . blockNumber ) ;
@@ -278,7 +304,7 @@ contract("Korporatio", (accounts) => {
278304
279305 await forwardTime ( SECONDS_PER_DAY , this ) ;
280306
281- await korporatio . reclaimStake ( applicationId ) ;
307+ await korporatio . reclaimStake ( applicationId , { from : USER0 } ) ;
282308
283309 const obligation = await colony . getObligation ( USER0 , korporatio . address , 1 ) ;
284310 expect ( obligation ) . to . be . zero ;
@@ -355,20 +381,41 @@ contract("Korporatio", (accounts) => {
355381 await korporatio . createFreeApplication ( { from : USER0 } ) ;
356382
357383 const applicationId = await korporatio . getNumApplications ( ) ;
358- const ipfsHash = soliditySha3 ( "IPFS Hash" ) ;
359384
360385 // Cannot submit if not root
361- await checkErrorRevert ( korporatio . submitApplication ( applicationId , ipfsHash , { from : USER1 } ) , "korporatio-caller-not-root" ) ;
386+ await checkErrorRevert ( korporatio . submitApplication ( applicationId , { from : USER1 } ) , "korporatio-caller-not-root" ) ;
362387
363- const tx = await korporatio . submitApplication ( applicationId , ipfsHash , { from : USER0 } ) ;
364- await expectEvent ( tx , "ApplicationSubmitted" , [ applicationId , ipfsHash ] ) ;
388+ const tx = await korporatio . submitApplication ( applicationId , { from : USER0 } ) ;
389+ await expectEvent ( tx , "ApplicationSubmitted" , [ applicationId ] ) ;
365390
366391 const metaColonyAddress = await colonyNetwork . getMetaColony ( ) ;
367392 const metaColonyBalance = await token . balanceOf ( metaColonyAddress ) ;
368393 expect ( metaColonyBalance ) . to . eq . BN ( APPLICATION_FEE ) ;
369394
370395 // Cannot submit once cancelled
371- await checkErrorRevert ( korporatio . submitApplication ( applicationId , ipfsHash , { from : USER0 } ) , "korporatio-stake-cancelled" ) ;
396+ await checkErrorRevert ( korporatio . submitApplication ( applicationId , { from : USER0 } ) , "korporatio-stake-cancelled" ) ;
397+ } ) ;
398+
399+ it ( "can reclaim a stake via arbitration if the extension is deleted" , async ( ) => {
400+ const korporatioAddress = korporatio . address ;
401+ await korporatio . createApplication ( domain1Key , domain1Value , domain1Mask , domain1Siblings , user0Key , user0Value , user0Mask , user0Siblings , {
402+ from : USER0 ,
403+ } ) ;
404+
405+ const lockPre = await tokenLocking . getUserLock ( token . address , USER0 ) ;
406+ const obligationPre = await colony . getObligation ( USER0 , korporatioAddress , 1 ) ;
407+ expect ( obligationPre ) . to . eq . BN ( WAD . divn ( 100 ) . muln ( 3 ) ) ;
408+
409+ await colony . uninstallExtension ( KORPORATIO , { from : USER0 } ) ;
410+
411+ await colony . transferStake ( 1 , UINT256_MAX , korporatioAddress , USER0 , 1 , obligationPre , USER0 , { from : USER1 } ) ;
412+
413+ const lockPost = await tokenLocking . getUserLock ( token . address , USER0 ) ;
414+ const obligationPost = await colony . getObligation ( USER0 , korporatioAddress , 1 ) ;
415+
416+ // Obligation is zeroed out, but token balance is unchanged
417+ expect ( obligationPost ) . to . be . zero ;
418+ expect ( new BN ( lockPre . balance ) ) . to . eq . BN ( lockPost . balance ) ;
372419 } ) ;
373420
374421 it ( "can submit a stake via metatransactions" , async ( ) => {
0 commit comments