soulswap-lib
v1.0.3
Published
SoulSwap Lib
Downloads
52
Maintainers
Readme
SoulSwap Library
Solidity libraries that are shared across SoulSwap swap contracts. These libraries are focused on safety and gas efficiency.
Install
Run yarn
to install dependencies.
Test
Run yarn test
to execute the test suite.
Usage
Install this in another project via yarn add soulswap-lib
Then import the contracts via:
import "@soulswap/soulswap-lib/contracts/access/Ownable.sol";
Test Results v1.0.0
AddressStringUtil
#toAsciiString
✓ zero address (96ms)
✓ own address (105ms)
✓ random address (91ms)
✓ reverts if len % 2 != 0
✓ reverts if len >= 40
✓ reverts if len == 0
✓ produces len characters (121ms)
Babylonian
#sqrt
✓ works for 0-99 (1287ms)
✓ product of numbers close to max uint112 (78ms)
✓ max uint256
✓ gas cost
✓ gas cost of large number
✓ gas cost of max uint
BitMath
#mostSignificantBit
✓ 0
✓ 1
✓ 2
✓ all powers of 2 (2166ms)
✓ type(uint256).max
✓ gas cost of smaller number
✓ gas cost of max uint128
✓ gas cost of max uint256
#leastSignificantBit
✓ 0
✓ 1
✓ 2
✓ all powers of 2 (1931ms)
✓ type(uint256).max
✓ gas cost of smaller number
✓ gas cost of max uint128
✓ gas cost of max uint256
FixedPoint
#encode
✓ shifts left by 112
✓ will not take >uint112(-1)
#encode144
✓ shifts left by 112
✓ will not take >type(uint144).max
#decode
✓ shifts right by 112
✓ will not take >uint224(-1)
#decode144
✓ shifts right by 112
✓ will not take >type(uint256).max
#mul
✓ works for 0
✓ correct multiplication
✓ overflow
✓ max of q112x112
✓ max without overflow, largest fixed point
✓ max without overflow, smallest fixed point
#muli
✓ works for 0
✓ works for 3*2
✓ works for 3*-2
✓ max without overflow, largest int (42ms)
✓ max without overflow, largest fixed point (51ms)
#muluq
✓ works for 0
✓ multiplies 3*2
✓ multiplies 4/3*4/3
✓ overflow upper
✓ gas for short circuit where one multiplicand is 0
✓ gas
#divuq
✓ works for 0 numerator
✓ throws for 0 denominator
✓ equality 30/30
✓ divides 30/10
✓ divides 35/8
✓ divides 1/3
✓ divides 1e15/3e15 (long division, repeating)
✓ boundary of full precision
✓ precision
✓ gas cost of dividend = divisor short circuit
✓ divuq overflow with smaller numbers
✓ divuq overflow with large numbers
✓ gas cost of full precision small dividend short circuit
✓ gas cost of long division with less than 112 iterations
✓ gas cost of long division with all iterations
#fraction
✓ correct computation less than 1
✓ correct computation greater than 1
✓ fails with 0 denominator
✓ can be called with numerator exceeding uint112 max
✓ can be called with denominator exceeding uint112 max
✓ can be called with numerator exceeding uint144 max
✓ can be called with numerator and denominator exceeding uint112 max
✓ short circuits for 0
✓ can overflow if result of division does not fit
✓ gas cost of 0
✓ gas cost of smaller numbers
✓ gas cost of number greater than Q112 numbers
✓ gas cost of number greater than Q112 numbers
#reciprocal
✓ fails for 0
✓ fails for 1
✓ works for 0.25
✓ works for 5
#sqrt
✓ works with 0
✓ works with numbers less than 1
✓ gas cost of less than 1
✓ works for 25
✓ gas cost of 25
✓ works for max uint144
✓ gas cost of max uint144
✓ works for 2**144
✓ gas cost of 2**144
✓ works for encoded max uint112
✓ gas cost of encoded max uint112
✓ works for max uint224
✓ gas cost of max uint224
FullMath
#mulDiv
✓ accurate without phantom overflow
✓ accurate with phantom overflow
✓ accurate with phantom overflow and repeating decimal
PairNamer
#pairName
✓ concatenation (95ms)
#pairSymbol
✓ concatenation (88ms)
SafeERC20Namer
#tokenName
✓ works with compliant (46ms)
✓ works with noncompliant (48ms)
✓ works with empty bytes32 (53ms)
✓ works with noncompliant full bytes32 (54ms)
✓ works with optional (43ms)
✓ works with non-code address
✓ works with really long strings (66ms)
✓ falls back to address with empty strings (52ms)
#tokenSymbol
✓ works with compliant (48ms)
✓ works with noncompliant (49ms)
✓ works with empty bytes32 (45ms)
✓ works with noncompliant full bytes32 (52ms)
✓ works with optional (38ms)
✓ works with non-code address
✓ works with really long strings (65ms)
✓ falls back to address with empty strings (47ms)
SafeMathTest
#sqrt
✓ works for 0-99 (998ms)
✓ max uint256
TransferHelper
#safeApprove
✓ succeeds with compliant with no revert and true return (83ms)
✓ fails with compliant with no revert and false return (53ms)
✓ fails with compliant with revert (62ms)
✓ succeeds with noncompliant (no return) with no revert (127ms)
✓ fails with noncompliant (no return) with revert (56ms)
#safeTransfer
✓ succeeds with compliant with no revert and true return (81ms)
✓ fails with compliant with no revert and false return (56ms)
✓ fails with compliant with revert (53ms)
✓ succeeds with noncompliant (no return) with no revert (84ms)
✓ fails with noncompliant (no return) with revert (59ms)
#safeTransferFrom
✓ succeeds with compliant with no revert and true return (81ms)
✓ fails with compliant with no revert and false return (55ms)
✓ fails with compliant with revert (56ms)
✓ succeeds with noncompliant (no return) with no revert (89ms)
✓ fails with noncompliant (no return) with revert (54ms)
#safeTransferETH
✓ succeeds call not reverted (128ms)
✓ fails if call reverts (54ms)
139 passing (11s)
✨ Done in 21.25s.