Commit dc15caec by github-actions

Transpile 6c977fa6

parent d90e6a79
......@@ -3,6 +3,7 @@
## Unreleased
* `GovernorTimelockControl`: improve the `state()` function to have it reflect cases where a proposal has been canceled directly on the timelock. ([#2977](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2977))
* `Math`: add a `abs(int256)` method that returns the unsigned absolute value of a signed value. ([#2984](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2984))
## Unreleased
......
......@@ -27,5 +27,9 @@ contract MathMockUpgradeable is Initializable {
function ceilDiv(uint256 a, uint256 b) public pure returns (uint256) {
return MathUpgradeable.ceilDiv(a, b);
}
function abs(int256 n) public pure returns (uint256) {
return MathUpgradeable.abs(n);
}
uint256[50] private __gap;
}
......@@ -40,4 +40,14 @@ library MathUpgradeable {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a / b + (a % b == 0 ? 0 : 1);
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}
const { BN, constants } = require('@openzeppelin/test-helpers');
const { expect } = require('chai');
const { MAX_UINT256 } = constants;
const { MAX_UINT256, MAX_INT256, MIN_INT256 } = constants;
const MathMock = artifacts.require('MathMock');
......@@ -85,4 +85,20 @@ contract('Math', function (accounts) {
expect(await this.math.ceilDiv(MAX_UINT256, b)).to.be.bignumber.equal(MAX_UINT256);
});
});
describe('abs', function () {
for (const n of [
MIN_INT256,
MIN_INT256.addn(1),
new BN('-1'),
new BN('0'),
new BN('1'),
MAX_INT256.subn(1),
MAX_INT256,
]) {
it(`correctly computes the absolute value of ${n}`, async function () {
expect(await this.math.abs(n)).to.be.bignumber.equal(n.abs());
});
}
});
});
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment