viem 0.3.2 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/cjs/actions/public/call.js +97 -10
- package/dist/cjs/actions/public/call.js.map +1 -1
- package/dist/cjs/actions/public/simulateContract.js +1 -0
- package/dist/cjs/actions/public/simulateContract.js.map +1 -1
- package/dist/cjs/chains.js +1 -24
- package/dist/cjs/chains.js.map +1 -1
- package/dist/cjs/clients/createPublicClient.js +2 -1
- package/dist/cjs/clients/createPublicClient.js.map +1 -1
- package/dist/cjs/clients/transports/fallback.js +1 -1
- package/dist/cjs/clients/transports/fallback.js.map +1 -1
- package/dist/cjs/constants/contract.js +5 -0
- package/dist/cjs/constants/contract.js.map +1 -0
- package/dist/cjs/constants/index.js +3 -1
- package/dist/cjs/constants/index.js.map +1 -1
- package/dist/cjs/errors/chain.js +13 -1
- package/dist/cjs/errors/chain.js.map +1 -1
- package/dist/cjs/errors/contract.js +1 -1
- package/dist/cjs/errors/contract.js.map +1 -1
- package/dist/cjs/errors/encoding.js +13 -1
- package/dist/cjs/errors/encoding.js.map +1 -1
- package/dist/cjs/errors/index.js +5 -2
- package/dist/cjs/errors/index.js.map +1 -1
- package/dist/cjs/errors/version.js +1 -1
- package/dist/cjs/index.js +5 -4
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/utils/encoding/fromBytes.js +29 -12
- package/dist/cjs/utils/encoding/fromBytes.js.map +1 -1
- package/dist/cjs/utils/encoding/fromHex.js +32 -10
- package/dist/cjs/utils/encoding/fromHex.js.map +1 -1
- package/dist/cjs/utils/encoding/toBytes.js +31 -15
- package/dist/cjs/utils/encoding/toBytes.js.map +1 -1
- package/dist/cjs/utils/encoding/toHex.js +31 -20
- package/dist/cjs/utils/encoding/toHex.js.map +1 -1
- package/dist/cjs/utils/errors/getContractError.js +7 -5
- package/dist/cjs/utils/errors/getContractError.js.map +1 -1
- package/dist/cjs/utils/promise/createBatchScheduler.js +47 -0
- package/dist/cjs/utils/promise/createBatchScheduler.js.map +1 -0
- package/dist/cjs/utils/promise/index.js +3 -1
- package/dist/cjs/utils/promise/index.js.map +1 -1
- package/dist/cjs/utils/transaction/serializeTransaction.js +13 -15
- package/dist/cjs/utils/transaction/serializeTransaction.js.map +1 -1
- package/dist/esm/actions/public/call.js +91 -4
- package/dist/esm/actions/public/call.js.map +1 -1
- package/dist/esm/actions/public/simulateContract.js +1 -0
- package/dist/esm/actions/public/simulateContract.js.map +1 -1
- package/dist/esm/clients/createPublicClient.js +2 -1
- package/dist/esm/clients/createPublicClient.js.map +1 -1
- package/dist/esm/clients/transports/fallback.js +1 -1
- package/dist/esm/clients/transports/fallback.js.map +1 -1
- package/dist/esm/constants/contract.js +2 -0
- package/dist/esm/constants/contract.js.map +1 -0
- package/dist/esm/constants/index.js +1 -0
- package/dist/esm/constants/index.js.map +1 -1
- package/dist/esm/errors/chain.js +11 -0
- package/dist/esm/errors/chain.js.map +1 -1
- package/dist/esm/errors/contract.js +1 -1
- package/dist/esm/errors/contract.js.map +1 -1
- package/dist/esm/errors/encoding.js +11 -0
- package/dist/esm/errors/encoding.js.map +1 -1
- package/dist/esm/errors/index.js +2 -2
- package/dist/esm/errors/index.js.map +1 -1
- package/dist/esm/errors/version.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/utils/encoding/fromBytes.js +30 -13
- package/dist/esm/utils/encoding/fromBytes.js.map +1 -1
- package/dist/esm/utils/encoding/fromHex.js +31 -10
- package/dist/esm/utils/encoding/fromHex.js.map +1 -1
- package/dist/esm/utils/encoding/toBytes.js +31 -15
- package/dist/esm/utils/encoding/toBytes.js.map +1 -1
- package/dist/esm/utils/encoding/toHex.js +28 -17
- package/dist/esm/utils/encoding/toHex.js.map +1 -1
- package/dist/esm/utils/errors/getContractError.js +7 -5
- package/dist/esm/utils/errors/getContractError.js.map +1 -1
- package/dist/esm/utils/promise/createBatchScheduler.js +43 -0
- package/dist/esm/utils/promise/createBatchScheduler.js.map +1 -0
- package/dist/esm/utils/promise/index.js +1 -0
- package/dist/esm/utils/promise/index.js.map +1 -1
- package/dist/esm/utils/transaction/serializeTransaction.js +13 -15
- package/dist/esm/utils/transaction/serializeTransaction.js.map +1 -1
- package/dist/types/actions/public/call.d.ts +1 -0
- package/dist/types/actions/public/call.d.ts.map +1 -1
- package/dist/types/actions/public/simulateContract.d.ts +1 -1
- package/dist/types/actions/public/simulateContract.d.ts.map +1 -1
- package/dist/types/clients/createPublicClient.d.ts +15 -3
- package/dist/types/clients/createPublicClient.d.ts.map +1 -1
- package/dist/types/constants/contract.d.ts +2 -0
- package/dist/types/constants/contract.d.ts.map +1 -0
- package/dist/types/constants/index.d.ts +1 -0
- package/dist/types/constants/index.d.ts.map +1 -1
- package/dist/types/errors/chain.d.ts +4 -0
- package/dist/types/errors/chain.d.ts.map +1 -1
- package/dist/types/errors/encoding.d.ts +7 -0
- package/dist/types/errors/encoding.d.ts.map +1 -1
- package/dist/types/errors/index.d.ts +2 -2
- package/dist/types/errors/index.d.ts.map +1 -1
- package/dist/types/errors/version.d.ts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/types/eip1193.d.ts +1 -1
- package/dist/types/types/eip1193.d.ts.map +1 -1
- package/dist/types/utils/encoding/fromBytes.d.ts +95 -10
- package/dist/types/utils/encoding/fromBytes.d.ts.map +1 -1
- package/dist/types/utils/encoding/fromHex.d.ts +122 -12
- package/dist/types/utils/encoding/fromHex.d.ts.map +1 -1
- package/dist/types/utils/encoding/toBytes.d.ts +113 -9
- package/dist/types/utils/encoding/toBytes.d.ts.map +1 -1
- package/dist/types/utils/encoding/toHex.d.ts +120 -10
- package/dist/types/utils/encoding/toHex.d.ts.map +1 -1
- package/dist/types/utils/errors/getContractError.d.ts.map +1 -1
- package/dist/types/utils/promise/createBatchScheduler.d.ts +15 -0
- package/dist/types/utils/promise/createBatchScheduler.d.ts.map +1 -0
- package/dist/types/utils/promise/index.d.ts +1 -0
- package/dist/types/utils/promise/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/actions/public/call.ts +141 -7
- package/src/actions/public/simulateContract.ts +2 -1
- package/src/clients/createPublicClient.ts +17 -1
- package/src/clients/transports/fallback.ts +1 -1
- package/src/constants/contract.ts +1 -0
- package/src/constants/index.ts +2 -0
- package/src/errors/chain.ts +8 -0
- package/src/errors/contract.ts +1 -1
- package/src/errors/encoding.ts +9 -0
- package/src/errors/index.ts +2 -0
- package/src/errors/version.ts +1 -1
- package/src/index.ts +1 -0
- package/src/types/eip1193.ts +1 -1
- package/src/utils/encoding/fromBytes.ts +147 -18
- package/src/utils/encoding/fromHex.ts +162 -19
- package/src/utils/encoding/toBytes.ts +148 -18
- package/src/utils/encoding/toHex.ts +151 -26
- package/src/utils/errors/getContractError.ts +9 -5
- package/src/utils/promise/createBatchScheduler.ts +82 -0
- package/src/utils/promise/index.ts +1 -0
- package/src/utils/transaction/serializeTransaction.ts +13 -15
@@ -1,9 +1,35 @@
|
|
1
|
-
import {
|
1
|
+
import {
|
2
|
+
InvalidHexBooleanError,
|
3
|
+
SizeOverflowError,
|
4
|
+
} from '../../errors/index.js'
|
2
5
|
import type { ByteArray, Hex } from '../../types/index.js'
|
6
|
+
import { size as size_ } from '../data/size.js'
|
3
7
|
import { trim } from '../data/index.js'
|
4
8
|
import { hexToBytes } from './toBytes.js'
|
5
9
|
|
6
|
-
|
10
|
+
export function assertSize(
|
11
|
+
hexOrBytes: Hex | ByteArray,
|
12
|
+
{ size }: { size: number },
|
13
|
+
): void {
|
14
|
+
if (size_(hexOrBytes) > size)
|
15
|
+
throw new SizeOverflowError({
|
16
|
+
givenSize: size_(hexOrBytes),
|
17
|
+
maxSize: size,
|
18
|
+
})
|
19
|
+
}
|
20
|
+
|
21
|
+
export type FromHexParameters<
|
22
|
+
TTo extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean',
|
23
|
+
> =
|
24
|
+
| TTo
|
25
|
+
| {
|
26
|
+
/** Size (in bytes) of the hex value. */
|
27
|
+
size?: number
|
28
|
+
/** Type to convert to. */
|
29
|
+
to: TTo
|
30
|
+
}
|
31
|
+
|
32
|
+
export type FromHexReturnType<TTo> = TTo extends 'string'
|
7
33
|
? string
|
8
34
|
: TTo extends 'bigint'
|
9
35
|
? bigint
|
@@ -16,29 +42,77 @@ type FromHexReturnType<TTo> = TTo extends 'string'
|
|
16
42
|
: never
|
17
43
|
|
18
44
|
/**
|
19
|
-
*
|
45
|
+
* Decodes a hex string into a string, number, bigint, boolean, or byte array.
|
46
|
+
*
|
47
|
+
* - Docs: https://viem.sh/docs/utilities/fromHex.html
|
48
|
+
* - Example: https://viem.sh/docs/utilities/fromHex.html#usage
|
49
|
+
*
|
50
|
+
* @param hex Hex string to decode.
|
51
|
+
* @param toOrOpts Type to convert to or options.
|
52
|
+
* @returns Decoded value.
|
53
|
+
*
|
54
|
+
* @example
|
55
|
+
* import { fromHex } from 'viem'
|
56
|
+
* const data = fromHex('0x1a4', 'number')
|
57
|
+
* // 420
|
58
|
+
*
|
59
|
+
* @example
|
60
|
+
* import { fromHex } from 'viem'
|
61
|
+
* const data = fromHex('0x48656c6c6f20576f726c6421', 'string')
|
62
|
+
* // 'Hello world'
|
63
|
+
*
|
64
|
+
* @example
|
65
|
+
* import { fromHex } from 'viem'
|
66
|
+
* const data = fromHex('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {
|
67
|
+
* size: 32,
|
68
|
+
* to: 'string'
|
69
|
+
* })
|
70
|
+
* // 'Hello world'
|
20
71
|
*/
|
21
72
|
export function fromHex<
|
22
73
|
TTo extends 'string' | 'bigint' | 'number' | 'bytes' | 'boolean',
|
23
|
-
>(hex: Hex,
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
if (to === '
|
28
|
-
return
|
74
|
+
>(hex: Hex, toOrOpts: FromHexParameters<TTo>): FromHexReturnType<TTo> {
|
75
|
+
const opts = typeof toOrOpts === 'string' ? { to: toOrOpts } : toOrOpts
|
76
|
+
const to = opts.to
|
77
|
+
|
78
|
+
if (to === 'number') return hexToNumber(hex, opts) as FromHexReturnType<TTo>
|
79
|
+
if (to === 'bigint') return hexToBigInt(hex, opts) as FromHexReturnType<TTo>
|
80
|
+
if (to === 'string') return hexToString(hex, opts) as FromHexReturnType<TTo>
|
81
|
+
if (to === 'boolean') return hexToBool(hex, opts) as FromHexReturnType<TTo>
|
82
|
+
return hexToBytes(hex, opts) as FromHexReturnType<TTo>
|
29
83
|
}
|
30
84
|
|
31
85
|
export type HexToBigIntOpts = {
|
32
|
-
|
86
|
+
/** Whether or not the number of a signed representation. */
|
33
87
|
signed?: boolean
|
88
|
+
/** Size (in bytes) of the hex value. */
|
89
|
+
size?: number
|
34
90
|
}
|
35
91
|
|
36
92
|
/**
|
37
|
-
*
|
93
|
+
* Decodes a hex value into a bigint.
|
94
|
+
*
|
95
|
+
* - Docs: https://viem.sh/docs/utilities/fromHex.html#hextobigint
|
96
|
+
*
|
97
|
+
* @param hex Hex value to decode.
|
98
|
+
* @param opts Options.
|
99
|
+
* @returns BigInt value.
|
100
|
+
*
|
101
|
+
* @example
|
102
|
+
* import { hexToBigInt } from 'viem'
|
103
|
+
* const data = hexToBigInt('0x1a4', { signed: true })
|
104
|
+
* // 420n
|
105
|
+
*
|
106
|
+
* @example
|
107
|
+
* import { hexToBigInt } from 'viem'
|
108
|
+
* const data = hexToBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })
|
109
|
+
* // 420n
|
38
110
|
*/
|
39
111
|
export function hexToBigInt(hex: Hex, opts: HexToBigIntOpts = {}): bigint {
|
40
112
|
const { signed } = opts
|
41
113
|
|
114
|
+
if (opts.size) assertSize(hex, { size: opts.size })
|
115
|
+
|
42
116
|
const value = BigInt(hex)
|
43
117
|
if (!signed) return value
|
44
118
|
|
@@ -49,28 +123,97 @@ export function hexToBigInt(hex: Hex, opts: HexToBigIntOpts = {}): bigint {
|
|
49
123
|
return value - BigInt(`0x${'f'.padStart(size * 2, 'f')}`) - 1n
|
50
124
|
}
|
51
125
|
|
126
|
+
export type HexToBoolOpts = {
|
127
|
+
/** Size (in bytes) of the hex value. */
|
128
|
+
size?: number
|
129
|
+
}
|
130
|
+
|
52
131
|
/**
|
53
|
-
*
|
132
|
+
* Decodes a hex value into a boolean.
|
133
|
+
*
|
134
|
+
* - Docs: https://viem.sh/docs/utilities/fromHex.html#hextobool
|
135
|
+
*
|
136
|
+
* @param hex Hex value to decode.
|
137
|
+
* @param opts Options.
|
138
|
+
* @returns Boolean value.
|
139
|
+
*
|
140
|
+
* @example
|
141
|
+
* import { hexToBool } from 'viem'
|
142
|
+
* const data = hexToBool('0x1')
|
143
|
+
* // true
|
144
|
+
*
|
145
|
+
* @example
|
146
|
+
* import { hexToBool } from 'viem'
|
147
|
+
* const data = hexToBool('0x0000000000000000000000000000000000000000000000000000000000000001', { size: 32 })
|
148
|
+
* // true
|
54
149
|
*/
|
55
|
-
export function hexToBool(
|
150
|
+
export function hexToBool(hex_: Hex, opts: HexToBoolOpts = {}): boolean {
|
151
|
+
let hex = hex_
|
152
|
+
if (opts.size) {
|
153
|
+
assertSize(hex, { size: opts.size })
|
154
|
+
hex = trim(hex)
|
155
|
+
}
|
56
156
|
if (trim(hex) === '0x0') return false
|
57
157
|
if (trim(hex) === '0x1') return true
|
58
158
|
throw new InvalidHexBooleanError(hex)
|
59
159
|
}
|
60
160
|
|
61
|
-
type
|
161
|
+
export type HexToNumberOpts = HexToBigIntOpts
|
62
162
|
|
63
163
|
/**
|
64
|
-
*
|
164
|
+
* Decodes a hex string into a number.
|
165
|
+
*
|
166
|
+
* - Docs: https://viem.sh/docs/utilities/fromHex.html#hextonumber
|
167
|
+
*
|
168
|
+
* @param hex Hex value to decode.
|
169
|
+
* @param opts Options.
|
170
|
+
* @returns Number value.
|
171
|
+
*
|
172
|
+
* @example
|
173
|
+
* import { hexToNumber } from 'viem'
|
174
|
+
* const data = hexToNumber('0x1a4')
|
175
|
+
* // 420
|
176
|
+
*
|
177
|
+
* @example
|
178
|
+
* import { hexToNumber } from 'viem'
|
179
|
+
* const data = hexToBigInt('0x00000000000000000000000000000000000000000000000000000000000001a4', { size: 32 })
|
180
|
+
* // 420
|
65
181
|
*/
|
66
|
-
export function hexToNumber(hex: Hex, opts:
|
182
|
+
export function hexToNumber(hex: Hex, opts: HexToNumberOpts = {}): number {
|
67
183
|
return Number(hexToBigInt(hex, opts))
|
68
184
|
}
|
69
185
|
|
186
|
+
export type HexToStringOpts = {
|
187
|
+
/** Size (in bytes) of the hex value. */
|
188
|
+
size?: number
|
189
|
+
}
|
190
|
+
|
70
191
|
/**
|
71
|
-
*
|
192
|
+
* Decodes a hex value into a UTF-8 string.
|
193
|
+
*
|
194
|
+
* - Docs: https://viem.sh/docs/utilities/fromHex.html#hextostring
|
195
|
+
*
|
196
|
+
* @param hex Hex value to decode.
|
197
|
+
* @param opts Options.
|
198
|
+
* @returns String value.
|
199
|
+
*
|
200
|
+
* @example
|
201
|
+
* import { hexToString } from 'viem'
|
202
|
+
* const data = hexToString('0x48656c6c6f20576f726c6421')
|
203
|
+
* // 'Hello world!'
|
204
|
+
*
|
205
|
+
* @example
|
206
|
+
* import { hexToString } from 'viem'
|
207
|
+
* const data = hexToString('0x48656c6c6f20576f726c64210000000000000000000000000000000000000000', {
|
208
|
+
* size: 32,
|
209
|
+
* })
|
210
|
+
* // 'Hello world'
|
72
211
|
*/
|
73
|
-
export function hexToString(hex: Hex): string {
|
74
|
-
|
212
|
+
export function hexToString(hex: Hex, opts: HexToStringOpts = {}): string {
|
213
|
+
let bytes = hexToBytes(hex)
|
214
|
+
if (opts.size) {
|
215
|
+
assertSize(bytes, { size: opts.size })
|
216
|
+
bytes = trim(bytes, { dir: 'right' })
|
217
|
+
}
|
75
218
|
return new TextDecoder().decode(bytes)
|
76
219
|
}
|
@@ -1,62 +1,192 @@
|
|
1
1
|
import { BaseError } from '../../errors/index.js'
|
2
2
|
import type { ByteArray, Hex } from '../../types/index.js'
|
3
3
|
import { isHex } from '../data/isHex.js'
|
4
|
+
import { pad } from '../data/pad.js'
|
5
|
+
import { assertSize } from './fromHex.js'
|
4
6
|
import type { NumberToHexOpts } from './toHex.js'
|
5
7
|
import { numberToHex } from './toHex.js'
|
6
8
|
|
7
9
|
const encoder = new TextEncoder()
|
8
10
|
|
9
|
-
|
11
|
+
export type ToBytesParameters = {
|
12
|
+
/** Size of the output bytes. */
|
13
|
+
size?: number
|
14
|
+
}
|
15
|
+
|
16
|
+
/**
|
17
|
+
* Encodes a UTF-8 string, hex value, bigint, number or boolean to a byte array.
|
18
|
+
*
|
19
|
+
* - Docs: https://viem.sh/docs/utilities/toBytes.html
|
20
|
+
* - Example: https://viem.sh/docs/utilities/toBytes.html#usage
|
21
|
+
*
|
22
|
+
* @param value Value to encode.
|
23
|
+
* @param opts Options.
|
24
|
+
* @returns Byte array value.
|
25
|
+
*
|
26
|
+
* @example
|
27
|
+
* import { toBytes } from 'viem'
|
28
|
+
* const data = toBytes('Hello world')
|
29
|
+
* // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])
|
30
|
+
*
|
31
|
+
* @example
|
32
|
+
* import { toBytes } from 'viem'
|
33
|
+
* const data = toBytes(420)
|
34
|
+
* // Uint8Array([1, 164])
|
35
|
+
*
|
36
|
+
* @example
|
37
|
+
* import { toBytes } from 'viem'
|
38
|
+
* const data = toBytes(420, { size: 4 })
|
39
|
+
* // Uint8Array([0, 0, 1, 164])
|
40
|
+
*/
|
10
41
|
export function toBytes(
|
11
42
|
value: string | bigint | number | boolean | Hex,
|
43
|
+
opts: ToBytesParameters = {},
|
12
44
|
): ByteArray {
|
13
45
|
if (typeof value === 'number' || typeof value === 'bigint')
|
14
|
-
return numberToBytes(value)
|
15
|
-
if (typeof value === 'boolean') return boolToBytes(value)
|
16
|
-
if (isHex(value)) return hexToBytes(value)
|
17
|
-
return stringToBytes(value)
|
46
|
+
return numberToBytes(value, opts)
|
47
|
+
if (typeof value === 'boolean') return boolToBytes(value, opts)
|
48
|
+
if (isHex(value)) return hexToBytes(value, opts)
|
49
|
+
return stringToBytes(value, opts)
|
50
|
+
}
|
51
|
+
|
52
|
+
export type BoolToHexOpts = {
|
53
|
+
/** Size of the output bytes. */
|
54
|
+
size?: number
|
18
55
|
}
|
19
56
|
|
20
57
|
/**
|
21
|
-
*
|
58
|
+
* Encodes a boolean into a byte array.
|
59
|
+
*
|
60
|
+
* - Docs: https://viem.sh/docs/utilities/toBytes.html#booltobytes
|
61
|
+
*
|
62
|
+
* @param value Boolean value to encode.
|
63
|
+
* @param opts Options.
|
64
|
+
* @returns Byte array value.
|
65
|
+
*
|
66
|
+
* @example
|
67
|
+
* import { boolToBytes } from 'viem'
|
68
|
+
* const data = boolToBytes(true)
|
69
|
+
* // Uint8Array([1])
|
70
|
+
*
|
71
|
+
* @example
|
72
|
+
* import { boolToBytes } from 'viem'
|
73
|
+
* const data = boolToBytes(true, { size: 32 })
|
74
|
+
* // Uint8Array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
|
22
75
|
*/
|
23
|
-
export function boolToBytes(value: boolean) {
|
76
|
+
export function boolToBytes(value: boolean, opts: BoolToHexOpts = {}) {
|
24
77
|
const bytes = new Uint8Array(1)
|
25
78
|
bytes[0] = Number(value)
|
79
|
+
if (typeof opts.size === 'number') {
|
80
|
+
assertSize(bytes, { size: opts.size })
|
81
|
+
return pad(bytes, { size: opts.size })
|
82
|
+
}
|
26
83
|
return bytes
|
27
84
|
}
|
28
85
|
|
86
|
+
export type HexToBytesOpts = {
|
87
|
+
/** Size of the output bytes. */
|
88
|
+
size?: number
|
89
|
+
}
|
90
|
+
|
29
91
|
/**
|
30
|
-
*
|
92
|
+
* Encodes a hex string into a byte array.
|
93
|
+
*
|
94
|
+
* - Docs: https://viem.sh/docs/utilities/toBytes.html#hextobytes
|
95
|
+
*
|
96
|
+
* @param hex Hex string to encode.
|
97
|
+
* @param opts Options.
|
98
|
+
* @returns Byte array value.
|
99
|
+
*
|
100
|
+
* @example
|
101
|
+
* import { hexToBytes } from 'viem'
|
102
|
+
* const data = hexToBytes('0x48656c6c6f20776f726c6421')
|
103
|
+
* // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])
|
104
|
+
*
|
105
|
+
* @example
|
106
|
+
* import { hexToBytes } from 'viem'
|
107
|
+
* const data = hexToBytes('0x48656c6c6f20776f726c6421', { size: 32 })
|
108
|
+
* // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
31
109
|
*/
|
32
|
-
export function hexToBytes(hex_: Hex): ByteArray {
|
33
|
-
let hex = hex_
|
110
|
+
export function hexToBytes(hex_: Hex, opts: HexToBytesOpts = {}): ByteArray {
|
111
|
+
let hex = hex_
|
112
|
+
if (opts.size) {
|
113
|
+
assertSize(hex, { size: opts.size })
|
114
|
+
hex = pad(hex, { dir: 'right', size: opts.size })
|
115
|
+
}
|
34
116
|
|
35
|
-
|
117
|
+
let hexString = hex.slice(2) as string
|
118
|
+
if (hexString.length % 2) hexString = `0${hexString}`
|
36
119
|
|
37
|
-
const bytes = new Uint8Array(
|
120
|
+
const bytes = new Uint8Array(hexString.length / 2)
|
38
121
|
for (let index = 0; index < bytes.length; index++) {
|
39
122
|
const start = index * 2
|
40
|
-
const hexByte =
|
123
|
+
const hexByte = hexString.slice(start, start + 2)
|
41
124
|
const byte = Number.parseInt(hexByte, 16)
|
42
125
|
if (Number.isNaN(byte) || byte < 0)
|
43
|
-
throw new BaseError(
|
126
|
+
throw new BaseError(
|
127
|
+
`Invalid byte sequence ("${hexByte}" in "${hexString}").`,
|
128
|
+
)
|
44
129
|
bytes[index] = byte
|
45
130
|
}
|
46
131
|
return bytes
|
47
132
|
}
|
48
133
|
|
49
134
|
/**
|
50
|
-
*
|
135
|
+
* Encodes a number into a byte array.
|
136
|
+
*
|
137
|
+
* - Docs: https://viem.sh/docs/utilities/toBytes.html#numbertobytes
|
138
|
+
*
|
139
|
+
* @param value Number to encode.
|
140
|
+
* @param opts Options.
|
141
|
+
* @returns Byte array value.
|
142
|
+
*
|
143
|
+
* @example
|
144
|
+
* import { numberToBytes } from 'viem'
|
145
|
+
* const data = numberToBytes(420)
|
146
|
+
* // Uint8Array([1, 164])
|
147
|
+
*
|
148
|
+
* @example
|
149
|
+
* import { numberToBytes } from 'viem'
|
150
|
+
* const data = numberToBytes(420, { size: 4 })
|
151
|
+
* // Uint8Array([0, 0, 1, 164])
|
51
152
|
*/
|
52
153
|
export function numberToBytes(value: bigint | number, opts?: NumberToHexOpts) {
|
53
154
|
const hex = numberToHex(value, opts)
|
54
155
|
return hexToBytes(hex)
|
55
156
|
}
|
56
157
|
|
158
|
+
export type StringToBytesOpts = {
|
159
|
+
/** Size of the output bytes. */
|
160
|
+
size?: number
|
161
|
+
}
|
162
|
+
|
57
163
|
/**
|
58
|
-
*
|
164
|
+
* Encodes a UTF-8 string into a byte array.
|
165
|
+
*
|
166
|
+
* - Docs: https://viem.sh/docs/utilities/toBytes.html#stringtobytes
|
167
|
+
*
|
168
|
+
* @param value String to encode.
|
169
|
+
* @param opts Options.
|
170
|
+
* @returns Byte array value.
|
171
|
+
*
|
172
|
+
* @example
|
173
|
+
* import { stringToBytes } from 'viem'
|
174
|
+
* const data = stringToBytes('Hello world!')
|
175
|
+
* // Uint8Array([72, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 33])
|
176
|
+
*
|
177
|
+
* @example
|
178
|
+
* import { stringToBytes } from 'viem'
|
179
|
+
* const data = stringToBytes('Hello world!', { size: 32 })
|
180
|
+
* // Uint8Array([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
|
59
181
|
*/
|
60
|
-
export function stringToBytes(
|
61
|
-
|
182
|
+
export function stringToBytes(
|
183
|
+
value: string,
|
184
|
+
opts: StringToBytesOpts = {},
|
185
|
+
): ByteArray {
|
186
|
+
const bytes = encoder.encode(value)
|
187
|
+
if (typeof opts.size === 'number') {
|
188
|
+
assertSize(bytes, { size: opts.size })
|
189
|
+
return pad(bytes, { dir: 'right', size: opts.size })
|
190
|
+
}
|
191
|
+
return bytes
|
62
192
|
}
|
@@ -1,58 +1,162 @@
|
|
1
1
|
import { pad } from '../data/index.js'
|
2
2
|
import type { ByteArray, Hex } from '../../types/index.js'
|
3
3
|
import { IntegerOutOfRangeError } from '../../errors/index.js'
|
4
|
+
import { assertSize } from './fromHex.js'
|
4
5
|
|
5
6
|
const hexes = Array.from({ length: 256 }, (_v, i) =>
|
6
7
|
i.toString(16).padStart(2, '0'),
|
7
8
|
)
|
8
9
|
|
10
|
+
export type ToHexParameters = {
|
11
|
+
/** The size (in bytes) of the output hex value. */
|
12
|
+
size?: number
|
13
|
+
}
|
14
|
+
|
9
15
|
/**
|
10
|
-
*
|
16
|
+
* Encodes a string, number, bigint, or ByteArray into a hex string
|
17
|
+
*
|
18
|
+
* - Docs: https://viem.sh/docs/utilities/toHex.html
|
19
|
+
* - Example: https://viem.sh/docs/utilities/toHex.html#usage
|
20
|
+
*
|
21
|
+
* @param value Value to encode.
|
22
|
+
* @param opts Options.
|
23
|
+
* @returns Hex value.
|
24
|
+
*
|
25
|
+
* @example
|
26
|
+
* import { toHex } from 'viem'
|
27
|
+
* const data = toHex('Hello world')
|
28
|
+
* // '0x48656c6c6f20776f726c6421'
|
29
|
+
*
|
30
|
+
* @example
|
31
|
+
* import { toHex } from 'viem'
|
32
|
+
* const data = toHex(420)
|
33
|
+
* // '0x1a4'
|
34
|
+
*
|
35
|
+
* @example
|
36
|
+
* import { toHex } from 'viem'
|
37
|
+
* const data = toHex('Hello world', { size: 32 })
|
38
|
+
* // '0x48656c6c6f20776f726c64210000000000000000000000000000000000000000'
|
11
39
|
*/
|
12
|
-
export function
|
13
|
-
|
40
|
+
export function toHex(
|
41
|
+
value: string | number | bigint | boolean | ByteArray,
|
42
|
+
opts: ToHexParameters = {},
|
43
|
+
): Hex {
|
44
|
+
if (typeof value === 'number' || typeof value === 'bigint')
|
45
|
+
return numberToHex(value, opts)
|
46
|
+
if (typeof value === 'string') {
|
47
|
+
return stringToHex(value, opts)
|
48
|
+
}
|
49
|
+
if (typeof value === 'boolean') return boolToHex(value, opts)
|
50
|
+
return bytesToHex(value, opts)
|
51
|
+
}
|
52
|
+
|
53
|
+
export type BoolToHexOpts = {
|
54
|
+
/** The size (in bytes) of the output hex value. */
|
55
|
+
size?: number
|
14
56
|
}
|
15
57
|
|
16
58
|
/**
|
17
|
-
*
|
59
|
+
* Encodes a boolean into a hex string
|
60
|
+
*
|
61
|
+
* - Docs: https://viem.sh/docs/utilities/toHex.html#booltohex
|
62
|
+
*
|
63
|
+
* @param value Value to encode.
|
64
|
+
* @param opts Options.
|
65
|
+
* @returns Hex value.
|
66
|
+
*
|
67
|
+
* @example
|
68
|
+
* import { boolToHex } from 'viem'
|
69
|
+
* const data = boolToHex(true)
|
70
|
+
* // '0x1'
|
71
|
+
*
|
72
|
+
* @example
|
73
|
+
* import { boolToHex } from 'viem'
|
74
|
+
* const data = boolToHex(false)
|
75
|
+
* // '0x0'
|
76
|
+
*
|
77
|
+
* @example
|
78
|
+
* import { boolToHex } from 'viem'
|
79
|
+
* const data = boolToHex(true, { size: 32 })
|
80
|
+
* // '0x0000000000000000000000000000000000000000000000000000000000000001'
|
18
81
|
*/
|
19
|
-
export function
|
20
|
-
|
21
|
-
|
22
|
-
hex
|
82
|
+
export function boolToHex(value: boolean, opts: BoolToHexOpts = {}): Hex {
|
83
|
+
const hex: Hex = `0x${Number(value)}`
|
84
|
+
if (typeof opts.size === 'number') {
|
85
|
+
assertSize(hex, { size: opts.size })
|
86
|
+
return pad(hex, { size: opts.size })
|
23
87
|
}
|
24
|
-
return
|
88
|
+
return hex
|
89
|
+
}
|
90
|
+
|
91
|
+
export type BytesToHexOpts = {
|
92
|
+
/** The size (in bytes) of the output hex value. */
|
93
|
+
size?: number
|
25
94
|
}
|
26
95
|
|
27
96
|
/**
|
28
|
-
*
|
97
|
+
* Encodes a bytes array into a hex string
|
98
|
+
*
|
99
|
+
* - Docs: https://viem.sh/docs/utilities/toHex.html#bytestohex
|
100
|
+
*
|
101
|
+
* @param value Value to encode.
|
102
|
+
* @param opts Options.
|
103
|
+
* @returns Hex value.
|
104
|
+
*
|
105
|
+
* @example
|
106
|
+
* import { bytesToHex } from 'viem'
|
107
|
+
* const data = bytesToHex(Uint8Array.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33])
|
108
|
+
* // '0x48656c6c6f20576f726c6421'
|
109
|
+
*
|
110
|
+
* @example
|
111
|
+
* import { bytesToHex } from 'viem'
|
112
|
+
* const data = bytesToHex(Uint8Array.from([72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]), { size: 32 })
|
113
|
+
* // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'
|
29
114
|
*/
|
30
|
-
export function
|
31
|
-
|
32
|
-
)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
115
|
+
export function bytesToHex(value: ByteArray, opts: BytesToHexOpts = {}): Hex {
|
116
|
+
let hexString = ''
|
117
|
+
for (let i = 0; i < value.length; i++) {
|
118
|
+
hexString += hexes[value[i]]
|
119
|
+
}
|
120
|
+
|
121
|
+
const hex: Hex = `0x${hexString}`
|
122
|
+
if (typeof opts.size === 'number') {
|
123
|
+
assertSize(hex, { size: opts.size })
|
124
|
+
return pad(hex, { dir: 'right', size: opts.size })
|
37
125
|
}
|
38
|
-
|
39
|
-
return bytesToHex(value)
|
126
|
+
return hex
|
40
127
|
}
|
41
128
|
|
42
129
|
export type NumberToHexOpts =
|
43
130
|
| {
|
44
|
-
|
131
|
+
/** Whether or not the number of a signed representation. */
|
45
132
|
signed?: boolean
|
46
|
-
|
133
|
+
/** The size (in bytes) of the output hex value. */
|
47
134
|
size: number
|
48
135
|
}
|
49
136
|
| {
|
50
137
|
signed?: never
|
51
|
-
size
|
138
|
+
/** The size (in bytes) of the output hex value. */
|
139
|
+
size?: number
|
52
140
|
}
|
53
141
|
|
54
142
|
/**
|
55
|
-
*
|
143
|
+
* Encodes a number or bigint into a hex string
|
144
|
+
*
|
145
|
+
* - Docs: https://viem.sh/docs/utilities/toHex.html#numbertohex
|
146
|
+
*
|
147
|
+
* @param value Value to encode.
|
148
|
+
* @param opts Options.
|
149
|
+
* @returns Hex value.
|
150
|
+
*
|
151
|
+
* @example
|
152
|
+
* import { numberToHex } from 'viem'
|
153
|
+
* const data = numberToHex(420)
|
154
|
+
* // '0x1a4'
|
155
|
+
*
|
156
|
+
* @example
|
157
|
+
* import { numberToHex } from 'viem'
|
158
|
+
* const data = numberToHex(420, { size: 32 })
|
159
|
+
* // '0x00000000000000000000000000000000000000000000000000000000000001a4'
|
56
160
|
*/
|
57
161
|
export function numberToHex(
|
58
162
|
value_: number | bigint,
|
@@ -91,12 +195,33 @@ export function numberToHex(
|
|
91
195
|
return hex
|
92
196
|
}
|
93
197
|
|
198
|
+
export type StringToHexOpts = {
|
199
|
+
/** The size (in bytes) of the output hex value. */
|
200
|
+
size?: number
|
201
|
+
}
|
202
|
+
|
94
203
|
const encoder = new TextEncoder()
|
95
204
|
|
96
205
|
/**
|
97
|
-
*
|
206
|
+
* Encodes a UTF-8 string into a hex string
|
207
|
+
*
|
208
|
+
* - Docs: https://viem.sh/docs/utilities/toHex.html#stringtohex
|
209
|
+
*
|
210
|
+
* @param value Value to encode.
|
211
|
+
* @param opts Options.
|
212
|
+
* @returns Hex value.
|
213
|
+
*
|
214
|
+
* @example
|
215
|
+
* import { stringToHex } from 'viem'
|
216
|
+
* const data = stringToHex('Hello World!')
|
217
|
+
* // '0x48656c6c6f20576f726c6421'
|
218
|
+
*
|
219
|
+
* @example
|
220
|
+
* import { stringToHex } from 'viem'
|
221
|
+
* const data = stringToHex('Hello World!', { size: 32 })
|
222
|
+
* // '0x48656c6c6f20576f726c64210000000000000000000000000000000000000000'
|
98
223
|
*/
|
99
|
-
export function stringToHex(value_: string): Hex {
|
224
|
+
export function stringToHex(value_: string, opts: StringToHexOpts = {}): Hex {
|
100
225
|
const value = encoder.encode(value_)
|
101
|
-
return
|
226
|
+
return bytesToHex(value, opts)
|
102
227
|
}
|
@@ -33,11 +33,12 @@ export function getContractError(
|
|
33
33
|
sender?: Address
|
34
34
|
},
|
35
35
|
) {
|
36
|
-
const { code, data, message } = (
|
36
|
+
const { code, data, message, shortMessage } = (
|
37
37
|
err instanceof RawContractError
|
38
38
|
? err
|
39
|
-
: err
|
40
|
-
err instanceof
|
39
|
+
: !(err.cause && 'data' in (err.cause as BaseError)) &&
|
40
|
+
(err instanceof CallExecutionError ||
|
41
|
+
err instanceof EstimateGasExecutionError)
|
41
42
|
? ((err.cause as BaseError)?.cause as BaseError)?.cause || {}
|
42
43
|
: err.cause || {}
|
43
44
|
) as RawContractError
|
@@ -45,12 +46,15 @@ export function getContractError(
|
|
45
46
|
let cause = err
|
46
47
|
if (err instanceof AbiDecodingZeroDataError) {
|
47
48
|
cause = new ContractFunctionZeroDataError({ functionName })
|
48
|
-
} else if (
|
49
|
+
} else if (
|
50
|
+
code === EXECUTION_REVERTED_ERROR_CODE &&
|
51
|
+
(data || message || shortMessage)
|
52
|
+
) {
|
49
53
|
cause = new ContractFunctionRevertedError({
|
50
54
|
abi,
|
51
55
|
data,
|
52
56
|
functionName,
|
53
|
-
message,
|
57
|
+
message: shortMessage ?? message,
|
54
58
|
})
|
55
59
|
}
|
56
60
|
|