Skip to content

Constraint based pricing gas dimension trace tests #344

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,23 @@ cache_path = 'forge-cache/yul'
remappings = []
auto_detect_remappings = false

[profile.gas-dimensions]
src = 'gas-dimensions/src'
test = 'gas-dimensions/test'
script = 'gas-dimeinsions/script'
out = 'out/gas-dimensions'
libs = ['lib']
cache_path = 'forge-cache/gas-dimensions'
optimizer = false
yul_optimizer = false
via_ir = false
evm_version = 'cancun'
remappings = ['ds-test/=lib/forge-std/lib/ds-test/src/',
'forge-std/=lib/forge-std/src/']
fs_permissions = [{ access = "read", path = "./"}]
include_paths = ['gas-dimensions/src/', 'gas-dimensions/scripts']
auto_detect_remappings = false

[fmt]
line_length = 100
tab_width = 4
Expand Down
13 changes: 13 additions & 0 deletions gas-dimensions/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# Gas Dimension Test Contracts

This folder contains smart contracts that force various types of opcodes to run in different configurations. This is used to test gas accounting across multiple gas dimensions, e.g. computation, state read/write, storage growth, etc.

# Scripts for Debugging

The scripts for running the contracts are intended to be used with forge script, e.g.

```bash
forge script gas-dimensions/scripts/Sstore.s.sol -vvvvv --private-key "nitro.dev.node.private.key.here" --slow --broadcast --rpc-url http://127.0.0.1:8547 --priority-gas-price "1000000000" --with-gas-price "2000000000" -g "10000" --chain-id "412346"
```

These scripts can be helpful when manually debugging the code in `gas-dimensions/src/` against a local dev node.
18 changes: 18 additions & 0 deletions gas-dimensions/scripts/Balance.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe, console} from "forge-std/Script.sol";
import {Balance} from "../src//Balance.sol";

contract BalanceScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));
payable(address(0xdeadbeef)).transfer(1000000000000000000);
Balance balance = new Balance();
balance.callBalanceCold();
balance.callBalanceWarm();
vm.stopBroadcast();
}
}
46 changes: 46 additions & 0 deletions gas-dimensions/scripts/Call.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe, console} from "forge-std/Script.sol";
import {Caller, Callee} from "../src/Call.sol";

contract CallTestScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));

Callee callee1 = new Callee();
Callee callee2 = new Callee();
Callee callee3 = new Callee();
Callee callee4 = new Callee();
Caller caller = new Caller();
payable(caller).transfer(1 ether);

// five axes:
// warm / cold
// target has code / target has no code
// target funded / not funded
// sending money with the call / no transfer
// memory expansion / memory unchanged

// 1. warm + target has code + target not funded + zero value + memory unchanged
caller.warmNoTransferMemUnchanged(address(callee1));
// 2. warm + target has code + target not funded + positive value + memory unchanged
caller.warmPayableMemUnchanged(address(callee2));
// 3. warm + target has no code + zero value
caller.warmNoTransferMemExpansion(address(0xbeef));
// 4. warm + target has no code + positive value
caller.warmPayableMemExpansion(address(0xbeef));
// 5. cold + target has code + zero value
caller.coldNoTransferMemUnchanged(address(callee3));
// 6. cold + target has code + positive value
caller.coldPayableMemUnchanged(address(callee4));
// 7. cold + target has no code + zero value
caller.coldNoTransferMemExpansion(address(0xbeef));
// 8. cold + target has no code + positive value
caller.coldPayableMemExpansion(address(0xbeef));

vm.stopBroadcast();
}
}
31 changes: 31 additions & 0 deletions gas-dimensions/scripts/Counter.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe, console} from "forge-std/Script.sol";
import {Counter} from "../src/Counter.sol";
import {Cloner} from "../src/Cloner.sol";

contract CounterScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));
Counter counterImpl = new Counter();
console.log("counterImpl", address(counterImpl));
Cloner cloner = new Cloner(address(counterImpl));
console.log("cloner", address(cloner));

address counter1Addr = cloner.createCounter();
address counter2Addr = cloner.create2Counter(bytes32(uint256(1)));

console.log("counter1 addr", counter1Addr);
console.log("counter2 addr", counter2Addr);

Counter counter1 = Counter(counter1Addr);
counter1.setNumber(1);
console.log("counter1 set number", counter1.number(), " on ", counter1Addr);
counter1.increment();
console.log("counter1 incremented", counter1.number(), " on ", counter1Addr);
vm.stopBroadcast();
}
}
31 changes: 31 additions & 0 deletions gas-dimensions/scripts/Create.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe, console} from "forge-std/Script.sol";
import {Creator, Createe} from "../src/Create.sol";
import {CreatorTwo} from "../src/Create2.sol";

contract CreateTestScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));
Creator creator = new Creator();
payable(address(creator)).transfer(1 ether);
CreatorTwo creator2 = new CreatorTwo();
payable(address(creator2)).transfer(1 ether);
address createe = creator.createNoTransferMemUnchanged();
console.log("createe", createe);
address createe2 = creator2.createTwoNoTransferMemUnchanged(bytes32(uint256(0x1337)));
console.log("createe2", createe2);
address createe3 = creator.createPayableMemUnchanged();
console.log("createe3", createe3);
address createe4 = creator2.createTwoPayableMemUnchanged(bytes32(uint256(0x1339)));
console.log("createe4", createe4);
creator.createNoTransferMemExpansion();
creator2.createTwoNoTransferMemExpansion(bytes32(uint256(0x1339)));
creator.createPayableMemExpansion();
creator2.createTwoPayableMemExpansion(bytes32(uint256(0x1339)));
vm.stopBroadcast();
}
}
31 changes: 31 additions & 0 deletions gas-dimensions/scripts/DelegateCall.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe, console} from "forge-std/Script.sol";
import {DelegateCaller, DelegateCallee} from "../src//DelegateCall.sol";

contract DelegateCallTestScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));
DelegateCallee callee = new DelegateCallee();
DelegateCaller caller = new DelegateCaller();
// this should be warm, to a contract with code
caller.testDelegateCallNonEmptyWarm(address(callee));
// this should be cold, to a contract with code
caller.testDelegateCallNonEmptyCold(address(callee));
// this should be cold, to a contract with no code
caller.testDelegateCallEmptyCold(address(0xbeef));
// this should be warm to a contract with no code
caller.testDelegateCallEmptyWarm(address(0xbeef));

// trigger memory expansion
caller.testDelegateCallEmptyWarmMemExpansion(address(0xbeef));
caller.testDelegateCallNonEmptyWarmMemExpansion(address(callee));
caller.testDelegateCallEmptyColdMemExpansion(address(0xbeef));
caller.testDelegateCallNonEmptyColdMemExpansion(address(callee));

vm.stopBroadcast();
}
}
20 changes: 20 additions & 0 deletions gas-dimensions/scripts/ExtCodeCopy.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe} from "forge-std/Script.sol";
import {Counter} from "../src/Counter.sol";
import {ExtCodeCopy} from "../src/ExtCodeCopy.sol";

contract ExtCodeCopyScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));
ExtCodeCopy extCodeCopy = new ExtCodeCopy();
extCodeCopy.extCodeCopyWarmNoMemExpansion();
extCodeCopy.extCodeCopyColdNoMemExpansion();
extCodeCopy.extCodeCopyWarmMemExpansion();
extCodeCopy.extCodeCopyColdMemExpansion();
vm.stopBroadcast();
}
}
17 changes: 17 additions & 0 deletions gas-dimensions/scripts/ExtCodeSize.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe} from "forge-std/Script.sol";
import {ExtCodeSize} from "../src/ExtCodeSize.sol";

contract ExtCodeSizeScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));
ExtCodeSize extCodeSize = new ExtCodeSize();
extCodeSize.getExtCodeSizeCold();
extCodeSize.getExtCodeSizeWarm();
vm.stopBroadcast();
}
}
17 changes: 17 additions & 0 deletions gas-dimensions/scripts/GetSlotKey.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe, console} from "forge-std/Script.sol";
import {CounterArray} from "../src/CounterArray.sol";

contract GetSlotKeyScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));
CounterArray counterArray = CounterArray(0xA6E41fFD769491a42A6e5Ce453259b93983a22EF);
bytes32 slotKey = counterArray.getSlotKey(3);
console.logBytes32(slotKey);
vm.stopBroadcast();
}
}
17 changes: 17 additions & 0 deletions gas-dimensions/scripts/Increment.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe, console} from "forge-std/Script.sol";
import {Counter} from "../src/Counter.sol";

contract IncrementScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));
Counter counter = new Counter();
counter.increment();
console.log("counter", counter.number());
vm.stopBroadcast();
}
}
30 changes: 30 additions & 0 deletions gas-dimensions/scripts/LogEmitter.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe, console} from "forge-std/Script.sol";
import {LogEmitter} from "../src/LogEmitter.sol";

contract IncrementScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));
LogEmitter logEmitter = new LogEmitter();
logEmitter.emitZeroTopicEmptyData();
logEmitter.emitZeroTopicNonEmptyData();
logEmitter.emitOneTopicEmptyData();
logEmitter.emitOneTopicNonEmptyData();
logEmitter.emitTwoTopics();
logEmitter.emitTwoTopicsExtraData();
logEmitter.emitThreeTopics();
logEmitter.emitThreeTopicsExtraData();
logEmitter.emitFourTopics();
logEmitter.emitFourTopicsExtraData();
logEmitter.emitZeroTopicNonEmptyDataAndMemExpansion();
logEmitter.emitOneTopicNonEmptyDataAndMemExpansion();
logEmitter.emitTwoTopicsExtraDataAndMemExpansion();
logEmitter.emitThreeTopicsExtraDataAndMemExpansion();
logEmitter.emitFourTopicsExtraDataAndMemExpansion();
vm.stopBroadcast();
}
}
16 changes: 16 additions & 0 deletions gas-dimensions/scripts/NoSpecials.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe, console} from "forge-std/Script.sol";
import {Counter} from "../src/Counter.sol";

contract NoSpecialsScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));
Counter counter = new Counter();
counter.noSpecials();
vm.stopBroadcast();
}
}
16 changes: 16 additions & 0 deletions gas-dimensions/scripts/OutOfGas.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe, console} from "forge-std/Script.sol";
import {OutOfGas} from "../src/OutOfGas.sol";

contract OutOfGasScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));
OutOfGas outOfGas = new OutOfGas();
outOfGas.callOutOfGas();
vm.stopBroadcast();
}
}
18 changes: 18 additions & 0 deletions gas-dimensions/scripts/RefundFromCalldata.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe, console} from "forge-std/Script.sol";
import {CounterArray} from "../src//CounterArray.sol";

contract RefundFromCalldataScript is Script {
function setUp() public {}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));

bytes32 slotKey = 0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e566;
CounterArray counterArray = CounterArray(0xA6E41fFD769491a42A6e5Ce453259b93983a22EF);
counterArray.refundFromCalldata(slotKey);
vm.stopBroadcast();
}
}
24 changes: 24 additions & 0 deletions gas-dimensions/scripts/Refunder.s.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.13;

import {Script, VmSafe, console} from "forge-std/Script.sol";
import {CounterArray} from "../src/CounterArray.sol";

contract RefunderScript is Script {
CounterArray public counterArray;

function setUp() public {
counterArray = new CounterArray();
uint256[] memory counters = new uint256[](20);
for (uint256 i = 0; i < 20; i++) {
counters[i] = i + 1;
}
counterArray.setCounters(counters);
}

function run() public {
vm.startBroadcast(address(0x3f1Eae7D46d88F08fc2F8ed27FCb2AB183EB2d0E));
counterArray.refunder();
vm.stopBroadcast();
}
}
Loading
Loading