Change NoncesKeyed._useNonce to return a keyed value (#5312)
This commit is contained in:
@ -86,7 +86,7 @@ function shouldBehaveLikeNoncesKeyed() {
|
||||
|
||||
await expect(this.mock.$_useNonce(sender, ethers.Typed.uint192(0n)))
|
||||
.to.emit(this.mock, 'return$_useNonce_address_uint192')
|
||||
.withArgs(1n);
|
||||
.withArgs(keyOffset(0n) + 1n);
|
||||
|
||||
expect(this.mock.nonces(sender, ethers.Typed.uint192(0n))).to.eventually.equal(keyOffset(0n) + 2n);
|
||||
expect(this.mock.nonces(sender, ethers.Typed.uint192(17n))).to.eventually.equal(keyOffset(17n) + 0n);
|
||||
@ -98,18 +98,18 @@ function shouldBehaveLikeNoncesKeyed() {
|
||||
|
||||
await expect(this.mock.$_useNonce(sender, ethers.Typed.uint192(17n)))
|
||||
.to.emit(this.mock, 'return$_useNonce_address_uint192')
|
||||
.withArgs(0n);
|
||||
.withArgs(keyOffset(17n) + 0n);
|
||||
|
||||
await expect(this.mock.$_useNonce(sender, ethers.Typed.uint192(17n)))
|
||||
.to.emit(this.mock, 'return$_useNonce_address_uint192')
|
||||
.withArgs(1n);
|
||||
.withArgs(keyOffset(17n) + 1n);
|
||||
|
||||
expect(this.mock.nonces(sender, ethers.Typed.uint192(0n))).to.eventually.equal(keyOffset(0n) + 0n);
|
||||
expect(this.mock.nonces(sender, ethers.Typed.uint192(17n))).to.eventually.equal(keyOffset(17n) + 2n);
|
||||
});
|
||||
});
|
||||
|
||||
describe('_useCheckedNonce', function () {
|
||||
describe('_useCheckedNonce(address, uint256)', function () {
|
||||
it('default variant uses key 0', async function () {
|
||||
const currentNonce = await this.mock.nonces(sender, ethers.Typed.uint192(0n));
|
||||
|
||||
@ -135,12 +135,49 @@ function shouldBehaveLikeNoncesKeyed() {
|
||||
// reuse same nonce
|
||||
await expect(this.mock.$_useCheckedNonce(sender, currentNonce))
|
||||
.to.be.revertedWithCustomError(this.mock, 'InvalidAccountNonce')
|
||||
.withArgs(sender, 1);
|
||||
.withArgs(sender, currentNonce + 1n);
|
||||
|
||||
// use "future" nonce too early
|
||||
await expect(this.mock.$_useCheckedNonce(sender, currentNonce + 10n))
|
||||
.to.be.revertedWithCustomError(this.mock, 'InvalidAccountNonce')
|
||||
.withArgs(sender, 1);
|
||||
.withArgs(sender, currentNonce + 1n);
|
||||
});
|
||||
});
|
||||
|
||||
describe('_useCheckedNonce(address, uint192, uint64)', function () {
|
||||
const MASK = 0xffffffffffffffffn;
|
||||
|
||||
it('default variant uses key 0', async function () {
|
||||
const currentNonce = await this.mock.nonces(sender, ethers.Typed.uint192(0n));
|
||||
|
||||
await this.mock.$_useCheckedNonce(sender, ethers.Typed.uint192(0n), currentNonce);
|
||||
|
||||
expect(this.mock.nonces(sender, ethers.Typed.uint192(0n))).to.eventually.equal(currentNonce + 1n);
|
||||
});
|
||||
|
||||
it('use nonce at another key', async function () {
|
||||
const currentNonce = await this.mock.nonces(sender, ethers.Typed.uint192(17n));
|
||||
|
||||
await this.mock.$_useCheckedNonce(sender, ethers.Typed.uint192(17n), currentNonce & MASK);
|
||||
|
||||
expect(this.mock.nonces(sender, ethers.Typed.uint192(17n))).to.eventually.equal(currentNonce + 1n);
|
||||
});
|
||||
|
||||
it('reverts when nonce is not the expected', async function () {
|
||||
const currentNonce = await this.mock.nonces(sender, ethers.Typed.uint192(42n));
|
||||
|
||||
// use and increment
|
||||
await this.mock.$_useCheckedNonce(sender, ethers.Typed.uint192(42n), currentNonce & MASK);
|
||||
|
||||
// reuse same nonce
|
||||
await expect(this.mock.$_useCheckedNonce(sender, ethers.Typed.uint192(42n), currentNonce & MASK))
|
||||
.to.be.revertedWithCustomError(this.mock, 'InvalidAccountNonce')
|
||||
.withArgs(sender, currentNonce + 1n);
|
||||
|
||||
// use "future" nonce too early
|
||||
await expect(this.mock.$_useCheckedNonce(sender, ethers.Typed.uint192(42n), (currentNonce & MASK) + 10n))
|
||||
.to.be.revertedWithCustomError(this.mock, 'InvalidAccountNonce')
|
||||
.withArgs(sender, currentNonce + 1n);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user