Skip to content

Commit

Permalink
format: reduce complex code
Browse files Browse the repository at this point in the history
  • Loading branch information
TuDo1403 committed Nov 20, 2023
1 parent 058bb26 commit 30b5cf6
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 47 deletions.
34 changes: 2 additions & 32 deletions src/transfers/LibNativeTransfer.sol
Original file line number Diff line number Diff line change
@@ -1,49 +1,19 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";
import { LibErrorHandler } from "../LibErrorHandler.sol";

using { toAmount } for Gas global;

enum Gas {
Strictly,
NoGriefing,
ForwardAll,
NoStorageWrite
}

/// @dev see: https://github.com/axieinfinity/ronin-dpos-contracts/pull/195
uint256 constant GAS_STIPEND_STRICT = 0;

/// @dev Suggested gas stipend for contract receiving NATIVE
/// that disallows any storage writes.
uint256 constant GAS_STIPEND_NO_STORAGE_WRITES = 2_300;

/// @dev Suggested gas stipend for contract receiving NATIVE to perform a few
/// storage reads and writes, but low enough to prevent griefing.
/// Multiply by a small constant (e.g. 2), if needed.
uint256 constant GAS_STIPEND_NO_GRIEF = 100_000;

function toAmount(Gas gas) view returns (uint256) {
if (gas == Gas.ForwardAll) return gasleft();
if (gas == Gas.NoGriefing) return GAS_STIPEND_NO_GRIEF;
if (gas == Gas.NoStorageWrite) return GAS_STIPEND_NO_STORAGE_WRITES;
return GAS_STIPEND_STRICT;
}

/**
* @title NativeTransferHelper
*/
library LibNativeTransfer {
using Strings for *;
using LibErrorHandler for bool;

/**
* @dev Transfers Native Coin and wraps result for the method caller to a recipient.
*/
function safeTransfer(address to, uint256 value, Gas gas) internal {
(bool success, bytes memory returnOrRevertData) = trySendValue(to, value, gas.toAmount());
function transfer(address to, uint256 value, uint256 gasAmount) internal {
(bool success, bytes memory returnOrRevertData) = trySendValue(to, value, gasAmount);
success.handleRevert(bytes4(0x0), returnOrRevertData);
}

Expand Down
22 changes: 7 additions & 15 deletions test/transfers/LibNativeTransfer.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,40 +2,32 @@
pragma solidity ^0.8.23;

import { Test } from "forge-std/Test.sol";
import { Gas, LibNativeTransfer } from "contract-libs/transfers/LibNativeTransfer.sol";
import { LibNativeTransfer } from "contract-libs/transfers/LibNativeTransfer.sol";

contract LibNativeTransferTest is Test {
function testFork_RevertWhen_TransferNativeToContractWithoutFallback_safeTransfer(
address any,
uint256 amount,
uint8 v
uint256 gas
) external {
vm.deal(any, amount);
vm.expectRevert();
vm.prank(any);
LibNativeTransfer.safeTransfer(address(this), amount, _toGas(v));
LibNativeTransfer.transfer(address(this), amount, gas);
}

function testConcrete_TransferNative(uint8 v) external {
LibNativeTransfer.safeTransfer(address(0xBEEF), 1e18, _toGas(v));
function testConcrete_TransferNative(uint256 gas) external {
LibNativeTransfer.transfer(address(0xBEEF), 1e18, gas);
assertEq(address(0xBEEF).balance, 1e18);
}

function testFork_TransferNativeToRecipient(address recipient, uint256 amount, uint8 v) external {
function testFork_TransferNativeToRecipient(address recipient, uint256 amount, uint256 gas) external {
// Transferring to msg.sender can fail because it's possible to overflow their ETH balance as it begins non-zero.
if (recipient.code.length > 0 || uint256(uint160(recipient)) <= 18 || recipient == msg.sender) return;

amount = bound(amount, 0, address(this).balance);
LibNativeTransfer.safeTransfer(recipient, amount, _toGas(v));
LibNativeTransfer.transfer(recipient, amount, gas);

assertEq(recipient.balance, amount);
}

function _toGas(uint8 v) internal view returns (Gas gas) {
v = uint8(bound(v, 0, 3));
if (v == uint8(Gas.Strictly)) gas = Gas.Strictly;
if (v == uint8(Gas.NoGriefing)) gas = Gas.NoGriefing;
if (v == uint8(Gas.ForwardAll)) gas = Gas.ForwardAll;
if (v == uint8(Gas.NoStorageWrite)) gas = Gas.NoStorageWrite;
}
}

0 comments on commit 30b5cf6

Please sign in to comment.