Skip to content

Commit e265b49

Browse files
committed
improve formatting and add test examples
1 parent f029c93 commit e265b49

File tree

4 files changed

+51
-67
lines changed

4 files changed

+51
-67
lines changed

src/backtesting/CredibleTestWithBacktesting.sol

Lines changed: 42 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,7 @@ import {BacktestingUtils} from "./BacktestingUtils.sol";
1313
abstract contract CredibleTestWithBacktesting is CredibleTest, Test {
1414
using Strings for uint256;
1515

16-
/// @notice Execute backtesting with simple interface
17-
/// @param targetContract Contract to test assertions against
18-
/// @param endBlock Latest block to test (works backwards)
19-
/// @param blockRange Number of blocks to test
20-
/// @param assertionCreationCode Bytecode for assertion contract
21-
/// @param assertionSelector Function selector to trigger
22-
/// @param rpcUrl RPC URL for blockchain access
23-
/// @return results Detailed backtesting results with error categorization
16+
/// @notice Execute backtesting with detailed logging
2417
function executeBacktest(
2518
address targetContract,
2619
uint256 endBlock,
@@ -29,26 +22,18 @@ abstract contract CredibleTestWithBacktesting is CredibleTest, Test {
2922
bytes4 assertionSelector,
3023
string memory rpcUrl
3124
) public returns (BacktestingTypes.BacktestingResults memory results) {
32-
// Log configuration at the start
33-
console.log("=== BACKTESTING CONFIGURATION ===");
34-
console.log(string.concat("Target contract: ", Strings.toHexString(targetContract)));
35-
console.log(
36-
string.concat(
37-
"Block range: ",
38-
(endBlock > blockRange ? endBlock - blockRange + 1 : 1).toString(),
39-
" to ",
40-
endBlock.toString()
41-
)
42-
);
43-
console.log(string.concat("Assertion selector: ", Strings.toHexString(uint32(assertionSelector), 4)));
44-
console.log(string.concat("RPC URL: ", rpcUrl));
45-
console.log("=================================");
46-
47-
console.log("=== BACKTESTING START ===");
48-
console.log(string.concat("Target contract: ", Strings.toHexString(targetContract)));
49-
5025
uint256 startBlock = endBlock > blockRange ? endBlock - blockRange + 1 : 1;
51-
console.log(string.concat("Block range: ", startBlock.toString(), " to ", endBlock.toString()));
26+
27+
// Print configuration at the start
28+
console.log("==========================================");
29+
console.log(" BACKTESTING CONFIGURATION");
30+
console.log("==========================================");
31+
console.log(string.concat("Target Contract: ", Strings.toHexString(targetContract)));
32+
console.log(string.concat("Block Range: ", startBlock.toString(), " to ", endBlock.toString()));
33+
console.log(string.concat("Assertion Selector: ", Strings.toHexString(uint32(assertionSelector), 4)));
34+
console.log(string.concat("RPC URL: ", rpcUrl));
35+
console.log("==========================================");
36+
console.log("");
5237

5338
BacktestingTypes.TransactionData[] memory transactions =
5439
_fetchTransactions(targetContract, startBlock, endBlock, rpcUrl);
@@ -62,26 +47,27 @@ abstract contract CredibleTestWithBacktesting is CredibleTest, Test {
6247
}
6348

6449
for (uint256 i = 0; i < transactions.length; i++) {
50+
// Print transaction start marker
51+
console.log("");
52+
console.log(string.concat("=== TRANSACTION ", (i + 1).toString(), " ==="));
53+
console.log(string.concat("Hash: ", BacktestingUtils.bytes32ToHex(transactions[i].hash)));
54+
console.log(string.concat("Function: ", BacktestingUtils.extractFunctionSelector(transactions[i].data)));
55+
console.log("---");
56+
6557
BacktestingTypes.ValidationDetails memory validation =
6658
_validateTransaction(targetContract, assertionCreationCode, assertionSelector, rpcUrl, transactions[i]);
6759

6860
if (validation.result == BacktestingTypes.ValidationResult.Success) {
6961
results.successfulValidations++;
70-
console.log(
71-
string.concat(
72-
"[PASS] TX ",
73-
(i + 1).toString(),
74-
" ",
75-
BacktestingUtils.bytes32ToHex(transactions[i].hash),
76-
" ",
77-
BacktestingUtils.extractFunctionSelector(transactions[i].data)
78-
)
79-
);
62+
console.log("[PASS] VALIDATION PASSED");
8063
} else {
8164
results.failedValidations++;
8265
_categorizeAndLogError(i, transactions[i], validation);
8366
_incrementErrorCounter(results, validation.result);
8467
}
68+
69+
// Print transaction end marker
70+
console.log("---");
8571
}
8672

8773
_printDetailedResults(startBlock, endBlock, results);
@@ -220,25 +206,14 @@ abstract contract CredibleTestWithBacktesting is CredibleTest, Test {
220206
BacktestingTypes.ValidationDetails memory validation
221207
) private pure {
222208
string memory errorType = _getErrorTypeString(validation.result);
223-
console.log(
224-
string.concat(
225-
"[",
226-
errorType,
227-
"] TX ",
228-
(txIndex + 1).toString(),
229-
" ",
230-
BacktestingUtils.bytes32ToHex(txData.hash),
231-
" ",
232-
BacktestingUtils.extractFunctionSelector(txData.data)
233-
)
234-
);
209+
console.log(string.concat("[", errorType, "] VALIDATION FAILED"));
235210

236211
if (bytes(validation.errorMessage).length > 0) {
237212
console.log(string.concat(" Error: ", validation.errorMessage));
238213
}
239214

240215
if (validation.isProtocolViolation) {
241-
console.log(" !!! PROTOCOL VIOLATION DETECTED");
216+
console.log(" !!! PROTOCOL VIOLATION DETECTED !!!");
242217
}
243218
}
244219

@@ -283,20 +258,27 @@ abstract contract CredibleTestWithBacktesting is CredibleTest, Test {
283258
BacktestingTypes.BacktestingResults memory results
284259
) private pure {
285260
console.log("");
286-
console.log("=== DETAILED BACKTESTING RESULTS ===");
261+
console.log("==========================================");
262+
console.log(" BACKTESTING SUMMARY");
263+
console.log("==========================================");
287264
console.log(string.concat("Block Range: ", startBlock.toString(), " - ", endBlock.toString()));
288265
console.log(string.concat("Total Transactions: ", results.totalTransactions.toString()));
289266
console.log(string.concat("Successful Validations: ", results.successfulValidations.toString()));
290267
console.log(string.concat("Failed Validations: ", results.failedValidations.toString()));
291-
console.log("");
292-
console.log("=== ERROR BREAKDOWN ===");
293-
console.log(string.concat("Protocol Violations (Assertion Failures): ", results.assertionFailures.toString()));
294-
console.log(string.concat("Transaction Reverts: ", results.transactionReverts.toString()));
295-
console.log(string.concat("Fork Errors: ", results.forkErrors.toString()));
296-
console.log(string.concat("Invalid Transactions: ", results.invalidTransactions.toString()));
297-
console.log(string.concat("Gas Limit Exceeded: ", results.gasLimitExceeded.toString()));
298-
console.log(string.concat("State Mismatches: ", results.stateMismatches.toString()));
299-
console.log(string.concat("Unknown Errors: ", results.unknownErrors.toString()));
268+
269+
if (results.failedValidations > 0) {
270+
console.log("");
271+
console.log("=== ERROR BREAKDOWN ===");
272+
console.log(
273+
string.concat("Protocol Violations (Assertion Failures): ", results.assertionFailures.toString())
274+
);
275+
console.log(string.concat("Transaction Reverts: ", results.transactionReverts.toString()));
276+
console.log(string.concat("Fork Errors: ", results.forkErrors.toString()));
277+
console.log(string.concat("Invalid Transactions: ", results.invalidTransactions.toString()));
278+
console.log(string.concat("Gas Limit Exceeded: ", results.gasLimitExceeded.toString()));
279+
console.log(string.concat("State Mismatches: ", results.stateMismatches.toString()));
280+
console.log(string.concat("Unknown Errors: ", results.unknownErrors.toString()));
281+
}
300282
console.log("");
301283

302284
uint256 successRate =

src/backtesting/README.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ Backtesting functionality for credible-std that allows you to test assertions ag
66

77
The backtesting module provides a simple interface to validate assertions against real blockchain transactions.
88

9+
## Performance
10+
11+
100 blocks with a total of 175 transactions takes around 50 seconds to run.
12+
913
## Quick Start
1014

1115
```solidity
@@ -174,11 +178,11 @@ The backtesting system provides this error categorization:
174178

175179
```
176180
src/backtesting/
177-
├── BacktestingTypes.sol # Type definitions
178-
├── BacktestingUtils.sol # Utility functions
181+
├── BacktestingTypes.sol # Type definitions
182+
├── BacktestingUtils.sol # Utility functions
179183
├── CredibleTestWithBacktesting.sol # Main backtesting contract
180-
└── README.md # This file
184+
└── README.md # This file
181185
182186
scripts/backtesting/
183-
└── transaction_fetcher.rs # Rust script for transaction fetching
187+
└── transaction_fetcher.rs # Rust script for transaction fetching
184188
```

src/backtesting/test/assertion/src/ERC20Assertion.a.sol

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ contract ERC20Assertion is Assertion {
7272
require(toPostBalance == toPreBalance + amount, "Receiver balance not increased correctly");
7373
}
7474
}
75-
console.log("Transfer invariant reached the end");
7675
}
7776

7877
/// @notice Verifies the transferFrom invariant

src/backtesting/test/assertion/test/UsdcOpSepoliaBacktesting.t.sol

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,7 @@ contract UsdcOpSepoliaBacktestingTest is CredibleTestWithBacktesting {
5050
endBlock: 8925198, // Recent block on mainnet Sepolia
5151
blockRange: 10, // 10 blocks before
5252
assertionCreationCode: type(ERC20Assertion).creationCode,
53-
assertionSelector: ERC20Assertion.assertionTransferInvariant.selector,
54-
rpcUrl: "https://eth-sepolia.g.alchemy.com/v2/cA7wNaynRKdZ96F6sBZTC"
53+
assertionSelector: ERC20Assertion.assertionTransferInvariant.selector
5554
});
5655

5756
// Results are automatically logged

0 commit comments

Comments
 (0)