arnaucube
arnaucube/poseidon-solidity-examplePublic Self-hosted repository
poseidon-solidity-example/lib/forge-std/src/StdMath.sol
lib/forge-std/src/StdMath.solRaw
 1// SPDX-License-Identifier: MIT
 2pragma solidity >=0.6.2 <0.9.0;
 3
 4library stdMath {
 5    int256 private constant INT256_MIN = -57896044618658097711785492504343953926634992332820282019728792003956564819968;
 6
 7    function abs(int256 a) internal pure returns (uint256) {
 8        // Required or it will fail when `a = type(int256).min`
 9        if (a == INT256_MIN) {
10            return 57896044618658097711785492504343953926634992332820282019728792003956564819968;
11        }
12
13        return uint256(a > 0 ? a : -a);
14    }
15
16    function delta(uint256 a, uint256 b) internal pure returns (uint256) {
17        return a > b ? a - b : b - a;
18    }
19
20    function delta(int256 a, int256 b) internal pure returns (uint256) {
21        // a and b are of the same sign
22        // this works thanks to two's complement, the left-most bit is the sign bit
23        if ((a ^ b) > -1) {
24            return delta(abs(a), abs(b));
25        }
26
27        // a and b are of opposite signs
28        return abs(a) + abs(b);
29    }
30
31    function percentDelta(uint256 a, uint256 b) internal pure returns (uint256) {
32        uint256 absDelta = delta(a, b);
33
34        return absDelta * 1e18 / b;
35    }
36
37    function percentDelta(int256 a, int256 b) internal pure returns (uint256) {
38        uint256 absDelta = delta(a, b);
39        uint256 absB = abs(b);
40
41        return absDelta * 1e18 / absB;
42    }
43}