diff --git a/debug.sh b/debug.sh index f09e41d..55a2636 100755 --- a/debug.sh +++ b/debug.sh @@ -7,7 +7,7 @@ fi verify_arg="" extra_argument="" -op_command="" +op_command="op run --env-file="./.env" --" for arg in "$@"; do case $arg in @@ -36,4 +36,4 @@ echo Value: ${VALUE} echo Calldata: cast pretty-calldata ${CALLDATA} calldata=$(cast calldata 'trace(uint256,address,address,uint256,bytes)' ${BLOCK} ${FROM} ${TO} ${VALUE} ${CALLDATA}) -${op_command} forge script ${verify_arg} --legacy ${@} script/OnchainDebugger.s.sol --sig 'run(bytes,string)' ${calldata} "${extra_argument}" +${op_command} forge script ${verify_arg} --legacy ${@} OnchainDebugger --sig 'run(bytes,string)' ${calldata} "${extra_argument}" diff --git a/script/BaseMigration.s.sol b/script/BaseMigration.s.sol index 5466b23..888d369 100644 --- a/script/BaseMigration.s.sol +++ b/script/BaseMigration.s.sol @@ -9,6 +9,7 @@ import { import { LibString } from "../lib/solady/src/utils/LibString.sol"; import { console, LibSharedAddress, StdStyle, IScriptExtended, ScriptExtended } from "./extensions/ScriptExtended.s.sol"; import { IArtifactFactory, ArtifactFactory } from "./ArtifactFactory.sol"; +import { OnchainDebugger } from "./OnchainDebugger.s.sol"; // cheat to load artifact to parent `out` directory import { IMigrationScript } from "./interfaces/IMigrationScript.sol"; import { LibProxy } from "./libraries/LibProxy.sol"; import { DefaultContract } from "./utils/DefaultContract.sol"; diff --git a/script/extensions/ScriptExtended.s.sol b/script/extensions/ScriptExtended.s.sol index a67be98..052e091 100644 --- a/script/extensions/ScriptExtended.s.sol +++ b/script/extensions/ScriptExtended.s.sol @@ -20,7 +20,7 @@ abstract contract ScriptExtended is Script, StdAssertions, IScriptExtended { console.log("> ", StdStyle.blue(fnName), "..."); _; } - + modifier onlyOn(TNetwork networkType) { require(network() == networkType, string.concat("ScriptExtended: Only allowed on ", CONFIG.getAlias(networkType))); _; @@ -33,10 +33,13 @@ abstract contract ScriptExtended is Script, StdAssertions, IScriptExtended { function _configByteCode() internal virtual returns (bytes memory); + function _postCheck() internal virtual { } + function run(bytes calldata callData, string calldata command) public virtual { CONFIG.resolveCommand(command); (bool success, bytes memory data) = address(this).delegatecall(callData); success.handleRevert(msg.sig, data); + _postCheck(); } function network() public view virtual returns (TNetwork) { diff --git a/src/WNT.sol b/src/WNT.sol index 28cb8ce..6331eaf 100644 --- a/src/WNT.sol +++ b/src/WNT.sol @@ -3,7 +3,7 @@ pragma solidity ^0.8.17; import { ERC20 } from "../lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; import { IWNT } from "./interfaces/IWNT.sol"; -import { LibNativeTransfer } from "./libraries/LibNativeTransfer.sol"; +import { LibNativeTransfer } from "contract-libs/transfers/LibNativeTransfer.sol"; /// @notice Minimalist and modern Wrapped Ether implementation. /// @author Solmate diff --git a/src/libraries/LibErrorHandler.sol b/src/libraries/LibErrorHandler.sol deleted file mode 100644 index 8202fca..0000000 --- a/src/libraries/LibErrorHandler.sol +++ /dev/null @@ -1,40 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.19; - -library LibErrorHandler { - /// @dev Reserves error definition to upload to signature database. - error ExternalCallFailed(bytes4 msgSig, bytes4 callSig); - - /// @notice handle low level call revert if call failed, - /// If extcall return empty bytes, reverts with custom error. - /// @param status Status of external call - /// @param callSig function signature of the calldata - /// @param returnOrRevertData bytes result from external call - function handleRevert(bool status, bytes4 callSig, bytes memory returnOrRevertData) internal pure { - // Get the function signature of current context - bytes4 msgSig = msg.sig; - assembly ("memory-safe") { - if iszero(status) { - // Load the length of bytes array - let revertLength := mload(returnOrRevertData) - // Check if length != 0 => revert following reason from external call - if iszero(iszero(revertLength)) { - // Start of revert data bytes. The 0x20 offset is always the same. - revert(add(returnOrRevertData, 0x20), revertLength) - } - - // Load free memory pointer - let ptr := mload(0x40) - // Store 4 bytes the function selector of ExternalCallFailed(msg.sig, callSig) - // Equivalent to revert ExternalCallFailed(bytes4,bytes4) - mstore(ptr, 0x49bf4104) - // Store 4 bytes of msgSig parameter in the next slot - mstore(add(ptr, 0x20), msgSig) - // Store 4 bytes of callSig parameter in the next slot - mstore(add(ptr, 0x40), callSig) - // Revert 68 bytes of error starting from 0x1c - revert(add(ptr, 0x1c), 0x44) - } - } - } -} diff --git a/src/libraries/LibNativeTransfer.sol b/src/libraries/LibNativeTransfer.sol deleted file mode 100644 index 6e5a330..0000000 --- a/src/libraries/LibNativeTransfer.sol +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -import { LibErrorHandler } from "./LibErrorHandler.sol"; - -/** - * @title NativeTransferHelper - */ -library LibNativeTransfer { - using LibErrorHandler for bool; - - /** - * @dev Transfers Native Coin and wraps result for the method caller to a recipient. - */ - function transfer(address to, uint256 value, uint256 gasAmount) internal { - (bool success, bytes memory returnOrRevertData) = trySendValue(to, value, gasAmount); - success.handleRevert(bytes4(0x0), returnOrRevertData); - } - - /** - * @dev Unsafe send `amount` Native to the address `to`. If the sender's balance is insufficient, - * the call does not revert. - * - * Note: - * - Does not assert whether the balance of sender is sufficient. - * - Does not assert whether the recipient accepts NATIVE. - * - Consider using `ReentrancyGuard` before calling this function. - * - */ - function trySendValue(address to, uint256 value, uint256 gasAmount) - internal - returns (bool success, bytes memory returnOrRevertData) - { - (success, returnOrRevertData) = to.call{ value: value, gas: gasAmount }(""); - } -}