|
|
|
@ -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); |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|
}); |
|
|
|
|