Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/pilagod/balance-snapshot
A Solidity library to improve balance change check in Foundry tests.
https://github.com/pilagod/balance-snapshot
Last synced: 11 days ago
JSON representation
A Solidity library to improve balance change check in Foundry tests.
- Host: GitHub
- URL: https://github.com/pilagod/balance-snapshot
- Owner: pilagod
- License: mit
- Created: 2023-07-04T03:38:46.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2024-07-18T01:48:29.000Z (6 months ago)
- Last Synced: 2024-11-18T20:48:48.787Z (about 2 months ago)
- Language: Solidity
- Size: 15.6 KB
- Stars: 3
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-foundry - balance-snapshot - A Solidity library to improve balance change check in Foundry tests. (Templates & Libraries)
README
# balance-snapshot [![Mentioned in Awesome Foundry](https://awesome.re/mentioned-badge.svg)](https://github.com/crisgarner/awesome-foundry) ![Build Status](https://github.com/pilagod/balance-snapshot/actions/workflows/test.yml/badge.svg)
A Solidity library to improve balance change check in Foundry tests.
## Installation
```bash
$ forge install pilagod/balance-snapshot
```## Usage
This library supports both ETH and token balance snapshot. Let's look at a quick example:
```solidity
import { Test } from "forge-std/Test.sol";
import { ERC20 } from "openzeppelin/token/ERC20/ERC20.sol";import { BalanceSnapshot, BalanceSnapshotLib } from "balance-snapshot/BalanceSnapshot.sol";
contract ContractTest is Test {
using BalanceSnapshotLib for BalanceSnapshot;function testTransferToken() public {
address token = address(new ERC20("TKN", "TKN"));address sender = address(1);
address recipient = address(2);// Deal 100 token to sender
deal(token, sender, 100);BalanceSnapshot storage snapshot = BalanceSnapshotLib.take(
[sender, recipient],
[address(token)]
);// Transfer 100 token from sender to recipient
vm.prank(sender);
ERC20(token).transfer(recipient, 100);// Sender token balance should decrease by 100
snapshot.assertDecrEq(sender, token, 100);// Recipient token balance should increase by 100
snapshot.assertIncrEq(recipient, token, 100);
}function testTransferETH() public {
address sender = address(1);
address recipient = address(2);// Deal 100 wei to sender
deal(sender, 100);BalanceSnapshot storage snapshot = BalanceSnapshotLib.take(
[sender, recipient],
[BalanceSnapshotLib.ETH]
);// Transfer 100 wei from sender to recipient
vm.prank(sender);
payable(recipient).transfer(100);// Sender ETH balance should decrease by 100 wei
snapshot.assertDecrEq(sender, BalanceSnapshotLib.ETH, 100);// Recipient ETH balance should increase by 100 wei
snapshot.assertIncrEq(recipient, BalanceSnapshotLib.ETH, 100);
}
}
```Please refer to [BalanceSnapshot.t.sol](https://github.com/pilagod/balance-snapshot/blob/main/test/BalanceSnapshot.t.sol) for more usages.
## API
```solidity
library BalanceSnapshotLib {
/// @notice Take owners' token balance snapshot.
/// @dev It supports 8 owners * 8 tokens by overloading (64 cases in total).
/// Developer can easily construct snapshot owners and tokens by array syntax, like:
///
/// BalanceSnapshotLib.take(
/// [o1, o2, o3],
/// [t1, t2]
/// );
///
function take(
address[{1-8}] memory owners,
address[{1-8}] memory tokens
) internal returns (BalanceSnapshot storage);/// @notice Assert owner's token balance increases by exact `change` amount.
function assertIncrEq(
BalanceSnapshot storage snapshot,
address owner,
address token,
uint256 change
) internal view;/// @notice Assert owner's token balance increases by greater than `change` amount.
function assertIncrGt(
BalanceSnapshot storage snapshot,
address owner,
address token,
uint256 change
) internal view;/// @notice Assert owner's token balance increases by less than `change` amount.
function assertIncrLt(
BalanceSnapshot storage snapshot,
address owner,
address token,
uint256 change
) internal view;/// @notice Assert owner's token balance decreases by exact `change` amount.
function assertDecrEq(
BalanceSnapshot storage snapshot,
address owner,
address token,
uint256 change
) internal view;/// @notice Assert owner's token balance decreases by greater than `change` amount.
function assertDecrGt(
BalanceSnapshot storage snapshot,
address owner,
address token,
uint256 change
) internal view;/// @notice Assert owner's token balance decreases by less than `change` amount.
function assertDecrLt(
BalanceSnapshot storage snapshot,
address owner,
address token,
uint256 change
) internal view;
}
```## License
© Cyan Ho (pilagod), 2023-NOW
Released under the [MIT License](https://github.com/pilagod/balance-snapshot/blob/main/LICENSE)