parent
101d132eb2
commit
d7449fa2cf
@ -0,0 +1,121 @@ |
||||
import { expect } from 'chai'; |
||||
import { ethers } from 'hardhat'; |
||||
import { types, utils, Validator } from '@abacus-network/utils'; |
||||
import { SignerWithAddress } from '@nomiclabs/hardhat-ethers/signers'; |
||||
|
||||
import { |
||||
Outbox, |
||||
Outbox__factory, |
||||
OutboxMultisigValidatorManager, |
||||
OutboxMultisigValidatorManager__factory, |
||||
} from '../../types'; |
||||
import { getCheckpointSignatures } from './utils'; |
||||
|
||||
const OUTBOX_DOMAIN = 1234; |
||||
const INBOX_DOMAIN = 4321; |
||||
const QUORUM_THRESHOLD = 2; |
||||
|
||||
describe('OutboxMultisigValidatorManager', () => { |
||||
let validatorManager: OutboxMultisigValidatorManager, |
||||
outbox: Outbox, |
||||
signer: SignerWithAddress, |
||||
validator0: Validator, |
||||
validator1: Validator; |
||||
|
||||
before(async () => { |
||||
const signers = await ethers.getSigners(); |
||||
[signer] = signers; |
||||
const [, validatorSigner0, validatorSigner1] = signers; |
||||
validator0 = await Validator.fromSigner(validatorSigner0, OUTBOX_DOMAIN); |
||||
validator1 = await Validator.fromSigner(validatorSigner1, OUTBOX_DOMAIN); |
||||
}); |
||||
|
||||
beforeEach(async () => { |
||||
const validatorManagerFactory = new OutboxMultisigValidatorManager__factory( |
||||
signer, |
||||
); |
||||
validatorManager = await validatorManagerFactory.deploy( |
||||
OUTBOX_DOMAIN, |
||||
[validator0.address, validator1.address], |
||||
QUORUM_THRESHOLD, |
||||
); |
||||
|
||||
const outboxFactory = new Outbox__factory(signer); |
||||
outbox = await outboxFactory.deploy(OUTBOX_DOMAIN); |
||||
await outbox.initialize(validatorManager.address); |
||||
}); |
||||
|
||||
describe('#improperCheckpoint', () => { |
||||
const root = ethers.utils.formatBytes32String('test root'); |
||||
const index = 1; |
||||
|
||||
it('accepts an improper checkpoint if there is a quorum', async () => { |
||||
const signatures = await getCheckpointSignatures( |
||||
root, |
||||
index, |
||||
[validator0, validator1], // 2/2 signers, making a quorum
|
||||
); |
||||
|
||||
// Send message with signer address as msg.sender
|
||||
await expect( |
||||
validatorManager.improperCheckpoint( |
||||
outbox.address, |
||||
root, |
||||
index, |
||||
signatures, |
||||
), |
||||
) |
||||
.to.emit(validatorManager, 'ImproperCheckpoint') |
||||
.withArgs( |
||||
outbox.address, |
||||
root, |
||||
index, |
||||
signatures, |
||||
); |
||||
expect(await outbox.state()).to.equal(types.AbacusState.FAILED); |
||||
}); |
||||
|
||||
it('reverts if there is not a quorum', async () => { |
||||
const signatures = await getCheckpointSignatures( |
||||
root, |
||||
index, |
||||
[validator0], // 1/2 signers is not a quorum
|
||||
); |
||||
|
||||
await expect( |
||||
validatorManager.improperCheckpoint( |
||||
outbox.address, |
||||
root, |
||||
index, |
||||
signatures |
||||
) |
||||
).to.be.revertedWith('!quorum'); |
||||
}); |
||||
|
||||
it('reverts if the checkpoint is not improper', async () => { |
||||
const message = `0x${Buffer.alloc(10).toString('hex')}`; |
||||
await outbox.dispatch( |
||||
INBOX_DOMAIN, |
||||
utils.addressToBytes32(signer.address), |
||||
message, |
||||
); |
||||
await outbox.checkpoint(); |
||||
const [root, index] = await outbox.latestCheckpoint(); |
||||
|
||||
const signatures = await getCheckpointSignatures( |
||||
root, |
||||
index.toNumber(), |
||||
[validator0, validator1], // 2/2 signers, making a quorum
|
||||
); |
||||
|
||||
await expect( |
||||
validatorManager.improperCheckpoint( |
||||
outbox.address, |
||||
root, |
||||
index, |
||||
signatures |
||||
) |
||||
).to.be.revertedWith('!improper'); |
||||
}); |
||||
}); |
||||
}); |
Loading…
Reference in new issue