Gathering detailed insights and metrics for solidity-bytes-utils
Gathering detailed insights and metrics for solidity-bytes-utils
Gathering detailed insights and metrics for solidity-bytes-utils
Gathering detailed insights and metrics for solidity-bytes-utils
npm install solidity-bytes-utils
v0.8.0 - Solidity >0.8.0 support!
Published on 13 Apr 2021
v0.1.1 - Critical Bug Fix v2
Published on 01 Oct 2020
v0.1.0 - Critical bug fix
Published on 30 Sept 2020
v0.0.8 - Additional uint typecasting methods
Published on 26 Jun 2019
v0.0.7 - Upgrade to Solidity v0.5.0
Published on 27 Feb 2019
v0.0.6 - Addition of new typecast methods
Published on 11 Feb 2019
Module System
Min. Node Version
Typescript Support
Node Version
NPM Version
515 Stars
119 Commits
111 Forks
9 Watching
17 Branches
10 Contributors
Updated on 25 Nov 2024
Solidity (100%)
Cumulative downloads
Total Downloads
Last day
6.7%
972
Compared to previous day
Last week
0.2%
4,755
Compared to previous week
Last month
-11.9%
18,809
Compared to previous month
Last year
102.5%
213,047
Compared to previous year
Bytes tightly packed arrays' utility library for ethereum contracts written in Solidity.
The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
Given this library has an all-internal collection of methods it doesn't make sense to have it reside in the mainnet. Instead it will only be available on EPM as an installable package.
2021-01-07
A bug regarding zero-length slices was disclosed by @MrChico following an audit to the Optimism codebase.
The exact bug happened under the following conditions: if memory slots higher then the current free-memory pointer were tainted before calling the slice
method with a desired length of 0
, the returned bytes array, instead of being a zero-length slice was an array of arbitrary length based on the values that previously populated that memory region.
Overall, the usage of zero-length slices should be pretty unusual and, as such, hopefully, this bug does not have far-reaching implications. Nonetheless, please update the library to the new version if you're using it in production.
TL;DR: if you're using the slice
method with a length parameter of '0' in your codebase, please update to version 0.1.2 of the bytes library ASAP!
2020-11-01
There was a critical bug in the slice
method, reported on an audit to a DXDao codebase.
Previously, no checks were being made on overflows of the _start
and _length
parameters since previous reviews of the codebase deemed this overflow "unexploitable" because of an inordinate expansion of memory (i.e., reading an immensely large memory offset causing huge memory expansion) resulting in an out-of-gas exception.
However, as noted in the review mentioned above, this is not the case. The slice
method in versions <=0.9.0
actually allows for arbitrary kind of (i.e., it allows memory writes to very specific values) arbitrary memory writes _in the specific case where these parameters are user-supplied inputs and not hardcoded values (which is uncommon).
This made me realize that in permissioned blockchains where gas is also not a limiting factor this could become problematic in other methods and so I updated all typecasting-related methods to include new bound checks as well.
TL;DR: if you're using the slice
method with user-supplied inputs in your codebase please update the bytes library immediately!
Version v0.9.0
has a new feature: a new "equal_nonAligned" method that allows for comparing two bytes arrays that are not aligned to 32 bytes.
This is useful for comparing bytes arrays that were created with assembly/Yul or other, non-Solidity compilers that don't pad bytes arrays to 32 bytes.
Starting from version v0.8.0
the versioning will change to follow compatible Solidity's compiler versions.
This means that now the library will only compile on Solidity versions >=0.8.0
so, if you need <0.8.0
support for your project just use v0.1.2
of the library with:
$ truffle install bytes@0.8.0
or
$ npm install solidity-bytes-utils@0.8.0
Version v0.1.2
has a major bug fix.
Version v0.1.1
has a critical bug fix.
Version v0.9.0
now compiles with Solidity compilers 0.5.x
and 0.6.x
.
Since version v0.0.7
the library will only compile on Solidity versions >0.4.22
so, if you need v0.4.x
support for your project just use v0.0.6
of the library with:
$ truffle install bytes@0.0.6
or
$ npm install solidity-bytes-utils@0.0.6
You can use the library here present by direct download and importing with:
import "BytesLib.sol";
or, if you have installed it from EPM (see below), with Truffle's specific paths:
import "bytes/BytesLib.sol";
Usage examples and API are more thoroughly explained below.
Also there's an extra library in there called AssertBytes
(inside the same named file) which is compatible with Truffle's Solidity testing library Assert.sol
event firing and so lets you now test bytes equalities/inequalities in your Solidity tests by just importing it in your .sol
test files:
import "bytes/AssertBytes.sol";
and use the library AssertBytes
much like they use Assert
in Truffle's example.
This library is published in EPM under the alias bytes
Installing it with Truffle
$ truffle install bytes
This library is published in NPM under the alias solidity-bytes-utils
Installing it with NPM
$ npm install solidity-bytes-utils
Importing it in your Solidity contract
import "solidity-bytes-utils/contracts/BytesLib.sol";
Contributions are more than welcome in any way shape or form! 😄
TODOs:
This project uses Truffle for tests. Truffle's version of solc
needs to be at least 0.4.19 for the contracts to compile. If you encounter compilation errors, try:
$ cd /usr/local/lib/node_modules/truffle
$ npm install solc@latest
To run the tests, start a testrpc
instance, then run truffle test
.
function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes)
Concatenates two bytes
arrays in memory and returns the concatenation result as another bytes
array in memory.
function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal pure
Concatenates a bytes
array present in memory directly into the given storage location addressed by the _preBytes
storage pointer.
function slice(bytes _bytes, uint _start, uint _length) internal pure returns (bytes)
Takes a slice from a bytes
array in memory of given length
starting from _start
th byte counting from the left-most one (0-based).
function toAddress(bytes _bytes, uint _start) internal pure returns (address)
Takes a 20-byte-long sequence present in a bytes
array in memory and returns that as an address (also checks for sufficient length).
function toUint(bytes _bytes, uint _start) internal pure returns (uint256)
Takes a 32-byte-long sequence present in a bytes
array in memory and returns that as an unsigned integer (also checks for sufficient length).
function equal(bytes memory _preBytes, bytes memory _postBytes) internal view returns (bool)
Compares two bytes
arrays in memory and returns the comparison result as a bool
variable.
function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool)
Compares a bytes
array in storage against another bytes
array in memory and returns the comparison result as a bool
variable.
Ordered to mimic the above API
section ordering:
1contract MyContract { 2 using BytesLib for bytes; 3 4 function myFunc() { 5 bytes memory _preBytes = hex"f00dfeed"; 6 bytes memory _postBytes = hex"f00dfeed"; 7 8 bytes memory concatBytes = _preBytes.concat(_postBytes); 9 10 // concatBytes == 0xf00dfeedf00dfeed 11 } 12}
1contract MyContract { 2 using BytesLib for bytes; 3 4 bytes storageBytes = hex"f00dfeed"; 5 6 function myFunc() { 7 bytes memory _postBytes = hex"f00dfeed"; 8 9 storageBytes.concatStorage(_postBytes); 10 11 // storageBytes == 0xf00dfeedf00dfeed 12 } 13}
1contract MyContract { 2 using BytesLib for bytes; 3 4 function myFunc() { 5 bytes memory memBytes = hex"f00dfeedaabbccddeeff"; 6 7 bytes memory slice1 = memBytes.slice(0, 2); 8 bytes memory slice2 = memBytes.slice(2, 2); 9 10 // slice1 == 0xf00d 11 // slice2 == 0xfeed 12 } 13}
1contract MyContract { 2 using BytesLib for bytes; 3 4 function myFunc() { 5 bytes memory memBytes = hex"f00dfeed383Fa3B60f9B4AB7fBf6835d3c26C3765cD2B2e2f00dfeed"; 6 7 address addrFromBytes = memBytes.toAddress(4); 8 9 // addrFromBytes == 0x383Fa3B60f9B4AB7fBf6835d3c26C3765cD2B2e2 10 } 11}
1contract MyContract { 2 using BytesLib for bytes; 3 4 function myFunc() { 5 bytes memory memBytes = hex"f00d0000000000000000000000000000000000000000000000000000000000000042feed"; 6 7 uint256 uintFromBytes = memBytes.toUint(2); 8 9 // uintFromBytes == 42 10 } 11}
1contract MyContract { 2 using BytesLib for bytes; 3 4 function myFunc() { 5 bytes memory memBytes = hex"f00dfeed"; 6 bytes memory checkBytesTrue = hex"f00dfeed"; 7 bytes memory checkBytesFalse = hex"00000000"; 8 9 bool check1 = memBytes.equal(checkBytesTrue); 10 bool check2 = memBytes.equal(checkBytesFalse); 11 12 // check1 == true 13 // check2 == false 14 } 15}
1 2contract MyContract { 3 using BytesLib for bytes; 4 5 bytes storageBytes = hex"f00dfeed"; 6 7 function myFunc() { 8 bytes memory checkBytesTrue = hex"f00dfeed"; 9 bytes memory checkBytesFalse = hex"00000000"; 10 11 bool check1 = storageBytes.equalStorage(checkBytesTrue); 12 bool check2 = storageBytes.equalStorage(checkBytesFalse); 13 14 // check1 == true 15 // check2 == false 16 } 17}
No vulnerabilities found.
Reason
no binaries found in the repo
Reason
license file detected
Details
Reason
0 existing vulnerabilities detected
Reason
Found 5/19 approved changesets -- score normalized to 2
Reason
1 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0
Reason
no effort to earn an OpenSSF best practices badge detected
Reason
security policy file not detected
Details
Reason
project is not fuzzed
Details
Reason
branch protection not enabled on development/release branches
Details
Reason
SAST tool is not run on all commits -- score normalized to 0
Details
Score
Last Scanned on 2024-11-25
The Open Source Security Foundation is a cross-industry collaboration to improve the security of open source software (OSS). The Scorecard provides security health metrics for open source projects.
Learn More