2019-08-21 01:53:47 -04:00
|
|
|
_section: Byte Manipulation
|
|
|
|
|
2021-02-08 14:52:31 -05:00
|
|
|
While there are many high-level APIs for interacting with
|
|
|
|
Ethereum, such as [Contracts](Contract) and [Providers](Provider),
|
|
|
|
a lot of the low level access requires byte manipulation
|
|
|
|
operations.
|
|
|
|
|
|
|
|
Many of these operations are used internally, but can also be
|
|
|
|
used to help normalize binary data representations from the
|
|
|
|
output of various functions and methods.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
|
|
|
_subsection: Types
|
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_heading: Bytes @<Bytes>
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2019-12-13 22:05:10 -05:00
|
|
|
A **Bytes** is any object which is an
|
2020-02-02 07:58:29 -05:00
|
|
|
[Array](link-js-array) or [TypedArray](link-js-typedarray) with
|
2019-08-21 01:53:47 -04:00
|
|
|
each value in the valid byte range (i.e. between 0 and 255 inclusive),
|
|
|
|
or is an Object with a ``length`` property where each indexed property
|
|
|
|
is in the valid byte range.
|
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_heading: BytesLike @<BytesLike>
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
A **BytesLike** can be either a [[Bytes]] or a [[DataHexString]].
|
2019-12-13 22:05:10 -05:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_heading: DataHexString @<DataHexString>
|
2019-12-13 22:05:10 -05:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
A **DataHexstring** is identical to a [[HexString]] except that it has
|
2019-12-13 22:05:10 -05:00
|
|
|
an even number of nibbles, and therefore is a valid representation of
|
|
|
|
binary data as a string.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_heading: HexString @<HexString>
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-01-10 01:01:00 -05:00
|
|
|
A **Hexstring** is a string which has a ``0x`` prefix followed by any
|
2020-10-03 13:30:15 -03:00
|
|
|
number of nibbles (i.e. case-insensitive hexadecimal characters, ``0-9`` and ``a-f``).
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_heading: Signature @<Signature>
|
2019-08-21 01:53:47 -04:00
|
|
|
|
|
|
|
- **r** and **s** --- The x co-ordinate of **r** and the **s** value of the signature
|
|
|
|
- **v** --- The parity of the y co-ordinate of **r**
|
2022-02-18 18:54:00 -05:00
|
|
|
- **yParityAndS** --- The [compact representation](link-eip-2098) of the **s** and **v**
|
|
|
|
- **_vs** --- Deprecated property; renamed to yParityAndS
|
2019-08-21 01:53:47 -04:00
|
|
|
- **recoveryParam** --- The normalized (i.e. 0 or 1) value of **v**
|
2022-02-18 18:54:00 -05:00
|
|
|
- **compact** - The full siggnature using [compact representation](link-eip-2098)
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_heading: Raw Signature @<signature-raw> @inherit<string\<[[DataHexString]]\<65\>\>>
|
2020-01-10 01:01:00 -05:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
A **Raw Signature** is a common Signature format where the r, s and v are
|
2020-10-03 13:30:15 -03:00
|
|
|
concatenated into a 65 byte (130 nibble) [[DataHexString]].
|
2020-01-10 01:01:00 -05:00
|
|
|
|
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_heading: SignatureLike @<SignatureLike>
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
A **SignatureLike** is similar to a [[Signature]], except redundant properties
|
|
|
|
may be omitted or it may be a [[signature-raw]].
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2019-12-13 22:05:10 -05:00
|
|
|
For example, if **_vs** is specified, **s** and **v** may be omitted. Likewise,
|
|
|
|
if **recoveryParam** is provided, **v** may be omitted (as in these cases the
|
|
|
|
missing values can be computed).
|
2019-08-21 01:53:47 -04:00
|
|
|
|
|
|
|
|
|
|
|
_subsection: Inspection
|
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.isBytes(object) => boolean @<utils-isBytes> @SRC<bytes>
|
|
|
|
Returns true if and only if //object// is a valid [[Bytes]].
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.isBytesLike(object) => boolean @<utils-isBytesLike> @SRC<bytes>
|
|
|
|
Returns true if and only if //object// is a [[Bytes]] or [[DataHexString]].
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.isHexString(object, [ length ] ) => boolean @<utils-isHexString> @SRC<bytes>
|
2019-12-13 22:05:10 -05:00
|
|
|
Returns true if and only if //object// is a valid hex string.
|
2020-05-08 03:24:40 -04:00
|
|
|
If //length// is specified and //object// is not a valid [[DataHexString]] of
|
2019-12-13 22:05:10 -05:00
|
|
|
//length// bytes, an InvalidArgument error is thrown.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
|
|
|
|
|
|
|
_subsection: Converting between Arrays and Hexstrings
|
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.arrayify(DataHexStringOrArrayish [ , options ]) => Uint8Array @<utils-arrayify> @SRC<bytes>
|
|
|
|
Converts //DataHexStringOrArrayish// to a Uint8Array.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.hexlify(hexstringOrArrayish) => string<[[DataHexString]]> @<utils-hexlify> @SRC<bytes>
|
|
|
|
Converts //hexstringOrArrayish// to a [[DataHexString]].
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.hexValue(aBigNumberish) => string<[[HexString]]> @<utils-hexValue> @SRC<bytes>
|
|
|
|
Converts //aBigNumberish// to a [[HexString]], with no __unnecessary__ leading
|
2019-12-13 22:05:10 -05:00
|
|
|
zeros.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_code: Examples @lang<javascript>
|
2020-04-19 02:18:20 -04:00
|
|
|
|
|
|
|
// Convert a hexstring to a Uint8Array
|
2021-06-04 01:17:56 -04:00
|
|
|
//_result:
|
2020-04-19 02:18:20 -04:00
|
|
|
arrayify("0x1234")
|
2021-06-04 01:17:56 -04:00
|
|
|
//_log:
|
2020-04-19 02:18:20 -04:00
|
|
|
|
|
|
|
// Convert an Array to a hexstring
|
2021-06-04 01:17:56 -04:00
|
|
|
//_result:
|
2020-04-19 02:18:20 -04:00
|
|
|
hexlify([1, 2, 3, 4])
|
2021-06-04 01:17:56 -04:00
|
|
|
//_log:
|
2020-04-19 02:18:20 -04:00
|
|
|
|
|
|
|
// Convert an Object to a hexstring
|
2021-06-04 01:17:56 -04:00
|
|
|
//_result:
|
2020-04-19 02:18:20 -04:00
|
|
|
hexlify({ length: 2, "0": 1, "1": 2 })
|
2021-06-04 01:17:56 -04:00
|
|
|
//_log:
|
2020-04-19 02:18:20 -04:00
|
|
|
|
|
|
|
// Convert an Array to a hexstring
|
2021-06-04 01:17:56 -04:00
|
|
|
//_result:
|
2020-04-19 02:18:20 -04:00
|
|
|
hexlify([ 1 ])
|
2021-06-04 01:17:56 -04:00
|
|
|
//_log:
|
2020-04-19 02:18:20 -04:00
|
|
|
|
|
|
|
// Convert a number to a stripped hex value
|
2021-06-04 01:17:56 -04:00
|
|
|
//_result:
|
2020-04-19 02:18:20 -04:00
|
|
|
hexValue(1)
|
2021-06-04 01:17:56 -04:00
|
|
|
//_log:
|
2020-04-19 02:18:20 -04:00
|
|
|
|
|
|
|
// Convert an Array to a stripped hex value
|
2021-06-04 01:17:56 -04:00
|
|
|
//_result:
|
2020-04-19 02:18:20 -04:00
|
|
|
hexValue([ 1, 2 ])
|
2021-06-04 01:17:56 -04:00
|
|
|
//_log:
|
2019-08-21 01:53:47 -04:00
|
|
|
|
|
|
|
|
|
|
|
_subsection: Array Manipulation
|
|
|
|
|
2020-02-25 14:57:11 -05:00
|
|
|
_property: ethers.utils.concat(arrayOfBytesLike) => Uint8Array @<utils-concat> @SRC<bytes>
|
2020-05-08 03:24:40 -04:00
|
|
|
Concatenates all the [[BytesLike]] in //arrayOfBytesLike// into a single Uint8Array.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.stripZeros(aBytesLike) => Uint8Array @<utils-stripZeros> @SRC<bytes>
|
2019-12-13 22:05:10 -05:00
|
|
|
Returns a Uint8Array with all leading ``0`` bytes of //aBtyesLike// removed.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.zeroPad(aBytesLike, length) => Uint8Array @<utils-zeroPad> @SRC<bytes>
|
2020-10-03 13:30:15 -03:00
|
|
|
Returns a Uint8Array of the data in //aBytesLike// with ``0`` bytes prepended to
|
2019-12-13 22:05:10 -05:00
|
|
|
//length// bytes long.
|
|
|
|
|
|
|
|
If //aBytesLike// is already longer than //length// bytes long, an InvalidArgument
|
|
|
|
error will be thrown.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
|
|
|
|
|
|
|
_subsection: Hexstring Manipulation
|
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.hexConcat(arrayOfBytesLike) => string<[[DataHexString]]> @<utils-hexConcat> @SRC<bytes>
|
|
|
|
Concatenates all the [[BytesLike]] in //arrayOfBytesLike// into a single [[DataHexString]]
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.hexDataLength(aBytesLike) => string<[[DataHexString]]> @<utils-hexDataLength> @SRC<bytes>
|
2019-08-21 01:53:47 -04:00
|
|
|
Returns the length (in bytes) of //aBytesLike//.
|
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.hexDataSlice(aBytesLike, offset [ , endOffset ] ) => string<[[DataHexString]]> @<utils-hexDataSlice> @SRC<bytes>
|
|
|
|
Returns a [[DataHexString]] representation of a slice of //aBytesLike//, from
|
2019-12-13 22:05:10 -05:00
|
|
|
//offset// (in bytes) to //endOffset// (in bytes). If //endOffset// is
|
|
|
|
omitted, the length of //aBytesLike// is used.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.hexStripZeros(aBytesLike) => string<[[HexString]]> @<utils-hexStripZeros> @SRC<bytes>
|
|
|
|
Returns a [[HexString]] representation of //aBytesLike// with all
|
2019-12-13 22:05:10 -05:00
|
|
|
leading zeros removed.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.hexZeroPad(aBytesLike, length) => string<[[DataHexString]]> @<utils-hexZeroPad> @SRC<bytes>
|
|
|
|
Returns a [[DataHexString]] representation of //aBytesLike// padded to //length// bytes.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2019-12-13 22:05:10 -05:00
|
|
|
If //aBytesLike// is already longer than //length// bytes long, an InvalidArgument
|
|
|
|
error will be thrown.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
|
|
|
|
|
|
|
_subsection: Signature Conversion
|
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.joinSignature(aSignatureLike) => string<[RawSignature](signature-raw)> @<utils-joinSignature> @SRC<bytes>
|
|
|
|
Return the raw-format of //aSignaturelike//, which is 65 bytes (130 nibbles)
|
2019-12-13 22:05:10 -05:00
|
|
|
long, concatenating the **r**, **s** and (normalized) **v** of a Signature.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.splitSignature(aSignatureLikeOrBytesLike) => [[Signature]] @<utils-splitSignature> @SRC<bytes>
|
|
|
|
Return the full expanded-format of //aSignaturelike// or a raw-format [[DataHexString]].
|
2019-12-13 22:05:10 -05:00
|
|
|
Any missing properties will be computed.
|
2019-08-21 01:53:47 -04:00
|
|
|
|
2020-02-17 17:56:13 -05:00
|
|
|
_subsection: Random Bytes
|
|
|
|
|
2020-11-22 23:06:27 -05:00
|
|
|
_property: ethers.utils.randomBytes(length) => Uint8Array @<utils-randomBytes> @SRC<random/random>
|
2020-02-17 17:56:13 -05:00
|
|
|
Return a new Uint8Array of //length// random bytes.
|
2020-02-25 14:57:11 -05:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
_property: ethers.utils.shuffled(array) => Array<any> @<utils-shuffled> @SRC<random>
|
2020-02-25 14:57:11 -05:00
|
|
|
Return a copy of //array// shuffled using [[link-wiki-shuffle]].
|
2020-04-19 02:18:20 -04:00
|
|
|
|
|
|
|
_code: Examples @lang<javascript>
|
|
|
|
|
2021-06-04 01:17:56 -04:00
|
|
|
//_result:
|
2020-04-19 02:18:20 -04:00
|
|
|
utils.randomBytes(8)
|
2021-06-04 01:17:56 -04:00
|
|
|
//_log:
|
2020-04-19 02:18:20 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
const data = [ 1, 2, 3, 4, 5, 6, 7 ];
|
|
|
|
|
|
|
|
// Returns a new Array
|
2021-06-04 01:17:56 -04:00
|
|
|
//_result:
|
2020-05-08 03:24:40 -04:00
|
|
|
utils.shuffled(data);
|
2021-06-04 01:17:56 -04:00
|
|
|
//_log:
|
2020-04-19 02:18:20 -04:00
|
|
|
|
2020-05-08 03:24:40 -04:00
|
|
|
// The Original is unscathed...
|
2021-06-04 01:17:56 -04:00
|
|
|
//_result:
|
2020-05-08 03:24:40 -04:00
|
|
|
data
|
2021-06-04 01:17:56 -04:00
|
|
|
//_log:
|