diff --git a/CHANGELOG.md b/CHANGELOG.md index 56c9c10..bf585b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 0.5.15 (unreleased) + + * Fix `snapshot.restore` when used multiple times. + ## 0.5.14 (2021-10-04) * Add missing export of `snapshot` module. diff --git a/src/snapshot.js b/src/snapshot.js index da421a7..8fb0826 100644 --- a/src/snapshot.js +++ b/src/snapshot.js @@ -1,24 +1,28 @@ const { web3 } = require('./setup'); const { promisify } = require('util'); +const makeSnapshot = async () => + await promisify(web3.currentProvider.send.bind(web3.currentProvider))({ + jsonrpc: '2.0', + method: 'evm_snapshot', + id: new Date().getTime(), + }).then(d => d.result); + /** * Returns a snapshot object with the 'restore' function, which reverts blockchain to the captured state */ const snapshot = async function () { - const snapshotData = await promisify(web3.currentProvider.send.bind(web3.currentProvider))({ - jsonrpc: '2.0', - method: 'evm_snapshot', - id: new Date().getTime(), - }); + let snapshotId = await makeSnapshot(); return { restore: async function () { await promisify(web3.currentProvider.send.bind(web3.currentProvider))({ jsonrpc: '2.0', method: 'evm_revert', - params: [snapshotData.result], + params: [snapshotId], id: new Date().getTime(), }); + snapshotId = await makeSnapshot(); }, }; }; diff --git a/test/src/snapshot.test.js b/test/src/snapshot.test.js index 0316dfe..91cf7b0 100644 --- a/test/src/snapshot.test.js +++ b/test/src/snapshot.test.js @@ -28,10 +28,22 @@ describe('snapshot', function () { }); contract('reverting transactions', function ([sender, receiver]) { - it('returns a snapshot object with restore method restoring previous ether balances', async function () { + it('restores previous balances on revert', async function () { const snapshotA = await snapshot(); const tracker = await balance.tracker(receiver); - await tracker.get(); + await send.ether(sender, receiver, ether('1')); + expect(await tracker.delta()).to.be.bignumber.equal(ether('1')); + await snapshotA.restore(); + expect(await tracker.delta()).to.be.bignumber.equal(ether('-1')); + }); + + it('can revert twice', async function () { + const snapshotA = await snapshot(); + const tracker = await balance.tracker(receiver); + await send.ether(sender, receiver, ether('1')); + expect(await tracker.delta()).to.be.bignumber.equal(ether('1')); + await snapshotA.restore(); + expect(await tracker.delta()).to.be.bignumber.equal(ether('-1')); await send.ether(sender, receiver, ether('1')); expect(await tracker.delta()).to.be.bignumber.equal(ether('1')); await snapshotA.restore();