@@ -35,7 +35,7 @@ import { faucetAddress, faucetSecret } from "../helper/constants";
3535import { PromiseExpect } from "../helper/promise" ;
3636import { Signer } from "../helper/spawn" ;
3737import CodeChain from "../helper/spawn" ;
38- import { withNodes , setTermTestTimeout } from "./setup" ;
38+ import { withNodes , setTermTestTimeout , findNode } from "./setup" ;
3939
4040chai . use ( chaiAsPromised ) ;
4141
@@ -132,7 +132,6 @@ async function expectPossibleAuthors(
132132
133133// FIXME: neeeds to use common refactored function when gets banned state accounts
134134async function ensureAliceIsBanned ( sdk : SDK , blockNumber : number ) {
135- await expectPossibleAuthors ( sdk , otherDynValidators , blockNumber ) ;
136135 const bannedAfter = ( await stake . getBanned ( sdk , blockNumber ) ) . map (
137136 platformAddr => platformAddr . toString ( )
138137 ) ;
@@ -237,6 +236,109 @@ describe("Report Double Vote", function() {
237236 } ) ;
238237 } ) ;
239238
239+ describe ( "Ban from the jailed state" , async function ( ) {
240+ const { nodes } = withNodes ( this , {
241+ promiseExpect,
242+ validators : allDynValidators . map ( signer => ( {
243+ signer,
244+ delegation : 5_000 ,
245+ deposit : 10_000_000
246+ } ) ) ,
247+ onBeforeEnable : async nodes => {
248+ // Kill the alice node first to make alice not to participate in the term 1.
249+ await findNode ( nodes , alice ) . clean ( ) ;
250+ }
251+ } ) ;
252+
253+ async function ensureAliceIsJailed ( sdk : SDK , bestBlockNumber : number ) {
254+ const jailedBefore = ( await stake . getJailed (
255+ sdk ,
256+ bestBlockNumber
257+ ) ) . map ( prisoner => prisoner . address . toString ( ) ) ;
258+ expect ( jailedBefore ) . to . includes ( alice . platformAddress . toString ( ) ) ;
259+ }
260+
261+ async function ensureAliceIsReleased (
262+ sdk : SDK ,
263+ bestBlockNumber : number
264+ ) {
265+ const jailedAfter = ( await stake . getJailed (
266+ sdk ,
267+ bestBlockNumber
268+ ) ) . map ( prisoner => prisoner . address . toString ( ) ) ;
269+ expect ( jailedAfter ) . not . to . includes (
270+ alice . platformAddress . toString ( )
271+ ) ;
272+ }
273+
274+ it ( "alice should be banned from the prisoners" , async function ( ) {
275+ const termWaiter = setTermTestTimeout ( this , {
276+ terms : 1.5
277+ } ) ;
278+
279+ const checkingNode = nodes [ 1 ] ;
280+ await termWaiter . waitNodeUntilTerm ( checkingNode , {
281+ target : 2 ,
282+ termPeriods : 1
283+ } ) ;
284+ const blockNumber = await checkingNode . sdk . rpc . chain . getBestBlockNumber ( ) ;
285+ const termMetadata = ( await stake . getTermMetadata (
286+ checkingNode . sdk ,
287+ blockNumber
288+ ) ) ! ;
289+ expect ( termMetadata ! . currentTermId ) . to . be . equals ( 2 ) ;
290+
291+ await expectPossibleAuthors ( checkingNode . sdk , otherDynValidators ) ;
292+ await ensureAliceIsJailed (
293+ checkingNode . sdk ,
294+ termMetadata . lastTermFinishedBlockNumber
295+ ) ;
296+
297+ const aliceIdxInPrevTerm = await getAliceIndex (
298+ checkingNode . sdk ,
299+ termMetadata . lastTermFinishedBlockNumber
300+ ) ;
301+
302+ const [ message1 , message2 ] = createDoubleVoteMessages (
303+ {
304+ height : termMetadata . lastTermFinishedBlockNumber ,
305+ view : 0 ,
306+ step : "precommit" ,
307+ privKey : alice . privateKey ,
308+ signerIdx : aliceIdxInPrevTerm
309+ } ,
310+ H256 . ensure (
311+ "a556240c3ac4f33acbf78b33235ce13bc359bf96a01df5cc674539ae3b4978d0"
312+ ) ,
313+ H256 . ensure (
314+ "9900a2c6f1166026013f76fd7c366846265fa15edcfe06c88fc1a87b79e9b787"
315+ )
316+ ) ;
317+
318+ const reportTx = createReportDoubleVoteTransaction (
319+ checkingNode . sdk ,
320+ message1 ,
321+ message2
322+ ) ;
323+ const reportTxHash = await checkingNode . sdk . rpc . chain . sendSignedTransaction (
324+ reportTx . sign ( {
325+ secret : faucetSecret ,
326+ seq : await checkingNode . sdk . rpc . chain . getSeq ( faucetAddress ) ,
327+ fee : 10
328+ } )
329+ ) ;
330+ const blockNumberAfterReport = await waitUntilAliceGetBanned (
331+ checkingNode ,
332+ reportTxHash
333+ ) ;
334+ await ensureAliceIsBanned ( checkingNode . sdk , blockNumberAfterReport ) ;
335+ await ensureAliceIsReleased (
336+ checkingNode . sdk ,
337+ blockNumberAfterReport
338+ ) ;
339+ } ) ;
340+ } ) ;
341+
240342 afterEach ( async function ( ) {
241343 promiseExpect . checkFulfilled ( ) ;
242344 } ) ;
0 commit comments