diff --git a/.gas-profile b/.gas-profile new file mode 100644 index 00000000..9cc7bdee --- /dev/null +++ b/.gas-profile @@ -0,0 +1,16 @@ +new MockERC20: 39792163 +new Payments: 109908523 +setOperatorApproval: 10674805 +createRail: 15093806 +mint: 7360324 +approve: 5547544 +deposit: 24339260 +modifyRailPayment: 18930731 +modifyRailLockup: 20798017 +modifyRailPayment: 24776330 +settleRail: 13521016 +withdraw: 27428591 +withdrawTo: 27519980 +settleRail: 16984893 +terminateRail: 20247937 +burnForFees: 24477208 diff --git a/.gitignore b/.gitignore index 7dbbb77f..07bff374 100644 --- a/.gitignore +++ b/.gitignore @@ -5,6 +5,7 @@ out/ # Ignores development broadcast logs !/broadcast /broadcast/*/31337/ +/broadcast/*/31415926/ /broadcast/**/dry-run/ # Dotenv file diff --git a/tools/Profile.s.sol b/tools/Profile.s.sol new file mode 100644 index 00000000..8b8b81d7 --- /dev/null +++ b/tools/Profile.s.sol @@ -0,0 +1,88 @@ +pragma solidity ^0.8.30; + +import "forge-std/Script.sol"; + +import "../src/Payments.sol"; +import "../test/mocks/MockERC20.sol"; + +contract Profile is Script { + function createRail(address sender) public { + vm.deal(sender, 2000 * 10 ** 18); + + vm.startBroadcast(); + + MockERC20 token = new MockERC20("MockToken", "MOCK"); + + Payments payments = new Payments(); + + address from = sender; + address to = sender; + address operator = sender; + address validator = address(0); + + uint256 commissionRateBps = 0; + address serviceFeeRecipient = sender; + + uint256 rateAllowance = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + uint256 lockupAllowance = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + uint256 maxLockupPeriod = 0x00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff; + + payments.setOperatorApproval(token, operator, true, rateAllowance, lockupAllowance, maxLockupPeriod); + + uint256 railId = payments.createRail(token, from, to, validator, commissionRateBps, serviceFeeRecipient); + + uint256 amount = 10**18; + token.mint(from, amount); + token.approve(address(payments), amount); + payments.deposit(token, from, amount); + + // TODO depositWithPermit + // TODO depositWithPermitAndApproveOperator + // TODO depositWithPermitAndIncreaseOperatorApproval + // TODO increaseOperatorApproval + + + payments.modifyRailPayment(railId, 10**6, 0); + + payments.modifyRailLockup(railId, 5, 10**6); + + payments.modifyRailPayment(railId, 10**3, 10**6); + + payments.settleRail(railId, block.number); + + payments.withdraw(token, 10**6); + + payments.withdrawTo(token, to, 10**6); + } + + function settleRail(address sender, Payments payments, uint256 railId) public { + vm.deal(sender, 2000 * 10 ** 18); + vm.startBroadcast(); + + payments.settleRail(railId, block.number); + } + + function terminateRail(address sender, Payments payments, uint256 railId) public { + vm.deal(sender, 2000 * 10 ** 18); + vm.startBroadcast(); + + payments.terminateRail(railId); + + // TODO settleTerminatedRailWithoutValidation + } + + function endAuction(address sender, Payments payments, uint256 railId) public { + vm.deal(sender, 2000 * 10 ** 18); + + Payments.RailView memory railView = payments.getRail(railId); + IERC20 token = railView.token; + + (uint256 fullAmount,,,) = payments.accounts(token, address(payments)); + + address recipient = address(0x4a6f6B9fF1fc974096f9063a45Fd12bD5B928AD1); + + vm.startBroadcast(); + + payments.burnForFees{value: FIRST_AUCTION_START_PRICE}(token, recipient, fullAmount); + } +} diff --git a/tools/profile.sh b/tools/profile.sh new file mode 100755 index 00000000..8f04c012 --- /dev/null +++ b/tools/profile.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +set -e + +pushd ../localnet +bash ./reset.sh +source ./local_lotus.sh +popd + +TOKEN_ADDRESS=0xe9ae74e0c182aab11bddb483227cc1f6600b3625 +RAIL_ADDRESS=0xf6990c51dc94b36c5d5184bf60107efe99dde592 + +forge script -vvv -g 49400 --broadcast --chain-id $CHAIN_ID --sender $SENDER_ADDRESS --private-key $SENDER_KEY --rpc-url $API_URL/rpc/v1 --sig "createRail(address)" tools/Profile.s.sol:Profile $SENDER_ADDRESS +[[ "$(../forge-script-gas-report/forge_script_block_numbers ./broadcast/Profile.s.sol/$CHAIN_ID/createRail-latest.json | wc -l)" -eq 1 ]] || (echo possible nondeterminism detected && exit 1) +../forge-script-gas-report/forge_script_gas_report ./broadcast/Profile.s.sol/$CHAIN_ID/createRail-latest.json | tee .gas-profile + +forge script -vvv -g 49400 --broadcast --chain-id $CHAIN_ID --sender $SENDER_ADDRESS --private-key $SENDER_KEY --rpc-url $API_URL/rpc/v1 --sig "settleRail(address,address,uint256)" tools/Profile.s.sol:Profile $SENDER_ADDRESS $RAIL_ADDRESS 1 +[[ "$(../forge-script-gas-report/forge_script_block_numbers ./broadcast/Profile.s.sol/$CHAIN_ID/createRail-latest.json | wc -l)" -eq 1 ]] || (echo possible nondeterminism detected && exit 1) +../forge-script-gas-report/forge_script_gas_report ./broadcast/Profile.s.sol/$CHAIN_ID/settleRail-latest.json | tee -a .gas-profile + +forge script -vvv -g 49400 --broadcast --chain-id $CHAIN_ID --sender $SENDER_ADDRESS --private-key $SENDER_KEY --rpc-url $API_URL/rpc/v1 --sig "terminateRail(address,address,uint256)" tools/Profile.s.sol:Profile $SENDER_ADDRESS $RAIL_ADDRESS 1 +[[ "$(../forge-script-gas-report/forge_script_block_numbers ./broadcast/Profile.s.sol/$CHAIN_ID/createRail-latest.json | wc -l)" -eq 1 ]] || (echo possible nondeterminism detected && exit 1) +../forge-script-gas-report/forge_script_gas_report ./broadcast/Profile.s.sol/$CHAIN_ID/terminateRail-latest.json | tee -a .gas-profile + +forge script -vvv -g 49400 --broadcast --chain-id $CHAIN_ID --sender $SENDER_ADDRESS --private-key $SENDER_KEY --rpc-url $API_URL/rpc/v1 --sig "endAuction(address,address,uint256)" tools/Profile.s.sol:Profile $SENDER_ADDRESS $RAIL_ADDRESS 1 +[[ "$(../forge-script-gas-report/forge_script_block_numbers ./broadcast/Profile.s.sol/$CHAIN_ID/createRail-latest.json | wc -l)" -eq 1 ]] || (echo possible nondeterminism detected && exit 1) +../forge-script-gas-report/forge_script_gas_report ./broadcast/Profile.s.sol/$CHAIN_ID/endAuction-latest.json | tee -a .gas-profile diff --git a/tools/retry_profile.sh b/tools/retry_profile.sh new file mode 100755 index 00000000..b1899fd2 --- /dev/null +++ b/tools/retry_profile.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +# retry tools/profile.sh until it succeeds + + +until ./tools/profile.sh ; do {} ; done