(
value: AbiParameterToPrimitiveType<param>,
{
length,
param,
}: {
length: number | null
param: param
},
)
| 237 | | ErrorType |
| 238 | |
| 239 | function encodeArray<const param extends AbiParameter>( |
| 240 | value: AbiParameterToPrimitiveType<param>, |
| 241 | { |
| 242 | length, |
| 243 | param, |
| 244 | }: { |
| 245 | length: number | null |
| 246 | param: param |
| 247 | }, |
| 248 | ): PreparedParam { |
| 249 | const dynamic = length === null |
| 250 | |
| 251 | if (!Array.isArray(value)) throw new InvalidArrayError(value) |
| 252 | if (!dynamic && value.length !== length) |
| 253 | throw new AbiEncodingArrayLengthMismatchError({ |
| 254 | expectedLength: length!, |
| 255 | givenLength: value.length, |
| 256 | type: `${param.type}[${length}]`, |
| 257 | }) |
| 258 | |
| 259 | // Zero-length fixed arrays of dynamic types (e.g. `string[0]`) are dynamic |
| 260 | // per the ABI spec, even though they have no elements to inspect. |
| 261 | let dynamicChild = value.length === 0 && isDynamicType(param) |
| 262 | const preparedParams: PreparedParam[] = [] |
| 263 | for (let i = 0; i < value.length; i++) { |
| 264 | const preparedParam = prepareParam({ param, value: value[i] }) |
| 265 | if (preparedParam.dynamic) dynamicChild = true |
| 266 | preparedParams.push(preparedParam) |
| 267 | } |
| 268 | |
| 269 | if (dynamic || dynamicChild) { |
| 270 | const data = encodeParams(preparedParams) |
| 271 | if (dynamic) { |
| 272 | const length = numberToHex(preparedParams.length, { size: 32 }) |
| 273 | return { |
| 274 | dynamic: true, |
| 275 | encoded: concatHex([length, data]), |
| 276 | } |
| 277 | } |
| 278 | if (dynamicChild) return { dynamic: true, encoded: data } |
| 279 | } |
| 280 | return { |
| 281 | dynamic: false, |
| 282 | encoded: concatHex(preparedParams.map(({ encoded }) => encoded)), |
| 283 | } |
| 284 | } |
| 285 | |
| 286 | type EncodeBytesErrorType = |
| 287 | | AbiEncodingBytesSizeMismatchErrorType |
no test coverage detected