{"version":3,"sources":["../src/mrl.ts","../src/getTransferData/getExecuteTransferData.ts","../src/services/wormhole/WormholeService.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-evm-tokenbridge@4.24.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/@wormhole-foundation/sdk-evm-tokenbridge/src/index.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-evm-tokenbridge@4.24.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/@wormhole-foundation/sdk-evm-tokenbridge/src/tokenBridge.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-evm-core@4.24.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/@wormhole-foundation/sdk-evm-core/src/index.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-evm-core@4.24.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/@wormhole-foundation/sdk-evm-core/src/core.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-evm-core@4.24.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/@wormhole-foundation/sdk-evm-core/src/ethers-contracts/index.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/_version.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/utils/properties.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/utils/errors.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/utils/data.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/utils/maths.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/utils/events.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/utils/utf8.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/utils/rlp-encode.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/coders/abstract-coder.ts","../../../node_modules/.pnpm/@noble+hashes@1.3.2/node_modules/@noble/hashes/src/_assert.ts","../../../node_modules/.pnpm/@noble+hashes@1.3.2/node_modules/@noble/hashes/src/_u64.ts","../../../node_modules/.pnpm/@noble+hashes@1.3.2/node_modules/@noble/hashes/src/utils.ts","../../../node_modules/.pnpm/@noble+hashes@1.3.2/node_modules/@noble/hashes/src/sha3.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/crypto/keccak.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/constants/addresses.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/address/address.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/address/contract-address.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/address/checks.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/typed.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/coders/address.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/coders/anonymous.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/coders/array.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/coders/boolean.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/coders/bytes.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/coders/fixed-bytes.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/coders/null.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/coders/number.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/coders/string.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/coders/tuple.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/transaction/accesslist.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/hash/id.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/fragments.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/abi-coder.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/abi/interface.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/providers/provider.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/contract/wrappers.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/contract/contract.ts","../../../node_modules/.pnpm/ethers@6.16.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/ethers/src.ts/contract/factory.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-evm-core@4.24.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/@wormhole-foundation/sdk-evm-core/src/ethers-contracts/factories/Implementation__factory.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-evm-tokenbridge@4.24.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/@wormhole-foundation/sdk-evm-tokenbridge/src/automaticTokenBridge.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-evm-tokenbridge@4.24.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/@wormhole-foundation/sdk-evm-tokenbridge/src/executorTokenBridge.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-base@4.24.0/node_modules/@wormhole-foundation/sdk-base/src/utils/array.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-base@4.24.0/node_modules/@wormhole-foundation/sdk-base/src/utils/mapping.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-base@4.24.0/node_modules/@wormhole-foundation/sdk-base/src/utils/misc.ts","../../../node_modules/.pnpm/binary-layout@1.3.2/node_modules/binary-layout/src/layout.ts","../../../node_modules/.pnpm/binary-layout@1.3.2/node_modules/binary-layout/src/utils.ts","../../../node_modules/.pnpm/binary-layout@1.3.2/node_modules/binary-layout/src/size.ts","../../../node_modules/.pnpm/binary-layout@1.3.2/node_modules/binary-layout/src/serialize.ts","../../../node_modules/.pnpm/binary-layout@1.3.2/node_modules/binary-layout/src/deserialize.ts","../../../node_modules/.pnpm/binary-layout@1.3.2/node_modules/binary-layout/src/fixedDynamic.ts","../../../node_modules/.pnpm/binary-layout@1.3.2/node_modules/binary-layout/src/discriminate.ts","../../../node_modules/.pnpm/binary-layout@1.3.2/node_modules/binary-layout/src/items.ts","../../../node_modules/.pnpm/binary-layout@1.3.2/node_modules/binary-layout/src/setEndianness.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-base@4.24.0/node_modules/@wormhole-foundation/sdk-base/src/utils/encoding.ts","../../../node_modules/.pnpm/@scure+base@1.2.6/node_modules/@scure/base/index.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-base@4.24.0/node_modules/@wormhole-foundation/sdk-base/src/constants/chains.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-base@4.24.0/node_modules/@wormhole-foundation/sdk-base/src/constants/platforms.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-base@4.24.0/node_modules/@wormhole-foundation/sdk-base/src/constants/tbtc.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/cryptoNode.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/utils.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/_md.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/_u64.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/sha2.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/sha256.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/sha3.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/sha512.ts","../../../node_modules/.pnpm/@noble+hashes@1.8.0/node_modules/@noble/hashes/src/hmac.ts","../../../node_modules/.pnpm/@noble+curves@1.9.7/node_modules/@noble/curves/src/utils.ts","../../../node_modules/.pnpm/@noble+curves@1.9.7/node_modules/@noble/curves/src/abstract/modular.ts","../../../node_modules/.pnpm/@noble+curves@1.9.7/node_modules/@noble/curves/src/abstract/curve.ts","../../../node_modules/.pnpm/@noble+curves@1.9.7/node_modules/@noble/curves/src/abstract/weierstrass.ts","../../../node_modules/.pnpm/@noble+curves@1.9.7/node_modules/@noble/curves/src/_shortw_utils.ts","../../../node_modules/.pnpm/@noble+curves@1.9.7/node_modules/@noble/curves/src/secp256k1.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/universalAddress.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/address.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/vaa/registration.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/layout-items/amount.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/layout-items/chain.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/layout-items/circle.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/layout-items/date.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/layout-items/guardianSet.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/layout-items/payloadId.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/layout-items/sequence.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/signature.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/layout-items/signature.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/layout-items/universalAddress.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/layout-items/string.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/vaa/vaa.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/vaa/functions.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/circleBridge/automaticCircleBridgeLayout.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/circleBridge/circleBridgeLayout.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/circleBridge/circleBridge.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/tokenBridge/tokenBridgeLayout.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/portico/porticoLayout.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/portico/portico.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/relayer/relayerLayout.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/tokenBridge/automaticTokenBridgeLayout.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/tokenBridge/tokenBridge.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/tokenBridge/executorTokenBridgeLayout.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/governance/globalAccountant.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/governance/layout.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/tbtc/tbtc.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/tbtc/tbtcLayout.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/executor/relayInstruction.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/executor/signedQuote.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-definitions@4.24.0/node_modules/@wormhole-foundation/sdk-definitions/src/protocols/executor/api.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-evm-tokenbridge@4.24.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/@wormhole-foundation/sdk-evm-tokenbridge/src/ethers-contracts/index.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-evm-tokenbridge@4.24.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/@wormhole-foundation/sdk-evm-tokenbridge/src/ethers-contracts/factories/Bridge__factory.ts","../../../node_modules/.pnpm/@wormhole-foundation+sdk-evm-tokenbridge@4.24.0_bufferutil@4.1.0_utf-8-validate@5.0.10/node_modules/@wormhole-foundation/sdk-evm-tokenbridge/src/ethers-contracts/factories/TokenBridgeRelayer__factory.ts","../src/services/wormhole/WormholeWagmiSigner.ts","../src/getTransferData/getTransferData.ts","../src/services/snowbridge/SnowbridgeService.ts","../src/getTransferData/getBridgeChainData.ts","../src/getTransferData/getSourceData.ts","../src/getTransferData/getTransferData.utils.ts"],"sourcesContent":["import {\n  ConfigService,\n  MrlAssetRoute,\n  mrlRoutesMap,\n} from '@moonbeam-network/xcm-config';\nimport type {\n  AnyAsset,\n  AnyChain,\n  Ecosystem,\n} from '@moonbeam-network/xcm-types';\nimport {\n  getExecuteTransferData,\n  type WormholeExecuteTransferParams,\n} from './getTransferData/getExecuteTransferData';\nimport { getTransferData } from './getTransferData/getTransferData';\n\nconst DEFAULT_SERVICE = new ConfigService({ routes: mrlRoutesMap });\n\nexport interface MrlOptions {\n  configService?: ConfigService;\n  ecosystem?: Ecosystem;\n}\n\nexport function Mrl(options?: MrlOptions) {\n  const service = options?.configService ?? DEFAULT_SERVICE;\n  const sources = service.getSourceChains({ ecosystem: options?.ecosystem });\n\n  return {\n    sources,\n    setSource(source: string | AnyChain) {\n      const destinations = service.getDestinationChains({ source });\n\n      return {\n        destinations,\n        setDestination(destination: string | AnyChain) {\n          const assets = service.getRouteAssets({ source, destination });\n\n          return {\n            assets,\n            setAsset(asset: string | AnyAsset) {\n              const route = service.getAssetRoute({\n                asset,\n                source,\n                destination,\n              });\n\n              if (!(route instanceof MrlAssetRoute)) {\n                throw new Error('Route must be an MrlAssetRoute');\n              }\n\n              return {\n                setIsAutomatic(isAutomatic: boolean) {\n                  return {\n                    setAddresses({\n                      sourceAddress,\n                      destinationAddress,\n                    }: {\n                      sourceAddress: string;\n                      destinationAddress: string;\n                    }) {\n                      return getTransferData({\n                        route,\n                        sourceAddress,\n                        destinationAddress,\n                        isAutomatic,\n                      });\n                    },\n                  };\n                },\n              };\n            },\n          };\n        },\n      };\n    },\n    getExecuteTransferData({ txId, chain }: WormholeExecuteTransferParams) {\n      return getExecuteTransferData({ txId, chain });\n    },\n  };\n}\n","import { type ContractConfig, MrlBuilder } from '@moonbeam-network/xcm-builder';\nimport { EvmService, type EvmSigner } from '@moonbeam-network/xcm-sdk';\nimport type { EvmChain, EvmParachain } from '@moonbeam-network/xcm-types';\nimport type { ExecuteTransferData } from '../mrl.interfaces';\nimport { WormholeService } from '../services/wormhole';\n\nexport interface WormholeExecuteTransferParams {\n  txId: string;\n  chain: EvmChain | EvmParachain;\n}\n\nexport async function getExecuteTransferData({\n  txId,\n  chain,\n}: WormholeExecuteTransferParams): Promise<ExecuteTransferData> {\n  // TODO this is just for wormhole\n  const wh = WormholeService.create(chain);\n\n  const vaa = await wh.getVaa(txId);\n  if (!vaa) {\n    // TODO handle softly when retrieving\n    throw new Error(`VAA not found for WormholeId ${txId}`);\n  }\n\n  const tokenTransfer = await wh.getTokenTransfer(vaa, txId);\n\n  const isXcm = vaa.payloadName === 'TransferWithPayload';\n\n  return {\n    vaa,\n    tokenTransfer,\n    async executeTransfer(signer: EvmSigner) {\n      const isComplete = await wh.isComplete(vaa, tokenTransfer);\n\n      if (isComplete) {\n        throw new Error('This transaction is already finalized in Wormhole');\n      }\n\n      if (isXcm) {\n        const bytes = await wh.getVaaBytes(vaa);\n\n        const contract = MrlBuilder()\n          .wormhole()\n          .contract()\n          .Gmp()\n          .wormholeTransferERC20()\n          .build({ bytes }) as ContractConfig;\n\n        const evm = EvmService.create(chain);\n        const hash = await evm.transfer(signer, contract);\n\n        return hash;\n      }\n\n      return await wh.completeTransfer(tokenTransfer, signer);\n    },\n  };\n}\n","import {\n  Protocols,\n  type WormholeConfig,\n  wormholeFactory,\n} from '@moonbeam-network/xcm-builder';\nimport '@wormhole-foundation/sdk-evm-tokenbridge';\nimport type { EvmSigner } from '@moonbeam-network/xcm-sdk';\nimport type { EvmChain, EvmParachain } from '@moonbeam-network/xcm-types';\nimport {\n  TokenTransfer,\n  type TransferQuote,\n  type Wormhole,\n} from '@wormhole-foundation/sdk-connect';\nimport { WormholeWagmiSigner } from './WormholeWagmiSigner';\n\nexport class WormholeService {\n  readonly chain: EvmChain | EvmParachain;\n\n  readonly #wh: Wormhole<'Mainnet' | 'Testnet'>;\n\n  static create(chain: EvmChain | EvmParachain): WormholeService {\n    return new WormholeService(chain);\n  }\n\n  constructor(chain: EvmChain | EvmParachain) {\n    this.chain = chain;\n    this.#wh = wormholeFactory(chain);\n  }\n\n  async createTokenTransfer(transfer: WormholeConfig): Promise<TokenTransfer> {\n    const { token, amount, from, to, protocol, payload } = transfer.args;\n\n    // Call the tokenTransfer method with correct overload parameters\n    if (protocol === Protocols.TokenBridge) {\n      return await this.#wh[transfer.func](\n        token,\n        amount,\n        from,\n        to,\n        protocol,\n        payload,\n      );\n    } else if (protocol === Protocols.AutomaticTokenBridge) {\n      return await this.#wh[transfer.func](\n        token,\n        amount,\n        from,\n        to,\n        protocol,\n        // For AutomaticTokenBridge, the 6th parameter is nativeGas (bigint), not payload\n        payload ? 0n : undefined,\n      );\n    } else {\n      throw new Error(`Unsupported protocol: ${protocol}`);\n    }\n  }\n\n  async getFee(transfer: WormholeConfig): Promise<TransferQuote | undefined> {\n    const { amount } = transfer.args;\n    if (amount === 0n) {\n      return undefined;\n    }\n\n    const xfer = await this.createTokenTransfer(transfer);\n\n    if (xfer.transfer.protocol === Protocols.ExecutorTokenBridge) {\n      throw new Error(`${Protocols.ExecutorTokenBridge} is not supported`);\n    }\n\n    return TokenTransfer.quoteTransfer(\n      this.#wh,\n      xfer.fromChain,\n      xfer.toChain,\n      xfer.transfer,\n    );\n  }\n\n  async transfer(\n    signer: EvmSigner,\n    transfer: WormholeConfig,\n  ): Promise<string[]> {\n    const xfer = await this.createTokenTransfer(transfer);\n\n    return xfer.initiateTransfer(new WormholeWagmiSigner(this.chain, signer));\n  }\n\n  async getVaa(txId: string) {\n    return await TokenTransfer.getTransferVaa(this.#wh, txId);\n  }\n\n  async getVaaBytes(vaa: TokenTransfer.VAA) {\n    return (\n      (await this.#wh.getVaaBytes({\n        chain: vaa.emitterChain,\n        emitter: vaa.emitterAddress,\n        sequence: vaa.sequence,\n      })) || undefined\n    );\n  }\n\n  async getTokenTransfer(vaa: TokenTransfer.VAA, txId: string) {\n    return await TokenTransfer.from(this.#wh, {\n      chain: vaa.emitterChain,\n      txid: txId,\n    });\n  }\n\n  async isComplete(vaa: TokenTransfer.VAA, tokenTransfer: TokenTransfer) {\n    const isComplete = await TokenTransfer.isTransferComplete(\n      tokenTransfer.toChain,\n      vaa,\n    );\n    return isComplete;\n  }\n\n  async completeTransfer(\n    tokenTransfer: TokenTransfer,\n    signer: EvmSigner,\n  ): Promise<string> {\n    const txIds = await tokenTransfer.completeTransfer(\n      new WormholeWagmiSigner(this.chain, signer),\n    );\n\n    return txIds[0];\n  }\n}\n",null,null,null,null,null,"/* Do NOT modify this file; see /src.ts/_admin/update-version.ts */\n\n/**\n *  The current version of Ethers.\n */\nexport const version: string = \"6.16.0\";\n","/**\n *  Property helper functions.\n *\n *  @_subsection api/utils:Properties  [about-properties]\n */\n\nfunction checkType(value: any, type: string, name: string): void {\n    const types = type.split(\"|\").map(t => t.trim());\n    for (let i = 0; i < types.length; i++) {\n        switch (type) {\n            case \"any\":\n                return;\n            case \"bigint\":\n            case \"boolean\":\n            case \"number\":\n            case \"string\":\n                if (typeof(value) === type) { return; }\n        }\n    }\n\n    const error: any = new Error(`invalid value for type ${ type }`);\n    error.code = \"INVALID_ARGUMENT\";\n    error.argument = `value.${ name }`;\n    error.value = value;\n\n    throw error;\n}\n\n/**\n *  Resolves to a new object that is a copy of %%value%%, but with all\n *  values resolved.\n */\nexport async function resolveProperties<T>(value: { [ P in keyof T ]: T[P] | Promise<T[P]>}): Promise<T> {\n    const keys = Object.keys(value);\n    const results = await Promise.all(keys.map((k) => Promise.resolve(value[<keyof T>k])));\n    return results.reduce((accum: any, v, index) => {\n        accum[keys[index]] = v;\n        return accum;\n    }, <{ [ P in keyof T]: T[P] }>{ });\n}\n\n/**\n *  Assigns the %%values%% to %%target%% as read-only values.\n *\n *  It %%types%% is specified, the values are checked.\n */\nexport function defineProperties<T>(\n target: T,\n values: { [ K in keyof T ]?: T[K] },\n types?: { [ K in keyof T ]?: string }): void {\n\n    for (let key in values) {\n        let value = values[key];\n\n        const type = (types ? types[key]: null);\n        if (type) { checkType(value, type, key); }\n\n        Object.defineProperty(target, key, { enumerable: true, value, writable: false });\n    }\n}\n","/**\n *  All errors in ethers include properties to ensure they are both\n *  human-readable (i.e. ``.message``) and machine-readable (i.e. ``.code``).\n *\n *  The [[isError]] function can be used to check the error ``code`` and\n *  provide a type guard for the properties present on that error interface.\n *\n *  @_section: api/utils/errors:Errors  [about-errors]\n */\n\nimport { version } from \"../_version.js\";\n\nimport { defineProperties } from \"./properties.js\";\n\nimport type {\n    TransactionRequest, TransactionReceipt, TransactionResponse\n} from \"../providers/index.js\";\n\nimport type { FetchRequest, FetchResponse } from \"./fetch.js\";\n\n/**\n *  An error may contain additional properties, but those must not\n *  conflict with any implicit properties.\n */\nexport type ErrorInfo<T> = Omit<T, \"code\" | \"name\" | \"message\" | \"shortMessage\"> & { shortMessage?: string };\n\n\nfunction stringify(value: any, seen?: Set<any>): any {\n    if (value == null) { return \"null\"; }\n\n    if (seen == null) { seen = new Set(); }\n    if (typeof(value) === \"object\") {\n        if (seen.has(value)) { return \"[Circular]\"; }\n        seen.add(value);\n    }\n\n    if (Array.isArray(value)) {\n        return \"[ \" + (value.map((v) => stringify(v, seen))).join(\", \") + \" ]\";\n    }\n\n    if (value instanceof Uint8Array) {\n        const HEX = \"0123456789abcdef\";\n        let result = \"0x\";\n        for (let i = 0; i < value.length; i++) {\n            result += HEX[value[i] >> 4];\n            result += HEX[value[i] & 0xf];\n        }\n        return result;\n    }\n\n    if (typeof(value) === \"object\" && typeof(value.toJSON) === \"function\") {\n        return stringify(value.toJSON(), seen);\n    }\n\n    switch (typeof(value)) {\n        case \"boolean\": case \"number\": case \"symbol\":\n            return value.toString();\n        case \"bigint\":\n            return BigInt(value).toString();\n        case \"string\":\n            return JSON.stringify(value);\n        case \"object\": {\n            const keys = Object.keys(value);\n            keys.sort();\n            return \"{ \" + keys.map((k) => `${ stringify(k, seen) }: ${ stringify(value[k], seen) }`).join(\", \") + \" }\";\n        }\n    }\n\n    return `[ COULD NOT SERIALIZE ]`;\n}\n\n/**\n *  All errors emitted by ethers have an **ErrorCode** to help\n *  identify and coalesce errors to simplify programmatic analysis.\n *\n *  Each **ErrorCode** is the %%code%% proerty of a coresponding\n *  [[EthersError]].\n *\n *  **Generic Errors**\n *\n *  **``\"UNKNOWN_ERROR\"``** - see [[UnknownError]]\n *\n *  **``\"NOT_IMPLEMENTED\"``** - see [[NotImplementedError]]\n *\n *  **``\"UNSUPPORTED_OPERATION\"``** - see [[UnsupportedOperationError]]\n *\n *  **``\"NETWORK_ERROR\"``** - see [[NetworkError]]\n *\n *  **``\"SERVER_ERROR\"``** - see [[ServerError]]\n *\n *  **``\"TIMEOUT\"``** - see [[TimeoutError]]\n *\n *  **``\"BAD_DATA\"``** - see [[BadDataError]]\n *\n *  **``\"CANCELLED\"``** - see [[CancelledError]]\n *\n *  **Operational Errors**\n *\n *  **``\"BUFFER_OVERRUN\"``** - see [[BufferOverrunError]]\n *\n *  **``\"NUMERIC_FAULT\"``** - see [[NumericFaultError]]\n *\n *  **Argument Errors**\n *\n *  **``\"INVALID_ARGUMENT\"``** - see [[InvalidArgumentError]]\n *\n *  **``\"MISSING_ARGUMENT\"``** - see [[MissingArgumentError]]\n *\n *  **``\"UNEXPECTED_ARGUMENT\"``** - see [[UnexpectedArgumentError]]\n *\n *  **``\"VALUE_MISMATCH\"``** - //unused//\n *\n *  **Blockchain Errors**\n *\n *  **``\"CALL_EXCEPTION\"``** - see [[CallExceptionError]]\n *\n *  **``\"INSUFFICIENT_FUNDS\"``** - see [[InsufficientFundsError]]\n *\n *  **``\"NONCE_EXPIRED\"``** - see [[NonceExpiredError]]\n *\n *  **``\"REPLACEMENT_UNDERPRICED\"``** - see [[ReplacementUnderpricedError]]\n *\n *  **``\"TRANSACTION_REPLACED\"``** - see [[TransactionReplacedError]]\n *\n *  **``\"UNCONFIGURED_NAME\"``** - see [[UnconfiguredNameError]]\n *\n *  **``\"OFFCHAIN_FAULT\"``** - see [[OffchainFaultError]]\n *\n *  **User Interaction Errors**\n *\n *  **``\"ACTION_REJECTED\"``** - see [[ActionRejectedError]]\n */\nexport type ErrorCode =\n\n    // Generic Errors\n    \"UNKNOWN_ERROR\" | \"NOT_IMPLEMENTED\" | \"UNSUPPORTED_OPERATION\" |\n    \"NETWORK_ERROR\" | \"SERVER_ERROR\" | \"TIMEOUT\" | \"BAD_DATA\" |\n    \"CANCELLED\" |\n\n    // Operational Errors\n    \"BUFFER_OVERRUN\" |  \"NUMERIC_FAULT\" |\n\n    // Argument Errors\n    \"INVALID_ARGUMENT\" | \"MISSING_ARGUMENT\" | \"UNEXPECTED_ARGUMENT\" |\n    \"VALUE_MISMATCH\" |\n\n    // Blockchain Errors\n    \"CALL_EXCEPTION\" | \"INSUFFICIENT_FUNDS\" | \"NONCE_EXPIRED\" |\n    \"REPLACEMENT_UNDERPRICED\" | \"TRANSACTION_REPLACED\" |\n    \"UNCONFIGURED_NAME\" | \"OFFCHAIN_FAULT\" |\n\n    // User Interaction\n    \"ACTION_REJECTED\"\n;\n\n/**\n *  All errors in Ethers include properties to assist in\n *  machine-readable errors.\n */\nexport interface EthersError<T extends ErrorCode = ErrorCode> extends Error {\n    /**\n     *  The string error code.\n     */\n    code: ErrorCode;\n\n    /**\n     *  A short message describing the error, with minimal additional\n     *  details.\n     */\n    shortMessage: string;\n\n    /**\n     *  Additional info regarding the error that may be useful.\n     *\n     *  This is generally helpful mostly for human-based debugging.\n     */\n    info?: Record<string, any>;\n\n    /**\n     *  Any related error.\n     */\n    error?: Error;\n}\n\n// Generic Errors\n\n/**\n *  This Error is a catch-all for when there is no way for Ethers to\n *  know what the underlying problem is.\n */\nexport interface UnknownError extends EthersError<\"UNKNOWN_ERROR\"> {\n    [ key: string ]: any;\n}\n\n/**\n *  This Error is mostly used as a stub for functionality that is\n *  intended for the future, but is currently not implemented.\n */\nexport interface NotImplementedError extends EthersError<\"NOT_IMPLEMENTED\"> {\n    /**\n     *  The attempted operation.\n     */\n    operation: string;\n}\n\n/**\n *  This Error indicates that the attempted operation is not supported.\n *\n *  This could range from a specific JSON-RPC end-point not supporting\n *  a feature to a specific configuration of an object prohibiting the\n *  operation.\n *\n *  For example, a [[Wallet]] with no connected [[Provider]] is unable\n *  to send a transaction.\n */\nexport interface UnsupportedOperationError extends EthersError<\"UNSUPPORTED_OPERATION\"> {\n    /**\n     *  The attempted operation.\n     */\n    operation: string;\n}\n\n/**\n *  This Error indicates a problem connecting to a network.\n */\nexport interface NetworkError extends EthersError<\"NETWORK_ERROR\"> {\n    /**\n     *  The network event.\n     */\n    event: string;\n}\n\n/**\n *  This Error indicates there was a problem fetching a resource from\n *  a server.\n */\nexport interface ServerError extends EthersError<\"SERVER_ERROR\"> {\n    /**\n     *  The requested resource.\n     */\n    request: FetchRequest | string;\n\n    /**\n     *  The response received from the server, if available.\n     */\n    response?: FetchResponse;\n}\n\n/**\n *  This Error indicates that the timeout duration has expired and\n *  that the operation has been implicitly cancelled.\n *\n *  The side-effect of the operation may still occur, as this\n *  generally means a request has been sent and there has simply\n *  been no response to indicate whether it was processed or not.\n */\nexport interface TimeoutError extends EthersError<\"TIMEOUT\"> {\n    /**\n     *  The attempted operation.\n     */\n    operation: string;\n\n    /**\n     *  The reason.\n     */\n    reason: string;\n\n    /**\n     *  The resource request, if available.\n     */\n    request?: FetchRequest;\n}\n\n/**\n *  This Error indicates that a provided set of data cannot\n *  be correctly interpreted.\n */\nexport interface BadDataError extends EthersError<\"BAD_DATA\"> {\n    /**\n     *  The data.\n     */\n    value: any;\n}\n\n/**\n *  This Error indicates that the operation was cancelled by a\n *  programmatic call, for example to ``cancel()``.\n */\nexport interface CancelledError extends EthersError<\"CANCELLED\"> {\n}\n\n\n// Operational Errors\n\n/**\n *  This Error indicates an attempt was made to read outside the bounds\n *  of protected data.\n *\n *  Most operations in Ethers are protected by bounds checks, to mitigate\n *  exploits when parsing data.\n */\nexport interface BufferOverrunError extends EthersError<\"BUFFER_OVERRUN\"> {\n    /**\n     *  The buffer that was overrun.\n     */\n    buffer: Uint8Array;\n\n    /**\n     *  The length of the buffer.\n     */\n    length: number;\n\n    /**\n     *  The offset that was requested.\n     */\n    offset: number;\n}\n\n/**\n *  This Error indicates an operation which would result in incorrect\n *  arithmetic output has occurred.\n *\n *  For example, trying to divide by zero or using a ``uint8`` to store\n *  a negative value.\n */\nexport interface NumericFaultError extends EthersError<\"NUMERIC_FAULT\"> {\n    /**\n     *  The attempted operation.\n     */\n    operation: string;\n\n    /**\n     *  The fault reported.\n     */\n    fault: string;\n\n    /**\n     *  The value the operation was attempted against.\n     */\n    value: any;\n}\n\n\n// Argument Errors\n\n/**\n *  This Error indicates an incorrect type or value was passed to\n *  a function or method.\n */\nexport interface InvalidArgumentError extends EthersError<\"INVALID_ARGUMENT\"> {\n    /**\n     *  The name of the argument.\n     */\n    argument: string;\n\n    /**\n     *  The value that was provided.\n     */\n    value: any;\n\n    info?: Record<string, any>\n}\n\n/**\n *  This Error indicates there were too few arguments were provided.\n */\nexport interface MissingArgumentError extends EthersError<\"MISSING_ARGUMENT\"> {\n    /**\n     *  The number of arguments received.\n     */\n    count: number;\n\n    /**\n     *  The number of arguments expected.\n     */\n    expectedCount: number;\n}\n\n/**\n *  This Error indicates too many arguments were provided.\n */\nexport interface UnexpectedArgumentError extends EthersError<\"UNEXPECTED_ARGUMENT\"> {\n    /**\n     *  The number of arguments received.\n     */\n    count: number;\n\n    /**\n     *  The number of arguments expected.\n     */\n    expectedCount: number;\n}\n\n\n// Blockchain Errors\n\n/**\n *  The action that resulted in the call exception.\n */\nexport type CallExceptionAction = \"call\" | \"estimateGas\" | \"getTransactionResult\" | \"sendTransaction\" | \"unknown\";\n\n/**\n *  The related transaction that caused the error.\n */\nexport type CallExceptionTransaction = {\n    to: null | string;\n    from?: string;\n    data: string;\n};\n\n/**\n *  This **Error** indicates a transaction reverted.\n */\nexport interface CallExceptionError extends EthersError<\"CALL_EXCEPTION\"> {\n\n    /**\n     *  The action being performed when the revert was encountered.\n     */\n    action: CallExceptionAction;\n\n    /**\n     *  The revert data returned.\n     */\n    data: null | string;\n\n    /**\n     *  A human-readable representation of data, if possible.\n     */\n    reason: null | string;\n\n    /**\n     *  The transaction that triggered the exception.\n     */\n    transaction: CallExceptionTransaction,\n\n    /**\n     *  The contract invocation details, if available.\n     */\n    invocation: null | {\n        method: string;\n        signature: string;\n        args: Array<any>;\n    }\n\n    /**\n     *  The built-in or custom revert error, if available\n     */\n    revert: null | {\n        signature: string;\n        name: string;\n        args: Array<any>;\n    }\n\n    /**\n     *  If the error occurred in a transaction that was mined\n     *  (with a status of ``0``), this is the receipt.\n     */\n    receipt?: TransactionReceipt;   // @TODO: in v7, make this `null | TransactionReceipt`\n}\n\n\n/**\n *  The sending account has insufficient funds to cover the\n *  entire transaction cost.\n */\nexport interface InsufficientFundsError extends EthersError<\"INSUFFICIENT_FUNDS\"> {\n    /**\n     *  The transaction.\n     */\n    transaction: TransactionRequest;\n}\n\n/**\n *  The sending account has already used this nonce in a\n *  transaction that has been included.\n */\nexport interface NonceExpiredError extends EthersError<\"NONCE_EXPIRED\"> {\n    /**\n     *  The transaction.\n     */\n    transaction: TransactionRequest;\n}\n\n/**\n *  A CCIP-read exception, which cannot be recovered from or\n *  be further processed.\n */\nexport interface OffchainFaultError extends EthersError<\"OFFCHAIN_FAULT\"> {\n    /**\n     *  The transaction.\n     */\n    transaction?: TransactionRequest;\n\n    /**\n     *  The reason the CCIP-read failed.\n     */\n    reason: string;\n}\n\n/**\n *  An attempt was made to replace a transaction, but with an\n *  insufficient additional fee to afford evicting the old\n *  transaction from the memory pool.\n */\nexport interface ReplacementUnderpricedError extends EthersError<\"REPLACEMENT_UNDERPRICED\"> {\n    /**\n     *  The transaction.\n     */\n    transaction: TransactionRequest;\n}\n\n/**\n *  A pending transaction was replaced by another.\n */\nexport interface TransactionReplacedError extends EthersError<\"TRANSACTION_REPLACED\"> {\n    /**\n     *  If the transaction was cancelled, such that the original\n     *  effects of the transaction cannot be assured.\n     */\n    cancelled: boolean;\n\n    /**\n     *  The reason the transaction was replaced.\n     */\n    reason: \"repriced\" | \"cancelled\" | \"replaced\";\n\n    /**\n     *  The hash of the replaced transaction.\n     */\n    hash: string;\n\n    /**\n     *  The transaction that replaced the transaction.\n     */\n    replacement: TransactionResponse;\n\n    /**\n     *  The receipt of the transaction that replace the transaction.\n     */\n    receipt: TransactionReceipt;\n}\n\n/**\n *  This Error indicates an ENS name was used, but the name has not\n *  been configured.\n *\n *  This could indicate an ENS name is unowned or that the current\n *  address being pointed to is the [[ZeroAddress]].\n */\nexport interface UnconfiguredNameError extends EthersError<\"UNCONFIGURED_NAME\"> {\n    /**\n     *  The ENS name that was requested\n     */\n    value: string;\n}\n\n/**\n *  This Error indicates a request was rejected by the user.\n *\n *  In most clients (such as MetaMask), when an operation requires user\n *  authorization (such as ``signer.sendTransaction``), the client\n *  presents a dialog box to the user. If the user denies the request\n *  this error is thrown.\n */\nexport interface ActionRejectedError extends EthersError<\"ACTION_REJECTED\"> {\n    /**\n     *  The requested action.\n     */\n    action: \"requestAccess\" | \"sendTransaction\" | \"signMessage\" | \"signTransaction\" | \"signTypedData\" | \"unknown\",\n\n    /**\n     *  The reason the action was rejected.\n     *\n     *  If there is already a pending request, some clients may indicate\n     *  there is already a ``\"pending\"`` action. This prevents an app\n     *  from spamming the user.\n     */\n    reason: \"expired\" | \"rejected\" | \"pending\"\n}\n\n// Coding; converts an ErrorCode its Typed Error\n\n/**\n *  A conditional type that transforms the [[ErrorCode]] T into\n *  its EthersError type.\n *\n *  @flatworm-skip-docs\n */\nexport type CodedEthersError<T> =\n    T extends \"UNKNOWN_ERROR\" ? UnknownError:\n    T extends \"NOT_IMPLEMENTED\" ? NotImplementedError:\n    T extends \"UNSUPPORTED_OPERATION\" ? UnsupportedOperationError:\n    T extends \"NETWORK_ERROR\" ? NetworkError:\n    T extends \"SERVER_ERROR\" ? ServerError:\n    T extends \"TIMEOUT\" ? TimeoutError:\n    T extends \"BAD_DATA\" ? BadDataError:\n    T extends \"CANCELLED\" ? CancelledError:\n\n    T extends \"BUFFER_OVERRUN\" ? BufferOverrunError:\n    T extends \"NUMERIC_FAULT\" ? NumericFaultError:\n\n    T extends \"INVALID_ARGUMENT\" ? InvalidArgumentError:\n    T extends \"MISSING_ARGUMENT\" ? MissingArgumentError:\n    T extends \"UNEXPECTED_ARGUMENT\" ? UnexpectedArgumentError:\n\n    T extends \"CALL_EXCEPTION\" ? CallExceptionError:\n    T extends \"INSUFFICIENT_FUNDS\" ? InsufficientFundsError:\n    T extends \"NONCE_EXPIRED\" ? NonceExpiredError:\n    T extends \"OFFCHAIN_FAULT\" ? OffchainFaultError:\n    T extends \"REPLACEMENT_UNDERPRICED\" ? ReplacementUnderpricedError:\n    T extends \"TRANSACTION_REPLACED\" ? TransactionReplacedError:\n    T extends \"UNCONFIGURED_NAME\" ? UnconfiguredNameError:\n\n    T extends \"ACTION_REJECTED\" ? ActionRejectedError:\n\n    never;\n\n\n\n/**\n *  Returns true if the %%error%% matches an error thrown by ethers\n *  that matches the error %%code%%.\n *\n *  In TypeScript environments, this can be used to check that %%error%%\n *  matches an EthersError type, which means the expected properties will\n *  be set.\n *\n *  @See [ErrorCodes](api:ErrorCode)\n *  @example\n *    try {\n *      // code....\n *    } catch (e) {\n *      if (isError(e, \"CALL_EXCEPTION\")) {\n *          // The Type Guard has validated this object\n *          console.log(e.data);\n *      }\n *    }\n */\nexport function isError<K extends ErrorCode, T extends CodedEthersError<K>>(error: any, code: K): error is T {\n    return (error && (<EthersError>error).code === code);\n}\n\n/**\n *  Returns true if %%error%% is a [[CallExceptionError].\n */\nexport function isCallException(error: any): error is CallExceptionError {\n    return isError(error, \"CALL_EXCEPTION\");\n}\n\n/**\n *  Returns a new Error configured to the format ethers emits errors, with\n *  the %%message%%, [[api:ErrorCode]] %%code%% and additional properties\n *  for the corresponding EthersError.\n *\n *  Each error in ethers includes the version of ethers, a\n *  machine-readable [[ErrorCode]], and depending on %%code%%, additional\n *  required properties. The error message will also include the %%message%%,\n *  ethers version, %%code%% and all additional properties, serialized.\n */\nexport function makeError<K extends ErrorCode, T extends CodedEthersError<K>>(message: string, code: K, info?: ErrorInfo<T>): T {\n    let shortMessage = message;\n\n    {\n        const details: Array<string> = [];\n        if (info) {\n            if (\"message\" in info || \"code\" in info || \"name\" in info) {\n                throw new Error(`value will overwrite populated values: ${ stringify(info) }`);\n            }\n            for (const key in info) {\n                if (key === \"shortMessage\") { continue; }\n                const value = <any>(info[<keyof ErrorInfo<T>>key]);\n//                try {\n                    details.push(key + \"=\" + stringify(value));\n//                } catch (error: any) {\n//                console.log(\"MMM\", error.message);\n//                    details.push(key + \"=[could not serialize object]\");\n//                }\n            }\n        }\n        details.push(`code=${ code }`);\n        details.push(`version=${ version }`);\n\n        if (details.length) {\n            message += \" (\" + details.join(\", \") + \")\";\n        }\n    }\n\n    let error;\n    switch (code) {\n        case \"INVALID_ARGUMENT\":\n            error = new TypeError(message);\n            break;\n        case \"NUMERIC_FAULT\":\n        case \"BUFFER_OVERRUN\":\n            error = new RangeError(message);\n            break;\n        default:\n            error = new Error(message);\n    }\n\n    defineProperties<EthersError>(<EthersError>error, { code });\n\n    if (info) { Object.assign(error, info); }\n\n    if ((<any>error).shortMessage == null) {\n        defineProperties<EthersError>(<EthersError>error, { shortMessage });\n    }\n\n    return <T>error;\n}\n\n/**\n *  Throws an EthersError with %%message%%, %%code%% and additional error\n *  %%info%% when %%check%% is falsish..\n *\n *  @see [[api:makeError]]\n */\nexport function assert<K extends ErrorCode, T extends CodedEthersError<K>>(check: unknown, message: string, code: K, info?: ErrorInfo<T>): asserts check {\n    if (!check) { throw makeError(message, code, info); }\n}\n\n\n/**\n *  A simple helper to simply ensuring provided arguments match expected\n *  constraints, throwing if not.\n *\n *  In TypeScript environments, the %%check%% has been asserted true, so\n *  any further code does not need additional compile-time checks.\n */\nexport function assertArgument(check: unknown, message: string, name: string, value: unknown): asserts check {\n    assert(check, message, \"INVALID_ARGUMENT\", { argument: name, value: value });\n}\n\nexport function assertArgumentCount(count: number, expectedCount: number, message?: string): void {\n    if (message == null) { message = \"\"; }\n    if (message) { message = \": \" + message; }\n\n    assert(count >= expectedCount, \"missing argument\" + message, \"MISSING_ARGUMENT\", {\n        count: count,\n        expectedCount: expectedCount\n    });\n\n    assert(count <= expectedCount, \"too many arguments\" + message, \"UNEXPECTED_ARGUMENT\", {\n        count: count,\n        expectedCount: expectedCount\n    });\n}\n\nconst _normalizeForms = [\"NFD\", \"NFC\", \"NFKD\", \"NFKC\"].reduce((accum, form) => {\n    try {\n        // General test for normalize\n        /* c8 ignore start */\n        if (\"test\".normalize(form) !== \"test\") { throw new Error(\"bad\"); };\n        /* c8 ignore stop */\n\n        if (form === \"NFD\") {\n            const check = String.fromCharCode(0xe9).normalize(\"NFD\");\n            const expected = String.fromCharCode(0x65, 0x0301)\n            /* c8 ignore start */\n            if (check !== expected) { throw new Error(\"broken\") }\n            /* c8 ignore stop */\n        }\n\n        accum.push(form);\n    } catch(error) { }\n\n    return accum;\n}, <Array<string>>[]);\n\n/**\n *  Throws if the normalization %%form%% is not supported.\n */\nexport function assertNormalize(form: string): void {\n    assert(_normalizeForms.indexOf(form) >= 0, \"platform missing String.prototype.normalize\", \"UNSUPPORTED_OPERATION\", {\n        operation: \"String.prototype.normalize\", info: { form }\n    });\n}\n\n/**\n *  Many classes use file-scoped values to guard the constructor,\n *  making it effectively private. This facilitates that pattern\n *  by ensuring the %%givenGaurd%% matches the file-scoped %%guard%%,\n *  throwing if not, indicating the %%className%% if provided.\n */\nexport function assertPrivate(givenGuard: any, guard: any, className?: string): void {\n    if (className == null) { className = \"\"; }\n    if (givenGuard !== guard) {\n        let method = className, operation = \"new\";\n        if (className) {\n            method += \".\";\n            operation += \" \" + className;\n        }\n        assert(false, `private constructor; use ${ method }from* methods`, \"UNSUPPORTED_OPERATION\", {\n            operation\n        });\n    }\n}\n","/**\n *  Some data helpers.\n *\n *\n *  @_subsection api/utils:Data Helpers  [about-data]\n */\nimport { assert, assertArgument } from \"./errors.js\";\n\n/**\n *  A [[HexString]] whose length is even, which ensures it is a valid\n *  representation of binary data.\n */\nexport type DataHexString = string;\n\n/**\n *  A string which is prefixed with ``0x`` and followed by any number\n *  of case-agnostic hexadecimal characters.\n *\n *  It must match the regular expression ``/0x[0-9A-Fa-f]*\\/``.\n */\nexport type HexString = string;\n\n/**\n *  An object that can be used to represent binary data.\n */\nexport type BytesLike = DataHexString | Uint8Array;\n\nfunction _getBytes(value: BytesLike, name?: string, copy?: boolean): Uint8Array {\n    if (value instanceof Uint8Array) {\n        if (copy) { return new Uint8Array(value); }\n        return value;\n    }\n\n    if (typeof(value) === \"string\" && (value.length % 2) === 0 &&\n      value.match(/^0x[0-9a-f]*$/i)) {\n        const result = new Uint8Array((value.length - 2) / 2);\n        let offset = 2;\n        for (let i = 0; i < result.length; i++) {\n            result[i] = parseInt(value.substring(offset, offset + 2), 16);\n            offset += 2;\n        }\n        return result;\n    }\n\n    assertArgument(false, \"invalid BytesLike value\", name || \"value\", value);\n}\n\n/**\n *  Get a typed Uint8Array for %%value%%. If already a Uint8Array\n *  the original %%value%% is returned; if a copy is required use\n *  [[getBytesCopy]].\n *\n *  @see: getBytesCopy\n */\nexport function getBytes(value: BytesLike, name?: string): Uint8Array {\n    return _getBytes(value, name, false);\n}\n\n/**\n *  Get a typed Uint8Array for %%value%%, creating a copy if necessary\n *  to prevent any modifications of the returned value from being\n *  reflected elsewhere.\n *\n *  @see: getBytes\n */\nexport function getBytesCopy(value: BytesLike, name?: string): Uint8Array {\n    return _getBytes(value, name, true);\n}\n\n\n/**\n *  Returns true if %%value%% is a valid [[HexString]].\n *\n *  If %%length%% is ``true`` or a //number//, it also checks that\n *  %%value%% is a valid [[DataHexString]] of %%length%% (if a //number//)\n *  bytes of data (e.g. ``0x1234`` is 2 bytes).\n */\nexport function isHexString(value: any, length?: number | boolean): value is `0x${ string }` {\n    if (typeof(value) !== \"string\" || !value.match(/^0x[0-9A-Fa-f]*$/)) {\n        return false\n    }\n\n    if (typeof(length) === \"number\" && value.length !== 2 + 2 * length) { return false; }\n    if (length === true && (value.length % 2) !== 0) { return false; }\n\n    return true;\n}\n\n/**\n *  Returns true if %%value%% is a valid representation of arbitrary\n *  data (i.e. a valid [[DataHexString]] or a Uint8Array).\n */\nexport function isBytesLike(value: any): value is BytesLike {\n    return (isHexString(value, true) || (value instanceof Uint8Array));\n}\n\nconst HexCharacters: string = \"0123456789abcdef\";\n\n/**\n *  Returns a [[DataHexString]] representation of %%data%%.\n */\nexport function hexlify(data: BytesLike): string {\n    const bytes = getBytes(data);\n\n    let result = \"0x\";\n    for (let i = 0; i < bytes.length; i++) {\n        const v = bytes[i];\n        result += HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f];\n    }\n    return result;\n}\n\n/**\n *  Returns a [[DataHexString]] by concatenating all values\n *  within %%data%%.\n */\nexport function concat(datas: ReadonlyArray<BytesLike>): string {\n    return \"0x\" + datas.map((d) => hexlify(d).substring(2)).join(\"\");\n}\n\n/**\n *  Returns the length of %%data%%, in bytes.\n */\nexport function dataLength(data: BytesLike): number {\n    if (isHexString(data, true)) { return (data.length - 2) / 2; }\n    return getBytes(data).length;\n}\n\n/**\n *  Returns a [[DataHexString]] by slicing %%data%% from the %%start%%\n *  offset to the %%end%% offset.\n *\n *  By default %%start%% is 0 and %%end%% is the length of %%data%%.\n */\nexport function dataSlice(data: BytesLike, start?: number, end?: number): string {\n    const bytes = getBytes(data);\n    if (end != null && end > bytes.length) {\n        assert(false, \"cannot slice beyond data bounds\", \"BUFFER_OVERRUN\", {\n            buffer: bytes, length: bytes.length, offset: end\n        });\n    }\n    return hexlify(bytes.slice((start == null) ? 0: start, (end == null) ? bytes.length: end));\n}\n\n/**\n *  Return the [[DataHexString]] result by stripping all **leading**\n ** zero bytes from %%data%%.\n */\nexport function stripZerosLeft(data: BytesLike): string {\n    let bytes = hexlify(data).substring(2);\n    while (bytes.startsWith(\"00\")) { bytes = bytes.substring(2); }\n    return \"0x\" + bytes;\n}\n\nfunction zeroPad(data: BytesLike, length: number, left: boolean): string {\n    const bytes = getBytes(data);\n    assert(length >= bytes.length, \"padding exceeds data length\", \"BUFFER_OVERRUN\", {\n        buffer: new Uint8Array(bytes),\n        length: length,\n        offset: length + 1\n    });\n\n    const result = new Uint8Array(length);\n    result.fill(0);\n    if (left) {\n        result.set(bytes, length - bytes.length);\n    } else {\n        result.set(bytes, 0);\n    }\n\n    return hexlify(result);\n}\n\n/**\n *  Return the [[DataHexString]] of %%data%% padded on the **left**\n *  to %%length%% bytes.\n *\n *  If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n *  thrown.\n *\n *  This pads data the same as **values** are in Solidity\n *  (e.g. ``uint128``).\n */\nexport function zeroPadValue(data: BytesLike, length: number): string {\n    return zeroPad(data, length, true);\n}\n\n/**\n *  Return the [[DataHexString]] of %%data%% padded on the **right**\n *  to %%length%% bytes.\n *\n *  If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is\n *  thrown.\n *\n *  This pads data the same as **bytes** are in Solidity\n *  (e.g. ``bytes16``).\n */\nexport function zeroPadBytes(data: BytesLike, length: number): string {\n    return zeroPad(data, length, false);\n}\n","/**\n *  Some mathematic operations.\n *\n *  @_subsection: api/utils:Math Helpers  [about-maths]\n */\nimport { hexlify, isBytesLike } from \"./data.js\";\nimport { assert, assertArgument } from \"./errors.js\";\n\nimport type { BytesLike } from \"./data.js\";\n\n/**\n *  Any type that can be used where a numeric value is needed.\n */\nexport type Numeric = number | bigint;\n\n/**\n *  Any type that can be used where a big number is needed.\n */\nexport type BigNumberish = string | Numeric;\n\n\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\n\n//const BN_Max256 = (BN_1 << BigInt(256)) - BN_1;\n\n\n// IEEE 754 support 53-bits of mantissa\nconst maxValue = 0x1fffffffffffff;\n\n/**\n *  Convert %%value%% from a twos-compliment representation of %%width%%\n *  bits to its value.\n *\n *  If the highest bit is ``1``, the result will be negative.\n */\nexport function fromTwos(_value: BigNumberish, _width: Numeric): bigint {\n    const value = getUint(_value, \"value\");\n    const width = BigInt(getNumber(_width, \"width\"));\n\n    assert((value >> width) === BN_0, \"overflow\", \"NUMERIC_FAULT\", {\n        operation: \"fromTwos\", fault: \"overflow\", value: _value\n    });\n\n    // Top bit set; treat as a negative value\n    if (value >> (width - BN_1)) {\n        const mask = (BN_1 << width) - BN_1;\n        return -(((~value) & mask) + BN_1);\n    }\n\n    return value;\n}\n\n/**\n *  Convert %%value%% to a twos-compliment representation of\n *  %%width%% bits.\n *\n *  The result will always be positive.\n */\nexport function toTwos(_value: BigNumberish, _width: Numeric): bigint {\n    let value = getBigInt(_value, \"value\");\n    const width = BigInt(getNumber(_width, \"width\"));\n\n    const limit = (BN_1 << (width - BN_1));\n\n    if (value < BN_0) {\n        value = -value;\n        assert(value <= limit, \"too low\", \"NUMERIC_FAULT\", {\n            operation: \"toTwos\", fault: \"overflow\", value: _value\n        });\n        const mask = (BN_1 << width) - BN_1;\n        return ((~value) & mask) + BN_1;\n    } else {\n        assert(value < limit, \"too high\", \"NUMERIC_FAULT\", {\n            operation: \"toTwos\", fault: \"overflow\", value: _value\n        });\n    }\n\n    return value;\n}\n\n/**\n *  Mask %%value%% with a bitmask of %%bits%% ones.\n */\nexport function mask(_value: BigNumberish, _bits: Numeric): bigint {\n    const value = getUint(_value, \"value\");\n    const bits = BigInt(getNumber(_bits, \"bits\"));\n    return value & ((BN_1 << bits) - BN_1);\n}\n\n/**\n *  Gets a BigInt from %%value%%. If it is an invalid value for\n *  a BigInt, then an ArgumentError will be thrown for %%name%%.\n */\nexport function getBigInt(value: BigNumberish, name?: string): bigint {\n    switch (typeof(value)) {\n        case \"bigint\": return value;\n        case \"number\":\n            assertArgument(Number.isInteger(value), \"underflow\", name || \"value\", value);\n            assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n            return BigInt(value);\n        case \"string\":\n            try {\n                if (value === \"\") { throw new Error(\"empty string\"); }\n                if (value[0] === \"-\" && value[1] !== \"-\") {\n                    return -BigInt(value.substring(1));\n                }\n                return BigInt(value);\n            } catch(e: any) {\n                assertArgument(false, `invalid BigNumberish string: ${ e.message }`, name || \"value\", value);\n            }\n    }\n    assertArgument(false, \"invalid BigNumberish value\", name || \"value\", value);\n}\n\n/**\n *  Returns %%value%% as a bigint, validating it is valid as a bigint\n *  value and that it is positive.\n */\nexport function getUint(value: BigNumberish, name?: string): bigint {\n    const result = getBigInt(value, name);\n    assert(result >= BN_0, \"unsigned value cannot be negative\", \"NUMERIC_FAULT\", {\n        fault: \"overflow\", operation: \"getUint\", value\n    });\n    return result;\n}\n\nconst Nibbles = \"0123456789abcdef\";\n\n/*\n * Converts %%value%% to a BigInt. If %%value%% is a Uint8Array, it\n * is treated as Big Endian data.\n */\nexport function toBigInt(value: BigNumberish | Uint8Array): bigint {\n    if (value instanceof Uint8Array) {\n        let result = \"0x0\";\n        for (const v of value) {\n            result += Nibbles[v >> 4];\n            result += Nibbles[v & 0x0f];\n        }\n        return BigInt(result);\n    }\n\n    return getBigInt(value);\n}\n\n/**\n *  Gets a //number// from %%value%%. If it is an invalid value for\n *  a //number//, then an ArgumentError will be thrown for %%name%%.\n */\nexport function getNumber(value: BigNumberish, name?: string): number {\n    switch (typeof(value)) {\n        case \"bigint\":\n            assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n            return Number(value);\n        case \"number\":\n            assertArgument(Number.isInteger(value), \"underflow\", name || \"value\", value);\n            assertArgument(value >= -maxValue && value <= maxValue, \"overflow\", name || \"value\", value);\n            return value;\n        case \"string\":\n            try {\n                if (value === \"\") { throw new Error(\"empty string\"); }\n                return getNumber(BigInt(value), name);\n            } catch(e: any) {\n                assertArgument(false, `invalid numeric string: ${ e.message }`, name || \"value\", value);\n            }\n    }\n    assertArgument(false, \"invalid numeric value\", name || \"value\", value);\n}\n\n\n/**\n *  Converts %%value%% to a number. If %%value%% is a Uint8Array, it\n *  is treated as Big Endian data. Throws if the value is not safe.\n */\nexport function toNumber(value: BigNumberish | Uint8Array): number {\n    return getNumber(toBigInt(value));\n}\n\n/**\n *  Converts %%value%% to a Big Endian hexstring, optionally padded to\n *  %%width%% bytes.\n */\nexport function toBeHex(_value: BigNumberish, _width?: Numeric): string {\n    const value = getUint(_value, \"value\");\n\n    let result = value.toString(16);\n\n    if (_width == null) {\n        // Ensure the value is of even length\n        if (result.length % 2) { result = \"0\" + result; }\n    } else {\n        const width = getNumber(_width, \"width\");\n\n        // Special case when both value and width are 0 (see: #5025)\n        if (width === 0 && value === BN_0) { return \"0x\"; }\n\n        assert(width * 2 >= result.length, `value exceeds width (${ width } bytes)`, \"NUMERIC_FAULT\", {\n            operation: \"toBeHex\",\n            fault: \"overflow\",\n            value: _value\n        });\n\n        // Pad the value to the required width\n        while (result.length < (width * 2)) { result = \"0\" + result; }\n\n    }\n\n    return \"0x\" + result;\n}\n\n/**\n *  Converts %%value%% to a Big Endian Uint8Array.\n */\nexport function toBeArray(_value: BigNumberish, _width?: Numeric): Uint8Array {\n    const value = getUint(_value, \"value\");\n\n    if (value === BN_0) {\n        const width = (_width != null) ? getNumber(_width, \"width\"): 0;\n        return new Uint8Array(width);\n    }\n\n    let hex = value.toString(16);\n    if (hex.length % 2) { hex = \"0\" + hex; }\n\n    if (_width != null) {\n        const width = getNumber(_width, \"width\");\n\n        while (hex.length < (width * 2)) { hex = \"00\" + hex; }\n\n        assert((width * 2) === hex.length, `value exceeds width (${ width } bytes)`, \"NUMERIC_FAULT\", {\n            operation: \"toBeArray\",\n            fault: \"overflow\",\n            value: _value\n        });\n    }\n\n    const result = new Uint8Array(hex.length / 2);\n    for (let i = 0; i < result.length; i++) {\n        const offset = i * 2;\n        result[i] = parseInt(hex.substring(offset, offset + 2), 16);\n    }\n\n    return result;\n}\n\n/**\n *  Returns a [[HexString]] for %%value%% safe to use as a //Quantity//.\n *\n *  A //Quantity// does not have and leading 0 values unless the value is\n *  the literal value `0x0`. This is most commonly used for JSSON-RPC\n *  numeric values.\n */\nexport function toQuantity(value: BytesLike | BigNumberish): string {\n    let result = hexlify(isBytesLike(value) ? value: toBeArray(value)).substring(2);\n    while (result.startsWith(\"0\")) { result = result.substring(1); }\n    if (result === \"\") { result = \"0\"; }\n    return \"0x\" + result;\n}\n","/**\n *  Events allow for applications to use the observer pattern, which\n *  allows subscribing and publishing events, outside the normal\n *  execution paths.\n *\n *  @_section api/utils/events:Events  [about-events]\n */\nimport { defineProperties } from \"./properties.js\";\n\n/**\n *  A callback function called when a an event is triggered.\n */\nexport type Listener = (...args: Array<any>) => void;\n\n/**\n *  An **EventEmitterable** behaves similar to an EventEmitter\n *  except provides async access to its methods.\n *\n *  An EventEmitter implements the observer pattern.\n */\nexport interface EventEmitterable<T> {\n    /**\n     *  Registers a %%listener%% that is called whenever the\n     *  %%event%% occurs until unregistered.\n     */\n    on(event: T, listener: Listener): Promise<this>;\n\n    /**\n     *  Registers a %%listener%% that is called the next time\n     *  %%event%% occurs.\n     */\n    once(event: T, listener: Listener): Promise<this>;\n\n    /**\n     *  Triggers each listener for %%event%% with the %%args%%.\n     */\n    emit(event: T, ...args: Array<any>): Promise<boolean>;\n\n    /**\n     *  Resolves to the number of listeners for %%event%%.\n     */\n    listenerCount(event?: T): Promise<number>;\n\n    /**\n     *  Resolves to the listeners for %%event%%.\n     */\n    listeners(event?: T): Promise<Array<Listener>>;\n\n    /**\n     *  Unregister the %%listener%% for %%event%%. If %%listener%%\n     *  is unspecified, all listeners are unregistered.\n     */\n    off(event: T, listener?: Listener): Promise<this>;\n\n    /**\n     *  Unregister all listeners for %%event%%.\n     */\n    removeAllListeners(event?: T): Promise<this>;\n\n    /**\n     *  Alias for [[on]].\n     */\n    addListener(event: T, listener: Listener): Promise<this>;\n\n    /**\n     *  Alias for [[off]].\n     */\n    removeListener(event: T, listener: Listener): Promise<this>;\n}\n\n/**\n *  When an [[EventEmitterable]] triggers a [[Listener]], the\n *  callback always ahas one additional argument passed, which is\n *  an **EventPayload**.\n */\nexport class EventPayload<T> {\n    /**\n     *  The event filter.\n     */\n    readonly filter!: T;\n\n    /**\n     *  The **EventEmitterable**.\n     */\n    readonly emitter!: EventEmitterable<T>;\n\n    readonly #listener: null | Listener;\n\n    /**\n     *  Create a new **EventPayload** for %%emitter%% with\n     *  the %%listener%% and for %%filter%%.\n     */\n    constructor(emitter: EventEmitterable<T>, listener: null | Listener, filter: T) {\n        this.#listener = listener;\n        defineProperties<EventPayload<any>>(this, { emitter, filter });\n    }\n\n    /**\n     *  Unregister the triggered listener for future events.\n     */\n    async removeListener(): Promise<void> {\n        if (this.#listener == null) { return; }\n        await this.emitter.off(this.filter, this.#listener);\n    }\n}\n","/**\n *  Using strings in Ethereum (or any security-basd system) requires\n *  additional care. These utilities attempt to mitigate some of the\n *  safety issues as well as provide the ability to recover and analyse\n *  strings.\n *\n *  @_subsection api/utils:Strings and UTF-8  [about-strings]\n */\nimport { getBytes } from \"./data.js\";\nimport { assertArgument, assertNormalize } from \"./errors.js\";\n\nimport type { BytesLike } from \"./index.js\";\n\n\n///////////////////////////////\n\n/**\n *  The stanard normalization forms.\n */\nexport type UnicodeNormalizationForm = \"NFC\" | \"NFD\" | \"NFKC\" | \"NFKD\";\n\n/**\n *  When using the UTF-8 error API the following errors can be intercepted\n *  and processed as the %%reason%% passed to the [[Utf8ErrorFunc]].\n *\n *  **``\"UNEXPECTED_CONTINUE\"``** - a continuation byte was present where there\n *  was nothing to continue.\n *\n *  **``\"BAD_PREFIX\"``** - an invalid (non-continuation) byte to start a\n *  UTF-8 codepoint was found.\n *\n *  **``\"OVERRUN\"``** - the string is too short to process the expected\n *  codepoint length.\n *\n *  **``\"MISSING_CONTINUE\"``** - a missing continuation byte was expected but\n *  not found. The %%offset%% indicates the index the continuation byte\n *  was expected at.\n *\n *  **``\"OUT_OF_RANGE\"``** - the computed code point is outside the range\n *  for UTF-8. The %%badCodepoint%% indicates the computed codepoint, which was\n *  outside the valid UTF-8 range.\n *\n *  **``\"UTF16_SURROGATE\"``** - the UTF-8 strings contained a UTF-16 surrogate\n *  pair. The %%badCodepoint%% is the computed codepoint, which was inside the\n *  UTF-16 surrogate range.\n *\n *  **``\"OVERLONG\"``** - the string is an overlong representation. The\n *  %%badCodepoint%% indicates the computed codepoint, which has already\n *  been bounds checked.\n *\n *\n *  @returns string\n */\nexport type Utf8ErrorReason = \"UNEXPECTED_CONTINUE\" | \"BAD_PREFIX\" | \"OVERRUN\" |\n    \"MISSING_CONTINUE\" | \"OUT_OF_RANGE\" | \"UTF16_SURROGATE\" | \"OVERLONG\";\n\n\n/**\n *  A callback that can be used with [[toUtf8String]] to analysis or\n *  recovery from invalid UTF-8 data.\n *\n *  Parsing UTF-8 data is done through a simple Finite-State Machine (FSM)\n *  which calls the ``Utf8ErrorFunc`` if a fault is detected.\n *\n *  The %%reason%% indicates where in the FSM execution the fault\n *  occurred and the %%offset%% indicates where the input failed.\n *\n *  The %%bytes%% represents the raw UTF-8 data that was provided and\n *  %%output%% is the current array of UTF-8 code-points, which may\n *  be updated by the ``Utf8ErrorFunc``.\n *\n *  The value of the %%badCodepoint%% depends on the %%reason%%. See\n *  [[Utf8ErrorReason]] for details.\n *\n *  The function should return the number of bytes that should be skipped\n *  when control resumes to the FSM.\n */\nexport type Utf8ErrorFunc = (reason: Utf8ErrorReason, offset: number, bytes: Uint8Array, output: Array<number>, badCodepoint?: number) => number;\n\n\nfunction errorFunc(reason: Utf8ErrorReason, offset: number, bytes: Uint8Array, output: Array<number>, badCodepoint?: number): number {\n    assertArgument(false, `invalid codepoint at offset ${ offset }; ${ reason }`, \"bytes\", bytes);\n}\n\nfunction ignoreFunc(reason: Utf8ErrorReason, offset: number, bytes: Uint8Array, output: Array<number>, badCodepoint?: number): number {\n\n    // If there is an invalid prefix (including stray continuation), skip any additional continuation bytes\n    if (reason === \"BAD_PREFIX\" || reason === \"UNEXPECTED_CONTINUE\") {\n        let i = 0;\n        for (let o = offset + 1; o < bytes.length; o++) {\n            if (bytes[o] >> 6 !== 0x02) { break; }\n            i++;\n        }\n        return i;\n    }\n\n    // This byte runs us past the end of the string, so just jump to the end\n    // (but the first byte was read already read and therefore skipped)\n    if (reason === \"OVERRUN\") {\n        return bytes.length - offset - 1;\n    }\n\n    // Nothing to skip\n    return 0;\n}\n\nfunction replaceFunc(reason: Utf8ErrorReason, offset: number, bytes: Uint8Array, output: Array<number>, badCodepoint?: number): number {\n\n    // Overlong representations are otherwise \"valid\" code points; just non-deistingtished\n    if (reason === \"OVERLONG\") {\n        assertArgument(typeof(badCodepoint) === \"number\", \"invalid bad code point for replacement\", \"badCodepoint\", badCodepoint);\n        output.push(badCodepoint);\n        return 0;\n    }\n\n    // Put the replacement character into the output\n    output.push(0xfffd);\n\n    // Otherwise, process as if ignoring errors\n    return ignoreFunc(reason, offset, bytes, output, badCodepoint);\n}\n\n/**\n *  A handful of popular, built-in UTF-8 error handling strategies.\n *\n *  **``\"error\"``** - throws on ANY illegal UTF-8 sequence or\n *  non-canonical (overlong) codepoints (this is the default)\n *\n *  **``\"ignore\"``** - silently drops any illegal UTF-8 sequence\n *  and accepts non-canonical (overlong) codepoints\n *\n *  **``\"replace\"``** - replace any illegal UTF-8 sequence with the\n *  UTF-8 replacement character (i.e. ``\"\\\\ufffd\"``) and accepts\n *  non-canonical (overlong) codepoints\n *\n *  @returns: Record<\"error\" | \"ignore\" | \"replace\", Utf8ErrorFunc>\n */\nexport const Utf8ErrorFuncs: Readonly<Record<\"error\" | \"ignore\" | \"replace\", Utf8ErrorFunc>> = Object.freeze({\n    error: errorFunc,\n    ignore: ignoreFunc,\n    replace: replaceFunc\n});\n\n// http://stackoverflow.com/questions/13356493/decode-utf-8-with-javascript#13691499\nfunction getUtf8CodePoints(_bytes: BytesLike, onError?: Utf8ErrorFunc): Array<number> {\n    if (onError == null) { onError = Utf8ErrorFuncs.error; }\n\n    const bytes = getBytes(_bytes, \"bytes\");\n\n    const result: Array<number> = [];\n    let i = 0;\n\n    // Invalid bytes are ignored\n    while(i < bytes.length) {\n\n        const c = bytes[i++];\n\n        // 0xxx xxxx\n        if (c >> 7 === 0) {\n            result.push(c);\n            continue;\n        }\n\n        // Multibyte; how many bytes left for this character?\n        let extraLength: null | number = null;\n        let overlongMask: null | number = null;\n\n        // 110x xxxx 10xx xxxx\n        if ((c & 0xe0) === 0xc0) {\n            extraLength = 1;\n            overlongMask = 0x7f;\n\n        // 1110 xxxx 10xx xxxx 10xx xxxx\n        } else if ((c & 0xf0) === 0xe0) {\n            extraLength = 2;\n            overlongMask = 0x7ff;\n\n        // 1111 0xxx 10xx xxxx 10xx xxxx 10xx xxxx\n        } else if ((c & 0xf8) === 0xf0) {\n            extraLength = 3;\n            overlongMask = 0xffff;\n\n        } else {\n            if ((c & 0xc0) === 0x80) {\n                i += onError(\"UNEXPECTED_CONTINUE\", i - 1, bytes, result);\n            } else {\n                i += onError(\"BAD_PREFIX\", i - 1, bytes, result);\n            }\n            continue;\n        }\n\n        // Do we have enough bytes in our data?\n        if (i - 1 + extraLength >= bytes.length) {\n            i += onError(\"OVERRUN\", i - 1, bytes, result);\n            continue;\n        }\n\n        // Remove the length prefix from the char\n        let res: null | number = c & ((1 << (8 - extraLength - 1)) - 1);\n\n        for (let j = 0; j < extraLength; j++) {\n            let nextChar = bytes[i];\n\n            // Invalid continuation byte\n            if ((nextChar & 0xc0) != 0x80) {\n                i += onError(\"MISSING_CONTINUE\", i, bytes, result);\n                res = null;\n                break;\n            };\n\n            res = (res << 6) | (nextChar & 0x3f);\n            i++;\n        }\n\n        // See above loop for invalid continuation byte\n        if (res === null) { continue; }\n\n        // Maximum code point\n        if (res > 0x10ffff) {\n            i += onError(\"OUT_OF_RANGE\", i - 1 - extraLength, bytes, result, res);\n            continue;\n        }\n\n        // Reserved for UTF-16 surrogate halves\n        if (res >= 0xd800 && res <= 0xdfff) {\n            i += onError(\"UTF16_SURROGATE\", i - 1 - extraLength, bytes, result, res);\n            continue;\n        }\n\n        // Check for overlong sequences (more bytes than needed)\n        if (res <= overlongMask) {\n            i += onError(\"OVERLONG\", i - 1 - extraLength, bytes, result, res);\n            continue;\n        }\n\n        result.push(res);\n    }\n\n    return result;\n}\n\n// http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array\n\n/**\n *  Returns the UTF-8 byte representation of %%str%%.\n *\n *  If %%form%% is specified, the string is normalized.\n */\nexport function toUtf8Bytes(str: string, form?: UnicodeNormalizationForm): Uint8Array {\n    assertArgument(typeof(str) === \"string\", \"invalid string value\", \"str\", str);\n\n    if (form != null) {\n        assertNormalize(form);\n        str = str.normalize(form);\n    }\n\n    let result: Array<number> = [];\n    for (let i = 0; i < str.length; i++) {\n        const c = str.charCodeAt(i);\n\n        if (c < 0x80) {\n            result.push(c);\n\n        } else if (c < 0x800) {\n            result.push((c >> 6) | 0xc0);\n            result.push((c & 0x3f) | 0x80);\n\n        } else if ((c & 0xfc00) == 0xd800) {\n            i++;\n            const c2 = str.charCodeAt(i);\n\n            assertArgument(i < str.length && ((c2 & 0xfc00) === 0xdc00),\n                \"invalid surrogate pair\", \"str\", str);\n\n            // Surrogate Pair\n            const pair = 0x10000 + ((c & 0x03ff) << 10) + (c2 & 0x03ff);\n            result.push((pair >> 18) | 0xf0);\n            result.push(((pair >> 12) & 0x3f) | 0x80);\n            result.push(((pair >> 6) & 0x3f) | 0x80);\n            result.push((pair & 0x3f) | 0x80);\n\n        } else {\n            result.push((c >> 12) | 0xe0);\n            result.push(((c >> 6) & 0x3f) | 0x80);\n            result.push((c & 0x3f) | 0x80);\n        }\n    }\n\n    return new Uint8Array(result);\n};\n\n//export \nfunction _toUtf8String(codePoints: Array<number>): string {\n    return codePoints.map((codePoint) => {\n        if (codePoint <= 0xffff) {\n            return String.fromCharCode(codePoint);\n        }\n        codePoint -= 0x10000;\n        return String.fromCharCode(\n            (((codePoint >> 10) & 0x3ff) + 0xd800),\n            ((codePoint & 0x3ff) + 0xdc00)\n        );\n    }).join(\"\");\n}\n\n/**\n *  Returns the string represented by the UTF-8 data %%bytes%%.\n *\n *  When %%onError%% function is specified, it is called on UTF-8\n *  errors allowing recovery using the [[Utf8ErrorFunc]] API.\n *  (default: [error](Utf8ErrorFuncs))\n */\nexport function toUtf8String(bytes: BytesLike, onError?: Utf8ErrorFunc): string {\n    return _toUtf8String(getUtf8CodePoints(bytes, onError));\n}\n\n/**\n *  Returns the UTF-8 code-points for %%str%%.\n *\n *  If %%form%% is specified, the string is normalized.\n */\nexport function toUtf8CodePoints(str: string, form?: UnicodeNormalizationForm): Array<number> {\n    return getUtf8CodePoints(toUtf8Bytes(str, form));\n}\n\n","//See: https://github.com/ethereum/wiki/wiki/RLP\n\nimport { getBytes } from \"./data.js\";\n\nimport type { RlpStructuredDataish } from \"./rlp.js\";\n\n\nfunction arrayifyInteger(value: number): Array<number> {\n    const result: Array<number> = [];\n    while (value) {\n        result.unshift(value & 0xff);\n        value >>= 8;\n    }\n    return result;\n}\n\nfunction _encode(object: Array<any> | string | Uint8Array): Array<number> {\n    if (Array.isArray(object)) {\n        let payload: Array<number> = [];\n        object.forEach(function(child) {\n            payload = payload.concat(_encode(child));\n        });\n\n        if (payload.length <= 55) {\n            payload.unshift(0xc0 + payload.length)\n            return payload;\n        }\n\n        const length = arrayifyInteger(payload.length);\n        length.unshift(0xf7 + length.length);\n\n        return length.concat(payload);\n\n    }\n\n    const data: Array<number> = Array.prototype.slice.call(getBytes(object, \"object\"));\n\n    if (data.length === 1 && data[0] <= 0x7f) {\n        return data;\n\n    } else if (data.length <= 55) {\n        data.unshift(0x80 + data.length);\n        return data;\n    }\n\n    const length = arrayifyInteger(data.length);\n    length.unshift(0xb7 + length.length);\n\n    return length.concat(data);\n}\n\nconst nibbles = \"0123456789abcdef\";\n\n/**\n *  Encodes %%object%% as an RLP-encoded [[DataHexString]].\n */\nexport function encodeRlp(object: RlpStructuredDataish): string {\n    let result = \"0x\";\n    for (const v of _encode(object)) {\n        result += nibbles[v >> 4];\n        result += nibbles[v & 0xf];\n    }\n    return result;\n}\n","\nimport {\n    defineProperties, concat, getBytesCopy, getNumber, hexlify,\n    toBeArray, toBigInt, toNumber,\n    assert, assertArgument\n    /*, isError*/\n} from \"../../utils/index.js\";\n\nimport type { BigNumberish, BytesLike } from \"../../utils/index.js\";\n\n/**\n * @_ignore:\n */\nexport const WordSize: number = 32;\nconst Padding = new Uint8Array(WordSize);\n\n// Properties used to immediate pass through to the underlying object\n// - `then` is used to detect if an object is a Promise for await\nconst passProperties = [ \"then\" ];\n\nconst _guard = { };\n\nconst resultNames: WeakMap<Result, ReadonlyArray<null | string>> = new WeakMap();\n\nfunction getNames(result: Result): ReadonlyArray<null | string> {\n    return resultNames.get(result)!;\n}\nfunction setNames(result: Result, names: ReadonlyArray<null | string>): void {\n    resultNames.set(result, names);\n}\n\nfunction throwError(name: string, error: Error): never {\n    const wrapped = new Error(`deferred error during ABI decoding triggered accessing ${ name }`);\n    (<any>wrapped).error = error;\n    throw wrapped;\n}\n\nfunction toObject(names: ReadonlyArray<null | string>, items: Result, deep?: boolean): Record<string, any> | Array<any> {\n    if (names.indexOf(null) >= 0) {\n        return items.map((item, index) => {\n            if (item instanceof Result) {\n                return toObject(getNames(item), item, deep);\n            }\n            return item;\n        });\n    }\n\n    return (<Array<string>>names).reduce((accum, name, index) => {\n        let item = items.getValue(name);\n        if (!(name in accum)) {\n            if (deep && item instanceof Result) {\n                item = toObject(getNames(item), item, deep);\n            }\n            accum[name] = item;\n        }\n        return accum;\n    }, <Record<string, any>>{ });\n}\n\n\n/**\n *  A [[Result]] is a sub-class of Array, which allows accessing any\n *  of its values either positionally by its index or, if keys are\n *  provided by its name.\n *\n *  @_docloc: api/abi\n */\nexport class Result extends Array<any> {\n    // No longer used; but cannot be removed as it will remove the\n    // #private field from the .d.ts which may break backwards\n    // compatibility\n    readonly #names: ReadonlyArray<null | string>;\n\n    [ K: string | number ]: any\n\n    /**\n     *  @private\n     */\n    constructor(...args: Array<any>) {\n        // To properly sub-class Array so the other built-in\n        // functions work, the constructor has to behave fairly\n        // well. So, in the event we are created via fromItems()\n        // we build the read-only Result object we want, but on\n        // any other input, we use the default constructor\n\n        // constructor(guard: any, items: Array<any>, keys?: Array<null | string>);\n        const guard = args[0];\n        let items: Array<any> = args[1];\n        let names: Array<null | string> = (args[2] || [ ]).slice();\n\n        let wrap = true;\n        if (guard !== _guard) {\n            items = args;\n            names = [ ];\n            wrap = false;\n        }\n\n        // Can't just pass in ...items since an array of length 1\n        // is a special case in the super.\n        super(items.length);\n        items.forEach((item, index) => { this[index] = item; });\n\n        // Find all unique keys\n        const nameCounts = names.reduce((accum, name) => {\n            if (typeof(name) === \"string\") {\n                accum.set(name, (accum.get(name) || 0) + 1);\n            }\n            return accum;\n        }, <Map<string, number>>(new Map()));\n\n        // Remove any key thats not unique\n        setNames(this, Object.freeze(items.map((item, index) => {\n            const name = names[index];\n            if (name != null && nameCounts.get(name) === 1) {\n                return name;\n            }\n            return null;\n        })));\n\n        // Dummy operations to prevent TypeScript from complaining\n        this.#names = [ ];\n        if (this.#names == null) { void(this.#names); }\n\n        if (!wrap) { return; }\n\n        // A wrapped Result is immutable\n        Object.freeze(this);\n\n        // Proxy indices and names so we can trap deferred errors\n        const proxy = new Proxy(this, {\n            get: (target, prop, receiver) => {\n                if (typeof(prop) === \"string\") {\n\n                    // Index accessor\n                    if (prop.match(/^[0-9]+$/)) {\n                        const index = getNumber(prop, \"%index\");\n                        if (index < 0 || index >= this.length) {\n                            throw new RangeError(\"out of result range\");\n                        }\n\n                        const item = target[index];\n                        if (item instanceof Error) {\n                            throwError(`index ${ index }`, item);\n                        }\n                        return item;\n                    }\n\n                    // Pass important checks (like `then` for Promise) through\n                    if (passProperties.indexOf(prop) >= 0) {\n                        return Reflect.get(target, prop, receiver);\n                    }\n\n                    const value = target[prop];\n                    if (value instanceof Function) {\n                        // Make sure functions work with private variables\n                        // See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy#no_private_property_forwarding\n                        return function(this: any, ...args: Array<any>) {\n                            return value.apply((this === receiver) ? target: this, args);\n                        };\n\n                    } else if (!(prop in target)) {\n                        // Possible name accessor\n                        return target.getValue.apply((this === receiver) ? target: this, [ prop ]);\n                    }\n                }\n\n                return Reflect.get(target, prop, receiver);\n            }\n        });\n        setNames(proxy, getNames(this));\n        return proxy;\n    }\n\n    /**\n     *  Returns the Result as a normal Array. If %%deep%%, any children\n     *  which are Result objects are also converted to a normal Array.\n     *\n     *  This will throw if there are any outstanding deferred\n     *  errors.\n     */\n    toArray(deep?: boolean): Array<any> {\n        const result: Array<any> = [ ];\n        this.forEach((item, index) => {\n            if (item instanceof Error) { throwError(`index ${ index }`, item); }\n            if (deep && item instanceof Result) {\n                item = item.toArray(deep);\n            }\n            result.push(item);\n        });\n        return result;\n    }\n\n    /**\n     *  Returns the Result as an Object with each name-value pair. If\n     *  %%deep%%, any children which are Result objects are also\n     *  converted to an Object.\n     *\n     *  This will throw if any value is unnamed, or if there are\n     *  any outstanding deferred errors.\n     */\n    toObject(deep?: boolean): Record<string, any> {\n        const names = getNames(this);\n        return names.reduce((accum, name, index) => {\n\n            assert(name != null, `value at index ${ index } unnamed`, \"UNSUPPORTED_OPERATION\", {\n                operation: \"toObject()\"\n            });\n\n            return toObject(names, this, deep);\n        }, <Record<string, any>>{});\n    }\n\n    /**\n     *  @_ignore\n     */\n    slice(start?: number | undefined, end?: number | undefined): Result {\n        if (start == null) { start = 0; }\n        if (start < 0) {\n            start += this.length;\n            if (start < 0) { start = 0; }\n        }\n\n        if (end == null) { end = this.length; }\n        if (end < 0) {\n            end += this.length;\n            if (end < 0) { end = 0; }\n        }\n        if (end > this.length) { end = this.length; }\n\n        const _names = getNames(this);\n\n        const result: Array<any> = [ ], names: Array<null | string> = [ ];\n        for (let i = start; i < end; i++) {\n            result.push(this[i]);\n            names.push(_names[i]);\n        }\n\n        return new Result(_guard, result, names);\n    }\n\n    /**\n     *  @_ignore\n     */\n    filter(callback: (el: any, index: number, array: Result) => boolean, thisArg?: any): Result {\n        const _names = getNames(this);\n\n        const result: Array<any> = [ ], names: Array<null | string> = [ ];\n        for (let i = 0; i < this.length; i++) {\n            const item = this[i];\n            if (item instanceof Error) {\n                throwError(`index ${ i }`, item);\n            }\n\n            if (callback.call(thisArg, item, i, this)) {\n                result.push(item);\n                names.push(_names[i]);\n            }\n        }\n\n        return new Result(_guard, result, names);\n    }\n\n    /**\n     *  @_ignore\n     */\n    map<T extends any = any>(callback: (el: any, index: number, array: Result) => T, thisArg?: any): Array<T> {\n        const result: Array<T> = [ ];\n        for (let i = 0; i < this.length; i++) {\n            const item = this[i];\n            if (item instanceof Error) {\n                throwError(`index ${ i }`, item);\n            }\n\n            result.push(callback.call(thisArg, item, i, this));\n        }\n\n        return result;\n    }\n\n\n    /**\n     *  Returns the value for %%name%%.\n     *\n     *  Since it is possible to have a key whose name conflicts with\n     *  a method on a [[Result]] or its superclass Array, or any\n     *  JavaScript keyword, this ensures all named values are still\n     *  accessible by name.\n     */\n    getValue(name: string): any {\n        const index = getNames(this).indexOf(name);\n        if (index === -1) { return undefined; }\n\n        const value = this[index];\n\n        if (value instanceof Error) {\n            throwError(`property ${ JSON.stringify(name) }`, (<any>value).error);\n        }\n\n        return value;\n    }\n\n    /**\n     *  Creates a new [[Result]] for %%items%% with each entry\n     *  also accessible by its corresponding name in %%keys%%.\n     */\n    static fromItems(items: Array<any>, keys?: Array<null | string>): Result {\n        return new Result(_guard, items, keys);\n    }\n}\n\n/**\n *  Returns all errors found in a [[Result]].\n *\n *  Since certain errors encountered when creating a [[Result]] do\n *  not impact the ability to continue parsing data, they are\n *  deferred until they are actually accessed. Hence a faulty string\n *  in an Event that is never used does not impact the program flow.\n *\n *  However, sometimes it may be useful to access, identify or\n *  validate correctness of a [[Result]].\n *\n *  @_docloc api/abi\n */\nexport function checkResultErrors(result: Result): Array<{ path: Array<string | number>, error: Error }> {\n    // Find the first error (if any)\n    const errors: Array<{ path: Array<string | number>, error: Error }> = [ ];\n\n    const checkErrors = function(path: Array<string | number>, object: any): void {\n        if (!Array.isArray(object)) { return; }\n        for (let key in object) {\n            const childPath = path.slice();\n            childPath.push(key);\n\n            try {\n                 checkErrors(childPath, object[key]);\n            } catch (error: any) {\n                errors.push({ path: childPath, error: error });\n            }\n        }\n    }\n    checkErrors([ ], result);\n\n    return errors;\n\n}\n\nfunction getValue(value: BigNumberish): Uint8Array {\n    let bytes = toBeArray(value);\n\n    assert (bytes.length <= WordSize, \"value out-of-bounds\",\n        \"BUFFER_OVERRUN\", { buffer: bytes, length: WordSize, offset: bytes.length });\n\n    if (bytes.length !== WordSize) {\n        bytes = getBytesCopy(concat([ Padding.slice(bytes.length % WordSize), bytes ]));\n    }\n\n    return bytes;\n}\n\n/**\n *  @_ignore\n */\nexport abstract class Coder {\n\n    // The coder name:\n    //   - address, uint256, tuple, array, etc.\n    readonly name!: string;\n\n    // The fully expanded type, including composite types:\n    //   - address, uint256, tuple(address,bytes), uint256[3][4][],  etc.\n    readonly type!: string;\n\n    // The localName bound in the signature, in this example it is \"baz\":\n    //   - tuple(address foo, uint bar) baz\n    readonly localName!: string;\n\n    // Whether this type is dynamic:\n    //  - Dynamic: bytes, string, address[], tuple(boolean[]), etc.\n    //  - Not Dynamic: address, uint256, boolean[3], tuple(address, uint8)\n    readonly dynamic!: boolean;\n\n    constructor(name: string, type: string, localName: string, dynamic: boolean) {\n        defineProperties<Coder>(this, { name, type, localName, dynamic }, {\n            name: \"string\", type: \"string\", localName: \"string\", dynamic: \"boolean\"\n        });\n    }\n\n    _throwError(message: string, value: any): never {\n        assertArgument(false, message, this.localName, value);\n    }\n\n    abstract encode(writer: Writer, value: any): number;\n    abstract decode(reader: Reader): any;\n\n    abstract defaultValue(): any;\n}\n\n/**\n *  @_ignore\n */\nexport class Writer {\n    // An array of WordSize lengthed objects to concatenation\n    #data: Array<Uint8Array>;\n    #dataLength: number;\n\n    constructor() {\n        this.#data = [ ];\n        this.#dataLength = 0;\n    }\n\n    get data(): string {\n        return concat(this.#data);\n    }\n    get length(): number { return this.#dataLength; }\n\n    #writeData(data: Uint8Array): number {\n        this.#data.push(data);\n        this.#dataLength += data.length;\n        return data.length;\n    }\n\n    appendWriter(writer: Writer): number {\n        return this.#writeData(getBytesCopy(writer.data));\n    }\n\n    // Arrayish item; pad on the right to *nearest* WordSize\n    writeBytes(value: BytesLike): number {\n        let bytes = getBytesCopy(value);\n        const paddingOffset = bytes.length % WordSize;\n        if (paddingOffset) {\n            bytes = getBytesCopy(concat([ bytes, Padding.slice(paddingOffset) ]))\n        }\n        return this.#writeData(bytes);\n    }\n\n    // Numeric item; pad on the left *to* WordSize\n    writeValue(value: BigNumberish): number {\n        return this.#writeData(getValue(value));\n    }\n\n    // Inserts a numeric place-holder, returning a callback that can\n    // be used to asjust the value later\n    writeUpdatableValue(): (value: BigNumberish) => void {\n        const offset = this.#data.length;\n        this.#data.push(Padding);\n        this.#dataLength += WordSize;\n        return (value: BigNumberish) => {\n            this.#data[offset] = getValue(value);\n        };\n    }\n}\n\n/**\n *  @_ignore\n */\nexport class Reader {\n    // Allows incomplete unpadded data to be read; otherwise an error\n    // is raised if attempting to overrun the buffer. This is required\n    // to deal with an old Solidity bug, in which event data for\n    // external (not public thoguh) was tightly packed.\n    readonly allowLoose!: boolean;\n\n    readonly #data: Uint8Array;\n    #offset: number;\n\n    #bytesRead: number;\n    #parent: null | Reader;\n    #maxInflation: number;\n\n    constructor(data: BytesLike, allowLoose?: boolean, maxInflation?: number) {\n        defineProperties<Reader>(this, { allowLoose: !!allowLoose });\n\n        this.#data = getBytesCopy(data);\n        this.#bytesRead = 0;\n        this.#parent = null;\n        this.#maxInflation = (maxInflation != null) ? maxInflation: 1024;\n\n        this.#offset = 0;\n    }\n\n    get data(): string { return hexlify(this.#data); }\n    get dataLength(): number { return this.#data.length; }\n    get consumed(): number { return this.#offset; }\n    get bytes(): Uint8Array { return new Uint8Array(this.#data); }\n\n    #incrementBytesRead(count: number): void {\n        if (this.#parent) { return this.#parent.#incrementBytesRead(count); }\n\n        this.#bytesRead += count;\n\n        // Check for excessive inflation (see: #4537)\n        assert(this.#maxInflation < 1 || this.#bytesRead <= this.#maxInflation * this.dataLength, `compressed ABI data exceeds inflation ratio of ${ this.#maxInflation } ( see: https:/\\/github.com/ethers-io/ethers.js/issues/4537 )`,  \"BUFFER_OVERRUN\", {\n            buffer: getBytesCopy(this.#data), offset: this.#offset,\n            length: count, info: {\n                bytesRead: this.#bytesRead,\n                dataLength: this.dataLength\n            }\n        });\n    }\n\n    #peekBytes(offset: number, length: number, loose?: boolean): Uint8Array {\n        let alignedLength = Math.ceil(length / WordSize) * WordSize;\n        if (this.#offset + alignedLength > this.#data.length) {\n            if (this.allowLoose && loose && this.#offset + length <= this.#data.length) {\n                alignedLength = length;\n            } else {\n                assert(false, \"data out-of-bounds\", \"BUFFER_OVERRUN\", {\n                    buffer: getBytesCopy(this.#data),\n                    length: this.#data.length,\n                    offset: this.#offset + alignedLength\n                });\n            }\n        }\n        return this.#data.slice(this.#offset, this.#offset + alignedLength)\n    }\n\n    // Create a sub-reader with the same underlying data, but offset\n    subReader(offset: number): Reader {\n        const reader = new Reader(this.#data.slice(this.#offset + offset), this.allowLoose, this.#maxInflation);\n        reader.#parent = this;\n        return reader;\n    }\n\n    // Read bytes\n    readBytes(length: number, loose?: boolean): Uint8Array {\n        let bytes = this.#peekBytes(0, length, !!loose);\n        this.#incrementBytesRead(length);\n        this.#offset += bytes.length;\n        // @TODO: Make sure the length..end bytes are all 0?\n        return bytes.slice(0, length);\n    }\n\n    // Read a numeric values\n    readValue(): bigint {\n        return toBigInt(this.readBytes(WordSize));\n    }\n\n    readIndex(): number {\n        return toNumber(this.readBytes(WordSize));\n    }\n}\n","function number(n: number) {\n  if (!Number.isSafeInteger(n) || n < 0) throw new Error(`Wrong positive integer: ${n}`);\n}\n\nfunction bool(b: boolean) {\n  if (typeof b !== 'boolean') throw new Error(`Expected boolean, not ${b}`);\n}\n\nfunction bytes(b: Uint8Array | undefined, ...lengths: number[]) {\n  if (!(b instanceof Uint8Array)) throw new Error('Expected Uint8Array');\n  if (lengths.length > 0 && !lengths.includes(b.length))\n    throw new Error(`Expected Uint8Array of length ${lengths}, not of length=${b.length}`);\n}\n\ntype Hash = {\n  (data: Uint8Array): Uint8Array;\n  blockLen: number;\n  outputLen: number;\n  create: any;\n};\nfunction hash(hash: Hash) {\n  if (typeof hash !== 'function' || typeof hash.create !== 'function')\n    throw new Error('Hash should be wrapped by utils.wrapConstructor');\n  number(hash.outputLen);\n  number(hash.blockLen);\n}\n\nfunction exists(instance: any, checkFinished = true) {\n  if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n  if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\nfunction output(out: any, instance: any) {\n  bytes(out);\n  const min = instance.outputLen;\n  if (out.length < min) {\n    throw new Error(`digestInto() expects output buffer of length at least ${min}`);\n  }\n}\n\nexport { number, bool, bytes, hash, exists, output };\n\nconst assert = { number, bool, bytes, hash, exists, output };\nexport default assert;\n","const U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\n// We are not using BigUint64Array, because they are extremely slow as per 2022\nfunction fromBig(n: bigint, le = false) {\n  if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n  return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false) {\n  let Ah = new Uint32Array(lst.length);\n  let Al = new Uint32Array(lst.length);\n  for (let i = 0; i < lst.length; i++) {\n    const { h, l } = fromBig(lst[i], le);\n    [Ah[i], Al[i]] = [h, l];\n  }\n  return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number) => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number) => h >>> s;\nconst shrSL = (h: number, l: number, s: number) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number) => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number) => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number) => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number) => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number) => l;\nconst rotr32L = (h: number, _l: number) => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number) => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number) => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number) => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number) => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(Ah: number, Al: number, Bh: number, Bl: number) {\n  const l = (Al >>> 0) + (Bl >>> 0);\n  return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number) => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number) =>\n  (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number) =>\n  (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number) =>\n  (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number) =>\n  (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) =>\n  (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n  fromBig, split, toBig,\n  shrSH, shrSL,\n  rotrSH, rotrSL, rotrBH, rotrBL,\n  rotr32H, rotr32L,\n  rotlSH, rotlSL, rotlBH, rotlBL,\n  add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\n// prettier-ignore\nconst u64 = {\n  fromBig, split, toBig,\n  shrSH, shrSL,\n  rotrSH, rotrSL, rotrBH, rotrBL,\n  rotr32H, rotr32L,\n  rotlSH, rotlSL, rotlBH, rotlBL,\n  add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n","/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated, we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n  Uint16Array | Int16Array | Uint32Array | Int32Array;\n\nconst u8a = (a: any): a is Uint8Array => a instanceof Uint8Array;\n// Cast array to different type\nexport const u8 = (arr: TypedArray) => new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\nexport const u32 = (arr: TypedArray) =>\n  new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n\n// Cast array to view\nexport const createView = (arr: TypedArray) =>\n  new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n\n// The rotate right (circular right shift) operation for uint32\nexport const rotr = (word: number, shift: number) => (word << (32 - shift)) | (word >>> shift);\n\n// big-endian hardware is rare. Just in case someone still decides to run hashes:\n// early-throw an error because we don't support BE yet.\nexport const isLE = new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44;\nif (!isLE) throw new Error('Non little-endian hardware is not supported');\n\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n  i.toString(16).padStart(2, '0')\n);\n/**\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n  if (!u8a(bytes)) throw new Error('Uint8Array expected');\n  // pre-caching improves the speed 6x\n  let hex = '';\n  for (let i = 0; i < bytes.length; i++) {\n    hex += hexes[bytes[i]];\n  }\n  return hex;\n}\n\n/**\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n  if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n  const len = hex.length;\n  if (len % 2) throw new Error('padded hex string expected, got unpadded hex of length ' + len);\n  const array = new Uint8Array(len / 2);\n  for (let i = 0; i < array.length; i++) {\n    const j = i * 2;\n    const hexByte = hex.slice(j, j + 2);\n    const byte = Number.parseInt(hexByte, 16);\n    if (Number.isNaN(byte) || byte < 0) throw new Error('Invalid byte sequence');\n    array[i] = byte;\n  }\n  return array;\n}\n\n// There is no setImmediate in browser and setTimeout is slow.\n// call of async fn will return Promise, which will be fullfiled only on\n// next scheduler queue processing step and this is exactly what we need.\nexport const nextTick = async () => {};\n\n// Returns control to thread each 'tick' ms to avoid blocking\nexport async function asyncLoop(iters: number, tick: number, cb: (i: number) => void) {\n  let ts = Date.now();\n  for (let i = 0; i < iters; i++) {\n    cb(i);\n    // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n    const diff = Date.now() - ts;\n    if (diff >= 0 && diff < tick) continue;\n    await nextTick();\n    ts += diff;\n  }\n}\n\n// Global symbols in both browsers and Node.js since v11\n// See https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\n\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n  if (typeof str !== 'string') throw new Error(`utf8ToBytes expected string, got ${typeof str}`);\n  return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\nexport type Input = Uint8Array | string;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n  if (typeof data === 'string') data = utf8ToBytes(data);\n  if (!u8a(data)) throw new Error(`expected Uint8Array, got ${typeof data}`);\n  return data;\n}\n\n/**\n * Copies several Uint8Arrays into one.\n */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n  const r = new Uint8Array(arrays.reduce((sum, a) => sum + a.length, 0));\n  let pad = 0; // walk through each item, ensure they have proper type\n  arrays.forEach((a) => {\n    if (!u8a(a)) throw new Error('Uint8Array expected');\n    r.set(a, pad);\n    pad += a.length;\n  });\n  return r;\n}\n\n// For runtime check if class implements interface\nexport abstract class Hash<T extends Hash<T>> {\n  abstract blockLen: number; // Bytes per block\n  abstract outputLen: number; // Bytes in output\n  abstract update(buf: Input): this;\n  // Writes digest into buf\n  abstract digestInto(buf: Uint8Array): void;\n  abstract digest(): Uint8Array;\n  /**\n   * Resets internal state. Makes Hash instance unusable.\n   * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n   * by user, they will need to manually call `destroy()` when zeroing is necessary.\n   */\n  abstract destroy(): void;\n  /**\n   * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n   * when no options are passed.\n   * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n   * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n   * There are no guarantees for clean-up because it's impossible in JS.\n   */\n  abstract _cloneInto(to?: T): T;\n  // Safe version that clones internal state\n  clone(): T {\n    return this._cloneInto();\n  }\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n  xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n  xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\nconst toStr = {}.toString;\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n  defaults: T1,\n  opts?: T2\n): T1 & T2 {\n  if (opts !== undefined && toStr.call(opts) !== '[object Object]')\n    throw new Error('Options should be object or undefined');\n  const merged = Object.assign(defaults, opts);\n  return merged as T1 & T2;\n}\n\nexport type CHash = ReturnType<typeof wrapConstructor>;\n\nexport function wrapConstructor<T extends Hash<T>>(hashCons: () => Hash<T>) {\n  const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n  const tmp = hashCons();\n  hashC.outputLen = tmp.outputLen;\n  hashC.blockLen = tmp.blockLen;\n  hashC.create = () => hashCons();\n  return hashC;\n}\n\nexport function wrapConstructorWithOpts<H extends Hash<H>, T extends Object>(\n  hashCons: (opts?: T) => Hash<H>\n) {\n  const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n  const tmp = hashCons({} as T);\n  hashC.outputLen = tmp.outputLen;\n  hashC.blockLen = tmp.blockLen;\n  hashC.create = (opts: T) => hashCons(opts);\n  return hashC;\n}\n\nexport function wrapXOFConstructorWithOpts<H extends HashXOF<H>, T extends Object>(\n  hashCons: (opts?: T) => HashXOF<H>\n) {\n  const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n  const tmp = hashCons({} as T);\n  hashC.outputLen = tmp.outputLen;\n  hashC.blockLen = tmp.blockLen;\n  hashC.create = (opts: T) => hashCons(opts);\n  return hashC;\n}\n\n/**\n * Secure PRNG. Uses `crypto.getRandomValues`, which defers to OS.\n */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n  if (crypto && typeof crypto.getRandomValues === 'function') {\n    return crypto.getRandomValues(new Uint8Array(bytesLength));\n  }\n  throw new Error('crypto.getRandomValues must be defined');\n}\n","import { bytes, exists, number, output } from './_assert.js';\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.js';\nimport {\n  Hash,\n  u32,\n  Input,\n  toBytes,\n  wrapConstructor,\n  wrapXOFConstructorWithOpts,\n  HashXOF,\n} from './utils.js';\n\n// SHA3 (keccak) is based on a new design: basically, the internal state is bigger than output size.\n// It's called a sponge function.\n\n// Various per round constants calculations\nconst [SHA3_PI, SHA3_ROTL, _SHA3_IOTA]: [number[], number[], bigint[]] = [[], [], []];\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\nconst _7n = /* @__PURE__ */ BigInt(7);\nconst _256n = /* @__PURE__ */ BigInt(256);\nconst _0x71n = /* @__PURE__ */ BigInt(0x71);\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n  // Pi\n  [x, y] = [y, (2 * x + 3 * y) % 5];\n  SHA3_PI.push(2 * (5 * y + x));\n  // Rotational\n  SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n  // Iota\n  let t = _0n;\n  for (let j = 0; j < 7; j++) {\n    R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n    if (R & _2n) t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n  }\n  _SHA3_IOTA.push(t);\n}\nconst [SHA3_IOTA_H, SHA3_IOTA_L] = /* @__PURE__ */ split(_SHA3_IOTA, true);\n\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h: number, l: number, s: number) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h: number, l: number, s: number) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n\n// Same as keccakf1600, but allows to skip some rounds\nexport function keccakP(s: Uint32Array, rounds: number = 24) {\n  const B = new Uint32Array(5 * 2);\n  // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n  for (let round = 24 - rounds; round < 24; round++) {\n    // Theta θ\n    for (let x = 0; x < 10; x++) B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n    for (let x = 0; x < 10; x += 2) {\n      const idx1 = (x + 8) % 10;\n      const idx0 = (x + 2) % 10;\n      const B0 = B[idx0];\n      const B1 = B[idx0 + 1];\n      const Th = rotlH(B0, B1, 1) ^ B[idx1];\n      const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n      for (let y = 0; y < 50; y += 10) {\n        s[x + y] ^= Th;\n        s[x + y + 1] ^= Tl;\n      }\n    }\n    // Rho (ρ) and Pi (π)\n    let curH = s[2];\n    let curL = s[3];\n    for (let t = 0; t < 24; t++) {\n      const shift = SHA3_ROTL[t];\n      const Th = rotlH(curH, curL, shift);\n      const Tl = rotlL(curH, curL, shift);\n      const PI = SHA3_PI[t];\n      curH = s[PI];\n      curL = s[PI + 1];\n      s[PI] = Th;\n      s[PI + 1] = Tl;\n    }\n    // Chi (χ)\n    for (let y = 0; y < 50; y += 10) {\n      for (let x = 0; x < 10; x++) B[x] = s[y + x];\n      for (let x = 0; x < 10; x++) s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n    }\n    // Iota (ι)\n    s[0] ^= SHA3_IOTA_H[round];\n    s[1] ^= SHA3_IOTA_L[round];\n  }\n  B.fill(0);\n}\n\nexport class Keccak extends Hash<Keccak> implements HashXOF<Keccak> {\n  protected state: Uint8Array;\n  protected pos = 0;\n  protected posOut = 0;\n  protected finished = false;\n  protected state32: Uint32Array;\n  protected destroyed = false;\n  // NOTE: we accept arguments in bytes instead of bits here.\n  constructor(\n    public blockLen: number,\n    public suffix: number,\n    public outputLen: number,\n    protected enableXOF = false,\n    protected rounds: number = 24\n  ) {\n    super();\n    // Can be passed from user as dkLen\n    number(outputLen);\n    // 1600 = 5x5 matrix of 64bit.  1600 bits === 200 bytes\n    if (0 >= this.blockLen || this.blockLen >= 200)\n      throw new Error('Sha3 supports only keccak-f1600 function');\n    this.state = new Uint8Array(200);\n    this.state32 = u32(this.state);\n  }\n  protected keccak() {\n    keccakP(this.state32, this.rounds);\n    this.posOut = 0;\n    this.pos = 0;\n  }\n  update(data: Input) {\n    exists(this);\n    const { blockLen, state } = this;\n    data = toBytes(data);\n    const len = data.length;\n    for (let pos = 0; pos < len; ) {\n      const take = Math.min(blockLen - this.pos, len - pos);\n      for (let i = 0; i < take; i++) state[this.pos++] ^= data[pos++];\n      if (this.pos === blockLen) this.keccak();\n    }\n    return this;\n  }\n  protected finish() {\n    if (this.finished) return;\n    this.finished = true;\n    const { state, suffix, pos, blockLen } = this;\n    // Do the padding\n    state[pos] ^= suffix;\n    if ((suffix & 0x80) !== 0 && pos === blockLen - 1) this.keccak();\n    state[blockLen - 1] ^= 0x80;\n    this.keccak();\n  }\n  protected writeInto(out: Uint8Array): Uint8Array {\n    exists(this, false);\n    bytes(out);\n    this.finish();\n    const bufferOut = this.state;\n    const { blockLen } = this;\n    for (let pos = 0, len = out.length; pos < len; ) {\n      if (this.posOut >= blockLen) this.keccak();\n      const take = Math.min(blockLen - this.posOut, len - pos);\n      out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n      this.posOut += take;\n      pos += take;\n    }\n    return out;\n  }\n  xofInto(out: Uint8Array): Uint8Array {\n    // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n    if (!this.enableXOF) throw new Error('XOF is not possible for this instance');\n    return this.writeInto(out);\n  }\n  xof(bytes: number): Uint8Array {\n    number(bytes);\n    return this.xofInto(new Uint8Array(bytes));\n  }\n  digestInto(out: Uint8Array) {\n    output(out, this);\n    if (this.finished) throw new Error('digest() was already called');\n    this.writeInto(out);\n    this.destroy();\n    return out;\n  }\n  digest() {\n    return this.digestInto(new Uint8Array(this.outputLen));\n  }\n  destroy() {\n    this.destroyed = true;\n    this.state.fill(0);\n  }\n  _cloneInto(to?: Keccak): Keccak {\n    const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n    to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n    to.state32.set(this.state32);\n    to.pos = this.pos;\n    to.posOut = this.posOut;\n    to.finished = this.finished;\n    to.rounds = rounds;\n    // Suffix can change in cSHAKE\n    to.suffix = suffix;\n    to.outputLen = outputLen;\n    to.enableXOF = enableXOF;\n    to.destroyed = this.destroyed;\n    return to;\n  }\n}\n\nconst gen = (suffix: number, blockLen: number, outputLen: number) =>\n  wrapConstructor(() => new Keccak(blockLen, suffix, outputLen));\n\nexport const sha3_224 = /* @__PURE__ */ gen(0x06, 144, 224 / 8);\n/**\n * SHA3-256 hash function\n * @param message - that would be hashed\n */\nexport const sha3_256 = /* @__PURE__ */ gen(0x06, 136, 256 / 8);\nexport const sha3_384 = /* @__PURE__ */ gen(0x06, 104, 384 / 8);\nexport const sha3_512 = /* @__PURE__ */ gen(0x06, 72, 512 / 8);\nexport const keccak_224 = /* @__PURE__ */ gen(0x01, 144, 224 / 8);\n/**\n * keccak-256 hash function. Different from SHA3-256.\n * @param message - that would be hashed\n */\nexport const keccak_256 = /* @__PURE__ */ gen(0x01, 136, 256 / 8);\nexport const keccak_384 = /* @__PURE__ */ gen(0x01, 104, 384 / 8);\nexport const keccak_512 = /* @__PURE__ */ gen(0x01, 72, 512 / 8);\n\nexport type ShakeOpts = { dkLen?: number };\n\nconst genShake = (suffix: number, blockLen: number, outputLen: number) =>\n  wrapXOFConstructorWithOpts<HashXOF<Keccak>, ShakeOpts>(\n    (opts: ShakeOpts = {}) =>\n      new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true)\n  );\n\nexport const shake128 = /* @__PURE__ */ genShake(0x1f, 168, 128 / 8);\nexport const shake256 = /* @__PURE__ */ genShake(0x1f, 136, 256 / 8);\n","/**\n *  Cryptographic hashing functions\n *\n *  @_subsection: api/crypto:Hash Functions [about-crypto-hashing]\n */\n\nimport { keccak_256 } from \"@noble/hashes/sha3\";\n\nimport { getBytes, hexlify } from \"../utils/index.js\";\n\nimport type { BytesLike } from \"../utils/index.js\";\n\n\nlet locked = false;\n\nconst _keccak256 = function(data: Uint8Array): Uint8Array {\n    return keccak_256(data);\n}\n\nlet __keccak256: (data: Uint8Array) => BytesLike = _keccak256;\n\n/**\n *  Compute the cryptographic KECCAK256 hash of %%data%%.\n *\n *  The %%data%% **must** be a data representation, to compute the\n *  hash of UTF-8 data use the [[id]] function.\n *\n *  @returns DataHexstring\n *  @example:\n *    keccak256(\"0x\")\n *    //_result:\n *\n *    keccak256(\"0x1337\")\n *    //_result:\n *\n *    keccak256(new Uint8Array([ 0x13, 0x37 ]))\n *    //_result:\n *\n *    // Strings are assumed to be DataHexString, otherwise it will\n *    // throw. To hash UTF-8 data, see the note above.\n *    keccak256(\"Hello World\")\n *    //_error:\n */\nexport function keccak256(_data: BytesLike): string {\n    const data = getBytes(_data, \"data\");\n    return hexlify(__keccak256(data));\n}\nkeccak256._ = _keccak256;\nkeccak256.lock = function(): void { locked = true; }\nkeccak256.register = function(func: (data: Uint8Array) => BytesLike) {\n    if (locked) { throw new TypeError(\"keccak256 is locked\"); }\n    __keccak256 = func;\n}\nObject.freeze(keccak256);\n","\n/**\n *  A constant for the zero address.\n *\n *  (**i.e.** ``\"0x0000000000000000000000000000000000000000\"``)\n */\nexport const ZeroAddress: string = \"0x0000000000000000000000000000000000000000\";\n\n","import { keccak256 } from \"../crypto/index.js\";\nimport { getBytes, assertArgument } from \"../utils/index.js\";\n\n\nconst BN_0 = BigInt(0);\nconst BN_36 = BigInt(36);\n\nfunction getChecksumAddress(address: string): string {\n//    if (!isHexString(address, 20)) {\n//        logger.throwArgumentError(\"invalid address\", \"address\", address);\n//    }\n\n    address = address.toLowerCase();\n\n    const chars = address.substring(2).split(\"\");\n\n    const expanded = new Uint8Array(40);\n    for (let i = 0; i < 40; i++) {\n        expanded[i] = chars[i].charCodeAt(0);\n    }\n\n    const hashed = getBytes(keccak256(expanded));\n\n    for (let i = 0; i < 40; i += 2) {\n        if ((hashed[i >> 1] >> 4) >= 8) {\n            chars[i] = chars[i].toUpperCase();\n        }\n        if ((hashed[i >> 1] & 0x0f) >= 8) {\n            chars[i + 1] = chars[i + 1].toUpperCase();\n        }\n    }\n\n    return \"0x\" + chars.join(\"\");\n}\n\n// See: https://en.wikipedia.org/wiki/International_Bank_Account_Number\n\n// Create lookup table\nconst ibanLookup: { [character: string]: string } = { };\nfor (let i = 0; i < 10; i++) { ibanLookup[String(i)] = String(i); }\nfor (let i = 0; i < 26; i++) { ibanLookup[String.fromCharCode(65 + i)] = String(10 + i); }\n\n// How many decimal digits can we process? (for 64-bit float, this is 15)\n// i.e. Math.floor(Math.log10(Number.MAX_SAFE_INTEGER));\nconst safeDigits = 15;\n\nfunction ibanChecksum(address: string): string {\n    address = address.toUpperCase();\n    address = address.substring(4) + address.substring(0, 2) + \"00\";\n\n    let expanded = address.split(\"\").map((c) => { return ibanLookup[c]; }).join(\"\");\n\n    // Javascript can handle integers safely up to 15 (decimal) digits\n    while (expanded.length >= safeDigits){\n        let block = expanded.substring(0, safeDigits);\n        expanded = parseInt(block, 10) % 97 + expanded.substring(block.length);\n    }\n\n    let checksum = String(98 - (parseInt(expanded, 10) % 97));\n    while (checksum.length < 2) { checksum = \"0\" + checksum; }\n\n    return checksum;\n};\n\nconst Base36 = (function() {;\n    const result: Record<string, bigint> = { };\n    for (let i = 0; i < 36; i++) {\n        const key = \"0123456789abcdefghijklmnopqrstuvwxyz\"[i];\n        result[key] = BigInt(i);\n    }\n    return result;\n})();\n\nfunction fromBase36(value: string): bigint {\n    value = value.toLowerCase();\n\n    let result = BN_0;\n    for (let i = 0; i < value.length; i++) {\n        result = result * BN_36 + Base36[value[i]];\n    }\n    return result;\n}\n\n/**\n *  Returns a normalized and checksumed address for %%address%%.\n *  This accepts non-checksum addresses, checksum addresses and\n *  [[getIcapAddress]] formats.\n *\n *  The checksum in Ethereum uses the capitalization (upper-case\n *  vs lower-case) of the characters within an address to encode\n *  its checksum, which offers, on average, a checksum of 15-bits.\n *\n *  If %%address%% contains both upper-case and lower-case, it is\n *  assumed to already be a checksum address and its checksum is\n *  validated, and if the address fails its expected checksum an\n *  error is thrown.\n *\n *  If you wish the checksum of %%address%% to be ignore, it should\n *  be converted to lower-case (i.e. ``.toLowercase()``) before\n *  being passed in. This should be a very rare situation though,\n *  that you wish to bypass the safegaurds in place to protect\n *  against an address that has been incorrectly copied from another\n *  source.\n *\n *  @example:\n *    // Adds the checksum (via upper-casing specific letters)\n *    getAddress(\"0x8ba1f109551bd432803012645ac136ddd64dba72\")\n *    //_result:\n *\n *    // Converts ICAP address and adds checksum\n *    getAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\");\n *    //_result:\n *\n *    // Throws an error if an address contains mixed case,\n *    // but the checksum fails\n *    getAddress(\"0x8Ba1f109551bD432803012645Ac136ddd64DBA72\")\n *    //_error:\n */\nexport function getAddress(address: string): string {\n\n    assertArgument(typeof(address) === \"string\", \"invalid address\", \"address\", address);\n\n    if (address.match(/^(0x)?[0-9a-fA-F]{40}$/)) {\n\n        // Missing the 0x prefix\n        if (!address.startsWith(\"0x\")) { address = \"0x\" + address; }\n\n        const result = getChecksumAddress(address);\n\n        // It is a checksummed address with a bad checksum\n        assertArgument(!address.match(/([A-F].*[a-f])|([a-f].*[A-F])/) || result === address,\n            \"bad address checksum\", \"address\", address);\n\n        return result;\n    }\n\n    // Maybe ICAP? (we only support direct mode)\n    if (address.match(/^XE[0-9]{2}[0-9A-Za-z]{30,31}$/)) {\n        // It is an ICAP address with a bad checksum\n        assertArgument(address.substring(2, 4) === ibanChecksum(address), \"bad icap checksum\", \"address\", address);\n\n        let result = fromBase36(address.substring(4)).toString(16);\n        while (result.length < 40) { result = \"0\" + result; }\n        return  getChecksumAddress(\"0x\" + result);\n    }\n\n    assertArgument(false, \"invalid address\", \"address\", address);\n}\n\n/**\n *  The [ICAP Address format](link-icap) format is an early checksum\n *  format which attempts to be compatible with the banking\n *  industry [IBAN format](link-wiki-iban) for bank accounts.\n *\n *  It is no longer common or a recommended format.\n *\n *  @example:\n *    getIcapAddress(\"0x8ba1f109551bd432803012645ac136ddd64dba72\");\n *    //_result:\n *\n *    getIcapAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\");\n *    //_result:\n *\n *    // Throws an error if the ICAP checksum is wrong\n *    getIcapAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK37\");\n *    //_error:\n */\nexport function getIcapAddress(address: string): string {\n    //let base36 = _base16To36(getAddress(address).substring(2)).toUpperCase();\n    let base36 = BigInt(getAddress(address)).toString(36).toUpperCase();\n    while (base36.length < 30) { base36 = \"0\" + base36; }\n    return \"XE\" + ibanChecksum(\"XE00\" + base36) + base36;\n}\n","import { keccak256 } from \"../crypto/index.js\";\nimport {\n    concat, dataSlice, getBigInt, getBytes, encodeRlp, assertArgument\n} from \"../utils/index.js\";\n\nimport { getAddress } from \"./address.js\";\n\nimport type { BigNumberish, BytesLike } from \"../utils/index.js\";\n\n\n// http://ethereum.stackexchange.com/questions/760/how-is-the-address-of-an-ethereum-contract-computed\n\n/**\n *  Returns the address that would result from a ``CREATE`` for %%tx%%.\n *\n *  This can be used to compute the address a contract will be\n *  deployed to by an EOA when sending a deployment transaction (i.e.\n *  when the ``to`` address is ``null``).\n *\n *  This can also be used to compute the address a contract will be\n *  deployed to by a contract, by using the contract's address as the\n *  ``to`` and the contract's nonce.\n *\n *  @example\n *    from = \"0x8ba1f109551bD432803012645Ac136ddd64DBA72\";\n *    nonce = 5;\n *\n *    getCreateAddress({ from, nonce });\n *    //_result:\n */\nexport function getCreateAddress(tx: { from: string, nonce: BigNumberish }): string {\n    const from = getAddress(tx.from);\n    const nonce = getBigInt(tx.nonce, \"tx.nonce\");\n\n    let nonceHex = nonce.toString(16);\n    if (nonceHex === \"0\") {\n        nonceHex = \"0x\";\n    } else if (nonceHex.length % 2) {\n        nonceHex = \"0x0\" + nonceHex;\n    } else {\n        nonceHex = \"0x\" + nonceHex;\n    }\n\n    return getAddress(dataSlice(keccak256(encodeRlp([ from, nonceHex ])), 12));\n}\n\n/**\n *  Returns the address that would result from a ``CREATE2`` operation\n *  with the given %%from%%, %%salt%% and %%initCodeHash%%.\n *\n *  To compute the %%initCodeHash%% from a contract's init code, use\n *  the [[keccak256]] function.\n *\n *  For a quick overview and example of ``CREATE2``, see [[link-ricmoo-wisps]].\n *\n *  @example\n *    // The address of the contract\n *    from = \"0x8ba1f109551bD432803012645Ac136ddd64DBA72\"\n *\n *    // The salt\n *    salt = id(\"HelloWorld\")\n *\n *    // The hash of the initCode\n *    initCode = \"0x6394198df16000526103ff60206004601c335afa6040516060f3\";\n *    initCodeHash = keccak256(initCode)\n *\n *    getCreate2Address(from, salt, initCodeHash)\n *    //_result:\n */\nexport function getCreate2Address(_from: string, _salt: BytesLike, _initCodeHash: BytesLike): string {\n    const from = getAddress(_from);\n    const salt = getBytes(_salt, \"salt\");\n    const initCodeHash = getBytes(_initCodeHash, \"initCodeHash\");\n\n    assertArgument(salt.length === 32, \"salt must be 32 bytes\", \"salt\", _salt);\n\n    assertArgument(initCodeHash.length === 32, \"initCodeHash must be 32 bytes\", \"initCodeHash\", _initCodeHash);\n\n    return getAddress(dataSlice(keccak256(concat([ \"0xff\", from, salt, initCodeHash ])), 12))\n}\n","import { assert, assertArgument } from \"../utils/index.js\";\n\nimport { getAddress } from \"./address.js\";\n\nimport type { Addressable, AddressLike, NameResolver } from \"./index.js\";\n\n\n/**\n *  Returns true if %%value%% is an object which implements the\n *  [[Addressable]] interface.\n *\n *  @example:\n *    // Wallets and AbstractSigner sub-classes\n *    isAddressable(Wallet.createRandom())\n *    //_result:\n *\n *    // Contracts\n *    contract = new Contract(\"dai.tokens.ethers.eth\", [ ], provider)\n *    isAddressable(contract)\n *    //_result:\n */\nexport function isAddressable(value: any): value is Addressable {\n    return (value && typeof(value.getAddress) === \"function\");\n}\n\n/**\n *  Returns true if %%value%% is a valid address.\n *\n *  @example:\n *    // Valid address\n *    isAddress(\"0x8ba1f109551bD432803012645Ac136ddd64DBA72\")\n *    //_result:\n *\n *    // Valid ICAP address\n *    isAddress(\"XE65GB6LDNXYOFTX0NSV3FUWKOWIXAMJK36\")\n *    //_result:\n *\n *    // Invalid checksum\n *    isAddress(\"0x8Ba1f109551bD432803012645Ac136ddd64DBa72\")\n *    //_result:\n *\n *    // Invalid ICAP checksum\n *    isAddress(\"0x8Ba1f109551bD432803012645Ac136ddd64DBA72\")\n *    //_result:\n *\n *    // Not an address (an ENS name requires a provided and an\n *    // asynchronous API to access)\n *    isAddress(\"ricmoo.eth\")\n *    //_result:\n */\nexport function isAddress(value: any): value is string {\n    try {\n        getAddress(value);\n        return true;\n    } catch (error) { }\n    return false;\n}\n\nasync function checkAddress(target: any, promise: Promise<null | string>): Promise<string> {\n    const result = await promise;\n    if (result == null || result === \"0x0000000000000000000000000000000000000000\") {\n        assert(typeof(target) !== \"string\", \"unconfigured name\", \"UNCONFIGURED_NAME\", { value: target });\n        assertArgument(false, \"invalid AddressLike value; did not resolve to a value address\", \"target\", target);\n    }\n    return getAddress(result);\n}\n\n/**\n *  Resolves to an address for the %%target%%, which may be any\n *  supported address type, an [[Addressable]] or a Promise which\n *  resolves to an address.\n *\n *  If an ENS name is provided, but that name has not been correctly\n *  configured a [[UnconfiguredNameError]] is thrown.\n *\n *  @example:\n *    addr = \"0x6B175474E89094C44Da98b954EedeAC495271d0F\"\n *\n *    // Addresses are return synchronously\n *    resolveAddress(addr, provider)\n *    //_result:\n *\n *    // Address promises are resolved asynchronously\n *    resolveAddress(Promise.resolve(addr))\n *    //_result:\n *\n *    // ENS names are resolved asynchronously\n *    resolveAddress(\"dai.tokens.ethers.eth\", provider)\n *    //_result:\n *\n *    // Addressable objects are resolved asynchronously\n *    contract = new Contract(addr, [ ])\n *    resolveAddress(contract, provider)\n *    //_result:\n *\n *    // Unconfigured ENS names reject\n *    resolveAddress(\"nothing-here.ricmoo.eth\", provider)\n *    //_error:\n *\n *    // ENS names require a NameResolver object passed in\n *    // (notice the provider was omitted)\n *    resolveAddress(\"nothing-here.ricmoo.eth\")\n *    //_error:\n */\nexport function resolveAddress(target: AddressLike, resolver?: null | NameResolver): string | Promise<string> {\n\n    if (typeof(target) === \"string\") {\n        if (target.match(/^0x[0-9a-f]{40}$/i)) { return getAddress(target); }\n\n        assert(resolver != null, \"ENS resolution requires a provider\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"resolveName\" });\n\n        return checkAddress(target, resolver.resolveName(target));\n\n    } else if (isAddressable(target)) {\n        return checkAddress(target, target.getAddress());\n\n    } else if (target && typeof(target.then) === \"function\") {\n        return checkAddress(target, target);\n    }\n\n    assertArgument(false, \"unsupported addressable value\", \"target\", target);\n}\n","/**\n *  A Typed object allows a value to have its type explicitly\n *  specified.\n *\n *  For example, in Solidity, the value ``45`` could represent a\n *  ``uint8`` or a ``uint256``. The value ``0x1234`` could represent\n *  a ``bytes2`` or ``bytes``.\n *\n *  Since JavaScript has no meaningful way to explicitly inform any\n *  APIs which what the type is, this allows transparent interoperation\n *  with Soldity.\n *\n *  @_subsection: api/abi:Typed Values\n */\n\nimport { assertPrivate, defineProperties } from \"../utils/index.js\";\n\nimport type { Addressable } from \"../address/index.js\";\nimport type { BigNumberish, BytesLike } from \"../utils/index.js\";\n\nimport type { Result } from \"./coders/abstract-coder.js\";\n\nconst _gaurd = { };\n\nfunction n(value: BigNumberish, width: number): Typed {\n    let signed = false;\n    if (width < 0) {\n        signed = true;\n        width *= -1;\n    }\n\n    // @TODO: Check range is valid for value\n    return new Typed(_gaurd, `${ signed ? \"\": \"u\" }int${ width }`, value, { signed, width });\n}\n\nfunction b(value: BytesLike, size?: number): Typed {\n    // @TODO: Check range is valid for value\n    return new Typed(_gaurd, `bytes${ (size) ? size: \"\" }`, value, { size });\n}\n\n// @TODO: Remove this in v7, it was replaced by TypedBigInt\n/**\n *  @_ignore:\n */\nexport interface TypedNumber extends Typed {\n    value: number;\n    defaultValue(): number;\n    minValue(): number;\n    maxValue(): number;\n}\n\n/**\n *  A **Typed** that represents a numeric value.\n */\nexport interface TypedBigInt extends Typed {\n    /**\n     *  The value.\n     */\n    value: bigint;\n\n    /**\n     *  The default value for all numeric types is ``0``.\n     */\n    defaultValue(): bigint;\n\n    /**\n     *  The minimum value for this type, accounting for bit-width and signed-ness.\n     */\n    minValue(): bigint;\n\n    /**\n     *  The minimum value for this type, accounting for bit-width.\n     */\n    maxValue(): bigint;\n}\n\n/**\n *  A **Typed** that represents a binary sequence of data as bytes.\n */\nexport interface TypedData extends Typed {\n    /**\n     *  The value.\n     */\n    value: string;\n\n    /**\n     *  The default value for this type.\n     */\n    defaultValue(): string;\n}\n\n/**\n *  A **Typed** that represents a UTF-8 sequence of bytes.\n */\nexport interface TypedString extends Typed {\n    /**\n     *  The value.\n     */\n    value: string;\n\n    /**\n     *  The default value for the string type is the empty string (i.e. ``\"\"``).\n     */\n    defaultValue(): string;\n}\n\nconst _typedSymbol = Symbol.for(\"_ethers_typed\");\n\n/**\n *  The **Typed** class to wrap values providing explicit type information.\n */\nexport class Typed {\n\n    /**\n     *  The type, as a Solidity-compatible type.\n     */\n    readonly type!: string;\n\n    /**\n     *  The actual value.\n     */\n    readonly value!: any;\n\n    readonly #options: any;\n\n    /**\n     *  @_ignore:\n     */\n    readonly _typedSymbol!: Symbol;\n\n    /**\n     *  @_ignore:\n     */\n    constructor(gaurd: any, type: string, value: any, options?: any) {\n        if (options == null) { options = null; }\n        assertPrivate(_gaurd, gaurd, \"Typed\");\n        defineProperties<Typed>(this, { _typedSymbol, type, value });\n        this.#options = options;\n\n        // Check the value is valid\n        this.format();\n    }\n\n    /**\n     *  Format the type as a Human-Readable type.\n     */\n    format(): string {\n        if (this.type === \"array\") {\n            throw new Error(\"\");\n        } else if (this.type === \"dynamicArray\") {\n            throw new Error(\"\");\n        } else if (this.type === \"tuple\") {\n            return `tuple(${ this.value.map((v: Typed) => v.format()).join(\",\") })`\n        }\n\n        return this.type;\n    }\n\n    /**\n     *  The default value returned by this type.\n     */\n    defaultValue(): string | number | bigint | Result {\n        return 0;\n    }\n\n    /**\n     *  The minimum value for numeric types.\n     */\n    minValue(): string | number | bigint {\n        return 0;\n    }\n\n    /**\n     *  The maximum value for numeric types.\n     */\n    maxValue(): string | number | bigint {\n        return 0;\n    }\n\n    /**\n     *  Returns ``true`` and provides a type guard is this is a [[TypedBigInt]].\n     */\n    isBigInt(): this is TypedBigInt {\n        return !!(this.type.match(/^u?int[0-9]+$/));\n    }\n\n    /**\n     *  Returns ``true`` and provides a type guard is this is a [[TypedData]].\n     */\n    isData(): this is TypedData {\n        return this.type.startsWith(\"bytes\");\n    }\n\n    /**\n     *  Returns ``true`` and provides a type guard is this is a [[TypedString]].\n     */\n    isString(): this is TypedString {\n        return (this.type === \"string\");\n    }\n\n    /**\n     *  Returns the tuple name, if this is a tuple. Throws otherwise.\n     */\n    get tupleName(): null | string {\n        if (this.type !== \"tuple\") { throw TypeError(\"not a tuple\"); }\n        return this.#options;\n    }\n\n    // Returns the length of this type as an array\n    // - `null` indicates the length is unforced, it could be dynamic\n    // - `-1` indicates the length is dynamic\n    // - any other value indicates it is a static array and is its length\n\n    /**\n     *  Returns the length of the array type or ``-1`` if it is dynamic.\n     *\n     *  Throws if the type is not an array.\n     */\n    get arrayLength(): null | number {\n        if (this.type !== \"array\") { throw TypeError(\"not an array\"); }\n        if (this.#options === true) { return -1; }\n        if (this.#options === false) { return (<Array<any>>(this.value)).length; }\n        return null;\n    }\n\n    /**\n     *  Returns a new **Typed** of %%type%% with the %%value%%.\n     */\n    static from(type: string, value: any): Typed {\n        return new Typed(_gaurd, type, value);\n    }\n\n    /**\n     *  Return a new ``uint8`` type for %%v%%.\n     */\n    static uint8(v: BigNumberish): Typed { return n(v, 8); }\n\n    /**\n     *  Return a new ``uint16`` type for %%v%%.\n     */\n    static uint16(v: BigNumberish): Typed { return n(v, 16); }\n\n    /**\n     *  Return a new ``uint24`` type for %%v%%.\n     */\n    static uint24(v: BigNumberish): Typed { return n(v, 24); }\n\n    /**\n     *  Return a new ``uint32`` type for %%v%%.\n     */\n    static uint32(v: BigNumberish): Typed { return n(v, 32); }\n\n    /**\n     *  Return a new ``uint40`` type for %%v%%.\n     */\n    static uint40(v: BigNumberish): Typed { return n(v, 40); }\n\n    /**\n     *  Return a new ``uint48`` type for %%v%%.\n     */\n    static uint48(v: BigNumberish): Typed { return n(v, 48); }\n\n    /**\n     *  Return a new ``uint56`` type for %%v%%.\n     */\n    static uint56(v: BigNumberish): Typed { return n(v, 56); }\n\n    /**\n     *  Return a new ``uint64`` type for %%v%%.\n     */\n    static uint64(v: BigNumberish): Typed { return n(v, 64); }\n\n    /**\n     *  Return a new ``uint72`` type for %%v%%.\n     */\n    static uint72(v: BigNumberish): Typed { return n(v, 72); }\n\n    /**\n     *  Return a new ``uint80`` type for %%v%%.\n     */\n    static uint80(v: BigNumberish): Typed { return n(v, 80); }\n\n    /**\n     *  Return a new ``uint88`` type for %%v%%.\n     */\n    static uint88(v: BigNumberish): Typed { return n(v, 88); }\n\n    /**\n     *  Return a new ``uint96`` type for %%v%%.\n     */\n    static uint96(v: BigNumberish): Typed { return n(v, 96); }\n\n    /**\n     *  Return a new ``uint104`` type for %%v%%.\n     */\n    static uint104(v: BigNumberish): Typed { return n(v, 104); }\n\n    /**\n     *  Return a new ``uint112`` type for %%v%%.\n     */\n    static uint112(v: BigNumberish): Typed { return n(v, 112); }\n\n    /**\n     *  Return a new ``uint120`` type for %%v%%.\n     */\n    static uint120(v: BigNumberish): Typed { return n(v, 120); }\n\n    /**\n     *  Return a new ``uint128`` type for %%v%%.\n     */\n    static uint128(v: BigNumberish): Typed { return n(v, 128); }\n\n    /**\n     *  Return a new ``uint136`` type for %%v%%.\n     */\n    static uint136(v: BigNumberish): Typed { return n(v, 136); }\n\n    /**\n     *  Return a new ``uint144`` type for %%v%%.\n     */\n    static uint144(v: BigNumberish): Typed { return n(v, 144); }\n\n    /**\n     *  Return a new ``uint152`` type for %%v%%.\n     */\n    static uint152(v: BigNumberish): Typed { return n(v, 152); }\n\n    /**\n     *  Return a new ``uint160`` type for %%v%%.\n     */\n    static uint160(v: BigNumberish): Typed { return n(v, 160); }\n\n    /**\n     *  Return a new ``uint168`` type for %%v%%.\n     */\n    static uint168(v: BigNumberish): Typed { return n(v, 168); }\n\n    /**\n     *  Return a new ``uint176`` type for %%v%%.\n     */\n    static uint176(v: BigNumberish): Typed { return n(v, 176); }\n\n    /**\n     *  Return a new ``uint184`` type for %%v%%.\n     */\n    static uint184(v: BigNumberish): Typed { return n(v, 184); }\n\n    /**\n     *  Return a new ``uint192`` type for %%v%%.\n     */\n    static uint192(v: BigNumberish): Typed { return n(v, 192); }\n\n    /**\n     *  Return a new ``uint200`` type for %%v%%.\n     */\n    static uint200(v: BigNumberish): Typed { return n(v, 200); }\n\n    /**\n     *  Return a new ``uint208`` type for %%v%%.\n     */\n    static uint208(v: BigNumberish): Typed { return n(v, 208); }\n\n    /**\n     *  Return a new ``uint216`` type for %%v%%.\n     */\n    static uint216(v: BigNumberish): Typed { return n(v, 216); }\n\n    /**\n     *  Return a new ``uint224`` type for %%v%%.\n     */\n    static uint224(v: BigNumberish): Typed { return n(v, 224); }\n\n    /**\n     *  Return a new ``uint232`` type for %%v%%.\n     */\n    static uint232(v: BigNumberish): Typed { return n(v, 232); }\n\n    /**\n     *  Return a new ``uint240`` type for %%v%%.\n     */\n    static uint240(v: BigNumberish): Typed { return n(v, 240); }\n\n    /**\n     *  Return a new ``uint248`` type for %%v%%.\n     */\n    static uint248(v: BigNumberish): Typed { return n(v, 248); }\n\n    /**\n     *  Return a new ``uint256`` type for %%v%%.\n     */\n    static uint256(v: BigNumberish): Typed { return n(v, 256); }\n\n    /**\n     *  Return a new ``uint256`` type for %%v%%.\n     */\n    static uint(v: BigNumberish): Typed { return n(v, 256); }\n\n    /**\n     *  Return a new ``int8`` type for %%v%%.\n     */\n    static int8(v: BigNumberish): Typed { return n(v, -8); }\n\n    /**\n     *  Return a new ``int16`` type for %%v%%.\n     */\n    static int16(v: BigNumberish): Typed { return n(v, -16); }\n\n    /**\n     *  Return a new ``int24`` type for %%v%%.\n     */\n    static int24(v: BigNumberish): Typed { return n(v, -24); }\n\n    /**\n     *  Return a new ``int32`` type for %%v%%.\n     */\n    static int32(v: BigNumberish): Typed { return n(v, -32); }\n\n    /**\n     *  Return a new ``int40`` type for %%v%%.\n     */\n    static int40(v: BigNumberish): Typed { return n(v, -40); }\n\n    /**\n     *  Return a new ``int48`` type for %%v%%.\n     */\n    static int48(v: BigNumberish): Typed { return n(v, -48); }\n\n    /**\n     *  Return a new ``int56`` type for %%v%%.\n     */\n    static int56(v: BigNumberish): Typed { return n(v, -56); }\n\n    /**\n     *  Return a new ``int64`` type for %%v%%.\n     */\n    static int64(v: BigNumberish): Typed { return n(v, -64); }\n\n    /**\n     *  Return a new ``int72`` type for %%v%%.\n     */\n    static int72(v: BigNumberish): Typed { return n(v, -72); }\n\n    /**\n     *  Return a new ``int80`` type for %%v%%.\n     */\n    static int80(v: BigNumberish): Typed { return n(v, -80); }\n\n    /**\n     *  Return a new ``int88`` type for %%v%%.\n     */\n    static int88(v: BigNumberish): Typed { return n(v, -88); }\n\n    /**\n     *  Return a new ``int96`` type for %%v%%.\n     */\n    static int96(v: BigNumberish): Typed { return n(v, -96); }\n\n    /**\n     *  Return a new ``int104`` type for %%v%%.\n     */\n    static int104(v: BigNumberish): Typed { return n(v, -104); }\n\n    /**\n     *  Return a new ``int112`` type for %%v%%.\n     */\n    static int112(v: BigNumberish): Typed { return n(v, -112); }\n\n    /**\n     *  Return a new ``int120`` type for %%v%%.\n     */\n    static int120(v: BigNumberish): Typed { return n(v, -120); }\n\n    /**\n     *  Return a new ``int128`` type for %%v%%.\n     */\n    static int128(v: BigNumberish): Typed { return n(v, -128); }\n\n    /**\n     *  Return a new ``int136`` type for %%v%%.\n     */\n    static int136(v: BigNumberish): Typed { return n(v, -136); }\n\n    /**\n     *  Return a new ``int144`` type for %%v%%.\n     */\n    static int144(v: BigNumberish): Typed { return n(v, -144); }\n\n    /**\n     *  Return a new ``int52`` type for %%v%%.\n     */\n    static int152(v: BigNumberish): Typed { return n(v, -152); }\n\n    /**\n     *  Return a new ``int160`` type for %%v%%.\n     */\n    static int160(v: BigNumberish): Typed { return n(v, -160); }\n\n    /**\n     *  Return a new ``int168`` type for %%v%%.\n     */\n    static int168(v: BigNumberish): Typed { return n(v, -168); }\n\n    /**\n     *  Return a new ``int176`` type for %%v%%.\n     */\n    static int176(v: BigNumberish): Typed { return n(v, -176); }\n\n    /**\n     *  Return a new ``int184`` type for %%v%%.\n     */\n    static int184(v: BigNumberish): Typed { return n(v, -184); }\n\n    /**\n     *  Return a new ``int92`` type for %%v%%.\n     */\n    static int192(v: BigNumberish): Typed { return n(v, -192); }\n\n    /**\n     *  Return a new ``int200`` type for %%v%%.\n     */\n    static int200(v: BigNumberish): Typed { return n(v, -200); }\n\n    /**\n     *  Return a new ``int208`` type for %%v%%.\n     */\n    static int208(v: BigNumberish): Typed { return n(v, -208); }\n\n    /**\n     *  Return a new ``int216`` type for %%v%%.\n     */\n    static int216(v: BigNumberish): Typed { return n(v, -216); }\n\n    /**\n     *  Return a new ``int224`` type for %%v%%.\n     */\n    static int224(v: BigNumberish): Typed { return n(v, -224); }\n\n    /**\n     *  Return a new ``int232`` type for %%v%%.\n     */\n    static int232(v: BigNumberish): Typed { return n(v, -232); }\n\n    /**\n     *  Return a new ``int240`` type for %%v%%.\n     */\n    static int240(v: BigNumberish): Typed { return n(v, -240); }\n\n    /**\n     *  Return a new ``int248`` type for %%v%%.\n     */\n    static int248(v: BigNumberish): Typed { return n(v, -248); }\n\n    /**\n     *  Return a new ``int256`` type for %%v%%.\n     */\n    static int256(v: BigNumberish): Typed { return n(v, -256); }\n\n    /**\n     *  Return a new ``int256`` type for %%v%%.\n     */\n    static int(v: BigNumberish): Typed { return n(v, -256); }\n\n    /**\n     *  Return a new ``bytes1`` type for %%v%%.\n     */\n    static bytes1(v: BytesLike): Typed { return b(v, 1); }\n\n    /**\n     *  Return a new ``bytes2`` type for %%v%%.\n     */\n    static bytes2(v: BytesLike): Typed { return b(v, 2); }\n\n    /**\n     *  Return a new ``bytes3`` type for %%v%%.\n     */\n    static bytes3(v: BytesLike): Typed { return b(v, 3); }\n\n    /**\n     *  Return a new ``bytes4`` type for %%v%%.\n     */\n    static bytes4(v: BytesLike): Typed { return b(v, 4); }\n\n    /**\n     *  Return a new ``bytes5`` type for %%v%%.\n     */\n    static bytes5(v: BytesLike): Typed { return b(v, 5); }\n\n    /**\n     *  Return a new ``bytes6`` type for %%v%%.\n     */\n    static bytes6(v: BytesLike): Typed { return b(v, 6); }\n\n    /**\n     *  Return a new ``bytes7`` type for %%v%%.\n     */\n    static bytes7(v: BytesLike): Typed { return b(v, 7); }\n\n    /**\n     *  Return a new ``bytes8`` type for %%v%%.\n     */\n    static bytes8(v: BytesLike): Typed { return b(v, 8); }\n\n    /**\n     *  Return a new ``bytes9`` type for %%v%%.\n     */\n    static bytes9(v: BytesLike): Typed { return b(v, 9); }\n\n    /**\n     *  Return a new ``bytes10`` type for %%v%%.\n     */\n    static bytes10(v: BytesLike): Typed { return b(v, 10); }\n\n    /**\n     *  Return a new ``bytes11`` type for %%v%%.\n     */\n    static bytes11(v: BytesLike): Typed { return b(v, 11); }\n\n    /**\n     *  Return a new ``bytes12`` type for %%v%%.\n     */\n    static bytes12(v: BytesLike): Typed { return b(v, 12); }\n\n    /**\n     *  Return a new ``bytes13`` type for %%v%%.\n     */\n    static bytes13(v: BytesLike): Typed { return b(v, 13); }\n\n    /**\n     *  Return a new ``bytes14`` type for %%v%%.\n     */\n    static bytes14(v: BytesLike): Typed { return b(v, 14); }\n\n    /**\n     *  Return a new ``bytes15`` type for %%v%%.\n     */\n    static bytes15(v: BytesLike): Typed { return b(v, 15); }\n\n    /**\n     *  Return a new ``bytes16`` type for %%v%%.\n     */\n    static bytes16(v: BytesLike): Typed { return b(v, 16); }\n\n    /**\n     *  Return a new ``bytes17`` type for %%v%%.\n     */\n    static bytes17(v: BytesLike): Typed { return b(v, 17); }\n\n    /**\n     *  Return a new ``bytes18`` type for %%v%%.\n     */\n    static bytes18(v: BytesLike): Typed { return b(v, 18); }\n\n    /**\n     *  Return a new ``bytes19`` type for %%v%%.\n     */\n    static bytes19(v: BytesLike): Typed { return b(v, 19); }\n\n    /**\n     *  Return a new ``bytes20`` type for %%v%%.\n     */\n    static bytes20(v: BytesLike): Typed { return b(v, 20); }\n\n    /**\n     *  Return a new ``bytes21`` type for %%v%%.\n     */\n    static bytes21(v: BytesLike): Typed { return b(v, 21); }\n\n    /**\n     *  Return a new ``bytes22`` type for %%v%%.\n     */\n    static bytes22(v: BytesLike): Typed { return b(v, 22); }\n\n    /**\n     *  Return a new ``bytes23`` type for %%v%%.\n     */\n    static bytes23(v: BytesLike): Typed { return b(v, 23); }\n\n    /**\n     *  Return a new ``bytes24`` type for %%v%%.\n     */\n    static bytes24(v: BytesLike): Typed { return b(v, 24); }\n\n    /**\n     *  Return a new ``bytes25`` type for %%v%%.\n     */\n    static bytes25(v: BytesLike): Typed { return b(v, 25); }\n\n    /**\n     *  Return a new ``bytes26`` type for %%v%%.\n     */\n    static bytes26(v: BytesLike): Typed { return b(v, 26); }\n\n    /**\n     *  Return a new ``bytes27`` type for %%v%%.\n     */\n    static bytes27(v: BytesLike): Typed { return b(v, 27); }\n\n    /**\n     *  Return a new ``bytes28`` type for %%v%%.\n     */\n    static bytes28(v: BytesLike): Typed { return b(v, 28); }\n\n    /**\n     *  Return a new ``bytes29`` type for %%v%%.\n     */\n    static bytes29(v: BytesLike): Typed { return b(v, 29); }\n\n    /**\n     *  Return a new ``bytes30`` type for %%v%%.\n     */\n    static bytes30(v: BytesLike): Typed { return b(v, 30); }\n\n    /**\n     *  Return a new ``bytes31`` type for %%v%%.\n     */\n    static bytes31(v: BytesLike): Typed { return b(v, 31); }\n\n    /**\n     *  Return a new ``bytes32`` type for %%v%%.\n     */\n    static bytes32(v: BytesLike): Typed { return b(v, 32); }\n\n\n    /**\n     *  Return a new ``address`` type for %%v%%.\n     */\n    static address(v: string | Addressable): Typed { return new Typed(_gaurd, \"address\", v); }\n\n    /**\n     *  Return a new ``bool`` type for %%v%%.\n     */\n    static bool(v: any): Typed { return new Typed(_gaurd, \"bool\", !!v); }\n\n    /**\n     *  Return a new ``bytes`` type for %%v%%.\n     */\n    static bytes(v: BytesLike): Typed { return new Typed(_gaurd, \"bytes\", v); }\n\n    /**\n     *  Return a new ``string`` type for %%v%%.\n     */\n    static string(v: string): Typed { return new Typed(_gaurd, \"string\", v); }\n\n\n    /**\n     *  Return a new ``array`` type for %%v%%, allowing %%dynamic%% length.\n     */\n    static array(v: Array<any | Typed>, dynamic?: null | boolean): Typed {\n        throw new Error(\"not implemented yet\");\n        return new Typed(_gaurd, \"array\", v, dynamic);\n    }\n\n\n    /**\n     *  Return a new ``tuple`` type for %%v%%, with the optional %%name%%.\n     */\n    static tuple(v: Array<any | Typed> | Record<string, any | Typed>, name?: string): Typed {\n        throw new Error(\"not implemented yet\");\n        return new Typed(_gaurd, \"tuple\", v, name);\n    }\n\n\n    /**\n     *  Return a new ``uint8`` type for %%v%%.\n     */\n    static overrides(v: Record<string, any>): Typed {\n        return new Typed(_gaurd, \"overrides\", Object.assign({ }, v));\n    }\n\n    /**\n     *  Returns true only if %%value%% is a [[Typed]] instance.\n     */\n    static isTyped(value: any): value is Typed {\n        return (value\n            && typeof(value) === \"object\"\n            && \"_typedSymbol\" in value\n            && value._typedSymbol === _typedSymbol);\n    }\n\n    /**\n     *  If the value is a [[Typed]] instance, validates the underlying value\n     *  and returns it, otherwise returns value directly.\n     *\n     *  This is useful for functions that with to accept either a [[Typed]]\n     *  object or values.\n     */\n    static dereference<T>(value: Typed | T, type: string): T {\n        if (Typed.isTyped(value)) {\n            if (value.type !== type) {\n                throw new Error(`invalid type: expecetd ${ type }, got ${ value.type }`);\n            }\n            return value.value;\n        }\n        return value;\n    }\n}\n","import { getAddress } from \"../../address/index.js\";\nimport { toBeHex } from \"../../utils/maths.js\";\n\nimport { Typed } from \"../typed.js\";\nimport { Coder } from \"./abstract-coder.js\";\n\nimport type { Reader, Writer } from \"./abstract-coder.js\";\n\n\n/**\n *  @_ignore\n */\nexport class AddressCoder extends Coder {\n\n    constructor(localName: string) {\n        super(\"address\", \"address\", localName, false);\n    }\n\n    defaultValue(): string {\n        return \"0x0000000000000000000000000000000000000000\";\n    }\n\n    encode(writer: Writer, _value: string | Typed): number {\n        let value = Typed.dereference(_value, \"string\");\n        try {\n            value = getAddress(value);\n        } catch (error: any) {\n            return this._throwError(error.message, _value);\n        }\n        return writer.writeValue(value);\n    }\n\n    decode(reader: Reader): any {\n        return getAddress(toBeHex(reader.readValue(), 20));\n    }\n}\n","import { Coder } from \"./abstract-coder.js\";\n\nimport type { Reader, Writer } from \"./abstract-coder.js\";\n\n/**\n *  Clones the functionality of an existing Coder, but without a localName\n *\n *  @_ignore\n */\nexport class AnonymousCoder extends Coder {\n    private coder: Coder;\n\n    constructor(coder: Coder) {\n        super(coder.name, coder.type, \"_\", coder.dynamic);\n        this.coder = coder;\n    }\n\n    defaultValue(): any {\n        return this.coder.defaultValue();\n    }\n\n    encode(writer: Writer, value: any): number {\n        return this.coder.encode(writer, value);\n    }\n\n    decode(reader: Reader): any {\n        return this.coder.decode(reader);\n    }\n}\n","import {\n    defineProperties, isError, assert, assertArgument, assertArgumentCount\n} from \"../../utils/index.js\";\n\nimport { Typed } from \"../typed.js\";\n\nimport { Coder, Result, WordSize, Writer } from \"./abstract-coder.js\";\nimport { AnonymousCoder } from \"./anonymous.js\";\n\nimport type { Reader } from \"./abstract-coder.js\";\n\n/**\n *  @_ignore\n */\nexport function pack(writer: Writer, coders: ReadonlyArray<Coder>, values: Array<any> | { [ name: string ]: any }): number {\n    let arrayValues: Array<any> = [ ];\n\n    if (Array.isArray(values)) {\n       arrayValues = values;\n\n    } else if (values && typeof(values) === \"object\") {\n        let unique: { [ name: string ]: boolean } = { };\n\n        arrayValues = coders.map((coder) => {\n            const name = coder.localName;\n            assert(name, \"cannot encode object for signature with missing names\",\n                \"INVALID_ARGUMENT\", { argument: \"values\", info: { coder }, value: values });\n\n            assert(!unique[name], \"cannot encode object for signature with duplicate names\",\n                \"INVALID_ARGUMENT\", { argument: \"values\", info: { coder }, value: values });\n\n            unique[name] = true;\n\n            return values[name];\n        });\n\n    } else {\n        assertArgument(false, \"invalid tuple value\", \"tuple\", values);\n    }\n\n    assertArgument(coders.length === arrayValues.length, \"types/value length mismatch\", \"tuple\", values);\n\n    let staticWriter = new Writer();\n    let dynamicWriter = new Writer();\n\n    let updateFuncs: Array<(baseOffset: number) => void> = [];\n    coders.forEach((coder, index) => {\n        let value = arrayValues[index];\n\n        if (coder.dynamic) {\n            // Get current dynamic offset (for the future pointer)\n            let dynamicOffset = dynamicWriter.length;\n\n            // Encode the dynamic value into the dynamicWriter\n            coder.encode(dynamicWriter, value);\n\n            // Prepare to populate the correct offset once we are done\n            let updateFunc = staticWriter.writeUpdatableValue();\n            updateFuncs.push((baseOffset: number) => {\n                updateFunc(baseOffset + dynamicOffset);\n            });\n\n        } else {\n            coder.encode(staticWriter, value);\n        }\n    });\n\n    // Backfill all the dynamic offsets, now that we know the static length\n    updateFuncs.forEach((func) => { func(staticWriter.length); });\n\n    let length = writer.appendWriter(staticWriter);\n    length += writer.appendWriter(dynamicWriter);\n    return length;\n}\n\n/**\n *  @_ignore\n */\nexport function unpack(reader: Reader, coders: ReadonlyArray<Coder>): Result {\n    let values: Array<any> = [];\n    let keys: Array<null | string> = [ ];\n\n    // A reader anchored to this base\n    let baseReader = reader.subReader(0);\n\n    coders.forEach((coder) => {\n        let value: any = null;\n\n        if (coder.dynamic) {\n            let offset = reader.readIndex();\n            let offsetReader = baseReader.subReader(offset);\n            try {\n                value = coder.decode(offsetReader);\n            } catch (error: any) {\n                // Cannot recover from this\n                if (isError(error, \"BUFFER_OVERRUN\")) {\n                    throw error;\n                }\n\n                value = error;\n                value.baseType = coder.name;\n                value.name = coder.localName;\n                value.type = coder.type;\n            }\n\n        } else {\n            try {\n                value = coder.decode(reader);\n            } catch (error: any) {\n                // Cannot recover from this\n                if (isError(error, \"BUFFER_OVERRUN\")) {\n                    throw error;\n                }\n\n                value = error;\n                value.baseType = coder.name;\n                value.name = coder.localName;\n                value.type = coder.type;\n            }\n        }\n\n        if (value == undefined) {\n            throw new Error(\"investigate\");\n        }\n\n        values.push(value);\n        keys.push(coder.localName || null);\n    });\n\n    return Result.fromItems(values, keys);\n}\n\n/**\n *  @_ignore\n */\nexport class ArrayCoder extends Coder {\n    readonly coder!: Coder;\n    readonly length!: number;\n\n    constructor(coder: Coder, length: number, localName: string) {\n        const type = (coder.type + \"[\" + (length >= 0 ? length: \"\") + \"]\");\n        const dynamic = (length === -1 || coder.dynamic);\n        super(\"array\", type, localName, dynamic);\n        defineProperties<ArrayCoder>(this, { coder, length });\n    }\n\n    defaultValue(): Array<any> {\n        // Verifies the child coder is valid (even if the array is dynamic or 0-length)\n        const defaultChild = this.coder.defaultValue();\n\n        const result: Array<any> = [];\n        for (let i = 0; i < this.length; i++) {\n            result.push(defaultChild);\n        }\n        return result;\n    }\n\n    encode(writer: Writer, _value: Array<any> | Typed): number {\n        const value = Typed.dereference(_value, \"array\");\n\n        if(!Array.isArray(value)) {\n            this._throwError(\"expected array value\", value);\n        }\n\n        let count = this.length;\n\n        if (count === -1) {\n            count = value.length;\n            writer.writeValue(value.length);\n        }\n\n        assertArgumentCount(value.length, count, \"coder array\" + (this.localName? (\" \"+ this.localName): \"\"));\n\n        let coders: Array<Coder> = [ ];\n        for (let i = 0; i < value.length; i++) { coders.push(this.coder); }\n\n        return pack(writer, coders, value);\n    }\n\n    decode(reader: Reader): any {\n        let count = this.length;\n        if (count === -1) {\n            count = reader.readIndex();\n\n            // Check that there is *roughly* enough data to ensure\n            // stray random data is not being read as a length. Each\n            // slot requires at least 32 bytes for their value (or 32\n            // bytes as a link to the data). This could use a much\n            // tighter bound, but we are erroring on the side of safety.\n            assert(count * WordSize <= reader.dataLength, \"insufficient data length\",\n                \"BUFFER_OVERRUN\", { buffer: reader.bytes, offset: count * WordSize, length: reader.dataLength });\n        }\n        let coders: Array<Coder> = [];\n        for (let i = 0; i < count; i++) { coders.push(new AnonymousCoder(this.coder)); }\n\n        return unpack(reader, coders);\n    }\n}\n\n","import { Typed } from \"../typed.js\";\nimport { Coder } from \"./abstract-coder.js\";\n\nimport type { Reader, Writer } from \"./abstract-coder.js\";\n\n/**\n *  @_ignore\n */\nexport class BooleanCoder extends Coder {\n\n    constructor(localName: string) {\n        super(\"bool\", \"bool\", localName, false);\n    }\n\n    defaultValue(): boolean {\n        return false;\n    }\n\n    encode(writer: Writer, _value: boolean | Typed): number {\n        const value = Typed.dereference(_value, \"bool\");\n        return writer.writeValue(value ? 1: 0);\n    }\n\n    decode(reader: Reader): any {\n        return !!reader.readValue();\n    }\n}\n","import { getBytesCopy, hexlify } from \"../../utils/index.js\";\n\nimport { Coder } from \"./abstract-coder.js\";\n\nimport type { Reader, Writer } from \"./abstract-coder.js\";\n\n\n/**\n *  @_ignore\n */\nexport class DynamicBytesCoder extends Coder {\n    constructor(type: string, localName: string) {\n       super(type, type, localName, true);\n    }\n\n    defaultValue(): string {\n        return \"0x\";\n    }\n\n    encode(writer: Writer, value: any): number {\n        value = getBytesCopy(value);\n        let length = writer.writeValue(value.length);\n        length += writer.writeBytes(value);\n        return length;\n    }\n\n    decode(reader: Reader): any {\n        return reader.readBytes(reader.readIndex(), true);\n    }\n}\n\n/**\n *  @_ignore\n */\nexport class BytesCoder extends DynamicBytesCoder {\n    constructor(localName: string) {\n        super(\"bytes\", localName);\n    }\n\n    decode(reader: Reader): any {\n        return hexlify(super.decode(reader));\n    }\n}\n","\nimport { defineProperties, getBytesCopy, hexlify } from \"../../utils/index.js\";\n\nimport { Typed } from \"../typed.js\";\nimport { Coder } from \"./abstract-coder.js\";\n\nimport type { BytesLike } from \"../../utils/index.js\";\n\nimport type { Reader, Writer } from \"./abstract-coder.js\";\n\n\n/**\n *  @_ignore\n */\nexport class FixedBytesCoder extends Coder {\n    readonly size!: number;\n\n    constructor(size: number, localName: string) {\n        let name = \"bytes\" + String(size);\n        super(name, name, localName, false);\n        defineProperties<FixedBytesCoder>(this, { size }, { size: \"number\" });\n    }\n\n    defaultValue(): string {\n        return (\"0x0000000000000000000000000000000000000000000000000000000000000000\").substring(0, 2 + this.size * 2);\n    }\n\n    encode(writer: Writer, _value: BytesLike | Typed): number {\n        let data = getBytesCopy(Typed.dereference(_value, this.type));\n        if (data.length !== this.size) { this._throwError(\"incorrect data length\", _value); }\n        return writer.writeBytes(data);\n    }\n\n    decode(reader: Reader): any {\n        return hexlify(reader.readBytes(this.size));\n    }\n}\n","import { Coder } from \"./abstract-coder.js\";\nimport type { Reader, Writer } from \"./abstract-coder.js\";\n\nconst Empty = new Uint8Array([ ]);\n\n/**\n *  @_ignore\n */\nexport class NullCoder extends Coder {\n\n    constructor(localName: string) {\n        super(\"null\", \"\", localName, false);\n    }\n\n    defaultValue(): null {\n        return null;\n    }\n\n    encode(writer: Writer, value: any): number {\n        if (value != null) { this._throwError(\"not null\", value); }\n        return writer.writeBytes(Empty);\n    }\n\n    decode(reader: Reader): any {\n        reader.readBytes(0);\n        return null;\n    }\n}\n","import {\n    defineProperties, fromTwos, getBigInt, mask, toTwos\n} from \"../../utils/index.js\";\n\nimport { Typed } from \"../typed.js\";\nimport { Coder, WordSize } from \"./abstract-coder.js\";\n\nimport type { BigNumberish } from \"../../utils/index.js\";\n\nimport type { Reader, Writer } from \"./abstract-coder.js\";\n\n\nconst BN_0 = BigInt(0);\nconst BN_1 = BigInt(1);\nconst BN_MAX_UINT256 = BigInt(\"0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff\");\n\n/**\n *  @_ignore\n */\nexport class NumberCoder extends Coder {\n    readonly size!: number;\n    readonly signed!: boolean;\n\n    constructor(size: number, signed: boolean, localName: string) {\n        const name = ((signed ? \"int\": \"uint\") + (size * 8));\n        super(name, name, localName, false);\n\n        defineProperties<NumberCoder>(this, { size, signed }, { size: \"number\", signed: \"boolean\" });\n    }\n\n    defaultValue(): number {\n        return 0;\n    }\n\n    encode(writer: Writer, _value: BigNumberish | Typed): number {\n        let value = getBigInt(Typed.dereference(_value, this.type));\n\n        // Check bounds are safe for encoding\n        let maxUintValue = mask(BN_MAX_UINT256, WordSize * 8);\n        if (this.signed) {\n            let bounds = mask(maxUintValue, (this.size * 8) - 1);\n            if (value > bounds || value < -(bounds + BN_1)) {\n                this._throwError(\"value out-of-bounds\", _value);\n            }\n            value = toTwos(value, 8 * WordSize);\n        } else if (value < BN_0 || value > mask(maxUintValue, this.size * 8)) {\n            this._throwError(\"value out-of-bounds\", _value);\n        }\n\n        return writer.writeValue(value);\n    }\n\n    decode(reader: Reader): any {\n        let value = mask(reader.readValue(), this.size * 8);\n\n        if (this.signed) {\n            value = fromTwos(value, this.size * 8);\n        }\n\n        return value;\n    }\n}\n\n","import { toUtf8Bytes, toUtf8String } from \"../../utils/utf8.js\";\n\nimport { Typed } from \"../typed.js\";\nimport { DynamicBytesCoder } from \"./bytes.js\";\n\nimport type { Reader, Writer } from \"./abstract-coder.js\";\n\n\n/**\n *  @_ignore\n */\nexport class StringCoder extends DynamicBytesCoder {\n\n    constructor(localName: string) {\n        super(\"string\", localName);\n    }\n\n    defaultValue(): string {\n        return \"\";\n    }\n\n    encode(writer: Writer, _value: string | Typed): number {\n        return super.encode(writer, toUtf8Bytes(Typed.dereference(_value, \"string\")));\n    }\n\n    decode(reader: Reader): any {\n        return toUtf8String(super.decode(reader));\n    }\n}\n","import { defineProperties } from \"../../utils/properties.js\";\n\nimport { Typed } from \"../typed.js\";\nimport { Coder } from \"./abstract-coder.js\";\n\nimport { pack, unpack } from \"./array.js\";\n\nimport type { Reader, Writer } from \"./abstract-coder.js\";\n\n/**\n *  @_ignore\n */\nexport class TupleCoder extends Coder {\n    readonly coders!: ReadonlyArray<Coder>;\n\n    constructor(coders: Array<Coder>, localName: string) {\n        let dynamic = false;\n        const types: Array<string> = [];\n        coders.forEach((coder) => {\n            if (coder.dynamic) { dynamic = true; }\n            types.push(coder.type);\n        });\n        const type = (\"tuple(\" + types.join(\",\") + \")\");\n\n        super(\"tuple\", type, localName, dynamic);\n        defineProperties<TupleCoder>(this, { coders: Object.freeze(coders.slice()) });\n    }\n\n    defaultValue(): any {\n        const values: any = [ ];\n        this.coders.forEach((coder) => {\n            values.push(coder.defaultValue());\n        });\n\n        // We only output named properties for uniquely named coders\n        const uniqueNames = this.coders.reduce((accum, coder) => {\n            const name = coder.localName;\n            if (name) {\n                if (!accum[name]) { accum[name] = 0; }\n                accum[name]++;\n            }\n            return accum;\n        }, <{ [ name: string ]: number }>{ });\n\n        // Add named values\n        this.coders.forEach((coder: Coder, index: number) => {\n            let name = coder.localName;\n            if (!name || uniqueNames[name] !== 1) { return; }\n\n            if (name === \"length\") { name = \"_length\"; }\n\n            if (values[name] != null) { return; }\n\n            values[name] = values[index];\n        });\n\n        return Object.freeze(values);\n    }\n\n    encode(writer: Writer, _value: Array<any> | { [ name: string ]: any } | Typed): number {\n        const value = Typed.dereference(_value, \"tuple\");\n        return pack(writer, this.coders, value);\n    }\n\n    decode(reader: Reader): any {\n        return unpack(reader, this.coders);\n    }\n}\n\n","import { getAddress } from \"../address/index.js\";\nimport { assertArgument, isHexString } from \"../utils/index.js\";\n\nimport type { AccessList, AccessListish } from \"./index.js\";\n\n\nfunction accessSetify(addr: string, storageKeys: Array<string>): { address: string,storageKeys: Array<string> } {\n    return {\n        address: getAddress(addr),\n        storageKeys: storageKeys.map((storageKey, index) => {\n            assertArgument(isHexString(storageKey, 32), \"invalid slot\", `storageKeys[${ index }]`, storageKey);\n            return storageKey.toLowerCase();\n        })\n    };\n}\n\n/**\n *  Returns a [[AccessList]] from any ethers-supported access-list structure.\n */\nexport function accessListify(value: AccessListish): AccessList {\n    if (Array.isArray(value)) {\n        return (<Array<[ string, Array<string>] | { address: string, storageKeys: Array<string>}>>value).map((set, index) => {\n            if (Array.isArray(set)) {\n                assertArgument(set.length === 2, \"invalid slot set\", `value[${ index }]`, set);\n                return accessSetify(set[0], set[1])\n            }\n            assertArgument(set != null && typeof(set) === \"object\", \"invalid address-slot set\", \"value\", value);\n            return accessSetify(set.address, set.storageKeys);\n        });\n    }\n\n    assertArgument(value != null && typeof(value) === \"object\", \"invalid access list\", \"value\", value);\n\n    const result: Array<{ address: string, storageKeys: Array<string> }> = Object.keys(value).map((addr) => {\n        const storageKeys: Record<string, true> = value[addr].reduce((accum, storageKey) => {\n            accum[storageKey] = true;\n            return accum;\n        }, <Record<string, true>>{ });\n        return accessSetify(addr, Object.keys(storageKeys).sort())\n    });\n    result.sort((a, b) => (a.address.localeCompare(b.address)));\n    return result;\n}\n","import { keccak256 } from \"../crypto/index.js\";\nimport { toUtf8Bytes } from \"../utils/index.js\";\n\n/**\n *  A simple hashing function which operates on UTF-8 strings to\n *  compute an 32-byte identifier.\n *\n *  This simply computes the [UTF-8 bytes](toUtf8Bytes) and computes\n *  the [[keccak256]].\n *\n *  @example:\n *    id(\"hello world\")\n *    //_result:\n */\nexport function id(value: string): string {\n    return keccak256(toUtf8Bytes(value));\n}\n","/**\n *  A fragment is a single item from an ABI, which may represent any of:\n *\n *  - [Functions](FunctionFragment)\n *  - [Events](EventFragment)\n *  - [Constructors](ConstructorFragment)\n *  - Custom [Errors](ErrorFragment)\n *  - [Fallback or Receive](FallbackFragment) functions\n *\n *  @_subsection api/abi/abi-coder:Fragments  [about-fragments]\n */\n\nimport {\n    defineProperties, getBigInt, getNumber,\n    assert, assertPrivate, assertArgument\n} from \"../utils/index.js\";\nimport { id } from \"../hash/index.js\";\n\n/**\n *  A Type description in a [JSON ABI format](link-solc-jsonabi).\n */\nexport interface JsonFragmentType {\n    /**\n     *  The parameter name.\n     */\n    readonly name?: string;\n\n    /**\n     *  If the parameter is indexed.\n     */\n    readonly indexed?: boolean;\n\n    /**\n     *  The type of the parameter.\n     */\n    readonly type?: string;\n\n    /**\n     *  The internal Solidity type.\n     */\n    readonly internalType?: string;\n\n    /**\n     *  The components for a tuple.\n     */\n    readonly components?: ReadonlyArray<JsonFragmentType>;\n}\n\n/**\n *  A fragment for a method, event or error in a [JSON ABI format](link-solc-jsonabi).\n */\nexport interface JsonFragment {\n    /**\n     *  The name of the error, event, function, etc.\n     */\n    readonly name?: string;\n\n    /**\n     *  The type of the fragment (e.g. ``event``, ``\"function\"``, etc.)\n     */\n    readonly type?: string;\n\n    /**\n     *  If the event is anonymous.\n     */\n    readonly anonymous?: boolean;\n\n    /**\n     *  If the function is payable.\n     */\n    readonly payable?: boolean;\n\n    /**\n     *  If the function is constant.\n     */\n    readonly constant?: boolean;\n\n    /**\n     *  The mutability state of the function.\n     */\n    readonly stateMutability?: string;\n\n    /**\n     *  The input parameters.\n     */\n    readonly inputs?: ReadonlyArray<JsonFragmentType>;\n\n    /**\n     *  The output parameters.\n     */\n    readonly outputs?: ReadonlyArray<JsonFragmentType>;\n\n    /**\n     *  The gas limit to use when sending a transaction for this function.\n     */\n    readonly gas?: string;\n};\n\n/**\n *  The format to serialize the output as.\n *\n *  **``\"sighash\"``** - the bare formatting, used to compute the selector\n *  or topic hash; this format cannot be reversed (as it discards ``indexed``)\n *  so cannot by used to export an [[Interface]].\n *\n *  **``\"minimal\"``** - Human-Readable ABI with minimal spacing and without\n *  names, so it is compact, but will result in Result objects that cannot\n *  be accessed by name.\n *\n *  **``\"full\"``** - Full Human-Readable ABI, with readable spacing and names\n *  intact; this is generally the recommended format.\n *\n *  **``\"json\"``** - The [JSON ABI format](link-solc-jsonabi).\n */\nexport type FormatType = \"sighash\" | \"minimal\" | \"full\" | \"json\";\n\n// [ \"a\", \"b\" ] => { \"a\": 1, \"b\": 1 }\nfunction setify(items: Array<string>): ReadonlySet<string> {\n    const result: Set<string> = new Set();\n    items.forEach((k) => result.add(k));\n    return Object.freeze(result);\n}\n\nconst _kwVisibDeploy = \"external public payable override\";\nconst KwVisibDeploy = setify(_kwVisibDeploy.split(\" \"));\n\n// Visibility Keywords\nconst _kwVisib = \"constant external internal payable private public pure view override\";\nconst KwVisib = setify(_kwVisib.split(\" \"));\n\nconst _kwTypes = \"constructor error event fallback function receive struct\";\nconst KwTypes = setify(_kwTypes.split(\" \"));\n\nconst _kwModifiers = \"calldata memory storage payable indexed\";\nconst KwModifiers = setify(_kwModifiers.split(\" \"));\n\nconst _kwOther = \"tuple returns\";\n\n// All Keywords\nconst _keywords = [ _kwTypes, _kwModifiers, _kwOther, _kwVisib ].join(\" \");\nconst Keywords = setify(_keywords.split(\" \"));\n\n// Single character tokens\nconst SimpleTokens: Record<string, string> = {\n  \"(\": \"OPEN_PAREN\", \")\": \"CLOSE_PAREN\",\n  \"[\": \"OPEN_BRACKET\", \"]\": \"CLOSE_BRACKET\",\n  \",\": \"COMMA\", \"@\": \"AT\"\n};\n\n// Parser regexes to consume the next token\nconst regexWhitespacePrefix = new RegExp(\"^(\\\\s*)\");\nconst regexNumberPrefix = new RegExp(\"^([0-9]+)\");\nconst regexIdPrefix = new RegExp(\"^([a-zA-Z$_][a-zA-Z0-9$_]*)\");\n\n// Parser regexs to check validity\nconst regexId = new RegExp(\"^([a-zA-Z$_][a-zA-Z0-9$_]*)$\");\nconst regexType = new RegExp(\"^(address|bool|bytes([0-9]*)|string|u?int([0-9]*))$\");\n\n/**\n *  @ignore:\n */\ntype Token = Readonly<{\n    // Type of token (e.g. TYPE, KEYWORD, NUMBER, etc)\n    type: string;\n\n    // Offset into the original source code\n    offset: number;\n\n    // Actual text content of the token\n    text: string;\n\n    // The parenthesis depth\n    depth: number;\n\n    // If a parenthesis, the offset (in tokens) that balances it\n    match: number;\n\n    // For parenthesis and commas, the offset (in tokens) to the\n    // previous/next parenthesis or comma in the list\n    linkBack: number;\n    linkNext: number;\n\n    // If a BRACKET, the value inside\n    value: number;\n}>;\n\nclass TokenString {\n    #offset: number;\n    #tokens: ReadonlyArray<Token>;\n\n    get offset(): number { return this.#offset; }\n    get length(): number { return this.#tokens.length - this.#offset; }\n\n    constructor(tokens: ReadonlyArray<Token>) {\n        this.#offset = 0;\n        this.#tokens = tokens.slice();\n    }\n\n    clone(): TokenString { return new TokenString(this.#tokens); }\n    reset(): void { this.#offset = 0; }\n\n    #subTokenString(from: number = 0, to: number = 0): TokenString {\n        return new TokenString(this.#tokens.slice(from, to).map((t) => {\n            return Object.freeze(Object.assign({ }, t, {\n                match: (t.match - from),\n                linkBack: (t.linkBack - from),\n                linkNext: (t.linkNext - from),\n            }));\n        }));\n    }\n\n    // Pops and returns the value of the next token, if it is a keyword in allowed; throws if out of tokens\n    popKeyword(allowed: ReadonlySet<string>): string {\n        const top = this.peek();\n        if (top.type !== \"KEYWORD\" || !allowed.has(top.text)) { throw new Error(`expected keyword ${ top.text }`); }\n        return this.pop().text;\n    }\n\n    // Pops and returns the value of the next token if it is `type`; throws if out of tokens\n    popType(type: string): string {\n        if (this.peek().type !== type) {\n            const top = this.peek();\n            throw new Error(`expected ${ type }; got ${ top.type } ${ JSON.stringify(top.text) }`);\n        }\n        return this.pop().text;\n    }\n\n    // Pops and returns a \"(\" TOKENS \")\"\n    popParen(): TokenString {\n        const top = this.peek();\n        if (top.type !== \"OPEN_PAREN\") { throw new Error(\"bad start\"); }\n        const result = this.#subTokenString(this.#offset + 1, top.match + 1);\n        this.#offset = top.match + 1;\n        return result;\n    }\n\n    // Pops and returns the items within \"(\" ITEM1 \",\" ITEM2 \",\" ... \")\"\n    popParams(): Array<TokenString> {\n        const top = this.peek();\n\n        if (top.type !== \"OPEN_PAREN\") { throw new Error(\"bad start\"); }\n\n        const result: Array<TokenString> = [ ];\n\n        while(this.#offset < top.match - 1) {\n            const link = this.peek().linkNext;\n            result.push(this.#subTokenString(this.#offset + 1, link));\n            this.#offset = link;\n        }\n\n        this.#offset = top.match + 1;\n\n        return result;\n    }\n\n    // Returns the top Token, throwing if out of tokens\n    peek(): Token {\n        if (this.#offset >= this.#tokens.length) {\n            throw new Error(\"out-of-bounds\");\n        }\n        return this.#tokens[this.#offset];\n    }\n\n    // Returns the next value, if it is a keyword in `allowed`\n    peekKeyword(allowed: ReadonlySet<string>): null | string {\n        const top = this.peekType(\"KEYWORD\");\n        return (top != null && allowed.has(top)) ? top: null;\n    }\n\n    // Returns the value of the next token if it is `type`\n    peekType(type: string): null | string {\n        if (this.length === 0) { return null; }\n        const top = this.peek();\n        return (top.type === type) ? top.text: null;\n    }\n\n    // Returns the next token; throws if out of tokens\n    pop(): Token {\n        const result = this.peek();\n        this.#offset++;\n        return result;\n    }\n\n    toString(): string {\n        const tokens: Array<string> = [ ];\n        for (let i = this.#offset; i < this.#tokens.length; i++) {\n            const token = this.#tokens[i];\n            tokens.push(`${ token.type }:${ token.text }`);\n        }\n        return `<TokenString ${ tokens.join(\" \") }>`\n    }\n}\n\ntype Writeable<T> = { -readonly [P in keyof T]: T[P] };\n\nfunction lex(text: string): TokenString {\n    const tokens: Array<Token> = [ ];\n\n    const throwError = (message: string) => {\n        const token = (offset < text.length) ? JSON.stringify(text[offset]): \"$EOI\";\n        throw new Error(`invalid token ${ token } at ${ offset }: ${ message }`);\n    };\n\n    let brackets: Array<number> = [ ];\n    let commas: Array<number> = [ ];\n\n    let offset = 0;\n    while (offset < text.length) {\n\n        // Strip off any leading whitespace\n        let cur = text.substring(offset);\n        let match = cur.match(regexWhitespacePrefix);\n        if (match) {\n            offset += match[1].length;\n            cur = text.substring(offset);\n        }\n\n        const token = { depth: brackets.length, linkBack: -1, linkNext: -1, match: -1, type: \"\", text: \"\", offset, value: -1 };\n        tokens.push(token);\n\n        let type = (SimpleTokens[cur[0]] || \"\");\n        if (type) {\n            token.type = type;\n            token.text = cur[0];\n            offset++;\n\n            if (type === \"OPEN_PAREN\") {\n                brackets.push(tokens.length - 1);\n                commas.push(tokens.length - 1);\n\n            } else if (type == \"CLOSE_PAREN\") {\n                if (brackets.length === 0) { throwError(\"no matching open bracket\"); }\n\n                token.match = brackets.pop() as number;\n                (<Writeable<Token>>(tokens[token.match])).match = tokens.length - 1;\n                token.depth--;\n\n                token.linkBack = commas.pop() as number;\n                (<Writeable<Token>>(tokens[token.linkBack])).linkNext = tokens.length - 1;\n\n            } else if (type === \"COMMA\") {\n                token.linkBack = commas.pop() as number;\n                (<Writeable<Token>>(tokens[token.linkBack])).linkNext = tokens.length - 1;\n                commas.push(tokens.length - 1);\n\n            } else if (type === \"OPEN_BRACKET\") {\n                token.type = \"BRACKET\";\n\n            } else if (type === \"CLOSE_BRACKET\") {\n                // Remove the CLOSE_BRACKET\n                let suffix = (tokens.pop() as Token).text;\n                if (tokens.length > 0 && tokens[tokens.length - 1].type === \"NUMBER\") {\n                    const value = (tokens.pop() as Token).text;\n                    suffix = value + suffix;\n                    (<Writeable<Token>>(tokens[tokens.length - 1])).value = getNumber(value);\n                }\n                if (tokens.length === 0 || tokens[tokens.length - 1].type !== \"BRACKET\") {\n                    throw new Error(\"missing opening bracket\");\n                }\n                (<Writeable<Token>>(tokens[tokens.length - 1])).text += suffix;\n            }\n\n            continue;\n        }\n\n        match = cur.match(regexIdPrefix);\n        if (match) {\n            token.text = match[1];\n            offset += token.text.length;\n\n            if (Keywords.has(token.text)) {\n                token.type = \"KEYWORD\";\n                continue;\n            }\n\n            if (token.text.match(regexType)) {\n                token.type = \"TYPE\";\n                continue;\n            }\n\n            token.type = \"ID\";\n            continue;\n        }\n\n        match = cur.match(regexNumberPrefix);\n        if (match) {\n            token.text = match[1];\n            token.type = \"NUMBER\";\n            offset += token.text.length;\n            continue;\n        }\n\n        throw new Error(`unexpected token ${ JSON.stringify(cur[0]) } at position ${ offset }`);\n    }\n\n    return new TokenString(tokens.map((t) => Object.freeze(t)));\n}\n\n// Check only one of `allowed` is in `set`\nfunction allowSingle(set: ReadonlySet<string>, allowed: ReadonlySet<string>): void {\n    let included: Array<string> = [ ];\n    for (const key in allowed.keys()) {\n        if (set.has(key)) { included.push(key); }\n    }\n    if (included.length > 1) { throw new Error(`conflicting types: ${ included.join(\", \") }`); }\n}\n\n// Functions to process a Solidity Signature TokenString from left-to-right for...\n\n// ...the name with an optional type, returning the name\nfunction consumeName(type: string, tokens: TokenString): string {\n    if (tokens.peekKeyword(KwTypes)) {\n        const keyword = tokens.pop().text;\n        if (keyword !== type) {\n            throw new Error(`expected ${ type }, got ${ keyword }`);\n        }\n    }\n\n    return tokens.popType(\"ID\");\n}\n\n// ...all keywords matching allowed, returning the keywords\nfunction consumeKeywords(tokens: TokenString, allowed?: ReadonlySet<string>): ReadonlySet<string> {\n    const keywords: Set<string> = new Set();\n    while (true) {\n        const keyword = tokens.peekType(\"KEYWORD\");\n\n        if (keyword == null || (allowed && !allowed.has(keyword))) { break; }\n        tokens.pop();\n\n        if (keywords.has(keyword)) { throw new Error(`duplicate keywords: ${ JSON.stringify(keyword) }`); }\n        keywords.add(keyword);\n    }\n\n    return Object.freeze(keywords);\n}\n\n// ...all visibility keywords, returning the coalesced mutability\nfunction consumeMutability(tokens: TokenString): \"payable\" | \"nonpayable\" | \"view\" | \"pure\" {\n    let modifiers = consumeKeywords(tokens, KwVisib);\n\n    // Detect conflicting modifiers\n    allowSingle(modifiers, setify(\"constant payable nonpayable\".split(\" \")));\n    allowSingle(modifiers, setify(\"pure view payable nonpayable\".split(\" \")));\n\n    // Process mutability states\n    if (modifiers.has(\"view\")) { return \"view\"; }\n    if (modifiers.has(\"pure\")) { return \"pure\"; }\n    if (modifiers.has(\"payable\")) { return \"payable\"; }\n    if (modifiers.has(\"nonpayable\")) { return \"nonpayable\"; }\n\n    // Process legacy `constant` last\n    if (modifiers.has(\"constant\")) { return \"view\"; }\n\n    return \"nonpayable\";\n}\n\n// ...a parameter list, returning the ParamType list\nfunction consumeParams(tokens: TokenString, allowIndexed?: boolean): Array<ParamType> {\n    return tokens.popParams().map((t) => ParamType.from(t, allowIndexed));\n}\n\n// ...a gas limit, returning a BigNumber or null if none\nfunction consumeGas(tokens: TokenString): null | bigint {\n    if (tokens.peekType(\"AT\")) {\n        tokens.pop();\n        if (tokens.peekType(\"NUMBER\")) {\n            return getBigInt(tokens.pop().text);\n        }\n        throw new Error(\"invalid gas\");\n    }\n    return null;\n}\n\nfunction consumeEoi(tokens: TokenString): void {\n    if (tokens.length) {\n        throw new Error(`unexpected tokens at offset ${ tokens.offset }: ${ tokens.toString() }`);\n    }\n}\n\nconst regexArrayType = new RegExp(/^(.*)\\[([0-9]*)\\]$/);\n\nfunction verifyBasicType(type: string): string {\n    const match = type.match(regexType);\n    assertArgument(match, \"invalid type\", \"type\", type);\n    if (type === \"uint\") { return \"uint256\"; }\n    if (type === \"int\") { return \"int256\"; }\n\n    if (match[2]) {\n        // bytesXX\n        const length = parseInt(match[2]);\n        assertArgument(length !== 0 && length <= 32, \"invalid bytes length\", \"type\", type);\n\n    } else if (match[3]) {\n        // intXX or uintXX\n        const size = parseInt(match[3] as string);\n        assertArgument(size !== 0 && size <= 256 && (size % 8) === 0, \"invalid numeric width\", \"type\", type);\n    }\n\n    return type;\n}\n\n// Make the Fragment constructors effectively private\nconst _guard = { };\n\n\n/**\n *  When [walking](ParamType-walk) a [[ParamType]], this is called\n *  on each component.\n */\nexport type ParamTypeWalkFunc = (type: string, value: any) => any;\n\n/**\n *  When [walking asynchronously](ParamType-walkAsync) a [[ParamType]],\n *  this is called on each component.\n */\nexport type ParamTypeWalkAsyncFunc = (type: string, value: any) => any | Promise<any>;\n\nconst internal = Symbol.for(\"_ethers_internal\");\n\nconst ParamTypeInternal = \"_ParamTypeInternal\";\nconst ErrorFragmentInternal = \"_ErrorInternal\";\nconst EventFragmentInternal = \"_EventInternal\";\nconst ConstructorFragmentInternal = \"_ConstructorInternal\";\nconst FallbackFragmentInternal = \"_FallbackInternal\";\nconst FunctionFragmentInternal = \"_FunctionInternal\";\nconst StructFragmentInternal = \"_StructInternal\";\n\n/**\n *  Each input and output of a [[Fragment]] is an Array of **ParamType**.\n */\nexport class ParamType {\n\n    /**\n     *  The local name of the parameter (or ``\"\"`` if unbound)\n     */\n    readonly name!: string;\n\n    /**\n     *  The fully qualified type (e.g. ``\"address\"``, ``\"tuple(address)\"``,\n     *  ``\"uint256[3][]\"``)\n     */\n    readonly type!: string;\n\n    /**\n     *  The base type (e.g. ``\"address\"``, ``\"tuple\"``, ``\"array\"``)\n     */\n    readonly baseType!: string;\n\n    /**\n     *  True if the parameters is indexed.\n     *\n     *  For non-indexable types this is ``null``.\n     */\n    readonly indexed!: null | boolean;\n\n    /**\n     *  The components for the tuple.\n     *\n     *  For non-tuple types this is ``null``.\n     */\n    readonly components!: null | ReadonlyArray<ParamType>;\n\n    /**\n     *  The array length, or ``-1`` for dynamic-lengthed arrays.\n     *\n     *  For non-array types this is ``null``.\n     */\n    readonly arrayLength!: null | number;\n\n    /**\n     *  The type of each child in the array.\n     *\n     *  For non-array types this is ``null``.\n     */\n    readonly arrayChildren!: null | ParamType;\n\n\n    /**\n     *  @private\n     */\n    constructor(guard: any, name: string, type: string, baseType: string, indexed: null | boolean, components: null | ReadonlyArray<ParamType>, arrayLength: null | number, arrayChildren: null | ParamType) {\n        assertPrivate(guard, _guard, \"ParamType\");\n        Object.defineProperty(this, internal, { value: ParamTypeInternal });\n\n        if (components) { components = Object.freeze(components.slice()); }\n\n        if (baseType === \"array\") {\n            if (arrayLength == null || arrayChildren == null) {\n                throw new Error(\"\");\n            }\n        } else if (arrayLength != null || arrayChildren != null) {\n            throw new Error(\"\");\n        }\n\n        if (baseType === \"tuple\") {\n            if (components == null) { throw new Error(\"\"); }\n        } else if (components != null) {\n            throw new Error(\"\");\n        }\n\n        defineProperties<ParamType>(this, {\n            name, type, baseType, indexed, components, arrayLength, arrayChildren\n        });\n    }\n\n    /**\n     *  Return a string representation of this type.\n     *\n     *  For example,\n     *\n     *  ``sighash\" => \"(uint256,address)\"``\n     *\n     *  ``\"minimal\" => \"tuple(uint256,address) indexed\"``\n     *\n     *  ``\"full\" => \"tuple(uint256 foo, address bar) indexed baz\"``\n     */\n    format(format?: FormatType): string {\n        if (format == null) { format = \"sighash\"; }\n        if (format === \"json\") {\n            const name = this.name || \"\";\n\n            if (this.isArray()) {\n                const result = JSON.parse(this.arrayChildren.format(\"json\"));\n                result.name = name;\n                result.type += `[${ (this.arrayLength < 0 ? \"\": String(this.arrayLength)) }]`;\n                return JSON.stringify(result);\n            }\n\n            const result: any = {\n                type: ((this.baseType === \"tuple\") ? \"tuple\": this.type),\n                name\n            };\n\n\n            if (typeof(this.indexed) === \"boolean\") { result.indexed = this.indexed; }\n            if (this.isTuple()) {\n                result.components = this.components.map((c) => JSON.parse(c.format(format)));\n            }\n            return JSON.stringify(result);\n        }\n\n        let result = \"\";\n\n        // Array\n        if (this.isArray()) {\n            result += this.arrayChildren.format(format);\n            result += `[${ (this.arrayLength < 0 ? \"\": String(this.arrayLength)) }]`;\n        } else {\n            if (this.isTuple()) {\n                result += \"(\" + this.components.map(\n                    (comp) => comp.format(format)\n                ).join((format === \"full\") ? \", \": \",\") + \")\";\n            } else {\n                result += this.type;\n            }\n        }\n\n        if (format !== \"sighash\") {\n            if (this.indexed === true) { result += \" indexed\"; }\n            if (format === \"full\" && this.name) {\n                result += \" \" + this.name;\n            }\n        }\n\n        return result;\n    }\n\n    /**\n     *  Returns true if %%this%% is an Array type.\n     *\n     *  This provides a type gaurd ensuring that [[arrayChildren]]\n     *  and [[arrayLength]] are non-null.\n     */\n    isArray(): this is (ParamType & { arrayChildren: ParamType, arrayLength: number }) {\n        return (this.baseType === \"array\")\n    }\n\n    /**\n     *  Returns true if %%this%% is a Tuple type.\n     *\n     *  This provides a type gaurd ensuring that [[components]]\n     *  is non-null.\n     */\n    isTuple(): this is (ParamType & { components: ReadonlyArray<ParamType> }) {\n        return (this.baseType === \"tuple\");\n    }\n\n    /**\n     *  Returns true if %%this%% is an Indexable type.\n     *\n     *  This provides a type gaurd ensuring that [[indexed]]\n     *  is non-null.\n     */\n    isIndexable(): this is (ParamType & { indexed: boolean }) {\n        return (this.indexed != null);\n    }\n\n    /**\n     *  Walks the **ParamType** with %%value%%, calling %%process%%\n     *  on each type, destructing the %%value%% recursively.\n     */\n    walk(value: any, process: ParamTypeWalkFunc): any {\n        if (this.isArray()) {\n            if (!Array.isArray(value)) { throw new Error(\"invalid array value\"); }\n            if (this.arrayLength !== -1 && value.length !== this.arrayLength) {\n                throw new Error(\"array is wrong length\");\n            }\n            const _this = this;\n            return value.map((v) => (_this.arrayChildren.walk(v, process)));\n        }\n\n        if (this.isTuple()) {\n            if (!Array.isArray(value)) { throw new Error(\"invalid tuple value\"); }\n            if (value.length !== this.components.length) {\n                throw new Error(\"array is wrong length\");\n            }\n            const _this = this;\n            return value.map((v, i) => (_this.components[i].walk(v, process)));\n        }\n\n        return process(this.type, value);\n    }\n\n    #walkAsync(promises: Array<Promise<void>>, value: any, process: ParamTypeWalkAsyncFunc, setValue: (value: any) => void): void {\n\n        if (this.isArray()) {\n            if (!Array.isArray(value)) { throw new Error(\"invalid array value\"); }\n            if (this.arrayLength !== -1 && value.length !== this.arrayLength) {\n                throw new Error(\"array is wrong length\");\n            }\n            const childType = this.arrayChildren;\n\n            const result = value.slice();\n            result.forEach((value, index) => {\n                childType.#walkAsync(promises, value, process, (value: any) => {\n                    result[index] = value;\n                });\n            });\n            setValue(result);\n            return;\n        }\n\n        if (this.isTuple()) {\n            const components = this.components;\n\n            // Convert the object into an array\n            let result: Array<any>;\n            if (Array.isArray(value)) {\n                result = value.slice();\n\n            } else {\n                if (value == null || typeof(value) !== \"object\") {\n                    throw new Error(\"invalid tuple value\");\n                }\n\n                result = components.map((param) => {\n                    if (!param.name) { throw new Error(\"cannot use object value with unnamed components\"); }\n                    if (!(param.name in value)) {\n                        throw new Error(`missing value for component ${ param.name }`);\n                    }\n                    return value[param.name];\n                });\n            }\n\n            if (result.length !== this.components.length) {\n                throw new Error(\"array is wrong length\");\n            }\n\n            result.forEach((value, index) => {\n                components[index].#walkAsync(promises, value, process, (value: any) => {\n                    result[index] = value;\n                });\n            });\n            setValue(result);\n            return;\n        }\n\n        const result = process(this.type, value);\n        if (result.then) {\n            promises.push((async function() { setValue(await result); })());\n        } else {\n            setValue(result);\n        }\n    }\n\n    /**\n     *  Walks the **ParamType** with %%value%%, asynchronously calling\n     *  %%process%% on each type, destructing the %%value%% recursively.\n     *\n     *  This can be used to resolve ENS names by walking and resolving each\n     *  ``\"address\"`` type.\n     */\n    async walkAsync(value: any, process: ParamTypeWalkAsyncFunc): Promise<any> {\n        const promises: Array<Promise<void>> = [ ];\n        const result: [ any ] = [ value ];\n        this.#walkAsync(promises, value, process, (value: any) => {\n            result[0] = value;\n        });\n        if (promises.length) { await Promise.all(promises); }\n        return result[0];\n    }\n\n    /**\n     *  Creates a new **ParamType** for %%obj%%.\n     *\n     *  If %%allowIndexed%% then the ``indexed`` keyword is permitted,\n     *  otherwise the ``indexed`` keyword will throw an error.\n     */\n    static from(obj: any, allowIndexed?: boolean): ParamType {\n        if (ParamType.isParamType(obj)) { return obj; }\n\n        if (typeof(obj) === \"string\") {\n            try {\n                return ParamType.from(lex(obj), allowIndexed);\n            } catch (error) {\n                assertArgument(false, \"invalid param type\", \"obj\", obj);\n            }\n\n        } else if (obj instanceof TokenString) {\n            let type = \"\", baseType = \"\";\n            let comps: null | Array<ParamType> = null;\n\n            if (consumeKeywords(obj, setify([ \"tuple\" ])).has(\"tuple\") || obj.peekType(\"OPEN_PAREN\")) {\n                // Tuple\n                baseType = \"tuple\";\n                comps = obj.popParams().map((t) => ParamType.from(t));\n                type = `tuple(${ comps.map((c) => c.format()).join(\",\") })`;\n            } else {\n                // Normal\n                type = verifyBasicType(obj.popType(\"TYPE\"));\n                baseType = type;\n            }\n\n            // Check for Array\n            let arrayChildren: null | ParamType  = null;\n            let arrayLength: null | number = null;\n\n            while (obj.length && obj.peekType(\"BRACKET\")) {\n                const bracket = obj.pop(); //arrays[i];\n                arrayChildren = new ParamType(_guard, \"\", type, baseType, null, comps, arrayLength, arrayChildren);\n                arrayLength = bracket.value;\n                type += bracket.text;\n                baseType = \"array\";\n                comps = null;\n            }\n\n            let indexed: null | boolean = null;\n            const keywords = consumeKeywords(obj, KwModifiers);\n            if (keywords.has(\"indexed\")) {\n                if (!allowIndexed) { throw new Error(\"\"); }\n                indexed = true;\n            }\n\n            const name = (obj.peekType(\"ID\") ? obj.pop().text: \"\");\n\n            if (obj.length) { throw new Error(\"leftover tokens\"); }\n\n            return new ParamType(_guard, name, type, baseType, indexed, comps, arrayLength, arrayChildren);\n        }\n\n        const name = obj.name;\n        assertArgument(!name || (typeof(name) === \"string\" && name.match(regexId)),\n            \"invalid name\", \"obj.name\", name);\n\n        let indexed = obj.indexed;\n        if (indexed != null) {\n            assertArgument(allowIndexed, \"parameter cannot be indexed\", \"obj.indexed\", obj.indexed);\n            indexed = !!indexed;\n        }\n\n        let type = obj.type;\n\n        let arrayMatch = type.match(regexArrayType);\n        if (arrayMatch) {\n            const arrayLength = parseInt(arrayMatch[2] || \"-1\");\n            const arrayChildren = ParamType.from({\n                type: arrayMatch[1],\n                components: obj.components\n            });\n\n            return new ParamType(_guard, name || \"\", type, \"array\", indexed, null, arrayLength, arrayChildren);\n        }\n\n        if (type === \"tuple\" || type.startsWith(\"tuple(\"/* fix: ) */) || type.startsWith(\"(\" /* fix: ) */)) {\n            const comps = (obj.components != null) ? obj.components.map((c: any) => ParamType.from(c)): null;\n            const tuple = new ParamType(_guard, name || \"\", type, \"tuple\", indexed, comps, null, null);\n            // @TODO: use lexer to validate and normalize type\n            return tuple;\n        }\n\n        type = verifyBasicType(obj.type);\n\n        return new ParamType(_guard, name || \"\", type, type, indexed, null, null, null);\n    }\n\n    /**\n     *  Returns true if %%value%% is a **ParamType**.\n     */\n    static isParamType(value: any): value is ParamType {\n        return (value && value[internal] === ParamTypeInternal);\n    }\n}\n\n/**\n *  The type of a [[Fragment]].\n */\nexport type FragmentType = \"constructor\" | \"error\" | \"event\" | \"fallback\" | \"function\" | \"struct\";\n\n/**\n *  An abstract class to represent An individual fragment from a parse ABI.\n */\nexport abstract class Fragment {\n    /**\n     *  The type of the fragment.\n     */\n    readonly type!: FragmentType;\n\n    /**\n     *  The inputs for the fragment.\n     */\n    readonly inputs!: ReadonlyArray<ParamType>;\n\n    /**\n     *  @private\n     */\n    constructor(guard: any, type: FragmentType, inputs: ReadonlyArray<ParamType>) {\n        assertPrivate(guard, _guard, \"Fragment\");\n        inputs = Object.freeze(inputs.slice());\n        defineProperties<Fragment>(this, { type, inputs });\n    }\n\n    /**\n     *  Returns a string representation of this fragment as %%format%%.\n     */\n    abstract format(format?: FormatType): string;\n\n    /**\n     *  Creates a new **Fragment** for %%obj%%, wich can be any supported\n     *  ABI frgament type.\n     */\n    static from(obj: any): Fragment {\n        if (typeof(obj) === \"string\") {\n\n            // Try parsing JSON...\n            try {\n                Fragment.from(JSON.parse(obj));\n            } catch (e) { }\n\n            // ...otherwise, use the human-readable lexer\n            return Fragment.from(lex(obj));\n        }\n\n        if (obj instanceof TokenString) {\n            // Human-readable ABI (already lexed)\n\n            const type = obj.peekKeyword(KwTypes);\n\n            switch (type) {\n                case \"constructor\": return ConstructorFragment.from(obj);\n                case \"error\": return ErrorFragment.from(obj);\n                case \"event\": return EventFragment.from(obj);\n                case \"fallback\": case \"receive\":\n                    return FallbackFragment.from(obj);\n                case \"function\": return FunctionFragment.from(obj);\n                case \"struct\": return StructFragment.from(obj);\n            }\n\n        } else if (typeof(obj) === \"object\") {\n            // JSON ABI\n\n            switch (obj.type) {\n                case \"constructor\": return ConstructorFragment.from(obj);\n                case \"error\": return ErrorFragment.from(obj);\n                case \"event\": return EventFragment.from(obj);\n                case \"fallback\": case \"receive\":\n                    return FallbackFragment.from(obj);\n                case \"function\": return FunctionFragment.from(obj);\n                case \"struct\": return StructFragment.from(obj);\n            }\n\n            assert(false, `unsupported type: ${ obj.type }`, \"UNSUPPORTED_OPERATION\", {\n                operation: \"Fragment.from\"\n            });\n        }\n\n        assertArgument(false, \"unsupported frgament object\", \"obj\", obj);\n    }\n\n    /**\n     *  Returns true if %%value%% is a [[ConstructorFragment]].\n     */\n    static isConstructor(value: any): value is ConstructorFragment {\n        return ConstructorFragment.isFragment(value);\n    }\n\n    /**\n     *  Returns true if %%value%% is an [[ErrorFragment]].\n     */\n    static isError(value: any): value is ErrorFragment {\n        return ErrorFragment.isFragment(value);\n    }\n\n    /**\n     *  Returns true if %%value%% is an [[EventFragment]].\n     */\n    static isEvent(value: any): value is EventFragment {\n        return EventFragment.isFragment(value);\n    }\n\n    /**\n     *  Returns true if %%value%% is a [[FunctionFragment]].\n     */\n    static isFunction(value: any): value is FunctionFragment {\n        return FunctionFragment.isFragment(value);\n    }\n\n    /**\n     *  Returns true if %%value%% is a [[StructFragment]].\n     */\n    static isStruct(value: any): value is StructFragment {\n        return StructFragment.isFragment(value);\n    }\n}\n\n/**\n *  An abstract class to represent An individual fragment\n *  which has a name from a parse ABI.\n */\nexport abstract class NamedFragment extends Fragment {\n    /**\n     *  The name of the fragment.\n     */\n    readonly name!: string;\n\n    /**\n     *  @private\n     */\n    constructor(guard: any, type: FragmentType, name: string, inputs: ReadonlyArray<ParamType>) {\n        super(guard, type, inputs);\n        assertArgument(typeof(name) === \"string\" && name.match(regexId),\n            \"invalid identifier\", \"name\", name);\n        inputs = Object.freeze(inputs.slice());\n        defineProperties<NamedFragment>(this, { name });\n    }\n}\n\nfunction joinParams(format: FormatType, params: ReadonlyArray<ParamType>): string { \n    return \"(\" + params.map((p) => p.format(format)).join((format === \"full\") ? \", \": \",\") + \")\";\n}\n\n/**\n *  A Fragment which represents a //Custom Error//.\n */\nexport class ErrorFragment extends NamedFragment {\n    /**\n     *  @private\n     */\n    constructor(guard: any, name: string, inputs: ReadonlyArray<ParamType>) {\n        super(guard, \"error\", name, inputs);\n        Object.defineProperty(this, internal, { value: ErrorFragmentInternal });\n    }\n\n    /**\n     *  The Custom Error selector.\n     */\n    get selector(): string {\n        return id(this.format(\"sighash\")).substring(0, 10);\n    }\n\n    /**\n     *  Returns a string representation of this fragment as %%format%%.\n     */\n    format(format?: FormatType): string {\n        if (format == null) { format = \"sighash\"; }\n        if (format === \"json\") {\n            return JSON.stringify({\n                type: \"error\",\n                name: this.name,\n                inputs: this.inputs.map((input) => JSON.parse(input.format(format))),\n            });\n        }\n\n        const result: Array<string> = [ ];\n        if (format !== \"sighash\") { result.push(\"error\"); }\n        result.push(this.name + joinParams(format, this.inputs));\n        return result.join(\" \");\n    }\n\n    /**\n     *  Returns a new **ErrorFragment** for %%obj%%.\n     */\n    static from(obj: any): ErrorFragment {\n        if (ErrorFragment.isFragment(obj)) { return obj; }\n\n        if (typeof(obj) === \"string\") {\n            return ErrorFragment.from(lex(obj));\n\n        } else if (obj instanceof TokenString) {\n            const name = consumeName(\"error\", obj);\n            const inputs = consumeParams(obj);\n            consumeEoi(obj);\n\n            return new ErrorFragment(_guard, name, inputs);\n        }\n\n        return new ErrorFragment(_guard, obj.name,\n            obj.inputs ? obj.inputs.map(ParamType.from): [ ]);\n    }\n\n    /**\n     *  Returns ``true`` and provides a type guard if %%value%% is an\n     *  **ErrorFragment**.\n     */\n    static isFragment(value: any): value is ErrorFragment {\n        return (value && value[internal] === ErrorFragmentInternal);\n    }\n}\n\n/**\n *  A Fragment which represents an Event.\n */\nexport class EventFragment extends NamedFragment {\n    /**\n     *  Whether this event is anonymous.\n     */\n    readonly anonymous!: boolean;\n\n    /**\n     *  @private\n     */\n    constructor(guard: any, name: string, inputs: ReadonlyArray<ParamType>, anonymous: boolean) {\n        super(guard, \"event\", name, inputs);\n        Object.defineProperty(this, internal, { value: EventFragmentInternal });\n        defineProperties<EventFragment>(this, { anonymous });\n    }\n\n    /**\n     *  The Event topic hash.\n     */\n    get topicHash(): string {\n        return id(this.format(\"sighash\"));\n    }\n\n    /**\n     *  Returns a string representation of this event as %%format%%.\n     */\n    format(format?: FormatType): string {\n        if (format == null) { format = \"sighash\"; }\n        if (format === \"json\") {\n            return JSON.stringify({\n                type: \"event\",\n                anonymous: this.anonymous,\n                name: this.name,\n                inputs: this.inputs.map((i) => JSON.parse(i.format(format)))\n            });\n        }\n\n        const result: Array<string> = [ ];\n        if (format !== \"sighash\") { result.push(\"event\"); }\n        result.push(this.name + joinParams(format, this.inputs));\n        if (format !== \"sighash\" && this.anonymous) { result.push(\"anonymous\"); }\n        return result.join(\" \");\n    }\n\n    /**\n     *  Return the topic hash for an event with %%name%% and %%params%%.\n     */\n    static getTopicHash(name: string, params?: Array<any>): string {\n        params = (params || []).map((p) => ParamType.from(p));\n        const fragment = new EventFragment(_guard, name, params, false);\n        return fragment.topicHash;\n    }\n\n    /**\n     *  Returns a new **EventFragment** for %%obj%%.\n     */\n    static from(obj: any): EventFragment {\n        if (EventFragment.isFragment(obj)) { return obj; }\n\n        if (typeof(obj) === \"string\") {\n            try {\n                return EventFragment.from(lex(obj));\n            } catch (error) {\n                assertArgument(false, \"invalid event fragment\", \"obj\", obj);\n            }\n\n        } else if (obj instanceof TokenString) {\n            const name = consumeName(\"event\", obj);\n            const inputs = consumeParams(obj, true);\n            const anonymous = !!consumeKeywords(obj, setify([ \"anonymous\" ])).has(\"anonymous\");\n            consumeEoi(obj);\n\n            return new EventFragment(_guard, name, inputs, anonymous);\n        }\n\n        return new EventFragment(_guard, obj.name,\n            obj.inputs ? obj.inputs.map((p: any) => ParamType.from(p, true)): [ ], !!obj.anonymous);\n    }\n\n    /**\n     *  Returns ``true`` and provides a type guard if %%value%% is an\n     *  **EventFragment**.\n     */\n    static isFragment(value: any): value is EventFragment {\n        return (value && value[internal] === EventFragmentInternal);\n    }\n}\n\n/**\n *  A Fragment which represents a constructor.\n */\nexport class ConstructorFragment extends Fragment {\n\n    /**\n     *  Whether the constructor can receive an endowment.\n     */\n    readonly payable!: boolean;\n\n    /**\n     *  The recommended gas limit for deployment or ``null``.\n     */\n    readonly gas!: null | bigint;\n\n    /**\n     *  @private\n     */\n    constructor(guard: any, type: FragmentType, inputs: ReadonlyArray<ParamType>, payable: boolean, gas: null | bigint) {\n        super(guard, type, inputs);\n        Object.defineProperty(this, internal, { value: ConstructorFragmentInternal });\n        defineProperties<ConstructorFragment>(this, { payable, gas });\n    }\n\n    /**\n     *  Returns a string representation of this constructor as %%format%%.\n     */\n    format(format?: FormatType): string {\n        assert(format != null && format !== \"sighash\", \"cannot format a constructor for sighash\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"format(sighash)\" });\n\n        if (format === \"json\") {\n            return JSON.stringify({\n                type: \"constructor\",\n                stateMutability: (this.payable ? \"payable\": \"undefined\"),\n                payable: this.payable,\n                gas: ((this.gas != null) ? this.gas: undefined),\n                inputs: this.inputs.map((i) => JSON.parse(i.format(format)))\n            });\n        }\n\n        const result = [ `constructor${ joinParams(format, this.inputs) }` ];\n        if (this.payable) { result.push(\"payable\"); }\n        if (this.gas != null) { result.push(`@${ this.gas.toString() }`); }\n        return result.join(\" \");\n    }\n\n    /**\n     *  Returns a new **ConstructorFragment** for %%obj%%.\n     */\n    static from(obj: any): ConstructorFragment {\n        if (ConstructorFragment.isFragment(obj)) { return obj; }\n\n        if (typeof(obj) === \"string\") {\n            try {\n                return ConstructorFragment.from(lex(obj));\n            } catch (error) {\n                assertArgument(false, \"invalid constuctor fragment\", \"obj\", obj);\n            }\n\n        } else if (obj instanceof TokenString) {\n            consumeKeywords(obj, setify([ \"constructor\" ]));\n            const inputs = consumeParams(obj);\n            const payable = !!consumeKeywords(obj, KwVisibDeploy).has(\"payable\");\n            const gas = consumeGas(obj);\n            consumeEoi(obj);\n\n            return new ConstructorFragment(_guard, \"constructor\", inputs, payable, gas);\n        }\n\n        return new ConstructorFragment(_guard, \"constructor\",\n            obj.inputs ? obj.inputs.map(ParamType.from): [ ],\n            !!obj.payable, (obj.gas != null) ? obj.gas: null);\n    }\n\n    /**\n     *  Returns ``true`` and provides a type guard if %%value%% is a\n     *  **ConstructorFragment**.\n     */\n    static isFragment(value: any): value is ConstructorFragment {\n        return (value && value[internal] === ConstructorFragmentInternal);\n    }\n}\n\n/**\n *  A Fragment which represents a method.\n */\nexport class FallbackFragment extends Fragment {\n\n    /**\n     *  If the function can be sent value during invocation.\n     */\n    readonly payable!: boolean;\n\n    constructor(guard: any, inputs: ReadonlyArray<ParamType>, payable: boolean) {\n        super(guard, \"fallback\", inputs);\n        Object.defineProperty(this, internal, { value: FallbackFragmentInternal });\n        defineProperties<FallbackFragment>(this, { payable });\n    }\n\n    /**\n     *  Returns a string representation of this fallback as %%format%%.\n     */\n    format(format?: FormatType): string {\n        const type = ((this.inputs.length === 0) ? \"receive\": \"fallback\");\n\n        if (format === \"json\") {\n            const stateMutability = (this.payable ? \"payable\": \"nonpayable\");\n            return JSON.stringify({ type, stateMutability });\n        }\n\n        return `${ type }()${ this.payable ? \" payable\": \"\" }`;\n    }\n\n    /**\n     *  Returns a new **FallbackFragment** for %%obj%%.\n     */\n    static from(obj: any): FallbackFragment {\n        if (FallbackFragment.isFragment(obj)) { return obj; }\n\n        if (typeof(obj) === \"string\") {\n            try {\n                return FallbackFragment.from(lex(obj));\n            } catch (error) {\n                assertArgument(false, \"invalid fallback fragment\", \"obj\", obj);\n            }\n\n        } else if (obj instanceof TokenString) {\n            const errorObj = obj.toString();\n\n            const topIsValid = obj.peekKeyword(setify([ \"fallback\", \"receive\" ]));\n            assertArgument(topIsValid, \"type must be fallback or receive\", \"obj\", errorObj);\n\n            const type = obj.popKeyword(setify([ \"fallback\", \"receive\" ]));\n\n            // receive()\n            if (type === \"receive\") {\n                const inputs = consumeParams(obj);\n                assertArgument(inputs.length === 0, `receive cannot have arguments`, \"obj.inputs\", inputs);\n                consumeKeywords(obj, setify([ \"payable\" ]));\n                consumeEoi(obj);\n                return new FallbackFragment(_guard, [ ], true);\n            }\n\n            // fallback() [payable]\n            // fallback(bytes) [payable] returns (bytes)\n            let inputs = consumeParams(obj);\n            if (inputs.length) {\n                assertArgument(inputs.length === 1 && inputs[0].type === \"bytes\",\n                    \"invalid fallback inputs\", \"obj.inputs\",\n                    inputs.map((i) => i.format(\"minimal\")).join(\", \"));\n            } else {\n                inputs = [ ParamType.from(\"bytes\") ];\n            }\n\n            const mutability = consumeMutability(obj);\n            assertArgument(mutability === \"nonpayable\" || mutability === \"payable\", \"fallback cannot be constants\", \"obj.stateMutability\", mutability);\n\n            if (consumeKeywords(obj, setify([ \"returns\" ])).has(\"returns\")) {\n                const outputs = consumeParams(obj);\n                assertArgument(outputs.length === 1 && outputs[0].type === \"bytes\",\n                    \"invalid fallback outputs\", \"obj.outputs\",\n                    outputs.map((i) => i.format(\"minimal\")).join(\", \"));\n            }\n\n            consumeEoi(obj);\n\n            return new FallbackFragment(_guard, inputs, mutability === \"payable\");\n        }\n\n        if (obj.type === \"receive\") {\n            return new FallbackFragment(_guard, [ ], true);\n        }\n\n        if (obj.type === \"fallback\") {\n            const inputs = [ ParamType.from(\"bytes\") ];\n            const payable = (obj.stateMutability === \"payable\");\n            return new FallbackFragment(_guard, inputs, payable);\n        }\n\n        assertArgument(false, \"invalid fallback description\", \"obj\", obj);\n    }\n\n    /**\n     *  Returns ``true`` and provides a type guard if %%value%% is a\n     *  **FallbackFragment**.\n     */\n    static isFragment(value: any): value is FallbackFragment {\n        return (value && value[internal] === FallbackFragmentInternal);\n    }\n}\n\n\n/**\n *  A Fragment which represents a method.\n */\nexport class FunctionFragment extends NamedFragment {\n    /**\n     *  If the function is constant (e.g. ``pure`` or ``view`` functions).\n     */\n    readonly constant!: boolean;\n\n    /**\n     *  The returned types for the result of calling this function.\n     */\n    readonly outputs!: ReadonlyArray<ParamType>;\n\n    /**\n     *  The state mutability (e.g. ``payable``, ``nonpayable``, ``view``\n     *  or ``pure``)\n     */\n    readonly stateMutability!: \"payable\" | \"nonpayable\" | \"view\" | \"pure\";\n\n    /**\n     *  If the function can be sent value during invocation.\n     */\n    readonly payable!: boolean;\n\n    /**\n     *  The recommended gas limit to send when calling this function.\n     */\n    readonly gas!: null | bigint;\n\n    /**\n     *  @private\n     */\n    constructor(guard: any, name: string, stateMutability: \"payable\" | \"nonpayable\" | \"view\" | \"pure\", inputs: ReadonlyArray<ParamType>, outputs: ReadonlyArray<ParamType>, gas: null | bigint) {\n        super(guard, \"function\", name, inputs);\n        Object.defineProperty(this, internal, { value: FunctionFragmentInternal });\n        outputs = Object.freeze(outputs.slice());\n        const constant = (stateMutability === \"view\" || stateMutability === \"pure\");\n        const payable = (stateMutability === \"payable\");\n        defineProperties<FunctionFragment>(this, { constant, gas, outputs, payable, stateMutability });\n    }\n\n    /**\n     *  The Function selector.\n     */\n    get selector(): string {\n        return id(this.format(\"sighash\")).substring(0, 10);\n    }\n\n    /**\n     *  Returns a string representation of this function as %%format%%.\n     */\n    format(format?: FormatType): string {\n        if (format == null) { format = \"sighash\"; }\n        if (format === \"json\") {\n            return JSON.stringify({\n                type: \"function\",\n                name: this.name,\n                constant: this.constant,\n                stateMutability: ((this.stateMutability !== \"nonpayable\") ? this.stateMutability: undefined),\n                payable: this.payable,\n                gas: ((this.gas != null) ? this.gas: undefined),\n                inputs: this.inputs.map((i) => JSON.parse(i.format(format))),\n                outputs: this.outputs.map((o) => JSON.parse(o.format(format))),\n            });\n        }\n\n        const result: Array<string> = [];\n\n        if (format !== \"sighash\") { result.push(\"function\"); }\n\n        result.push(this.name + joinParams(format, this.inputs));\n\n        if (format !== \"sighash\") {\n            if (this.stateMutability !== \"nonpayable\") {\n                result.push(this.stateMutability);\n            }\n\n            if (this.outputs && this.outputs.length) {\n                result.push(\"returns\");\n                result.push(joinParams(format, this.outputs));\n            }\n\n            if (this.gas != null) { result.push(`@${ this.gas.toString() }`); }\n        }\n        return result.join(\" \");\n    }\n\n    /**\n     *  Return the selector for a function with %%name%% and %%params%%.\n     */\n    static getSelector(name: string, params?: Array<any>): string {\n        params = (params || []).map((p) => ParamType.from(p));\n        const fragment = new FunctionFragment(_guard, name, \"view\", params, [ ], null);\n        return fragment.selector;\n    }\n\n    /**\n     *  Returns a new **FunctionFragment** for %%obj%%.\n     */\n    static from(obj: any): FunctionFragment {\n        if (FunctionFragment.isFragment(obj)) { return obj; }\n\n        if (typeof(obj) === \"string\") {\n            try {\n                return FunctionFragment.from(lex(obj));\n            } catch (error) {\n                assertArgument(false, \"invalid function fragment\", \"obj\", obj);\n            }\n\n        } else if (obj instanceof TokenString) {\n            const name = consumeName(\"function\", obj);\n            const inputs = consumeParams(obj);\n            const mutability = consumeMutability(obj);\n\n            let outputs: Array<ParamType> = [ ];\n            if (consumeKeywords(obj, setify([ \"returns\" ])).has(\"returns\")) {\n                outputs = consumeParams(obj);\n            }\n\n            const gas = consumeGas(obj);\n\n            consumeEoi(obj);\n\n            return new FunctionFragment(_guard, name, mutability, inputs, outputs, gas);\n        }\n\n        let stateMutability = obj.stateMutability;\n\n        // Use legacy Solidity ABI logic if stateMutability is missing\n        if (stateMutability == null) {\n            stateMutability = \"payable\";\n\n            if (typeof(obj.constant) === \"boolean\") {\n                stateMutability = \"view\";\n                if (!obj.constant) {\n                    stateMutability = \"payable\"\n                    if (typeof(obj.payable) === \"boolean\" && !obj.payable) {\n                        stateMutability = \"nonpayable\";\n                    }\n                }\n            } else if (typeof(obj.payable) === \"boolean\" && !obj.payable) {\n                stateMutability = \"nonpayable\";\n            }\n        }\n\n        // @TODO: verifyState for stateMutability (e.g. throw if\n        //        payable: false but stateMutability is \"nonpayable\")\n\n        return new FunctionFragment(_guard, obj.name, stateMutability,\n             obj.inputs ? obj.inputs.map(ParamType.from): [ ],\n             obj.outputs ? obj.outputs.map(ParamType.from): [ ],\n             (obj.gas != null) ? obj.gas: null);\n    }\n\n    /**\n     *  Returns ``true`` and provides a type guard if %%value%% is a\n     *  **FunctionFragment**.\n     */\n    static isFragment(value: any): value is FunctionFragment {\n        return (value && value[internal] === FunctionFragmentInternal);\n    }\n}\n\n/**\n *  A Fragment which represents a structure.\n */\nexport class StructFragment extends NamedFragment {\n\n    /**\n     *  @private\n     */\n    constructor(guard: any, name: string, inputs: ReadonlyArray<ParamType>) {\n        super(guard, \"struct\", name, inputs);\n        Object.defineProperty(this, internal, { value: StructFragmentInternal });\n    }\n\n    /**\n     *  Returns a string representation of this struct as %%format%%.\n     */\n    format(): string {\n        throw new Error(\"@TODO\");\n    }\n\n    /**\n     *  Returns a new **StructFragment** for %%obj%%.\n     */\n    static from(obj: any): StructFragment {\n        if (typeof(obj) === \"string\") {\n            try {\n                return StructFragment.from(lex(obj));\n            } catch (error) {\n                assertArgument(false, \"invalid struct fragment\", \"obj\", obj);\n            }\n\n        } else if (obj instanceof TokenString) {\n            const name = consumeName(\"struct\", obj);\n            const inputs = consumeParams(obj);\n            consumeEoi(obj);\n            return new StructFragment(_guard, name, inputs);\n        }\n\n        return new StructFragment(_guard, obj.name, obj.inputs ? obj.inputs.map(ParamType.from): [ ]);\n    }\n\n// @TODO: fix this return type\n    /**\n     *  Returns ``true`` and provides a type guard if %%value%% is a\n     *  **StructFragment**.\n     */\n    static isFragment(value: any): value is FunctionFragment {\n        return (value && value[internal] === StructFragmentInternal);\n    }\n}\n\n","/**\n *  When sending values to or receiving values from a [[Contract]], the\n *  data is generally encoded using the [ABI standard](link-solc-abi).\n *\n *  The AbiCoder provides a utility to encode values to ABI data and\n *  decode values from ABI data.\n *\n *  Most of the time, developers should favour the [[Contract]] class,\n *  which further abstracts a lot of the finer details of ABI data.\n *\n *  @_section api/abi/abi-coder:ABI Encoding\n */\n\n// See: https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI\n\nimport { assertArgumentCount, assertArgument } from \"../utils/index.js\";\n\nimport { Coder, Reader, Result, Writer } from \"./coders/abstract-coder.js\";\nimport { AddressCoder } from \"./coders/address.js\";\nimport { ArrayCoder } from \"./coders/array.js\";\nimport { BooleanCoder } from \"./coders/boolean.js\";\nimport { BytesCoder } from \"./coders/bytes.js\";\nimport { FixedBytesCoder } from \"./coders/fixed-bytes.js\";\nimport { NullCoder } from \"./coders/null.js\";\nimport { NumberCoder } from \"./coders/number.js\";\nimport { StringCoder } from \"./coders/string.js\";\nimport { TupleCoder } from \"./coders/tuple.js\";\nimport { ParamType } from \"./fragments.js\";\n\nimport { getAddress } from \"../address/index.js\";\nimport { getBytes, hexlify, makeError } from \"../utils/index.js\";\n\nimport type {\n    BytesLike,\n    CallExceptionAction, CallExceptionError, CallExceptionTransaction\n} from \"../utils/index.js\";\n\n// https://docs.soliditylang.org/en/v0.8.17/control-structures.html\nconst PanicReasons: Map<number, string> = new Map();\nPanicReasons.set(0x00, \"GENERIC_PANIC\");\nPanicReasons.set(0x01, \"ASSERT_FALSE\");\nPanicReasons.set(0x11, \"OVERFLOW\");\nPanicReasons.set(0x12, \"DIVIDE_BY_ZERO\");\nPanicReasons.set(0x21, \"ENUM_RANGE_ERROR\");\nPanicReasons.set(0x22, \"BAD_STORAGE_DATA\");\nPanicReasons.set(0x31, \"STACK_UNDERFLOW\");\nPanicReasons.set(0x32, \"ARRAY_RANGE_ERROR\");\nPanicReasons.set(0x41, \"OUT_OF_MEMORY\");\nPanicReasons.set(0x51, \"UNINITIALIZED_FUNCTION_CALL\");\n\nconst paramTypeBytes = new RegExp(/^bytes([0-9]*)$/);\nconst paramTypeNumber = new RegExp(/^(u?int)([0-9]*)$/);\n\n\nlet defaultCoder: null | AbiCoder = null;\nlet defaultMaxInflation = 1024;\n\nfunction getBuiltinCallException(action: CallExceptionAction, tx: { to?: null | string, from?: null | string, data?: string }, data: null | BytesLike, abiCoder: AbiCoder): CallExceptionError {\n    let message = \"missing revert data\";\n\n    let reason: null | string = null;\n    const invocation = null;\n    let revert: null | { signature: string, name: string, args: Array<any> } = null;\n\n    if (data) {\n        message = \"execution reverted\";\n\n        const bytes = getBytes(data);\n        data = hexlify(data);\n\n        if (bytes.length === 0) {\n            message += \" (no data present; likely require(false) occurred\";\n            reason = \"require(false)\";\n\n        } else if (bytes.length % 32 !== 4) {\n            message += \" (could not decode reason; invalid data length)\";\n\n        } else if (hexlify(bytes.slice(0, 4)) === \"0x08c379a0\") {\n            // Error(string)\n            try {\n                reason = abiCoder.decode([ \"string\" ], bytes.slice(4))[0]\n                revert = {\n                    signature: \"Error(string)\",\n                    name: \"Error\",\n                    args: [ reason ]\n                };\n                message += `: ${ JSON.stringify(reason) }`;\n\n            } catch (error) {\n                message += \" (could not decode reason; invalid string data)\";\n            }\n\n        } else if (hexlify(bytes.slice(0, 4)) === \"0x4e487b71\") {\n            // Panic(uint256)\n            try {\n                const code = Number(abiCoder.decode([ \"uint256\" ], bytes.slice(4))[0]);\n                revert = {\n                    signature: \"Panic(uint256)\",\n                    name: \"Panic\",\n                    args: [ code ]\n                };\n                reason = `Panic due to ${ PanicReasons.get(code) || \"UNKNOWN\" }(${ code })`;\n                message += `: ${ reason }`;\n            } catch (error) {\n                message += \" (could not decode panic code)\";\n            }\n        } else {\n            message += \" (unknown custom error)\";\n        }\n    }\n\n    const transaction: CallExceptionTransaction = {\n        to: (tx.to ? getAddress(tx.to): null),\n        data: (tx.data || \"0x\")\n    };\n    if (tx.from) { transaction.from = getAddress(tx.from); }\n\n    return makeError(message, \"CALL_EXCEPTION\", {\n        action, data, reason, transaction, invocation, revert\n    });\n}\n\n/**\n *  The **AbiCoder** is a low-level class responsible for encoding JavaScript\n *  values into binary data and decoding binary data into JavaScript values.\n */\nexport class AbiCoder {\n\n    #getCoder(param: ParamType): Coder {\n        if (param.isArray()) {\n            return new ArrayCoder(this.#getCoder(param.arrayChildren), param.arrayLength, param.name);\n        }\n\n        if (param.isTuple()) {\n            return new TupleCoder(param.components.map((c) => this.#getCoder(c)), param.name);\n        }\n\n        switch (param.baseType) {\n            case \"address\":\n                return new AddressCoder(param.name);\n            case \"bool\":\n                return new BooleanCoder(param.name);\n            case \"string\":\n                return new StringCoder(param.name);\n            case \"bytes\":\n                return new BytesCoder(param.name);\n            case \"\":\n                return new NullCoder(param.name);\n        }\n\n        // u?int[0-9]*\n        let match = param.type.match(paramTypeNumber);\n        if (match) {\n            let size = parseInt(match[2] || \"256\");\n            assertArgument(size !== 0 && size <= 256 && (size % 8) === 0,\n                \"invalid \" + match[1] + \" bit length\", \"param\", param);\n            return new NumberCoder(size / 8, (match[1] === \"int\"), param.name);\n        }\n\n        // bytes[0-9]+\n        match = param.type.match(paramTypeBytes);\n        if (match) {\n            let size = parseInt(match[1]);\n            assertArgument(size !== 0 && size <= 32, \"invalid bytes length\", \"param\", param);\n            return new FixedBytesCoder(size, param.name);\n        }\n\n        assertArgument(false, \"invalid type\", \"type\", param.type);\n    }\n\n    /**\n     *  Get the default values for the given %%types%%.\n     *\n     *  For example, a ``uint`` is by default ``0`` and ``bool``\n     *  is by default ``false``.\n     */\n    getDefaultValue(types: ReadonlyArray<string | ParamType>): Result {\n        const coders: Array<Coder> = types.map((type) => this.#getCoder(ParamType.from(type)));\n        const coder = new TupleCoder(coders, \"_\");\n        return coder.defaultValue();\n    }\n\n    /**\n     *  Encode the %%values%% as the %%types%% into ABI data.\n     *\n     *  @returns DataHexstring\n     */\n    encode(types: ReadonlyArray<string | ParamType>, values: ReadonlyArray<any>): string {\n        assertArgumentCount(values.length, types.length, \"types/values length mismatch\");\n\n        const coders = types.map((type) => this.#getCoder(ParamType.from(type)));\n        const coder = (new TupleCoder(coders, \"_\"));\n\n        const writer = new Writer();\n        coder.encode(writer, values);\n        return writer.data;\n    }\n\n    /**\n     *  Decode the ABI %%data%% as the %%types%% into values.\n     *\n     *  If %%loose%% decoding is enabled, then strict padding is\n     *  not enforced. Some older versions of Solidity incorrectly\n     *  padded event data emitted from ``external`` functions.\n     */\n    decode(types: ReadonlyArray<string | ParamType>, data: BytesLike, loose?: boolean): Result {\n        const coders: Array<Coder> = types.map((type) => this.#getCoder(ParamType.from(type)));\n        const coder = new TupleCoder(coders, \"_\");\n        return coder.decode(new Reader(data, loose, defaultMaxInflation));\n    }\n\n    static _setDefaultMaxInflation(value: number): void {\n        assertArgument(typeof(value) === \"number\" && Number.isInteger(value), \"invalid defaultMaxInflation factor\", \"value\", value);\n        defaultMaxInflation = value;\n    }\n\n    /**\n     *  Returns the shared singleton instance of a default [[AbiCoder]].\n     *\n     *  On the first call, the instance is created internally.\n     */\n    static defaultAbiCoder(): AbiCoder {\n        if (defaultCoder == null) {\n            defaultCoder = new AbiCoder();\n        }\n        return defaultCoder;\n    }\n\n    /**\n     *  Returns an ethers-compatible [[CallExceptionError]] Error for the given\n     *  result %%data%% for the [[CallExceptionAction]] %%action%% against\n     *  the Transaction %%tx%%.\n     */\n    static getBuiltinCallException(action: CallExceptionAction, tx: { to?: null | string, from?: null | string, data?: string }, data: null | BytesLike): CallExceptionError {\n        return getBuiltinCallException(action, tx, data, AbiCoder.defaultAbiCoder());\n    }\n}\n","/**\n *  The Interface class is a low-level class that accepts an\n *  ABI and provides all the necessary functionality to encode\n *  and decode paramaters to and results from methods, events\n *  and errors.\n *\n *  It also provides several convenience methods to automatically\n *  search and find matching transactions and events to parse them.\n *\n *  @_subsection api/abi:Interfaces  [interfaces]\n */\n\nimport { keccak256 } from \"../crypto/index.js\"\nimport { id } from \"../hash/index.js\"\nimport {\n    concat, dataSlice, getBigInt, getBytes, getBytesCopy,\n    hexlify, zeroPadBytes, zeroPadValue, isHexString, defineProperties,\n    assertArgument, toBeHex, assert\n} from \"../utils/index.js\";\n\nimport { AbiCoder } from \"./abi-coder.js\";\nimport { checkResultErrors, Result } from \"./coders/abstract-coder.js\";\nimport {\n    ConstructorFragment, ErrorFragment, EventFragment, FallbackFragment,\n    Fragment, FunctionFragment, ParamType\n} from \"./fragments.js\";\nimport { Typed } from \"./typed.js\";\n\nimport type { BigNumberish, BytesLike, CallExceptionError, CallExceptionTransaction } from \"../utils/index.js\";\n\nimport type { JsonFragment } from \"./fragments.js\";\n\n\nexport { checkResultErrors, Result };\n\n/**\n *  When using the [[Interface-parseLog]] to automatically match a Log to its event\n *  for parsing, a **LogDescription** is returned.\n */\nexport class LogDescription {\n    /**\n     *  The matching fragment for the ``topic0``.\n     */\n    readonly fragment!: EventFragment;\n\n    /**\n     *  The name of the Event.\n     */\n    readonly name!: string;\n\n    /**\n     *  The full Event signature.\n     */\n    readonly signature!: string;\n\n    /**\n     *  The topic hash for the Event.\n     */\n    readonly topic!: string;\n\n    /**\n     *  The arguments passed into the Event with ``emit``.\n     */\n    readonly args!: Result\n\n    /**\n     *  @_ignore:\n     */\n    constructor(fragment: EventFragment, topic: string, args: Result) {\n        const name = fragment.name, signature = fragment.format();\n        defineProperties<LogDescription>(this, {\n            fragment, name, signature, topic, args\n        });\n    }\n}\n\n/**\n *  When using the [[Interface-parseTransaction]] to automatically match\n *  a transaction data to its function for parsing,\n *  a **TransactionDescription** is returned.\n */\nexport class TransactionDescription {\n    /**\n     *  The matching fragment from the transaction ``data``.\n     */\n    readonly fragment!: FunctionFragment;\n\n    /**\n     *  The name of the Function from the transaction ``data``.\n     */\n    readonly name!: string;\n\n    /**\n     *  The arguments passed to the Function from the transaction ``data``.\n     */\n    readonly args!: Result;\n\n    /**\n     *  The full Function signature from the transaction ``data``.\n     */\n    readonly signature!: string;\n\n    /**\n     *  The selector for the Function from the transaction ``data``.\n     */\n    readonly selector!: string;\n\n    /**\n     *  The ``value`` (in wei) from the transaction.\n     */\n    readonly value!: bigint;\n\n    /**\n     *  @_ignore:\n     */\n    constructor(fragment: FunctionFragment, selector: string, args: Result, value: bigint) {\n        const name = fragment.name, signature = fragment.format();\n        defineProperties<TransactionDescription>(this, {\n            fragment, name, args, signature, selector, value\n        });\n    }\n}\n\n/**\n *  When using the [[Interface-parseError]] to automatically match an\n *  error for a call result for parsing, an **ErrorDescription** is returned.\n */\nexport class ErrorDescription {\n    /**\n     *  The matching fragment.\n     */\n    readonly fragment!: ErrorFragment;\n\n    /**\n     *  The name of the Error.\n     */\n    readonly name!: string;\n\n    /**\n     *  The arguments passed to the Error with ``revert``.\n     */\n    readonly args!: Result;\n\n    /**\n     *  The full Error signature.\n     */\n    readonly signature!: string;\n\n    /**\n     *  The selector for the Error.\n     */\n    readonly selector!: string;\n\n    /**\n     *  @_ignore:\n     */\n    constructor(fragment: ErrorFragment, selector: string, args: Result) {\n        const name = fragment.name, signature = fragment.format();\n        defineProperties<ErrorDescription>(this, {\n            fragment, name, args, signature, selector\n        });\n    }\n}\n\n/**\n *  An **Indexed** is used as a value when a value that does not\n *  fit within a topic (i.e. not a fixed-length, 32-byte type). It\n *  is the ``keccak256`` of the value, and used for types such as\n *  arrays, tuples, bytes and strings.\n */\nexport class Indexed {\n    /**\n     *  The ``keccak256`` of the value logged.\n     */\n    readonly hash!: null | string;\n\n    /**\n     *  @_ignore:\n     */\n    readonly _isIndexed!: boolean;\n\n    /**\n     *  Returns ``true`` if %%value%% is an **Indexed**.\n     *\n     *  This provides a Type Guard for property access.\n     */\n    static isIndexed(value: any): value is Indexed {\n        return !!(value && value._isIndexed);\n    }\n\n    /**\n     *  @_ignore:\n     */\n    constructor(hash: null | string) {\n        defineProperties<Indexed>(this, { hash, _isIndexed: true })\n    }\n}\n\ntype ErrorInfo = {\n    signature: string,\n    inputs: Array<string>,\n    name: string,\n    reason: (...args: Array<any>) => string;\n};\n\n// https://docs.soliditylang.org/en/v0.8.13/control-structures.html?highlight=panic#panic-via-assert-and-error-via-require\nconst PanicReasons: Record<string, string> = {\n    \"0\": \"generic panic\",\n    \"1\": \"assert(false)\",\n    \"17\": \"arithmetic overflow\",\n    \"18\": \"division or modulo by zero\",\n    \"33\": \"enum overflow\",\n    \"34\": \"invalid encoded storage byte array accessed\",\n    \"49\": \"out-of-bounds array access; popping on an empty array\",\n    \"50\": \"out-of-bounds access of an array or bytesN\",\n    \"65\": \"out of memory\",\n    \"81\": \"uninitialized function\",\n}\n\nconst BuiltinErrors: Record<string, ErrorInfo> = {\n    \"0x08c379a0\": {\n        signature: \"Error(string)\",\n        name: \"Error\",\n        inputs: [ \"string\" ],\n        reason: (message: string) => {\n            return `reverted with reason string ${ JSON.stringify(message) }`;\n        }\n    },\n    \"0x4e487b71\": {\n        signature: \"Panic(uint256)\",\n        name: \"Panic\",\n        inputs: [ \"uint256\" ],\n        reason: (code: bigint) => {\n            let reason = \"unknown panic code\";\n            if (code >= 0 && code <= 0xff && PanicReasons[code.toString()]) {\n                reason = PanicReasons[code.toString()];\n            }\n            return `reverted with panic code 0x${ code.toString(16) } (${ reason })`;\n        }\n    }\n}\n\n/*\nfunction wrapAccessError(property: string, error: Error): Error {\n    const wrap = new Error(`deferred error during ABI decoding triggered accessing ${ property }`);\n    (<any>wrap).error = error;\n    return wrap;\n}\n*/\n/*\nfunction checkNames(fragment: Fragment, type: \"input\" | \"output\", params: Array<ParamType>): void {\n    params.reduce((accum, param) => {\n        if (param.name) {\n            if (accum[param.name]) {\n                logger.throwArgumentError(`duplicate ${ type } parameter ${ JSON.stringify(param.name) } in ${ fragment.format(\"full\") }`, \"fragment\", fragment);\n            }\n            accum[param.name] = true;\n        }\n        return accum;\n    }, <{ [ name: string ]: boolean }>{ });\n}\n*/\n\n/**\n *  An **InterfaceAbi** may be any supported ABI format.\n *\n *  A string is expected to be a JSON string, which will be parsed\n *  using ``JSON.parse``. This means that the value **must** be a valid\n *  JSON string, with no stray commas, etc.\n *\n *  An array may contain any combination of:\n *  - Human-Readable fragments\n *  - Parsed JSON fragment\n *  - [[Fragment]] instances\n *\n *  A **Human-Readable Fragment** is a string which resembles a Solidity\n *  signature and is introduced in [this blog entry](link-ricmoo-humanreadableabi).\n *  For example, ``function balanceOf(address) view returns (uint)``.\n *\n *  A **Parsed JSON Fragment** is a JavaScript Object desribed in the\n *  [Solidity documentation](link-solc-jsonabi).\n */\nexport type InterfaceAbi = string | ReadonlyArray<Fragment | JsonFragment | string>;\n\n/**\n *  An Interface abstracts many of the low-level details for\n *  encoding and decoding the data on the blockchain.\n *\n *  An ABI provides information on how to encode data to send to\n *  a Contract, how to decode the results and events and how to\n *  interpret revert errors.\n *\n *  The ABI can be specified by [any supported format](InterfaceAbi).\n */\nexport class Interface {\n\n    /**\n     *  All the Contract ABI members (i.e. methods, events, errors, etc).\n     */\n    readonly fragments!: ReadonlyArray<Fragment>;\n\n    /**\n     *  The Contract constructor.\n     */\n    readonly deploy!: ConstructorFragment;\n\n    /**\n     *  The Fallback method, if any.\n     */\n    readonly fallback!: null | FallbackFragment;\n\n    /**\n     *  If receiving ether is supported.\n     */\n    readonly receive!: boolean;\n\n    #errors: Map<string, ErrorFragment>;\n    #events: Map<string, EventFragment>;\n    #functions: Map<string, FunctionFragment>;\n//    #structs: Map<string, StructFragment>;\n\n    #abiCoder: AbiCoder;\n\n    /**\n     *  Create a new Interface for the %%fragments%%.\n     */\n    constructor(fragments: InterfaceAbi) {\n        let abi: ReadonlyArray<Fragment | JsonFragment | string> = [ ];\n        if (typeof(fragments) === \"string\") {\n            abi = JSON.parse(fragments);\n        } else {\n            abi = fragments;\n        }\n\n        this.#functions = new Map();\n        this.#errors = new Map();\n        this.#events = new Map();\n//        this.#structs = new Map();\n\n\n        const frags: Array<Fragment> = [ ];\n        for (const a of abi) {\n            try {\n                frags.push(Fragment.from(a));\n            } catch (error: any) {\n                console.log(`[Warning] Invalid Fragment ${ JSON.stringify(a) }:`, error.message);\n            }\n        }\n\n        defineProperties<Interface>(this, {\n            fragments: Object.freeze(frags)\n        });\n\n        let fallback: null | FallbackFragment = null;\n        let receive = false;\n\n        this.#abiCoder = this.getAbiCoder();\n\n        // Add all fragments by their signature\n        this.fragments.forEach((fragment, index) => {\n            let bucket: Map<string, Fragment>;\n            switch (fragment.type) {\n                case \"constructor\":\n                    if (this.deploy) {\n                        console.log(\"duplicate definition - constructor\");\n                        return;\n                    }\n                    //checkNames(fragment, \"input\", fragment.inputs);\n                    defineProperties<Interface>(this, { deploy: <ConstructorFragment>fragment });\n                    return;\n\n                case \"fallback\":\n                    if (fragment.inputs.length === 0) {\n                        receive = true;\n                    } else {\n                        assertArgument(!fallback || (<FallbackFragment>fragment).payable !== fallback.payable,\n                            \"conflicting fallback fragments\", `fragments[${ index }]`, fragment);\n                        fallback = <FallbackFragment>fragment;\n                        receive = fallback.payable;\n                    }\n                    return;\n\n                case \"function\":\n                    //checkNames(fragment, \"input\", fragment.inputs);\n                    //checkNames(fragment, \"output\", (<FunctionFragment>fragment).outputs);\n                    bucket = this.#functions;\n                    break;\n\n                case \"event\":\n                    //checkNames(fragment, \"input\", fragment.inputs);\n                    bucket = this.#events;\n                    break;\n\n                case \"error\":\n                    bucket = this.#errors;\n                    break;\n\n                default:\n                    return;\n            }\n\n            // Two identical entries; ignore it\n            const signature = fragment.format();\n            if (bucket.has(signature)) { return; }\n\n            bucket.set(signature, fragment);\n        });\n\n        // If we do not have a constructor add a default\n        if (!this.deploy) {\n            defineProperties<Interface>(this, {\n                deploy: ConstructorFragment.from(\"constructor()\")\n            });\n        }\n\n        defineProperties<Interface>(this, { fallback, receive });\n    }\n\n    /**\n     *  Returns the entire Human-Readable ABI, as an array of\n     *  signatures, optionally as %%minimal%% strings, which\n     *  removes parameter names and unneceesary spaces.\n     */\n    format(minimal?: boolean): Array<string> {\n        const format = (minimal ? \"minimal\": \"full\");\n        const abi = this.fragments.map((f) => f.format(format));\n        return abi;\n    }\n\n    /**\n     *  Return the JSON-encoded ABI. This is the format Solidiy\n     *  returns.\n     */\n    formatJson(): string {\n        const abi = this.fragments.map((f) => f.format(\"json\"));\n\n        // We need to re-bundle the JSON fragments a bit\n        return JSON.stringify(abi.map((j) => JSON.parse(j)));\n    }\n\n    /**\n     *  The ABI coder that will be used to encode and decode binary\n     *  data.\n     */\n    getAbiCoder(): AbiCoder {\n        return AbiCoder.defaultAbiCoder();\n    }\n\n    // Find a function definition by any means necessary (unless it is ambiguous)\n    #getFunction(key: string, values: null | Array<any | Typed>, forceUnique: boolean): null | FunctionFragment {\n\n        // Selector\n        if (isHexString(key)) {\n            const selector = key.toLowerCase();\n            for (const fragment of this.#functions.values()) {\n                if (selector === fragment.selector) { return fragment; }\n            }\n            return null;\n        }\n\n        // It is a bare name, look up the function (will return null if ambiguous)\n        if (key.indexOf(\"(\") === -1) {\n            const matching: Array<FunctionFragment> = [ ];\n            for (const [ name, fragment ] of this.#functions) {\n                if (name.split(\"(\"/* fix:) */)[0] === key) { matching.push(fragment); }\n            }\n\n            if (values) {\n                const lastValue = (values.length > 0) ? values[values.length - 1]: null;\n\n                let valueLength = values.length;\n                let allowOptions = true;\n                if (Typed.isTyped(lastValue) && lastValue.type === \"overrides\") {\n                    allowOptions = false;\n                    valueLength--;\n                }\n\n                // Remove all matches that don't have a compatible length. The args\n                // may contain an overrides, so the match may have n or n - 1 parameters\n                for (let i = matching.length - 1; i >= 0; i--) {\n                    const inputs = matching[i].inputs.length;\n                    if (inputs !== valueLength && (!allowOptions || inputs !== valueLength - 1)) {\n                        matching.splice(i, 1);\n                    }\n                }\n\n                // Remove all matches that don't match the Typed signature\n                for (let i = matching.length - 1; i >= 0; i--) {\n                    const inputs = matching[i].inputs;\n                    for (let j = 0; j < values.length; j++) {\n                        // Not a typed value\n                        if (!Typed.isTyped(values[j])) { continue; }\n\n                        // We are past the inputs\n                        if (j >= inputs.length) {\n                            if (values[j].type === \"overrides\") { continue; }\n                            matching.splice(i, 1);\n                            break;\n                        }\n\n                        // Make sure the value type matches the input type\n                        if (values[j].type !== inputs[j].baseType) {\n                            matching.splice(i, 1);\n                            break;\n                        }\n                    }\n                }\n            }\n\n            // We found a single matching signature with an overrides, but the\n            // last value is something that cannot possibly be an options\n            if (matching.length === 1 && values && values.length !== matching[0].inputs.length) {\n                const lastArg = values[values.length - 1];\n                if (lastArg == null || Array.isArray(lastArg) || typeof(lastArg) !== \"object\") {\n                    matching.splice(0, 1);\n                }\n            }\n\n            if (matching.length === 0) { return null; }\n\n            if (matching.length > 1 && forceUnique) {\n                const matchStr = matching.map((m) => JSON.stringify(m.format())).join(\", \");\n                assertArgument(false, `ambiguous function description (i.e. matches ${ matchStr })`, \"key\", key);\n            }\n\n            return matching[0];\n        }\n\n        // Normalize the signature and lookup the function\n        const result = this.#functions.get(FunctionFragment.from(key).format());\n        if (result) { return result; }\n\n        return null;\n    }\n\n    /**\n     *  Get the function name for %%key%%, which may be a function selector,\n     *  function name or function signature that belongs to the ABI.\n     */\n    getFunctionName(key: string): string {\n        const fragment = this.#getFunction(key, null, false);\n        assertArgument(fragment, \"no matching function\", \"key\", key);\n        return fragment.name;\n    }\n\n    /**\n     *  Returns true if %%key%% (a function selector, function name or\n     *  function signature) is present in the ABI.\n     *\n     *  In the case of a function name, the name may be ambiguous, so\n     *  accessing the [[FunctionFragment]] may require refinement.\n     */\n    hasFunction(key: string): boolean {\n        return !!this.#getFunction(key, null, false);\n    }\n\n    /**\n     *  Get the [[FunctionFragment]] for %%key%%, which may be a function\n     *  selector, function name or function signature that belongs to the ABI.\n     *\n     *  If %%values%% is provided, it will use the Typed API to handle\n     *  ambiguous cases where multiple functions match by name.\n     *\n     *  If the %%key%% and %%values%% do not refine to a single function in\n     *  the ABI, this will throw.\n     */\n    getFunction(key: string, values?: Array<any | Typed>): null | FunctionFragment {\n        return this.#getFunction(key, values || null, true);\n    }\n\n    /**\n     *  Iterate over all functions, calling %%callback%%, sorted by their name.\n     */\n    forEachFunction(callback: (func: FunctionFragment, index: number) => void): void {\n        const names = Array.from(this.#functions.keys());\n        names.sort((a, b) => a.localeCompare(b));\n        for (let i = 0; i < names.length; i++) {\n            const name = names[i];\n            callback(<FunctionFragment>(this.#functions.get(name)), i);\n        }\n    }\n\n\n    // Find an event definition by any means necessary (unless it is ambiguous)\n    #getEvent(key: string, values: null | Array<null | any | Typed>, forceUnique: boolean): null | EventFragment {\n\n        // EventTopic\n        if (isHexString(key)) {\n            const eventTopic = key.toLowerCase();\n            for (const fragment of this.#events.values()) {\n                if (eventTopic === fragment.topicHash) { return fragment; }\n            }\n            return null;\n        }\n\n        // It is a bare name, look up the function (will return null if ambiguous)\n        if (key.indexOf(\"(\") === -1) {\n            const matching: Array<EventFragment> = [ ];\n            for (const [ name, fragment ] of this.#events) {\n                if (name.split(\"(\"/* fix:) */)[0] === key) { matching.push(fragment); }\n            }\n\n            if (values) {\n                // Remove all matches that don't have a compatible length.\n                for (let i = matching.length - 1; i >= 0; i--) {\n                    if (matching[i].inputs.length < values.length) {\n                        matching.splice(i, 1);\n                    }\n                }\n\n                // Remove all matches that don't match the Typed signature\n                for (let i = matching.length - 1; i >= 0; i--) {\n                    const inputs = matching[i].inputs;\n                    for (let j = 0; j < values.length; j++) {\n                        // Not a typed value\n                        if (!Typed.isTyped(values[j])) { continue; }\n\n                        // Make sure the value type matches the input type\n                        if (values[j].type !== inputs[j].baseType) {\n                            matching.splice(i, 1);\n                            break;\n                        }\n                    }\n                }\n            }\n\n            if (matching.length === 0) { return null; }\n\n            if (matching.length > 1 && forceUnique) {\n                const matchStr = matching.map((m) => JSON.stringify(m.format())).join(\", \");\n                assertArgument(false, `ambiguous event description (i.e. matches ${ matchStr })`, \"key\", key);\n            }\n\n            return matching[0];\n        }\n\n        // Normalize the signature and lookup the function\n        const result = this.#events.get(EventFragment.from(key).format());\n        if (result) { return result; }\n\n        return null;\n    }\n\n    /**\n     *  Get the event name for %%key%%, which may be a topic hash,\n     *  event name or event signature that belongs to the ABI.\n     */\n    getEventName(key: string): string {\n        const fragment = this.#getEvent(key, null, false);\n        assertArgument(fragment, \"no matching event\", \"key\", key);\n\n        return fragment.name;\n    }\n\n    /**\n     *  Returns true if %%key%% (an event topic hash, event name or\n     *  event signature) is present in the ABI.\n     *\n     *  In the case of an event name, the name may be ambiguous, so\n     *  accessing the [[EventFragment]] may require refinement.\n     */\n    hasEvent(key: string): boolean {\n        return !!this.#getEvent(key, null, false);\n    }\n\n    /**\n     *  Get the [[EventFragment]] for %%key%%, which may be a topic hash,\n     *  event name or event signature that belongs to the ABI.\n     *\n     *  If %%values%% is provided, it will use the Typed API to handle\n     *  ambiguous cases where multiple events match by name.\n     *\n     *  If the %%key%% and %%values%% do not refine to a single event in\n     *  the ABI, this will throw.\n     */\n    getEvent(key: string, values?: Array<any | Typed>): null | EventFragment {\n        return this.#getEvent(key, values || null, true)\n    }\n\n    /**\n     *  Iterate over all events, calling %%callback%%, sorted by their name.\n     */\n    forEachEvent(callback: (func: EventFragment, index: number) => void): void {\n        const names = Array.from(this.#events.keys());\n        names.sort((a, b) => a.localeCompare(b));\n        for (let i = 0; i < names.length; i++) {\n            const name = names[i];\n            callback(<EventFragment>(this.#events.get(name)), i);\n        }\n    }\n\n    /**\n     *  Get the [[ErrorFragment]] for %%key%%, which may be an error\n     *  selector, error name or error signature that belongs to the ABI.\n     *\n     *  If %%values%% is provided, it will use the Typed API to handle\n     *  ambiguous cases where multiple errors match by name.\n     *\n     *  If the %%key%% and %%values%% do not refine to a single error in\n     *  the ABI, this will throw.\n     */\n    getError(key: string, values?: Array<any | Typed>): null | ErrorFragment {\n        if (isHexString(key)) {\n            const selector = key.toLowerCase();\n\n            if (BuiltinErrors[selector]) {\n                return ErrorFragment.from(BuiltinErrors[selector].signature);\n            }\n\n            for (const fragment of this.#errors.values()) {\n                if (selector === fragment.selector) { return fragment; }\n            }\n\n            return null;\n        }\n\n        // It is a bare name, look up the function (will return null if ambiguous)\n        if (key.indexOf(\"(\") === -1) {\n            const matching: Array<ErrorFragment> = [ ];\n            for (const [ name, fragment ] of this.#errors) {\n                if (name.split(\"(\"/* fix:) */)[0] === key) { matching.push(fragment); }\n            }\n\n            if (matching.length === 0) {\n                if (key === \"Error\") { return ErrorFragment.from(\"error Error(string)\"); }\n                if (key === \"Panic\") { return ErrorFragment.from(\"error Panic(uint256)\"); }\n                return null;\n            } else if (matching.length > 1) {\n                const matchStr = matching.map((m) => JSON.stringify(m.format())).join(\", \");\n                assertArgument(false, `ambiguous error description (i.e. ${ matchStr })`, \"name\", key);\n            }\n\n            return matching[0];\n        }\n\n        // Normalize the signature and lookup the function\n        key = ErrorFragment.from(key).format()\n        if (key === \"Error(string)\") { return ErrorFragment.from(\"error Error(string)\"); }\n        if (key === \"Panic(uint256)\") { return ErrorFragment.from(\"error Panic(uint256)\"); }\n\n        const result = this.#errors.get(key);\n        if (result) { return result; }\n\n        return null;\n    }\n\n    /**\n     *  Iterate over all errors, calling %%callback%%, sorted by their name.\n     */\n    forEachError(callback: (func: ErrorFragment, index: number) => void): void {\n        const names = Array.from(this.#errors.keys());\n        names.sort((a, b) => a.localeCompare(b));\n        for (let i = 0; i < names.length; i++) {\n            const name = names[i];\n            callback(<ErrorFragment>(this.#errors.get(name)), i);\n        }\n    }\n\n    // Get the 4-byte selector used by Solidity to identify a function\n        /*\n    getSelector(fragment: ErrorFragment | FunctionFragment): string {\n        if (typeof(fragment) === \"string\") {\n            const matches: Array<Fragment> = [ ];\n\n            try { matches.push(this.getFunction(fragment)); } catch (error) { }\n            try { matches.push(this.getError(<string>fragment)); } catch (_) { }\n\n            if (matches.length === 0) {\n                logger.throwArgumentError(\"unknown fragment\", \"key\", fragment);\n            } else if (matches.length > 1) {\n                logger.throwArgumentError(\"ambiguous fragment matches function and error\", \"key\", fragment);\n            }\n\n            fragment = matches[0];\n        }\n\n        return dataSlice(id(fragment.format()), 0, 4);\n    }\n        */\n\n    // Get the 32-byte topic hash used by Solidity to identify an event\n    /*\n    getEventTopic(fragment: EventFragment): string {\n        //if (typeof(fragment) === \"string\") { fragment = this.getEvent(eventFragment); }\n        return id(fragment.format());\n    }\n    */\n\n\n    _decodeParams(params: ReadonlyArray<ParamType>, data: BytesLike): Result {\n        return this.#abiCoder.decode(params, data)\n    }\n\n    _encodeParams(params: ReadonlyArray<ParamType>, values: ReadonlyArray<any>): string {\n        return this.#abiCoder.encode(params, values)\n    }\n\n    /**\n     *  Encodes a ``tx.data`` object for deploying the Contract with\n     *  the %%values%% as the constructor arguments.\n     */\n    encodeDeploy(values?: ReadonlyArray<any>): string {\n        return this._encodeParams(this.deploy.inputs, values || [ ]);\n    }\n\n    /**\n     *  Decodes the result %%data%% (e.g. from an ``eth_call``) for the\n     *  specified error (see [[getError]] for valid values for\n     *  %%key%%).\n     *\n     *  Most developers should prefer the [[parseCallResult]] method instead,\n     *  which will automatically detect a ``CALL_EXCEPTION`` and throw the\n     *  corresponding error.\n     */\n    decodeErrorResult(fragment: ErrorFragment | string, data: BytesLike): Result {\n        if (typeof(fragment) === \"string\") {\n            const f = this.getError(fragment);\n            assertArgument(f, \"unknown error\", \"fragment\", fragment);\n            fragment = f;\n        }\n\n        assertArgument(dataSlice(data, 0, 4) === fragment.selector,\n            `data signature does not match error ${ fragment.name }.`, \"data\", data);\n\n        return this._decodeParams(fragment.inputs, dataSlice(data, 4));\n    }\n\n    /**\n     *  Encodes the transaction revert data for a call result that\n     *  reverted from the the Contract with the sepcified %%error%%\n     *  (see [[getError]] for valid values for %%fragment%%) with the %%values%%.\n     *\n     *  This is generally not used by most developers, unless trying to mock\n     *  a result from a Contract.\n     */\n    encodeErrorResult(fragment: ErrorFragment | string, values?: ReadonlyArray<any>): string {\n        if (typeof(fragment) === \"string\") {\n            const f = this.getError(fragment);\n            assertArgument(f, \"unknown error\", \"fragment\", fragment);\n            fragment = f;\n        }\n\n        return concat([\n            fragment.selector,\n            this._encodeParams(fragment.inputs, values || [ ])\n        ]);\n    }\n\n    /**\n     *  Decodes the %%data%% from a transaction ``tx.data`` for\n     *  the function specified (see [[getFunction]] for valid values\n     *  for %%fragment%%).\n     *\n     *  Most developers should prefer the [[parseTransaction]] method\n     *  instead, which will automatically detect the fragment.\n     */\n    decodeFunctionData(fragment: FunctionFragment | string, data: BytesLike): Result {\n        if (typeof(fragment) === \"string\") {\n            const f = this.getFunction(fragment);\n            assertArgument(f, \"unknown function\", \"fragment\", fragment);\n            fragment = f;\n        }\n\n        assertArgument(dataSlice(data, 0, 4) === fragment.selector,\n            `data signature does not match function ${ fragment.name }.`, \"data\", data);\n\n        return this._decodeParams(fragment.inputs, dataSlice(data, 4));\n    }\n\n    /**\n     *  Encodes the ``tx.data`` for a transaction that calls the function\n     *  specified (see [[getFunction]] for valid values for %%fragment%%) with\n     *  the %%values%%.\n     */\n    encodeFunctionData(fragment: FunctionFragment | string, values?: ReadonlyArray<any>): string {\n        if (typeof(fragment) === \"string\") {\n            const f = this.getFunction(fragment);\n            assertArgument(f, \"unknown function\", \"fragment\", fragment);\n            fragment = f;\n        }\n\n        return concat([\n            fragment.selector,\n            this._encodeParams(fragment.inputs, values || [ ])\n        ]);\n    }\n\n    /**\n     *  Decodes the result %%data%% (e.g. from an ``eth_call``) for the\n     *  specified function (see [[getFunction]] for valid values for\n     *  %%key%%).\n     *\n     *  Most developers should prefer the [[parseCallResult]] method instead,\n     *  which will automatically detect a ``CALL_EXCEPTION`` and throw the\n     *  corresponding error.\n     */\n    decodeFunctionResult(fragment: FunctionFragment | string, data: BytesLike): Result {\n        if (typeof(fragment) === \"string\") {\n            const f = this.getFunction(fragment);\n            assertArgument(f, \"unknown function\", \"fragment\", fragment);\n            fragment = f;\n        }\n\n        let message = \"invalid length for result data\";\n\n        const bytes = getBytesCopy(data);\n        if ((bytes.length % 32) === 0) {\n            try {\n                return this.#abiCoder.decode(fragment.outputs, bytes);\n            } catch (error) {\n                message = \"could not decode result data\";\n            }\n        }\n\n        // Call returned data with no error, but the data is junk\n        assert(false, message, \"BAD_DATA\", {\n            value: hexlify(bytes),\n            info: { method: fragment.name, signature: fragment.format() }\n        });\n    }\n\n    makeError(_data: BytesLike, tx: CallExceptionTransaction): CallExceptionError {\n        const data = getBytes(_data, \"data\");\n\n        const error = AbiCoder.getBuiltinCallException(\"call\", tx, data);\n\n        // Not a built-in error; try finding a custom error\n        const customPrefix = \"execution reverted (unknown custom error)\";\n        if (error.message.startsWith(customPrefix)) {\n            const selector = hexlify(data.slice(0, 4));\n\n            const ef = this.getError(selector);\n            if (ef) {\n                try {\n                    const args = this.#abiCoder.decode(ef.inputs, data.slice(4));\n                    error.revert = {\n                        name: ef.name, signature: ef.format(), args\n                    };\n                    error.reason = error.revert.signature;\n                    error.message = `execution reverted: ${ error.reason }`\n                 } catch (e) {\n                    error.message = `execution reverted (coult not decode custom error)`\n                }\n            }\n        }\n\n        // Add the invocation, if available\n        const parsed = this.parseTransaction(tx);\n        if (parsed) {\n            error.invocation = {\n                method: parsed.name,\n                signature: parsed.signature,\n                args: parsed.args\n            };\n        }\n\n        return error;\n    }\n\n    /**\n     *  Encodes the result data (e.g. from an ``eth_call``) for the\n     *  specified function (see [[getFunction]] for valid values\n     *  for %%fragment%%) with %%values%%.\n     *\n     *  This is generally not used by most developers, unless trying to mock\n     *  a result from a Contract.\n     */\n    encodeFunctionResult(fragment: FunctionFragment | string, values?: ReadonlyArray<any>): string {\n        if (typeof(fragment) === \"string\") {\n            const f = this.getFunction(fragment);\n            assertArgument(f, \"unknown function\", \"fragment\", fragment);\n            fragment = f;\n        }\n        return hexlify(this.#abiCoder.encode(fragment.outputs, values || [ ]));\n    }\n/*\n    spelunk(inputs: Array<ParamType>, values: ReadonlyArray<any>, processfunc: (type: string, value: any) => Promise<any>): Promise<Array<any>> {\n        const promises: Array<Promise<>> = [ ];\n        const process = function(type: ParamType, value: any): any {\n            if (type.baseType === \"array\") {\n                return descend(type.child\n            }\n            if (type. === \"address\") {\n            }\n        };\n\n        const descend = function (inputs: Array<ParamType>, values: ReadonlyArray<any>) {\n            if (inputs.length !== values.length) { throw new Error(\"length mismatch\"); }\n            \n        };\n\n        const result: Array<any> = [ ];\n        values.forEach((value, index) => {\n            if (value == null) {\n                topics.push(null);\n            } else if (param.baseType === \"array\" || param.baseType === \"tuple\") {\n                logger.throwArgumentError(\"filtering with tuples or arrays not supported\", (\"contract.\" + param.name), value);\n            } else if (Array.isArray(value)) {\n                topics.push(value.map((value) => encodeTopic(param, value)));\n            } else {\n                topics.push(encodeTopic(param, value));\n            }\n        });\n    }\n*/\n    // Create the filter for the event with search criteria (e.g. for eth_filterLog)\n    encodeFilterTopics(fragment: EventFragment | string, values: ReadonlyArray<any>): Array<null | string | Array<string>> {\n        if (typeof(fragment) === \"string\") {\n            const f = this.getEvent(fragment);\n            assertArgument(f, \"unknown event\", \"eventFragment\", fragment);\n            fragment = f;\n        }\n\n        assert(values.length <= fragment.inputs.length, `too many arguments for ${ fragment.format() }`,\n            \"UNEXPECTED_ARGUMENT\", { count: values.length, expectedCount: fragment.inputs.length })\n\n        const topics: Array<null | string | Array<string>> = [];\n        if (!fragment.anonymous) { topics.push(fragment.topicHash); }\n\n        // @TODO: Use the coders for this; to properly support tuples, etc.\n        const encodeTopic = (param: ParamType, value: any): string => {\n            if (param.type === \"string\") {\n                 return id(value);\n            } else if (param.type === \"bytes\") {\n                 return keccak256(hexlify(value));\n            }\n\n            if (param.type === \"bool\" && typeof(value) === \"boolean\") {\n                value = (value ? \"0x01\": \"0x00\");\n            } else if (param.type.match(/^u?int/)) {\n                value = toBeHex(value);  // @TODO: Should this toTwos??\n            } else if (param.type.match(/^bytes/)) {\n                value = zeroPadBytes(value, 32);\n            } else if (param.type === \"address\") {\n                // Check addresses are valid\n                this.#abiCoder.encode( [ \"address\" ], [ value ]);\n            }\n\n            return zeroPadValue(hexlify(value), 32);\n        };\n\n        values.forEach((value, index) => {\n\n            const param = (<EventFragment>fragment).inputs[index];\n\n            if (!param.indexed) {\n                assertArgument(value == null,\n                    \"cannot filter non-indexed parameters; must be null\", (\"contract.\" + param.name), value);\n                return;\n            }\n\n            if (value == null) {\n                topics.push(null);\n            } else if (param.baseType === \"array\" || param.baseType === \"tuple\") {\n                assertArgument(false, \"filtering with tuples or arrays not supported\", (\"contract.\" + param.name), value);\n            } else if (Array.isArray(value)) {\n                topics.push(value.map((value) => encodeTopic(param, value)));\n            } else {\n                topics.push(encodeTopic(param, value));\n            }\n        });\n\n        // Trim off trailing nulls\n        while (topics.length && topics[topics.length - 1] === null) {\n            topics.pop();\n        }\n\n        return topics;\n    }\n\n    encodeEventLog(fragment: EventFragment | string, values: ReadonlyArray<any>): { data: string, topics: Array<string> } {\n        if (typeof(fragment) === \"string\") {\n            const f = this.getEvent(fragment);\n            assertArgument(f, \"unknown event\", \"eventFragment\", fragment);\n            fragment = f;\n        }\n\n        const topics: Array<string> = [ ];\n\n        const dataTypes: Array<ParamType> = [ ];\n        const dataValues: Array<string> = [ ];\n\n        if (!fragment.anonymous) {\n            topics.push(fragment.topicHash);\n        }\n\n        assertArgument(values.length === fragment.inputs.length,\n            \"event arguments/values mismatch\", \"values\", values);\n\n        fragment.inputs.forEach((param, index) => {\n            const value = values[index];\n            if (param.indexed) {\n                if (param.type === \"string\") {\n                    topics.push(id(value))\n                } else if (param.type === \"bytes\") {\n                    topics.push(keccak256(value))\n                } else if (param.baseType === \"tuple\" || param.baseType === \"array\") {\n                    // @TODO\n                    throw new Error(\"not implemented\");\n                } else {\n                    topics.push(this.#abiCoder.encode([ param.type] , [ value ]));\n                }\n            } else {\n                dataTypes.push(param);\n                dataValues.push(value);\n            }\n        });\n\n        return {\n            data: this.#abiCoder.encode(dataTypes , dataValues),\n            topics: topics\n        };\n    }\n\n    // Decode a filter for the event and the search criteria\n    decodeEventLog(fragment: EventFragment | string, data: BytesLike, topics?: ReadonlyArray<string>): Result {\n        if (typeof(fragment) === \"string\") {\n            const f = this.getEvent(fragment);\n            assertArgument(f, \"unknown event\", \"eventFragment\", fragment);\n            fragment = f;\n        }\n\n        if (topics != null && !fragment.anonymous) {\n            const eventTopic = fragment.topicHash;\n            assertArgument(isHexString(topics[0], 32) && topics[0].toLowerCase() === eventTopic,\n                \"fragment/topic mismatch\", \"topics[0]\", topics[0]);\n            topics = topics.slice(1);\n        }\n\n        const indexed: Array<ParamType> = [];\n        const nonIndexed: Array<ParamType> = [];\n        const dynamic: Array<boolean> = [];\n\n        fragment.inputs.forEach((param, index) => {\n            if (param.indexed) {\n                if (param.type === \"string\" || param.type === \"bytes\" || param.baseType === \"tuple\" || param.baseType === \"array\") {\n                    indexed.push(ParamType.from({ type: \"bytes32\", name: param.name }));\n                    dynamic.push(true);\n                } else {\n                    indexed.push(param);\n                    dynamic.push(false);\n                }\n            } else {\n                nonIndexed.push(param);\n                dynamic.push(false);\n            }\n        });\n\n        const resultIndexed = (topics != null) ? this.#abiCoder.decode(indexed, concat(topics)): null;\n        const resultNonIndexed = this.#abiCoder.decode(nonIndexed, data, true);\n\n        //const result: (Array<any> & { [ key: string ]: any }) = [ ];\n        const values: Array<any> = [ ];\n        const keys: Array<null | string> = [ ];\n        let nonIndexedIndex = 0, indexedIndex = 0;\n        fragment.inputs.forEach((param, index) => {\n            let value: null | Indexed | Error = null;\n            if (param.indexed) {\n                if (resultIndexed == null) {\n                    value = new Indexed(null);\n\n                } else if (dynamic[index]) {\n                    value = new Indexed(resultIndexed[indexedIndex++]);\n\n                } else {\n                    try {\n                        value = resultIndexed[indexedIndex++];\n                    } catch (error: any) {\n                        value = error;\n                    }\n                }\n            } else {\n                try {\n                    value = resultNonIndexed[nonIndexedIndex++];\n                } catch (error: any) {\n                    value = error;\n                }\n            }\n\n            values.push(value);\n            keys.push(param.name || null);\n        });\n\n        return Result.fromItems(values, keys);\n    }\n\n    /**\n     *  Parses a transaction, finding the matching function and extracts\n     *  the parameter values along with other useful function details.\n     *\n     *  If the matching function cannot be found, return null.\n     */\n    parseTransaction(tx: { data: string, value?: BigNumberish }): null | TransactionDescription {\n        const data = getBytes(tx.data, \"tx.data\");\n        const value = getBigInt((tx.value != null) ? tx.value: 0, \"tx.value\");\n\n        const fragment = this.getFunction(hexlify(data.slice(0, 4)));\n\n        if (!fragment) { return null; }\n\n        const args = this.#abiCoder.decode(fragment.inputs, data.slice(4));\n        return new TransactionDescription(fragment, fragment.selector, args, value);\n    }\n\n    parseCallResult(data: BytesLike): Result {\n        throw new Error(\"@TODO\");\n    }\n\n    /**\n     *  Parses a receipt log, finding the matching event and extracts\n     *  the parameter values along with other useful event details.\n     *\n     *  If the matching event cannot be found, returns null.\n     */\n    parseLog(log: { topics: ReadonlyArray<string>, data: string}): null | LogDescription {\n        const fragment = this.getEvent(log.topics[0]);\n\n        if (!fragment || fragment.anonymous) { return null; }\n\n        // @TODO: If anonymous, and the only method, and the input count matches, should we parse?\n        //        Probably not, because just because it is the only event in the ABI does\n        //        not mean we have the full ABI; maybe just a fragment?\n\n\n       return new LogDescription(fragment, fragment.topicHash, this.decodeEventLog(fragment, log.data, log.topics));\n    }\n\n    /**\n     *  Parses a revert data, finding the matching error and extracts\n     *  the parameter values along with other useful error details.\n     *\n     *  If the matching error cannot be found, returns null.\n     */\n    parseError(data: BytesLike): null | ErrorDescription {\n        const hexData = hexlify(data);\n\n        const fragment = this.getError(dataSlice(hexData, 0, 4));\n\n        if (!fragment) { return null; }\n\n        const args = this.#abiCoder.decode(fragment.inputs, dataSlice(hexData, 4));\n        return new ErrorDescription(fragment, fragment.selector, args);\n    }\n\n    /**\n     *  Creates a new [[Interface]] from the ABI %%value%%.\n     *\n     *  The %%value%% may be provided as an existing [[Interface]] object,\n     *  a JSON-encoded ABI or any Human-Readable ABI format.\n     */\n    static from(value: InterfaceAbi | Interface): Interface {\n        // Already an Interface, which is immutable\n        if (value instanceof Interface) { return value; }\n\n        // JSON\n        if (typeof(value) === \"string\") { return new Interface(JSON.parse(value)); }\n\n        // An Interface; possibly from another v6 instance\n        if (typeof((<any>value).formatJson) === \"function\") {\n            return new Interface((<any>value).formatJson());\n        }\n\n        // A legacy Interface; from an older version\n        if (typeof((<any>value).format) === \"function\") {\n            return new Interface((<any>value).format(\"json\"));\n        }\n\n        // Array of fragments\n        return new Interface(value);\n    }\n}\n","//import { resolveAddress } from \"@ethersproject/address\";\nimport {\n    defineProperties, getBigInt, getNumber, hexlify, isBytesLike,\n    resolveProperties,\n    assert, assertArgument, isError, makeError\n} from \"../utils/index.js\";\nimport { accessListify } from \"../transaction/index.js\";\n\nimport type { AddressLike, NameResolver } from \"../address/index.js\";\nimport type { BigNumberish, EventEmitterable } from \"../utils/index.js\";\nimport type { Signature } from \"../crypto/index.js\";\nimport type {\n    AccessList, AccessListish, Authorization, AuthorizationLike, BlobLike,\n    KzgLibraryLike, TransactionLike\n} from \"../transaction/index.js\";\n\nimport type { ContractRunner } from \"./contracts.js\";\nimport type { Network } from \"./network.js\";\n\n\nconst BN_0 = BigInt(0);\n\n/**\n *  A **BlockTag** specifies a specific block.\n *\n *  **numeric value** - specifies the block height, where\n *  the genesis block is block 0; many operations accept a negative\n *  value which indicates the block number should be deducted from\n *  the most recent block. A numeric value may be a ``number``, ``bigint``,\n *  or a decimal of hex string.\n *\n *  **blockhash** - specifies a specific block by its blockhash; this allows\n *  potentially orphaned blocks to be specifed, without ambiguity, but many\n *  backends do not support this for some operations.\n */\nexport type BlockTag = BigNumberish | string;\n\nimport {\n    BlockParams, LogParams, TransactionReceiptParams,\n    TransactionResponseParams\n} from \"./formatting.js\";\n\n// -----------------------\n\nfunction getValue<T>(value: undefined | null | T): null | T {\n    if (value == null) { return null; }\n    return value;\n}\n\nfunction toJson(value: null | bigint): null | string {\n    if (value == null) { return null; }\n    return value.toString();\n}\n\n// @TODO? <T extends FeeData = { }> implements Required<T>\n\n/**\n *  A **FeeData** wraps all the fee-related values associated with\n *  the network.\n */\nexport class FeeData {\n    /**\n     *  The gas price for legacy networks.\n     */\n    readonly gasPrice!: null | bigint;\n\n    /**\n     *  The maximum fee to pay per gas.\n     *\n     *  The base fee per gas is defined by the network and based on\n     *  congestion, increasing the cost during times of heavy load\n     *  and lowering when less busy.\n     *\n     *  The actual fee per gas will be the base fee for the block\n     *  and the priority fee, up to the max fee per gas.\n     *\n     *  This will be ``null`` on legacy networks (i.e. [pre-EIP-1559](link-eip-1559))\n     */\n    readonly maxFeePerGas!: null | bigint;\n\n    /**\n     *  The additional amout to pay per gas to encourage a validator\n     *  to include the transaction.\n     *\n     *  The purpose of this is to compensate the validator for the\n     *  adjusted risk for including a given transaction.\n     *\n     *  This will be ``null`` on legacy networks (i.e. [pre-EIP-1559](link-eip-1559))\n     */\n    readonly maxPriorityFeePerGas!: null | bigint;\n\n    /**\n     *  Creates a new FeeData for %%gasPrice%%, %%maxFeePerGas%% and\n     *  %%maxPriorityFeePerGas%%.\n     */\n    constructor(gasPrice?: null | bigint, maxFeePerGas?: null | bigint, maxPriorityFeePerGas?: null | bigint) {\n        defineProperties<FeeData>(this, {\n            gasPrice: getValue(gasPrice),\n            maxFeePerGas: getValue(maxFeePerGas),\n            maxPriorityFeePerGas: getValue(maxPriorityFeePerGas)\n        });\n    }\n\n    /**\n     *  Returns a JSON-friendly value.\n     */\n    toJSON(): any {\n        const {\n            gasPrice, maxFeePerGas, maxPriorityFeePerGas\n        } = this;\n        return {\n            _type: \"FeeData\",\n            gasPrice: toJson(gasPrice),\n            maxFeePerGas: toJson(maxFeePerGas),\n            maxPriorityFeePerGas: toJson(maxPriorityFeePerGas),\n        };\n    }\n}\n\n\n/**\n *  A **TransactionRequest** is a transactions with potentially various\n *  properties not defined, or with less strict types for its values.\n *\n *  This is used to pass to various operations, which will internally\n *  coerce any types and populate any necessary values.\n */\nexport interface TransactionRequest {\n    /**\n     *  The transaction type.\n     */\n    type?: null | number;\n\n    /**\n     *  The target of the transaction.\n     */\n    to?: null | AddressLike;\n\n    /**\n     *  The sender of the transaction.\n     */\n    from?: null | AddressLike;\n\n    /**\n     *  The nonce of the transaction, used to prevent replay attacks.\n     */\n    nonce?: null | number;\n\n    /**\n     *  The maximum amount of gas to allow this transaction to consume.\n     */\n    gasLimit?: null | BigNumberish;\n\n    /**\n     *  The gas price to use for legacy transactions or transactions on\n     *  legacy networks.\n     *\n     *  Most of the time the ``max*FeePerGas`` is preferred.\n     */\n    gasPrice?: null | BigNumberish;\n\n    /**\n     *  The [[link-eip-1559]] maximum priority fee to pay per gas.\n     */\n    maxPriorityFeePerGas?: null | BigNumberish;\n\n    /**\n     *  The [[link-eip-1559]] maximum total fee to pay per gas. The actual\n     *  value used is protocol enforced to be the block's base fee.\n     */\n    maxFeePerGas?: null | BigNumberish;\n\n    /**\n     *  The transaction data.\n     */\n    data?: null | string;\n\n    /**\n     *  The transaction value (in wei).\n     */\n    value?: null | BigNumberish;\n\n    /**\n     *  The chain ID for the network this transaction is valid on.\n     */\n    chainId?: null | BigNumberish;\n\n    /**\n     *  The [[link-eip-2930]] access list. Storage slots included in the access\n     *  list are //warmed// by pre-loading them, so their initial cost to\n     *  fetch is guaranteed, but then each additional access is cheaper.\n     */\n    accessList?: null | AccessListish;\n\n    /**\n     *  A custom object, which can be passed along for network-specific\n     *  values.\n     */\n    customData?: any;\n\n    // Only meaningful when used for call\n\n    /**\n     *  When using ``call`` or ``estimateGas``, this allows a specific\n     *  block to be queried. Many backends do not support this and when\n     *  unsupported errors are silently squelched and ``\"latest\"`` is used. \n     */\n    blockTag?: BlockTag;\n\n    /**\n     *  When using ``call``, this enables CCIP-read, which permits the\n     *  provider to be redirected to web-based content during execution,\n     *  which is then further validated by the contract.\n     *\n     *  There are potential security implications allowing CCIP-read, as\n     *  it could be used to expose the IP address or user activity during\n     *  the fetch to unexpected parties.\n     */\n    enableCcipRead?: boolean;\n\n    /**\n     *  The blob versioned hashes (see [[link-eip-4844]]).\n     */\n    blobVersionedHashes?: null | Array<string>\n\n    /**\n     *  The maximum fee per blob gas (see [[link-eip-4844]]).\n     */\n    maxFeePerBlobGas?: null | BigNumberish;\n\n    /**\n     *  Any blobs to include in the transaction (see [[link-eip-4844]]).\n     */\n    blobs?: null | Array<BlobLike>;\n\n    /**\n     *  An external library for computing the KZG commitments and\n     *  proofs necessary for EIP-4844 transactions (see [[link-eip-4844]]).\n     *\n     *  This is generally ``null``, unless you are creating BLOb\n     *  transactions.\n     */\n    kzg?: null | KzgLibraryLike;\n\n    /**\n     *  The [[link-eip-7594]] BLOb Wrapper Version used for PeerDAS.\n     *\n     *  For networks that use EIP-7594, this property is required to\n     *  serialize the sidecar correctly.\n     */\n    blobWrapperVersion?: null | number;\n\n    /**\n     *  The [[link-eip-7702]] authorizations (if any).\n     */\n    authorizationList?: null | Array<AuthorizationLike>;\n\n    // Todo?\n    //gasMultiplier?: number;\n};\n\n/**\n *  A **PreparedTransactionRequest** is identical to a [[TransactionRequest]]\n *  except all the property types are strictly enforced.\n */\nexport interface PreparedTransactionRequest {\n    /**\n     *  The transaction type.\n     */\n    type?: number;\n\n\n    /**\n     *  The target of the transaction.\n     */\n    to?: AddressLike;\n\n    /**\n     *  The sender of the transaction.\n     */\n    from?: AddressLike;\n\n    /**\n     *  The nonce of the transaction, used to prevent replay attacks.\n     */\n\n    nonce?: number;\n\n    /**\n     *  The maximum amount of gas to allow this transaction to consume.\n     */\n    gasLimit?: bigint;\n\n    /**\n     *  The gas price to use for legacy transactions or transactions on\n     *  legacy networks.\n     *\n     *  Most of the time the ``max*FeePerGas`` is preferred.\n     */\n    gasPrice?: bigint;\n\n    /**\n     *  The [[link-eip-1559]] maximum priority fee to pay per gas.\n     */\n    maxPriorityFeePerGas?: bigint;\n\n    /**\n     *  The [[link-eip-1559]] maximum total fee to pay per gas. The actual\n     *  value used is protocol enforced to be the block's base fee.\n     */\n    maxFeePerGas?: bigint;\n\n    /**\n     *  The transaction data.\n     */\n    data?: string;\n\n\n    /**\n     *  The transaction value (in wei).\n     */\n    value?: bigint;\n\n    /**\n     *  The chain ID for the network this transaction is valid on.\n     */\n    chainId?: bigint;\n\n    /**\n     *  The [[link-eip-2930]] access list. Storage slots included in the access\n     *  list are //warmed// by pre-loading them, so their initial cost to\n     *  fetch is guaranteed, but then each additional access is cheaper.\n     */\n    accessList?: AccessList;\n\n    /**\n     *  The [[link-eip-7702]] authorizations (if any).\n     */\n    authorizationList?: Array<Authorization>;\n\n    /**\n     *  A custom object, which can be passed along for network-specific\n     *  values.\n     */\n    customData?: any;\n\n\n\n    /**\n     *  When using ``call`` or ``estimateGas``, this allows a specific\n     *  block to be queried. Many backends do not support this and when\n     *  unsupported errors are silently squelched and ``\"latest\"`` is used. \n     */\n    blockTag?: BlockTag;\n\n    /**\n     *  When using ``call``, this enables CCIP-read, which permits the\n     *  provider to be redirected to web-based content during execution,\n     *  which is then further validated by the contract.\n     *\n     *  There are potential security implications allowing CCIP-read, as\n     *  it could be used to expose the IP address or user activity during\n     *  the fetch to unexpected parties.\n     */\n    enableCcipRead?: boolean;\n}\n\n/**\n *  Returns a copy of %%req%% with all properties coerced to their strict\n *  types.\n */\nexport function copyRequest(req: TransactionRequest): PreparedTransactionRequest {\n    const result: any = { };\n\n    // These could be addresses, ENS names or Addressables\n    if (req.to) { result.to = req.to; }\n    if (req.from) { result.from = req.from; }\n\n    if (req.data) { result.data = hexlify(req.data); }\n\n    const bigIntKeys = \"chainId,gasLimit,gasPrice,maxFeePerBlobGas,maxFeePerGas,maxPriorityFeePerGas,value\".split(/,/);\n    for (const key of bigIntKeys) {\n        if (!(key in req) || (<any>req)[key] == null) { continue; }\n        result[key] = getBigInt((<any>req)[key], `request.${ key }`);\n    }\n\n    const numberKeys = \"type,nonce\".split(/,/);\n    for (const key of numberKeys) {\n        if (!(key in req) || (<any>req)[key] == null) { continue; }\n        result[key] = getNumber((<any>req)[key], `request.${ key }`);\n    }\n\n    if (req.accessList) {\n        result.accessList = accessListify(req.accessList);\n    }\n\n    if (req.authorizationList) {\n        result.authorizationList = req.authorizationList.slice();\n    }\n\n    if (\"blockTag\" in req) { result.blockTag = req.blockTag; }\n\n    if (\"enableCcipRead\" in req) {\n        result.enableCcipRead = !!req.enableCcipRead\n    }\n\n    if (\"customData\" in req) {\n        result.customData = req.customData;\n    }\n\n    if (\"blobVersionedHashes\" in req && req.blobVersionedHashes) {\n        result.blobVersionedHashes = req.blobVersionedHashes.slice();\n    }\n\n    if (\"kzg\" in req) { result.kzg = req.kzg; }\n\n    if (\"blobWrapperVersion\" in req) { result.blobWrapperVersion = req.blobWrapperVersion; }\n\n    if (\"blobs\" in req && req.blobs) {\n        result.blobs = req.blobs.map((b) => {\n            if (isBytesLike(b)) { return hexlify(b); }\n            return Object.assign({ }, b);\n        });\n    }\n\n    return result;\n}\n\n//////////////////////\n// Block\n\n/**\n *  An Interface to indicate a [[Block]] has been included in the\n *  blockchain. This asserts a Type Guard that necessary properties\n *  are non-null.\n *\n *  Before a block is included, it is a //pending// block.\n */\nexport interface MinedBlock extends Block {\n    /**\n     *  The block number also known as the block height.\n     */\n    readonly number: number;\n\n    /**\n     *  The block hash.\n     */\n    readonly hash: string;\n\n    /**\n     *  The block timestamp, in seconds from epoch.\n     */\n    readonly timestamp: number;\n\n    /**\n     *  The block date, created from the [[timestamp]].\n     */\n    readonly date: Date;\n\n    /**\n     *  The miner of the block, also known as the ``author`` or\n     *  block ``producer``.\n     */\n    readonly miner: string;\n}\n\n/**\n *  A **Block** represents the data associated with a full block on\n *  Ethereum.\n */\nexport class Block implements BlockParams, Iterable<string> {\n\n    /**\n     *  The provider connected to the block used to fetch additional details\n     *  if necessary.\n     */\n    readonly provider!: Provider;\n\n    /**\n     *  The block number, sometimes called the block height. This is a\n     *  sequential number that is one higher than the parent block.\n     */\n    readonly number!: number;\n\n    /**\n     *  The block hash.\n     *\n     *  This hash includes all properties, so can be safely used to identify\n     *  an exact set of block properties.\n     */\n    readonly hash!: null | string;\n\n    /**\n     *  The timestamp for this block, which is the number of seconds since\n     *  epoch that this block was included.\n     */\n    readonly timestamp!: number;\n\n    /**\n     *  The block hash of the parent block.\n     */\n    readonly parentHash!: string;\n\n    /**\n     *  The hash tree root of the parent beacon block for the given\n     *  execution block. See [[link-eip-4788]].\n     */\n    parentBeaconBlockRoot!: null | string;\n\n    /**\n     *  The nonce.\n     *\n     *  On legacy networks, this is the random number inserted which\n     *  permitted the difficulty target to be reached.\n     */\n    readonly nonce!: string;\n\n    /**\n     *  The difficulty target.\n     *\n     *  On legacy networks, this is the proof-of-work target required\n     *  for a block to meet the protocol rules to be included.\n     *\n     *  On modern networks, this is a random number arrived at using\n     *  randao.  @TODO: Find links?\n     */\n    readonly difficulty!: bigint;\n\n\n    /**\n     *  The total gas limit for this block.\n     */\n    readonly gasLimit!: bigint;\n\n    /**\n     *  The total gas used in this block.\n     */\n    readonly gasUsed!: bigint;\n\n\n    /**\n     *  The root hash for the global state after applying changes\n     *  in this block.\n     */\n    readonly stateRoot!: null | string;\n\n    /**\n     *  The hash of the transaction receipts trie.\n     */\n    readonly receiptsRoot!: null | string;\n\n    /**\n     *  The total amount of blob gas consumed by the transactions\n     *  within the block. See [[link-eip-4844]].\n     */\n    readonly blobGasUsed!: null | bigint;\n\n    /**\n     *  The running total of blob gas consumed in excess of the\n     *  target, prior to the block. See [[link-eip-4844]].\n     */\n    readonly excessBlobGas!: null | bigint;\n\n    /**\n     *  The miner coinbase address, wihch receives any subsidies for\n     *  including this block.\n     */\n    readonly miner!: string;\n\n    /**\n     *  The latest RANDAO mix of the post beacon state of\n     *  the previous block.\n     */\n    readonly prevRandao!: null | string;\n\n    /**\n     *  Any extra data the validator wished to include.\n     */\n    readonly extraData!: string;\n\n    /**\n     *  The base fee per gas that all transactions in this block were\n     *  charged.\n     *\n     *  This adjusts after each block, depending on how congested the network\n     *  is.\n     */\n    readonly baseFeePerGas!: null | bigint;\n\n    readonly #transactions: Array<string | TransactionResponse>;\n\n    /**\n     *  Create a new **Block** object.\n     *\n     *  This should generally not be necessary as the unless implementing a\n     *  low-level library.\n     */\n    constructor(block: BlockParams, provider: Provider) {\n\n        this.#transactions = block.transactions.map((tx) => {\n            if (typeof(tx) !== \"string\") {\n                return new TransactionResponse(tx, provider);\n            }\n            return tx;\n        });\n\n        defineProperties<Block>(this, {\n            provider,\n\n            hash: getValue(block.hash),\n\n            number: block.number,\n            timestamp: block.timestamp,\n\n            parentHash: block.parentHash,\n            parentBeaconBlockRoot: block.parentBeaconBlockRoot,\n\n            nonce: block.nonce,\n            difficulty: block.difficulty,\n\n            gasLimit: block.gasLimit,\n            gasUsed: block.gasUsed,\n            blobGasUsed: block.blobGasUsed,\n            excessBlobGas: block.excessBlobGas,\n            miner: block.miner,\n            prevRandao: getValue(block.prevRandao),\n            extraData: block.extraData,\n\n            baseFeePerGas: getValue(block.baseFeePerGas),\n\n            stateRoot: block.stateRoot,\n            receiptsRoot: block.receiptsRoot,\n        });\n    }\n\n    /**\n     *  Returns the list of transaction hashes, in the order\n     *  they were executed within the block.\n     */\n    get transactions(): ReadonlyArray<string> {\n        return this.#transactions.map((tx) => {\n            if (typeof(tx) === \"string\") { return tx; }\n            return tx.hash;\n        });\n    }\n\n    /**\n     *  Returns the complete transactions, in the order they\n     *  were executed within the block.\n     *\n     *  This is only available for blocks which prefetched\n     *  transactions, by passing ``true`` to %%prefetchTxs%%\n     *  into [[Provider-getBlock]].\n     */\n    get prefetchedTransactions(): Array<TransactionResponse> {\n        const txs = this.#transactions.slice();\n\n        // Doesn't matter...\n        if (txs.length === 0) { return [ ]; }\n\n        // Make sure we prefetched the transactions\n        assert(typeof(txs[0]) === \"object\", \"transactions were not prefetched with block request\", \"UNSUPPORTED_OPERATION\", {\n            operation: \"transactionResponses()\"\n        });\n\n        return <Array<TransactionResponse>>txs;\n    }\n\n    /**\n     *  Returns a JSON-friendly value.\n     */\n    toJSON(): any {\n        const {\n            baseFeePerGas, difficulty, extraData, gasLimit, gasUsed, hash,\n            miner, prevRandao, nonce, number, parentHash, parentBeaconBlockRoot,\n            stateRoot, receiptsRoot, timestamp, transactions\n        } = this;\n\n        return {\n            _type: \"Block\",\n            baseFeePerGas: toJson(baseFeePerGas),\n            difficulty: toJson(difficulty),\n            extraData,\n            gasLimit: toJson(gasLimit),\n            gasUsed: toJson(gasUsed),\n            blobGasUsed: toJson(this.blobGasUsed),\n            excessBlobGas: toJson(this.excessBlobGas),\n            hash, miner, prevRandao, nonce, number, parentHash, timestamp,\n            parentBeaconBlockRoot, stateRoot, receiptsRoot,\n            transactions,\n        };\n    }\n\n    [Symbol.iterator](): Iterator<string> {\n        let index = 0;\n        const txs = this.transactions;\n        return {\n            next: () => {\n                if (index < this.length) {\n                    return {\n                        value: txs[index++], done: false\n                    }\n                }\n                return { value: undefined, done: true };\n            }\n        };\n    }\n\n    /**\n     *  The number of transactions in this block.\n     */\n    get length(): number { return this.#transactions.length; }\n\n    /**\n     *  The [[link-js-date]] this block was included at.\n     */\n    get date(): null | Date {\n        if (this.timestamp == null) { return null; }\n        return new Date(this.timestamp * 1000);\n    }\n\n    /**\n     *  Get the transaction at %%indexe%% within this block.\n     */\n    async getTransaction(indexOrHash: number | string): Promise<TransactionResponse> {\n        // Find the internal value by its index or hash\n        let tx: string | TransactionResponse | undefined = undefined;\n        if (typeof(indexOrHash) === \"number\") {\n            tx = this.#transactions[indexOrHash];\n\n        } else {\n            const hash = indexOrHash.toLowerCase();\n            for (const v of this.#transactions) {\n                if (typeof(v) === \"string\") {\n                    if (v !== hash) { continue; }\n                    tx = v;\n                    break;\n                } else {\n                    if (v.hash !== hash) { continue; }\n                    tx = v;\n                    break;\n                }\n            }\n        }\n        if (tx == null) { throw new Error(\"no such tx\"); }\n\n        if (typeof(tx) === \"string\") {\n            return <TransactionResponse>(await this.provider.getTransaction(tx));\n        } else {\n            return tx;\n        }\n    }\n\n    /**\n     *  If a **Block** was fetched with a request to include the transactions\n     *  this will allow synchronous access to those transactions.\n     *\n     *  If the transactions were not prefetched, this will throw.\n     */\n    getPrefetchedTransaction(indexOrHash: number | string): TransactionResponse {\n        const txs = this.prefetchedTransactions;\n        if (typeof(indexOrHash) === \"number\") {\n            return txs[indexOrHash];\n        }\n\n        indexOrHash = indexOrHash.toLowerCase();\n        for (const tx of txs) {\n            if (tx.hash === indexOrHash) { return tx; }\n        }\n\n        assertArgument(false, \"no matching transaction\", \"indexOrHash\", indexOrHash);\n    }\n\n    /**\n     *  Returns true if this block been mined. This provides a type guard\n     *  for all properties on a [[MinedBlock]].\n     */\n    isMined(): this is MinedBlock { return !!this.hash; }\n\n    /**\n     *  Returns true if this block is an [[link-eip-2930]] block.\n     */\n    isLondon(): this is (Block & { baseFeePerGas: bigint }) {\n        return !!this.baseFeePerGas;\n    }\n\n    /**\n     *  @_ignore:\n     */\n    orphanedEvent(): OrphanFilter {\n        if (!this.isMined()) { throw new Error(\"\"); }\n        return createOrphanedBlockFilter(this);\n    }\n}\n\n//////////////////////\n// Log\n\n/**\n *  A **Log** in Ethereum represents an event that has been included in a\n *  transaction using the ``LOG*`` opcodes, which are most commonly used by\n *  Solidity's emit for announcing events.\n */\nexport class Log implements LogParams {\n\n    /**\n     *  The provider connected to the log used to fetch additional details\n     *  if necessary.\n     */\n    readonly provider: Provider;\n\n    /**\n     *  The transaction hash of the transaction this log occurred in. Use the\n     *  [[Log-getTransaction]] to get the [[TransactionResponse]].\n     */\n    readonly transactionHash!: string;\n\n    /**\n     *  The block hash of the block this log occurred in. Use the\n     *  [[Log-getBlock]] to get the [[Block]].\n     */\n    readonly blockHash!: string;\n\n    /**\n     *  The block number of the block this log occurred in. It is preferred\n     *  to use the [[Block-hash]] when fetching the related [[Block]],\n     *  since in the case of an orphaned block, the block at that height may\n     *  have changed.\n     */\n    readonly blockNumber!: number;\n\n    /**\n     *  If the **Log** represents a block that was removed due to an orphaned\n     *  block, this will be true.\n     *\n     *  This can only happen within an orphan event listener.\n     */\n    readonly removed!: boolean;\n\n    /**\n     *  The address of the contract that emitted this log.\n     */\n    readonly address!: string;\n\n    /**\n     *  The data included in this log when it was emitted.\n     */\n    readonly data!: string;\n\n    /**\n     *  The indexed topics included in this log when it was emitted.\n     *\n     *  All topics are included in the bloom filters, so they can be\n     *  efficiently filtered using the [[Provider-getLogs]] method.\n     */\n    readonly topics!: ReadonlyArray<string>;\n\n    /**\n     *  The index within the block this log occurred at. This is generally\n     *  not useful to developers, but can be used with the various roots\n     *  to proof inclusion within a block.\n     */\n    readonly index!: number;\n\n    /**\n     *  The index within the transaction of this log.\n     */\n    readonly transactionIndex!: number;\n\n    /**\n     *  @_ignore:\n     */\n    constructor(log: LogParams, provider: Provider) {\n        this.provider = provider;\n\n        const topics = Object.freeze(log.topics.slice());\n        defineProperties<Log>(this, {\n            transactionHash: log.transactionHash,\n            blockHash: log.blockHash,\n            blockNumber: log.blockNumber,\n\n            removed: log.removed,\n\n            address: log.address,\n            data: log.data,\n\n            topics,\n\n            index: log.index,\n            transactionIndex: log.transactionIndex,\n        });\n    }\n\n    /**\n     *  Returns a JSON-compatible object.\n     */\n    toJSON(): any {\n        const {\n            address, blockHash, blockNumber, data, index,\n            removed, topics, transactionHash, transactionIndex\n        } = this;\n\n        return {\n            _type: \"log\",\n            address, blockHash, blockNumber, data, index,\n            removed, topics, transactionHash, transactionIndex\n        };\n    }\n\n    /**\n     *  Returns the block that this log occurred in.\n     */\n    async getBlock(): Promise<Block> {\n        const block = await this.provider.getBlock(this.blockHash);\n        assert(!!block, \"failed to find transaction\", \"UNKNOWN_ERROR\", { });\n        return block;\n    }\n\n    /**\n     *  Returns the transaction that this log occurred in.\n     */\n    async getTransaction(): Promise<TransactionResponse> {\n        const tx = await this.provider.getTransaction(this.transactionHash);\n        assert(!!tx, \"failed to find transaction\", \"UNKNOWN_ERROR\", { });\n        return tx;\n    }\n\n    /**\n     *  Returns the transaction receipt fot the transaction that this\n     *  log occurred in.\n     */\n    async getTransactionReceipt(): Promise<TransactionReceipt> {\n        const receipt = await this.provider.getTransactionReceipt(this.transactionHash);\n        assert(!!receipt, \"failed to find transaction receipt\", \"UNKNOWN_ERROR\", { });\n        return receipt;\n    }\n\n    /**\n     *  @_ignore:\n     */\n    removedEvent(): OrphanFilter {\n        return createRemovedLogFilter(this);\n    }\n}\n\n//////////////////////\n// Transaction Receipt\n\n/*\nexport interface LegacyTransactionReceipt {\n    byzantium: false;\n    status: null;\n    root: string;\n}\n\nexport interface ByzantiumTransactionReceipt {\n    byzantium: true;\n    status: number;\n    root: null;\n}\n*/\n\n/**\n *  A **TransactionReceipt** includes additional information about a\n *  transaction that is only available after it has been mined.\n */\nexport class TransactionReceipt implements TransactionReceiptParams, Iterable<Log> {\n    /**\n     *  The provider connected to the log used to fetch additional details\n     *  if necessary.\n     */\n    readonly provider!: Provider;\n\n    /**\n     *  The address the transaction was sent to.\n     */\n    readonly to!: null | string;\n\n    /**\n     *  The sender of the transaction.\n     */\n    readonly from!: string;\n\n    /**\n     *  The address of the contract if the transaction was directly\n     *  responsible for deploying one.\n     *\n     *  This is non-null **only** if the ``to`` is empty and the ``data``\n     *  was successfully executed as initcode.\n     */\n    readonly contractAddress!: null | string;\n\n    /**\n     *  The transaction hash.\n     */\n    readonly hash!: string;\n\n    /**\n     *  The index of this transaction within the block transactions.\n     */\n    readonly index!: number;\n\n    /**\n     *  The block hash of the [[Block]] this transaction was included in.\n     */\n    readonly blockHash!: string;\n\n    /**\n     *  The block number of the [[Block]] this transaction was included in.\n     */\n    readonly blockNumber!: number;\n\n    /**\n     *  The bloom filter bytes that represent all logs that occurred within\n     *  this transaction. This is generally not useful for most developers,\n     *  but can be used to validate the included logs.\n     */\n    readonly logsBloom!: string;\n\n    /**\n     *  The actual amount of gas used by this transaction.\n     *\n     *  When creating a transaction, the amount of gas that will be used can\n     *  only be approximated, but the sender must pay the gas fee for the\n     *  entire gas limit. After the transaction, the difference is refunded.\n     */\n    readonly gasUsed!: bigint;\n\n    /**\n     *  The gas used for BLObs. See [[link-eip-4844]].\n     */\n    readonly blobGasUsed!: null | bigint;\n\n    /**\n     *  The amount of gas used by all transactions within the block for this\n     *  and all transactions with a lower ``index``.\n     *\n     *  This is generally not useful for developers but can be used to\n     *  validate certain aspects of execution.\n     */\n    readonly cumulativeGasUsed!: bigint;\n\n    /**\n     *  The actual gas price used during execution.\n     *\n     *  Due to the complexity of [[link-eip-1559]] this value can only\n     *  be caluclated after the transaction has been mined, snce the base\n     *  fee is protocol-enforced.\n     */\n    readonly gasPrice!: bigint;\n\n    /**\n     *  The price paid per BLOB in gas. See [[link-eip-4844]].\n     */\n    readonly blobGasPrice!: null | bigint;\n\n    /**\n     *  The [[link-eip-2718]] transaction type.\n     */\n    readonly type!: number;\n    //readonly byzantium!: boolean;\n\n    /**\n     *  The status of this transaction, indicating success (i.e. ``1``) or\n     *  a revert (i.e. ``0``).\n     *\n     *  This is available in post-byzantium blocks, but some backends may\n     *  backfill this value.\n     */\n    readonly status!: null | number;\n\n    /**\n     *  The root hash of this transaction.\n     *\n     *  This is no present and was only included in pre-byzantium blocks, but\n     *  could be used to validate certain parts of the receipt.\n     */\n    readonly root!: null | string;\n\n    readonly #logs: ReadonlyArray<Log>;\n\n    /**\n     *  @_ignore:\n     */\n    constructor(tx: TransactionReceiptParams, provider: Provider) {\n        this.#logs = Object.freeze(tx.logs.map((log) => {\n            return new Log(log, provider);\n        }));\n\n        let gasPrice = BN_0;\n        if (tx.effectiveGasPrice != null) {\n            gasPrice = tx.effectiveGasPrice;\n        } else if (tx.gasPrice != null) {\n            gasPrice = tx.gasPrice;\n        }\n\n        defineProperties<TransactionReceipt>(this, {\n            provider,\n\n            to: tx.to,\n            from: tx.from,\n            contractAddress: tx.contractAddress,\n\n            hash: tx.hash,\n            index: tx.index,\n\n            blockHash: tx.blockHash,\n            blockNumber: tx.blockNumber,\n\n            logsBloom: tx.logsBloom,\n\n            gasUsed: tx.gasUsed,\n            cumulativeGasUsed: tx.cumulativeGasUsed,\n            blobGasUsed: tx.blobGasUsed,\n            gasPrice,\n            blobGasPrice: tx.blobGasPrice,\n\n            type: tx.type,\n            //byzantium: tx.byzantium,\n            status: tx.status,\n            root: tx.root\n        });\n    }\n\n    /**\n     *  The logs for this transaction.\n     */\n    get logs(): ReadonlyArray<Log> { return this.#logs; }\n\n    /**\n     *  Returns a JSON-compatible representation.\n     */\n    toJSON(): any {\n        const {\n            to, from, contractAddress, hash, index,\n            blockHash, blockNumber, logsBloom,\n            logs, //byzantium, \n            status, root\n        } = this;\n\n        return {\n            _type: \"TransactionReceipt\",\n            blockHash, blockNumber,\n            //byzantium, \n            contractAddress,\n            cumulativeGasUsed: toJson(this.cumulativeGasUsed),\n            from,\n            gasPrice: toJson(this.gasPrice),\n            blobGasUsed: toJson(this.blobGasUsed),\n            blobGasPrice: toJson(this.blobGasPrice),\n            gasUsed: toJson(this.gasUsed),\n            hash, index, logs, logsBloom, root, status, to\n        };\n    }\n\n    /**\n     *  @_ignore:\n     */\n    get length(): number { return this.logs.length; }\n\n    [Symbol.iterator](): Iterator<Log> {\n        let index = 0;\n        return {\n            next: () => {\n                if (index < this.length) {\n                    return { value: this.logs[index++], done: false }\n                }\n                return { value: undefined, done: true };\n            }\n        };\n    }\n\n    /**\n     *  The total fee for this transaction, in wei.\n     */\n    get fee(): bigint {\n        return this.gasUsed * this.gasPrice;\n    }\n\n    /**\n     *  Resolves to the block this transaction occurred in.\n     */\n    async getBlock(): Promise<Block> {\n        const block = await this.provider.getBlock(this.blockHash);\n        if (block == null) { throw new Error(\"TODO\"); }\n        return block;\n    }\n\n    /**\n     *  Resolves to the transaction this transaction occurred in.\n     */\n    async getTransaction(): Promise<TransactionResponse> {\n        const tx = await this.provider.getTransaction(this.hash);\n        if (tx == null) { throw new Error(\"TODO\"); }\n        return tx;\n    }\n\n    /**\n     *  Resolves to the return value of the execution of this transaction.\n     *\n     *  Support for this feature is limited, as it requires an archive node\n     *  with the ``debug_`` or ``trace_`` API enabled.\n     */\n    async getResult(): Promise<string> {\n        return <string>(await this.provider.getTransactionResult(this.hash));\n    }\n\n    /**\n     *  Resolves to the number of confirmations this transaction has.\n     */\n    async confirmations(): Promise<number> {\n        return (await this.provider.getBlockNumber()) - this.blockNumber + 1;\n    }\n\n    /**\n     *  @_ignore:\n     */\n    removedEvent(): OrphanFilter {\n        return createRemovedTransactionFilter(this);\n    }\n\n    /**\n     *  @_ignore:\n     */\n    reorderedEvent(other?: TransactionResponse): OrphanFilter {\n        assert(!other || other.isMined(), \"unmined 'other' transction cannot be orphaned\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"reorderedEvent(other)\" });\n        return createReorderedTransactionFilter(this, other);\n    }\n}\n\n\n//////////////////////\n// Transaction Response\n\n/**\n *  A **MinedTransactionResponse** is an interface representing a\n *  transaction which has been mined and allows for a type guard for its\n *  property values being defined.\n */\nexport interface MinedTransactionResponse extends TransactionResponse {\n    /**\n     *  The block number this transaction occurred in.\n     */\n    blockNumber: number;\n\n    /**\n     *  The block hash this transaction occurred in.\n     */\n    blockHash: string;\n\n    /**\n     *  The date this transaction occurred on.\n     */\n    date: Date;\n}\n\n\n/**\n *  A **TransactionResponse** includes all properties about a transaction\n *  that was sent to the network, which may or may not be included in a\n *  block.\n *\n *  The [[TransactionResponse-isMined]] can be used to check if the\n *  transaction has been mined as well as type guard that the otherwise\n *  possibly ``null`` properties are defined.\n */\nexport class TransactionResponse implements TransactionLike<string>, TransactionResponseParams {\n    /**\n     *  The provider this is connected to, which will influence how its\n     *  methods will resolve its async inspection methods.\n     */\n    readonly provider: Provider;\n\n    /**\n     *  The block number of the block that this transaction was included in.\n     *\n     *  This is ``null`` for pending transactions.\n     */\n    readonly blockNumber: null | number;\n\n    /**\n     *  The blockHash of the block that this transaction was included in.\n     *\n     *  This is ``null`` for pending transactions.\n     */\n    readonly blockHash: null | string;\n\n    /**\n     *  The index within the block that this transaction resides at.\n     */\n    readonly index!: number;\n\n    /**\n     *  The transaction hash.\n     */\n    readonly hash!: string;\n\n    /**\n     *  The [[link-eip-2718]] transaction envelope type. This is\n     *  ``0`` for legacy transactions types.\n     */\n    readonly type!: number;\n\n    /**\n     *  The receiver of this transaction.\n     *\n     *  If ``null``, then the transaction is an initcode transaction.\n     *  This means the result of executing the [[data]] will be deployed\n     *  as a new contract on chain (assuming it does not revert) and the\n     *  address may be computed using [[getCreateAddress]].\n     */\n    readonly to!: null | string;\n\n    /**\n     *  The sender of this transaction. It is implicitly computed\n     *  from the transaction pre-image hash (as the digest) and the\n     *  [[signature]] using ecrecover.\n     */\n    readonly from!: string;\n\n    /**\n     *  The nonce, which is used to prevent replay attacks and offer\n     *  a method to ensure transactions from a given sender are explicitly\n     *  ordered.\n     *\n     *  When sending a transaction, this must be equal to the number of\n     *  transactions ever sent by [[from]].\n     */\n    readonly nonce!: number;\n\n    /**\n     *  The maximum units of gas this transaction can consume. If execution\n     *  exceeds this, the entries transaction is reverted and the sender\n     *  is charged for the full amount, despite not state changes being made.\n     */\n    readonly gasLimit!: bigint;\n\n    /**\n     *  The gas price can have various values, depending on the network.\n     *\n     *  In modern networks, for transactions that are included this is\n     *  the //effective gas price// (the fee per gas that was actually\n     *  charged), while for transactions that have not been included yet\n     *  is the [[maxFeePerGas]].\n     *\n     *  For legacy transactions, or transactions on legacy networks, this\n     *  is the fee that will be charged per unit of gas the transaction\n     *  consumes.\n     */\n    readonly gasPrice!: bigint;\n\n    /**\n     *  The maximum priority fee (per unit of gas) to allow a\n     *  validator to charge the sender. This is inclusive of the\n     *  [[maxFeeFeePerGas]].\n     */\n    readonly maxPriorityFeePerGas!: null | bigint;\n\n    /**\n     *  The maximum fee (per unit of gas) to allow this transaction\n     *  to charge the sender.\n     */\n    readonly maxFeePerGas!: null | bigint;\n\n    /**\n     *  The [[link-eip-4844]] max fee per BLOb gas.\n     */\n    readonly maxFeePerBlobGas!: null | bigint;\n\n    /**\n     *  The data.\n     */\n    readonly data!: string;\n\n    /**\n     *  The value, in wei. Use [[formatEther]] to format this value\n     *  as ether.\n     */\n    readonly value!: bigint;\n\n    /**\n     *  The chain ID.\n     */\n    readonly chainId!: bigint;\n\n    /**\n     *  The signature.\n     */\n    readonly signature!: Signature;\n\n    /**\n     *  The [[link-eip-2930]] access list for transaction types that\n     *  support it, otherwise ``null``.\n     */\n    readonly accessList!: null | AccessList;\n\n    /**\n     *  The [[link-eip-4844]] BLOb versioned hashes.\n     */\n    readonly blobVersionedHashes!: null | Array<string>;\n\n    /**\n     *  The [[link-eip-7702]] authorizations (if any).\n     */\n    readonly authorizationList!: null | Array<Authorization>;\n\n    #startBlock: number;\n\n    /**\n     *  @_ignore:\n     */\n    constructor(tx: TransactionResponseParams, provider: Provider) {\n        this.provider = provider;\n\n        this.blockNumber = (tx.blockNumber != null) ? tx.blockNumber: null;\n        this.blockHash = (tx.blockHash != null) ? tx.blockHash: null;\n\n        this.hash = tx.hash;\n        this.index = tx.index;\n\n        this.type = tx.type;\n\n        this.from = tx.from;\n        this.to = tx.to || null;\n\n        this.gasLimit = tx.gasLimit;\n        this.nonce = tx.nonce;\n        this.data = tx.data;\n        this.value = tx.value;\n\n        this.gasPrice = tx.gasPrice;\n        this.maxPriorityFeePerGas = (tx.maxPriorityFeePerGas != null) ? tx.maxPriorityFeePerGas: null;\n        this.maxFeePerGas = (tx.maxFeePerGas != null) ? tx.maxFeePerGas: null;\n        this.maxFeePerBlobGas = (tx.maxFeePerBlobGas != null) ? tx.maxFeePerBlobGas: null;\n\n        this.chainId = tx.chainId;\n        this.signature = tx.signature;\n\n        this.accessList = (tx.accessList != null) ? tx.accessList: null;\n        this.blobVersionedHashes = (tx.blobVersionedHashes != null) ? tx.blobVersionedHashes: null;\n\n        this.authorizationList = (tx.authorizationList != null) ? tx.authorizationList: null;\n\n        this.#startBlock = -1;\n    }\n\n    /**\n     *  Returns a JSON-compatible representation of this transaction.\n     */\n    toJSON(): any {\n        const {\n            blockNumber, blockHash, index, hash, type, to, from, nonce,\n            data, signature, accessList, blobVersionedHashes\n        } = this;\n\n        return {\n            _type: \"TransactionResponse\",\n            accessList, blockNumber, blockHash,\n            blobVersionedHashes,\n            chainId: toJson(this.chainId),\n            data, from,\n            gasLimit: toJson(this.gasLimit),\n            gasPrice: toJson(this.gasPrice),\n            hash,\n            maxFeePerGas: toJson(this.maxFeePerGas),\n            maxPriorityFeePerGas: toJson(this.maxPriorityFeePerGas),\n            maxFeePerBlobGas: toJson(this.maxFeePerBlobGas),\n            nonce, signature, to, index, type,\n            value: toJson(this.value),\n        };\n    }\n\n    /**\n     *  Resolves to the Block that this transaction was included in.\n     *\n     *  This will return null if the transaction has not been included yet.\n     */\n    async getBlock(): Promise<null | Block> {\n        let blockNumber = this.blockNumber;\n        if (blockNumber == null) {\n            const tx = await this.getTransaction();\n            if (tx) { blockNumber = tx.blockNumber; }\n        }\n        if (blockNumber == null) { return null; }\n        const block = this.provider.getBlock(blockNumber);\n        if (block == null) { throw new Error(\"TODO\"); }\n        return block;\n    }\n\n    /**\n     *  Resolves to this transaction being re-requested from the\n     *  provider. This can be used if you have an unmined transaction\n     *  and wish to get an up-to-date populated instance.\n     */\n    async getTransaction(): Promise<null | TransactionResponse> {\n        return this.provider.getTransaction(this.hash);\n    }\n\n    /**\n     *  Resolve to the number of confirmations this transaction has.\n     */\n    async confirmations(): Promise<number> {\n        if (this.blockNumber == null) {\n            const { tx, blockNumber } = await resolveProperties({\n                tx: this.getTransaction(),\n                blockNumber: this.provider.getBlockNumber()\n            });\n\n            // Not mined yet...\n            if (tx == null || tx.blockNumber == null) { return 0; }\n\n            return blockNumber - tx.blockNumber + 1;\n        }\n\n        const blockNumber = await this.provider.getBlockNumber();\n        return blockNumber - this.blockNumber + 1;\n    }\n\n    /**\n     *  Resolves once this transaction has been mined and has\n     *  %%confirms%% blocks including it (default: ``1``) with an\n     *  optional %%timeout%%.\n     *\n     *  This can resolve to ``null`` only if %%confirms%% is ``0``\n     *  and the transaction has not been mined, otherwise this will\n     *  wait until enough confirmations have completed.\n     */\n    async wait(_confirms?: number, _timeout?: number): Promise<null | TransactionReceipt> {\n        const confirms = (_confirms == null) ? 1: _confirms;\n        const timeout = (_timeout == null) ? 0: _timeout;\n\n        let startBlock = this.#startBlock\n        let nextScan = -1;\n        let stopScanning = (startBlock === -1) ? true: false;\n        const checkReplacement = async () => {\n            // Get the current transaction count for this sender\n            if (stopScanning) { return null; }\n            const { blockNumber, nonce } = await resolveProperties({\n                blockNumber: this.provider.getBlockNumber(),\n                nonce: this.provider.getTransactionCount(this.from)\n            });\n\n            // No transaction or our nonce has not been mined yet; but we\n            // can start scanning later when we do start\n            if (nonce < this.nonce) {\n                startBlock = blockNumber;\n                return;\n            }\n\n            // We were mined; no replacement\n            if (stopScanning) { return null; }\n            const mined = await this.getTransaction();\n            if (mined && mined.blockNumber != null) { return; }\n\n            // We were replaced; start scanning for that transaction\n\n            // Starting to scan; look back a few extra blocks for safety\n            if (nextScan === -1) {\n                nextScan = startBlock - 3;\n                if (nextScan < this.#startBlock) { nextScan = this.#startBlock; }\n            }\n\n            while (nextScan <= blockNumber) {\n                // Get the next block to scan\n                if (stopScanning) { return null; }\n                const block = await this.provider.getBlock(nextScan, true);\n\n                // This should not happen; but we'll try again shortly\n                if (block == null) { return; }\n\n                // We were mined; no replacement\n                for (const hash of block) {\n                    if (hash === this.hash) { return; }\n                }\n\n                // Search for the transaction that replaced us\n                for (let i = 0; i < block.length; i++) {\n                    const tx: TransactionResponse = await block.getTransaction(i);\n\n                    if (tx.from === this.from && tx.nonce === this.nonce) {\n                        // Get the receipt\n                        if (stopScanning) { return null; }\n                        const receipt = await this.provider.getTransactionReceipt(tx.hash);\n\n                        // This should not happen; but we'll try again shortly\n                        if (receipt == null) { return; }\n\n                        // We will retry this on the next block (this case could be optimized)\n                        if ((blockNumber - receipt.blockNumber + 1) < confirms) { return; }\n\n                        // The reason we were replaced\n                        let reason: \"replaced\" | \"repriced\" | \"cancelled\" = \"replaced\";\n                        if (tx.data === this.data && tx.to === this.to && tx.value === this.value) {\n                            reason = \"repriced\";\n                        } else  if (tx.data === \"0x\" && tx.from === tx.to && tx.value === BN_0) {\n                            reason = \"cancelled\"\n                        }\n\n                        assert(false, \"transaction was replaced\", \"TRANSACTION_REPLACED\", {\n                            cancelled: (reason === \"replaced\" || reason === \"cancelled\"),\n                            reason,\n                            replacement: tx.replaceableTransaction(startBlock),\n                            hash: tx.hash,\n                            receipt\n                        });\n                    }\n                }\n\n                nextScan++;\n            }\n            return;\n        };\n\n        const checkReceipt = (receipt: null | TransactionReceipt) => {\n            if (receipt == null || receipt.status !== 0) { return receipt; }\n            assert(false, \"transaction execution reverted\", \"CALL_EXCEPTION\", {\n                action: \"sendTransaction\",\n                data: null, reason: null, invocation: null, revert: null,\n                transaction: {\n                    to: receipt.to,\n                    from: receipt.from,\n                    data: \"\" // @TODO: in v7, split out sendTransaction properties\n                }, receipt\n            });\n        };\n\n        const receipt = await this.provider.getTransactionReceipt(this.hash);\n\n        if (confirms === 0) { return checkReceipt(receipt); }\n\n        if (receipt) {\n            if (confirms === 1 || (await receipt.confirmations()) >= confirms) {\n                return checkReceipt(receipt);\n            }\n\n        } else {\n            // Check for a replacement; throws if a replacement was found\n            await checkReplacement();\n\n            // Allow null only when the confirms is 0\n            if (confirms === 0) { return null; }\n        }\n\n        const waiter = new Promise((resolve, reject) => {\n            // List of things to cancel when we have a result (one way or the other)\n            const cancellers: Array<() => void> = [ ];\n            const cancel = () => { cancellers.forEach((c) => c()); };\n\n            // On cancel, stop scanning for replacements\n            cancellers.push(() => { stopScanning = true; });\n\n            // Set up any timeout requested\n            if (timeout > 0) {\n                const timer = setTimeout(() => {\n                    cancel();\n                    reject(makeError(\"wait for transaction timeout\", \"TIMEOUT\"));\n                }, timeout);\n                cancellers.push(() => { clearTimeout(timer); });\n            }\n\n            const txListener = async (receipt: TransactionReceipt) => {\n                // Done; return it!\n                if ((await receipt.confirmations()) >= confirms) {\n                    cancel();\n                    try {\n                        resolve(checkReceipt(receipt));\n                    } catch (error) { reject(error); }\n                }\n            };\n            cancellers.push(() => { this.provider.off(this.hash, txListener); });\n            this.provider.on(this.hash, txListener);\n            // We support replacement detection; start checking\n            if (startBlock >= 0) {\n                const replaceListener = async () => {\n                    try {\n                        // Check for a replacement; this throws only if one is found\n                        await checkReplacement();\n\n                    } catch (error) {\n                        // We were replaced (with enough confirms); re-throw the error\n                        if (isError(error, \"TRANSACTION_REPLACED\")) {\n                            cancel();\n                            reject(error);\n                            return;\n                        }\n                    }\n\n                    // Rescheudle a check on the next block\n                    if (!stopScanning) {\n                        this.provider.once(\"block\", replaceListener);\n                    }\n                };\n                cancellers.push(() => { this.provider.off(\"block\", replaceListener); });\n                this.provider.once(\"block\", replaceListener);\n            }\n        });\n\n        return await <Promise<TransactionReceipt>>waiter;\n    }\n\n    /**\n     *  Returns ``true`` if this transaction has been included.\n     *\n     *  This is effective only as of the time the TransactionResponse\n     *  was instantiated. To get up-to-date information, use\n     *  [[getTransaction]].\n     *\n     *  This provides a Type Guard that this transaction will have\n     *  non-null property values for properties that are null for\n     *  unmined transactions.\n     */\n    isMined(): this is MinedTransactionResponse {\n        return (this.blockHash != null);\n    }\n\n    /**\n     *  Returns true if the transaction is a legacy (i.e. ``type == 0``)\n     *  transaction.\n     *\n     *  This provides a Type Guard that this transaction will have\n     *  the ``null``-ness for hardfork-specific properties set correctly.\n     */\n    isLegacy(): this is (TransactionResponse & { accessList: null, maxFeePerGas: null, maxPriorityFeePerGas: null }) {\n        return (this.type === 0)\n    }\n\n    /**\n     *  Returns true if the transaction is a Berlin (i.e. ``type == 1``)\n     *  transaction. See [[link-eip-2070]].\n     *\n     *  This provides a Type Guard that this transaction will have\n     *  the ``null``-ness for hardfork-specific properties set correctly.\n     */\n    isBerlin(): this is (TransactionResponse & { accessList: AccessList, maxFeePerGas: null, maxPriorityFeePerGas: null }) {\n        return (this.type === 1);\n    }\n\n    /**\n     *  Returns true if the transaction is a London (i.e. ``type == 2``)\n     *  transaction. See [[link-eip-1559]].\n     *\n     *  This provides a Type Guard that this transaction will have\n     *  the ``null``-ness for hardfork-specific properties set correctly.\n     */\n    isLondon(): this is (TransactionResponse & { accessList: AccessList, maxFeePerGas: bigint, maxPriorityFeePerGas: bigint }){\n        return (this.type === 2);\n    }\n\n    /**\n     *  Returns true if hte transaction is a Cancun (i.e. ``type == 3``)\n     *  transaction. See [[link-eip-4844]].\n     */\n    isCancun(): this is (TransactionResponse & { accessList: AccessList, maxFeePerGas: bigint, maxPriorityFeePerGas: bigint, maxFeePerBlobGas: bigint, blobVersionedHashes: Array<string> }){\n        return (this.type === 3);\n    }\n\n    /**\n     *  Returns a filter which can be used to listen for orphan events\n     *  that evict this transaction.\n     */\n    removedEvent(): OrphanFilter {\n        assert(this.isMined(), \"unmined transaction canot be orphaned\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"removeEvent()\" });\n        return createRemovedTransactionFilter(this);\n    }\n\n    /**\n     *  Returns a filter which can be used to listen for orphan events\n     *  that re-order this event against %%other%%.\n     */\n    reorderedEvent(other?: TransactionResponse): OrphanFilter {\n        assert(this.isMined(), \"unmined transaction canot be orphaned\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"removeEvent()\" });\n\n        assert(!other || other.isMined(), \"unmined 'other' transaction canot be orphaned\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"removeEvent()\" });\n\n        return createReorderedTransactionFilter(this, other);\n    }\n\n    /**\n     *  Returns a new TransactionResponse instance which has the ability to\n     *  detect (and throw an error) if the transaction is replaced, which\n     *  will begin scanning at %%startBlock%%.\n     *\n     *  This should generally not be used by developers and is intended\n     *  primarily for internal use. Setting an incorrect %%startBlock%% can\n     *  have devastating performance consequences if used incorrectly.\n     */\n    replaceableTransaction(startBlock: number): TransactionResponse {\n        assertArgument(Number.isInteger(startBlock) && startBlock >= 0, \"invalid startBlock\", \"startBlock\", startBlock);\n        const tx = new TransactionResponse(this, this.provider);\n        tx.#startBlock = startBlock;\n        return tx;\n    }\n}\n\n\n//////////////////////\n// OrphanFilter\n\n/**\n *  An Orphan Filter allows detecting when an orphan block has\n *  resulted in dropping a block or transaction or has resulted\n *  in transactions changing order.\n *\n *  Not currently fully supported.\n */\nexport type OrphanFilter = {\n    orphan: \"drop-block\",\n    hash: string,\n    number: number\n} | {\n    orphan: \"drop-transaction\",\n    tx: { hash: string, blockHash: string, blockNumber: number },\n    other?: { hash: string, blockHash: string, blockNumber: number }\n} | {\n    orphan: \"reorder-transaction\",\n    tx: { hash: string, blockHash: string, blockNumber: number },\n    other?: { hash: string, blockHash: string, blockNumber: number }\n} | {\n    orphan: \"drop-log\",\n    log: {\n        transactionHash: string,\n        blockHash: string,\n        blockNumber: number,\n        address: string,\n        data: string,\n        topics: ReadonlyArray<string>,\n        index: number\n    }\n};\n\nfunction createOrphanedBlockFilter(block: { hash: string, number: number }): OrphanFilter {\n    return { orphan: \"drop-block\", hash: block.hash, number: block.number };\n}\n\nfunction createReorderedTransactionFilter(tx: { hash: string, blockHash: string, blockNumber: number }, other?: { hash: string, blockHash: string, blockNumber: number }): OrphanFilter {\n    return { orphan: \"reorder-transaction\", tx, other };\n}\n\nfunction createRemovedTransactionFilter(tx: { hash: string, blockHash: string, blockNumber: number }): OrphanFilter {\n    return { orphan: \"drop-transaction\", tx };\n}\n\nfunction createRemovedLogFilter(log: { blockHash: string, transactionHash: string, blockNumber: number, address: string, data: string, topics: ReadonlyArray<string>, index: number }): OrphanFilter {\n    return { orphan: \"drop-log\", log: {\n        transactionHash: log.transactionHash,\n        blockHash: log.blockHash,\n        blockNumber: log.blockNumber,\n        address: log.address,\n        data: log.data,\n        topics: Object.freeze(log.topics.slice()),\n        index: log.index\n    } };\n}\n\n//////////////////////\n// EventFilter\n\n/**\n *  A **TopicFilter** provides a struture to define bloom-filter\n *  queries.\n *\n *  Each field that is ``null`` matches **any** value, a field that is\n *  a ``string`` must match exactly that value and ``array`` is\n *  effectively an ``OR``-ed set, where any one of those values must\n *  match.\n */\nexport type TopicFilter = Array<null | string | Array<string>>;\n\n// @TODO:\n//export type DeferableTopicFilter = Array<null | string | Promise<string> | Array<string | Promise<string>>>;\n\n/**\n *  An **EventFilter** allows efficiently filtering logs (also known as\n *  events) using bloom filters included within blocks.\n */\nexport interface EventFilter {\n    address?: AddressLike | Array<AddressLike>;\n    topics?: TopicFilter;\n}\n\n/**\n *  A **Filter** allows searching a specific range of blocks for mathcing\n *  logs.\n */\nexport interface Filter extends EventFilter {\n\n    /**\n     *  The start block for the filter (inclusive).\n     */\n    fromBlock?: BlockTag;\n\n    /**\n     *  The end block for the filter (inclusive).\n     */\n    toBlock?: BlockTag;\n}\n\n/**\n *  A **FilterByBlockHash** allows searching a specific block for mathcing\n *  logs.\n */\nexport interface FilterByBlockHash extends EventFilter {\n    /**\n     *  The blockhash of the specific block for the filter.\n     */\n    blockHash?: string;\n}\n\n\n//////////////////////\n// ProviderEvent\n\n/**\n *  A **ProviderEvent** provides the types of events that can be subscribed\n *  to on a [[Provider]].\n *\n *  Each provider may include additional possible events it supports, but\n *  the most commonly supported are:\n *\n *  **``\"block\"``** - calls the listener with the current block number on each\n *  new block.\n *\n *  **``\"error\"``** - calls the listener on each async error that occurs during\n *  the event loop, with the error.\n *\n *  **``\"debug\"``** - calls the listener on debug events, which can be used to\n *  troubleshoot network errors, provider problems, etc.\n *\n *  **``transaction hash``** - calls the listener on each block after the\n *  transaction has been mined; generally ``.once`` is more appropriate for\n *  this event.\n *\n *  **``Array``** - calls the listener on each log that matches the filter.\n *\n *  [[EventFilter]] - calls the listener with each matching log\n */\nexport type ProviderEvent = string | Array<string | Array<string>> | EventFilter | OrphanFilter;\n\n\n//////////////////////\n// Provider\n\n/**\n *  A **Provider** is the primary method to interact with the read-only\n *  content on Ethereum.\n *\n *  It allows access to details about accounts, blocks and transactions\n *  and the ability to query event logs and simulate contract execution.\n *\n *  Account data includes the [balance](getBalance),\n *  [transaction count](getTransactionCount), [code](getCode) and\n *  [state trie storage](getStorage).\n *\n *  Simulating execution can be used to [call](call),\n *  [estimate gas](estimateGas) and\n *  [get transaction results](getTransactionResult).\n *\n *  The [[broadcastTransaction]] is the only method which allows updating\n *  the blockchain, but it is usually accessed by a [[Signer]], since a\n *  private key must be used to sign the transaction before it can be\n *  broadcast.\n */\nexport interface Provider extends ContractRunner, EventEmitterable<ProviderEvent>, NameResolver {\n\n    /**\n     *  The provider iteself.\n     *\n     *  This is part of the necessary API for executing a contract, as\n     *  it provides a common property on any [[ContractRunner]] that\n     *  can be used to access the read-only portion of the runner.\n     */\n    provider: this;\n\n    /**\n     *  Shutdown any resources this provider is using. No additional\n     *  calls should be made to this provider after calling this.\n     */\n    destroy(): void;\n\n    ////////////////////\n    // State\n\n    /**\n     *  Get the current block number.\n     */\n    getBlockNumber(): Promise<number>;\n\n    /**\n     *  Get the connected [[Network]].\n     */\n    getNetwork(): Promise<Network>;\n\n    /**\n     *  Get the best guess at the recommended [[FeeData]].\n     */\n    getFeeData(): Promise<FeeData>;\n\n\n    ////////////////////\n    // Account\n\n    /**\n     *  Get the account balance (in wei) of %%address%%. If %%blockTag%%\n     *  is specified and the node supports archive access for that\n     *  %%blockTag%%, the balance is as of that [[BlockTag]].\n     *\n     *  @note On nodes without archive access enabled, the %%blockTag%% may be\n     *        **silently ignored** by the node, which may cause issues if relied on.\n     */\n    getBalance(address: AddressLike, blockTag?: BlockTag): Promise<bigint>;\n\n    /**\n     *  Get the number of transactions ever sent for %%address%%, which\n     *  is used as the ``nonce`` when sending a transaction. If\n     *  %%blockTag%% is specified and the node supports archive access\n     *  for that %%blockTag%%, the transaction count is as of that\n     *  [[BlockTag]].\n     *\n     *  @note On nodes without archive access enabled, the %%blockTag%% may be\n     *        **silently ignored** by the node, which may cause issues if relied on.\n     */\n    getTransactionCount(address: AddressLike, blockTag?: BlockTag): Promise<number>;\n\n    /**\n     *  Get the bytecode for %%address%%.\n     *\n     *  @note On nodes without archive access enabled, the %%blockTag%% may be\n     *        **silently ignored** by the node, which may cause issues if relied on.\n     */\n    getCode(address: AddressLike, blockTag?: BlockTag): Promise<string>\n\n    /**\n     *  Get the storage slot value for %%address%% at slot %%position%%.\n     *\n     *  @note On nodes without archive access enabled, the %%blockTag%% may be\n     *        **silently ignored** by the node, which may cause issues if relied on.\n     */\n    getStorage(address: AddressLike, position: BigNumberish, blockTag?: BlockTag): Promise<string>\n\n\n    ////////////////////\n    // Execution\n\n    /**\n     *  Estimates the amount of gas required to execute %%tx%%.\n     */\n    estimateGas(tx: TransactionRequest): Promise<bigint>;\n\n    /**\n     *  Simulate the execution of %%tx%%. If the call reverts, it will\n     *  throw a [[CallExceptionError]] which includes the revert data.\n     */\n    call(tx: TransactionRequest): Promise<string>\n\n    /**\n     *  Broadcasts the %%signedTx%% to the network, adding it to the\n     *  memory pool of any node for which the transaction meets the\n     *  rebroadcast requirements.\n     */\n    broadcastTransaction(signedTx: string): Promise<TransactionResponse>;\n\n\n    ////////////////////\n    // Queries\n\n    /**\n     *  Resolves to the block for %%blockHashOrBlockTag%%.\n     *\n     *  If %%prefetchTxs%%, and the backend supports including transactions\n     *  with block requests, all transactions will be included and the\n     *  [[Block]] object will not need to make remote calls for getting\n     *  transactions.\n     */\n    getBlock(blockHashOrBlockTag: BlockTag | string, prefetchTxs?: boolean): Promise<null | Block>;\n\n    /**\n     *  Resolves to the transaction for %%hash%%.\n     *\n     *  If the transaction is unknown or on pruning nodes which\n     *  discard old transactions this resolves to ``null``.\n     */\n    getTransaction(hash: string): Promise<null | TransactionResponse>;\n\n    /**\n     *  Resolves to the transaction receipt for %%hash%%, if mined.\n     *\n     *  If the transaction has not been mined, is unknown or on\n     *  pruning nodes which discard old transactions this resolves to\n     *  ``null``.\n     */\n    getTransactionReceipt(hash: string): Promise<null | TransactionReceipt>;\n\n    /**\n     *  Resolves to the result returned by the executions of %%hash%%.\n     *\n     *  This is only supported on nodes with archive access and with\n     *  the necessary debug APIs enabled.\n     */\n    getTransactionResult(hash: string): Promise<null | string>;\n\n\n    ////////////////////\n    // Bloom-filter Queries\n\n    /**\n     *  Resolves to the list of Logs that match %%filter%%\n     */\n    getLogs(filter: Filter | FilterByBlockHash): Promise<Array<Log>>;\n\n\n    ////////////////////\n    // ENS\n\n    /**\n     *  Resolves to the address configured for the %%ensName%% or\n     *  ``null`` if unconfigured.\n     */\n    resolveName(ensName: string): Promise<null | string>;\n\n    /**\n     *  Resolves to the ENS name associated for the %%address%% or\n     *  ``null`` if the //primary name// is not configured.\n     *\n     *  Users must perform additional steps to configure a //primary name//,\n     *  which is not currently common.\n     */\n    lookupAddress(address: string): Promise<null | string>;\n\n    /**\n     *  Waits until the transaction %%hash%% is mined and has %%confirms%%\n     *  confirmations.\n     */\n    waitForTransaction(hash: string, confirms?: number, timeout?: number): Promise<null | TransactionReceipt>;\n\n    /**\n     *  Resolves to the block at %%blockTag%% once it has been mined.\n     *\n     *  This can be useful for waiting some number of blocks by using\n     *  the ``currentBlockNumber + N``.\n     */\n    waitForBlock(blockTag?: BlockTag): Promise<Block>;\n}\n","// import from provider.ts instead of index.ts to prevent circular dep\n// from EtherscanProvider\nimport {\n    Block, Log, TransactionReceipt, TransactionResponse\n} from \"../providers/provider.js\";\nimport { defineProperties, EventPayload } from \"../utils/index.js\";\n\nimport type { EventFragment, Interface, Result } from \"../abi/index.js\";\nimport type { Listener } from \"../utils/index.js\";\nimport type {\n    Provider\n} from \"../providers/index.js\";\n\nimport type { BaseContract } from \"./contract.js\";\nimport type { ContractEventName } from \"./types.js\";\n\n/**\n *  An **EventLog** contains additional properties parsed from the [[Log]].\n */\nexport class EventLog extends Log {\n    /**\n     *  The Contract Interface.\n     */\n    readonly interface!: Interface;\n\n    /**\n     *  The matching event.\n     */\n    readonly fragment!: EventFragment;\n\n    /**\n     *  The parsed arguments passed to the event by ``emit``.\n     */\n    readonly args!: Result;\n\n    /**\n     * @_ignore:\n     */\n    constructor(log: Log, iface: Interface, fragment: EventFragment) {\n        super(log, log.provider);\n        const args = iface.decodeEventLog(fragment, log.data, log.topics);\n        defineProperties<EventLog>(this, { args, fragment, interface: iface });\n    }\n\n    /**\n     *  The name of the event.\n     */\n    get eventName(): string { return this.fragment.name; }\n\n    /**\n     *  The signature of the event.\n     */\n    get eventSignature(): string { return this.fragment.format(); }\n}\n\n/**\n *  An **EventLog** contains additional properties parsed from the [[Log]].\n */\nexport class UndecodedEventLog extends Log {\n\n    /**\n     *  The error encounted when trying to decode the log.\n     */\n    readonly error!: Error;\n\n    /**\n     * @_ignore:\n     */\n    constructor(log: Log, error: Error) {\n        super(log, log.provider);\n        defineProperties<UndecodedEventLog>(this, { error });\n    }\n}\n\n/**\n *  A **ContractTransactionReceipt** includes the parsed logs from a\n *  [[TransactionReceipt]].\n */\nexport class ContractTransactionReceipt extends TransactionReceipt {\n    readonly #iface: Interface;\n\n    /**\n     *  @_ignore:\n     */\n    constructor(iface: Interface, provider: Provider, tx: TransactionReceipt) {\n        super(tx, provider);\n        this.#iface = iface;\n    }\n\n    /**\n     *  The parsed logs for any [[Log]] which has a matching event in the\n     *  Contract ABI.\n     */\n    get logs(): Array<EventLog | Log> {\n        return super.logs.map((log) => {\n            const fragment = log.topics.length ? this.#iface.getEvent(log.topics[0]): null;\n            if (fragment) {\n                try {\n                    return new EventLog(log, this.#iface, fragment)\n                } catch (error: any) {\n                    return new UndecodedEventLog(log, error);\n                }\n            }\n\n            return log;\n        });\n    }\n\n}\n\n/**\n *  A **ContractTransactionResponse** will return a\n *  [[ContractTransactionReceipt]] when waited on.\n */\nexport class ContractTransactionResponse extends TransactionResponse {\n    readonly #iface: Interface;\n\n    /**\n     *  @_ignore:\n     */\n    constructor(iface: Interface, provider: Provider, tx: TransactionResponse) {\n        super(tx, provider);\n        this.#iface = iface;\n    }\n\n    /**\n     *  Resolves once this transaction has been mined and has\n     *  %%confirms%% blocks including it (default: ``1``) with an\n     *  optional %%timeout%%.\n     *\n     *  This can resolve to ``null`` only if %%confirms%% is ``0``\n     *  and the transaction has not been mined, otherwise this will\n     *  wait until enough confirmations have completed.\n     */\n    async wait(confirms?: number, timeout?: number): Promise<null | ContractTransactionReceipt> {\n        const receipt = await super.wait(confirms, timeout);\n        if (receipt == null) { return null; }\n        return new ContractTransactionReceipt(this.#iface, this.provider, receipt);\n    }\n}\n\n/**\n *  A **ContractUnknownEventPayload** is included as the last parameter to\n *  Contract Events when the event does not match any events in the ABI.\n */\nexport  class ContractUnknownEventPayload extends EventPayload<ContractEventName> {\n    /**\n     *  The log with no matching events.\n     */\n    readonly log!: Log;\n\n    /**\n     *  @_event:\n     */\n    constructor(contract: BaseContract, listener: null | Listener, filter: ContractEventName, log: Log) {\n        super(contract, listener, filter);\n        defineProperties<ContractUnknownEventPayload>(this, { log });\n    }\n\n    /**\n     *  Resolves to the block the event occured in.\n     */\n    async getBlock(): Promise<Block> {\n        return await this.log.getBlock();\n    }\n\n    /**\n     *  Resolves to the transaction the event occured in.\n     */\n    async getTransaction(): Promise<TransactionResponse> {\n        return await this.log.getTransaction();\n    }\n\n    /**\n     *  Resolves to the transaction receipt the event occured in.\n     */\n    async getTransactionReceipt(): Promise<TransactionReceipt> {\n        return await this.log.getTransactionReceipt();\n    }\n}\n\n/**\n *  A **ContractEventPayload** is included as the last parameter to\n *  Contract Events when the event is known.\n */\nexport class ContractEventPayload extends ContractUnknownEventPayload {\n\n    /**\n     *  The matching event.\n     */\n    declare readonly fragment: EventFragment;\n\n    /**\n     *  The log, with parsed properties.\n     */\n    declare readonly log: EventLog;\n\n    /**\n     *  The parsed arguments passed to the event by ``emit``.\n     */\n    declare readonly args: Result;\n\n    /**\n     *  @_ignore:\n     */\n    constructor(contract: BaseContract, listener: null | Listener, filter: ContractEventName, fragment: EventFragment, _log: Log) {\n        super(contract, listener, filter, new EventLog(_log, contract.interface, fragment));\n        const args = contract.interface.decodeEventLog(fragment, this.log.data, this.log.topics);\n        defineProperties<ContractEventPayload>(this, { args, fragment });\n    }\n\n    /**\n     *  The event name.\n     */\n    get eventName(): string {\n        return this.fragment.name;\n    }\n\n    /**\n     *  The event signature.\n     */\n    get eventSignature(): string {\n        return this.fragment.format();\n    }\n}\n","import { Interface, Typed } from \"../abi/index.js\";\nimport { isAddressable, resolveAddress } from \"../address/index.js\";\n// import from provider.ts instead of index.ts to prevent circular dep\n// from EtherscanProvider\nimport { copyRequest, Log, TransactionResponse } from \"../providers/provider.js\";\nimport {\n    defineProperties, getBigInt, isCallException, isHexString, resolveProperties,\n    isError, makeError, assert, assertArgument\n} from \"../utils/index.js\";\n\nimport {\n    ContractEventPayload, ContractUnknownEventPayload,\n    ContractTransactionResponse,\n    EventLog, UndecodedEventLog\n} from \"./wrappers.js\";\n\nimport type { EventFragment, FunctionFragment, InterfaceAbi, ParamType, Result } from \"../abi/index.js\";\nimport type { Addressable, NameResolver } from \"../address/index.js\";\nimport type { EventEmitterable, Listener } from \"../utils/index.js\";\nimport type {\n    BlockTag, ContractRunner, Provider, TransactionRequest, TopicFilter\n} from \"../providers/index.js\";\n\nimport type {\n    BaseContractMethod,\n    ContractEventName,\n    ContractInterface,\n    ContractMethodArgs,\n    ContractMethod,\n    ContractEventArgs,\n    ContractEvent,\n    ContractTransaction,\n    DeferredTopicFilter,\n    WrappedFallback\n} from \"./types.js\";\n\nconst BN_0 = BigInt(0);\n\ninterface ContractRunnerCaller extends ContractRunner {\n    call: (tx: TransactionRequest) => Promise<string>;\n}\n\ninterface ContractRunnerEstimater extends ContractRunner {\n    estimateGas: (tx: TransactionRequest) => Promise<bigint>;\n}\n\ninterface ContractRunnerSender extends ContractRunner {\n    sendTransaction: (tx: TransactionRequest) => Promise<TransactionResponse>;\n}\n\ninterface ContractRunnerResolver extends ContractRunner {\n    resolveName: (name: string | Addressable) => Promise<null | string>;\n}\n\nfunction canCall(value: any): value is ContractRunnerCaller {\n    return (value && typeof(value.call) === \"function\");\n}\n\nfunction canEstimate(value: any): value is ContractRunnerEstimater {\n    return (value && typeof(value.estimateGas) === \"function\");\n}\n\nfunction canResolve(value: any): value is ContractRunnerResolver {\n    return (value && typeof(value.resolveName) === \"function\");\n}\n\nfunction canSend(value: any): value is ContractRunnerSender {\n    return (value && typeof(value.sendTransaction) === \"function\");\n}\n\nfunction getResolver(value: any): undefined | NameResolver {\n    if (value != null) {\n        if (canResolve(value)) { return value; }\n        if (value.provider) { return value.provider; }\n    }\n    return undefined;\n}\n\nclass PreparedTopicFilter implements DeferredTopicFilter {\n    #filter: Promise<TopicFilter>;\n    readonly fragment!: EventFragment;\n\n    constructor(contract: BaseContract, fragment: EventFragment, args: Array<any>) {\n        defineProperties<PreparedTopicFilter>(this, { fragment });\n        if (fragment.inputs.length < args.length) {\n            throw new Error(\"too many arguments\");\n        }\n\n        // Recursively descend into args and resolve any addresses\n        const runner = getRunner(contract.runner, \"resolveName\");\n        const resolver = canResolve(runner) ? runner: null;\n        this.#filter = (async function() {\n            const resolvedArgs = await Promise.all(fragment.inputs.map((param, index) => {\n                const arg = args[index];\n                if (arg == null) { return null; }\n\n                return param.walkAsync(args[index], (type, value) => {\n                    if (type === \"address\") {\n                        if (Array.isArray(value)) {\n                            return Promise.all(value.map((v) => resolveAddress(v, resolver)));\n                        }\n                        return resolveAddress(value, resolver);\n                    }\n                    return value;\n                });\n            }));\n\n            return contract.interface.encodeFilterTopics(fragment, resolvedArgs);\n        })();\n    }\n\n    getTopicFilter(): Promise<TopicFilter> {\n        return this.#filter;\n    }\n}\n\n\n// A = Arguments passed in as a tuple\n// R = The result type of the call (i.e. if only one return type,\n//     the qualified type, otherwise Result)\n// D = The type the default call will return (i.e. R for view/pure,\n//     TransactionResponse otherwise)\n//export interface ContractMethod<A extends Array<any> = Array<any>, R = any, D extends R | ContractTransactionResponse = ContractTransactionResponse> {\n\nfunction getRunner<T extends ContractRunner>(value: any, feature: keyof ContractRunner): null | T {\n    if (value == null) { return null; }\n    if (typeof(value[feature]) === \"function\") { return value; }\n    if (value.provider && typeof(value.provider[feature]) === \"function\") {\n        return value.provider;\n    }\n    return null;\n}\n\nfunction getProvider(value: null | ContractRunner): null | Provider {\n    if (value == null) { return null; }\n    return value.provider || null;\n}\n\n/**\n *  @_ignore:\n */\nexport async function copyOverrides<O extends string = \"data\" | \"to\">(arg: any, allowed?: Array<string>): Promise<Omit<ContractTransaction, O>> {\n\n    // Make sure the overrides passed in are a valid overrides object\n    const _overrides = Typed.dereference(arg, \"overrides\");\n    assertArgument(typeof(_overrides) === \"object\", \"invalid overrides parameter\", \"overrides\", arg);\n\n    // Create a shallow copy (we'll deep-ify anything needed during normalizing)\n    const overrides = copyRequest(_overrides);\n\n    assertArgument(overrides.to == null || (allowed || [ ]).indexOf(\"to\") >= 0,\n      \"cannot override to\", \"overrides.to\", overrides.to);\n    assertArgument(overrides.data == null || (allowed || [ ]).indexOf(\"data\") >= 0,\n      \"cannot override data\", \"overrides.data\", overrides.data);\n\n    // Resolve any from\n    if (overrides.from) { overrides.from = overrides.from; }\n\n    return <Omit<ContractTransaction, O>>overrides;\n}\n\n/**\n *  @_ignore:\n */\nexport async function resolveArgs(_runner: null | ContractRunner, inputs: ReadonlyArray<ParamType>, args: Array<any>): Promise<Array<any>> {\n    // Recursively descend into args and resolve any addresses\n    const runner = getRunner(_runner, \"resolveName\");\n    const resolver = canResolve(runner) ? runner: null;\n    return await Promise.all(inputs.map((param, index) => {\n        return param.walkAsync(args[index], (type, value) => {\n            value = Typed.dereference(value, type);\n            if (type === \"address\") { return resolveAddress(value, resolver); }\n            return value;\n        });\n    }));\n}\n\nfunction buildWrappedFallback(contract: BaseContract): WrappedFallback {\n\n    const populateTransaction = async function(overrides?: Omit<TransactionRequest, \"to\">): Promise<ContractTransaction> {\n        // If an overrides was passed in, copy it and normalize the values\n\n        const tx: ContractTransaction = <any>(await copyOverrides<\"data\">(overrides, [ \"data\" ]));\n        tx.to = await contract.getAddress();\n\n        if (tx.from) {\n            tx.from = await resolveAddress(tx.from, getResolver(contract.runner));\n        }\n\n        const iface = contract.interface;\n\n        const noValue = (getBigInt((tx.value || BN_0), \"overrides.value\") === BN_0);\n        const noData = ((tx.data || \"0x\") === \"0x\");\n\n        if (iface.fallback && !iface.fallback.payable && iface.receive && !noData && !noValue) {\n            assertArgument(false, \"cannot send data to receive or send value to non-payable fallback\", \"overrides\", overrides);\n        }\n\n        assertArgument(iface.fallback || noData,\n          \"cannot send data to receive-only contract\", \"overrides.data\", tx.data);\n\n        // Only allow payable contracts to set non-zero value\n        const payable = iface.receive || (iface.fallback && iface.fallback.payable);\n        assertArgument(payable || noValue,\n          \"cannot send value to non-payable fallback\", \"overrides.value\", tx.value);\n\n        // Only allow fallback contracts to set non-empty data\n        assertArgument(iface.fallback || noData,\n          \"cannot send data to receive-only contract\", \"overrides.data\", tx.data);\n\n        return tx;\n    }\n\n    const staticCall = async function(overrides?: Omit<TransactionRequest, \"to\">): Promise<string> {\n        const runner = getRunner(contract.runner, \"call\");\n        assert(canCall(runner), \"contract runner does not support calling\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"call\" });\n\n        const tx = await populateTransaction(overrides);\n\n        try {\n            return await runner.call(tx);\n        } catch (error: any) {\n            if (isCallException(error) && error.data) {\n                throw contract.interface.makeError(error.data, tx);\n            }\n            throw error;\n        }\n    }\n\n    const send = async function(overrides?: Omit<TransactionRequest, \"to\">): Promise<ContractTransactionResponse> {\n        const runner = contract.runner;\n        assert(canSend(runner), \"contract runner does not support sending transactions\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"sendTransaction\" });\n\n        const tx = await runner.sendTransaction(await populateTransaction(overrides));\n        const provider = getProvider(contract.runner);\n        // @TODO: the provider can be null; make a custom dummy provider that will throw a\n        // meaningful error\n        return new ContractTransactionResponse(contract.interface, <Provider>provider, tx);\n    }\n\n    const estimateGas = async function(overrides?: Omit<TransactionRequest, \"to\">): Promise<bigint> {\n        const runner = getRunner(contract.runner, \"estimateGas\");\n        assert(canEstimate(runner), \"contract runner does not support gas estimation\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"estimateGas\" });\n\n        return await runner.estimateGas(await populateTransaction(overrides));\n    }\n\n    const method = async (overrides?: Omit<TransactionRequest, \"to\">) => {\n        return await send(overrides);\n    };\n\n    defineProperties<any>(method, {\n        _contract: contract,\n\n        estimateGas,\n        populateTransaction,\n        send, staticCall\n    });\n\n    return <WrappedFallback>method;\n}\n\nfunction buildWrappedMethod<A extends Array<any> = Array<any>, R = any, D extends R | ContractTransactionResponse = ContractTransactionResponse>(contract: BaseContract, key: string): BaseContractMethod<A, R, D> {\n\n    const getFragment = function(...args: ContractMethodArgs<A>): FunctionFragment {\n        const fragment = contract.interface.getFunction(key, args);\n        assert(fragment, \"no matching fragment\", \"UNSUPPORTED_OPERATION\", {\n            operation: \"fragment\",\n            info: { key, args }\n        });\n        return fragment;\n    }\n\n    const populateTransaction = async function(...args: ContractMethodArgs<A>): Promise<ContractTransaction> {\n        const fragment = getFragment(...args);\n\n        // If an overrides was passed in, copy it and normalize the values\n        let overrides: Omit<ContractTransaction, \"data\" | \"to\"> = { };\n        if (fragment.inputs.length + 1 === args.length) {\n            overrides = await copyOverrides(args.pop());\n\n            if (overrides.from) {\n                overrides.from = await resolveAddress(overrides.from, getResolver(contract.runner));\n            }\n        }\n\n        if (fragment.inputs.length !== args.length) {\n            throw new Error(\"internal error: fragment inputs doesn't match arguments; should not happen\");\n        }\n\n        const resolvedArgs = await resolveArgs(contract.runner, fragment.inputs, args);\n\n        return Object.assign({ }, overrides, await resolveProperties({\n            to: contract.getAddress(),\n            data: contract.interface.encodeFunctionData(fragment, resolvedArgs)\n        }));\n    }\n\n    const staticCall = async function(...args: ContractMethodArgs<A>): Promise<R> {\n        const result = await staticCallResult(...args);\n        if (result.length === 1) { return result[0]; }\n        return <R><unknown>result;\n    }\n\n    const send = async function(...args: ContractMethodArgs<A>): Promise<ContractTransactionResponse> {\n        const runner = contract.runner;\n        assert(canSend(runner), \"contract runner does not support sending transactions\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"sendTransaction\" });\n\n        const tx = await runner.sendTransaction(await populateTransaction(...args));\n        const provider = getProvider(contract.runner);\n        // @TODO: the provider can be null; make a custom dummy provider that will throw a\n        // meaningful error\n        return new ContractTransactionResponse(contract.interface, <Provider>provider, tx);\n    }\n\n    const estimateGas = async function(...args: ContractMethodArgs<A>): Promise<bigint> {\n        const runner = getRunner(contract.runner, \"estimateGas\");\n        assert(canEstimate(runner), \"contract runner does not support gas estimation\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"estimateGas\" });\n\n        return await runner.estimateGas(await populateTransaction(...args));\n    }\n\n    const staticCallResult = async function(...args: ContractMethodArgs<A>): Promise<Result> {\n        const runner = getRunner(contract.runner, \"call\");\n        assert(canCall(runner), \"contract runner does not support calling\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"call\" });\n\n        const tx = await populateTransaction(...args);\n\n        let result = \"0x\";\n        try {\n            result = await runner.call(tx);\n        } catch (error: any) {\n            if (isCallException(error) && error.data) {\n                throw contract.interface.makeError(error.data, tx);\n            }\n            throw error;\n        }\n\n        const fragment = getFragment(...args);\n        return contract.interface.decodeFunctionResult(fragment, result);\n    };\n\n    const method = async (...args: ContractMethodArgs<A>) => {\n        const fragment = getFragment(...args);\n        if (fragment.constant) { return await staticCall(...args); }\n        return await send(...args);\n    };\n\n    defineProperties<any>(method, {\n        name: contract.interface.getFunctionName(key),\n        _contract: contract, _key: key,\n\n        getFragment,\n\n        estimateGas,\n        populateTransaction,\n        send, staticCall, staticCallResult,\n    });\n\n    // Only works on non-ambiguous keys (refined fragment is always non-ambiguous)\n    Object.defineProperty(method, \"fragment\", {\n        configurable: false,\n        enumerable: true,\n        get: () => {\n            const fragment = contract.interface.getFunction(key);\n            assert(fragment, \"no matching fragment\", \"UNSUPPORTED_OPERATION\", {\n                operation: \"fragment\",\n                info: { key }\n            });\n            return fragment;\n        }\n    });\n\n    return <BaseContractMethod<A, R, D>>method;\n}\n\nfunction buildWrappedEvent<A extends Array<any> = Array<any>>(contract: BaseContract, key: string): ContractEvent<A> {\n\n    const getFragment = function(...args: ContractEventArgs<A>): EventFragment {\n        const fragment = contract.interface.getEvent(key, args);\n\n        assert(fragment, \"no matching fragment\", \"UNSUPPORTED_OPERATION\", {\n            operation: \"fragment\",\n            info: { key, args }\n        });\n\n        return fragment;\n    }\n\n    const method = function(...args: ContractMethodArgs<A>): PreparedTopicFilter {\n        return new PreparedTopicFilter(contract, getFragment(...args), args);\n    };\n\n    defineProperties<any>(method, {\n        name: contract.interface.getEventName(key),\n        _contract: contract, _key: key,\n\n        getFragment\n    });\n\n    // Only works on non-ambiguous keys (refined fragment is always non-ambiguous)\n    Object.defineProperty(method, \"fragment\", {\n        configurable: false,\n        enumerable: true,\n        get: () => {\n            const fragment = contract.interface.getEvent(key);\n\n            assert(fragment, \"no matching fragment\", \"UNSUPPORTED_OPERATION\", {\n                operation: \"fragment\",\n                info: { key }\n            });\n\n            return fragment;\n        }\n    });\n\n    return <ContractEvent<A>><unknown>method;\n}\n\ntype Sub = {\n    tag: string;\n    listeners: Array<{ listener: Listener, once: boolean }>,\n    start: () => void;\n    stop: () => void;\n};\n\n\n// The combination of TypeScrype, Private Fields and Proxies makes\n// the world go boom; so we hide variables with some trickery keeping\n// a symbol attached to each BaseContract which its sub-class (even\n// via a Proxy) can reach and use to look up its internal values.\n\nconst internal = Symbol.for(\"_ethersInternal_contract\");\ntype Internal = {\n    addrPromise: Promise<string>;\n    addr: null | string;\n\n    deployTx: null | ContractTransactionResponse;\n\n    subs: Map<string, Sub>;\n};\n\nconst internalValues: WeakMap<BaseContract, Internal> = new WeakMap();\n\nfunction setInternal(contract: BaseContract, values: Internal): void {\n    internalValues.set(contract[internal], values);\n}\n\nfunction getInternal(contract: BaseContract): Internal {\n    return internalValues.get(contract[internal]) as Internal;\n}\n\nfunction isDeferred(value: any): value is DeferredTopicFilter {\n    return (value && typeof(value) === \"object\" && (\"getTopicFilter\" in value) &&\n      (typeof(value.getTopicFilter) === \"function\") && value.fragment);\n}\n\nasync function getSubInfo(contract: BaseContract, event: ContractEventName): Promise<{ fragment: null | EventFragment, tag: string, topics: TopicFilter }> {\n    let topics: Array<null | string | Array<string>>;\n    let fragment: null | EventFragment = null;\n\n    // Convert named events to topicHash and get the fragment for\n    // events which need deconstructing.\n\n    if (Array.isArray(event)) {\n        const topicHashify = function(name: string): string {\n            if (isHexString(name, 32)) { return name; }\n            const fragment = contract.interface.getEvent(name);\n            assertArgument(fragment, \"unknown fragment\", \"name\", name);\n            return fragment.topicHash;\n        }\n\n        // Array of Topics and Names; e.g. `[ \"0x1234...89ab\", \"Transfer(address)\" ]`\n        topics = event.map((e) => {\n            if (e == null) { return null; }\n            if (Array.isArray(e)) { return e.map(topicHashify); }\n            return topicHashify(e);\n        });\n\n    } else if (event === \"*\") {\n        topics = [ null ];\n\n    } else if (typeof(event) === \"string\") {\n        if (isHexString(event, 32)) {\n            // Topic Hash\n            topics = [ event ];\n        } else {\n           // Name or Signature; e.g. `\"Transfer\", `\"Transfer(address)\"`\n            fragment = contract.interface.getEvent(event);\n            assertArgument(fragment, \"unknown fragment\", \"event\", event);\n            topics = [ fragment.topicHash ];\n        }\n\n    } else if (isDeferred(event)) {\n        // Deferred Topic Filter; e.g. `contract.filter.Transfer(from)`\n        topics = await event.getTopicFilter();\n\n    } else if (\"fragment\" in event) {\n        // ContractEvent; e.g. `contract.filter.Transfer`\n        fragment = event.fragment;\n        topics = [ fragment.topicHash ];\n\n    } else {\n        assertArgument(false, \"unknown event name\", \"event\", event);\n    }\n\n    // Normalize topics and sort TopicSets\n    topics = topics.map((t) => {\n        if (t == null) { return null; }\n        if (Array.isArray(t)) {\n            const items = Array.from(new Set(t.map((t) => t.toLowerCase())).values());\n            if (items.length === 1) { return items[0]; }\n            items.sort();\n            return items;\n        }\n        return t.toLowerCase();\n    });\n\n    const tag = topics.map((t) => {\n        if (t == null) { return \"null\"; }\n        if (Array.isArray(t)) { return t.join(\"|\"); }\n        return t;\n    }).join(\"&\");\n\n    return { fragment, tag, topics }\n}\n\nasync function hasSub(contract: BaseContract, event: ContractEventName): Promise<null | Sub> {\n    const { subs } = getInternal(contract);\n    return subs.get((await getSubInfo(contract, event)).tag) || null;\n}\n\nasync function getSub(contract: BaseContract, operation: string, event: ContractEventName): Promise<Sub> {\n    // Make sure our runner can actually subscribe to events\n    const provider = getProvider(contract.runner);\n    assert(provider, \"contract runner does not support subscribing\",\n        \"UNSUPPORTED_OPERATION\", { operation });\n\n    const { fragment, tag, topics } = await getSubInfo(contract, event);\n\n    const { addr, subs } = getInternal(contract);\n\n    let sub = subs.get(tag);\n    if (!sub) {\n        const address: string | Addressable = (addr ? addr: contract);\n        const filter = { address, topics };\n        const listener = (log: Log) => {\n            let foundFragment = fragment;\n            if (foundFragment == null) {\n                try {\n                    foundFragment = contract.interface.getEvent(log.topics[0]);\n                } catch (error) { }\n            }\n\n            // If fragment is null, we do not deconstruct the args to emit\n\n            if (foundFragment) {\n                const _foundFragment = foundFragment;\n                const args = fragment ? contract.interface.decodeEventLog(fragment, log.data, log.topics): [ ];\n                emit(contract, event, args, (listener: null | Listener) => {\n                    return new ContractEventPayload(contract, listener, event, _foundFragment, log);\n                });\n            } else {\n                emit(contract, event, [ ], (listener: null | Listener) => {\n                    return new ContractUnknownEventPayload(contract, listener, event, log);\n                });\n            }\n        };\n\n        let starting: Array<Promise<any>> = [ ];\n        const start = () => {\n            if (starting.length) { return; }\n            starting.push(provider.on(filter, listener));\n        };\n\n        const stop = async () => {\n            if (starting.length == 0) { return; }\n\n            let started = starting;\n            starting = [ ];\n            await Promise.all(started);\n            provider.off(filter, listener);\n        };\n\n        sub = { tag, listeners: [ ], start, stop };\n        subs.set(tag, sub);\n    }\n    return sub;\n}\n\n// We use this to ensure one emit resolves before firing the next to\n// ensure correct ordering (note this cannot throw and just adds the\n// notice to the event queu using setTimeout).\nlet lastEmit: Promise<any> = Promise.resolve();\n\ntype PayloadFunc = (listener: null | Listener) => ContractUnknownEventPayload;\n\nasync function _emit(contract: BaseContract, event: ContractEventName, args: Array<any>, payloadFunc: null | PayloadFunc): Promise<boolean> {\n    await lastEmit;\n\n    const sub = await hasSub(contract, event);\n    if (!sub) { return false; }\n\n    const count = sub.listeners.length;\n    sub.listeners = sub.listeners.filter(({ listener, once }) => {\n        const passArgs = Array.from(args);\n        if (payloadFunc) {\n            passArgs.push(payloadFunc(once ? null: listener));\n        }\n        try {\n            listener.call(contract, ...passArgs);\n        } catch (error) { }\n        return !once;\n    });\n\n    if (sub.listeners.length === 0) {\n        sub.stop();\n        getInternal(contract).subs.delete(sub.tag);\n    }\n\n    return (count > 0);\n}\n\nasync function emit(contract: BaseContract, event: ContractEventName, args: Array<any>, payloadFunc: null | PayloadFunc): Promise<boolean> {\n    try {\n        await lastEmit;\n    } catch (error) { }\n\n    const resultPromise = _emit(contract, event, args, payloadFunc);\n    lastEmit = resultPromise;\n    return await resultPromise;\n}\n\nconst passProperties = [ \"then\" ];\nexport class BaseContract implements Addressable, EventEmitterable<ContractEventName> {\n    /**\n     *  The target to connect to.\n     *\n     *  This can be an address, ENS name or any [[Addressable]], such as\n     *  another contract. To get the resolved address, use the ``getAddress``\n     *  method.\n     */\n    readonly target!: string | Addressable;\n\n    /**\n     *  The contract Interface.\n     */\n    readonly interface!: Interface;\n\n    /**\n     *  The connected runner. This is generally a [[Provider]] or a\n     *  [[Signer]], which dictates what operations are supported.\n     *\n     *  For example, a **Contract** connected to a [[Provider]] may\n     *  only execute read-only operations.\n     */\n    readonly runner!: null | ContractRunner;\n\n    /**\n     *  All the Events available on this contract.\n     */\n    readonly filters!: Record<string, ContractEvent>;\n\n    /**\n     *  @_ignore:\n     */\n    readonly [internal]: any;\n\n    /**\n     *  The fallback or receive function if any.\n     */\n    readonly fallback!: null | WrappedFallback;\n\n    /**\n     *  Creates a new contract connected to %%target%% with the %%abi%% and\n     *  optionally connected to a %%runner%% to perform operations on behalf\n     *  of.\n     */\n    constructor(target: string | Addressable, abi: Interface | InterfaceAbi, runner?: null | ContractRunner, _deployTx?: null | TransactionResponse) {\n        assertArgument(typeof(target) === \"string\" || isAddressable(target),\n            \"invalid value for Contract target\", \"target\", target);\n\n        if (runner == null) { runner = null; }\n        const iface = Interface.from(abi);\n        defineProperties<BaseContract>(this, { target, runner, interface: iface });\n\n        Object.defineProperty(this, internal, { value: { } });\n\n        let addrPromise;\n        let addr: null | string = null;\n\n        let deployTx: null | ContractTransactionResponse = null;\n        if (_deployTx) {\n            const provider = getProvider(runner);\n            // @TODO: the provider can be null; make a custom dummy provider that will throw a\n            // meaningful error\n            deployTx = new ContractTransactionResponse(this.interface, <Provider>provider, _deployTx);\n        }\n\n        let subs = new Map();\n\n        // Resolve the target as the address\n        if (typeof(target) === \"string\") {\n            if (isHexString(target)) {\n                addr = target;\n                addrPromise = Promise.resolve(target);\n\n            } else {\n                const resolver = getRunner(runner, \"resolveName\");\n                if (!canResolve(resolver)) {\n                    throw makeError(\"contract runner does not support name resolution\", \"UNSUPPORTED_OPERATION\", {\n                        operation: \"resolveName\"\n                    });\n                }\n\n                addrPromise = resolver.resolveName(target).then((addr) => {\n                    if (addr == null) {\n                        throw makeError(\"an ENS name used for a contract target must be correctly configured\", \"UNCONFIGURED_NAME\", {\n                            value: target\n                        });\n                    }\n                    getInternal(this).addr = addr;\n                    return addr;\n                });\n            }\n        } else {\n            addrPromise = target.getAddress().then((addr) => {\n                if (addr == null) { throw new Error(\"TODO\"); }\n                getInternal(this).addr = addr;\n                return addr;\n            });\n        }\n\n        // Set our private values\n        setInternal(this, { addrPromise, addr, deployTx, subs });\n\n        // Add the event filters\n        const filters = new Proxy({ }, {\n            get: (target, prop, receiver) => {\n                // Pass important checks (like `then` for Promise) through\n                if (typeof(prop) === \"symbol\" || passProperties.indexOf(prop) >= 0) {\n                    return Reflect.get(target, prop, receiver);\n                }\n\n                try {\n                    return this.getEvent(prop);\n                } catch (error) {\n                    if (!isError(error, \"INVALID_ARGUMENT\") || error.argument !== \"key\") {\n                        throw error;\n                    }\n                }\n\n                return undefined;\n            },\n            has: (target, prop) => {\n                // Pass important checks (like `then` for Promise) through\n                if (passProperties.indexOf(<string>prop) >= 0) {\n                    return Reflect.has(target, prop);\n                }\n\n                return Reflect.has(target, prop) || this.interface.hasEvent(String(prop));\n            }\n        });\n        defineProperties<BaseContract>(this, { filters });\n\n        defineProperties<BaseContract>(this, {\n            fallback: ((iface.receive || iface.fallback) ? (buildWrappedFallback(this)): null)\n        });\n\n        // Return a Proxy that will respond to functions\n        return new Proxy(this, {\n            get: (target, prop, receiver) => {\n                if (typeof(prop) === \"symbol\" || prop in target || passProperties.indexOf(prop) >= 0) {\n                    return Reflect.get(target, prop, receiver);\n                }\n\n                // Undefined properties should return undefined\n                try {\n                    return target.getFunction(prop);\n                } catch (error) {\n                    if (!isError(error, \"INVALID_ARGUMENT\") || error.argument !== \"key\") {\n                        throw error;\n                    }\n                }\n\n                return undefined;\n            },\n            has: (target, prop) => {\n                if (typeof(prop) === \"symbol\" || prop in target || passProperties.indexOf(prop) >= 0) {\n                    return Reflect.has(target, prop);\n                }\n\n                return target.interface.hasFunction(prop);\n            }\n        });\n\n    }\n\n    /**\n     *  Return a new Contract instance with the same target and ABI, but\n     *  a different %%runner%%.\n     */\n    connect(runner: null | ContractRunner): BaseContract {\n        return new BaseContract(this.target, this.interface, runner);\n    }\n\n    /**\n     *  Return a new Contract instance with the same ABI and runner, but\n     *  a different %%target%%.\n     */\n    attach(target: string | Addressable): BaseContract {\n        return new BaseContract(target, this.interface, this.runner);\n    }\n\n    /**\n     *  Return the resolved address of this Contract.\n     */\n    async getAddress(): Promise<string> { return await getInternal(this).addrPromise; }\n\n    /**\n     *  Return the deployed bytecode or null if no bytecode is found.\n     */\n    async getDeployedCode(): Promise<null | string> {\n        const provider = getProvider(this.runner);\n        assert(provider, \"runner does not support .provider\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"getDeployedCode\" });\n\n        const code = await provider.getCode(await this.getAddress());\n        if (code === \"0x\") { return null; }\n        return code;\n    }\n\n    /**\n     *  Resolve to this Contract once the bytecode has been deployed, or\n     *  resolve immediately if already deployed.\n     */\n    async waitForDeployment(): Promise<this> {\n        // We have the deployment transaction; just use that (throws if deployment fails)\n        const deployTx = this.deploymentTransaction();\n        if (deployTx) {\n            await deployTx.wait();\n            return this;\n        }\n\n        // Check for code\n        const code = await this.getDeployedCode();\n        if (code != null) { return this; }\n\n        // Make sure we can subscribe to a provider event\n        const provider = getProvider(this.runner);\n        assert(provider != null, \"contract runner does not support .provider\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"waitForDeployment\" });\n\n        return new Promise((resolve, reject) => {\n            const checkCode = async () => {\n                try {\n                    const code = await this.getDeployedCode();\n                    if (code != null) { return resolve(this); }\n                    provider.once(\"block\", checkCode);\n                } catch (error) {\n                    reject(error);\n                }\n            };\n            checkCode();\n        });\n    }\n\n    /**\n     *  Return the transaction used to deploy this contract.\n     *\n     *  This is only available if this instance was returned from a\n     *  [[ContractFactory]].\n     */\n    deploymentTransaction(): null | ContractTransactionResponse {\n        return getInternal(this).deployTx;\n    }\n\n    /**\n     *  Return the function for a given name. This is useful when a contract\n     *  method name conflicts with a JavaScript name such as ``prototype`` or\n     *  when using a Contract programmatically.\n     */\n    getFunction<T extends ContractMethod = ContractMethod>(key: string | FunctionFragment): T {\n        if (typeof(key) !== \"string\") { key = key.format(); }\n        const func = buildWrappedMethod(this, key);\n        return <T>func;\n    }\n\n    /**\n     *  Return the event for a given name. This is useful when a contract\n     *  event name conflicts with a JavaScript name such as ``prototype`` or\n     *  when using a Contract programmatically.\n     */\n    getEvent(key: string | EventFragment): ContractEvent {\n        if (typeof(key) !== \"string\") { key = key.format(); }\n        return buildWrappedEvent(this, key);\n    }\n\n    /**\n     *  @_ignore:\n     */\n    async queryTransaction(hash: string): Promise<Array<EventLog>> {\n        throw new Error(\"@TODO\");\n    }\n\n    /*\n    // @TODO: this is a non-backwards compatible change, but will be added\n    //        in v7 and in a potential SmartContract class in an upcoming\n    //        v6 release\n    async getTransactionReceipt(hash: string): Promise<null | ContractTransactionReceipt> {\n        const provider = getProvider(this.runner);\n        assert(provider, \"contract runner does not have a provider\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"queryTransaction\" });\n\n        const receipt = await provider.getTransactionReceipt(hash);\n        if (receipt == null) { return null; }\n\n        return new ContractTransactionReceipt(this.interface, provider, receipt);\n    }\n    */\n\n    /**\n     *  Provide historic access to event data for %%event%% in the range\n     *  %%fromBlock%% (default: ``0``) to %%toBlock%% (default: ``\"latest\"``)\n     *  inclusive.\n     */\n    async queryFilter(event: ContractEventName, fromBlock?: BlockTag, toBlock?: BlockTag): Promise<Array<EventLog | Log>> {\n        if (fromBlock == null) { fromBlock = 0; }\n        if (toBlock == null) { toBlock = \"latest\"; }\n        const { addr, addrPromise } = getInternal(this);\n        const address = (addr ? addr: (await addrPromise));\n        const { fragment, topics } = await getSubInfo(this, event);\n        const filter = { address, topics, fromBlock, toBlock };\n\n        const provider = getProvider(this.runner);\n        assert(provider, \"contract runner does not have a provider\",\n            \"UNSUPPORTED_OPERATION\", { operation: \"queryFilter\" });\n\n        return (await provider.getLogs(filter)).map((log) => {\n            let foundFragment = fragment;\n            if (foundFragment == null) {\n                try {\n                    foundFragment = this.interface.getEvent(log.topics[0]);\n                } catch (error) { }\n            }\n\n            if (foundFragment) {\n                try {\n                    return new EventLog(log, this.interface, foundFragment);\n                } catch (error: any) {\n                    return new UndecodedEventLog(log, error);\n                }\n            }\n\n            return new Log(log, provider);\n        });\n    }\n\n    /**\n     *  Add an event %%listener%% for the %%event%%.\n     */\n    async on(event: ContractEventName, listener: Listener): Promise<this> {\n        const sub = await getSub(this, \"on\", event);\n        sub.listeners.push({ listener, once: false });\n        sub.start();\n        return this;\n    }\n\n    /**\n     *  Add an event %%listener%% for the %%event%%, but remove the listener\n     *  after it is fired once.\n     */\n    async once(event: ContractEventName, listener: Listener): Promise<this> {\n        const sub = await getSub(this, \"once\", event);\n        sub.listeners.push({ listener, once: true });\n        sub.start();\n        return this;\n    }\n\n    /**\n     *  Emit an %%event%% calling all listeners with %%args%%.\n     *\n     *  Resolves to ``true`` if any listeners were called.\n     */\n    async emit(event: ContractEventName, ...args: Array<any>): Promise<boolean> {\n        return await emit(this, event, args, null);\n    }\n\n    /**\n     *  Resolves to the number of listeners of %%event%% or the total number\n     *  of listeners if unspecified.\n     */\n    async listenerCount(event?: ContractEventName): Promise<number> {\n        if (event) {\n            const sub = await hasSub(this, event);\n            if (!sub) { return 0; }\n            return sub.listeners.length;\n        }\n\n        const { subs } = getInternal(this);\n\n        let total = 0;\n        for (const { listeners } of subs.values()) {\n            total += listeners.length;\n        }\n        return total;\n    }\n\n    /**\n     *  Resolves to the listeners subscribed to %%event%% or all listeners\n     *  if unspecified.\n     */\n    async listeners(event?: ContractEventName): Promise<Array<Listener>> {\n        if (event) {\n            const sub = await hasSub(this, event);\n            if (!sub) { return [ ]; }\n            return sub.listeners.map(({ listener }) => listener);\n        }\n\n        const { subs } = getInternal(this);\n\n        let result: Array<Listener> = [ ];\n        for (const { listeners } of subs.values()) {\n            result = result.concat(listeners.map(({ listener }) => listener));\n        }\n        return result;\n    }\n\n    /**\n     *  Remove the %%listener%% from the listeners for %%event%% or remove\n     *  all listeners if unspecified.\n     */\n    async off(event: ContractEventName, listener?: Listener): Promise<this> {\n        const sub = await hasSub(this, event);\n        if (!sub) { return this; }\n\n        if (listener) {\n            const index = sub.listeners.map(({ listener }) => listener).indexOf(listener);\n            if (index >= 0) { sub.listeners.splice(index, 1); }\n        }\n\n        if (listener == null || sub.listeners.length === 0) {\n            sub.stop();\n            getInternal(this).subs.delete(sub.tag);\n        }\n\n        return this;\n    }\n\n    /**\n     *  Remove all the listeners for %%event%% or remove all listeners if\n     *  unspecified.\n     */\n    async removeAllListeners(event?: ContractEventName): Promise<this> {\n        if (event) {\n            const sub = await hasSub(this, event);\n            if (!sub) { return this; }\n            sub.stop();\n            getInternal(this).subs.delete(sub.tag);\n        } else {\n            const { subs } = getInternal(this);\n            for (const { tag, stop } of subs.values()) {\n                stop();\n                subs.delete(tag);\n            }\n        }\n\n        return this;\n    }\n\n    /**\n     *  Alias for [on].\n     */\n    async addListener(event: ContractEventName, listener: Listener): Promise<this> {\n        return await this.on(event, listener);\n    }\n\n    /**\n     *  Alias for [off].\n     */\n    async removeListener(event: ContractEventName, listener: Listener): Promise<this> {\n        return await this.off(event, listener);\n    }\n\n    /**\n     *  Create a new Class for the %%abi%%.\n     */\n    static buildClass<T = ContractInterface>(abi: Interface | InterfaceAbi): new (target: string, runner?: null | ContractRunner) => BaseContract & Omit<T, keyof BaseContract> {\n        class CustomContract extends BaseContract {\n            constructor(address: string, runner: null | ContractRunner = null) {\n                super(address, abi, runner);\n            }\n        }\n        return CustomContract as any;\n    };\n\n    /**\n     *  Create a new BaseContract with a specified Interface.\n     */\n    static from<T = ContractInterface>(target: string, abi: Interface | InterfaceAbi, runner?: null | ContractRunner): BaseContract & Omit<T, keyof BaseContract> {\n        if (runner == null) { runner = null; }\n        const contract = new this(target, abi, runner );\n        return contract as any;\n    }\n}\n\nfunction _ContractBase(): new (target: string | Addressable, abi: Interface | InterfaceAbi, runner?: null | ContractRunner) => BaseContract & Omit<ContractInterface, keyof BaseContract> {\n    return BaseContract as any;\n}\n\n/**\n *  A [[BaseContract]] with no type guards on its methods or events.\n */\nexport class Contract extends _ContractBase() { }\n","\nimport { Interface } from \"../abi/index.js\";\nimport { getCreateAddress } from \"../address/index.js\";\nimport {\n    concat, defineProperties, getBytes, hexlify,\n    assert, assertArgument\n} from \"../utils/index.js\";\n\nimport { BaseContract, copyOverrides, resolveArgs } from \"./contract.js\";\n\nimport type { InterfaceAbi } from \"../abi/index.js\";\nimport type { Addressable } from \"../address/index.js\";\nimport type { ContractRunner } from \"../providers/index.js\";\nimport type { BytesLike } from \"../utils/index.js\";\n\nimport type {\n    ContractInterface, ContractMethodArgs, ContractDeployTransaction,\n} from \"./types.js\";\nimport type { ContractTransactionResponse } from \"./wrappers.js\";\n\n\n// A = Arguments to the constructor\n// I = Interface of deployed contracts\n\n/**\n *  A **ContractFactory** is used to deploy a Contract to the blockchain.\n */\nexport class ContractFactory<A extends Array<any> = Array<any>, I = BaseContract> {\n\n    /**\n     *  The Contract Interface.\n     */\n    readonly interface!: Interface;\n\n    /**\n     *  The Contract deployment bytecode. Often called the initcode.\n     */\n    readonly bytecode!: string;\n\n    /**\n     *  The ContractRunner to deploy the Contract as.\n     */\n    readonly runner!: null | ContractRunner;\n\n    /**\n     *  Create a new **ContractFactory** with %%abi%% and %%bytecode%%,\n     *  optionally connected to %%runner%%.\n     *\n     *  The %%bytecode%% may be the ``bytecode`` property within the\n     *  standard Solidity JSON output.\n     */\n    constructor(abi: Interface | InterfaceAbi, bytecode: BytesLike | { object: string }, runner?: null | ContractRunner) {\n        const iface = Interface.from(abi);\n\n        // Dereference Solidity bytecode objects and allow a missing `0x`-prefix\n        if (bytecode instanceof Uint8Array) {\n            bytecode = hexlify(getBytes(bytecode));\n        } else {\n            if (typeof(bytecode) === \"object\") { bytecode = bytecode.object; }\n            if (!bytecode.startsWith(\"0x\")) { bytecode = \"0x\" + bytecode; }\n            bytecode = hexlify(getBytes(bytecode));\n        }\n\n        defineProperties<ContractFactory>(this, {\n            bytecode, interface: iface, runner: (runner || null)\n        });\n    }\n\n    attach(target: string | Addressable): BaseContract & Omit<I, keyof BaseContract> {\n        return new (<any>BaseContract)(target, this.interface, this.runner);\n    }\n\n    /**\n     *  Resolves to the transaction to deploy the contract, passing %%args%%\n     *  into the constructor.\n     */\n    async getDeployTransaction(...args: ContractMethodArgs<A>): Promise<ContractDeployTransaction> {\n        let overrides: Omit<ContractDeployTransaction, \"data\"> = { };\n\n        const fragment = this.interface.deploy;\n\n        if (fragment.inputs.length + 1 === args.length) {\n            overrides = await copyOverrides(args.pop());\n        }\n\n        if (fragment.inputs.length !== args.length) {\n            throw new Error(\"incorrect number of arguments to constructor\");\n        }\n\n        const resolvedArgs = await resolveArgs(this.runner, fragment.inputs, args);\n\n        const data = concat([ this.bytecode, this.interface.encodeDeploy(resolvedArgs) ]);\n        return Object.assign({ }, overrides, { data });\n    }\n\n    /**\n     *  Resolves to the Contract deployed by passing %%args%% into the\n     *  constructor.\n     *\n     *  This will resolve to the Contract before it has been deployed to the\n     *  network, so the [[BaseContract-waitForDeployment]] should be used before\n     *  sending any transactions to it.\n     */\n    async deploy(...args: ContractMethodArgs<A>): Promise<BaseContract & { deploymentTransaction(): ContractTransactionResponse } & Omit<I, keyof BaseContract>> {\n        const tx = await this.getDeployTransaction(...args);\n\n        assert(this.runner && typeof(this.runner.sendTransaction) === \"function\",\n            \"factory runner does not support sending transactions\", \"UNSUPPORTED_OPERATION\", {\n            operation: \"sendTransaction\" });\n\n        const sentTx = await this.runner.sendTransaction(tx);\n        const address = getCreateAddress(sentTx);\n        return new (<any>BaseContract)(address, this.interface, this.runner, sentTx);\n    }\n\n    /**\n     *  Return a new **ContractFactory** with the same ABI and bytecode,\n     *  but connected to %%runner%%.\n     */\n    connect(runner: null | ContractRunner): ContractFactory<A, I> {\n        return new ContractFactory(this.interface, this.bytecode, runner);\n    }\n\n    /**\n     *  Create a new **ContractFactory** from the standard Solidity JSON output.\n     */\n    static fromSolidity<A extends Array<any> = Array<any>, I = ContractInterface>(output: any, runner?: ContractRunner): ContractFactory<A, I> {\n        assertArgument(output != null, \"bad compiler output\", \"output\", output);\n\n        if (typeof(output) === \"string\") { output = JSON.parse(output); }\n\n        const abi = output.abi;\n\n        let bytecode = \"\";\n        if (output.bytecode) {\n            bytecode = output.bytecode;\n        } else if (output.evm && output.evm.bytecode) {\n            bytecode = output.evm.bytecode;\n        }\n\n        return new this(abi, bytecode, runner);\n    }\n}\n",null,null,null,null,null,null,"export type NumType = number | bigint;\nexport type BytesType = Uint8Array;\nexport type PrimitiveType = NumType | BytesType;\n\n//used wherever an object is expected that sprung from the DeriveType type defined below\nexport type LayoutObject = { readonly [key: string]: any };\n\nexport const binaryLiterals = [\"int\", \"uint\", \"bytes\", \"array\", \"switch\"] as const;\nexport type BinaryLiterals = typeof binaryLiterals[number];\nexport type Endianness = \"little\" | \"big\";\nexport const defaultEndianness = \"big\";\n\nexport const numberMaxSize = 6; //Math.log2(Number.MAX_SAFE_INTEGER) / 8 = 6.625;\nexport type NumberSize = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport type NumSizeToPrimitive<Size extends number> =\n  Size extends NumberSize\n  ? number\n  : Size & NumberSize extends never\n  ? bigint\n  : number | bigint;\n\nexport type FixedConversion<FromType extends PrimitiveType | LayoutObject, ToType> = {\n  readonly to: ToType,\n  readonly from: FromType,\n};\n\nexport type CustomConversion<FromType extends PrimitiveType | LayoutObject, ToType> = {\n  readonly to: (val: FromType) => ToType,\n  readonly from: (val: ToType) => FromType,\n};\n\nexport interface ItemBase<BL extends BinaryLiterals> {\n  readonly binary: BL,\n};\n\ninterface FixedOmittableCustom<T extends PrimitiveType> {\n  custom: T,\n  omit?: boolean\n};\n\n//length size: number of bytes used to encode the preceeding length field which in turn\n//  holds either the number of bytes (for bytes) or elements (for array)\nexport interface LengthPrefixed {\n  readonly lengthSize: NumberSize,\n  readonly lengthEndianness?: Endianness, //see defaultEndianness\n  // //restricts the datarange of lengthSize to a maximum value to prevent out of memory\n  // //  attacks/issues\n  // readonly maxLength?: number,\n}\n\n//size: number of bytes used to encode the item\ninterface NumItemBase<T extends NumType, Signed extends Boolean>\n    extends ItemBase<Signed extends true ? \"int\" : \"uint\"> {\n  size: T extends bigint ? number : NumberSize,\n  endianness?: Endianness, //see defaultEndianness\n};\n\nexport interface FixedPrimitiveNum<\n  T extends NumType,\n  Signed extends Boolean\n> extends NumItemBase<T, Signed>, FixedOmittableCustom<T> {};\n\nexport interface OptionalToFromNum<\n  T extends NumType,\n  Signed extends Boolean\n> extends NumItemBase<T, Signed> {\n  custom?: FixedConversion<T, any> | CustomConversion<T, any>\n};\n\nexport interface FixedPrimitiveBytes\n  extends ItemBase<\"bytes\">, FixedOmittableCustom<BytesType> {};\nexport interface FlexPureBytes extends ItemBase<\"bytes\"> {\n  readonly custom?: BytesType | FixedConversion<BytesType, any> | CustomConversion<BytesType, any>,\n};\n\nexport interface FlexLayoutBytes extends ItemBase<\"bytes\"> {\n  readonly custom?: FixedConversion<LayoutObject, any> | CustomConversion<LayoutObject, any>,\n  readonly layout: Layout,\n}\n\nexport interface ManualSizePureBytes extends FlexPureBytes {\n  readonly size: number,\n};\n\nexport interface LengthPrefixedPureBytes extends FlexPureBytes, LengthPrefixed {};\n\nexport interface ManualSizeLayoutBytes extends FlexLayoutBytes {\n  readonly size: number,\n};\n\nexport interface LengthPrefixedLayoutBytes extends FlexLayoutBytes, LengthPrefixed {};\n\ninterface ArrayItemBase extends ItemBase<\"array\"> {\n  readonly layout: Layout,\n};\n\nexport interface FixedLengthArray extends ArrayItemBase {\n  readonly length: number,\n};\n\nexport interface LengthPrefixedArray extends ArrayItemBase, LengthPrefixed {};\n\n//consumes the rest of the data on deserialization\nexport interface RemainderArray extends ArrayItemBase {};\n\ntype PlainId = number;\ntype ConversionId = readonly [number, unknown];\ntype IdProperLayoutPair<\n  Id extends PlainId | ConversionId,\n  P extends ProperLayout = ProperLayout\n> = readonly [Id, P];\ntype IdProperLayoutPairs =\n  readonly IdProperLayoutPair<PlainId>[] |\n  readonly IdProperLayoutPair<ConversionId>[];\ntype DistributiveAtLeast1<T> = T extends any ? readonly [T, ...T[]] : never;\nexport interface SwitchItem extends ItemBase<\"switch\"> {\n  readonly idSize: NumberSize,\n  readonly idEndianness?: Endianness, //see defaultEndianness\n  readonly idTag?: string,\n  readonly layouts:\n    DistributiveAtLeast1<IdProperLayoutPair<PlainId> | IdProperLayoutPair<ConversionId>>,\n}\n\nexport type NumItem<Signed extends boolean = boolean> =\n  //force distribution over union\n  Signed extends infer S extends boolean\n  ? FixedPrimitiveNum<number, S> |\n    OptionalToFromNum<number, S> |\n    FixedPrimitiveNum<bigint, S> |\n    OptionalToFromNum<bigint, S>\n  : never;\n\nexport type UintItem = NumItem<false>;\nexport type IntItem = NumItem<true>;\nexport type BytesItem =\n  FixedPrimitiveBytes |\n  FlexPureBytes |\n  ManualSizePureBytes |\n  LengthPrefixedPureBytes |\n  FlexLayoutBytes |\n  ManualSizeLayoutBytes |\n  LengthPrefixedLayoutBytes;\nexport type ArrayItem = FixedLengthArray | LengthPrefixedArray | RemainderArray;\nexport type Item = NumItem | BytesItem | ArrayItem | SwitchItem;\nexport type NamedItem = Item & { readonly name: string };\nexport type ProperLayout = readonly NamedItem[];\nexport type Layout = Item | ProperLayout;\n\ntype NameOrOmitted<T extends { name: string }> = T extends {omit: true} ? never : T[\"name\"];\n\nexport type DeriveType<L extends Layout> =\n  Layout extends L\n  ? unknown\n  : L extends infer LI extends Item\n  ? ItemToType<LI>\n  : L extends infer P extends ProperLayout\n  ? { readonly [I in P[number] as NameOrOmitted<I>]: ItemToType<I> }\n  : never;\n\ntype ItemToType<II extends Item> =\n  II extends infer I extends Item\n  ? I extends NumItem\n    ? NumItemToType<I>\n    : I extends BytesItem\n    ? BytesItemToType<I>\n    : I extends ArrayItem\n    ? ArrayItemToType<I>\n    : I extends SwitchItem\n    ? SwitchItemToType<I>\n    : never\n  : never;\n\n//---NumItem---\ntype NumItemToType<I extends NumItem> =\n  //we must infer FromType here to make sure we \"hit\" the correct type of the conversion\n  I[\"custom\"] extends CustomConversion<infer From extends NumType, infer To>\n  ? To\n  : I[\"custom\"] extends FixedConversion<infer From extends NumType, infer To>\n  ? To\n  : I[\"custom\"] extends undefined\n  ? NumSizeToPrimitive<I[\"size\"]>\n  : I[\"custom\"] extends NumType\n  ? I[\"custom\"]\n  : NumSizeToPrimitive<I[\"size\"]>;\n\n//---BytesItem---\ntype BytesItemToType<I extends BytesItem> =\n  I extends { layout: Layout }\n  ? I[\"custom\"] extends CustomConversion<infer From extends LayoutObject, infer To>\n    ? To\n    : I[\"custom\"] extends FixedConversion<infer From extends LayoutObject, infer To>\n    ? To\n    : DeriveType<I[\"layout\"]>\n  : I[\"custom\"] extends CustomConversion<BytesType, infer To>\n  ? To\n  : I[\"custom\"] extends FixedConversion<BytesType, infer To>\n  ? To\n  : BytesType;\n\n//---ArrayItem---\ntype TupleWithLength<T, L extends number, A extends T[] = []> =\n  A[\"length\"] extends L\n  ? A\n  : TupleWithLength<T, L, [...A, T]>;\n\ntype ArrayItemToType<I extends ArrayItem> =\n  DeriveType<I[\"layout\"]> extends infer DT\n  ? I extends { length: infer AL extends number }\n    ? number extends AL\n      ? readonly DT[]\n      : Readonly<TupleWithLength<DT, AL>>\n    : readonly DT[]\n  : never;\n\n//---SwitchItem---\ntype MaybeConvert<Id extends PlainId | ConversionId> =\n  Id extends readonly [number, infer Converted] ? Converted : Id;\n\ntype IdLayoutPairsToTypeUnion<A extends IdProperLayoutPairs, IdTag extends string> =\n  A extends infer V extends IdProperLayoutPairs\n  ? V extends readonly [infer Head,...infer Tail extends IdProperLayoutPairs]\n    ? Head extends IdProperLayoutPair<infer MaybeConversionId, infer P extends ProperLayout>\n      ? MaybeConvert<MaybeConversionId> extends infer Id\n        ? DeriveType<P> extends infer DT extends LayoutObject\n          ? { readonly [K in IdTag | keyof DT]: K extends keyof DT ? DT[K] : Id }\n            | IdLayoutPairsToTypeUnion<Tail, IdTag>\n          : never\n        : never\n      : never\n    : never\n  : never;\n\ntype SwitchItemToType<I extends SwitchItem> =\n  IdLayoutPairsToTypeUnion<\n    I[\"layouts\"],\n    I[\"idTag\"] extends infer ID extends string\n    ? ID extends undefined\n      ? \"id\"\n      : ID\n    : never\n  >;\n","import type {\n  Layout,\n  Item,\n  SwitchItem,\n  FixedConversion,\n  NumType,\n  BytesType,\n  PrimitiveType,\n  FlexLayoutBytes,\n  LengthPrefixedLayoutBytes,\n  ManualSizeLayoutBytes,\n} from \"./layout\";\nimport { binaryLiterals } from \"./layout\";\n\nexport const isNumType = (x: any): x is NumType =>\n  typeof x === \"number\" || typeof x === \"bigint\";\n\nexport const isBytesType = (x: any): x is BytesType => x instanceof Uint8Array;\n\nexport const isPrimitiveType = (x: any): x is PrimitiveType =>\n  isNumType(x) || isBytesType(x);\n\nexport const isItem = (x: any): x is Item => binaryLiterals.includes(x?.binary);\n\nexport const isLayout = (x: any): x is Layout =>\n  isItem(x) || Array.isArray(x) && x.every(isItem);\n\nconst isFixedNumberConversion = (custom: any): custom is FixedConversion<number, any> =>\n  typeof custom?.from === \"number\";\n\nconst isFixedBigintConversion = (custom: any): custom is FixedConversion<bigint, any> =>\n  typeof custom?.from === \"bigint\";\n\nexport const isFixedUintConversion = (custom: any): custom is\n    FixedConversion<number, any> | FixedConversion<bigint, any> =>\n  isFixedNumberConversion(custom) || isFixedBigintConversion(custom);\n\nexport const isFixedBytesConversion = (custom: any): custom is FixedConversion<BytesType, any> =>\n  isBytesType(custom?.from);\n\nexport const isFixedPrimitiveConversion = (custom: any): custom is\n    FixedConversion<number, any> | FixedConversion<bigint, any> | FixedConversion<BytesType, any> =>\n  isFixedUintConversion(custom) || isFixedBytesConversion(custom);\n\nexport const checkSize = (layoutSize: number, dataSize: number): number => {\n  if (layoutSize !== dataSize)\n    throw new Error(`size mismatch: layout size: ${layoutSize}, data size: ${dataSize}`);\n\n  return dataSize;\n}\n\n//In a better world, we wouldn't need this type guard and could just check for \"layout\" in bytesItem\n//  directly because no layout item actually allows for its layout property (if it has one) to be\n//  `undefined`.\n//\n//The problem arises in how TypeScript checks `satisfies` constraints that involve unions:\n//Consider:\n//```\n//const shouldBeIllegal = {\n//  binary: \"bytes\", layout: undefined,\n//} as const satisfies FlexPureBytes | FlexLayoutBytes;\n//```\n//\n//This should be illegal because `FlexPureBytes` does not specify a layout property, so its\n//  specification would be excessive and `FlexLayoutBytes` does not allow for its `layout` property\n//  to be `undefined`.\n//But when checking a `satisfies` constraint of unions of interfaces, excessive properties are\n//  actually ignored and so the `satisfies` constraint will be considered fulfilled, even though it\n//  neither member of the union by itself satisfies it - how utterly counterintuitive.\n//\n//Given that it is fairly natural - though strictly speaking incorrect - to write the following:\n//```\n//const someBytesTemplate = <const L extends Layout | undefined = undefined>(layout?: L) => ({\n//  binary: \"bytes\", layout: layout as L,\n//} as const satisfies Item);\n//```\n//and because TypeScript fails to alert us that it does in fact not satisfy any bytes item at all,\n//  we instead introduce an additional check in our implementation that not only is a layout\n//  property present but that it is also not `undefined`.\nexport const bytesItemHasLayout = (bytesItem: { readonly binary: \"bytes\" }):\n  bytesItem is FlexLayoutBytes | ManualSizeLayoutBytes | LengthPrefixedLayoutBytes =>\n    \"layout\" in bytesItem && bytesItem.layout !== undefined;\n\nexport const checkItemSize = (item: any, dataSize: number): number =>\n  (\"size\" in item && item.size !== undefined) ? checkSize(item.size, dataSize) : dataSize;\n\nexport const checkNumEquals = (custom: number | bigint, data: number | bigint): void => {\n  if (custom != data)\n    throw new Error(`value mismatch: (constant) layout value: ${custom}, data value: ${data}`);\n}\n\nexport const checkBytesTypeEqual = (\n  custom: BytesType,\n  data: BytesType,\n  opts?: {\n    customSlice?: number | readonly [number, number];\n    dataSlice?: number | readonly [number, number];\n  }): void => {\n  const toSlice = (bytes: BytesType, slice?: number | readonly [number, number]) =>\n    slice === undefined\n      ? [0, bytes.length] as const\n      : Array.isArray(slice)\n      ? slice\n      : [slice, bytes.length] as const;\n\n  const [customStart, customEnd] = toSlice(custom, opts?.customSlice);\n  const [dataStart, dataEnd] = toSlice(data, opts?.dataSlice);\n  const length = customEnd - customStart;\n  checkSize(length, dataEnd - dataStart);\n\n  for (let i = 0; i < custom.length; ++i)\n    if (custom[i + customStart] !== data[i + dataStart])\n      throw new Error(`binary data mismatch: ` +\n        `layout value: ${custom}, offset: ${customStart}, data value: ${data}, offset: ${dataStart}`\n      );\n}\n\nexport function findIdLayoutPair(item: SwitchItem, data: any) {\n  const id = data[item.idTag ?? \"id\"];\n  return (item.layouts as readonly any[]).find(([idOrConversionId]) =>\n    (Array.isArray(idOrConversionId) ? idOrConversionId[1] : idOrConversionId) == id\n  )!;\n}\n","import type {\n  Layout,\n  Item,\n  DeriveType,\n} from \"./layout\";\nimport {\n  findIdLayoutPair,\n  isBytesType,\n  isItem,\n  isFixedBytesConversion,\n  checkItemSize,\n  bytesItemHasLayout,\n} from \"./utils\";\n\nexport function calcSize<const L extends Layout>(layout: L, data: DeriveType<L>): number {\n  const size = internalCalcSize(layout, data);\n  if (size === null)\n    throw new Error(\n      `coding error: couldn't calculate layout size for layout ${layout} with data ${data}`\n    );\n\n  return size;\n}\n\n//no way to use overloading here:\n// export function calcSize<const L extends Layout>(layout: L): number | null;\n// export function calcSize<const L extends Layout>(layout: L, data: DeriveType<L>): number;\n// export function calcSize<const L extends Layout>(\n//   layout: L,\n//   data?: DeriveType<L>\n// ): number | null; //impl\n//results in \"instantiation too deep\" error.\n//\n//Trying to pack everything into a single function definition means we either can't narrow the\n//  return type correctly:\n// export function calcSize<const L extends Layout>(\n//   layout: L,\n//   data: DeriveType<L>,\n// ): number | null;\n//or we have to make data overly permissive via:\n// export function calcSize<\n//   L extends Layout,\n//   const D extends DeriveType<L> | undefined,\n//  >(\n//   layout: L,\n//   data?: D, //data can now contain additional properties\n// ): undefined extends D ? number | null : number;\n//so we're stuck with having to use to separate names\nexport function calcStaticSize(layout: Layout): number | null {\n  return internalCalcSize(layout, staticCalc);\n}\n\n// --- implementation ---\n\n//The implementation here shares code for calcSize and calcStaticSize. It's slightly less efficient\n//  from a runtime PoV but it avoids what would effectively be code duplication.\n//Since `undefined` is a valid \"to\" type for custom conversions, it can be a valid value for data.\n//  Therefore, we can't use it to differentiate between calcSize and calcStaticSize, where in the\n//  former we know that data will adhere to the layout, while in the latter data will not exist.\n//So, to mark data as \"does not exist\", i.e. we are in the static calc version, we use a\n//  local (and hence unique) symbol instead.\nconst staticCalc = Symbol(\"staticCalc\");\n\n//stores the results of custom.from calls for bytes items to avoid duplicated effort upon\n//  subsequent serialization\nexport function calcSizeForSerialization<const L extends Layout>(\n  layout: L,\n  data: DeriveType<L>\n): [number, any[]] {\n  const bytesConversions: any[] = [];\n  const size = internalCalcSize(layout, data, bytesConversions);\n  if (size === null)\n    throw new Error(\n      `coding error: couldn't calculate layout size for layout ${layout} with data ${data}`\n    );\n\n  return [size, bytesConversions];\n}\n\nfunction calcItemSize(item: Item, data: any, bytesConversions?: any[]): number | null {\n  const storeInCache = (cachedFrom: any) => {\n    if (bytesConversions !== undefined)\n      bytesConversions.push(cachedFrom);\n\n    return cachedFrom;\n  };\n\n  switch (item.binary) {\n    case \"int\":\n    case \"uint\":\n      return item.size;\n    case \"bytes\": {\n      if (\"size\" in item && data === staticCalc)\n        return item.size;\n\n      //items only have a size or a lengthSize, never both\n      const lengthSize = (\"lengthSize\" in item) ? item.lengthSize | 0 : 0;\n\n      if (bytesItemHasLayout(item)) {\n        const { custom } = item;\n        const layoutSize = internalCalcSize(\n          item.layout,\n          custom === undefined\n          ? data\n          : typeof custom.from === \"function\"\n          ? (data !== staticCalc ? storeInCache(custom.from(data)) : staticCalc)\n          : custom.from, //flex layout bytes only allows conversions, not fixed values\n          bytesConversions\n        );\n        if (layoutSize === null)\n          return (\"size\" in item ) ? item.size ?? null : null;\n\n        return lengthSize + checkItemSize(item, layoutSize);\n      }\n\n      const { custom } = item;\n      if (isBytesType(custom))\n        return lengthSize + custom.length; //assumed to equal item.size if it exists\n\n      if (isFixedBytesConversion(custom))\n        return lengthSize + custom.from.length; //assumed to equal item.size if it exists\n\n      if (data === staticCalc)\n        return null;\n\n      return lengthSize + checkItemSize(\n        item,\n        custom !== undefined\n        ? storeInCache(custom.from(data)).length\n        : data.length\n      );\n    }\n    case \"array\": {\n      const length = \"length\" in item ? item.length : undefined;\n      if (data === staticCalc) {\n        if (length !== undefined) {\n          const layoutSize = internalCalcSize(item.layout, staticCalc, bytesConversions);\n          return layoutSize !== null ? length * layoutSize: null;\n        }\n        return null;\n      }\n\n      let size = 0;\n      if (length !== undefined && length !== data.length)\n        throw new Error(\n          `array length mismatch: layout length: ${length}, data length: ${data.length}`\n        );\n      else if (\"lengthSize\" in item && item.lengthSize !== undefined)\n        size += item.lengthSize;\n\n      for (let i = 0; i < data.length; ++i) {\n        const entrySize = internalCalcSize(item.layout, data[i], bytesConversions);\n        if (entrySize === null)\n          return null;\n\n        size += entrySize;\n      }\n\n      return size;\n    }\n    case \"switch\": {\n      if (data !== staticCalc) {\n        const [_, layout] = findIdLayoutPair(item, data);\n        const layoutSize = internalCalcSize(layout, data, bytesConversions);\n        return layoutSize !== null ? item.idSize + layoutSize : null;\n      }\n\n      let size: number | null = null;\n      for (const [_, layout] of item.layouts) {\n        const layoutSize = internalCalcSize(layout, staticCalc, bytesConversions);\n        if (size === null)\n          size = layoutSize;\n        else if (layoutSize !== size)\n          return null;\n      }\n      return item.idSize + size!;\n    }\n  }\n}\n\nfunction internalCalcSize(layout: Layout, data: any, bytesConversions?: any[]): number | null {\n  if (isItem(layout))\n    return calcItemSize(layout as Item, data, bytesConversions);\n\n  let size = 0;\n  for (const item of layout) {\n    let itemData;\n    if (data === staticCalc)\n      itemData = staticCalc;\n    else if (!(\"omit\" in item) || !item.omit) {\n      if (!(item.name in data))\n        throw new Error(`missing data for layout item: ${item.name}`);\n\n      itemData = data[item.name];\n    }\n\n    const itemSize = calcItemSize(item, itemData, bytesConversions);\n    if (itemSize === null) {\n      if (data !== staticCalc)\n        throw new Error(`coding error: couldn't calculate size for layout item: ${item.name}`);\n\n      return null;\n    }\n    size += itemSize;\n  }\n  return size;\n}\n","import type {\n  Endianness,\n  Layout,\n  Item,\n  DeriveType,\n  CustomConversion,\n  NumType,\n  BytesType,\n  FixedConversion,\n  LayoutObject,\n  ItemBase\n} from \"./layout\";\nimport {\n  defaultEndianness,\n  numberMaxSize,\n} from \"./layout\";\nimport { calcSizeForSerialization } from \"./size\";\nimport {\n  checkItemSize,\n  checkBytesTypeEqual,\n  checkNumEquals,\n  findIdLayoutPair,\n  isFixedBytesConversion,\n  isItem,\n  isNumType,\n  isBytesType,\n  bytesItemHasLayout,\n} from \"./utils\";\n\ntype Cursor = {\n  bytes: BytesType;\n  offset: number;\n};\n\nconst cursorWrite = (cursor: Cursor, bytes: BytesType) => {\n  cursor.bytes.set(bytes, cursor.offset);\n  cursor.offset += bytes.length;\n}\n\ntype BytesConversionQueue = {\n  bytesConversions: any[],\n  position: number,\n}\n\nconst bcqGetNext = (bcq: BytesConversionQueue) => bcq.bytesConversions[bcq.position++];\n\n//returns a BytesType if no encoded data is provided, otherwise returns the number of bytes written\n//  to the provided Uint8Array. Callers should use Uint8Array.subarray if they want to serialize\n//  in place of a larger, pre-allocated Uint8Array.\nexport function serialize<\n  const L extends Layout,\n  E extends BytesType | undefined = undefined\n>(layout: L, data: DeriveType<L>, encoded?: E) {\n  const [size, bytesConversions] = calcSizeForSerialization(layout, data);\n  const cursor = { bytes: encoded ?? new Uint8Array(size), offset: 0 };\n  internalSerialize(layout, data, cursor, {bytesConversions, position: 0});\n  if (!encoded && cursor.offset !== cursor.bytes.length)\n    throw new Error(\n      `encoded data is shorter than expected: ${cursor.bytes.length} > ${cursor.offset}`\n    );\n\n  return (encoded ? cursor.offset : cursor.bytes) as E extends undefined ? BytesType : number;\n}\n\n//see numberMaxSize comment in layout.ts\nconst maxAllowedNumberVal = 2 ** (numberMaxSize * 8);\n\nexport function serializeNum(\n  val: NumType,\n  size: number,\n  cursor: Cursor,\n  endianness: Endianness = defaultEndianness,\n  signed: boolean = false,\n) {\n  if (!signed && val < 0)\n    throw new Error(`Value ${val} is negative but unsigned`);\n\n  if (typeof val === \"number\") {\n    if (!Number.isInteger(val))\n      throw new Error(`Value ${val} is not an integer`);\n\n    if (size > numberMaxSize) {\n      if (val >= maxAllowedNumberVal)\n        throw new Error(`Value ${val} is too large to be safely converted into an integer`);\n\n      if (signed && val < -maxAllowedNumberVal)\n        throw new Error(`Value ${val} is too small to be safely converted into an integer`);\n    }\n  }\n\n  const bound = 2n ** BigInt(size * 8 - (signed ? 1 : 0));\n  if (val >= bound)\n    throw new Error(`Value ${val} is too large for ${size} bytes`);\n\n  if (signed && val < -bound)\n    throw new Error(`Value ${val} is too small for ${size} bytes`);\n\n  //correctly handles both signed and unsigned values\n  for (let i = 0; i < size; ++i)\n    cursor.bytes[cursor.offset + i] =\n      Number((BigInt(val) >> BigInt(8 * (endianness === \"big\" ? size - i - 1 : i)) & 0xffn));\n\n  cursor.offset += size;\n}\n\nfunction internalSerialize(layout: Layout, data: any, cursor: Cursor, bcq: BytesConversionQueue) {\n  if (isItem(layout))\n    serializeItem(layout as Item, data, cursor, bcq);\n  else\n    for (const item of layout)\n      try {\n        serializeItem(item, data[item.name], cursor, bcq);\n      }\n      catch (e: any) {\n        e.message = `when serializing item '${item.name}': ${e.message}`;\n        throw e;\n      }\n}\n\nfunction serializeItem(item: Item, data: any, cursor: Cursor, bcq: BytesConversionQueue) {\n  switch (item.binary) {\n    case \"int\":\n    case \"uint\": {\n      const value = (() => {\n        if (isNumType(item.custom)) {\n          if (!(\"omit\" in item && item.omit))\n            checkNumEquals(item.custom, data);\n          return item.custom;\n        }\n\n        if (isNumType(item?.custom?.from))\n          //no proper way to deeply check equality of item.custom.to and data in JS\n          return item!.custom!.from;\n\n        type narrowedCustom = CustomConversion<number, any> | CustomConversion<bigint, any>;\n        return item.custom !== undefined ? (item.custom as narrowedCustom).from(data) : data;\n      })();\n\n      serializeNum(value, item.size, cursor, item.endianness, item.binary === \"int\");\n      break;\n    }\n    case \"bytes\": {\n      const offset = cursor.offset;\n      if (\"lengthSize\" in item && item.lengthSize !== undefined)\n        cursor.offset += item.lengthSize;\n\n      if (bytesItemHasLayout(item)) {\n        const { custom } = item;\n        let layoutData;\n        if (custom === undefined)\n          layoutData = data;\n        else if (typeof custom.from !== \"function\")\n          layoutData = custom.from;\n        else\n          layoutData = bcqGetNext(bcq);\n\n        internalSerialize(item.layout, layoutData, cursor, bcq);\n      }\n      else {\n        const { custom } = item;\n        if (isBytesType(custom)) {\n          if (!(\"omit\" in item && item.omit))\n            checkBytesTypeEqual(custom, data);\n\n          cursorWrite(cursor, custom);\n        }\n        else if (isFixedBytesConversion(custom))\n          //no proper way to deeply check equality of custom.to and data\n          cursorWrite(cursor, custom.from);\n        else\n          cursorWrite(cursor, custom !== undefined ? bcqGetNext(bcq) : data);\n      }\n\n      if (\"lengthSize\" in item && item.lengthSize !== undefined) {\n        const itemSize = cursor.offset - offset - item.lengthSize;\n        const curOffset = cursor.offset;\n        cursor.offset = offset;\n        serializeNum(itemSize, item.lengthSize, cursor, item.lengthEndianness);\n        cursor.offset = curOffset;\n      }\n      else\n        checkItemSize(item, cursor.offset - offset);\n\n      break;\n    }\n    case \"array\": {\n      if (\"length\" in item && item.length !== data.length)\n        throw new Error(\n          `array length mismatch: layout length: ${item.length}, data length: ${data.length}`\n        );\n\n      if (\"lengthSize\" in item && item.lengthSize !== undefined)\n        serializeNum(data.length, item.lengthSize, cursor, item.lengthEndianness);\n\n      for (let i = 0; i < data.length; ++i)\n        internalSerialize(item.layout, data[i], cursor, bcq);\n\n      break;\n    }\n    case \"switch\": {\n      const [idOrConversionId, layout] = findIdLayoutPair(item, data);\n      const idNum = (Array.isArray(idOrConversionId) ? idOrConversionId[0] : idOrConversionId);\n      serializeNum(idNum, item.idSize, cursor, item.idEndianness);\n      internalSerialize(layout, data, cursor, bcq);\n      break;\n    }\n  }\n};\n\n//slightly hacky, but the only way to ensure that we are actually deserializing the\n//  right data without having to re-serialize the layout every time\nexport function getCachedSerializedFrom(\n  item: ItemBase<\"bytes\"> & {layout: Layout; custom: FixedConversion<LayoutObject, any>}\n) {\n  const custom =\n    item.custom as FixedConversion<LayoutObject, any> & {cachedSerializedFrom?: BytesType};\n  if (!(\"cachedSerializedFrom\" in custom)) {\n    custom.cachedSerializedFrom = serialize(item.layout, custom.from);\n    if (\"size\" in item &&\n        item.size !== undefined &&\n        item.size !== custom.cachedSerializedFrom.length\n      )\n      throw new Error(\n        `Layout specification error: custom.from does not serialize to specified size`\n      );\n  }\n  return custom.cachedSerializedFrom!;\n}\n","import type {\n  Endianness,\n  Layout,\n  Item,\n  DeriveType,\n  CustomConversion,\n  NumSizeToPrimitive,\n  NumType,\n  BytesType,\n} from \"./layout\";\nimport { defaultEndianness, numberMaxSize } from \"./layout\";\n\nimport {\n  isNumType,\n  isBytesType,\n  isFixedBytesConversion,\n  checkBytesTypeEqual,\n  checkNumEquals,\n  bytesItemHasLayout,\n} from \"./utils\";\nimport { getCachedSerializedFrom } from \"./serialize\";\n\nexport type DeserializeReturn<L extends Layout, B extends boolean> =\n  B extends true ? DeriveType<L> : readonly [DeriveType<L>, number];\n\nexport function deserialize<const L extends Layout, const B extends boolean = true>(\n  layout: L,\n  bytes: BytesType,\n  consumeAll?: B,\n): DeserializeReturn<L, B> {\n  const boolConsumeAll = consumeAll ?? true;\n  const encoded = {\n    bytes,\n    offset: 0,\n    end: bytes.length,\n  };\n  const decoded = internalDeserialize(layout, encoded);\n\n  if (boolConsumeAll && encoded.offset !== encoded.end)\n    throw new Error(`encoded data is longer than expected: ${encoded.end} > ${encoded.offset}`);\n\n  return (boolConsumeAll ? decoded : [decoded, encoded.offset]) as DeserializeReturn<L, B>;\n}\n\n// --- implementation ---\n\ntype BytesChunk = {\n  bytes: BytesType,\n  offset: number,\n  end: number,\n};\n\nfunction updateOffset(encoded: BytesChunk, size: number) {\n  const newOffset = encoded.offset + size;\n  if (newOffset > encoded.end)\n    throw new Error(`chunk is shorter than expected: ${encoded.end} < ${newOffset}`);\n\n  encoded.offset = newOffset;\n}\n\nfunction internalDeserialize(layout: Layout, encoded: BytesChunk): any {\n  if (!Array.isArray(layout))\n    return deserializeItem(layout as Item, encoded);\n\n  let decoded = {} as any;\n  for (const item of layout)\n    try {\n      ((item as any).omit ? {} : decoded)[item.name] = deserializeItem(item, encoded);\n    }\n    catch (e) {\n      (e as Error).message = `when deserializing item '${item.name}': ${(e as Error).message}`;\n      throw e;\n    }\n\n  return decoded;\n}\n\nfunction deserializeNum<S extends number>(\n  encoded: BytesChunk,\n  size: S,\n  endianness: Endianness = defaultEndianness,\n  signed: boolean = false,\n) {\n  let val = 0n;\n  for (let i = 0; i < size; ++i)\n    val |= BigInt(encoded.bytes[encoded.offset + i]!)\n        << BigInt(8 * (endianness === \"big\" ? size - i - 1 : i));\n\n  //check sign bit if value is indeed signed and adjust accordingly\n  if (signed && (encoded.bytes[encoded.offset + (endianness === \"big\" ? 0 : size - 1)]! & 0x80))\n    val -= 1n << BigInt(8 * size);\n\n  updateOffset(encoded, size);\n\n  return ((size > numberMaxSize) ? val : Number(val)) as NumSizeToPrimitive<S>;\n}\n\nfunction deserializeItem(item: Item, encoded: BytesChunk): any {\n  switch (item.binary) {\n    case \"int\":\n    case \"uint\": {\n      const value = deserializeNum(encoded, item.size, item.endianness, item.binary === \"int\");\n\n      const { custom } = item;\n      if (isNumType(custom)) {\n        checkNumEquals(custom, value);\n        return custom;\n      }\n      if (isNumType(custom?.from)) {\n        checkNumEquals(custom!.from, value);\n        return custom!.to;\n      }\n\n      //narrowing to CustomConversion<UintType, any> is a bit hacky here, since the true type\n      //  would be CustomConversion<number, any> | CustomConversion<bigint, any>, but then we'd\n      //  have to further tease that apart still for no real gain...\n      return custom !== undefined ? (custom as CustomConversion<NumType, any>).to(value) : value;\n    }\n    case \"bytes\": {\n      const expectedSize = (\"lengthSize\" in item && item.lengthSize !== undefined)\n        ? deserializeNum(encoded, item.lengthSize, item.lengthEndianness)\n        : (item as {size?: number})?.size;\n\n      if (bytesItemHasLayout(item)) { //handle layout conversions\n        const { custom } = item;\n        const offset = encoded.offset;\n        let layoutData;\n        if (expectedSize === undefined)\n          layoutData = internalDeserialize(item.layout, encoded);\n        else {\n          const subChunk = {...encoded, end: encoded.offset + expectedSize};\n          updateOffset(encoded, expectedSize);\n          layoutData = internalDeserialize(item.layout, subChunk);\n          if (subChunk.offset !== subChunk.end)\n            throw new Error(\n              `read less data than expected: ${subChunk.offset - encoded.offset} < ${expectedSize}`\n            );\n        }\n\n        if (custom !== undefined) {\n          if (typeof custom.from !== \"function\") {\n            checkBytesTypeEqual(\n              getCachedSerializedFrom(item as any),\n              encoded.bytes,\n              {dataSlice: [offset, encoded.offset]}\n            );\n            return custom.to;\n          }\n          return custom.to(layoutData);\n        }\n\n        return layoutData;\n      }\n\n      const { custom } = item;\n      { //handle fixed conversions\n        let fixedFrom;\n        let fixedTo;\n        if (isBytesType(custom))\n          fixedFrom = custom;\n        else if (isFixedBytesConversion(custom)) {\n          fixedFrom = custom.from;\n          fixedTo = custom.to;\n        }\n        if (fixedFrom !== undefined) {\n          const size = expectedSize ?? fixedFrom.length;\n          const value = encoded.bytes.subarray(encoded.offset, encoded.offset + size);\n          checkBytesTypeEqual(fixedFrom, value);\n          updateOffset(encoded, size);\n          return fixedTo ?? fixedFrom;\n        }\n      }\n\n      //handle no or custom conversions\n      const start = encoded.offset;\n      const end = (expectedSize !== undefined) ? encoded.offset + expectedSize : encoded.end;\n      updateOffset(encoded, end - start);\n\n      const value = encoded.bytes.subarray(start, end);\n      return custom !== undefined ? (custom as CustomConversion<BytesType, any>).to(value) : value;\n    }\n    case \"array\": {\n      let ret = [] as any[];\n      const { layout } = item;\n      const deserializeArrayItem = () => {\n        const deserializedItem = internalDeserialize(layout, encoded);\n        ret.push(deserializedItem);\n      }\n\n      let length: number | null = null;\n      if (\"length\" in item && item.length !== undefined)\n        length = item.length;\n      else if (\"lengthSize\" in item && item.lengthSize !== undefined)\n        length = deserializeNum(encoded, item.lengthSize, item.lengthEndianness);\n\n      if (length !== null)\n        for (let i = 0; i < length; ++i)\n          deserializeArrayItem();\n      else\n        while (encoded.offset < encoded.end)\n          deserializeArrayItem();\n\n      return ret;\n    }\n    case \"switch\": {\n      const id = deserializeNum(encoded, item.idSize, item.idEndianness);\n      const {layouts} = item;\n      if (layouts.length === 0)\n        throw new Error(`switch item has no layouts`);\n\n      const hasPlainIds = typeof layouts[0]![0] === \"number\";\n      const pair = (layouts as readonly any[]).find(([idOrConversionId]) =>\n        hasPlainIds ? idOrConversionId === id : (idOrConversionId)[0] === id);\n\n      if (pair === undefined)\n        throw new Error(`unknown id value: ${id}`);\n\n      const [idOrConversionId, idLayout] = pair;\n      const decoded = internalDeserialize(idLayout, encoded);\n      return {\n        [item.idTag ?? \"id\"]: hasPlainIds ? id : (idOrConversionId as any)[1],\n        ...decoded\n      };\n    }\n  }\n}\n","import type {\n  Layout,\n  ProperLayout,\n  Item,\n  NumItem,\n  BytesItem,\n  ArrayItem,\n  SwitchItem,\n  DeriveType,\n  NumType,\n  BytesType,\n  LayoutObject,\n  FixedConversion,\n  CustomConversion,\n} from \"./layout\";\n\nimport { isPrimitiveType, isItem, isFixedPrimitiveConversion, bytesItemHasLayout } from \"./utils\";\n\nexport type FixedItemsOf<L extends Layout> = StartFilterItemsOf<L, true>;\nexport type DynamicItemsOf<L extends Layout> = StartFilterItemsOf<L, false>;\n\nexport const fixedItemsOf = <const L extends Layout>(layout: L) =>\n  filterItemsOf(layout, true);\n\nexport const dynamicItemsOf = <const L extends Layout>(layout: L) =>\n  filterItemsOf(layout, false);\n\nexport function addFixedValues<const L extends Layout>(\n  layout: L,\n  dynamicValues: DeriveType<DynamicItemsOf<L>>,\n): DeriveType<L> {\n  return internalAddFixedValues(layout, dynamicValues) as DeriveType<L>;\n}\n\n// --- implementation ---\n\ntype NonEmpty = readonly [unknown, ...unknown[]];\n\ntype IPLPair = readonly [any, ProperLayout];\n\ntype FilterItemsOfIPLPairs<ILA extends readonly IPLPair[], Fixed extends boolean> =\n  ILA extends infer V extends readonly IPLPair[]\n  ? V extends readonly [infer H extends IPLPair, ...infer T extends readonly IPLPair[]]\n    ? FilterItemsOf<H[1], Fixed> extends infer P extends ProperLayout | void\n      ? P extends NonEmpty\n        ? [[H[0], P], ...FilterItemsOfIPLPairs<T, Fixed>]\n        : FilterItemsOfIPLPairs<T, Fixed>\n      : never\n    : []\n  : never;\n\ntype FilterLayoutOfItem<I extends { layout: Layout }, Fixed extends boolean> =\n  FilterItemsOf<I[\"layout\"], Fixed> extends infer L extends Item | NonEmpty\n  ? { readonly [K in keyof I]: K extends \"layout\" ? L : I[K] }\n  : void;\n\ntype FilterItem<II extends Item, Fixed extends boolean> =\n  II extends infer I extends Item\n  ? I extends NumItem\n    ? I[\"custom\"] extends NumType | FixedConversion<infer From extends NumType, infer To>\n      ? Fixed extends true ? I : void\n      : Fixed extends true ? void : I\n    : I extends ArrayItem\n    ? FilterLayoutOfItem<I, Fixed>\n    : I extends BytesItem & { layout: Layout }\n    ? I[\"custom\"] extends { custom: FixedConversion<infer From extends LayoutObject, infer To>}\n      ? Fixed extends true ? I : void\n      : I extends { custom: CustomConversion<infer From extends LayoutObject, infer To>}\n      ? Fixed extends true ? void : I\n      : FilterLayoutOfItem<I, Fixed>\n    : I extends BytesItem\n    ? I[\"custom\"] extends BytesType | FixedConversion<infer From extends BytesType, infer To>\n      ? Fixed extends true ? I : void\n      : Fixed extends true ? void : I\n    : I extends SwitchItem\n    ? { readonly [K in keyof I]:\n        K extends \"layouts\" ? FilterItemsOfIPLPairs<I[\"layouts\"], Fixed> : I[K]\n      }\n    : never\n  : never;\n\ntype FilterItemsOf<L extends Layout, Fixed extends boolean> =\n  L extends infer LI extends Item\n  ? FilterItem<LI, Fixed>\n  : L extends infer P extends ProperLayout\n  ? P extends readonly [infer H extends Item, ...infer T extends ProperLayout]\n    ? FilterItem<H, Fixed> extends infer NI\n      ? NI extends Item\n        // @ts-ignore TODO: figure out and fix this\n        ? [NI, ...FilterItemsOf<T, Fixed>]\n        : FilterItemsOf<T, Fixed>\n      : never\n    : []\n  : never;\n\ntype StartFilterItemsOf<L extends Layout, Fixed extends boolean> =\n  FilterItemsOf<L, Fixed> extends infer V extends Layout\n  ? V\n  : never;\n\nfunction filterItem(item: Item, fixed: boolean): Item | null {\n  switch (item.binary) {\n    // @ts-ignore - fallthrough is intentional\n    case \"bytes\": {\n      if (bytesItemHasLayout(item)) {\n        const { custom } = item;\n        if (custom === undefined) {\n          const { layout } = item;\n          if (isItem(layout))\n            return filterItem(layout, fixed);\n\n          const filteredItems = internalFilterItemsOfProperLayout(layout, fixed);\n          return (filteredItems.length > 0) ? { ...item, layout: filteredItems } : null;\n        }\n        const isFixedItem = typeof custom.from !== \"function\";\n        return (fixed && isFixedItem || !fixed && !isFixedItem) ? item : null;\n      }\n    }\n    case \"int\":\n    case \"uint\": {\n      const { custom } = item;\n      const isFixedItem = isPrimitiveType(custom) || isFixedPrimitiveConversion(custom);\n      return (fixed && isFixedItem || !fixed && !isFixedItem) ? item : null;\n    }\n    case \"array\": {\n      const filtered = internalFilterItemsOf(item.layout, fixed);\n      return (filtered !== null) ? { ...item, layout: filtered } : null;\n    }\n    case \"switch\": {\n      const filteredIdLayoutPairs = (item.layouts as readonly any[]).reduce(\n        (acc: any, [idOrConversionId, idLayout]: any) => {\n          const filteredItems = internalFilterItemsOfProperLayout(idLayout, fixed);\n          return filteredItems.length > 0\n            ? [...acc, [idOrConversionId, filteredItems]]\n            : acc;\n        },\n        [] as any[]\n      );\n      return { ...item, layouts: filteredIdLayoutPairs };\n    }\n  }\n}\n\nfunction internalFilterItemsOfProperLayout(proper: ProperLayout, fixed: boolean): ProperLayout {\n  return proper.reduce(\n    (acc, item) => {\n      const filtered = filterItem(item, fixed) as ProperLayout[number] | null;\n      return filtered !== null ? [...acc, filtered] : acc;\n    },\n    [] as ProperLayout\n  );\n}\n\nfunction internalFilterItemsOf(layout: Layout, fixed: boolean): any {\n  return (Array.isArray(layout)\n    ? internalFilterItemsOfProperLayout(layout, fixed)\n    : filterItem(layout as Item, fixed)\n   );\n}\n\nfunction filterItemsOf<L extends Layout, const Fixed extends boolean>(\n  layout: L,\n  fixed: Fixed\n): FilterItemsOf<L, Fixed> {\n  return internalFilterItemsOf(layout, fixed);\n}\n\nfunction internalAddFixedValuesItem(item: Item, dynamicValue: any): any {\n  switch (item.binary) {\n    // @ts-ignore - fallthrough is intentional\n    case \"bytes\": {\n      if (bytesItemHasLayout(item)) {\n        const { custom } = item;\n        if (custom === undefined || typeof custom.from !== \"function\")\n          return internalAddFixedValues(item.layout, custom ? custom.from : dynamicValue);\n\n        return dynamicValue;\n      }\n    }\n    case \"int\":\n    case \"uint\": {\n      const { custom } = item;\n      return (item as {omit?: boolean})?.omit\n        ? undefined\n        : isPrimitiveType(custom)\n        ? custom\n        : isFixedPrimitiveConversion(custom)\n        ? custom.to\n        : dynamicValue;\n    }\n    case \"array\":\n      return Array.isArray(dynamicValue)\n        ? dynamicValue.map(element => internalAddFixedValues(item.layout, element))\n        : undefined;\n    case \"switch\": {\n      const id = dynamicValue[item.idTag ?? \"id\"];\n      const [_, idLayout] = (item.layouts as readonly IPLPair[]).find(([idOrConversionId]) =>\n        (Array.isArray(idOrConversionId) ? idOrConversionId[1] : idOrConversionId) == id\n      )!;\n      return {\n        [item.idTag ?? \"id\"]: id,\n        ...internalAddFixedValues(idLayout, dynamicValue)\n      };\n    }\n  }\n}\n\nfunction internalAddFixedValues(layout: Layout, dynamicValues: any): any {\n  dynamicValues = dynamicValues ?? {};\n  if (isItem(layout))\n    return internalAddFixedValuesItem(layout as Item, dynamicValues);\n\n  const ret = {} as any;\n  for (const item of layout) {\n    const fixedVals = internalAddFixedValuesItem(\n      item,\n      dynamicValues[item.name as keyof typeof dynamicValues] ?? {}\n    );\n    if (fixedVals !== undefined)\n      ret[item.name] = fixedVals;\n  }\n  return ret;\n}\n","import type { Layout, Item, LengthPrefixed, BytesType } from \"./layout\";\nimport { serializeNum, getCachedSerializedFrom } from \"./serialize\";\nimport { isNumType, isBytesType, isFixedBytesConversion, bytesItemHasLayout } from \"./utils\";\nimport { calcStaticSize } from \"./size\";\n\ntype LayoutIndex = number;\n\nexport type Discriminator<B extends boolean = false> =\n  (encoded: BytesType) => B extends false ? LayoutIndex | null : readonly LayoutIndex[];\n\nexport function buildDiscriminator<B extends boolean = false>(\n  layouts: readonly Layout[],\n  allowAmbiguous?: B\n): Discriminator<B> {\n  const [distinguishable, discriminator] = internalBuildDiscriminator(layouts);\n  if (!distinguishable && !allowAmbiguous)\n    throw new Error(\"Cannot uniquely distinguished the given layouts\");\n\n  return (\n    !allowAmbiguous\n    ? (encoded: BytesType) => {\n      const layout = discriminator(encoded);\n      return layout.length === 0 ? null : layout[0];\n    }\n    : discriminator\n  ) as Discriminator<B>;\n}\n\n// --- implementation ---\n\ntype Uint = number;\ntype Bitset = bigint;\ntype Size = Uint;\ntype BytePos = Uint;\ntype ByteVal = Uint; //actually a uint8\ntype Candidates = Bitset;\ntype FixedBytes = (readonly [BytePos, BytesType])[];\n//using a Bounds type (even though currently the upper bound can only either be equal to the lower\n//  bound or Infinity) in anticipation of a future switch layout item that might contain multiple\n//  sublayouts which, unlike arrays currently, could all be bounded but potentially with\n//  different sizes\ntype Bounds = [Size, Size];\n\nfunction arrayToBitset(arr: readonly number[]): Bitset {\n  return arr.reduce((bit, i) => bit | BigInt(1) << BigInt(i), BigInt(0));\n}\n\nfunction bitsetToArray(bitset: Bitset): number[] {\n  const ret: number[] = [];\n  for (let i = 0n; bitset > 0n; bitset >>= 1n, ++i)\n    if (bitset & 1n)\n      ret.push(Number(i));\n\n  return ret;\n}\n\nfunction count(candidates: Candidates) {\n  let count = 0;\n  for (; candidates > 0n; candidates >>= 1n)\n    count += Number(candidates & 1n);\n  return count;\n}\n\nconst lengthSizeMax = (lengthSize: number) =>\n  lengthSize > 0 ? 2**(8 * lengthSize) - 1 : Infinity;\n\nfunction layoutItemMeta(\n  item: Item,\n  offset: BytePos | null,\n  fixedBytes: FixedBytes,\n): Bounds {\n  switch (item.binary) {\n    case \"int\":\n    case \"uint\": {\n      const fixedVal =\n        isNumType(item.custom)\n        ? item.custom\n        : isNumType(item?.custom?.from)\n        ? item!.custom!.from\n        : null;\n\n      if (fixedVal !== null && offset !== null) {\n        const cursor = {bytes: new Uint8Array(item.size), offset: 0};\n        serializeNum(fixedVal, item.size, cursor, item.endianness, item.binary === \"int\");\n        fixedBytes.push([offset, cursor.bytes]);\n      }\n\n      return [item.size, item.size];\n    }\n    case \"bytes\": {\n      const lengthSize = (\"lengthSize\" in item) ? item.lengthSize | 0 : 0;\n\n      let fixed;\n      let fixedSize;\n      if (bytesItemHasLayout(item)) {\n        const { custom } = item;\n        if (custom !== undefined && typeof custom.from !== \"function\") {\n          fixed = getCachedSerializedFrom(item as any);\n          fixedSize = fixed.length;\n        }\n        else {\n          const layoutSize = calcStaticSize(item.layout);\n          if (layoutSize !== null)\n            fixedSize = layoutSize;\n        }\n      }\n      else {\n        const { custom } = item;\n        if (isBytesType(custom)) {\n          fixed = custom;\n          fixedSize = custom.length;\n        }\n        else if (isFixedBytesConversion(custom)) {\n          fixed = custom.from;\n          fixedSize = custom.from.length;\n        }\n      }\n\n      if (lengthSize > 0 && offset !== null) {\n        if (fixedSize !== undefined) {\n          const cursor = {bytes: new Uint8Array(lengthSize), offset: 0};\n          const endianess = (item as LengthPrefixed).lengthEndianness;\n          serializeNum(fixedSize, lengthSize, cursor, endianess, false);\n          fixedBytes.push([offset, cursor.bytes]);\n        }\n        offset += lengthSize;\n      }\n\n      if (fixed !== undefined) {\n        if (offset !== null)\n          fixedBytes.push([offset, fixed]);\n\n        return [lengthSize + fixed.length, lengthSize + fixed.length];\n      }\n\n      //lengthSize must be 0 if size is defined\n      const ret = (\"size\" in item && item.size !== undefined)\n        ? [item.size, item.size] as Bounds\n        : undefined;\n\n      if (bytesItemHasLayout(item)) {\n        const lm = createLayoutMeta(item.layout, offset, fixedBytes)\n        return ret ?? [lengthSize + lm[0], lengthSize + lm[1]];\n      }\n\n      return ret ?? [lengthSize, lengthSizeMax(lengthSize)];\n    }\n    case \"array\": {\n      if (\"length\" in item) {\n        let localFixedBytes = [] as FixedBytes;\n        const itemSize = createLayoutMeta(item.layout, 0, localFixedBytes);\n        if (offset !== null) {\n          if (itemSize[0] !== itemSize[1]) {\n            //if the size of an array item is not fixed we can only add the fixed bytes of the\n            //  first item\n            if (item.length > 0)\n              for (const [o, s] of localFixedBytes)\n                fixedBytes.push([offset + o, s]);\n          }\n          else {\n            //otherwise we can add fixed know bytes for each array item\n            for (let i = 0; i < item.length; ++i)\n              for (const [o, s] of localFixedBytes)\n                fixedBytes.push([offset + o + i * itemSize[0], s]);\n          }\n        }\n\n        return [item.length * itemSize[0], item.length * itemSize[1]];\n      }\n      const lengthSize = (item as LengthPrefixed).lengthSize | 0;\n      return [lengthSize, lengthSizeMax(lengthSize)];\n    }\n    case \"switch\": {\n      const caseFixedBytes = item.layouts.map(_ => []) as FixedBytes[];\n      const {idSize, idEndianness} = item;\n      const caseBounds = item.layouts.map(([idOrConversionId, layout], caseIndex) => {\n        const idVal = Array.isArray(idOrConversionId) ? idOrConversionId[0] : idOrConversionId;\n        if (offset !== null) {\n          const cursor = {bytes: new Uint8Array(idSize), offset: 0};\n          serializeNum(idVal, idSize, cursor, idEndianness);\n          caseFixedBytes[caseIndex]!.push([0, cursor.bytes]);\n        }\n        const ret = createLayoutMeta(\n          layout,\n          offset !== null ? idSize : null,\n          caseFixedBytes[caseIndex]!\n        );\n        return [ret[0] + idSize, ret[1] + idSize] as Bounds;\n      });\n\n      if (offset !== null && caseFixedBytes.every(fbs => fbs.length > 0))\n        //find bytes that have the same value across all cases\n        //  (it's a lambda to enable early return from inner loops)\n        (() => {\n          //constrain search to the minimum length of all cases\n          const minLen = Math.min(\n            ...caseFixedBytes.map(fbs => fbs.at(-1)![0] + fbs.at(-1)![1].length)\n          );\n          //keep track of the current index in each case's fixed bytes array\n          const itIndexes = caseFixedBytes.map(_ => 0);\n\n          for (let bytePos = 0; bytePos < minLen;) {\n            let byteVal: number | null = null;\n            let caseIndex = 0;\n            while (caseIndex < caseFixedBytes.length) {\n              let curItIndex = itIndexes[caseIndex]!;\n              const curFixedBytes = caseFixedBytes[caseIndex]!;\n              const [curOffset, curSerialized] = curFixedBytes[curItIndex]!;\n              if (curOffset + curSerialized.length <= bytePos) {\n                //no fixed byte at this position in this case\n                ++curItIndex;\n\n                if (curItIndex === curFixedBytes.length)\n                  return; //we have exhausted all fixed bytes in at least one case\n\n                itIndexes[caseIndex] = curItIndex;\n                //jump to the next possible bytePos given the fixed bytes of the current case index\n                bytePos = curFixedBytes[curItIndex]![0];\n                break;\n              }\n\n              const curByteVal = curSerialized[bytePos - curOffset];\n              if (byteVal === null)\n                byteVal = curByteVal;\n\n              if (curByteVal !== byteVal) {\n                ++bytePos;\n                break;\n              }\n\n              ++caseIndex;\n            }\n\n            //only if we made it through all cases without breaking do we have a fixed byte\n            //  and hence add it to the list of fixed bytes\n            if (caseIndex === caseFixedBytes.length) {\n              fixedBytes.push([offset + bytePos, new Uint8Array([byteVal!])]);\n              ++bytePos;\n            }\n          }\n        })();\n\n      return [\n        Math.min(...caseBounds.map(([lower]) => lower)),\n        Math.max(...caseBounds.map(([_, upper]) => upper))\n      ] as Bounds;\n    }\n  }\n}\n\nfunction createLayoutMeta(\n  layout: Layout,\n  offset: BytePos | null,\n  fixedBytes: FixedBytes\n): Bounds {\n  if (!Array.isArray(layout))\n    return layoutItemMeta(layout as Item, offset, fixedBytes);\n\n  let bounds = [0, 0] as Bounds;\n  for (const item of layout) {\n    const itemSize = layoutItemMeta(item, offset, fixedBytes);\n    bounds[0] += itemSize[0];\n    bounds[1] += itemSize[1];\n    //if the bounds don't agree then we can't reliably predict the offset of subsequent items\n    if (offset !== null)\n      offset = itemSize[0] === itemSize[1] ? offset + itemSize[0] : null;\n  }\n  return bounds;\n}\n\nfunction buildAscendingBounds(sortedBounds: readonly (readonly [Bounds, LayoutIndex])[]) {\n  const ascendingBounds = new Map<Size, Candidates>();\n  //sortedCandidates tracks all layouts that have a size bound that contains the size that's\n  //  currently under consideration, sorted in ascending order of their respective upper bounds\n  let sortedCandidates = [] as (readonly [Size, LayoutIndex])[];\n  const closeCandidatesBefore = (before: number) => {\n    while (sortedCandidates.length > 0 && sortedCandidates[0]![0] < before) {\n      const end = sortedCandidates[0]![0] + 1;\n      //remove all candidates that end at the same position\n      const removeIndex = sortedCandidates.findIndex(([upper]) => end <= upper);\n      if (removeIndex === -1)\n        sortedCandidates = [];\n      else\n        sortedCandidates.splice(0, removeIndex);\n      //introduce a new bound that captures all candidates that can have a size of at least `end`\n      ascendingBounds.set(end, arrayToBitset(sortedCandidates.map(([, j]) => j)));\n    }\n  };\n\n  for (const [[lower, upper], i] of sortedBounds) {\n    closeCandidatesBefore(lower);\n    const insertIndex = sortedCandidates.findIndex(([u]) => u > upper);\n    if (insertIndex === -1)\n      sortedCandidates.push([upper, i]);\n    else\n      sortedCandidates.splice(insertIndex, 0, [upper, i]);\n\n    ascendingBounds.set(lower, arrayToBitset(sortedCandidates.map(([, j]) => j)));\n  }\n  closeCandidatesBefore(Infinity);\n\n  return ascendingBounds;\n}\n\n//Generates a greedy divide-and-conquer strategy to determine the layout (or set of layouts) that\n//  a given serialized byte array might conform to.\n//It leverages size bounds and known fixed bytes of layouts to quickly eliminate candidates, by\n//  (greedily) choosing the discriminator (byte or size) that eliminates the most candidates at\n//  each step.\n//Power is a relative measure of the strength of a discriminator given a set of layout candidates.\n//  It's in [0, candidate.length - 1] and states how many layouts of that set can _at least_ be\n//  eliminated when applying that discriminator.\n//Layout sizes are only tracked in terms of lower and upper bounds. This means that while a layout\n//  like an array of e.g. 2 byte uints can actually never have an odd size, the algorithm will\n//  simply treat it as having a size bound of [0, Infinity]. This means that the algorithm is\n//  \"lossy\" in the sense that it does not use all the information that it actually has available\n//  and will e.g. wrongly conclude that the aforementioned layout cannot be distinguished from a\n//  second layout that starts off with a one byte uint followed by an array of 2 byte uints (and\n//  would thus always have odd size). I.e. it would wrongly conclude that the power of the size\n//  discriminator is 0 when it should be 1.\n//The alternative to accepting this limitation is tracking all possible combinations of offsets,\n//  multiples, and their arbitrary composition which would be massively more complicated and\n//  also pointless in the general case because we'd have to figure out whether a given size can be\n//  expressed as some combination of offsets and array size multiples in which case it's almost\n//  certainly computationally cheaper to simply attempt to deserialize the given given data for the\n//  respective layout.\nfunction internalBuildDiscriminator(\n  layouts: readonly Layout[]\n): [boolean, (encoded: BytesType) => readonly LayoutIndex[]] {\n  //for debug output:\n  // const candStr = (candidate: Bitset) => candidate.toString(2).padStart(layouts.length, '0');\n\n  if (layouts.length === 0)\n    throw new Error(\"Cannot discriminate empty set of layouts\");\n\n  const emptySet = 0n;\n  const allLayouts = (1n << BigInt(layouts.length)) - 1n;\n\n  const fixedKnown = layouts.map(() => [] as FixedBytes);\n  const sizeBounds = layouts.map((l, i) => createLayoutMeta(l, 0, fixedKnown[i]!));\n  const sortedBounds = sizeBounds.map((b, i) => [b, i] as const).sort(([[l1]], [[l2]]) => l1 - l2);\n\n  const mustHaveByteAt = (() => {\n    let remaining = allLayouts;\n    const ret = new Map<Size, Candidates>();\n    for (const [[lower], i] of sortedBounds) {\n      remaining ^= 1n << BigInt(i); //delete the i-th bit\n      ret.set(lower, remaining);\n    }\n    return ret;\n  })();\n  const ascendingBounds = buildAscendingBounds(sortedBounds);\n  const sizePower = layouts.length - Math.max(\n    ...[...ascendingBounds.values()].map(candidates => count(candidates))\n  );\n  //we don't check sizePower here and bail early if it is perfect because we prefer perfect byte\n  //  discriminators over perfect size discriminators due to their faster lookup times (hash map\n  //  vs binary search (and actually currently everything is even implement using linear search))\n  //  and more predictable / lower complexity branching behavior.\n  const layoutsWithByteAt = (bytePos: BytePos) => {\n    let ret = allLayouts;\n    for (const [lower, candidates] of mustHaveByteAt) {\n      if (bytePos < lower)\n        break;\n\n      ret = candidates;\n    }\n    return ret;\n  };\n\n  const layoutsWithSize = (size: Size) => {\n    let ret = emptySet;\n    for (const [lower, candidates] of ascendingBounds) {\n      if (size < lower)\n        break;\n\n      ret = candidates;\n    }\n    return ret;\n  };\n\n  const fixedKnownBytes: readonly ((readonly [ByteVal, LayoutIndex])[])[] = Array.from({length:\n    Math.max(...fixedKnown.map(fkb => fkb.length > 0 ? fkb.at(-1)![0] + fkb.at(-1)![1].length : 0))\n  }).map(() => []);\n\n  for (let i = 0; i < fixedKnown.length; ++i)\n    for (const [offset, serialized] of fixedKnown[i]!)\n      for (let j = 0; j < serialized.length; ++j)\n        fixedKnownBytes[offset + j]!.push([serialized[j]!, i]);\n\n  //debug output:\n  // console.log(\"fixedKnownBytes:\",\n  //   fixedKnownBytes.map((v, i) => v.length > 0 ? [i, v] : undefined).filter(v => v !== undefined)\n  // );\n\n  let bestBytes: [number, BytePos, Candidates, Map<ByteVal, Candidates>, Candidates,][] = [];\n  for (const [bytePos, fixedKnownByte] of fixedKnownBytes.entries()) {\n    //the number of layouts with a given size is an upper bound on the discriminatory power of\n    //  a byte at a given position: If the encoded data is too short we can automatically\n    //  exclude all layouts whose minimum size is larger than it, nevermind those who expect\n    //  a known, fixed value at this position.\n    const lwba = layoutsWithByteAt(bytePos);\n    const anyValueLayouts = lwba ^ arrayToBitset(fixedKnownByte.map(([, layoutIdx]) => layoutIdx));\n    const outOfBoundsLayouts = allLayouts ^ lwba;\n    const distinctValues = new Map<BytePos, Candidates>();\n    //the following equation holds (after applying .length to each component):\n    //layouts = outOfBoundsLayouts + anyValueLayouts + fixedKnownByte\n    for (const [byteVal, candidate] of fixedKnownByte) {\n      if (!distinctValues.has(byteVal))\n        distinctValues.set(byteVal, emptySet);\n\n      distinctValues.set(byteVal, distinctValues.get(byteVal)! | 1n << BigInt(candidate));\n    }\n\n    let power = layouts.length - Math.max(count(anyValueLayouts), count(outOfBoundsLayouts));\n    for (const layoutsWithValue of distinctValues.values()) {\n      //if we find the byte value associated with this set of layouts, we can eliminate\n      //  all other layouts that don't have this value at this position and all layouts\n      //  that are too short to have a value in this position regardless\n      const curPower = fixedKnownByte.length - count(layoutsWithValue) + count(outOfBoundsLayouts);\n      power = Math.min(power, curPower);\n    }\n\n    //debug output:\n    // console.log(\n    //   \"bytePos:\", bytePos,\n    //   \"\\npower:\", power,\n    //   \"\\nfixedKnownByte:\", fixedKnownByte,\n    //   \"\\nlwba:\", candStr(lwba),\n    //   \"\\nanyValueLayouts:\", candStr(anyValueLayouts),\n    //   \"\\noutOfBoundsLayouts:\", candStr(outOfBoundsLayouts),\n    //   \"\\ndistinctValues:\", new Map([...distinctValues].map(([k, v]) => [k, candStr(v)]))\n    // );\n\n    if (power === 0)\n      continue;\n\n    if (power === layouts.length - 1)\n      //we have a perfect byte discriminator -> bail early\n      return [\n        true,\n        (encoded: BytesType) =>\n          bitsetToArray(\n            encoded.length <= bytePos\n            ? outOfBoundsLayouts\n            : distinctValues.get(encoded[bytePos]!) ?? emptySet\n          )\n      ];\n\n    bestBytes.push([power, bytePos, outOfBoundsLayouts, distinctValues, anyValueLayouts] as const);\n  }\n\n  //if we get here, we know we don't have a perfect byte discriminator so we now check wether we\n  //  we have a perfect size discriminator and bail early if so\n  if (sizePower === layouts.length - 1)\n    return [true, (encoded: BytesType) => bitsetToArray(layoutsWithSize(encoded.length))];\n\n  //sort in descending order of power\n  bestBytes.sort(([lhsPower], [rhsPower]) => rhsPower - lhsPower);\n  type BestBytes = typeof bestBytes;\n  type Strategy = [BytePos, Candidates, Map<number, Candidates>] | \"size\" | \"indistinguishable\";\n\n  let distinguishable = true;\n  const strategies = new Map<Candidates, Strategy>();\n  const candidatesBySize = new Map<Size, Candidates[]>();\n  const addStrategy = (candidates: Candidates, strategy: Strategy) => {\n    strategies.set(candidates, strategy);\n    if (!candidatesBySize.has(count(candidates)))\n      candidatesBySize.set(count(candidates), []);\n    candidatesBySize.get(count(candidates))!.push(candidates);\n  };\n\n  const recursivelyBuildStrategy = (\n    candidates: Candidates,\n    bestBytes: BestBytes,\n  ) => {\n    if (count(candidates) <= 1 || strategies.has(candidates))\n      return;\n\n    let sizePower = 0;\n    const narrowedBounds = new Map<Size, Candidates>();\n    for (const candidate of bitsetToArray(candidates)) {\n      const lower = sizeBounds[candidate]![0];\n      const overlap = ascendingBounds.get(lower)! & candidates;\n      narrowedBounds.set(lower, overlap)\n      sizePower = Math.max(sizePower, count(overlap));\n    }\n    sizePower = count(candidates) - sizePower;\n\n    const narrowedBestBytes = [] as BestBytes;\n    for (const [power, bytePos, outOfBoundsLayouts, distinctValues, anyValueLayouts] of bestBytes) {\n      const narrowedDistinctValues = new Map<ByteVal, Candidates>();\n      let fixedKnownCount = 0;\n      for (const [byteVal, layoutsWithValue] of distinctValues) {\n        const lwv = layoutsWithValue & candidates;\n        if (count(lwv) > 0) {\n          narrowedDistinctValues.set(byteVal, lwv);\n          fixedKnownCount += count(lwv);\n        }\n      }\n      const narrowedOutOfBoundsLayouts = outOfBoundsLayouts & candidates;\n\n      let narrowedPower = narrowedDistinctValues.size > 0 ? power : 0;\n      for (const layoutsWithValue of narrowedDistinctValues.values()) {\n        const curPower =\n          fixedKnownCount - count(layoutsWithValue) + count(narrowedOutOfBoundsLayouts);\n        narrowedPower = Math.min(narrowedPower, curPower);\n      }\n\n      if (narrowedPower === 0)\n        continue;\n\n      if (narrowedPower === count(candidates) - 1) {\n        //if we have a perfect byte discriminator, we can bail early\n        addStrategy(candidates, [bytePos, narrowedOutOfBoundsLayouts, narrowedDistinctValues]);\n        return;\n      }\n\n      narrowedBestBytes.push([\n        narrowedPower,\n        bytePos,\n        narrowedOutOfBoundsLayouts,\n        narrowedDistinctValues,\n        anyValueLayouts & candidates\n      ] as const);\n    }\n\n    if (sizePower === count(candidates) - 1) {\n      //if we have a perfect size discriminator, we can bail early\n      addStrategy(candidates, \"size\");\n      return;\n    }\n\n    narrowedBestBytes.sort(([lhsPower], [rhsPower]) => rhsPower - lhsPower);\n\n    //prefer byte discriminators over size discriminators\n    if (narrowedBestBytes.length > 0 && narrowedBestBytes[0]![0] >= sizePower) {\n      const [, bytePos, narrowedOutOfBoundsLayouts, narrowedDistinctValues, anyValueLayouts] =\n        narrowedBestBytes[0]!;\n      addStrategy(candidates, [bytePos, narrowedOutOfBoundsLayouts, narrowedDistinctValues]);\n      recursivelyBuildStrategy(narrowedOutOfBoundsLayouts, narrowedBestBytes);\n      for (const cand of narrowedDistinctValues.values())\n        recursivelyBuildStrategy(cand | anyValueLayouts, narrowedBestBytes.slice(1));\n\n      return;\n    }\n\n    if (sizePower > 0) {\n      addStrategy(candidates, \"size\");\n      for (const cands of narrowedBounds.values())\n        recursivelyBuildStrategy(cands, narrowedBestBytes);\n\n      return;\n    }\n\n    addStrategy(candidates, \"indistinguishable\");\n    distinguishable = false;\n  }\n\n  recursivelyBuildStrategy(allLayouts, bestBytes);\n\n  const findSmallestSuperSetStrategy = (candidates: Candidates) => {\n    for (let size = count(candidates) + 1; size < layouts.length - 2; ++size)\n      for (const larger of candidatesBySize.get(size) ?? [])\n        if ((candidates & larger) == candidates) //is subset?\n          return strategies.get(larger)!;\n\n    throw new Error(\"Implementation error in layout discrimination algorithm\");\n  };\n\n  //debug output:\n  // console.log(\"strategies:\", JSON.stringify(\n  //     new Map([...strategies].map(([cands, strat]) => [\n  //       candStr(cands),\n  //       typeof strat === \"string\"\n  //         ? strat\n  //         : [\n  //           strat[0], //bytePos\n  //           candStr(strat[1]), //outOfBoundsLayouts\n  //           new Map([...strat[2]].map(([value, cands]) => [value, candStr(cands)]))\n  //         ]\n  //     ]\n  //   ))\n  // ));\n\n  return [distinguishable, (encoded: BytesType) => {\n    let candidates = allLayouts;\n\n    let strategy = strategies.get(candidates)!;\n    while (strategy !== \"indistinguishable\") {\n      //debug output:\n      // console.log(\n      //   \"applying strategy\", strategy,\n      //   \"\\nfor remaining candidates:\", candStr(candidates)\n      // );\n      if (strategy === \"size\")\n        candidates &= layoutsWithSize(encoded.length);\n      else {\n        const [bytePos, outOfBoundsLayouts, distinctValues] = strategy;\n        if (encoded.length <= bytePos)\n          candidates &= outOfBoundsLayouts;\n        else {\n          const byteVal = encoded[bytePos];\n          for (const [val, cands] of distinctValues)\n            if (val !== byteVal)\n              candidates ^= candidates & cands; //= candidates - cands (set minus)\n\n          candidates ^= candidates & outOfBoundsLayouts;\n        }\n      }\n\n      if (count(candidates) <= 1)\n        break;\n\n      strategy = strategies.get(candidates) ?? findSmallestSuperSetStrategy(candidates)\n    }\n\n    //debug output:\n    // console.log(\"final candidates\", candStr(candidates));\n    return bitsetToArray(candidates);\n  }];\n}\n","import type {\n  Endianness,\n  NumberSize,\n  NumSizeToPrimitive,\n  DeriveType,\n  Layout,\n  BytesItem,\n  FixedConversion,\n  CustomConversion\n} from \"./layout\";\nimport { numberMaxSize } from \"./layout\";\nimport { isLayout, isFixedBytesConversion } from \"./utils\";\n\n//-------------------------------- customizableBytes --------------------------------\n\nexport type CustomizableBytes =\n  undefined |\n  Layout |\n  Uint8Array |\n  FixedConversion<Uint8Array, any> |\n  CustomConversion<Uint8Array, any> |\n  readonly [Layout, FixedConversion<any, any> | CustomConversion<any, any>];\n\nexport type BytesBase =\n  ( {} | { readonly name: string } ) & Omit<BytesItem, \"binary\" | \"custom\" | \"layout\">;\n\ntype CombineObjects<T, U> = {\n  readonly [K in keyof T | keyof U]: K extends keyof T ? T[K] : K extends keyof U ? U[K] : never;\n};\n\nexport type CustomizableBytesReturn<B extends BytesBase, P extends CustomizableBytes> =\n  CombineObjects<\n    B,\n    P extends undefined\n    ? { binary: \"bytes\" }\n    : P extends Layout\n    ? { binary: \"bytes\", layout: P }\n    : P extends Uint8Array | FixedConversion<Uint8Array, any> | CustomConversion<Uint8Array, any>\n    ? { binary: \"bytes\", custom: P }\n    : P extends readonly [Layout, FixedConversion<any, any> | CustomConversion<any, any>]\n    ? { binary: \"bytes\", layout: P[0], custom: P[1] }\n    : never\n  >;\n\nexport const customizableBytes = <\n  const B extends BytesBase,\n  const C extends CustomizableBytes\n>(base: B, spec?: C) => ({\n  ...base,\n  binary: \"bytes\",\n  ...(() => {\n    if (spec === undefined)\n      return {};\n\n    if (isLayout(spec))\n      return { layout: spec };\n\n    if (spec instanceof Uint8Array || isFixedBytesConversion(spec) || !Array.isArray(spec))\n      return { custom: spec };\n\n    return { layout: spec[0], custom: spec[1] };\n  })()\n} as CustomizableBytesReturn<B, C>);\n\n//-------------------------------- boolItem --------------------------------\n\nexport function boolItem(permissive: boolean = false) {\n  return {\n    binary: \"uint\",\n    size: 1,\n    custom: {\n      to: (encoded: number): boolean => {\n        if (encoded === 0)\n          return false;\n\n        if (permissive || encoded === 1)\n          return true;\n\n        throw new Error(`Invalid bool value: ${encoded}`);\n      },\n      from: (value: boolean): number => value ? 1 : 0,\n    }\n  } as const;\n}\n\n//-------------------------------- enumItem --------------------------------\n\nexport function enumItem<\n  const E extends readonly (readonly [string, number])[],\n  const S extends NumberSize = 1,\n  const EN extends Endianness = \"big\"\n>(entries: E, opts?: { size?: S, endianness?: EN }) {\n  const valueToName = Object.fromEntries(entries.map(([name, value]) => [value, name]));\n  const nameToValue = Object.fromEntries(entries);\n  return {\n    binary: \"uint\",\n    size: (opts?.size ?? 1) as S,\n    endianness: (opts?.endianness ?? \"big\") as EN,\n    custom: {\n      to: (encoded: number): E[number][0] => {\n        const name = valueToName[encoded];\n        if (name === undefined)\n          throw new Error(`Invalid enum value: ${encoded}`);\n\n        return name;\n      },\n      from: (name: E[number][0]) => nameToValue[name]!,\n    }\n  } as const;\n}\n\n//-------------------------------- optionItem --------------------------------\n\nconst baseOptionItem = <const T extends CustomizableBytes>(someType: T) => ({\n  binary: \"switch\",\n  idSize: 1,\n  idTag: \"isSome\",\n  layouts: [\n    [[0, false], []],\n    [[1, true ], [customizableBytes({ name: \"value\"}, someType)]],\n  ]\n} as const);\n\ntype BaseOptionItem<T extends CustomizableBytes> =\n  DeriveType<ReturnType<typeof baseOptionItem<T>>>;\n\ntype BaseOptionValue<T extends CustomizableBytes> =\n  DeriveType<CustomizableBytesReturn<{}, T>> | undefined;\n\nexport function optionItem<const T extends CustomizableBytes>(optVal: T) {\n  return {\n    binary: \"bytes\",\n    layout: baseOptionItem(optVal),\n    custom: {\n      to: (obj: BaseOptionItem<T>): BaseOptionValue<T> =>\n        obj.isSome === true\n        //typescript is not smart enough to narrow the outer type based on the inner type\n        ? (obj as Exclude<typeof obj, {isSome: false}>)[\"value\"]\n        : undefined,\n      from: (value: BaseOptionValue<T>): BaseOptionItem<T> =>\n        value === undefined\n        ? { isSome: false }\n        : { isSome: true, value } as any, //good luck narrowing this type\n    } satisfies CustomConversion<BaseOptionItem<T>, BaseOptionValue<T>>\n  } as const\n};\n\n//-------------------------------- bitsetItem --------------------------------\n\nexport type Bitset<B extends readonly (string | undefined)[]> =\n  {[K in B[number] as K extends \"\" | undefined ? never : K]: boolean};\n\ntype ByteSize = [\n  never,\n  1, 1, 1, 1, 1, 1, 1, 1,\n  2, 2, 2, 2, 2, 2, 2, 2,\n  3, 3, 3, 3, 3, 3, 3, 3,\n  4, 4, 4, 4, 4, 4, 4, 4,\n  5, 5, 5, 5, 5, 5, 5, 5,\n  6, 6, 6, 6, 6, 6, 6, 6,\n];\n\ntype BitsizeToBytesize<N extends number> = N extends keyof ByteSize ? ByteSize[N] : number;\n\nexport type BitsetItem<\n  B extends readonly (string | undefined)[],\n  S extends number = BitsizeToBytesize<B[\"length\"]>,\n> = {\n  binary: \"uint\";\n  size: S;\n  custom: {\n    to: (encoded: NumSizeToPrimitive<S>) => Bitset<B>;\n    from: (obj: Bitset<B>) => NumSizeToPrimitive<S>;\n  };\n};\n\nexport function bitsetItem<\n  const B extends readonly (string | undefined)[],\n  const S extends number = BitsizeToBytesize<B[\"length\"]>,\n>(bitnames: B, size?: S): BitsetItem<B, S> {\n  return {\n    binary: \"uint\",\n    size: (size ?? Math.ceil(bitnames.length / 8)) as S,\n    custom: {\n      to: (encoded: NumSizeToPrimitive<S>): Bitset<B> => {\n        const ret: Bitset<B> = {} as Bitset<B>;\n        for (let i = 0; i < bitnames.length; ++i)\n          if (bitnames[i]) //skip undefined and empty string\n            //always use bigint for simplicity\n            ret[bitnames[i] as keyof Bitset<B>] = (BigInt(encoded) & (1n << BigInt(i))) !== 0n;\n\n        return ret;\n      },\n      from: (obj: Bitset<B>): NumSizeToPrimitive<S> => {\n        let val = 0n;\n        for (let i = 0; i < bitnames.length; ++i)\n          if (bitnames[i] && obj[bitnames[i] as keyof Bitset<B>])\n            val |= 1n << BigInt(i);\n\n        return (bitnames.length > numberMaxSize ? val : Number(val)) as NumSizeToPrimitive<S>;\n      },\n    },\n  } as const\n}\n","import type {\n  Endianness,\n  Layout,\n  ProperLayout,\n  Item,\n  NumItem,\n  BytesItem,\n  ArrayItem,\n  LengthPrefixed,\n  SwitchItem,\n} from \"./layout\";\n\nimport { isItem } from \"./utils\";\n\nexport function setEndianness<const L extends Layout, E extends Endianness>(\n  layout: L,\n  endianness: E,\n): SetEndianness<L, E> {\n  return isItem(layout)\n    ? setItemEndianness(layout, endianness)\n    : (layout as ProperLayout).map(item => setItemEndianness(item, endianness)) as any;\n}\n\nfunction setItemEndianness(item: Item, endianness: Endianness): any {\n  switch (item.binary) {\n    case \"uint\":\n    case \"int\":\n      return item?.size === 1 ? item : { ...item, endianness };\n    case \"bytes\":\n    case \"array\": {\n      const layout = \"layout\" in item\n        ? { layout: setEndianness(item.layout, endianness) }\n        : {};\n      const lengthEndianness = (\"lengthSize\" in item && item.lengthSize !== 1)\n        ? { lengthEndianness: endianness }\n        : {};\n      return { ...item, ...layout, ...lengthEndianness };\n    }\n    case \"switch\": {\n      const idEndianness = item.idSize !== 1 ? { idEndianness: endianness } : {};\n      const layouts = item.layouts.map(([id, layout]) => [id, setEndianness(layout, endianness)]);\n      return { ...item, ...idEndianness, layouts };\n    }\n  }\n}\n\n//reminder: this will not propagate through custom conversions that use layouts themselves!\n//\n//All the \"extras\" in this type are to tell tsc about type invariants when writing functions\n//  that accept layouts as const generic parameters, otherwise when running e.g. a generic type\n//  like `const L extends ProperLayout` through setEndianness, tsc will fail to realize that the\n//  result is also guaranteed to be a ProperLayout, which sucks for chaining.\nexport type SetEndianness<L extends Layout, E extends Endianness> =\n    Layout       extends L ? Layout\n  : ProperLayout extends L ? ProperLayout\n  : Item         extends L ? Item\n  : L extends infer LI extends Item\n  ? SetItemEndianness<LI, E> extends infer R extends Item\n    ? R\n    : never\n  : L extends infer P extends ProperLayout\n  ? SetProperLayoutEndianness<P, E> extends infer R extends ProperLayout\n    ? R\n    : never\n  : never;\n\ntype SetItemEndianness<I extends Item, E extends Endianness> =\n  I extends NumItem\n  ? I[\"size\"] extends 1\n    ? I\n    : SetProperty<I, \"endianness\", E>\n  : I extends BytesItem | ArrayItem\n  ? RecurseLayoutProperty<I, E> extends infer RI extends Item\n    ? RI extends LengthPrefixed\n      ? RI[\"lengthSize\"] extends 1\n        ? RI\n        : SetProperty<RI, \"lengthEndianness\", E>\n      : RI\n    : never\n  : I extends SwitchItem\n  ? RecurseSwitchItem<I, E> extends infer RI extends SwitchItem\n    ? RI[\"idSize\"] extends 1\n      ? RI\n      : SetProperty<RI, \"idEndianness\", E>\n    : never\n  : never;\n\ntype SetProperLayoutEndianness<P extends ProperLayout, E extends Endianness> =\n  P extends readonly [infer H extends Item, ...infer T extends ProperLayout]\n  ? readonly [SetItemEndianness<H, E>, ...SetProperLayoutEndianness<T, E>]\n  : readonly [];\n\ntype RecurseLayoutProperty<I extends Item, E extends Endianness> =\n  \"layout\" extends keyof I\n  ? I[\"layout\"] extends Layout\n    ? SetProperty<I, \"layout\", SetEndianness<I[\"layout\"], E>>\n    : never\n  : I;\n\ntype RecurseSwitchItemImpl<SL extends readonly unknown[], E extends Endianness> =\n  SL extends readonly [\n    readonly [infer Id, infer P extends ProperLayout],\n    ...infer T extends readonly unknown[]\n  ]\n  ? readonly [readonly [Id, SetProperLayoutEndianness<P, E>], ...RecurseSwitchItemImpl<T, E>]\n  : readonly [];\n\ntype RecurseSwitchItem<I extends SwitchItem, E extends Endianness> =\n  SetProperty<I, \"layouts\", RecurseSwitchItemImpl<I[\"layouts\"], E>>;\n\n//Omit<I, P> & { readonly [K in P]: E }\ntype SetProperty<I extends Item, P extends string, V> =\n  { readonly [K in keyof I | P]: K extends P ? V : K extends keyof I ? I[K] : never } extends\n    infer R extends Item\n  ? R\n  : never;\n",null,"/*! scure-base - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\nexport interface Coder<F, T> {\n  encode(from: F): T;\n  decode(to: T): F;\n}\n\nexport interface BytesCoder extends Coder<Uint8Array, string> {\n  encode: (data: Uint8Array) => string;\n  decode: (str: string) => Uint8Array;\n}\n\nfunction isBytes(a: unknown): a is Uint8Array {\n  return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n/** Asserts something is Uint8Array. */\nfunction abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n  if (!isBytes(b)) throw new Error('Uint8Array expected');\n  if (lengths.length > 0 && !lengths.includes(b.length))\n    throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\nfunction isArrayOf(isString: boolean, arr: any[]) {\n  if (!Array.isArray(arr)) return false;\n  if (arr.length === 0) return true;\n  if (isString) {\n    return arr.every((item) => typeof item === 'string');\n  } else {\n    return arr.every((item) => Number.isSafeInteger(item));\n  }\n}\n\n// no abytes: seems to have 10% slowdown. Why?!\n\nfunction afn(input: Function): input is Function {\n  if (typeof input !== 'function') throw new Error('function expected');\n  return true;\n}\n\nfunction astr(label: string, input: unknown): input is string {\n  if (typeof input !== 'string') throw new Error(`${label}: string expected`);\n  return true;\n}\n\nfunction anumber(n: number): void {\n  if (!Number.isSafeInteger(n)) throw new Error(`invalid integer: ${n}`);\n}\n\nfunction aArr(input: any[]) {\n  if (!Array.isArray(input)) throw new Error('array expected');\n}\nfunction astrArr(label: string, input: string[]) {\n  if (!isArrayOf(true, input)) throw new Error(`${label}: array of strings expected`);\n}\nfunction anumArr(label: string, input: number[]) {\n  if (!isArrayOf(false, input)) throw new Error(`${label}: array of numbers expected`);\n}\n\n// TODO: some recusive type inference so it would check correct order of input/output inside rest?\n// like <string, number>, <number, bytes>, <bytes, float>\ntype Chain = [Coder<any, any>, ...Coder<any, any>[]];\n// Extract info from Coder type\ntype Input<F> = F extends Coder<infer T, any> ? T : never;\ntype Output<F> = F extends Coder<any, infer T> ? T : never;\n// Generic function for arrays\ntype First<T> = T extends [infer U, ...any[]] ? U : never;\ntype Last<T> = T extends [...any[], infer U] ? U : never;\ntype Tail<T> = T extends [any, ...infer U] ? U : never;\n\ntype AsChain<C extends Chain, Rest = Tail<C>> = {\n  // C[K] = Coder<Input<C[K]>, Input<Rest[k]>>\n  [K in keyof C]: Coder<Input<C[K]>, Input<K extends keyof Rest ? Rest[K] : any>>;\n};\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction chain<T extends Chain & AsChain<T>>(...args: T): Coder<Input<First<T>>, Output<Last<T>>> {\n  const id = (a: any) => a;\n  // Wrap call in closure so JIT can inline calls\n  const wrap = (a: any, b: any) => (c: any) => a(b(c));\n  // Construct chain of args[-1].encode(args[-2].encode([...]))\n  const encode = args.map((x) => x.encode).reduceRight(wrap, id);\n  // Construct chain of args[0].decode(args[1].decode(...))\n  const decode = args.map((x) => x.decode).reduce(wrap, id);\n  return { encode, decode };\n}\n\n/**\n * Encodes integer radix representation to array of strings using alphabet and back.\n * Could also be array of strings.\n * @__NO_SIDE_EFFECTS__\n */\nfunction alphabet(letters: string | string[]): Coder<number[], string[]> {\n  // mapping 1 to \"b\"\n  const lettersA = typeof letters === 'string' ? letters.split('') : letters;\n  const len = lettersA.length;\n  astrArr('alphabet', lettersA);\n\n  // mapping \"b\" to 1\n  const indexes = new Map(lettersA.map((l, i) => [l, i]));\n  return {\n    encode: (digits: number[]) => {\n      aArr(digits);\n      return digits.map((i) => {\n        if (!Number.isSafeInteger(i) || i < 0 || i >= len)\n          throw new Error(\n            `alphabet.encode: digit index outside alphabet \"${i}\". Allowed: ${letters}`\n          );\n        return lettersA[i]!;\n      });\n    },\n    decode: (input: string[]): number[] => {\n      aArr(input);\n      return input.map((letter) => {\n        astr('alphabet.decode', letter);\n        const i = indexes.get(letter);\n        if (i === undefined) throw new Error(`Unknown letter: \"${letter}\". Allowed: ${letters}`);\n        return i;\n      });\n    },\n  };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction join(separator = ''): Coder<string[], string> {\n  astr('join', separator);\n  return {\n    encode: (from) => {\n      astrArr('join.decode', from);\n      return from.join(separator);\n    },\n    decode: (to) => {\n      astr('join.decode', to);\n      return to.split(separator);\n    },\n  };\n}\n\n/**\n * Pad strings array so it has integer number of bits\n * @__NO_SIDE_EFFECTS__\n */\nfunction padding(bits: number, chr = '='): Coder<string[], string[]> {\n  anumber(bits);\n  astr('padding', chr);\n  return {\n    encode(data: string[]): string[] {\n      astrArr('padding.encode', data);\n      while ((data.length * bits) % 8) data.push(chr);\n      return data;\n    },\n    decode(input: string[]): string[] {\n      astrArr('padding.decode', input);\n      let end = input.length;\n      if ((end * bits) % 8)\n        throw new Error('padding: invalid, string should have whole number of bytes');\n      for (; end > 0 && input[end - 1] === chr; end--) {\n        const last = end - 1;\n        const byte = last * bits;\n        if (byte % 8 === 0) throw new Error('padding: invalid, string has too much padding');\n      }\n      return input.slice(0, end);\n    },\n  };\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction normalize<T>(fn: (val: T) => T): Coder<T, T> {\n  afn(fn);\n  return { encode: (from: T) => from, decode: (to: T) => fn(to) };\n}\n\n/**\n * Slow: O(n^2) time complexity\n */\nfunction convertRadix(data: number[], from: number, to: number): number[] {\n  // base 1 is impossible\n  if (from < 2) throw new Error(`convertRadix: invalid from=${from}, base cannot be less than 2`);\n  if (to < 2) throw new Error(`convertRadix: invalid to=${to}, base cannot be less than 2`);\n  aArr(data);\n  if (!data.length) return [];\n  let pos = 0;\n  const res = [];\n  const digits = Array.from(data, (d) => {\n    anumber(d);\n    if (d < 0 || d >= from) throw new Error(`invalid integer: ${d}`);\n    return d;\n  });\n  const dlen = digits.length;\n  while (true) {\n    let carry = 0;\n    let done = true;\n    for (let i = pos; i < dlen; i++) {\n      const digit = digits[i]!;\n      const fromCarry = from * carry;\n      const digitBase = fromCarry + digit;\n      if (\n        !Number.isSafeInteger(digitBase) ||\n        fromCarry / from !== carry ||\n        digitBase - digit !== fromCarry\n      ) {\n        throw new Error('convertRadix: carry overflow');\n      }\n      const div = digitBase / to;\n      carry = digitBase % to;\n      const rounded = Math.floor(div);\n      digits[i] = rounded;\n      if (!Number.isSafeInteger(rounded) || rounded * to + carry !== digitBase)\n        throw new Error('convertRadix: carry overflow');\n      if (!done) continue;\n      else if (!rounded) pos = i;\n      else done = false;\n    }\n    res.push(carry);\n    if (done) break;\n  }\n  for (let i = 0; i < data.length - 1 && data[i] === 0; i++) res.push(0);\n  return res.reverse();\n}\n\nconst gcd = (a: number, b: number): number => (b === 0 ? a : gcd(b, a % b));\nconst radix2carry = /* @__NO_SIDE_EFFECTS__ */ (from: number, to: number) =>\n  from + (to - gcd(from, to));\nconst powers: number[] = /* @__PURE__ */ (() => {\n  let res = [];\n  for (let i = 0; i < 40; i++) res.push(2 ** i);\n  return res;\n})();\n/**\n * Implemented with numbers, because BigInt is 5x slower\n */\nfunction convertRadix2(data: number[], from: number, to: number, padding: boolean): number[] {\n  aArr(data);\n  if (from <= 0 || from > 32) throw new Error(`convertRadix2: wrong from=${from}`);\n  if (to <= 0 || to > 32) throw new Error(`convertRadix2: wrong to=${to}`);\n  if (radix2carry(from, to) > 32) {\n    throw new Error(\n      `convertRadix2: carry overflow from=${from} to=${to} carryBits=${radix2carry(from, to)}`\n    );\n  }\n  let carry = 0;\n  let pos = 0; // bitwise position in current element\n  const max = powers[from]!;\n  const mask = powers[to]! - 1;\n  const res: number[] = [];\n  for (const n of data) {\n    anumber(n);\n    if (n >= max) throw new Error(`convertRadix2: invalid data word=${n} from=${from}`);\n    carry = (carry << from) | n;\n    if (pos + from > 32) throw new Error(`convertRadix2: carry overflow pos=${pos} from=${from}`);\n    pos += from;\n    for (; pos >= to; pos -= to) res.push(((carry >> (pos - to)) & mask) >>> 0);\n    const pow = powers[pos];\n    if (pow === undefined) throw new Error('invalid carry');\n    carry &= pow - 1; // clean carry, otherwise it will cause overflow\n  }\n  carry = (carry << (to - pos)) & mask;\n  if (!padding && pos >= from) throw new Error('Excess padding');\n  if (!padding && carry > 0) throw new Error(`Non-zero padding: ${carry}`);\n  if (padding && pos > 0) res.push(carry >>> 0);\n  return res;\n}\n\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix(num: number): Coder<Uint8Array, number[]> {\n  anumber(num);\n  const _256 = 2 ** 8;\n  return {\n    encode: (bytes: Uint8Array) => {\n      if (!isBytes(bytes)) throw new Error('radix.encode input should be Uint8Array');\n      return convertRadix(Array.from(bytes), _256, num);\n    },\n    decode: (digits: number[]) => {\n      anumArr('radix.decode', digits);\n      return Uint8Array.from(convertRadix(digits, num, _256));\n    },\n  };\n}\n\n/**\n * If both bases are power of same number (like `2**8 <-> 2**64`),\n * there is a linear algorithm. For now we have implementation for power-of-two bases only.\n * @__NO_SIDE_EFFECTS__\n */\nfunction radix2(bits: number, revPadding = false): Coder<Uint8Array, number[]> {\n  anumber(bits);\n  if (bits <= 0 || bits > 32) throw new Error('radix2: bits should be in (0..32]');\n  if (radix2carry(8, bits) > 32 || radix2carry(bits, 8) > 32)\n    throw new Error('radix2: carry overflow');\n  return {\n    encode: (bytes: Uint8Array) => {\n      if (!isBytes(bytes)) throw new Error('radix2.encode input should be Uint8Array');\n      return convertRadix2(Array.from(bytes), 8, bits, !revPadding);\n    },\n    decode: (digits: number[]) => {\n      anumArr('radix2.decode', digits);\n      return Uint8Array.from(convertRadix2(digits, bits, 8, revPadding));\n    },\n  };\n}\n\ntype ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;\nfunction unsafeWrapper<T extends (...args: any) => any>(fn: T) {\n  afn(fn);\n  return function (...args: ArgumentTypes<T>): ReturnType<T> | void {\n    try {\n      return fn.apply(null, args);\n    } catch (e) {}\n  };\n}\n\nfunction checksum(\n  len: number,\n  fn: (data: Uint8Array) => Uint8Array\n): Coder<Uint8Array, Uint8Array> {\n  anumber(len);\n  afn(fn);\n  return {\n    encode(data: Uint8Array) {\n      if (!isBytes(data)) throw new Error('checksum.encode: input should be Uint8Array');\n      const sum = fn(data).slice(0, len);\n      const res = new Uint8Array(data.length + len);\n      res.set(data);\n      res.set(sum, data.length);\n      return res;\n    },\n    decode(data: Uint8Array) {\n      if (!isBytes(data)) throw new Error('checksum.decode: input should be Uint8Array');\n      const payload = data.slice(0, -len);\n      const oldChecksum = data.slice(-len);\n      const newChecksum = fn(payload).slice(0, len);\n      for (let i = 0; i < len; i++)\n        if (newChecksum[i] !== oldChecksum[i]) throw new Error('Invalid checksum');\n      return payload;\n    },\n  };\n}\n\n// prettier-ignore\nexport const utils: { alphabet: typeof alphabet; chain: typeof chain; checksum: typeof checksum; convertRadix: typeof convertRadix; convertRadix2: typeof convertRadix2; radix: typeof radix; radix2: typeof radix2; join: typeof join; padding: typeof padding; } = {\n  alphabet, chain, checksum, convertRadix, convertRadix2, radix, radix2, join, padding,\n};\n\n// RFC 4648 aka RFC 3548\n// ---------------------\n\n/**\n * base16 encoding from RFC 4648.\n * @example\n * ```js\n * base16.encode(Uint8Array.from([0x12, 0xab]));\n * // => '12AB'\n * ```\n */\nexport const base16: BytesCoder = chain(radix2(4), alphabet('0123456789ABCDEF'), join(''));\n\n/**\n * base32 encoding from RFC 4648. Has padding.\n * Use `base32nopad` for unpadded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ===='\n * base32.decode('CKVQ====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32: BytesCoder = chain(\n  radix2(5),\n  alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n  padding(5),\n  join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding.\n * Use `base32` for padded version.\n * Also check out `base32hex`, `base32hexnopad`, `base32crockford`.\n * @example\n * ```js\n * base32nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'CKVQ'\n * base32nopad.decode('CKVQ');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32nopad: BytesCoder = chain(\n  radix2(5),\n  alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZ234567'),\n  join('')\n);\n/**\n * base32 encoding from RFC 4648. Padded. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hexnopad` for unpadded version.\n * @example\n * ```js\n * base32hex.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG===='\n * base32hex.decode('2ALG====');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hex: BytesCoder = chain(\n  radix2(5),\n  alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n  padding(5),\n  join('')\n);\n\n/**\n * base32 encoding from RFC 4648. No padding. Compared to ordinary `base32`, slightly different alphabet.\n * Use `base32hex` for padded version.\n * @example\n * ```js\n * base32hexnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ALG'\n * base32hexnopad.decode('2ALG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32hexnopad: BytesCoder = chain(\n  radix2(5),\n  alphabet('0123456789ABCDEFGHIJKLMNOPQRSTUV'),\n  join('')\n);\n/**\n * base32 encoding from RFC 4648. Doug Crockford's version.\n * https://www.crockford.com/base32.html\n * @example\n * ```js\n * base32crockford.encode(Uint8Array.from([0x12, 0xab]));\n * // => '2ANG'\n * base32crockford.decode('2ANG');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base32crockford: BytesCoder = chain(\n  radix2(5),\n  alphabet('0123456789ABCDEFGHJKMNPQRSTVWXYZ'),\n  join(''),\n  normalize((s: string) => s.toUpperCase().replace(/O/g, '0').replace(/[IL]/g, '1'))\n);\n\n// Built-in base64 conversion https://caniuse.com/mdn-javascript_builtins_uint8array_frombase64\n// prettier-ignore\nconst hasBase64Builtin: boolean = /* @__PURE__ */ (() =>\n  typeof (Uint8Array as any).from([]).toBase64 === 'function' &&\n  typeof (Uint8Array as any).fromBase64 === 'function')();\n\nconst decodeBase64Builtin = (s: string, isUrl: boolean) => {\n  astr('base64', s);\n  const re = isUrl ? /^[A-Za-z0-9=_-]+$/ : /^[A-Za-z0-9=+/]+$/;\n  const alphabet = isUrl ? 'base64url' : 'base64';\n  if (s.length > 0 && !re.test(s)) throw new Error('invalid base64');\n  return (Uint8Array as any).fromBase64(s, { alphabet, lastChunkHandling: 'strict' });\n};\n\n/**\n * base64 from RFC 4648. Padded.\n * Use `base64nopad` for unpadded version.\n * Also check out `base64url`, `base64urlnopad`.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64: BytesCoder = hasBase64Builtin ? {\n  encode(b) { abytes(b); return (b as any).toBase64(); },\n  decode(s) { return decodeBase64Builtin(s, false); },\n} : chain(\n  radix2(6),\n  alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n  padding(6),\n  join('')\n);\n/**\n * base64 from RFC 4648. No padding.\n * Use `base64` for padded version.\n * @example\n * ```js\n * base64nopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64nopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64nopad: BytesCoder = chain(\n  radix2(6),\n  alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'),\n  join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. Padded.\n * Use `base64urlnopad` for unpadded version.\n * Falls back to built-in function, when available.\n * @example\n * ```js\n * base64url.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs='\n * base64url.decode('Eqs=');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\n// prettier-ignore\nexport const base64url: BytesCoder = hasBase64Builtin ? {\n  encode(b) { abytes(b); return (b as any).toBase64({ alphabet: 'base64url' }); },\n  decode(s) { return decodeBase64Builtin(s, true); },\n} : chain(\n  radix2(6),\n  alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n  padding(6),\n  join('')\n);\n\n/**\n * base64 from RFC 4648, using URL-safe alphabet. No padding.\n * Use `base64url` for padded version.\n * @example\n * ```js\n * base64urlnopad.encode(Uint8Array.from([0x12, 0xab]));\n * // => 'Eqs'\n * base64urlnopad.decode('Eqs');\n * // => Uint8Array.from([0x12, 0xab])\n * ```\n */\nexport const base64urlnopad: BytesCoder = chain(\n  radix2(6),\n  alphabet('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'),\n  join('')\n);\n\n// base58 code\n// -----------\nconst genBase58 = /* @__NO_SIDE_EFFECTS__ */ (abc: string) =>\n  chain(radix(58), alphabet(abc), join(''));\n\n/**\n * base58: base64 without ambigous characters +, /, 0, O, I, l.\n * Quadratic (O(n^2)) - so, can't be used on large inputs.\n * @example\n * ```js\n * base58.decode('01abcdef');\n * // => '3UhJW'\n * ```\n */\nexport const base58: BytesCoder = genBase58(\n  '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\n);\n/**\n * base58: flickr version. Check out `base58`.\n */\nexport const base58flickr: BytesCoder = genBase58(\n  '123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ'\n);\n/**\n * base58: XRP version. Check out `base58`.\n */\nexport const base58xrp: BytesCoder = genBase58(\n  'rpshnaf39wBUDNEGHJKLM4PQRST7VWXYZ2bcdeCg65jkm8oFqi1tuvAxyz'\n);\n\n// Data len (index) -> encoded block len\nconst XMR_BLOCK_LEN = [0, 2, 3, 5, 6, 7, 9, 10, 11];\n\n/**\n * base58: XMR version. Check out `base58`.\n * Done in 8-byte blocks (which equals 11 chars in decoding). Last (non-full) block padded with '1' to size in XMR_BLOCK_LEN.\n * Block encoding significantly reduces quadratic complexity of base58.\n */\nexport const base58xmr: BytesCoder = {\n  encode(data: Uint8Array) {\n    let res = '';\n    for (let i = 0; i < data.length; i += 8) {\n      const block = data.subarray(i, i + 8);\n      res += base58.encode(block).padStart(XMR_BLOCK_LEN[block.length]!, '1');\n    }\n    return res;\n  },\n  decode(str: string) {\n    let res: number[] = [];\n    for (let i = 0; i < str.length; i += 11) {\n      const slice = str.slice(i, i + 11);\n      const blockLen = XMR_BLOCK_LEN.indexOf(slice.length);\n      const block = base58.decode(slice);\n      for (let j = 0; j < block.length - blockLen; j++) {\n        if (block[j] !== 0) throw new Error('base58xmr: wrong padding');\n      }\n      res = res.concat(Array.from(block.slice(block.length - blockLen)));\n    }\n    return Uint8Array.from(res);\n  },\n};\n\n/**\n * Method, which creates base58check encoder.\n * Requires function, calculating sha256.\n */\nexport const createBase58check = (sha256: (data: Uint8Array) => Uint8Array): BytesCoder =>\n  chain(\n    checksum(4, (data) => sha256(sha256(data))),\n    base58\n  );\n\n/**\n * Use `createBase58check` instead.\n * @deprecated\n */\nexport const base58check: (sha256: (data: Uint8Array) => Uint8Array) => BytesCoder =\n  createBase58check;\n\n// Bech32 code\n// -----------\nexport interface Bech32Decoded<Prefix extends string = string> {\n  prefix: Prefix;\n  words: number[];\n}\nexport interface Bech32DecodedWithArray<Prefix extends string = string> {\n  prefix: Prefix;\n  words: number[];\n  bytes: Uint8Array;\n}\n\nconst BECH_ALPHABET: Coder<number[], string> = chain(\n  alphabet('qpzry9x8gf2tvdw0s3jn54khce6mua7l'),\n  join('')\n);\n\nconst POLYMOD_GENERATORS = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];\nfunction bech32Polymod(pre: number): number {\n  const b = pre >> 25;\n  let chk = (pre & 0x1ffffff) << 5;\n  for (let i = 0; i < POLYMOD_GENERATORS.length; i++) {\n    if (((b >> i) & 1) === 1) chk ^= POLYMOD_GENERATORS[i]!;\n  }\n  return chk;\n}\n\nfunction bechChecksum(prefix: string, words: number[], encodingConst = 1): string {\n  const len = prefix.length;\n  let chk = 1;\n  for (let i = 0; i < len; i++) {\n    const c = prefix.charCodeAt(i);\n    if (c < 33 || c > 126) throw new Error(`Invalid prefix (${prefix})`);\n    chk = bech32Polymod(chk) ^ (c >> 5);\n  }\n  chk = bech32Polymod(chk);\n  for (let i = 0; i < len; i++) chk = bech32Polymod(chk) ^ (prefix.charCodeAt(i) & 0x1f);\n  for (let v of words) chk = bech32Polymod(chk) ^ v;\n  for (let i = 0; i < 6; i++) chk = bech32Polymod(chk);\n  chk ^= encodingConst;\n  return BECH_ALPHABET.encode(convertRadix2([chk % powers[30]!], 30, 5, false));\n}\n\nexport interface Bech32 {\n  encode<Prefix extends string>(\n    prefix: Prefix,\n    words: number[] | Uint8Array,\n    limit?: number | false\n  ): `${Lowercase<Prefix>}1${string}`;\n  decode<Prefix extends string>(\n    str: `${Prefix}1${string}`,\n    limit?: number | false\n  ): Bech32Decoded<Prefix>;\n  encodeFromBytes(prefix: string, bytes: Uint8Array): string;\n  decodeToBytes(str: string): Bech32DecodedWithArray;\n  decodeUnsafe(str: string, limit?: number | false): void | Bech32Decoded<string>;\n  fromWords(to: number[]): Uint8Array;\n  fromWordsUnsafe(to: number[]): void | Uint8Array;\n  toWords(from: Uint8Array): number[];\n}\n/**\n * @__NO_SIDE_EFFECTS__\n */\nfunction genBech32(encoding: 'bech32' | 'bech32m'): Bech32 {\n  const ENCODING_CONST = encoding === 'bech32' ? 1 : 0x2bc830a3;\n  const _words = radix2(5);\n  const fromWords = _words.decode;\n  const toWords = _words.encode;\n  const fromWordsUnsafe = unsafeWrapper(fromWords);\n\n  function encode<Prefix extends string>(\n    prefix: Prefix,\n    words: number[] | Uint8Array,\n    limit: number | false = 90\n  ): `${Lowercase<Prefix>}1${string}` {\n    astr('bech32.encode prefix', prefix);\n    if (isBytes(words)) words = Array.from(words);\n    anumArr('bech32.encode', words);\n    const plen = prefix.length;\n    if (plen === 0) throw new TypeError(`Invalid prefix length ${plen}`);\n    const actualLength = plen + 7 + words.length;\n    if (limit !== false && actualLength > limit)\n      throw new TypeError(`Length ${actualLength} exceeds limit ${limit}`);\n    const lowered = prefix.toLowerCase();\n    const sum = bechChecksum(lowered, words, ENCODING_CONST);\n    return `${lowered}1${BECH_ALPHABET.encode(words)}${sum}` as `${Lowercase<Prefix>}1${string}`;\n  }\n\n  function decode<Prefix extends string>(\n    str: `${Prefix}1${string}`,\n    limit?: number | false\n  ): Bech32Decoded<Prefix>;\n  function decode(str: string, limit?: number | false): Bech32Decoded;\n  function decode(str: string, limit: number | false = 90): Bech32Decoded {\n    astr('bech32.decode input', str);\n    const slen = str.length;\n    if (slen < 8 || (limit !== false && slen > limit))\n      throw new TypeError(`invalid string length: ${slen} (${str}). Expected (8..${limit})`);\n    // don't allow mixed case\n    const lowered = str.toLowerCase();\n    if (str !== lowered && str !== str.toUpperCase())\n      throw new Error(`String must be lowercase or uppercase`);\n    const sepIndex = lowered.lastIndexOf('1');\n    if (sepIndex === 0 || sepIndex === -1)\n      throw new Error(`Letter \"1\" must be present between prefix and data only`);\n    const prefix = lowered.slice(0, sepIndex);\n    const data = lowered.slice(sepIndex + 1);\n    if (data.length < 6) throw new Error('Data must be at least 6 characters long');\n    const words = BECH_ALPHABET.decode(data).slice(0, -6);\n    const sum = bechChecksum(prefix, words, ENCODING_CONST);\n    if (!data.endsWith(sum)) throw new Error(`Invalid checksum in ${str}: expected \"${sum}\"`);\n    return { prefix, words };\n  }\n\n  const decodeUnsafe = unsafeWrapper(decode);\n\n  function decodeToBytes(str: string): Bech32DecodedWithArray {\n    const { prefix, words } = decode(str, false);\n    return { prefix, words, bytes: fromWords(words) };\n  }\n\n  function encodeFromBytes(prefix: string, bytes: Uint8Array) {\n    return encode(prefix, toWords(bytes));\n  }\n\n  return {\n    encode,\n    decode,\n    encodeFromBytes,\n    decodeToBytes,\n    decodeUnsafe,\n    fromWords,\n    fromWordsUnsafe,\n    toWords,\n  };\n}\n\n/**\n * bech32 from BIP 173. Operates on words.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32: Bech32 = genBech32('bech32');\n\n/**\n * bech32m from BIP 350. Operates on words.\n * It was to mitigate `bech32` weaknesses.\n * For high-level, check out scure-btc-signer:\n * https://github.com/paulmillr/scure-btc-signer.\n */\nexport const bech32m: Bech32 = genBech32('bech32m');\n\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * UTF-8-to-byte decoder. Uses built-in TextDecoder / TextEncoder.\n * @example\n * ```js\n * const b = utf8.decode(\"hey\"); // => new Uint8Array([ 104, 101, 121 ])\n * const str = utf8.encode(b); // \"hey\"\n * ```\n */\nexport const utf8: BytesCoder = {\n  encode: (data) => new TextDecoder().decode(data),\n  decode: (str) => new TextEncoder().encode(str),\n};\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\n// prettier-ignore\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n  typeof (Uint8Array as any).from([]).toHex === 'function' &&\n  typeof (Uint8Array as any).fromHex === 'function')();\n// prettier-ignore\nconst hexBuiltin: BytesCoder = {\n  encode(data) { abytes(data); return (data as any).toHex(); },\n  decode(s) { astr('hex', s); return (Uint8Array as any).fromHex(s); },\n};\n/**\n * hex string decoder. Uses built-in function, when available.\n * @example\n * ```js\n * const b = hex.decode(\"0102ff\"); // => new Uint8Array([ 1, 2, 255 ])\n * const str = hex.encode(b); // \"0102ff\"\n * ```\n */\nexport const hex: BytesCoder = hasHexBuiltin\n  ? hexBuiltin\n  : chain(\n      radix2(4),\n      alphabet('0123456789abcdef'),\n      join(''),\n      normalize((s: string) => {\n        if (typeof s !== 'string' || s.length % 2 !== 0)\n          throw new TypeError(\n            `hex.decode: expected string, got ${typeof s} with length ${s.length}`\n          );\n        return s.toLowerCase();\n      })\n    );\n\nexport type SomeCoders = {\n  utf8: BytesCoder;\n  hex: BytesCoder;\n  base16: BytesCoder;\n  base32: BytesCoder;\n  base64: BytesCoder;\n  base64url: BytesCoder;\n  base58: BytesCoder;\n  base58xmr: BytesCoder;\n};\n// prettier-ignore\nconst CODERS: SomeCoders = {\n  utf8, hex, base16, base32, base64, base64url, base58, base58xmr\n};\ntype CoderType = keyof SomeCoders;\nconst coderTypeError =\n  'Invalid encoding type. Available types: utf8, hex, base16, base32, base64, base64url, base58, base58xmr';\n\n/** @deprecated */\nexport const bytesToString = (type: CoderType, bytes: Uint8Array): string => {\n  if (typeof type !== 'string' || !CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n  if (!isBytes(bytes)) throw new TypeError('bytesToString() expects Uint8Array');\n  return CODERS[type].encode(bytes);\n};\n\n/** @deprecated */\nexport const str: (type: CoderType, bytes: Uint8Array) => string = bytesToString; // as in python, but for bytes only\n\n/** @deprecated */\nexport const stringToBytes = (type: CoderType, str: string): Uint8Array => {\n  if (!CODERS.hasOwnProperty(type)) throw new TypeError(coderTypeError);\n  if (typeof str !== 'string') throw new TypeError('stringToBytes() expects string');\n  return CODERS[type].decode(str);\n};\n/** @deprecated */\nexport const bytes: (type: CoderType, str: string) => Uint8Array = stringToBytes;\n",null,null,null,"/**\n * Internal webcrypto alias.\n * We prefer WebCrypto aka globalThis.crypto, which exists in node.js 16+.\n * Falls back to Node.js built-in crypto for Node.js <=v14.\n * See utils.ts for details.\n * @module\n */\n// @ts-ignore\nimport * as nc from 'node:crypto';\nexport const crypto: any =\n  nc && typeof nc === 'object' && 'webcrypto' in nc\n    ? (nc.webcrypto as any)\n    : nc && typeof nc === 'object' && 'randomBytes' in nc\n      ? nc\n      : undefined;\n","/**\n * Utilities for hex, bytes, CSPRNG.\n * @module\n */\n/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */\n\n// We use WebCrypto aka globalThis.crypto, which exists in browsers and node.js 16+.\n// node.js versions earlier than v19 don't declare it in global scope.\n// For node.js, package.json#exports field mapping rewrites import\n// from `crypto` to `cryptoNode`, which imports native module.\n// Makes the utils un-importable in browsers without a bundler.\n// Once node.js 18 is deprecated (2025-04-30), we can just drop the import.\nimport { crypto } from '@noble/hashes/crypto';\n\n/** Checks if something is Uint8Array. Be careful: nodejs Buffer will return true. */\nexport function isBytes(a: unknown): a is Uint8Array {\n  return a instanceof Uint8Array || (ArrayBuffer.isView(a) && a.constructor.name === 'Uint8Array');\n}\n\n/** Asserts something is positive integer. */\nexport function anumber(n: number): void {\n  if (!Number.isSafeInteger(n) || n < 0) throw new Error('positive integer expected, got ' + n);\n}\n\n/** Asserts something is Uint8Array. */\nexport function abytes(b: Uint8Array | undefined, ...lengths: number[]): void {\n  if (!isBytes(b)) throw new Error('Uint8Array expected');\n  if (lengths.length > 0 && !lengths.includes(b.length))\n    throw new Error('Uint8Array expected of length ' + lengths + ', got length=' + b.length);\n}\n\n/** Asserts something is hash */\nexport function ahash(h: IHash): void {\n  if (typeof h !== 'function' || typeof h.create !== 'function')\n    throw new Error('Hash should be wrapped by utils.createHasher');\n  anumber(h.outputLen);\n  anumber(h.blockLen);\n}\n\n/** Asserts a hash instance has not been destroyed / finished */\nexport function aexists(instance: any, checkFinished = true): void {\n  if (instance.destroyed) throw new Error('Hash instance has been destroyed');\n  if (checkFinished && instance.finished) throw new Error('Hash#digest() has already been called');\n}\n\n/** Asserts output is properly-sized byte array */\nexport function aoutput(out: any, instance: any): void {\n  abytes(out);\n  const min = instance.outputLen;\n  if (out.length < min) {\n    throw new Error('digestInto() expects output buffer of length at least ' + min);\n  }\n}\n\n/** Generic type encompassing 8/16/32-byte arrays - but not 64-byte. */\n// prettier-ignore\nexport type TypedArray = Int8Array | Uint8ClampedArray | Uint8Array |\n  Uint16Array | Int16Array | Uint32Array | Int32Array;\n\n/** Cast u8 / u16 / u32 to u8. */\nexport function u8(arr: TypedArray): Uint8Array {\n  return new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** Cast u8 / u16 / u32 to u32. */\nexport function u32(arr: TypedArray): Uint32Array {\n  return new Uint32Array(arr.buffer, arr.byteOffset, Math.floor(arr.byteLength / 4));\n}\n\n/** Zeroize a byte array. Warning: JS provides no guarantees. */\nexport function clean(...arrays: TypedArray[]): void {\n  for (let i = 0; i < arrays.length; i++) {\n    arrays[i].fill(0);\n  }\n}\n\n/** Create DataView of an array for easy byte-level manipulation. */\nexport function createView(arr: TypedArray): DataView {\n  return new DataView(arr.buffer, arr.byteOffset, arr.byteLength);\n}\n\n/** The rotate right (circular right shift) operation for uint32 */\nexport function rotr(word: number, shift: number): number {\n  return (word << (32 - shift)) | (word >>> shift);\n}\n\n/** The rotate left (circular left shift) operation for uint32 */\nexport function rotl(word: number, shift: number): number {\n  return (word << shift) | ((word >>> (32 - shift)) >>> 0);\n}\n\n/** Is current platform little-endian? Most are. Big-Endian platform: IBM */\nexport const isLE: boolean = /* @__PURE__ */ (() =>\n  new Uint8Array(new Uint32Array([0x11223344]).buffer)[0] === 0x44)();\n\n/** The byte swap operation for uint32 */\nexport function byteSwap(word: number): number {\n  return (\n    ((word << 24) & 0xff000000) |\n    ((word << 8) & 0xff0000) |\n    ((word >>> 8) & 0xff00) |\n    ((word >>> 24) & 0xff)\n  );\n}\n/** Conditionally byte swap if on a big-endian platform */\nexport const swap8IfBE: (n: number) => number = isLE\n  ? (n: number) => n\n  : (n: number) => byteSwap(n);\n\n/** @deprecated */\nexport const byteSwapIfBE: typeof swap8IfBE = swap8IfBE;\n/** In place byte swap for Uint32Array */\nexport function byteSwap32(arr: Uint32Array): Uint32Array {\n  for (let i = 0; i < arr.length; i++) {\n    arr[i] = byteSwap(arr[i]);\n  }\n  return arr;\n}\n\nexport const swap32IfBE: (u: Uint32Array) => Uint32Array = isLE\n  ? (u: Uint32Array) => u\n  : byteSwap32;\n\n// Built-in hex conversion https://caniuse.com/mdn-javascript_builtins_uint8array_fromhex\nconst hasHexBuiltin: boolean = /* @__PURE__ */ (() =>\n  // @ts-ignore\n  typeof Uint8Array.from([]).toHex === 'function' && typeof Uint8Array.fromHex === 'function')();\n\n// Array where index 0xf0 (240) is mapped to string 'f0'\nconst hexes = /* @__PURE__ */ Array.from({ length: 256 }, (_, i) =>\n  i.toString(16).padStart(2, '0')\n);\n\n/**\n * Convert byte array to hex string. Uses built-in function, when available.\n * @example bytesToHex(Uint8Array.from([0xca, 0xfe, 0x01, 0x23])) // 'cafe0123'\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n  abytes(bytes);\n  // @ts-ignore\n  if (hasHexBuiltin) return bytes.toHex();\n  // pre-caching improves the speed 6x\n  let hex = '';\n  for (let i = 0; i < bytes.length; i++) {\n    hex += hexes[bytes[i]];\n  }\n  return hex;\n}\n\n// We use optimized technique to convert hex string to byte array\nconst asciis = { _0: 48, _9: 57, A: 65, F: 70, a: 97, f: 102 } as const;\nfunction asciiToBase16(ch: number): number | undefined {\n  if (ch >= asciis._0 && ch <= asciis._9) return ch - asciis._0; // '2' => 50-48\n  if (ch >= asciis.A && ch <= asciis.F) return ch - (asciis.A - 10); // 'B' => 66-(65-10)\n  if (ch >= asciis.a && ch <= asciis.f) return ch - (asciis.a - 10); // 'b' => 98-(97-10)\n  return;\n}\n\n/**\n * Convert hex string to byte array. Uses built-in function, when available.\n * @example hexToBytes('cafe0123') // Uint8Array.from([0xca, 0xfe, 0x01, 0x23])\n */\nexport function hexToBytes(hex: string): Uint8Array {\n  if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n  // @ts-ignore\n  if (hasHexBuiltin) return Uint8Array.fromHex(hex);\n  const hl = hex.length;\n  const al = hl / 2;\n  if (hl % 2) throw new Error('hex string expected, got unpadded hex of length ' + hl);\n  const array = new Uint8Array(al);\n  for (let ai = 0, hi = 0; ai < al; ai++, hi += 2) {\n    const n1 = asciiToBase16(hex.charCodeAt(hi));\n    const n2 = asciiToBase16(hex.charCodeAt(hi + 1));\n    if (n1 === undefined || n2 === undefined) {\n      const char = hex[hi] + hex[hi + 1];\n      throw new Error('hex string expected, got non-hex character \"' + char + '\" at index ' + hi);\n    }\n    array[ai] = n1 * 16 + n2; // multiply first octet, e.g. 'a3' => 10*16+3 => 160 + 3 => 163\n  }\n  return array;\n}\n\n/**\n * There is no setImmediate in browser and setTimeout is slow.\n * Call of async fn will return Promise, which will be fullfiled only on\n * next scheduler queue processing step and this is exactly what we need.\n */\nexport const nextTick = async (): Promise<void> => {};\n\n/** Returns control to thread each 'tick' ms to avoid blocking. */\nexport async function asyncLoop(\n  iters: number,\n  tick: number,\n  cb: (i: number) => void\n): Promise<void> {\n  let ts = Date.now();\n  for (let i = 0; i < iters; i++) {\n    cb(i);\n    // Date.now() is not monotonic, so in case if clock goes backwards we return return control too\n    const diff = Date.now() - ts;\n    if (diff >= 0 && diff < tick) continue;\n    await nextTick();\n    ts += diff;\n  }\n}\n\n// Global symbols, but ts doesn't see them: https://github.com/microsoft/TypeScript/issues/31535\ndeclare const TextEncoder: any;\ndeclare const TextDecoder: any;\n\n/**\n * Converts string to bytes using UTF8 encoding.\n * @example utf8ToBytes('abc') // Uint8Array.from([97, 98, 99])\n */\nexport function utf8ToBytes(str: string): Uint8Array {\n  if (typeof str !== 'string') throw new Error('string expected');\n  return new Uint8Array(new TextEncoder().encode(str)); // https://bugzil.la/1681809\n}\n\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\nexport function bytesToUtf8(bytes: Uint8Array): string {\n  return new TextDecoder().decode(bytes);\n}\n\n/** Accepted input of hash functions. Strings are converted to byte arrays. */\nexport type Input = string | Uint8Array;\n/**\n * Normalizes (non-hex) string or Uint8Array to Uint8Array.\n * Warning: when Uint8Array is passed, it would NOT get copied.\n * Keep in mind for future mutable operations.\n */\nexport function toBytes(data: Input): Uint8Array {\n  if (typeof data === 'string') data = utf8ToBytes(data);\n  abytes(data);\n  return data;\n}\n\n/** KDFs can accept string or Uint8Array for user convenience. */\nexport type KDFInput = string | Uint8Array;\n/**\n * Helper for KDFs: consumes uint8array or string.\n * When string is passed, does utf8 decoding, using TextDecoder.\n */\nexport function kdfInputToBytes(data: KDFInput): Uint8Array {\n  if (typeof data === 'string') data = utf8ToBytes(data);\n  abytes(data);\n  return data;\n}\n\n/** Copies several Uint8Arrays into one. */\nexport function concatBytes(...arrays: Uint8Array[]): Uint8Array {\n  let sum = 0;\n  for (let i = 0; i < arrays.length; i++) {\n    const a = arrays[i];\n    abytes(a);\n    sum += a.length;\n  }\n  const res = new Uint8Array(sum);\n  for (let i = 0, pad = 0; i < arrays.length; i++) {\n    const a = arrays[i];\n    res.set(a, pad);\n    pad += a.length;\n  }\n  return res;\n}\n\ntype EmptyObj = {};\nexport function checkOpts<T1 extends EmptyObj, T2 extends EmptyObj>(\n  defaults: T1,\n  opts?: T2\n): T1 & T2 {\n  if (opts !== undefined && {}.toString.call(opts) !== '[object Object]')\n    throw new Error('options should be object or undefined');\n  const merged = Object.assign(defaults, opts);\n  return merged as T1 & T2;\n}\n\n/** Hash interface. */\nexport type IHash = {\n  (data: Uint8Array): Uint8Array;\n  blockLen: number;\n  outputLen: number;\n  create: any;\n};\n\n/** For runtime check if class implements interface */\nexport abstract class Hash<T extends Hash<T>> {\n  abstract blockLen: number; // Bytes per block\n  abstract outputLen: number; // Bytes in output\n  abstract update(buf: Input): this;\n  // Writes digest into buf\n  abstract digestInto(buf: Uint8Array): void;\n  abstract digest(): Uint8Array;\n  /**\n   * Resets internal state. Makes Hash instance unusable.\n   * Reset is impossible for keyed hashes if key is consumed into state. If digest is not consumed\n   * by user, they will need to manually call `destroy()` when zeroing is necessary.\n   */\n  abstract destroy(): void;\n  /**\n   * Clones hash instance. Unsafe: doesn't check whether `to` is valid. Can be used as `clone()`\n   * when no options are passed.\n   * Reasons to use `_cloneInto` instead of clone: 1) performance 2) reuse instance => all internal\n   * buffers are overwritten => causes buffer overwrite which is used for digest in some cases.\n   * There are no guarantees for clean-up because it's impossible in JS.\n   */\n  abstract _cloneInto(to?: T): T;\n  // Safe version that clones internal state\n  abstract clone(): T;\n}\n\n/**\n * XOF: streaming API to read digest in chunks.\n * Same as 'squeeze' in keccak/k12 and 'seek' in blake3, but more generic name.\n * When hash used in XOF mode it is up to user to call '.destroy' afterwards, since we cannot\n * destroy state, next call can require more bytes.\n */\nexport type HashXOF<T extends Hash<T>> = Hash<T> & {\n  xof(bytes: number): Uint8Array; // Read 'bytes' bytes from digest stream\n  xofInto(buf: Uint8Array): Uint8Array; // read buf.length bytes from digest stream into buf\n};\n\n/** Hash function */\nexport type CHash = ReturnType<typeof createHasher>;\n/** Hash function with output */\nexport type CHashO = ReturnType<typeof createOptHasher>;\n/** XOF with output */\nexport type CHashXO = ReturnType<typeof createXOFer>;\n\n/** Wraps hash function, creating an interface on top of it */\nexport function createHasher<T extends Hash<T>>(\n  hashCons: () => Hash<T>\n): {\n  (msg: Input): Uint8Array;\n  outputLen: number;\n  blockLen: number;\n  create(): Hash<T>;\n} {\n  const hashC = (msg: Input): Uint8Array => hashCons().update(toBytes(msg)).digest();\n  const tmp = hashCons();\n  hashC.outputLen = tmp.outputLen;\n  hashC.blockLen = tmp.blockLen;\n  hashC.create = () => hashCons();\n  return hashC;\n}\n\nexport function createOptHasher<H extends Hash<H>, T extends Object>(\n  hashCons: (opts?: T) => Hash<H>\n): {\n  (msg: Input, opts?: T): Uint8Array;\n  outputLen: number;\n  blockLen: number;\n  create(opts?: T): Hash<H>;\n} {\n  const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n  const tmp = hashCons({} as T);\n  hashC.outputLen = tmp.outputLen;\n  hashC.blockLen = tmp.blockLen;\n  hashC.create = (opts?: T) => hashCons(opts);\n  return hashC;\n}\n\nexport function createXOFer<H extends HashXOF<H>, T extends Object>(\n  hashCons: (opts?: T) => HashXOF<H>\n): {\n  (msg: Input, opts?: T): Uint8Array;\n  outputLen: number;\n  blockLen: number;\n  create(opts?: T): HashXOF<H>;\n} {\n  const hashC = (msg: Input, opts?: T): Uint8Array => hashCons(opts).update(toBytes(msg)).digest();\n  const tmp = hashCons({} as T);\n  hashC.outputLen = tmp.outputLen;\n  hashC.blockLen = tmp.blockLen;\n  hashC.create = (opts?: T) => hashCons(opts);\n  return hashC;\n}\nexport const wrapConstructor: typeof createHasher = createHasher;\nexport const wrapConstructorWithOpts: typeof createOptHasher = createOptHasher;\nexport const wrapXOFConstructorWithOpts: typeof createXOFer = createXOFer;\n\n/** Cryptographically secure PRNG. Uses internal OS-level `crypto.getRandomValues`. */\nexport function randomBytes(bytesLength = 32): Uint8Array {\n  if (crypto && typeof crypto.getRandomValues === 'function') {\n    return crypto.getRandomValues(new Uint8Array(bytesLength));\n  }\n  // Legacy Node.js compatibility\n  if (crypto && typeof crypto.randomBytes === 'function') {\n    return Uint8Array.from(crypto.randomBytes(bytesLength));\n  }\n  throw new Error('crypto.getRandomValues must be defined');\n}\n","/**\n * Internal Merkle-Damgard hash utils.\n * @module\n */\nimport { type Input, Hash, abytes, aexists, aoutput, clean, createView, toBytes } from './utils.ts';\n\n/** Polyfill for Safari 14. https://caniuse.com/mdn-javascript_builtins_dataview_setbiguint64 */\nexport function setBigUint64(\n  view: DataView,\n  byteOffset: number,\n  value: bigint,\n  isLE: boolean\n): void {\n  if (typeof view.setBigUint64 === 'function') return view.setBigUint64(byteOffset, value, isLE);\n  const _32n = BigInt(32);\n  const _u32_max = BigInt(0xffffffff);\n  const wh = Number((value >> _32n) & _u32_max);\n  const wl = Number(value & _u32_max);\n  const h = isLE ? 4 : 0;\n  const l = isLE ? 0 : 4;\n  view.setUint32(byteOffset + h, wh, isLE);\n  view.setUint32(byteOffset + l, wl, isLE);\n}\n\n/** Choice: a ? b : c */\nexport function Chi(a: number, b: number, c: number): number {\n  return (a & b) ^ (~a & c);\n}\n\n/** Majority function, true if any two inputs is true. */\nexport function Maj(a: number, b: number, c: number): number {\n  return (a & b) ^ (a & c) ^ (b & c);\n}\n\n/**\n * Merkle-Damgard hash construction base class.\n * Could be used to create MD5, RIPEMD, SHA1, SHA2.\n */\nexport abstract class HashMD<T extends HashMD<T>> extends Hash<T> {\n  protected abstract process(buf: DataView, offset: number): void;\n  protected abstract get(): number[];\n  protected abstract set(...args: number[]): void;\n  abstract destroy(): void;\n  protected abstract roundClean(): void;\n\n  readonly blockLen: number;\n  readonly outputLen: number;\n  readonly padOffset: number;\n  readonly isLE: boolean;\n\n  // For partial updates less than block size\n  protected buffer: Uint8Array;\n  protected view: DataView;\n  protected finished = false;\n  protected length = 0;\n  protected pos = 0;\n  protected destroyed = false;\n\n  constructor(blockLen: number, outputLen: number, padOffset: number, isLE: boolean) {\n    super();\n    this.blockLen = blockLen;\n    this.outputLen = outputLen;\n    this.padOffset = padOffset;\n    this.isLE = isLE;\n    this.buffer = new Uint8Array(blockLen);\n    this.view = createView(this.buffer);\n  }\n  update(data: Input): this {\n    aexists(this);\n    data = toBytes(data);\n    abytes(data);\n    const { view, buffer, blockLen } = this;\n    const len = data.length;\n    for (let pos = 0; pos < len; ) {\n      const take = Math.min(blockLen - this.pos, len - pos);\n      // Fast path: we have at least one block in input, cast it to view and process\n      if (take === blockLen) {\n        const dataView = createView(data);\n        for (; blockLen <= len - pos; pos += blockLen) this.process(dataView, pos);\n        continue;\n      }\n      buffer.set(data.subarray(pos, pos + take), this.pos);\n      this.pos += take;\n      pos += take;\n      if (this.pos === blockLen) {\n        this.process(view, 0);\n        this.pos = 0;\n      }\n    }\n    this.length += data.length;\n    this.roundClean();\n    return this;\n  }\n  digestInto(out: Uint8Array): void {\n    aexists(this);\n    aoutput(out, this);\n    this.finished = true;\n    // Padding\n    // We can avoid allocation of buffer for padding completely if it\n    // was previously not allocated here. But it won't change performance.\n    const { buffer, view, blockLen, isLE } = this;\n    let { pos } = this;\n    // append the bit '1' to the message\n    buffer[pos++] = 0b10000000;\n    clean(this.buffer.subarray(pos));\n    // we have less than padOffset left in buffer, so we cannot put length in\n    // current block, need process it and pad again\n    if (this.padOffset > blockLen - pos) {\n      this.process(view, 0);\n      pos = 0;\n    }\n    // Pad until full block byte with zeros\n    for (let i = pos; i < blockLen; i++) buffer[i] = 0;\n    // Note: sha512 requires length to be 128bit integer, but length in JS will overflow before that\n    // You need to write around 2 exabytes (u64_max / 8 / (1024**6)) for this to happen.\n    // So we just write lowest 64 bits of that value.\n    setBigUint64(view, blockLen - 8, BigInt(this.length * 8), isLE);\n    this.process(view, 0);\n    const oview = createView(out);\n    const len = this.outputLen;\n    // NOTE: we do division by 4 later, which should be fused in single op with modulo by JIT\n    if (len % 4) throw new Error('_sha2: outputLen should be aligned to 32bit');\n    const outLen = len / 4;\n    const state = this.get();\n    if (outLen > state.length) throw new Error('_sha2: outputLen bigger than state');\n    for (let i = 0; i < outLen; i++) oview.setUint32(4 * i, state[i], isLE);\n  }\n  digest(): Uint8Array {\n    const { buffer, outputLen } = this;\n    this.digestInto(buffer);\n    const res = buffer.slice(0, outputLen);\n    this.destroy();\n    return res;\n  }\n  _cloneInto(to?: T): T {\n    to ||= new (this.constructor as any)() as T;\n    to.set(...this.get());\n    const { blockLen, buffer, length, finished, destroyed, pos } = this;\n    to.destroyed = destroyed;\n    to.finished = finished;\n    to.length = length;\n    to.pos = pos;\n    if (length % blockLen) to.buffer.set(buffer);\n    return to;\n  }\n  clone(): T {\n    return this._cloneInto();\n  }\n}\n\n/**\n * Initial SHA-2 state: fractional parts of square roots of first 16 primes 2..53.\n * Check out `test/misc/sha2-gen-iv.js` for recomputation guide.\n */\n\n/** Initial SHA256 state. Bits 0..32 of frac part of sqrt of primes 2..19 */\nexport const SHA256_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n  0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,\n]);\n\n/** Initial SHA224 state. Bits 32..64 of frac part of sqrt of primes 23..53 */\nexport const SHA224_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n  0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4,\n]);\n\n/** Initial SHA384 state. Bits 0..64 of frac part of sqrt of primes 23..53 */\nexport const SHA384_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n  0xcbbb9d5d, 0xc1059ed8, 0x629a292a, 0x367cd507, 0x9159015a, 0x3070dd17, 0x152fecd8, 0xf70e5939,\n  0x67332667, 0xffc00b31, 0x8eb44a87, 0x68581511, 0xdb0c2e0d, 0x64f98fa7, 0x47b5481d, 0xbefa4fa4,\n]);\n\n/** Initial SHA512 state. Bits 0..64 of frac part of sqrt of primes 2..19 */\nexport const SHA512_IV: Uint32Array = /* @__PURE__ */ Uint32Array.from([\n  0x6a09e667, 0xf3bcc908, 0xbb67ae85, 0x84caa73b, 0x3c6ef372, 0xfe94f82b, 0xa54ff53a, 0x5f1d36f1,\n  0x510e527f, 0xade682d1, 0x9b05688c, 0x2b3e6c1f, 0x1f83d9ab, 0xfb41bd6b, 0x5be0cd19, 0x137e2179,\n]);\n","/**\n * Internal helpers for u64. BigUint64Array is too slow as per 2025, so we implement it using Uint32Array.\n * @todo re-check https://issues.chromium.org/issues/42212588\n * @module\n */\nconst U32_MASK64 = /* @__PURE__ */ BigInt(2 ** 32 - 1);\nconst _32n = /* @__PURE__ */ BigInt(32);\n\nfunction fromBig(\n  n: bigint,\n  le = false\n): {\n  h: number;\n  l: number;\n} {\n  if (le) return { h: Number(n & U32_MASK64), l: Number((n >> _32n) & U32_MASK64) };\n  return { h: Number((n >> _32n) & U32_MASK64) | 0, l: Number(n & U32_MASK64) | 0 };\n}\n\nfunction split(lst: bigint[], le = false): Uint32Array[] {\n  const len = lst.length;\n  let Ah = new Uint32Array(len);\n  let Al = new Uint32Array(len);\n  for (let i = 0; i < len; i++) {\n    const { h, l } = fromBig(lst[i], le);\n    [Ah[i], Al[i]] = [h, l];\n  }\n  return [Ah, Al];\n}\n\nconst toBig = (h: number, l: number): bigint => (BigInt(h >>> 0) << _32n) | BigInt(l >>> 0);\n// for Shift in [0, 32)\nconst shrSH = (h: number, _l: number, s: number): number => h >>> s;\nconst shrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in [1, 32)\nconst rotrSH = (h: number, l: number, s: number): number => (h >>> s) | (l << (32 - s));\nconst rotrSL = (h: number, l: number, s: number): number => (h << (32 - s)) | (l >>> s);\n// Right rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotrBH = (h: number, l: number, s: number): number => (h << (64 - s)) | (l >>> (s - 32));\nconst rotrBL = (h: number, l: number, s: number): number => (h >>> (s - 32)) | (l << (64 - s));\n// Right rotate for shift===32 (just swaps l&h)\nconst rotr32H = (_h: number, l: number): number => l;\nconst rotr32L = (h: number, _l: number): number => h;\n// Left rotate for Shift in [1, 32)\nconst rotlSH = (h: number, l: number, s: number): number => (h << s) | (l >>> (32 - s));\nconst rotlSL = (h: number, l: number, s: number): number => (l << s) | (h >>> (32 - s));\n// Left rotate for Shift in (32, 64), NOTE: 32 is special case.\nconst rotlBH = (h: number, l: number, s: number): number => (l << (s - 32)) | (h >>> (64 - s));\nconst rotlBL = (h: number, l: number, s: number): number => (h << (s - 32)) | (l >>> (64 - s));\n\n// JS uses 32-bit signed integers for bitwise operations which means we cannot\n// simple take carry out of low bit sum by shift, we need to use division.\nfunction add(\n  Ah: number,\n  Al: number,\n  Bh: number,\n  Bl: number\n): {\n  h: number;\n  l: number;\n} {\n  const l = (Al >>> 0) + (Bl >>> 0);\n  return { h: (Ah + Bh + ((l / 2 ** 32) | 0)) | 0, l: l | 0 };\n}\n// Addition with more than 2 elements\nconst add3L = (Al: number, Bl: number, Cl: number): number => (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0);\nconst add3H = (low: number, Ah: number, Bh: number, Ch: number): number =>\n  (Ah + Bh + Ch + ((low / 2 ** 32) | 0)) | 0;\nconst add4L = (Al: number, Bl: number, Cl: number, Dl: number): number =>\n  (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0);\nconst add4H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number): number =>\n  (Ah + Bh + Ch + Dh + ((low / 2 ** 32) | 0)) | 0;\nconst add5L = (Al: number, Bl: number, Cl: number, Dl: number, El: number): number =>\n  (Al >>> 0) + (Bl >>> 0) + (Cl >>> 0) + (Dl >>> 0) + (El >>> 0);\nconst add5H = (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number): number =>\n  (Ah + Bh + Ch + Dh + Eh + ((low / 2 ** 32) | 0)) | 0;\n\n// prettier-ignore\nexport {\n  add, add3H, add3L, add4H, add4L, add5H, add5L, fromBig, rotlBH, rotlBL, rotlSH, rotlSL, rotr32H, rotr32L, rotrBH, rotrBL, rotrSH, rotrSL, shrSH, shrSL, split, toBig\n};\n// prettier-ignore\nconst u64: { fromBig: typeof fromBig; split: typeof split; toBig: (h: number, l: number) => bigint; shrSH: (h: number, _l: number, s: number) => number; shrSL: (h: number, l: number, s: number) => number; rotrSH: (h: number, l: number, s: number) => number; rotrSL: (h: number, l: number, s: number) => number; rotrBH: (h: number, l: number, s: number) => number; rotrBL: (h: number, l: number, s: number) => number; rotr32H: (_h: number, l: number) => number; rotr32L: (h: number, _l: number) => number; rotlSH: (h: number, l: number, s: number) => number; rotlSL: (h: number, l: number, s: number) => number; rotlBH: (h: number, l: number, s: number) => number; rotlBL: (h: number, l: number, s: number) => number; add: typeof add; add3L: (Al: number, Bl: number, Cl: number) => number; add3H: (low: number, Ah: number, Bh: number, Ch: number) => number; add4L: (Al: number, Bl: number, Cl: number, Dl: number) => number; add4H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number) => number; add5H: (low: number, Ah: number, Bh: number, Ch: number, Dh: number, Eh: number) => number; add5L: (Al: number, Bl: number, Cl: number, Dl: number, El: number) => number; } = {\n  fromBig, split, toBig,\n  shrSH, shrSL,\n  rotrSH, rotrSL, rotrBH, rotrBL,\n  rotr32H, rotr32L,\n  rotlSH, rotlSL, rotlBH, rotlBL,\n  add, add3L, add3H, add4L, add4H, add5H, add5L,\n};\nexport default u64;\n","/**\n * SHA2 hash function. A.k.a. sha256, sha384, sha512, sha512_224, sha512_256.\n * SHA256 is the fastest hash implementable in JS, even faster than Blake3.\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n */\nimport { Chi, HashMD, Maj, SHA224_IV, SHA256_IV, SHA384_IV, SHA512_IV } from './_md.ts';\nimport * as u64 from './_u64.ts';\nimport { type CHash, clean, createHasher, rotr } from './utils.ts';\n\n/**\n * Round constants:\n * First 32 bits of fractional parts of the cube roots of the first 64 primes 2..311)\n */\n// prettier-ignore\nconst SHA256_K = /* @__PURE__ */ Uint32Array.from([\n  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\n  0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\n  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\n  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\n  0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\n  0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n]);\n\n/** Reusable temporary buffer. \"W\" comes straight from spec. */\nconst SHA256_W = /* @__PURE__ */ new Uint32Array(64);\nexport class SHA256 extends HashMD<SHA256> {\n  // We cannot use array here since array allows indexing by variable\n  // which means optimizer/compiler cannot use registers.\n  protected A: number = SHA256_IV[0] | 0;\n  protected B: number = SHA256_IV[1] | 0;\n  protected C: number = SHA256_IV[2] | 0;\n  protected D: number = SHA256_IV[3] | 0;\n  protected E: number = SHA256_IV[4] | 0;\n  protected F: number = SHA256_IV[5] | 0;\n  protected G: number = SHA256_IV[6] | 0;\n  protected H: number = SHA256_IV[7] | 0;\n\n  constructor(outputLen: number = 32) {\n    super(64, outputLen, 8, false);\n  }\n  protected get(): [number, number, number, number, number, number, number, number] {\n    const { A, B, C, D, E, F, G, H } = this;\n    return [A, B, C, D, E, F, G, H];\n  }\n  // prettier-ignore\n  protected set(\n    A: number, B: number, C: number, D: number, E: number, F: number, G: number, H: number\n  ): void {\n    this.A = A | 0;\n    this.B = B | 0;\n    this.C = C | 0;\n    this.D = D | 0;\n    this.E = E | 0;\n    this.F = F | 0;\n    this.G = G | 0;\n    this.H = H | 0;\n  }\n  protected process(view: DataView, offset: number): void {\n    // Extend the first 16 words into the remaining 48 words w[16..63] of the message schedule array\n    for (let i = 0; i < 16; i++, offset += 4) SHA256_W[i] = view.getUint32(offset, false);\n    for (let i = 16; i < 64; i++) {\n      const W15 = SHA256_W[i - 15];\n      const W2 = SHA256_W[i - 2];\n      const s0 = rotr(W15, 7) ^ rotr(W15, 18) ^ (W15 >>> 3);\n      const s1 = rotr(W2, 17) ^ rotr(W2, 19) ^ (W2 >>> 10);\n      SHA256_W[i] = (s1 + SHA256_W[i - 7] + s0 + SHA256_W[i - 16]) | 0;\n    }\n    // Compression function main loop, 64 rounds\n    let { A, B, C, D, E, F, G, H } = this;\n    for (let i = 0; i < 64; i++) {\n      const sigma1 = rotr(E, 6) ^ rotr(E, 11) ^ rotr(E, 25);\n      const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n      const sigma0 = rotr(A, 2) ^ rotr(A, 13) ^ rotr(A, 22);\n      const T2 = (sigma0 + Maj(A, B, C)) | 0;\n      H = G;\n      G = F;\n      F = E;\n      E = (D + T1) | 0;\n      D = C;\n      C = B;\n      B = A;\n      A = (T1 + T2) | 0;\n    }\n    // Add the compressed chunk to the current hash value\n    A = (A + this.A) | 0;\n    B = (B + this.B) | 0;\n    C = (C + this.C) | 0;\n    D = (D + this.D) | 0;\n    E = (E + this.E) | 0;\n    F = (F + this.F) | 0;\n    G = (G + this.G) | 0;\n    H = (H + this.H) | 0;\n    this.set(A, B, C, D, E, F, G, H);\n  }\n  protected roundClean(): void {\n    clean(SHA256_W);\n  }\n  destroy(): void {\n    this.set(0, 0, 0, 0, 0, 0, 0, 0);\n    clean(this.buffer);\n  }\n}\n\nexport class SHA224 extends SHA256 {\n  protected A: number = SHA224_IV[0] | 0;\n  protected B: number = SHA224_IV[1] | 0;\n  protected C: number = SHA224_IV[2] | 0;\n  protected D: number = SHA224_IV[3] | 0;\n  protected E: number = SHA224_IV[4] | 0;\n  protected F: number = SHA224_IV[5] | 0;\n  protected G: number = SHA224_IV[6] | 0;\n  protected H: number = SHA224_IV[7] | 0;\n  constructor() {\n    super(28);\n  }\n}\n\n// SHA2-512 is slower than sha256 in js because u64 operations are slow.\n\n// Round contants\n// First 32 bits of the fractional parts of the cube roots of the first 80 primes 2..409\n// prettier-ignore\nconst K512 = /* @__PURE__ */ (() => u64.split([\n  '0x428a2f98d728ae22', '0x7137449123ef65cd', '0xb5c0fbcfec4d3b2f', '0xe9b5dba58189dbbc',\n  '0x3956c25bf348b538', '0x59f111f1b605d019', '0x923f82a4af194f9b', '0xab1c5ed5da6d8118',\n  '0xd807aa98a3030242', '0x12835b0145706fbe', '0x243185be4ee4b28c', '0x550c7dc3d5ffb4e2',\n  '0x72be5d74f27b896f', '0x80deb1fe3b1696b1', '0x9bdc06a725c71235', '0xc19bf174cf692694',\n  '0xe49b69c19ef14ad2', '0xefbe4786384f25e3', '0x0fc19dc68b8cd5b5', '0x240ca1cc77ac9c65',\n  '0x2de92c6f592b0275', '0x4a7484aa6ea6e483', '0x5cb0a9dcbd41fbd4', '0x76f988da831153b5',\n  '0x983e5152ee66dfab', '0xa831c66d2db43210', '0xb00327c898fb213f', '0xbf597fc7beef0ee4',\n  '0xc6e00bf33da88fc2', '0xd5a79147930aa725', '0x06ca6351e003826f', '0x142929670a0e6e70',\n  '0x27b70a8546d22ffc', '0x2e1b21385c26c926', '0x4d2c6dfc5ac42aed', '0x53380d139d95b3df',\n  '0x650a73548baf63de', '0x766a0abb3c77b2a8', '0x81c2c92e47edaee6', '0x92722c851482353b',\n  '0xa2bfe8a14cf10364', '0xa81a664bbc423001', '0xc24b8b70d0f89791', '0xc76c51a30654be30',\n  '0xd192e819d6ef5218', '0xd69906245565a910', '0xf40e35855771202a', '0x106aa07032bbd1b8',\n  '0x19a4c116b8d2d0c8', '0x1e376c085141ab53', '0x2748774cdf8eeb99', '0x34b0bcb5e19b48a8',\n  '0x391c0cb3c5c95a63', '0x4ed8aa4ae3418acb', '0x5b9cca4f7763e373', '0x682e6ff3d6b2b8a3',\n  '0x748f82ee5defb2fc', '0x78a5636f43172f60', '0x84c87814a1f0ab72', '0x8cc702081a6439ec',\n  '0x90befffa23631e28', '0xa4506cebde82bde9', '0xbef9a3f7b2c67915', '0xc67178f2e372532b',\n  '0xca273eceea26619c', '0xd186b8c721c0c207', '0xeada7dd6cde0eb1e', '0xf57d4f7fee6ed178',\n  '0x06f067aa72176fba', '0x0a637dc5a2c898a6', '0x113f9804bef90dae', '0x1b710b35131c471b',\n  '0x28db77f523047d84', '0x32caab7b40c72493', '0x3c9ebe0a15c9bebc', '0x431d67c49c100d4c',\n  '0x4cc5d4becb3e42b6', '0x597f299cfc657e2a', '0x5fcb6fab3ad6faec', '0x6c44198c4a475817'\n].map(n => BigInt(n))))();\nconst SHA512_Kh = /* @__PURE__ */ (() => K512[0])();\nconst SHA512_Kl = /* @__PURE__ */ (() => K512[1])();\n\n// Reusable temporary buffers\nconst SHA512_W_H = /* @__PURE__ */ new Uint32Array(80);\nconst SHA512_W_L = /* @__PURE__ */ new Uint32Array(80);\n\nexport class SHA512 extends HashMD<SHA512> {\n  // We cannot use array here since array allows indexing by variable\n  // which means optimizer/compiler cannot use registers.\n  // h -- high 32 bits, l -- low 32 bits\n  protected Ah: number = SHA512_IV[0] | 0;\n  protected Al: number = SHA512_IV[1] | 0;\n  protected Bh: number = SHA512_IV[2] | 0;\n  protected Bl: number = SHA512_IV[3] | 0;\n  protected Ch: number = SHA512_IV[4] | 0;\n  protected Cl: number = SHA512_IV[5] | 0;\n  protected Dh: number = SHA512_IV[6] | 0;\n  protected Dl: number = SHA512_IV[7] | 0;\n  protected Eh: number = SHA512_IV[8] | 0;\n  protected El: number = SHA512_IV[9] | 0;\n  protected Fh: number = SHA512_IV[10] | 0;\n  protected Fl: number = SHA512_IV[11] | 0;\n  protected Gh: number = SHA512_IV[12] | 0;\n  protected Gl: number = SHA512_IV[13] | 0;\n  protected Hh: number = SHA512_IV[14] | 0;\n  protected Hl: number = SHA512_IV[15] | 0;\n\n  constructor(outputLen: number = 64) {\n    super(128, outputLen, 16, false);\n  }\n  // prettier-ignore\n  protected get(): [\n    number, number, number, number, number, number, number, number,\n    number, number, number, number, number, number, number, number\n  ] {\n    const { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n    return [Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl];\n  }\n  // prettier-ignore\n  protected set(\n    Ah: number, Al: number, Bh: number, Bl: number, Ch: number, Cl: number, Dh: number, Dl: number,\n    Eh: number, El: number, Fh: number, Fl: number, Gh: number, Gl: number, Hh: number, Hl: number\n  ): void {\n    this.Ah = Ah | 0;\n    this.Al = Al | 0;\n    this.Bh = Bh | 0;\n    this.Bl = Bl | 0;\n    this.Ch = Ch | 0;\n    this.Cl = Cl | 0;\n    this.Dh = Dh | 0;\n    this.Dl = Dl | 0;\n    this.Eh = Eh | 0;\n    this.El = El | 0;\n    this.Fh = Fh | 0;\n    this.Fl = Fl | 0;\n    this.Gh = Gh | 0;\n    this.Gl = Gl | 0;\n    this.Hh = Hh | 0;\n    this.Hl = Hl | 0;\n  }\n  protected process(view: DataView, offset: number): void {\n    // Extend the first 16 words into the remaining 64 words w[16..79] of the message schedule array\n    for (let i = 0; i < 16; i++, offset += 4) {\n      SHA512_W_H[i] = view.getUint32(offset);\n      SHA512_W_L[i] = view.getUint32((offset += 4));\n    }\n    for (let i = 16; i < 80; i++) {\n      // s0 := (w[i-15] rightrotate 1) xor (w[i-15] rightrotate 8) xor (w[i-15] rightshift 7)\n      const W15h = SHA512_W_H[i - 15] | 0;\n      const W15l = SHA512_W_L[i - 15] | 0;\n      const s0h = u64.rotrSH(W15h, W15l, 1) ^ u64.rotrSH(W15h, W15l, 8) ^ u64.shrSH(W15h, W15l, 7);\n      const s0l = u64.rotrSL(W15h, W15l, 1) ^ u64.rotrSL(W15h, W15l, 8) ^ u64.shrSL(W15h, W15l, 7);\n      // s1 := (w[i-2] rightrotate 19) xor (w[i-2] rightrotate 61) xor (w[i-2] rightshift 6)\n      const W2h = SHA512_W_H[i - 2] | 0;\n      const W2l = SHA512_W_L[i - 2] | 0;\n      const s1h = u64.rotrSH(W2h, W2l, 19) ^ u64.rotrBH(W2h, W2l, 61) ^ u64.shrSH(W2h, W2l, 6);\n      const s1l = u64.rotrSL(W2h, W2l, 19) ^ u64.rotrBL(W2h, W2l, 61) ^ u64.shrSL(W2h, W2l, 6);\n      // SHA256_W[i] = s0 + s1 + SHA256_W[i - 7] + SHA256_W[i - 16];\n      const SUMl = u64.add4L(s0l, s1l, SHA512_W_L[i - 7], SHA512_W_L[i - 16]);\n      const SUMh = u64.add4H(SUMl, s0h, s1h, SHA512_W_H[i - 7], SHA512_W_H[i - 16]);\n      SHA512_W_H[i] = SUMh | 0;\n      SHA512_W_L[i] = SUMl | 0;\n    }\n    let { Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl } = this;\n    // Compression function main loop, 80 rounds\n    for (let i = 0; i < 80; i++) {\n      // S1 := (e rightrotate 14) xor (e rightrotate 18) xor (e rightrotate 41)\n      const sigma1h = u64.rotrSH(Eh, El, 14) ^ u64.rotrSH(Eh, El, 18) ^ u64.rotrBH(Eh, El, 41);\n      const sigma1l = u64.rotrSL(Eh, El, 14) ^ u64.rotrSL(Eh, El, 18) ^ u64.rotrBL(Eh, El, 41);\n      //const T1 = (H + sigma1 + Chi(E, F, G) + SHA256_K[i] + SHA256_W[i]) | 0;\n      const CHIh = (Eh & Fh) ^ (~Eh & Gh);\n      const CHIl = (El & Fl) ^ (~El & Gl);\n      // T1 = H + sigma1 + Chi(E, F, G) + SHA512_K[i] + SHA512_W[i]\n      // prettier-ignore\n      const T1ll = u64.add5L(Hl, sigma1l, CHIl, SHA512_Kl[i], SHA512_W_L[i]);\n      const T1h = u64.add5H(T1ll, Hh, sigma1h, CHIh, SHA512_Kh[i], SHA512_W_H[i]);\n      const T1l = T1ll | 0;\n      // S0 := (a rightrotate 28) xor (a rightrotate 34) xor (a rightrotate 39)\n      const sigma0h = u64.rotrSH(Ah, Al, 28) ^ u64.rotrBH(Ah, Al, 34) ^ u64.rotrBH(Ah, Al, 39);\n      const sigma0l = u64.rotrSL(Ah, Al, 28) ^ u64.rotrBL(Ah, Al, 34) ^ u64.rotrBL(Ah, Al, 39);\n      const MAJh = (Ah & Bh) ^ (Ah & Ch) ^ (Bh & Ch);\n      const MAJl = (Al & Bl) ^ (Al & Cl) ^ (Bl & Cl);\n      Hh = Gh | 0;\n      Hl = Gl | 0;\n      Gh = Fh | 0;\n      Gl = Fl | 0;\n      Fh = Eh | 0;\n      Fl = El | 0;\n      ({ h: Eh, l: El } = u64.add(Dh | 0, Dl | 0, T1h | 0, T1l | 0));\n      Dh = Ch | 0;\n      Dl = Cl | 0;\n      Ch = Bh | 0;\n      Cl = Bl | 0;\n      Bh = Ah | 0;\n      Bl = Al | 0;\n      const All = u64.add3L(T1l, sigma0l, MAJl);\n      Ah = u64.add3H(All, T1h, sigma0h, MAJh);\n      Al = All | 0;\n    }\n    // Add the compressed chunk to the current hash value\n    ({ h: Ah, l: Al } = u64.add(this.Ah | 0, this.Al | 0, Ah | 0, Al | 0));\n    ({ h: Bh, l: Bl } = u64.add(this.Bh | 0, this.Bl | 0, Bh | 0, Bl | 0));\n    ({ h: Ch, l: Cl } = u64.add(this.Ch | 0, this.Cl | 0, Ch | 0, Cl | 0));\n    ({ h: Dh, l: Dl } = u64.add(this.Dh | 0, this.Dl | 0, Dh | 0, Dl | 0));\n    ({ h: Eh, l: El } = u64.add(this.Eh | 0, this.El | 0, Eh | 0, El | 0));\n    ({ h: Fh, l: Fl } = u64.add(this.Fh | 0, this.Fl | 0, Fh | 0, Fl | 0));\n    ({ h: Gh, l: Gl } = u64.add(this.Gh | 0, this.Gl | 0, Gh | 0, Gl | 0));\n    ({ h: Hh, l: Hl } = u64.add(this.Hh | 0, this.Hl | 0, Hh | 0, Hl | 0));\n    this.set(Ah, Al, Bh, Bl, Ch, Cl, Dh, Dl, Eh, El, Fh, Fl, Gh, Gl, Hh, Hl);\n  }\n  protected roundClean(): void {\n    clean(SHA512_W_H, SHA512_W_L);\n  }\n  destroy(): void {\n    clean(this.buffer);\n    this.set(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n  }\n}\n\nexport class SHA384 extends SHA512 {\n  protected Ah: number = SHA384_IV[0] | 0;\n  protected Al: number = SHA384_IV[1] | 0;\n  protected Bh: number = SHA384_IV[2] | 0;\n  protected Bl: number = SHA384_IV[3] | 0;\n  protected Ch: number = SHA384_IV[4] | 0;\n  protected Cl: number = SHA384_IV[5] | 0;\n  protected Dh: number = SHA384_IV[6] | 0;\n  protected Dl: number = SHA384_IV[7] | 0;\n  protected Eh: number = SHA384_IV[8] | 0;\n  protected El: number = SHA384_IV[9] | 0;\n  protected Fh: number = SHA384_IV[10] | 0;\n  protected Fl: number = SHA384_IV[11] | 0;\n  protected Gh: number = SHA384_IV[12] | 0;\n  protected Gl: number = SHA384_IV[13] | 0;\n  protected Hh: number = SHA384_IV[14] | 0;\n  protected Hl: number = SHA384_IV[15] | 0;\n\n  constructor() {\n    super(48);\n  }\n}\n\n/**\n * Truncated SHA512/256 and SHA512/224.\n * SHA512_IV is XORed with 0xa5a5a5a5a5a5a5a5, then used as \"intermediary\" IV of SHA512/t.\n * Then t hashes string to produce result IV.\n * See `test/misc/sha2-gen-iv.js`.\n */\n\n/** SHA512/224 IV */\nconst T224_IV = /* @__PURE__ */ Uint32Array.from([\n  0x8c3d37c8, 0x19544da2, 0x73e19966, 0x89dcd4d6, 0x1dfab7ae, 0x32ff9c82, 0x679dd514, 0x582f9fcf,\n  0x0f6d2b69, 0x7bd44da8, 0x77e36f73, 0x04c48942, 0x3f9d85a8, 0x6a1d36c8, 0x1112e6ad, 0x91d692a1,\n]);\n\n/** SHA512/256 IV */\nconst T256_IV = /* @__PURE__ */ Uint32Array.from([\n  0x22312194, 0xfc2bf72c, 0x9f555fa3, 0xc84c64c2, 0x2393b86b, 0x6f53b151, 0x96387719, 0x5940eabd,\n  0x96283ee2, 0xa88effe3, 0xbe5e1e25, 0x53863992, 0x2b0199fc, 0x2c85b8aa, 0x0eb72ddc, 0x81c52ca2,\n]);\n\nexport class SHA512_224 extends SHA512 {\n  protected Ah: number = T224_IV[0] | 0;\n  protected Al: number = T224_IV[1] | 0;\n  protected Bh: number = T224_IV[2] | 0;\n  protected Bl: number = T224_IV[3] | 0;\n  protected Ch: number = T224_IV[4] | 0;\n  protected Cl: number = T224_IV[5] | 0;\n  protected Dh: number = T224_IV[6] | 0;\n  protected Dl: number = T224_IV[7] | 0;\n  protected Eh: number = T224_IV[8] | 0;\n  protected El: number = T224_IV[9] | 0;\n  protected Fh: number = T224_IV[10] | 0;\n  protected Fl: number = T224_IV[11] | 0;\n  protected Gh: number = T224_IV[12] | 0;\n  protected Gl: number = T224_IV[13] | 0;\n  protected Hh: number = T224_IV[14] | 0;\n  protected Hl: number = T224_IV[15] | 0;\n\n  constructor() {\n    super(28);\n  }\n}\n\nexport class SHA512_256 extends SHA512 {\n  protected Ah: number = T256_IV[0] | 0;\n  protected Al: number = T256_IV[1] | 0;\n  protected Bh: number = T256_IV[2] | 0;\n  protected Bl: number = T256_IV[3] | 0;\n  protected Ch: number = T256_IV[4] | 0;\n  protected Cl: number = T256_IV[5] | 0;\n  protected Dh: number = T256_IV[6] | 0;\n  protected Dl: number = T256_IV[7] | 0;\n  protected Eh: number = T256_IV[8] | 0;\n  protected El: number = T256_IV[9] | 0;\n  protected Fh: number = T256_IV[10] | 0;\n  protected Fl: number = T256_IV[11] | 0;\n  protected Gh: number = T256_IV[12] | 0;\n  protected Gl: number = T256_IV[13] | 0;\n  protected Hh: number = T256_IV[14] | 0;\n  protected Hl: number = T256_IV[15] | 0;\n\n  constructor() {\n    super(32);\n  }\n}\n\n/**\n * SHA2-256 hash function from RFC 4634.\n *\n * It is the fastest JS hash, even faster than Blake3.\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n */\nexport const sha256: CHash = /* @__PURE__ */ createHasher(() => new SHA256());\n/** SHA2-224 hash function from RFC 4634 */\nexport const sha224: CHash = /* @__PURE__ */ createHasher(() => new SHA224());\n\n/** SHA2-512 hash function from RFC 4634. */\nexport const sha512: CHash = /* @__PURE__ */ createHasher(() => new SHA512());\n/** SHA2-384 hash function from RFC 4634. */\nexport const sha384: CHash = /* @__PURE__ */ createHasher(() => new SHA384());\n\n/**\n * SHA2-512/256 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_256: CHash = /* @__PURE__ */ createHasher(() => new SHA512_256());\n/**\n * SHA2-512/224 \"truncated\" hash function, with improved resistance to length extension attacks.\n * See the paper on [truncated SHA512](https://eprint.iacr.org/2010/548.pdf).\n */\nexport const sha512_224: CHash = /* @__PURE__ */ createHasher(() => new SHA512_224());\n","/**\n * SHA2-256 a.k.a. sha256. In JS, it is the fastest hash, even faster than Blake3.\n *\n * To break sha256 using birthday attack, attackers need to try 2^128 hashes.\n * BTC network is doing 2^70 hashes/sec (2^95 hashes/year) as per 2025.\n *\n * Check out [FIPS 180-4](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf).\n * @module\n * @deprecated\n */\nimport {\n  SHA224 as SHA224n,\n  sha224 as sha224n,\n  SHA256 as SHA256n,\n  sha256 as sha256n,\n} from './sha2.ts';\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA256: typeof SHA256n = SHA256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha256: typeof sha256n = sha256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA224: typeof SHA224n = SHA224n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha224: typeof sha224n = sha224n;\n","/**\n * SHA3 (keccak) hash function, based on a new \"Sponge function\" design.\n * Different from older hashes, the internal state is bigger than output size.\n *\n * Check out [FIPS-202](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf),\n * [Website](https://keccak.team/keccak.html),\n * [the differences between SHA-3 and Keccak](https://crypto.stackexchange.com/questions/15727/what-are-the-key-differences-between-the-draft-sha-3-standard-and-the-keccak-sub).\n *\n * Check out `sha3-addons` module for cSHAKE, k12, and others.\n * @module\n */\nimport { rotlBH, rotlBL, rotlSH, rotlSL, split } from './_u64.ts';\n// prettier-ignore\nimport {\n  abytes, aexists, anumber, aoutput,\n  clean, createHasher, createXOFer, Hash,\n  swap32IfBE,\n  toBytes, u32,\n  type CHash, type CHashXO, type HashXOF, type Input\n} from './utils.ts';\n\n// No __PURE__ annotations in sha3 header:\n// EVERYTHING is in fact used on every export.\n// Various per round constants calculations\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\nconst _2n = BigInt(2);\nconst _7n = BigInt(7);\nconst _256n = BigInt(256);\nconst _0x71n = BigInt(0x71);\nconst SHA3_PI: number[] = [];\nconst SHA3_ROTL: number[] = [];\nconst _SHA3_IOTA: bigint[] = [];\nfor (let round = 0, R = _1n, x = 1, y = 0; round < 24; round++) {\n  // Pi\n  [x, y] = [y, (2 * x + 3 * y) % 5];\n  SHA3_PI.push(2 * (5 * y + x));\n  // Rotational\n  SHA3_ROTL.push((((round + 1) * (round + 2)) / 2) % 64);\n  // Iota\n  let t = _0n;\n  for (let j = 0; j < 7; j++) {\n    R = ((R << _1n) ^ ((R >> _7n) * _0x71n)) % _256n;\n    if (R & _2n) t ^= _1n << ((_1n << /* @__PURE__ */ BigInt(j)) - _1n);\n  }\n  _SHA3_IOTA.push(t);\n}\nconst IOTAS = split(_SHA3_IOTA, true);\nconst SHA3_IOTA_H = IOTAS[0];\nconst SHA3_IOTA_L = IOTAS[1];\n\n// Left rotation (without 0, 32, 64)\nconst rotlH = (h: number, l: number, s: number) => (s > 32 ? rotlBH(h, l, s) : rotlSH(h, l, s));\nconst rotlL = (h: number, l: number, s: number) => (s > 32 ? rotlBL(h, l, s) : rotlSL(h, l, s));\n\n/** `keccakf1600` internal function, additionally allows to adjust round count. */\nexport function keccakP(s: Uint32Array, rounds: number = 24): void {\n  const B = new Uint32Array(5 * 2);\n  // NOTE: all indices are x2 since we store state as u32 instead of u64 (bigints to slow in js)\n  for (let round = 24 - rounds; round < 24; round++) {\n    // Theta θ\n    for (let x = 0; x < 10; x++) B[x] = s[x] ^ s[x + 10] ^ s[x + 20] ^ s[x + 30] ^ s[x + 40];\n    for (let x = 0; x < 10; x += 2) {\n      const idx1 = (x + 8) % 10;\n      const idx0 = (x + 2) % 10;\n      const B0 = B[idx0];\n      const B1 = B[idx0 + 1];\n      const Th = rotlH(B0, B1, 1) ^ B[idx1];\n      const Tl = rotlL(B0, B1, 1) ^ B[idx1 + 1];\n      for (let y = 0; y < 50; y += 10) {\n        s[x + y] ^= Th;\n        s[x + y + 1] ^= Tl;\n      }\n    }\n    // Rho (ρ) and Pi (π)\n    let curH = s[2];\n    let curL = s[3];\n    for (let t = 0; t < 24; t++) {\n      const shift = SHA3_ROTL[t];\n      const Th = rotlH(curH, curL, shift);\n      const Tl = rotlL(curH, curL, shift);\n      const PI = SHA3_PI[t];\n      curH = s[PI];\n      curL = s[PI + 1];\n      s[PI] = Th;\n      s[PI + 1] = Tl;\n    }\n    // Chi (χ)\n    for (let y = 0; y < 50; y += 10) {\n      for (let x = 0; x < 10; x++) B[x] = s[y + x];\n      for (let x = 0; x < 10; x++) s[y + x] ^= ~B[(x + 2) % 10] & B[(x + 4) % 10];\n    }\n    // Iota (ι)\n    s[0] ^= SHA3_IOTA_H[round];\n    s[1] ^= SHA3_IOTA_L[round];\n  }\n  clean(B);\n}\n\n/** Keccak sponge function. */\nexport class Keccak extends Hash<Keccak> implements HashXOF<Keccak> {\n  protected state: Uint8Array;\n  protected pos = 0;\n  protected posOut = 0;\n  protected finished = false;\n  protected state32: Uint32Array;\n  protected destroyed = false;\n\n  public blockLen: number;\n  public suffix: number;\n  public outputLen: number;\n  protected enableXOF = false;\n  protected rounds: number;\n\n  // NOTE: we accept arguments in bytes instead of bits here.\n  constructor(\n    blockLen: number,\n    suffix: number,\n    outputLen: number,\n    enableXOF = false,\n    rounds: number = 24\n  ) {\n    super();\n    this.blockLen = blockLen;\n    this.suffix = suffix;\n    this.outputLen = outputLen;\n    this.enableXOF = enableXOF;\n    this.rounds = rounds;\n    // Can be passed from user as dkLen\n    anumber(outputLen);\n    // 1600 = 5x5 matrix of 64bit.  1600 bits === 200 bytes\n    // 0 < blockLen < 200\n    if (!(0 < blockLen && blockLen < 200))\n      throw new Error('only keccak-f1600 function is supported');\n    this.state = new Uint8Array(200);\n    this.state32 = u32(this.state);\n  }\n  clone(): Keccak {\n    return this._cloneInto();\n  }\n  protected keccak(): void {\n    swap32IfBE(this.state32);\n    keccakP(this.state32, this.rounds);\n    swap32IfBE(this.state32);\n    this.posOut = 0;\n    this.pos = 0;\n  }\n  update(data: Input): this {\n    aexists(this);\n    data = toBytes(data);\n    abytes(data);\n    const { blockLen, state } = this;\n    const len = data.length;\n    for (let pos = 0; pos < len; ) {\n      const take = Math.min(blockLen - this.pos, len - pos);\n      for (let i = 0; i < take; i++) state[this.pos++] ^= data[pos++];\n      if (this.pos === blockLen) this.keccak();\n    }\n    return this;\n  }\n  protected finish(): void {\n    if (this.finished) return;\n    this.finished = true;\n    const { state, suffix, pos, blockLen } = this;\n    // Do the padding\n    state[pos] ^= suffix;\n    if ((suffix & 0x80) !== 0 && pos === blockLen - 1) this.keccak();\n    state[blockLen - 1] ^= 0x80;\n    this.keccak();\n  }\n  protected writeInto(out: Uint8Array): Uint8Array {\n    aexists(this, false);\n    abytes(out);\n    this.finish();\n    const bufferOut = this.state;\n    const { blockLen } = this;\n    for (let pos = 0, len = out.length; pos < len; ) {\n      if (this.posOut >= blockLen) this.keccak();\n      const take = Math.min(blockLen - this.posOut, len - pos);\n      out.set(bufferOut.subarray(this.posOut, this.posOut + take), pos);\n      this.posOut += take;\n      pos += take;\n    }\n    return out;\n  }\n  xofInto(out: Uint8Array): Uint8Array {\n    // Sha3/Keccak usage with XOF is probably mistake, only SHAKE instances can do XOF\n    if (!this.enableXOF) throw new Error('XOF is not possible for this instance');\n    return this.writeInto(out);\n  }\n  xof(bytes: number): Uint8Array {\n    anumber(bytes);\n    return this.xofInto(new Uint8Array(bytes));\n  }\n  digestInto(out: Uint8Array): Uint8Array {\n    aoutput(out, this);\n    if (this.finished) throw new Error('digest() was already called');\n    this.writeInto(out);\n    this.destroy();\n    return out;\n  }\n  digest(): Uint8Array {\n    return this.digestInto(new Uint8Array(this.outputLen));\n  }\n  destroy(): void {\n    this.destroyed = true;\n    clean(this.state);\n  }\n  _cloneInto(to?: Keccak): Keccak {\n    const { blockLen, suffix, outputLen, rounds, enableXOF } = this;\n    to ||= new Keccak(blockLen, suffix, outputLen, enableXOF, rounds);\n    to.state32.set(this.state32);\n    to.pos = this.pos;\n    to.posOut = this.posOut;\n    to.finished = this.finished;\n    to.rounds = rounds;\n    // Suffix can change in cSHAKE\n    to.suffix = suffix;\n    to.outputLen = outputLen;\n    to.enableXOF = enableXOF;\n    to.destroyed = this.destroyed;\n    return to;\n  }\n}\n\nconst gen = (suffix: number, blockLen: number, outputLen: number) =>\n  createHasher(() => new Keccak(blockLen, suffix, outputLen));\n\n/** SHA3-224 hash function. */\nexport const sha3_224: CHash = /* @__PURE__ */ (() => gen(0x06, 144, 224 / 8))();\n/** SHA3-256 hash function. Different from keccak-256. */\nexport const sha3_256: CHash = /* @__PURE__ */ (() => gen(0x06, 136, 256 / 8))();\n/** SHA3-384 hash function. */\nexport const sha3_384: CHash = /* @__PURE__ */ (() => gen(0x06, 104, 384 / 8))();\n/** SHA3-512 hash function. */\nexport const sha3_512: CHash = /* @__PURE__ */ (() => gen(0x06, 72, 512 / 8))();\n\n/** keccak-224 hash function. */\nexport const keccak_224: CHash = /* @__PURE__ */ (() => gen(0x01, 144, 224 / 8))();\n/** keccak-256 hash function. Different from SHA3-256. */\nexport const keccak_256: CHash = /* @__PURE__ */ (() => gen(0x01, 136, 256 / 8))();\n/** keccak-384 hash function. */\nexport const keccak_384: CHash = /* @__PURE__ */ (() => gen(0x01, 104, 384 / 8))();\n/** keccak-512 hash function. */\nexport const keccak_512: CHash = /* @__PURE__ */ (() => gen(0x01, 72, 512 / 8))();\n\nexport type ShakeOpts = { dkLen?: number };\n\nconst genShake = (suffix: number, blockLen: number, outputLen: number) =>\n  createXOFer<HashXOF<Keccak>, ShakeOpts>(\n    (opts: ShakeOpts = {}) =>\n      new Keccak(blockLen, suffix, opts.dkLen === undefined ? outputLen : opts.dkLen, true)\n  );\n\n/** SHAKE128 XOF with 128-bit security. */\nexport const shake128: CHashXO = /* @__PURE__ */ (() => genShake(0x1f, 168, 128 / 8))();\n/** SHAKE256 XOF with 256-bit security. */\nexport const shake256: CHashXO = /* @__PURE__ */ (() => genShake(0x1f, 136, 256 / 8))();\n","/**\n * SHA2-512 a.k.a. sha512 and sha384. It is slower than sha256 in js because u64 operations are slow.\n *\n * Check out [RFC 4634](https://datatracker.ietf.org/doc/html/rfc4634) and\n * [the paper on truncated SHA512/256](https://eprint.iacr.org/2010/548.pdf).\n * @module\n * @deprecated\n */\nimport {\n  SHA384 as SHA384n,\n  sha384 as sha384n,\n  sha512_224 as sha512_224n,\n  SHA512_224 as SHA512_224n,\n  sha512_256 as sha512_256n,\n  SHA512_256 as SHA512_256n,\n  SHA512 as SHA512n,\n  sha512 as sha512n,\n} from './sha2.ts';\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA512: typeof SHA512n = SHA512n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha512: typeof sha512n = sha512n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA384: typeof SHA384n = SHA384n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha384: typeof sha384n = sha384n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA512_224: typeof SHA512_224n = SHA512_224n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha512_224: typeof sha512_224n = sha512_224n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const SHA512_256: typeof SHA512_256n = SHA512_256n;\n/** @deprecated Use import from `noble/hashes/sha2` module */\nexport const sha512_256: typeof sha512_256n = sha512_256n;\n","/**\n * HMAC: RFC2104 message authentication code.\n * @module\n */\nimport { abytes, aexists, ahash, clean, Hash, toBytes, type CHash, type Input } from './utils.ts';\n\nexport class HMAC<T extends Hash<T>> extends Hash<HMAC<T>> {\n  oHash: T;\n  iHash: T;\n  blockLen: number;\n  outputLen: number;\n  private finished = false;\n  private destroyed = false;\n\n  constructor(hash: CHash, _key: Input) {\n    super();\n    ahash(hash);\n    const key = toBytes(_key);\n    this.iHash = hash.create() as T;\n    if (typeof this.iHash.update !== 'function')\n      throw new Error('Expected instance of class which extends utils.Hash');\n    this.blockLen = this.iHash.blockLen;\n    this.outputLen = this.iHash.outputLen;\n    const blockLen = this.blockLen;\n    const pad = new Uint8Array(blockLen);\n    // blockLen can be bigger than outputLen\n    pad.set(key.length > blockLen ? hash.create().update(key).digest() : key);\n    for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36;\n    this.iHash.update(pad);\n    // By doing update (processing of first block) of outer hash here we can re-use it between multiple calls via clone\n    this.oHash = hash.create() as T;\n    // Undo internal XOR && apply outer XOR\n    for (let i = 0; i < pad.length; i++) pad[i] ^= 0x36 ^ 0x5c;\n    this.oHash.update(pad);\n    clean(pad);\n  }\n  update(buf: Input): this {\n    aexists(this);\n    this.iHash.update(buf);\n    return this;\n  }\n  digestInto(out: Uint8Array): void {\n    aexists(this);\n    abytes(out, this.outputLen);\n    this.finished = true;\n    this.iHash.digestInto(out);\n    this.oHash.update(out);\n    this.oHash.digestInto(out);\n    this.destroy();\n  }\n  digest(): Uint8Array {\n    const out = new Uint8Array(this.oHash.outputLen);\n    this.digestInto(out);\n    return out;\n  }\n  _cloneInto(to?: HMAC<T>): HMAC<T> {\n    // Create new instance without calling constructor since key already in state and we don't know it.\n    to ||= Object.create(Object.getPrototypeOf(this), {});\n    const { oHash, iHash, finished, destroyed, blockLen, outputLen } = this;\n    to = to as this;\n    to.finished = finished;\n    to.destroyed = destroyed;\n    to.blockLen = blockLen;\n    to.outputLen = outputLen;\n    to.oHash = oHash._cloneInto(to.oHash);\n    to.iHash = iHash._cloneInto(to.iHash);\n    return to;\n  }\n  clone(): HMAC<T> {\n    return this._cloneInto();\n  }\n  destroy(): void {\n    this.destroyed = true;\n    this.oHash.destroy();\n    this.iHash.destroy();\n  }\n}\n\n/**\n * HMAC: RFC2104 message authentication code.\n * @param hash - function that would be used e.g. sha256\n * @param key - message key\n * @param message - message data\n * @example\n * import { hmac } from '@noble/hashes/hmac';\n * import { sha256 } from '@noble/hashes/sha2';\n * const mac1 = hmac(sha256, 'key', 'message');\n */\nexport const hmac: {\n  (hash: CHash, key: Input, message: Input): Uint8Array;\n  create(hash: CHash, key: Input): HMAC<any>;\n} = (hash: CHash, key: Input, message: Input): Uint8Array =>\n  new HMAC<any>(hash, key).update(message).digest();\nhmac.create = (hash: CHash, key: Input) => new HMAC<any>(hash, key);\n","/**\n * Hex, bytes and number utilities.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n  abytes as abytes_,\n  bytesToHex as bytesToHex_,\n  concatBytes as concatBytes_,\n  hexToBytes as hexToBytes_,\n  isBytes as isBytes_,\n} from '@noble/hashes/utils.js';\nexport {\n  abytes,\n  anumber,\n  bytesToHex,\n  bytesToUtf8,\n  concatBytes,\n  hexToBytes,\n  isBytes,\n  randomBytes,\n  utf8ToBytes,\n} from '@noble/hashes/utils.js';\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nexport type Hex = Uint8Array | string; // hex strings are accepted for simplicity\nexport type PrivKey = Hex | bigint; // bigints are accepted to ease learning curve\nexport type CHash = {\n  (message: Uint8Array | string): Uint8Array;\n  blockLen: number;\n  outputLen: number;\n  create(opts?: { dkLen?: number }): any; // For shake\n};\nexport type FHash = (message: Uint8Array | string) => Uint8Array;\n\nexport function abool(title: string, value: boolean): void {\n  if (typeof value !== 'boolean') throw new Error(title + ' boolean expected, got ' + value);\n}\n\n// tmp name until v2\nexport function _abool2(value: boolean, title: string = ''): boolean {\n  if (typeof value !== 'boolean') {\n    const prefix = title && `\"${title}\"`;\n    throw new Error(prefix + 'expected boolean, got type=' + typeof value);\n  }\n  return value;\n}\n\n// tmp name until v2\n/** Asserts something is Uint8Array. */\nexport function _abytes2(value: Uint8Array, length?: number, title: string = ''): Uint8Array {\n  const bytes = isBytes_(value);\n  const len = value?.length;\n  const needsLen = length !== undefined;\n  if (!bytes || (needsLen && len !== length)) {\n    const prefix = title && `\"${title}\" `;\n    const ofLen = needsLen ? ` of length ${length}` : '';\n    const got = bytes ? `length=${len}` : `type=${typeof value}`;\n    throw new Error(prefix + 'expected Uint8Array' + ofLen + ', got ' + got);\n  }\n  return value;\n}\n\n// Used in weierstrass, der\nexport function numberToHexUnpadded(num: number | bigint): string {\n  const hex = num.toString(16);\n  return hex.length & 1 ? '0' + hex : hex;\n}\n\nexport function hexToNumber(hex: string): bigint {\n  if (typeof hex !== 'string') throw new Error('hex string expected, got ' + typeof hex);\n  return hex === '' ? _0n : BigInt('0x' + hex); // Big Endian\n}\n\n// BE: Big Endian, LE: Little Endian\nexport function bytesToNumberBE(bytes: Uint8Array): bigint {\n  return hexToNumber(bytesToHex_(bytes));\n}\nexport function bytesToNumberLE(bytes: Uint8Array): bigint {\n  abytes_(bytes);\n  return hexToNumber(bytesToHex_(Uint8Array.from(bytes).reverse()));\n}\n\nexport function numberToBytesBE(n: number | bigint, len: number): Uint8Array {\n  return hexToBytes_(n.toString(16).padStart(len * 2, '0'));\n}\nexport function numberToBytesLE(n: number | bigint, len: number): Uint8Array {\n  return numberToBytesBE(n, len).reverse();\n}\n// Unpadded, rarely used\nexport function numberToVarBytesBE(n: number | bigint): Uint8Array {\n  return hexToBytes_(numberToHexUnpadded(n));\n}\n\n/**\n * Takes hex string or Uint8Array, converts to Uint8Array.\n * Validates output length.\n * Will throw error for other types.\n * @param title descriptive title for an error e.g. 'secret key'\n * @param hex hex string or Uint8Array\n * @param expectedLength optional, will compare to result array's length\n * @returns\n */\nexport function ensureBytes(title: string, hex: Hex, expectedLength?: number): Uint8Array {\n  let res: Uint8Array;\n  if (typeof hex === 'string') {\n    try {\n      res = hexToBytes_(hex);\n    } catch (e) {\n      throw new Error(title + ' must be hex string or Uint8Array, cause: ' + e);\n    }\n  } else if (isBytes_(hex)) {\n    // Uint8Array.from() instead of hash.slice() because node.js Buffer\n    // is instance of Uint8Array, and its slice() creates **mutable** copy\n    res = Uint8Array.from(hex);\n  } else {\n    throw new Error(title + ' must be hex string or Uint8Array');\n  }\n  const len = res.length;\n  if (typeof expectedLength === 'number' && len !== expectedLength)\n    throw new Error(title + ' of length ' + expectedLength + ' expected, got ' + len);\n  return res;\n}\n\n// Compares 2 u8a-s in kinda constant time\nexport function equalBytes(a: Uint8Array, b: Uint8Array): boolean {\n  if (a.length !== b.length) return false;\n  let diff = 0;\n  for (let i = 0; i < a.length; i++) diff |= a[i] ^ b[i];\n  return diff === 0;\n}\n/**\n * Copies Uint8Array. We can't use u8a.slice(), because u8a can be Buffer,\n * and Buffer#slice creates mutable copy. Never use Buffers!\n */\nexport function copyBytes(bytes: Uint8Array): Uint8Array {\n  return Uint8Array.from(bytes);\n}\n\n/**\n * Decodes 7-bit ASCII string to Uint8Array, throws on non-ascii symbols\n * Should be safe to use for things expected to be ASCII.\n * Returns exact same result as utf8ToBytes for ASCII or throws.\n */\nexport function asciiToBytes(ascii: string): Uint8Array {\n  return Uint8Array.from(ascii, (c, i) => {\n    const charCode = c.charCodeAt(0);\n    if (c.length !== 1 || charCode > 127) {\n      throw new Error(\n        `string contains non-ASCII character \"${ascii[i]}\" with code ${charCode} at position ${i}`\n      );\n    }\n    return charCode;\n  });\n}\n\n/**\n * @example utf8ToBytes('abc') // new Uint8Array([97, 98, 99])\n */\n// export const utf8ToBytes: typeof utf8ToBytes_ = utf8ToBytes_;\n/**\n * Converts bytes to string using UTF8 encoding.\n * @example bytesToUtf8(Uint8Array.from([97, 98, 99])) // 'abc'\n */\n// export const bytesToUtf8: typeof bytesToUtf8_ = bytesToUtf8_;\n\n// Is positive bigint\nconst isPosBig = (n: bigint) => typeof n === 'bigint' && _0n <= n;\n\nexport function inRange(n: bigint, min: bigint, max: bigint): boolean {\n  return isPosBig(n) && isPosBig(min) && isPosBig(max) && min <= n && n < max;\n}\n\n/**\n * Asserts min <= n < max. NOTE: It's < max and not <= max.\n * @example\n * aInRange('x', x, 1n, 256n); // would assume x is in (1n..255n)\n */\nexport function aInRange(title: string, n: bigint, min: bigint, max: bigint): void {\n  // Why min <= n < max and not a (min < n < max) OR b (min <= n <= max)?\n  // consider P=256n, min=0n, max=P\n  // - a for min=0 would require -1:          `inRange('x', x, -1n, P)`\n  // - b would commonly require subtraction:  `inRange('x', x, 0n, P - 1n)`\n  // - our way is the cleanest:               `inRange('x', x, 0n, P)\n  if (!inRange(n, min, max))\n    throw new Error('expected valid ' + title + ': ' + min + ' <= n < ' + max + ', got ' + n);\n}\n\n// Bit operations\n\n/**\n * Calculates amount of bits in a bigint.\n * Same as `n.toString(2).length`\n * TODO: merge with nLength in modular\n */\nexport function bitLen(n: bigint): number {\n  let len;\n  for (len = 0; n > _0n; n >>= _1n, len += 1);\n  return len;\n}\n\n/**\n * Gets single bit at position.\n * NOTE: first bit position is 0 (same as arrays)\n * Same as `!!+Array.from(n.toString(2)).reverse()[pos]`\n */\nexport function bitGet(n: bigint, pos: number): bigint {\n  return (n >> BigInt(pos)) & _1n;\n}\n\n/**\n * Sets single bit at position.\n */\nexport function bitSet(n: bigint, pos: number, value: boolean): bigint {\n  return n | ((value ? _1n : _0n) << BigInt(pos));\n}\n\n/**\n * Calculate mask for N bits. Not using ** operator with bigints because of old engines.\n * Same as BigInt(`0b${Array(i).fill('1').join('')}`)\n */\nexport const bitMask = (n: number): bigint => (_1n << BigInt(n)) - _1n;\n\n// DRBG\n\ntype Pred<T> = (v: Uint8Array) => T | undefined;\n/**\n * Minimal HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n * @returns function that will call DRBG until 2nd arg returns something meaningful\n * @example\n *   const drbg = createHmacDRBG<Key>(32, 32, hmac);\n *   drbg(seed, bytesToKey); // bytesToKey must return Key or undefined\n */\nexport function createHmacDrbg<T>(\n  hashLen: number,\n  qByteLen: number,\n  hmacFn: (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array\n): (seed: Uint8Array, predicate: Pred<T>) => T {\n  if (typeof hashLen !== 'number' || hashLen < 2) throw new Error('hashLen must be a number');\n  if (typeof qByteLen !== 'number' || qByteLen < 2) throw new Error('qByteLen must be a number');\n  if (typeof hmacFn !== 'function') throw new Error('hmacFn must be a function');\n  // Step B, Step C: set hashLen to 8*ceil(hlen/8)\n  const u8n = (len: number) => new Uint8Array(len); // creates Uint8Array\n  const u8of = (byte: number) => Uint8Array.of(byte); // another shortcut\n  let v = u8n(hashLen); // Minimal non-full-spec HMAC-DRBG from NIST 800-90 for RFC6979 sigs.\n  let k = u8n(hashLen); // Steps B and C of RFC6979 3.2: set hashLen, in our case always same\n  let i = 0; // Iterations counter, will throw when over 1000\n  const reset = () => {\n    v.fill(1);\n    k.fill(0);\n    i = 0;\n  };\n  const h = (...b: Uint8Array[]) => hmacFn(k, v, ...b); // hmac(k)(v, ...values)\n  const reseed = (seed = u8n(0)) => {\n    // HMAC-DRBG reseed() function. Steps D-G\n    k = h(u8of(0x00), seed); // k = hmac(k || v || 0x00 || seed)\n    v = h(); // v = hmac(k || v)\n    if (seed.length === 0) return;\n    k = h(u8of(0x01), seed); // k = hmac(k || v || 0x01 || seed)\n    v = h(); // v = hmac(k || v)\n  };\n  const gen = () => {\n    // HMAC-DRBG generate() function\n    if (i++ >= 1000) throw new Error('drbg: tried 1000 values');\n    let len = 0;\n    const out: Uint8Array[] = [];\n    while (len < qByteLen) {\n      v = h();\n      const sl = v.slice();\n      out.push(sl);\n      len += v.length;\n    }\n    return concatBytes_(...out);\n  };\n  const genUntil = (seed: Uint8Array, pred: Pred<T>): T => {\n    reset();\n    reseed(seed); // Steps D-G\n    let res: T | undefined = undefined; // Step H: grind until k is in [1..n-1]\n    while (!(res = pred(gen()))) reseed();\n    reset();\n    return res;\n  };\n  return genUntil;\n}\n\n// Validating curves and fields\n\nconst validatorFns = {\n  bigint: (val: any): boolean => typeof val === 'bigint',\n  function: (val: any): boolean => typeof val === 'function',\n  boolean: (val: any): boolean => typeof val === 'boolean',\n  string: (val: any): boolean => typeof val === 'string',\n  stringOrUint8Array: (val: any): boolean => typeof val === 'string' || isBytes_(val),\n  isSafeInteger: (val: any): boolean => Number.isSafeInteger(val),\n  array: (val: any): boolean => Array.isArray(val),\n  field: (val: any, object: any): any => (object as any).Fp.isValid(val),\n  hash: (val: any): boolean => typeof val === 'function' && Number.isSafeInteger(val.outputLen),\n} as const;\ntype Validator = keyof typeof validatorFns;\ntype ValMap<T extends Record<string, any>> = { [K in keyof T]?: Validator };\n// type Record<K extends string | number | symbol, T> = { [P in K]: T; }\n\nexport function validateObject<T extends Record<string, any>>(\n  object: T,\n  validators: ValMap<T>,\n  optValidators: ValMap<T> = {}\n): T {\n  const checkField = (fieldName: keyof T, type: Validator, isOptional: boolean) => {\n    const checkVal = validatorFns[type];\n    if (typeof checkVal !== 'function') throw new Error('invalid validator function');\n\n    const val = object[fieldName as keyof typeof object];\n    if (isOptional && val === undefined) return;\n    if (!checkVal(val, object)) {\n      throw new Error(\n        'param ' + String(fieldName) + ' is invalid. Expected ' + type + ', got ' + val\n      );\n    }\n  };\n  for (const [fieldName, type] of Object.entries(validators)) checkField(fieldName, type!, false);\n  for (const [fieldName, type] of Object.entries(optValidators)) checkField(fieldName, type!, true);\n  return object;\n}\n// validate type tests\n// const o: { a: number; b: number; c: number } = { a: 1, b: 5, c: 6 };\n// const z0 = validateObject(o, { a: 'isSafeInteger' }, { c: 'bigint' }); // Ok!\n// // Should fail type-check\n// const z1 = validateObject(o, { a: 'tmp' }, { c: 'zz' });\n// const z2 = validateObject(o, { a: 'isSafeInteger' }, { c: 'zz' });\n// const z3 = validateObject(o, { test: 'boolean', z: 'bug' });\n// const z4 = validateObject(o, { a: 'boolean', z: 'bug' });\n\nexport function isHash(val: CHash): boolean {\n  return typeof val === 'function' && Number.isSafeInteger(val.outputLen);\n}\nexport function _validateObject(\n  object: Record<string, any>,\n  fields: Record<string, string>,\n  optFields: Record<string, string> = {}\n): void {\n  if (!object || typeof object !== 'object') throw new Error('expected valid options object');\n  type Item = keyof typeof object;\n  function checkField(fieldName: Item, expectedType: string, isOpt: boolean) {\n    const val = object[fieldName];\n    if (isOpt && val === undefined) return;\n    const current = typeof val;\n    if (current !== expectedType || val === null)\n      throw new Error(`param \"${fieldName}\" is invalid: expected ${expectedType}, got ${current}`);\n  }\n  Object.entries(fields).forEach(([k, v]) => checkField(k, v, false));\n  Object.entries(optFields).forEach(([k, v]) => checkField(k, v, true));\n}\n\n/**\n * throws not implemented error\n */\nexport const notImplemented = (): never => {\n  throw new Error('not implemented');\n};\n\n/**\n * Memoizes (caches) computation result.\n * Uses WeakMap: the value is going auto-cleaned by GC after last reference is removed.\n */\nexport function memoized<T extends object, R, O extends any[]>(\n  fn: (arg: T, ...args: O) => R\n): (arg: T, ...args: O) => R {\n  const map = new WeakMap<T, R>();\n  return (arg: T, ...args: O): R => {\n    const val = map.get(arg);\n    if (val !== undefined) return val;\n    const computed = fn(arg, ...args);\n    map.set(arg, computed);\n    return computed;\n  };\n}\n","/**\n * Utils for modular division and fields.\n * Field over 11 is a finite (Galois) field is integer number operations `mod 11`.\n * There is no division: it is replaced by modular multiplicative inverse.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport {\n  _validateObject,\n  anumber,\n  bitMask,\n  bytesToNumberBE,\n  bytesToNumberLE,\n  ensureBytes,\n  numberToBytesBE,\n  numberToBytesLE,\n} from '../utils.ts';\n\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = /* @__PURE__ */ BigInt(2), _3n = /* @__PURE__ */ BigInt(3);\n// prettier-ignore\nconst _4n = /* @__PURE__ */ BigInt(4), _5n = /* @__PURE__ */ BigInt(5), _7n = /* @__PURE__ */ BigInt(7);\n// prettier-ignore\nconst _8n = /* @__PURE__ */ BigInt(8), _9n = /* @__PURE__ */ BigInt(9), _16n = /* @__PURE__ */ BigInt(16);\n\n// Calculates a modulo b\nexport function mod(a: bigint, b: bigint): bigint {\n  const result = a % b;\n  return result >= _0n ? result : b + result;\n}\n/**\n * Efficiently raise num to power and do modular division.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n * @example\n * pow(2n, 6n, 11n) // 64n % 11n == 9n\n */\nexport function pow(num: bigint, power: bigint, modulo: bigint): bigint {\n  return FpPow(Field(modulo), num, power);\n}\n\n/** Does `x^(2^power)` mod p. `pow2(30, 4)` == `30^(2^4)` */\nexport function pow2(x: bigint, power: bigint, modulo: bigint): bigint {\n  let res = x;\n  while (power-- > _0n) {\n    res *= res;\n    res %= modulo;\n  }\n  return res;\n}\n\n/**\n * Inverses number over modulo.\n * Implemented using [Euclidean GCD](https://brilliant.org/wiki/extended-euclidean-algorithm/).\n */\nexport function invert(number: bigint, modulo: bigint): bigint {\n  if (number === _0n) throw new Error('invert: expected non-zero number');\n  if (modulo <= _0n) throw new Error('invert: expected positive modulus, got ' + modulo);\n  // Fermat's little theorem \"CT-like\" version inv(n) = n^(m-2) mod m is 30x slower.\n  let a = mod(number, modulo);\n  let b = modulo;\n  // prettier-ignore\n  let x = _0n, y = _1n, u = _1n, v = _0n;\n  while (a !== _0n) {\n    // JIT applies optimization if those two lines follow each other\n    const q = b / a;\n    const r = b % a;\n    const m = x - u * q;\n    const n = y - v * q;\n    // prettier-ignore\n    b = a, a = r, x = u, y = v, u = m, v = n;\n  }\n  const gcd = b;\n  if (gcd !== _1n) throw new Error('invert: does not exist');\n  return mod(x, modulo);\n}\n\nfunction assertIsSquare<T>(Fp: IField<T>, root: T, n: T): void {\n  if (!Fp.eql(Fp.sqr(root), n)) throw new Error('Cannot find square root');\n}\n\n// Not all roots are possible! Example which will throw:\n// const NUM =\n// n = 72057594037927816n;\n// Fp = Field(BigInt('0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab'));\nfunction sqrt3mod4<T>(Fp: IField<T>, n: T) {\n  const p1div4 = (Fp.ORDER + _1n) / _4n;\n  const root = Fp.pow(n, p1div4);\n  assertIsSquare(Fp, root, n);\n  return root;\n}\n\nfunction sqrt5mod8<T>(Fp: IField<T>, n: T) {\n  const p5div8 = (Fp.ORDER - _5n) / _8n;\n  const n2 = Fp.mul(n, _2n);\n  const v = Fp.pow(n2, p5div8);\n  const nv = Fp.mul(n, v);\n  const i = Fp.mul(Fp.mul(nv, _2n), v);\n  const root = Fp.mul(nv, Fp.sub(i, Fp.ONE));\n  assertIsSquare(Fp, root, n);\n  return root;\n}\n\n// Based on RFC9380, Kong algorithm\n// prettier-ignore\nfunction sqrt9mod16(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n  const Fp_ = Field(P);\n  const tn = tonelliShanks(P);\n  const c1 = tn(Fp_, Fp_.neg(Fp_.ONE));//  1. c1 = sqrt(-1) in F, i.e., (c1^2) == -1 in F\n  const c2 = tn(Fp_, c1);              //  2. c2 = sqrt(c1) in F, i.e., (c2^2) == c1 in F\n  const c3 = tn(Fp_, Fp_.neg(c1));     //  3. c3 = sqrt(-c1) in F, i.e., (c3^2) == -c1 in F\n  const c4 = (P + _7n) / _16n;         //  4. c4 = (q + 7) / 16        # Integer arithmetic\n  return <T>(Fp: IField<T>, n: T) => {\n    let tv1 = Fp.pow(n, c4);           //  1. tv1 = x^c4\n    let tv2 = Fp.mul(tv1, c1);         //  2. tv2 = c1 * tv1\n    const tv3 = Fp.mul(tv1, c2);       //  3. tv3 = c2 * tv1\n    const tv4 = Fp.mul(tv1, c3);       //  4. tv4 = c3 * tv1\n    const e1 = Fp.eql(Fp.sqr(tv2), n); //  5.  e1 = (tv2^2) == x\n    const e2 = Fp.eql(Fp.sqr(tv3), n); //  6.  e2 = (tv3^2) == x\n    tv1 = Fp.cmov(tv1, tv2, e1);       //  7. tv1 = CMOV(tv1, tv2, e1)  # Select tv2 if (tv2^2) == x\n    tv2 = Fp.cmov(tv4, tv3, e2);       //  8. tv2 = CMOV(tv4, tv3, e2)  # Select tv3 if (tv3^2) == x\n    const e3 = Fp.eql(Fp.sqr(tv2), n); //  9.  e3 = (tv2^2) == x\n    const root = Fp.cmov(tv1, tv2, e3);// 10.  z = CMOV(tv1, tv2, e3)   # Select sqrt from tv1 & tv2\n    assertIsSquare(Fp, root, n);\n    return root;\n  };\n}\n\n/**\n * Tonelli-Shanks square root search algorithm.\n * 1. https://eprint.iacr.org/2012/685.pdf (page 12)\n * 2. Square Roots from 1; 24, 51, 10 to Dan Shanks\n * @param P field order\n * @returns function that takes field Fp (created from P) and number n\n */\nexport function tonelliShanks(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n  // Initialization (precomputation).\n  // Caching initialization could boost perf by 7%.\n  if (P < _3n) throw new Error('sqrt is not defined for small field');\n  // Factor P - 1 = Q * 2^S, where Q is odd\n  let Q = P - _1n;\n  let S = 0;\n  while (Q % _2n === _0n) {\n    Q /= _2n;\n    S++;\n  }\n\n  // Find the first quadratic non-residue Z >= 2\n  let Z = _2n;\n  const _Fp = Field(P);\n  while (FpLegendre(_Fp, Z) === 1) {\n    // Basic primality test for P. After x iterations, chance of\n    // not finding quadratic non-residue is 2^x, so 2^1000.\n    if (Z++ > 1000) throw new Error('Cannot find square root: probably non-prime P');\n  }\n  // Fast-path; usually done before Z, but we do \"primality test\".\n  if (S === 1) return sqrt3mod4;\n\n  // Slow-path\n  // TODO: test on Fp2 and others\n  let cc = _Fp.pow(Z, Q); // c = z^Q\n  const Q1div2 = (Q + _1n) / _2n;\n  return function tonelliSlow<T>(Fp: IField<T>, n: T): T {\n    if (Fp.is0(n)) return n;\n    // Check if n is a quadratic residue using Legendre symbol\n    if (FpLegendre(Fp, n) !== 1) throw new Error('Cannot find square root');\n\n    // Initialize variables for the main loop\n    let M = S;\n    let c = Fp.mul(Fp.ONE, cc); // c = z^Q, move cc from field _Fp into field Fp\n    let t = Fp.pow(n, Q); // t = n^Q, first guess at the fudge factor\n    let R = Fp.pow(n, Q1div2); // R = n^((Q+1)/2), first guess at the square root\n\n    // Main loop\n    // while t != 1\n    while (!Fp.eql(t, Fp.ONE)) {\n      if (Fp.is0(t)) return Fp.ZERO; // if t=0 return R=0\n      let i = 1;\n\n      // Find the smallest i >= 1 such that t^(2^i) ≡ 1 (mod P)\n      let t_tmp = Fp.sqr(t); // t^(2^1)\n      while (!Fp.eql(t_tmp, Fp.ONE)) {\n        i++;\n        t_tmp = Fp.sqr(t_tmp); // t^(2^2)...\n        if (i === M) throw new Error('Cannot find square root');\n      }\n\n      // Calculate the exponent for b: 2^(M - i - 1)\n      const exponent = _1n << BigInt(M - i - 1); // bigint is important\n      const b = Fp.pow(c, exponent); // b = 2^(M - i - 1)\n\n      // Update variables\n      M = i;\n      c = Fp.sqr(b); // c = b^2\n      t = Fp.mul(t, c); // t = (t * b^2)\n      R = Fp.mul(R, b); // R = R*b\n    }\n    return R;\n  };\n}\n\n/**\n * Square root for a finite field. Will try optimized versions first:\n *\n * 1. P ≡ 3 (mod 4)\n * 2. P ≡ 5 (mod 8)\n * 3. P ≡ 9 (mod 16)\n * 4. Tonelli-Shanks algorithm\n *\n * Different algorithms can give different roots, it is up to user to decide which one they want.\n * For example there is FpSqrtOdd/FpSqrtEven to choice root based on oddness (used for hash-to-curve).\n */\nexport function FpSqrt(P: bigint): <T>(Fp: IField<T>, n: T) => T {\n  // P ≡ 3 (mod 4) => √n = n^((P+1)/4)\n  if (P % _4n === _3n) return sqrt3mod4;\n  // P ≡ 5 (mod 8) => Atkin algorithm, page 10 of https://eprint.iacr.org/2012/685.pdf\n  if (P % _8n === _5n) return sqrt5mod8;\n  // P ≡ 9 (mod 16) => Kong algorithm, page 11 of https://eprint.iacr.org/2012/685.pdf (algorithm 4)\n  if (P % _16n === _9n) return sqrt9mod16(P);\n  // Tonelli-Shanks algorithm\n  return tonelliShanks(P);\n}\n\n// Little-endian check for first LE bit (last BE bit);\nexport const isNegativeLE = (num: bigint, modulo: bigint): boolean =>\n  (mod(num, modulo) & _1n) === _1n;\n\n/** Field is not always over prime: for example, Fp2 has ORDER(q)=p^m. */\nexport interface IField<T> {\n  ORDER: bigint;\n  isLE: boolean;\n  BYTES: number;\n  BITS: number;\n  MASK: bigint;\n  ZERO: T;\n  ONE: T;\n  // 1-arg\n  create: (num: T) => T;\n  isValid: (num: T) => boolean;\n  is0: (num: T) => boolean;\n  isValidNot0: (num: T) => boolean;\n  neg(num: T): T;\n  inv(num: T): T;\n  sqrt(num: T): T;\n  sqr(num: T): T;\n  // 2-args\n  eql(lhs: T, rhs: T): boolean;\n  add(lhs: T, rhs: T): T;\n  sub(lhs: T, rhs: T): T;\n  mul(lhs: T, rhs: T | bigint): T;\n  pow(lhs: T, power: bigint): T;\n  div(lhs: T, rhs: T | bigint): T;\n  // N for NonNormalized (for now)\n  addN(lhs: T, rhs: T): T;\n  subN(lhs: T, rhs: T): T;\n  mulN(lhs: T, rhs: T | bigint): T;\n  sqrN(num: T): T;\n\n  // Optional\n  // Should be same as sgn0 function in\n  // [RFC9380](https://www.rfc-editor.org/rfc/rfc9380#section-4.1).\n  // NOTE: sgn0 is 'negative in LE', which is same as odd. And negative in LE is kinda strange definition anyway.\n  isOdd?(num: T): boolean; // Odd instead of even since we have it for Fp2\n  allowedLengths?: number[];\n  // legendre?(num: T): T;\n  invertBatch: (lst: T[]) => T[];\n  toBytes(num: T): Uint8Array;\n  fromBytes(bytes: Uint8Array, skipValidation?: boolean): T;\n  // If c is False, CMOV returns a, otherwise it returns b.\n  cmov(a: T, b: T, c: boolean): T;\n}\n// prettier-ignore\nconst FIELD_FIELDS = [\n  'create', 'isValid', 'is0', 'neg', 'inv', 'sqrt', 'sqr',\n  'eql', 'add', 'sub', 'mul', 'pow', 'div',\n  'addN', 'subN', 'mulN', 'sqrN'\n] as const;\nexport function validateField<T>(field: IField<T>): IField<T> {\n  const initial = {\n    ORDER: 'bigint',\n    MASK: 'bigint',\n    BYTES: 'number',\n    BITS: 'number',\n  } as Record<string, string>;\n  const opts = FIELD_FIELDS.reduce((map, val: string) => {\n    map[val] = 'function';\n    return map;\n  }, initial);\n  _validateObject(field, opts);\n  // const max = 16384;\n  // if (field.BYTES < 1 || field.BYTES > max) throw new Error('invalid field');\n  // if (field.BITS < 1 || field.BITS > 8 * max) throw new Error('invalid field');\n  return field;\n}\n\n// Generic field functions\n\n/**\n * Same as `pow` but for Fp: non-constant-time.\n * Unsafe in some contexts: uses ladder, so can expose bigint bits.\n */\nexport function FpPow<T>(Fp: IField<T>, num: T, power: bigint): T {\n  if (power < _0n) throw new Error('invalid exponent, negatives unsupported');\n  if (power === _0n) return Fp.ONE;\n  if (power === _1n) return num;\n  let p = Fp.ONE;\n  let d = num;\n  while (power > _0n) {\n    if (power & _1n) p = Fp.mul(p, d);\n    d = Fp.sqr(d);\n    power >>= _1n;\n  }\n  return p;\n}\n\n/**\n * Efficiently invert an array of Field elements.\n * Exception-free. Will return `undefined` for 0 elements.\n * @param passZero map 0 to 0 (instead of undefined)\n */\nexport function FpInvertBatch<T>(Fp: IField<T>, nums: T[], passZero = false): T[] {\n  const inverted = new Array(nums.length).fill(passZero ? Fp.ZERO : undefined);\n  // Walk from first to last, multiply them by each other MOD p\n  const multipliedAcc = nums.reduce((acc, num, i) => {\n    if (Fp.is0(num)) return acc;\n    inverted[i] = acc;\n    return Fp.mul(acc, num);\n  }, Fp.ONE);\n  // Invert last element\n  const invertedAcc = Fp.inv(multipliedAcc);\n  // Walk from last to first, multiply them by inverted each other MOD p\n  nums.reduceRight((acc, num, i) => {\n    if (Fp.is0(num)) return acc;\n    inverted[i] = Fp.mul(acc, inverted[i]);\n    return Fp.mul(acc, num);\n  }, invertedAcc);\n  return inverted;\n}\n\n// TODO: remove\nexport function FpDiv<T>(Fp: IField<T>, lhs: T, rhs: T | bigint): T {\n  return Fp.mul(lhs, typeof rhs === 'bigint' ? invert(rhs, Fp.ORDER) : Fp.inv(rhs));\n}\n\n/**\n * Legendre symbol.\n * Legendre constant is used to calculate Legendre symbol (a | p)\n * which denotes the value of a^((p-1)/2) (mod p).\n *\n * * (a | p) ≡ 1    if a is a square (mod p), quadratic residue\n * * (a | p) ≡ -1   if a is not a square (mod p), quadratic non residue\n * * (a | p) ≡ 0    if a ≡ 0 (mod p)\n */\nexport function FpLegendre<T>(Fp: IField<T>, n: T): -1 | 0 | 1 {\n  // We can use 3rd argument as optional cache of this value\n  // but seems unneeded for now. The operation is very fast.\n  const p1mod2 = (Fp.ORDER - _1n) / _2n;\n  const powered = Fp.pow(n, p1mod2);\n  const yes = Fp.eql(powered, Fp.ONE);\n  const zero = Fp.eql(powered, Fp.ZERO);\n  const no = Fp.eql(powered, Fp.neg(Fp.ONE));\n  if (!yes && !zero && !no) throw new Error('invalid Legendre symbol result');\n  return yes ? 1 : zero ? 0 : -1;\n}\n\n// This function returns True whenever the value x is a square in the field F.\nexport function FpIsSquare<T>(Fp: IField<T>, n: T): boolean {\n  const l = FpLegendre(Fp, n);\n  return l === 1;\n}\n\nexport type NLength = { nByteLength: number; nBitLength: number };\n// CURVE.n lengths\nexport function nLength(n: bigint, nBitLength?: number): NLength {\n  // Bit size, byte size of CURVE.n\n  if (nBitLength !== undefined) anumber(nBitLength);\n  const _nBitLength = nBitLength !== undefined ? nBitLength : n.toString(2).length;\n  const nByteLength = Math.ceil(_nBitLength / 8);\n  return { nBitLength: _nBitLength, nByteLength };\n}\n\ntype FpField = IField<bigint> & Required<Pick<IField<bigint>, 'isOdd'>>;\ntype SqrtFn = (n: bigint) => bigint;\ntype FieldOpts = Partial<{\n  sqrt: SqrtFn;\n  isLE: boolean;\n  BITS: number;\n  modFromBytes: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n  allowedLengths?: readonly number[]; // for P521 (adds padding for smaller sizes)\n}>;\n/**\n * Creates a finite field. Major performance optimizations:\n * * 1. Denormalized operations like mulN instead of mul.\n * * 2. Identical object shape: never add or remove keys.\n * * 3. `Object.freeze`.\n * Fragile: always run a benchmark on a change.\n * Security note: operations don't check 'isValid' for all elements for performance reasons,\n * it is caller responsibility to check this.\n * This is low-level code, please make sure you know what you're doing.\n *\n * Note about field properties:\n * * CHARACTERISTIC p = prime number, number of elements in main subgroup.\n * * ORDER q = similar to cofactor in curves, may be composite `q = p^m`.\n *\n * @param ORDER field order, probably prime, or could be composite\n * @param bitLen how many bits the field consumes\n * @param isLE (default: false) if encoding / decoding should be in little-endian\n * @param redef optional faster redefinitions of sqrt and other methods\n */\nexport function Field(\n  ORDER: bigint,\n  bitLenOrOpts?: number | FieldOpts, // TODO: use opts only in v2?\n  isLE = false,\n  opts: { sqrt?: SqrtFn } = {}\n): Readonly<FpField> {\n  if (ORDER <= _0n) throw new Error('invalid field: expected ORDER > 0, got ' + ORDER);\n  let _nbitLength: number | undefined = undefined;\n  let _sqrt: SqrtFn | undefined = undefined;\n  let modFromBytes: boolean = false;\n  let allowedLengths: undefined | readonly number[] = undefined;\n  if (typeof bitLenOrOpts === 'object' && bitLenOrOpts != null) {\n    if (opts.sqrt || isLE) throw new Error('cannot specify opts in two arguments');\n    const _opts = bitLenOrOpts;\n    if (_opts.BITS) _nbitLength = _opts.BITS;\n    if (_opts.sqrt) _sqrt = _opts.sqrt;\n    if (typeof _opts.isLE === 'boolean') isLE = _opts.isLE;\n    if (typeof _opts.modFromBytes === 'boolean') modFromBytes = _opts.modFromBytes;\n    allowedLengths = _opts.allowedLengths;\n  } else {\n    if (typeof bitLenOrOpts === 'number') _nbitLength = bitLenOrOpts;\n    if (opts.sqrt) _sqrt = opts.sqrt;\n  }\n  const { nBitLength: BITS, nByteLength: BYTES } = nLength(ORDER, _nbitLength);\n  if (BYTES > 2048) throw new Error('invalid field: expected ORDER of <= 2048 bytes');\n  let sqrtP: ReturnType<typeof FpSqrt>; // cached sqrtP\n  const f: Readonly<FpField> = Object.freeze({\n    ORDER,\n    isLE,\n    BITS,\n    BYTES,\n    MASK: bitMask(BITS),\n    ZERO: _0n,\n    ONE: _1n,\n    allowedLengths: allowedLengths,\n    create: (num) => mod(num, ORDER),\n    isValid: (num) => {\n      if (typeof num !== 'bigint')\n        throw new Error('invalid field element: expected bigint, got ' + typeof num);\n      return _0n <= num && num < ORDER; // 0 is valid element, but it's not invertible\n    },\n    is0: (num) => num === _0n,\n    // is valid and invertible\n    isValidNot0: (num: bigint) => !f.is0(num) && f.isValid(num),\n    isOdd: (num) => (num & _1n) === _1n,\n    neg: (num) => mod(-num, ORDER),\n    eql: (lhs, rhs) => lhs === rhs,\n\n    sqr: (num) => mod(num * num, ORDER),\n    add: (lhs, rhs) => mod(lhs + rhs, ORDER),\n    sub: (lhs, rhs) => mod(lhs - rhs, ORDER),\n    mul: (lhs, rhs) => mod(lhs * rhs, ORDER),\n    pow: (num, power) => FpPow(f, num, power),\n    div: (lhs, rhs) => mod(lhs * invert(rhs, ORDER), ORDER),\n\n    // Same as above, but doesn't normalize\n    sqrN: (num) => num * num,\n    addN: (lhs, rhs) => lhs + rhs,\n    subN: (lhs, rhs) => lhs - rhs,\n    mulN: (lhs, rhs) => lhs * rhs,\n\n    inv: (num) => invert(num, ORDER),\n    sqrt:\n      _sqrt ||\n      ((n) => {\n        if (!sqrtP) sqrtP = FpSqrt(ORDER);\n        return sqrtP(f, n);\n      }),\n    toBytes: (num) => (isLE ? numberToBytesLE(num, BYTES) : numberToBytesBE(num, BYTES)),\n    fromBytes: (bytes, skipValidation = true) => {\n      if (allowedLengths) {\n        if (!allowedLengths.includes(bytes.length) || bytes.length > BYTES) {\n          throw new Error(\n            'Field.fromBytes: expected ' + allowedLengths + ' bytes, got ' + bytes.length\n          );\n        }\n        const padded = new Uint8Array(BYTES);\n        // isLE add 0 to right, !isLE to the left.\n        padded.set(bytes, isLE ? 0 : padded.length - bytes.length);\n        bytes = padded;\n      }\n      if (bytes.length !== BYTES)\n        throw new Error('Field.fromBytes: expected ' + BYTES + ' bytes, got ' + bytes.length);\n      let scalar = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n      if (modFromBytes) scalar = mod(scalar, ORDER);\n      if (!skipValidation)\n        if (!f.isValid(scalar)) throw new Error('invalid field element: outside of range 0..ORDER');\n      // NOTE: we don't validate scalar here, please use isValid. This done such way because some\n      // protocol may allow non-reduced scalar that reduced later or changed some other way.\n      return scalar;\n    },\n    // TODO: we don't need it here, move out to separate fn\n    invertBatch: (lst) => FpInvertBatch(f, lst),\n    // We can't move this out because Fp6, Fp12 implement it\n    // and it's unclear what to return in there.\n    cmov: (a, b, c) => (c ? b : a),\n  } as FpField);\n  return Object.freeze(f);\n}\n\n// Generic random scalar, we can do same for other fields if via Fp2.mul(Fp2.ONE, Fp2.random)?\n// This allows unsafe methods like ignore bias or zero. These unsafe, but often used in different protocols (if deterministic RNG).\n// which mean we cannot force this via opts.\n// Not sure what to do with randomBytes, we can accept it inside opts if wanted.\n// Probably need to export getMinHashLength somewhere?\n// random(bytes?: Uint8Array, unsafeAllowZero = false, unsafeAllowBias = false) {\n//   const LEN = !unsafeAllowBias ? getMinHashLength(ORDER) : BYTES;\n//   if (bytes === undefined) bytes = randomBytes(LEN); // _opts.randomBytes?\n//   const num = isLE ? bytesToNumberLE(bytes) : bytesToNumberBE(bytes);\n//   // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n//   const reduced = unsafeAllowZero ? mod(num, ORDER) : mod(num, ORDER - _1n) + _1n;\n//   return reduced;\n// },\n\nexport function FpSqrtOdd<T>(Fp: IField<T>, elm: T): T {\n  if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n  const root = Fp.sqrt(elm);\n  return Fp.isOdd(root) ? root : Fp.neg(root);\n}\n\nexport function FpSqrtEven<T>(Fp: IField<T>, elm: T): T {\n  if (!Fp.isOdd) throw new Error(\"Field doesn't have isOdd\");\n  const root = Fp.sqrt(elm);\n  return Fp.isOdd(root) ? Fp.neg(root) : root;\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Same as mapKeyToField, but accepts less bytes (40 instead of 48 for 32-byte field).\n * Which makes it slightly more biased, less secure.\n * @deprecated use `mapKeyToField` instead\n */\nexport function hashToPrivateScalar(\n  hash: string | Uint8Array,\n  groupOrder: bigint,\n  isLE = false\n): bigint {\n  hash = ensureBytes('privateHash', hash);\n  const hashLen = hash.length;\n  const minLen = nLength(groupOrder).nByteLength + 8;\n  if (minLen < 24 || hashLen < minLen || hashLen > 1024)\n    throw new Error(\n      'hashToPrivateScalar: expected ' + minLen + '-1024 bytes of input, got ' + hashLen\n    );\n  const num = isLE ? bytesToNumberLE(hash) : bytesToNumberBE(hash);\n  return mod(num, groupOrder - _1n) + _1n;\n}\n\n/**\n * Returns total number of bytes consumed by the field element.\n * For example, 32 bytes for usual 256-bit weierstrass curve.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of field\n */\nexport function getFieldBytesLength(fieldOrder: bigint): number {\n  if (typeof fieldOrder !== 'bigint') throw new Error('field order must be bigint');\n  const bitLength = fieldOrder.toString(2).length;\n  return Math.ceil(bitLength / 8);\n}\n\n/**\n * Returns minimal amount of bytes that can be safely reduced\n * by field order.\n * Should be 2^-128 for 128-bit curve such as P256.\n * @param fieldOrder number of field elements, usually CURVE.n\n * @returns byte length of target hash\n */\nexport function getMinHashLength(fieldOrder: bigint): number {\n  const length = getFieldBytesLength(fieldOrder);\n  return length + Math.ceil(length / 2);\n}\n\n/**\n * \"Constant-time\" private key generation utility.\n * Can take (n + n/2) or more bytes of uniform input e.g. from CSPRNG or KDF\n * and convert them into private scalar, with the modulo bias being negligible.\n * Needs at least 48 bytes of input for 32-byte private key.\n * https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/\n * FIPS 186-5, A.2 https://csrc.nist.gov/publications/detail/fips/186/5/final\n * RFC 9380, https://www.rfc-editor.org/rfc/rfc9380#section-5\n * @param hash hash output from SHA3 or a similar function\n * @param groupOrder size of subgroup - (e.g. secp256k1.CURVE.n)\n * @param isLE interpret hash bytes as LE num\n * @returns valid private scalar\n */\nexport function mapHashToField(key: Uint8Array, fieldOrder: bigint, isLE = false): Uint8Array {\n  const len = key.length;\n  const fieldLen = getFieldBytesLength(fieldOrder);\n  const minLen = getMinHashLength(fieldOrder);\n  // No small numbers: need to understand bias story. No huge numbers: easier to detect JS timings.\n  if (len < 16 || len < minLen || len > 1024)\n    throw new Error('expected ' + minLen + '-1024 bytes of input, got ' + len);\n  const num = isLE ? bytesToNumberLE(key) : bytesToNumberBE(key);\n  // `mod(x, 11)` can sometimes produce 0. `mod(x, 10) + 1` is the same, but no 0\n  const reduced = mod(num, fieldOrder - _1n) + _1n;\n  return isLE ? numberToBytesLE(reduced, fieldLen) : numberToBytesBE(reduced, fieldLen);\n}\n","/**\n * Methods for elliptic curve multiplication by scalars.\n * Contains wNAF, pippenger.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { bitLen, bitMask, validateObject } from '../utils.ts';\nimport { Field, FpInvertBatch, nLength, validateField, type IField } from './modular.ts';\n\nconst _0n = BigInt(0);\nconst _1n = BigInt(1);\n\nexport type AffinePoint<T> = {\n  x: T;\n  y: T;\n} & { Z?: never };\n\n// This was initialy do this way to re-use montgomery ladder in field (add->mul,double->sqr), but\n// that didn't happen and there is probably not much reason to have separate Group like this?\nexport interface Group<T extends Group<T>> {\n  double(): T;\n  negate(): T;\n  add(other: T): T;\n  subtract(other: T): T;\n  equals(other: T): boolean;\n  multiply(scalar: bigint): T;\n  toAffine?(invertedZ?: any): AffinePoint<any>;\n}\n\n// We can't \"abstract out\" coordinates (X, Y, Z; and T in Edwards): argument names of constructor\n// are not accessible. See Typescript gh-56093, gh-41594.\n//\n// We have to use recursive types, so it will return actual point, not constained `CurvePoint`.\n// If, at any point, P is `any`, it will erase all types and replace it\n// with `any`, because of recursion, `any implements CurvePoint`,\n// but we lose all constrains on methods.\n\n/** Base interface for all elliptic curve Points. */\nexport interface CurvePoint<F, P extends CurvePoint<F, P>> extends Group<P> {\n  /** Affine x coordinate. Different from projective / extended X coordinate. */\n  x: F;\n  /** Affine y coordinate. Different from projective / extended Y coordinate. */\n  y: F;\n  Z?: F;\n  double(): P;\n  negate(): P;\n  add(other: P): P;\n  subtract(other: P): P;\n  equals(other: P): boolean;\n  multiply(scalar: bigint): P;\n  assertValidity(): void;\n  clearCofactor(): P;\n  is0(): boolean;\n  isTorsionFree(): boolean;\n  isSmallOrder(): boolean;\n  multiplyUnsafe(scalar: bigint): P;\n  /**\n   * Massively speeds up `p.multiply(n)` by using precompute tables (caching). See {@link wNAF}.\n   * @param isLazy calculate cache now. Default (true) ensures it's deferred to first `multiply()`\n   */\n  precompute(windowSize?: number, isLazy?: boolean): P;\n  /** Converts point to 2D xy affine coordinates */\n  toAffine(invertedZ?: F): AffinePoint<F>;\n  toBytes(): Uint8Array;\n  toHex(): string;\n}\n\n/** Base interface for all elliptic curve Point constructors. */\nexport interface CurvePointCons<P extends CurvePoint<any, P>> {\n  [Symbol.hasInstance]: (item: unknown) => boolean;\n  BASE: P;\n  ZERO: P;\n  /** Field for basic curve math */\n  Fp: IField<P_F<P>>;\n  /** Scalar field, for scalars in multiply and others */\n  Fn: IField<bigint>;\n  /** Creates point from x, y. Does NOT validate if the point is valid. Use `.assertValidity()`. */\n  fromAffine(p: AffinePoint<P_F<P>>): P;\n  fromBytes(bytes: Uint8Array): P;\n  fromHex(hex: Uint8Array | string): P;\n}\n\n// Type inference helpers: PC - PointConstructor, P - Point, Fp - Field element\n// Short names, because we use them a lot in result types:\n// * we can't do 'P = GetCurvePoint<PC>': this is default value and doesn't constrain anything\n// * we can't do 'type X = GetCurvePoint<PC>': it won't be accesible for arguments/return types\n// * `CurvePointCons<P extends CurvePoint<any, P>>` constraints from interface definition\n//   won't propagate, if `PC extends CurvePointCons<any>`: the P would be 'any', which is incorrect\n// * PC could be super specific with super specific P, which implements CurvePoint<any, P>.\n//   this means we need to do stuff like\n//   `function test<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(`\n//   if we want type safety around P, otherwise PC_P<PC> will be any\n\n/** Returns Fp type from Point (P_F<P> == P.F) */\nexport type P_F<P extends CurvePoint<any, P>> = P extends CurvePoint<infer F, P> ? F : never;\n/** Returns Fp type from PointCons (PC_F<PC> == PC.P.F) */\nexport type PC_F<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['Fp']['ZERO'];\n/** Returns Point type from PointCons (PC_P<PC> == PC.P) */\nexport type PC_P<PC extends CurvePointCons<CurvePoint<any, any>>> = PC['ZERO'];\n\n// Ugly hack to get proper type inference, because in typescript fails to infer resursively.\n// The hack allows to do up to 10 chained operations without applying type erasure.\n//\n// Types which won't work:\n// * `CurvePointCons<CurvePoint<any, any>>`, will return `any` after 1 operation\n// * `CurvePointCons<any>: WeierstrassPointCons<bigint> extends CurvePointCons<any> = false`\n// * `P extends CurvePoint, PC extends CurvePointCons<P>`\n//     * It can't infer P from PC alone\n//     * Too many relations between F, P & PC\n//     * It will infer P/F if `arg: CurvePointCons<F, P>`, but will fail if PC is generic\n//     * It will work correctly if there is an additional argument of type P\n//     * But generally, we don't want to parametrize `CurvePointCons` over `F`: it will complicate\n//       types, making them un-inferable\n// prettier-ignore\nexport type PC_ANY = CurvePointCons<\n  CurvePoint<any,\n  CurvePoint<any,\n  CurvePoint<any,\n  CurvePoint<any,\n  CurvePoint<any,\n  CurvePoint<any,\n  CurvePoint<any,\n  CurvePoint<any,\n  CurvePoint<any,\n  CurvePoint<any, any>\n  >>>>>>>>>\n>;\n\nexport interface CurveLengths {\n  secretKey?: number;\n  publicKey?: number;\n  publicKeyUncompressed?: number;\n  publicKeyHasPrefix?: boolean;\n  signature?: number;\n  seed?: number;\n}\nexport type GroupConstructor<T> = {\n  BASE: T;\n  ZERO: T;\n};\n/** @deprecated */\nexport type ExtendedGroupConstructor<T> = GroupConstructor<T> & {\n  Fp: IField<any>;\n  Fn: IField<bigint>;\n  fromAffine(ap: AffinePoint<any>): T;\n};\nexport type Mapper<T> = (i: T[]) => T[];\n\nexport function negateCt<T extends { negate: () => T }>(condition: boolean, item: T): T {\n  const neg = item.negate();\n  return condition ? neg : item;\n}\n\n/**\n * Takes a bunch of Projective Points but executes only one\n * inversion on all of them. Inversion is very slow operation,\n * so this improves performance massively.\n * Optimization: converts a list of projective points to a list of identical points with Z=1.\n */\nexport function normalizeZ<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n  c: PC,\n  points: P[]\n): P[] {\n  const invertedZs = FpInvertBatch(\n    c.Fp,\n    points.map((p) => p.Z!)\n  );\n  return points.map((p, i) => c.fromAffine(p.toAffine(invertedZs[i])));\n}\n\nfunction validateW(W: number, bits: number) {\n  if (!Number.isSafeInteger(W) || W <= 0 || W > bits)\n    throw new Error('invalid window size, expected [1..' + bits + '], got W=' + W);\n}\n\n/** Internal wNAF opts for specific W and scalarBits */\nexport type WOpts = {\n  windows: number;\n  windowSize: number;\n  mask: bigint;\n  maxNumber: number;\n  shiftBy: bigint;\n};\n\nfunction calcWOpts(W: number, scalarBits: number): WOpts {\n  validateW(W, scalarBits);\n  const windows = Math.ceil(scalarBits / W) + 1; // W=8 33. Not 32, because we skip zero\n  const windowSize = 2 ** (W - 1); // W=8 128. Not 256, because we skip zero\n  const maxNumber = 2 ** W; // W=8 256\n  const mask = bitMask(W); // W=8 255 == mask 0b11111111\n  const shiftBy = BigInt(W); // W=8 8\n  return { windows, windowSize, mask, maxNumber, shiftBy };\n}\n\nfunction calcOffsets(n: bigint, window: number, wOpts: WOpts) {\n  const { windowSize, mask, maxNumber, shiftBy } = wOpts;\n  let wbits = Number(n & mask); // extract W bits.\n  let nextN = n >> shiftBy; // shift number by W bits.\n\n  // What actually happens here:\n  // const highestBit = Number(mask ^ (mask >> 1n));\n  // let wbits2 = wbits - 1; // skip zero\n  // if (wbits2 & highestBit) { wbits2 ^= Number(mask); // (~);\n\n  // split if bits > max: +224 => 256-32\n  if (wbits > windowSize) {\n    // we skip zero, which means instead of `>= size-1`, we do `> size`\n    wbits -= maxNumber; // -32, can be maxNumber - wbits, but then we need to set isNeg here.\n    nextN += _1n; // +256 (carry)\n  }\n  const offsetStart = window * windowSize;\n  const offset = offsetStart + Math.abs(wbits) - 1; // -1 because we skip zero\n  const isZero = wbits === 0; // is current window slice a 0?\n  const isNeg = wbits < 0; // is current window slice negative?\n  const isNegF = window % 2 !== 0; // fake random statement for noise\n  const offsetF = offsetStart; // fake offset for noise\n  return { nextN, offset, isZero, isNeg, isNegF, offsetF };\n}\n\nfunction validateMSMPoints(points: any[], c: any) {\n  if (!Array.isArray(points)) throw new Error('array expected');\n  points.forEach((p, i) => {\n    if (!(p instanceof c)) throw new Error('invalid point at index ' + i);\n  });\n}\nfunction validateMSMScalars(scalars: any[], field: any) {\n  if (!Array.isArray(scalars)) throw new Error('array of scalars expected');\n  scalars.forEach((s, i) => {\n    if (!field.isValid(s)) throw new Error('invalid scalar at index ' + i);\n  });\n}\n\n// Since points in different groups cannot be equal (different object constructor),\n// we can have single place to store precomputes.\n// Allows to make points frozen / immutable.\nconst pointPrecomputes = new WeakMap<any, any[]>();\nconst pointWindowSizes = new WeakMap<any, number>();\n\nfunction getW(P: any): number {\n  // To disable precomputes:\n  // return 1;\n  return pointWindowSizes.get(P) || 1;\n}\n\nfunction assert0(n: bigint): void {\n  if (n !== _0n) throw new Error('invalid wNAF');\n}\n\n/**\n * Elliptic curve multiplication of Point by scalar. Fragile.\n * Table generation takes **30MB of ram and 10ms on high-end CPU**,\n * but may take much longer on slow devices. Actual generation will happen on\n * first call of `multiply()`. By default, `BASE` point is precomputed.\n *\n * Scalars should always be less than curve order: this should be checked inside of a curve itself.\n * Creates precomputation tables for fast multiplication:\n * - private scalar is split by fixed size windows of W bits\n * - every window point is collected from window's table & added to accumulator\n * - since windows are different, same point inside tables won't be accessed more than once per calc\n * - each multiplication is 'Math.ceil(CURVE_ORDER / 𝑊) + 1' point additions (fixed for any scalar)\n * - +1 window is neccessary for wNAF\n * - wNAF reduces table size: 2x less memory + 2x faster generation, but 10% slower multiplication\n *\n * @todo Research returning 2d JS array of windows, instead of a single window.\n * This would allow windows to be in different memory locations\n */\nexport class wNAF<PC extends PC_ANY> {\n  private readonly BASE: PC_P<PC>;\n  private readonly ZERO: PC_P<PC>;\n  private readonly Fn: PC['Fn'];\n  readonly bits: number;\n\n  // Parametrized with a given Point class (not individual point)\n  constructor(Point: PC, bits: number) {\n    this.BASE = Point.BASE;\n    this.ZERO = Point.ZERO;\n    this.Fn = Point.Fn;\n    this.bits = bits;\n  }\n\n  // non-const time multiplication ladder\n  _unsafeLadder(elm: PC_P<PC>, n: bigint, p: PC_P<PC> = this.ZERO): PC_P<PC> {\n    let d: PC_P<PC> = elm;\n    while (n > _0n) {\n      if (n & _1n) p = p.add(d);\n      d = d.double();\n      n >>= _1n;\n    }\n    return p;\n  }\n\n  /**\n   * Creates a wNAF precomputation window. Used for caching.\n   * Default window size is set by `utils.precompute()` and is equal to 8.\n   * Number of precomputed points depends on the curve size:\n   * 2^(𝑊−1) * (Math.ceil(𝑛 / 𝑊) + 1), where:\n   * - 𝑊 is the window size\n   * - 𝑛 is the bitlength of the curve order.\n   * For a 256-bit curve and window size 8, the number of precomputed points is 128 * 33 = 4224.\n   * @param point Point instance\n   * @param W window size\n   * @returns precomputed point tables flattened to a single array\n   */\n  private precomputeWindow(point: PC_P<PC>, W: number): PC_P<PC>[] {\n    const { windows, windowSize } = calcWOpts(W, this.bits);\n    const points: PC_P<PC>[] = [];\n    let p: PC_P<PC> = point;\n    let base = p;\n    for (let window = 0; window < windows; window++) {\n      base = p;\n      points.push(base);\n      // i=1, bc we skip 0\n      for (let i = 1; i < windowSize; i++) {\n        base = base.add(p);\n        points.push(base);\n      }\n      p = base.double();\n    }\n    return points;\n  }\n\n  /**\n   * Implements ec multiplication using precomputed tables and w-ary non-adjacent form.\n   * More compact implementation:\n   * https://github.com/paulmillr/noble-secp256k1/blob/47cb1669b6e506ad66b35fe7d76132ae97465da2/index.ts#L502-L541\n   * @returns real and fake (for const-time) points\n   */\n  private wNAF(W: number, precomputes: PC_P<PC>[], n: bigint): { p: PC_P<PC>; f: PC_P<PC> } {\n    // Scalar should be smaller than field order\n    if (!this.Fn.isValid(n)) throw new Error('invalid scalar');\n    // Accumulators\n    let p = this.ZERO;\n    let f = this.BASE;\n    // This code was first written with assumption that 'f' and 'p' will never be infinity point:\n    // since each addition is multiplied by 2 ** W, it cannot cancel each other. However,\n    // there is negate now: it is possible that negated element from low value\n    // would be the same as high element, which will create carry into next window.\n    // It's not obvious how this can fail, but still worth investigating later.\n    const wo = calcWOpts(W, this.bits);\n    for (let window = 0; window < wo.windows; window++) {\n      // (n === _0n) is handled and not early-exited. isEven and offsetF are used for noise\n      const { nextN, offset, isZero, isNeg, isNegF, offsetF } = calcOffsets(n, window, wo);\n      n = nextN;\n      if (isZero) {\n        // bits are 0: add garbage to fake point\n        // Important part for const-time getPublicKey: add random \"noise\" point to f.\n        f = f.add(negateCt(isNegF, precomputes[offsetF]));\n      } else {\n        // bits are 1: add to result point\n        p = p.add(negateCt(isNeg, precomputes[offset]));\n      }\n    }\n    assert0(n);\n    // Return both real and fake points: JIT won't eliminate f.\n    // At this point there is a way to F be infinity-point even if p is not,\n    // which makes it less const-time: around 1 bigint multiply.\n    return { p, f };\n  }\n\n  /**\n   * Implements ec unsafe (non const-time) multiplication using precomputed tables and w-ary non-adjacent form.\n   * @param acc accumulator point to add result of multiplication\n   * @returns point\n   */\n  private wNAFUnsafe(\n    W: number,\n    precomputes: PC_P<PC>[],\n    n: bigint,\n    acc: PC_P<PC> = this.ZERO\n  ): PC_P<PC> {\n    const wo = calcWOpts(W, this.bits);\n    for (let window = 0; window < wo.windows; window++) {\n      if (n === _0n) break; // Early-exit, skip 0 value\n      const { nextN, offset, isZero, isNeg } = calcOffsets(n, window, wo);\n      n = nextN;\n      if (isZero) {\n        // Window bits are 0: skip processing.\n        // Move to next window.\n        continue;\n      } else {\n        const item = precomputes[offset];\n        acc = acc.add(isNeg ? item.negate() : item); // Re-using acc allows to save adds in MSM\n      }\n    }\n    assert0(n);\n    return acc;\n  }\n\n  private getPrecomputes(W: number, point: PC_P<PC>, transform?: Mapper<PC_P<PC>>): PC_P<PC>[] {\n    // Calculate precomputes on a first run, reuse them after\n    let comp = pointPrecomputes.get(point);\n    if (!comp) {\n      comp = this.precomputeWindow(point, W) as PC_P<PC>[];\n      if (W !== 1) {\n        // Doing transform outside of if brings 15% perf hit\n        if (typeof transform === 'function') comp = transform(comp);\n        pointPrecomputes.set(point, comp);\n      }\n    }\n    return comp;\n  }\n\n  cached(\n    point: PC_P<PC>,\n    scalar: bigint,\n    transform?: Mapper<PC_P<PC>>\n  ): { p: PC_P<PC>; f: PC_P<PC> } {\n    const W = getW(point);\n    return this.wNAF(W, this.getPrecomputes(W, point, transform), scalar);\n  }\n\n  unsafe(point: PC_P<PC>, scalar: bigint, transform?: Mapper<PC_P<PC>>, prev?: PC_P<PC>): PC_P<PC> {\n    const W = getW(point);\n    if (W === 1) return this._unsafeLadder(point, scalar, prev); // For W=1 ladder is ~x2 faster\n    return this.wNAFUnsafe(W, this.getPrecomputes(W, point, transform), scalar, prev);\n  }\n\n  // We calculate precomputes for elliptic curve point multiplication\n  // using windowed method. This specifies window size and\n  // stores precomputed values. Usually only base point would be precomputed.\n  createCache(P: PC_P<PC>, W: number): void {\n    validateW(W, this.bits);\n    pointWindowSizes.set(P, W);\n    pointPrecomputes.delete(P);\n  }\n\n  hasCache(elm: PC_P<PC>): boolean {\n    return getW(elm) !== 1;\n  }\n}\n\n/**\n * Endomorphism-specific multiplication for Koblitz curves.\n * Cost: 128 dbl, 0-256 adds.\n */\nexport function mulEndoUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n  Point: PC,\n  point: P,\n  k1: bigint,\n  k2: bigint\n): { p1: P; p2: P } {\n  let acc = point;\n  let p1 = Point.ZERO;\n  let p2 = Point.ZERO;\n  while (k1 > _0n || k2 > _0n) {\n    if (k1 & _1n) p1 = p1.add(acc);\n    if (k2 & _1n) p2 = p2.add(acc);\n    acc = acc.double();\n    k1 >>= _1n;\n    k2 >>= _1n;\n  }\n  return { p1, p2 };\n}\n\n/**\n * Pippenger algorithm for multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * 30x faster vs naive addition on L=4096, 10x faster than precomputes.\n * For N=254bit, L=1, it does: 1024 ADD + 254 DBL. For L=5: 1536 ADD + 254 DBL.\n * Algorithmically constant-time (for same L), even when 1 point + scalar, or when scalar = 0.\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @param scalars array of L scalars (aka secret keys / bigints)\n */\nexport function pippenger<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n  c: PC,\n  fieldN: IField<bigint>,\n  points: P[],\n  scalars: bigint[]\n): P {\n  // If we split scalars by some window (let's say 8 bits), every chunk will only\n  // take 256 buckets even if there are 4096 scalars, also re-uses double.\n  // TODO:\n  // - https://eprint.iacr.org/2024/750.pdf\n  // - https://tches.iacr.org/index.php/TCHES/article/view/10287\n  // 0 is accepted in scalars\n  validateMSMPoints(points, c);\n  validateMSMScalars(scalars, fieldN);\n  const plength = points.length;\n  const slength = scalars.length;\n  if (plength !== slength) throw new Error('arrays of points and scalars must have equal length');\n  // if (plength === 0) throw new Error('array must be of length >= 2');\n  const zero = c.ZERO;\n  const wbits = bitLen(BigInt(plength));\n  let windowSize = 1; // bits\n  if (wbits > 12) windowSize = wbits - 3;\n  else if (wbits > 4) windowSize = wbits - 2;\n  else if (wbits > 0) windowSize = 2;\n  const MASK = bitMask(windowSize);\n  const buckets = new Array(Number(MASK) + 1).fill(zero); // +1 for zero array\n  const lastBits = Math.floor((fieldN.BITS - 1) / windowSize) * windowSize;\n  let sum = zero;\n  for (let i = lastBits; i >= 0; i -= windowSize) {\n    buckets.fill(zero);\n    for (let j = 0; j < slength; j++) {\n      const scalar = scalars[j];\n      const wbits = Number((scalar >> BigInt(i)) & MASK);\n      buckets[wbits] = buckets[wbits].add(points[j]);\n    }\n    let resI = zero; // not using this will do small speed-up, but will lose ct\n    // Skip first bucket, because it is zero\n    for (let j = buckets.length - 1, sumI = zero; j > 0; j--) {\n      sumI = sumI.add(buckets[j]);\n      resI = resI.add(sumI);\n    }\n    sum = sum.add(resI);\n    if (i !== 0) for (let j = 0; j < windowSize; j++) sum = sum.double();\n  }\n  return sum as P;\n}\n/**\n * Precomputed multi-scalar multiplication (MSM, Pa + Qb + Rc + ...).\n * @param c Curve Point constructor\n * @param fieldN field over CURVE.N - important that it's not over CURVE.P\n * @param points array of L curve points\n * @returns function which multiplies points with scaars\n */\nexport function precomputeMSMUnsafe<P extends CurvePoint<any, P>, PC extends CurvePointCons<P>>(\n  c: PC,\n  fieldN: IField<bigint>,\n  points: P[],\n  windowSize: number\n): (scalars: bigint[]) => P {\n  /**\n   * Performance Analysis of Window-based Precomputation\n   *\n   * Base Case (256-bit scalar, 8-bit window):\n   * - Standard precomputation requires:\n   *   - 31 additions per scalar × 256 scalars = 7,936 ops\n   *   - Plus 255 summary additions = 8,191 total ops\n   *   Note: Summary additions can be optimized via accumulator\n   *\n   * Chunked Precomputation Analysis:\n   * - Using 32 chunks requires:\n   *   - 255 additions per chunk\n   *   - 256 doublings\n   *   - Total: (255 × 32) + 256 = 8,416 ops\n   *\n   * Memory Usage Comparison:\n   * Window Size | Standard Points | Chunked Points\n   * ------------|-----------------|---------------\n   *     4-bit   |     520         |      15\n   *     8-bit   |    4,224        |     255\n   *    10-bit   |   13,824        |   1,023\n   *    16-bit   |  557,056        |  65,535\n   *\n   * Key Advantages:\n   * 1. Enables larger window sizes due to reduced memory overhead\n   * 2. More efficient for smaller scalar counts:\n   *    - 16 chunks: (16 × 255) + 256 = 4,336 ops\n   *    - ~2x faster than standard 8,191 ops\n   *\n   * Limitations:\n   * - Not suitable for plain precomputes (requires 256 constant doublings)\n   * - Performance degrades with larger scalar counts:\n   *   - Optimal for ~256 scalars\n   *   - Less efficient for 4096+ scalars (Pippenger preferred)\n   */\n  validateW(windowSize, fieldN.BITS);\n  validateMSMPoints(points, c);\n  const zero = c.ZERO;\n  const tableSize = 2 ** windowSize - 1; // table size (without zero)\n  const chunks = Math.ceil(fieldN.BITS / windowSize); // chunks of item\n  const MASK = bitMask(windowSize);\n  const tables = points.map((p: P) => {\n    const res = [];\n    for (let i = 0, acc = p; i < tableSize; i++) {\n      res.push(acc);\n      acc = acc.add(p);\n    }\n    return res;\n  });\n  return (scalars: bigint[]): P => {\n    validateMSMScalars(scalars, fieldN);\n    if (scalars.length > points.length)\n      throw new Error('array of scalars must be smaller than array of points');\n    let res = zero;\n    for (let i = 0; i < chunks; i++) {\n      // No need to double if accumulator is still zero.\n      if (res !== zero) for (let j = 0; j < windowSize; j++) res = res.double();\n      const shiftBy = BigInt(chunks * windowSize - (i + 1) * windowSize);\n      for (let j = 0; j < scalars.length; j++) {\n        const n = scalars[j];\n        const curr = Number((n >> shiftBy) & MASK);\n        if (!curr) continue; // skip zero scalars chunks\n        res = res.add(tables[j][curr - 1]);\n      }\n    }\n    return res;\n  };\n}\n\n// TODO: remove\n/**\n * Generic BasicCurve interface: works even for polynomial fields (BLS): P, n, h would be ok.\n * Though generator can be different (Fp2 / Fp6 for BLS).\n */\nexport type BasicCurve<T> = {\n  Fp: IField<T>; // Field over which we'll do calculations (Fp)\n  n: bigint; // Curve order, total count of valid points in the field\n  nBitLength?: number; // bit length of curve order\n  nByteLength?: number; // byte length of curve order\n  h: bigint; // cofactor. we can assign default=1, but users will just ignore it w/o validation\n  hEff?: bigint; // Number to multiply to clear cofactor\n  Gx: T; // base point X coordinate\n  Gy: T; // base point Y coordinate\n  allowInfinityPoint?: boolean; // bls12-381 requires it. ZERO point is valid, but invalid pubkey\n};\n\n// TODO: remove\n/** @deprecated */\nexport function validateBasic<FP, T>(\n  curve: BasicCurve<FP> & T\n): Readonly<\n  {\n    readonly nBitLength: number;\n    readonly nByteLength: number;\n  } & BasicCurve<FP> &\n    T & {\n      p: bigint;\n    }\n> {\n  validateField(curve.Fp);\n  validateObject(\n    curve,\n    {\n      n: 'bigint',\n      h: 'bigint',\n      Gx: 'field',\n      Gy: 'field',\n    },\n    {\n      nBitLength: 'isSafeInteger',\n      nByteLength: 'isSafeInteger',\n    }\n  );\n  // Set defaults\n  return Object.freeze({\n    ...nLength(curve.n, curve.nBitLength),\n    ...curve,\n    ...{ p: curve.Fp.ORDER },\n  } as const);\n}\n\nexport type ValidCurveParams<T> = {\n  p: bigint;\n  n: bigint;\n  h: bigint;\n  a: T;\n  b?: T;\n  d?: T;\n  Gx: T;\n  Gy: T;\n};\n\nfunction createField<T>(order: bigint, field?: IField<T>, isLE?: boolean): IField<T> {\n  if (field) {\n    if (field.ORDER !== order) throw new Error('Field.ORDER must match order: Fp == p, Fn == n');\n    validateField(field);\n    return field;\n  } else {\n    return Field(order, { isLE }) as unknown as IField<T>;\n  }\n}\nexport type FpFn<T> = { Fp: IField<T>; Fn: IField<bigint> };\n\n/** Validates CURVE opts and creates fields */\nexport function _createCurveFields<T>(\n  type: 'weierstrass' | 'edwards',\n  CURVE: ValidCurveParams<T>,\n  curveOpts: Partial<FpFn<T>> = {},\n  FpFnLE?: boolean\n): FpFn<T> & { CURVE: ValidCurveParams<T> } {\n  if (FpFnLE === undefined) FpFnLE = type === 'edwards';\n  if (!CURVE || typeof CURVE !== 'object') throw new Error(`expected valid ${type} CURVE object`);\n  for (const p of ['p', 'n', 'h'] as const) {\n    const val = CURVE[p];\n    if (!(typeof val === 'bigint' && val > _0n))\n      throw new Error(`CURVE.${p} must be positive bigint`);\n  }\n  const Fp = createField(CURVE.p, curveOpts.Fp, FpFnLE);\n  const Fn = createField(CURVE.n, curveOpts.Fn, FpFnLE);\n  const _b: 'b' | 'd' = type === 'weierstrass' ? 'b' : 'd';\n  const params = ['Gx', 'Gy', 'a', _b] as const;\n  for (const p of params) {\n    // @ts-ignore\n    if (!Fp.isValid(CURVE[p]))\n      throw new Error(`CURVE.${p} must be valid field element of CURVE.Fp`);\n  }\n  CURVE = Object.freeze(Object.assign({}, CURVE));\n  return { CURVE, Fp, Fn };\n}\n","/**\n * Short Weierstrass curve methods. The formula is: y² = x³ + ax + b.\n *\n * ### Design rationale for types\n *\n * * Interaction between classes from different curves should fail:\n *   `k256.Point.BASE.add(p256.Point.BASE)`\n * * For this purpose we want to use `instanceof` operator, which is fast and works during runtime\n * * Different calls of `curve()` would return different classes -\n *   `curve(params) !== curve(params)`: if somebody decided to monkey-patch their curve,\n *   it won't affect others\n *\n * TypeScript can't infer types for classes created inside a function. Classes is one instance\n * of nominative types in TypeScript and interfaces only check for shape, so it's hard to create\n * unique type for every function call.\n *\n * We can use generic types via some param, like curve opts, but that would:\n *     1. Enable interaction between `curve(params)` and `curve(params)` (curves of same params)\n *     which is hard to debug.\n *     2. Params can be generic and we can't enforce them to be constant value:\n *     if somebody creates curve from non-constant params,\n *     it would be allowed to interact with other curves with non-constant params\n *\n * @todo https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#unique-symbol\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { hmac as nobleHmac } from '@noble/hashes/hmac.js';\nimport { ahash } from '@noble/hashes/utils';\nimport {\n  _validateObject,\n  _abool2 as abool,\n  _abytes2 as abytes,\n  aInRange,\n  bitLen,\n  bitMask,\n  bytesToHex,\n  bytesToNumberBE,\n  concatBytes,\n  createHmacDrbg,\n  ensureBytes,\n  hexToBytes,\n  inRange,\n  isBytes,\n  memoized,\n  numberToHexUnpadded,\n  randomBytes as randomBytesWeb,\n  type CHash,\n  type Hex,\n  type PrivKey,\n} from '../utils.ts';\nimport {\n  _createCurveFields,\n  mulEndoUnsafe,\n  negateCt,\n  normalizeZ,\n  pippenger,\n  wNAF,\n  type AffinePoint,\n  type BasicCurve,\n  type CurveLengths,\n  type CurvePoint,\n  type CurvePointCons,\n} from './curve.ts';\nimport {\n  Field,\n  FpInvertBatch,\n  getMinHashLength,\n  mapHashToField,\n  nLength,\n  validateField,\n  type IField,\n  type NLength,\n} from './modular.ts';\n\nexport type { AffinePoint };\nexport type HmacFnSync = (key: Uint8Array, ...messages: Uint8Array[]) => Uint8Array;\n\ntype EndoBasis = [[bigint, bigint], [bigint, bigint]];\n/**\n * When Weierstrass curve has `a=0`, it becomes Koblitz curve.\n * Koblitz curves allow using **efficiently-computable GLV endomorphism ψ**.\n * Endomorphism uses 2x less RAM, speeds up precomputation by 2x and ECDH / key recovery by 20%.\n * For precomputed wNAF it trades off 1/2 init time & 1/3 ram for 20% perf hit.\n *\n * Endomorphism consists of beta, lambda and splitScalar:\n *\n * 1. GLV endomorphism ψ transforms a point: `P = (x, y) ↦ ψ(P) = (β·x mod p, y)`\n * 2. GLV scalar decomposition transforms a scalar: `k ≡ k₁ + k₂·λ (mod n)`\n * 3. Then these are combined: `k·P = k₁·P + k₂·ψ(P)`\n * 4. Two 128-bit point-by-scalar multiplications + one point addition is faster than\n *    one 256-bit multiplication.\n *\n * where\n * * beta: β ∈ Fₚ with β³ = 1, β ≠ 1\n * * lambda: λ ∈ Fₙ with λ³ = 1, λ ≠ 1\n * * splitScalar decomposes k ↦ k₁, k₂, by using reduced basis vectors.\n *   Gauss lattice reduction calculates them from initial basis vectors `(n, 0), (-λ, 0)`\n *\n * Check out `test/misc/endomorphism.js` and\n * [gist](https://gist.github.com/paulmillr/eb670806793e84df628a7c434a873066).\n */\nexport type EndomorphismOpts = {\n  beta: bigint;\n  basises?: EndoBasis;\n  splitScalar?: (k: bigint) => { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n};\n\n// We construct basis in such way that den is always positive and equals n, but num sign depends on basis (not on secret value)\nconst divNearest = (num: bigint, den: bigint) => (num + (num >= 0 ? den : -den) / _2n) / den;\n\nexport type ScalarEndoParts = { k1neg: boolean; k1: bigint; k2neg: boolean; k2: bigint };\n\n/**\n * Splits scalar for GLV endomorphism.\n */\nexport function _splitEndoScalar(k: bigint, basis: EndoBasis, n: bigint): ScalarEndoParts {\n  // Split scalar into two such that part is ~half bits: `abs(part) < sqrt(N)`\n  // Since part can be negative, we need to do this on point.\n  // TODO: verifyScalar function which consumes lambda\n  const [[a1, b1], [a2, b2]] = basis;\n  const c1 = divNearest(b2 * k, n);\n  const c2 = divNearest(-b1 * k, n);\n  // |k1|/|k2| is < sqrt(N), but can be negative.\n  // If we do `k1 mod N`, we'll get big scalar (`> sqrt(N)`): so, we do cheaper negation instead.\n  let k1 = k - c1 * a1 - c2 * a2;\n  let k2 = -c1 * b1 - c2 * b2;\n  const k1neg = k1 < _0n;\n  const k2neg = k2 < _0n;\n  if (k1neg) k1 = -k1;\n  if (k2neg) k2 = -k2;\n  // Double check that resulting scalar less than half bits of N: otherwise wNAF will fail.\n  // This should only happen on wrong basises. Also, math inside is too complex and I don't trust it.\n  const MAX_NUM = bitMask(Math.ceil(bitLen(n) / 2)) + _1n; // Half bits of N\n  if (k1 < _0n || k1 >= MAX_NUM || k2 < _0n || k2 >= MAX_NUM) {\n    throw new Error('splitScalar (endomorphism): failed, k=' + k);\n  }\n  return { k1neg, k1, k2neg, k2 };\n}\n\nexport type ECDSASigFormat = 'compact' | 'recovered' | 'der';\nexport type ECDSARecoverOpts = {\n  prehash?: boolean;\n};\nexport type ECDSAVerifyOpts = {\n  prehash?: boolean;\n  lowS?: boolean;\n  format?: ECDSASigFormat;\n};\nexport type ECDSASignOpts = {\n  prehash?: boolean;\n  lowS?: boolean;\n  format?: ECDSASigFormat;\n  extraEntropy?: Uint8Array | boolean;\n};\n\nfunction validateSigFormat(format: string): ECDSASigFormat {\n  if (!['compact', 'recovered', 'der'].includes(format))\n    throw new Error('Signature format must be \"compact\", \"recovered\", or \"der\"');\n  return format as ECDSASigFormat;\n}\n\nfunction validateSigOpts<T extends ECDSASignOpts, D extends Required<ECDSASignOpts>>(\n  opts: T,\n  def: D\n): Required<ECDSASignOpts> {\n  const optsn: ECDSASignOpts = {};\n  for (let optName of Object.keys(def)) {\n    // @ts-ignore\n    optsn[optName] = opts[optName] === undefined ? def[optName] : opts[optName];\n  }\n  abool(optsn.lowS!, 'lowS');\n  abool(optsn.prehash!, 'prehash');\n  if (optsn.format !== undefined) validateSigFormat(optsn.format);\n  return optsn as Required<ECDSASignOpts>;\n}\n\n/** Instance methods for 3D XYZ projective points. */\nexport interface WeierstrassPoint<T> extends CurvePoint<T, WeierstrassPoint<T>> {\n  /** projective X coordinate. Different from affine x. */\n  readonly X: T;\n  /** projective Y coordinate. Different from affine y. */\n  readonly Y: T;\n  /** projective z coordinate */\n  readonly Z: T;\n  /** affine x coordinate. Different from projective X. */\n  get x(): T;\n  /** affine y coordinate. Different from projective Y. */\n  get y(): T;\n  /** Encodes point using IEEE P1363 (DER) encoding. First byte is 2/3/4. Default = isCompressed. */\n  toBytes(isCompressed?: boolean): Uint8Array;\n  toHex(isCompressed?: boolean): string;\n\n  /** @deprecated use `.X` */\n  readonly px: T;\n  /** @deprecated use `.Y` */\n  readonly py: T;\n  /** @deprecated use `.Z` */\n  readonly pz: T;\n  /** @deprecated use `toBytes` */\n  toRawBytes(isCompressed?: boolean): Uint8Array;\n  /** @deprecated use `multiplyUnsafe` */\n  multiplyAndAddUnsafe(\n    Q: WeierstrassPoint<T>,\n    a: bigint,\n    b: bigint\n  ): WeierstrassPoint<T> | undefined;\n  /** @deprecated use `p.y % 2n === 0n` */\n  hasEvenY(): boolean;\n  /** @deprecated use `p.precompute(windowSize)` */\n  _setWindowSize(windowSize: number): void;\n}\n\n/** Static methods for 3D XYZ projective points. */\nexport interface WeierstrassPointCons<T> extends CurvePointCons<WeierstrassPoint<T>> {\n  /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n  new (X: T, Y: T, Z: T): WeierstrassPoint<T>;\n  CURVE(): WeierstrassOpts<T>;\n  /** @deprecated use `Point.BASE.multiply(Point.Fn.fromBytes(privateKey))` */\n  fromPrivateKey(privateKey: PrivKey): WeierstrassPoint<T>;\n  /** @deprecated use `import { normalizeZ } from '@noble/curves/abstract/curve.js';` */\n  normalizeZ(points: WeierstrassPoint<T>[]): WeierstrassPoint<T>[];\n  /** @deprecated use `import { pippenger } from '@noble/curves/abstract/curve.js';` */\n  msm(points: WeierstrassPoint<T>[], scalars: bigint[]): WeierstrassPoint<T>;\n}\n\n/**\n * Weierstrass curve options.\n *\n * * p: prime characteristic (order) of finite field, in which arithmetics is done\n * * n: order of prime subgroup a.k.a total amount of valid curve points\n * * h: cofactor, usually 1. h*n is group order; n is subgroup order\n * * a: formula param, must be in field of p\n * * b: formula param, must be in field of p\n * * Gx: x coordinate of generator point a.k.a. base point\n * * Gy: y coordinate of generator point\n */\nexport type WeierstrassOpts<T> = Readonly<{\n  p: bigint;\n  n: bigint;\n  h: bigint;\n  a: T;\n  b: T;\n  Gx: T;\n  Gy: T;\n}>;\n\n// When a cofactor != 1, there can be an effective methods to:\n// 1. Determine whether a point is torsion-free\n// 2. Clear torsion component\n// wrapPrivateKey: bls12-381 requires mod(n) instead of rejecting keys >= n\nexport type WeierstrassExtraOpts<T> = Partial<{\n  Fp: IField<T>;\n  Fn: IField<bigint>;\n  allowInfinityPoint: boolean;\n  endo: EndomorphismOpts;\n  isTorsionFree: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => boolean;\n  clearCofactor: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => WeierstrassPoint<T>;\n  fromBytes: (bytes: Uint8Array) => AffinePoint<T>;\n  toBytes: (\n    c: WeierstrassPointCons<T>,\n    point: WeierstrassPoint<T>,\n    isCompressed: boolean\n  ) => Uint8Array;\n}>;\n\n/**\n * Options for ECDSA signatures over a Weierstrass curve.\n *\n * * lowS: (default: true) whether produced / verified signatures occupy low half of ecdsaOpts.p. Prevents malleability.\n * * hmac: (default: noble-hashes hmac) function, would be used to init hmac-drbg for k generation.\n * * randomBytes: (default: webcrypto os-level CSPRNG) custom method for fetching secure randomness.\n * * bits2int, bits2int_modN: used in sigs, sometimes overridden by curves\n */\nexport type ECDSAOpts = Partial<{\n  lowS: boolean;\n  hmac: HmacFnSync;\n  randomBytes: (bytesLength?: number) => Uint8Array;\n  bits2int: (bytes: Uint8Array) => bigint;\n  bits2int_modN: (bytes: Uint8Array) => bigint;\n}>;\n\n/**\n * Elliptic Curve Diffie-Hellman interface.\n * Provides keygen, secret-to-public conversion, calculating shared secrets.\n */\nexport interface ECDH {\n  keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n  getPublicKey: (secretKey: PrivKey, isCompressed?: boolean) => Uint8Array;\n  getSharedSecret: (secretKeyA: PrivKey, publicKeyB: Hex, isCompressed?: boolean) => Uint8Array;\n  Point: WeierstrassPointCons<bigint>;\n  utils: {\n    isValidSecretKey: (secretKey: PrivKey) => boolean;\n    isValidPublicKey: (publicKey: Uint8Array, isCompressed?: boolean) => boolean;\n    randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n    /** @deprecated use `randomSecretKey` */\n    randomPrivateKey: (seed?: Uint8Array) => Uint8Array;\n    /** @deprecated use `isValidSecretKey` */\n    isValidPrivateKey: (secretKey: PrivKey) => boolean;\n    /** @deprecated use `Point.Fn.fromBytes()` */\n    normPrivateKeyToScalar: (key: PrivKey) => bigint;\n    /** @deprecated use `point.precompute()` */\n    precompute: (windowSize?: number, point?: WeierstrassPoint<bigint>) => WeierstrassPoint<bigint>;\n  };\n  lengths: CurveLengths;\n}\n\n/**\n * ECDSA interface.\n * Only supported for prime fields, not Fp2 (extension fields).\n */\nexport interface ECDSA extends ECDH {\n  sign: (message: Hex, secretKey: PrivKey, opts?: ECDSASignOpts) => ECDSASigRecovered;\n  verify: (\n    signature: Uint8Array,\n    message: Uint8Array,\n    publicKey: Uint8Array,\n    opts?: ECDSAVerifyOpts\n  ) => boolean;\n  recoverPublicKey(signature: Uint8Array, message: Uint8Array, opts?: ECDSARecoverOpts): Uint8Array;\n  Signature: ECDSASignatureCons;\n}\nexport class DERErr extends Error {\n  constructor(m = '') {\n    super(m);\n  }\n}\nexport type IDER = {\n  // asn.1 DER encoding utils\n  Err: typeof DERErr;\n  // Basic building block is TLV (Tag-Length-Value)\n  _tlv: {\n    encode: (tag: number, data: string) => string;\n    // v - value, l - left bytes (unparsed)\n    decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array };\n  };\n  // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n  // since we always use positive integers here. It must always be empty:\n  // - add zero byte if exists\n  // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n  _int: {\n    encode(num: bigint): string;\n    decode(data: Uint8Array): bigint;\n  };\n  toSig(hex: string | Uint8Array): { r: bigint; s: bigint };\n  hexFromSig(sig: { r: bigint; s: bigint }): string;\n};\n/**\n * ASN.1 DER encoding utilities. ASN is very complex & fragile. Format:\n *\n *     [0x30 (SEQUENCE), bytelength, 0x02 (INTEGER), intLength, R, 0x02 (INTEGER), intLength, S]\n *\n * Docs: https://letsencrypt.org/docs/a-warm-welcome-to-asn1-and-der/, https://luca.ntop.org/Teaching/Appunti/asn1.html\n */\nexport const DER: IDER = {\n  // asn.1 DER encoding utils\n  Err: DERErr,\n  // Basic building block is TLV (Tag-Length-Value)\n  _tlv: {\n    encode: (tag: number, data: string): string => {\n      const { Err: E } = DER;\n      if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n      if (data.length & 1) throw new E('tlv.encode: unpadded data');\n      const dataLen = data.length / 2;\n      const len = numberToHexUnpadded(dataLen);\n      if ((len.length / 2) & 0b1000_0000) throw new E('tlv.encode: long form length too big');\n      // length of length with long form flag\n      const lenLen = dataLen > 127 ? numberToHexUnpadded((len.length / 2) | 0b1000_0000) : '';\n      const t = numberToHexUnpadded(tag);\n      return t + lenLen + len + data;\n    },\n    // v - value, l - left bytes (unparsed)\n    decode(tag: number, data: Uint8Array): { v: Uint8Array; l: Uint8Array } {\n      const { Err: E } = DER;\n      let pos = 0;\n      if (tag < 0 || tag > 256) throw new E('tlv.encode: wrong tag');\n      if (data.length < 2 || data[pos++] !== tag) throw new E('tlv.decode: wrong tlv');\n      const first = data[pos++];\n      const isLong = !!(first & 0b1000_0000); // First bit of first length byte is flag for short/long form\n      let length = 0;\n      if (!isLong) length = first;\n      else {\n        // Long form: [longFlag(1bit), lengthLength(7bit), length (BE)]\n        const lenLen = first & 0b0111_1111;\n        if (!lenLen) throw new E('tlv.decode(long): indefinite length not supported');\n        if (lenLen > 4) throw new E('tlv.decode(long): byte length is too big'); // this will overflow u32 in js\n        const lengthBytes = data.subarray(pos, pos + lenLen);\n        if (lengthBytes.length !== lenLen) throw new E('tlv.decode: length bytes not complete');\n        if (lengthBytes[0] === 0) throw new E('tlv.decode(long): zero leftmost byte');\n        for (const b of lengthBytes) length = (length << 8) | b;\n        pos += lenLen;\n        if (length < 128) throw new E('tlv.decode(long): not minimal encoding');\n      }\n      const v = data.subarray(pos, pos + length);\n      if (v.length !== length) throw new E('tlv.decode: wrong value length');\n      return { v, l: data.subarray(pos + length) };\n    },\n  },\n  // https://crypto.stackexchange.com/a/57734 Leftmost bit of first byte is 'negative' flag,\n  // since we always use positive integers here. It must always be empty:\n  // - add zero byte if exists\n  // - if next byte doesn't have a flag, leading zero is not allowed (minimal encoding)\n  _int: {\n    encode(num: bigint): string {\n      const { Err: E } = DER;\n      if (num < _0n) throw new E('integer: negative integers are not allowed');\n      let hex = numberToHexUnpadded(num);\n      // Pad with zero byte if negative flag is present\n      if (Number.parseInt(hex[0], 16) & 0b1000) hex = '00' + hex;\n      if (hex.length & 1) throw new E('unexpected DER parsing assertion: unpadded hex');\n      return hex;\n    },\n    decode(data: Uint8Array): bigint {\n      const { Err: E } = DER;\n      if (data[0] & 0b1000_0000) throw new E('invalid signature integer: negative');\n      if (data[0] === 0x00 && !(data[1] & 0b1000_0000))\n        throw new E('invalid signature integer: unnecessary leading zero');\n      return bytesToNumberBE(data);\n    },\n  },\n  toSig(hex: string | Uint8Array): { r: bigint; s: bigint } {\n    // parse DER signature\n    const { Err: E, _int: int, _tlv: tlv } = DER;\n    const data = ensureBytes('signature', hex);\n    const { v: seqBytes, l: seqLeftBytes } = tlv.decode(0x30, data);\n    if (seqLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n    const { v: rBytes, l: rLeftBytes } = tlv.decode(0x02, seqBytes);\n    const { v: sBytes, l: sLeftBytes } = tlv.decode(0x02, rLeftBytes);\n    if (sLeftBytes.length) throw new E('invalid signature: left bytes after parsing');\n    return { r: int.decode(rBytes), s: int.decode(sBytes) };\n  },\n  hexFromSig(sig: { r: bigint; s: bigint }): string {\n    const { _tlv: tlv, _int: int } = DER;\n    const rs = tlv.encode(0x02, int.encode(sig.r));\n    const ss = tlv.encode(0x02, int.encode(sig.s));\n    const seq = rs + ss;\n    return tlv.encode(0x30, seq);\n  },\n};\n\n// Be friendly to bad ECMAScript parsers by not using bigint literals\n// prettier-ignore\nconst _0n = BigInt(0), _1n = BigInt(1), _2n = BigInt(2), _3n = BigInt(3), _4n = BigInt(4);\n\nexport function _normFnElement(Fn: IField<bigint>, key: PrivKey): bigint {\n  const { BYTES: expected } = Fn;\n  let num: bigint;\n  if (typeof key === 'bigint') {\n    num = key;\n  } else {\n    let bytes = ensureBytes('private key', key);\n    try {\n      num = Fn.fromBytes(bytes);\n    } catch (error) {\n      throw new Error(`invalid private key: expected ui8a of size ${expected}, got ${typeof key}`);\n    }\n  }\n  if (!Fn.isValidNot0(num)) throw new Error('invalid private key: out of range [1..N-1]');\n  return num;\n}\n\n/**\n * Creates weierstrass Point constructor, based on specified curve options.\n *\n * @example\n```js\nconst opts = {\n  p: BigInt('0xffffffff00000001000000000000000000000000ffffffffffffffffffffffff'),\n  n: BigInt('0xffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551'),\n  h: BigInt(1),\n  a: BigInt('0xffffffff00000001000000000000000000000000fffffffffffffffffffffffc'),\n  b: BigInt('0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b'),\n  Gx: BigInt('0x6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296'),\n  Gy: BigInt('0x4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5'),\n};\nconst p256_Point = weierstrass(opts);\n```\n */\nexport function weierstrassN<T>(\n  params: WeierstrassOpts<T>,\n  extraOpts: WeierstrassExtraOpts<T> = {}\n): WeierstrassPointCons<T> {\n  const validated = _createCurveFields('weierstrass', params, extraOpts);\n  const { Fp, Fn } = validated;\n  let CURVE = validated.CURVE as WeierstrassOpts<T>;\n  const { h: cofactor, n: CURVE_ORDER } = CURVE;\n  _validateObject(\n    extraOpts,\n    {},\n    {\n      allowInfinityPoint: 'boolean',\n      clearCofactor: 'function',\n      isTorsionFree: 'function',\n      fromBytes: 'function',\n      toBytes: 'function',\n      endo: 'object',\n      wrapPrivateKey: 'boolean',\n    }\n  );\n\n  const { endo } = extraOpts;\n  if (endo) {\n    // validateObject(endo, { beta: 'bigint', splitScalar: 'function' });\n    if (!Fp.is0(CURVE.a) || typeof endo.beta !== 'bigint' || !Array.isArray(endo.basises)) {\n      throw new Error('invalid endo: expected \"beta\": bigint and \"basises\": array');\n    }\n  }\n\n  const lengths = getWLengths(Fp, Fn);\n\n  function assertCompressionIsSupported() {\n    if (!Fp.isOdd) throw new Error('compression is not supported: Field does not have .isOdd()');\n  }\n\n  // Implements IEEE P1363 point encoding\n  function pointToBytes(\n    _c: WeierstrassPointCons<T>,\n    point: WeierstrassPoint<T>,\n    isCompressed: boolean\n  ): Uint8Array {\n    const { x, y } = point.toAffine();\n    const bx = Fp.toBytes(x);\n    abool(isCompressed, 'isCompressed');\n    if (isCompressed) {\n      assertCompressionIsSupported();\n      const hasEvenY = !Fp.isOdd!(y);\n      return concatBytes(pprefix(hasEvenY), bx);\n    } else {\n      return concatBytes(Uint8Array.of(0x04), bx, Fp.toBytes(y));\n    }\n  }\n  function pointFromBytes(bytes: Uint8Array) {\n    abytes(bytes, undefined, 'Point');\n    const { publicKey: comp, publicKeyUncompressed: uncomp } = lengths; // e.g. for 32-byte: 33, 65\n    const length = bytes.length;\n    const head = bytes[0];\n    const tail = bytes.subarray(1);\n    // No actual validation is done here: use .assertValidity()\n    if (length === comp && (head === 0x02 || head === 0x03)) {\n      const x = Fp.fromBytes(tail);\n      if (!Fp.isValid(x)) throw new Error('bad point: is not on curve, wrong x');\n      const y2 = weierstrassEquation(x); // y² = x³ + ax + b\n      let y: T;\n      try {\n        y = Fp.sqrt(y2); // y = y² ^ (p+1)/4\n      } catch (sqrtError) {\n        const err = sqrtError instanceof Error ? ': ' + sqrtError.message : '';\n        throw new Error('bad point: is not on curve, sqrt error' + err);\n      }\n      assertCompressionIsSupported();\n      const isYOdd = Fp.isOdd!(y); // (y & _1n) === _1n;\n      const isHeadOdd = (head & 1) === 1; // ECDSA-specific\n      if (isHeadOdd !== isYOdd) y = Fp.neg(y);\n      return { x, y };\n    } else if (length === uncomp && head === 0x04) {\n      // TODO: more checks\n      const L = Fp.BYTES;\n      const x = Fp.fromBytes(tail.subarray(0, L));\n      const y = Fp.fromBytes(tail.subarray(L, L * 2));\n      if (!isValidXY(x, y)) throw new Error('bad point: is not on curve');\n      return { x, y };\n    } else {\n      throw new Error(\n        `bad point: got length ${length}, expected compressed=${comp} or uncompressed=${uncomp}`\n      );\n    }\n  }\n\n  const encodePoint = extraOpts.toBytes || pointToBytes;\n  const decodePoint = extraOpts.fromBytes || pointFromBytes;\n  function weierstrassEquation(x: T): T {\n    const x2 = Fp.sqr(x); // x * x\n    const x3 = Fp.mul(x2, x); // x² * x\n    return Fp.add(Fp.add(x3, Fp.mul(x, CURVE.a)), CURVE.b); // x³ + a * x + b\n  }\n\n  // TODO: move top-level\n  /** Checks whether equation holds for given x, y: y² == x³ + ax + b */\n  function isValidXY(x: T, y: T): boolean {\n    const left = Fp.sqr(y); // y²\n    const right = weierstrassEquation(x); // x³ + ax + b\n    return Fp.eql(left, right);\n  }\n\n  // Validate whether the passed curve params are valid.\n  // Test 1: equation y² = x³ + ax + b should work for generator point.\n  if (!isValidXY(CURVE.Gx, CURVE.Gy)) throw new Error('bad curve params: generator point');\n\n  // Test 2: discriminant Δ part should be non-zero: 4a³ + 27b² != 0.\n  // Guarantees curve is genus-1, smooth (non-singular).\n  const _4a3 = Fp.mul(Fp.pow(CURVE.a, _3n), _4n);\n  const _27b2 = Fp.mul(Fp.sqr(CURVE.b), BigInt(27));\n  if (Fp.is0(Fp.add(_4a3, _27b2))) throw new Error('bad curve params: a or b');\n\n  /** Asserts coordinate is valid: 0 <= n < Fp.ORDER. */\n  function acoord(title: string, n: T, banZero = false) {\n    if (!Fp.isValid(n) || (banZero && Fp.is0(n))) throw new Error(`bad point coordinate ${title}`);\n    return n;\n  }\n\n  function aprjpoint(other: unknown) {\n    if (!(other instanceof Point)) throw new Error('ProjectivePoint expected');\n  }\n\n  function splitEndoScalarN(k: bigint) {\n    if (!endo || !endo.basises) throw new Error('no endo');\n    return _splitEndoScalar(k, endo.basises, Fn.ORDER);\n  }\n\n  // Memoized toAffine / validity check. They are heavy. Points are immutable.\n\n  // Converts Projective point to affine (x, y) coordinates.\n  // Can accept precomputed Z^-1 - for example, from invertBatch.\n  // (X, Y, Z) ∋ (x=X/Z, y=Y/Z)\n  const toAffineMemo = memoized((p: Point, iz?: T): AffinePoint<T> => {\n    const { X, Y, Z } = p;\n    // Fast-path for normalized points\n    if (Fp.eql(Z, Fp.ONE)) return { x: X, y: Y };\n    const is0 = p.is0();\n    // If invZ was 0, we return zero point. However we still want to execute\n    // all operations, so we replace invZ with a random number, 1.\n    if (iz == null) iz = is0 ? Fp.ONE : Fp.inv(Z);\n    const x = Fp.mul(X, iz);\n    const y = Fp.mul(Y, iz);\n    const zz = Fp.mul(Z, iz);\n    if (is0) return { x: Fp.ZERO, y: Fp.ZERO };\n    if (!Fp.eql(zz, Fp.ONE)) throw new Error('invZ was invalid');\n    return { x, y };\n  });\n  // NOTE: on exception this will crash 'cached' and no value will be set.\n  // Otherwise true will be return\n  const assertValidMemo = memoized((p: Point) => {\n    if (p.is0()) {\n      // (0, 1, 0) aka ZERO is invalid in most contexts.\n      // In BLS, ZERO can be serialized, so we allow it.\n      // (0, 0, 0) is invalid representation of ZERO.\n      if (extraOpts.allowInfinityPoint && !Fp.is0(p.Y)) return;\n      throw new Error('bad point: ZERO');\n    }\n    // Some 3rd-party test vectors require different wording between here & `fromCompressedHex`\n    const { x, y } = p.toAffine();\n    if (!Fp.isValid(x) || !Fp.isValid(y)) throw new Error('bad point: x or y not field elements');\n    if (!isValidXY(x, y)) throw new Error('bad point: equation left != right');\n    if (!p.isTorsionFree()) throw new Error('bad point: not in prime-order subgroup');\n    return true;\n  });\n\n  function finishEndo(\n    endoBeta: EndomorphismOpts['beta'],\n    k1p: Point,\n    k2p: Point,\n    k1neg: boolean,\n    k2neg: boolean\n  ) {\n    k2p = new Point(Fp.mul(k2p.X, endoBeta), k2p.Y, k2p.Z);\n    k1p = negateCt(k1neg, k1p);\n    k2p = negateCt(k2neg, k2p);\n    return k1p.add(k2p);\n  }\n\n  /**\n   * Projective Point works in 3d / projective (homogeneous) coordinates:(X, Y, Z) ∋ (x=X/Z, y=Y/Z).\n   * Default Point works in 2d / affine coordinates: (x, y).\n   * We're doing calculations in projective, because its operations don't require costly inversion.\n   */\n  class Point implements WeierstrassPoint<T> {\n    // base / generator point\n    static readonly BASE = new Point(CURVE.Gx, CURVE.Gy, Fp.ONE);\n    // zero / infinity / identity point\n    static readonly ZERO = new Point(Fp.ZERO, Fp.ONE, Fp.ZERO); // 0, 1, 0\n    // math field\n    static readonly Fp = Fp;\n    // scalar field\n    static readonly Fn = Fn;\n\n    readonly X: T;\n    readonly Y: T;\n    readonly Z: T;\n\n    /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n    constructor(X: T, Y: T, Z: T) {\n      this.X = acoord('x', X);\n      this.Y = acoord('y', Y, true);\n      this.Z = acoord('z', Z);\n      Object.freeze(this);\n    }\n\n    static CURVE(): WeierstrassOpts<T> {\n      return CURVE;\n    }\n\n    /** Does NOT validate if the point is valid. Use `.assertValidity()`. */\n    static fromAffine(p: AffinePoint<T>): Point {\n      const { x, y } = p || {};\n      if (!p || !Fp.isValid(x) || !Fp.isValid(y)) throw new Error('invalid affine point');\n      if (p instanceof Point) throw new Error('projective point not allowed');\n      // (0, 0) would've produced (0, 0, 1) - instead, we need (0, 1, 0)\n      if (Fp.is0(x) && Fp.is0(y)) return Point.ZERO;\n      return new Point(x, y, Fp.ONE);\n    }\n\n    static fromBytes(bytes: Uint8Array): Point {\n      const P = Point.fromAffine(decodePoint(abytes(bytes, undefined, 'point')));\n      P.assertValidity();\n      return P;\n    }\n    static fromHex(hex: Hex): Point {\n      return Point.fromBytes(ensureBytes('pointHex', hex));\n    }\n\n    get x(): T {\n      return this.toAffine().x;\n    }\n    get y(): T {\n      return this.toAffine().y;\n    }\n\n    /**\n     *\n     * @param windowSize\n     * @param isLazy true will defer table computation until the first multiplication\n     * @returns\n     */\n    precompute(windowSize: number = 8, isLazy = true): Point {\n      wnaf.createCache(this, windowSize);\n      if (!isLazy) this.multiply(_3n); // random number\n      return this;\n    }\n\n    // TODO: return `this`\n    /** A point on curve is valid if it conforms to equation. */\n    assertValidity(): void {\n      assertValidMemo(this);\n    }\n\n    hasEvenY(): boolean {\n      const { y } = this.toAffine();\n      if (!Fp.isOdd) throw new Error(\"Field doesn't support isOdd\");\n      return !Fp.isOdd(y);\n    }\n\n    /** Compare one point to another. */\n    equals(other: Point): boolean {\n      aprjpoint(other);\n      const { X: X1, Y: Y1, Z: Z1 } = this;\n      const { X: X2, Y: Y2, Z: Z2 } = other;\n      const U1 = Fp.eql(Fp.mul(X1, Z2), Fp.mul(X2, Z1));\n      const U2 = Fp.eql(Fp.mul(Y1, Z2), Fp.mul(Y2, Z1));\n      return U1 && U2;\n    }\n\n    /** Flips point to one corresponding to (x, -y) in Affine coordinates. */\n    negate(): Point {\n      return new Point(this.X, Fp.neg(this.Y), this.Z);\n    }\n\n    // Renes-Costello-Batina exception-free doubling formula.\n    // There is 30% faster Jacobian formula, but it is not complete.\n    // https://eprint.iacr.org/2015/1060, algorithm 3\n    // Cost: 8M + 3S + 3*a + 2*b3 + 15add.\n    double() {\n      const { a, b } = CURVE;\n      const b3 = Fp.mul(b, _3n);\n      const { X: X1, Y: Y1, Z: Z1 } = this;\n      let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n      let t0 = Fp.mul(X1, X1); // step 1\n      let t1 = Fp.mul(Y1, Y1);\n      let t2 = Fp.mul(Z1, Z1);\n      let t3 = Fp.mul(X1, Y1);\n      t3 = Fp.add(t3, t3); // step 5\n      Z3 = Fp.mul(X1, Z1);\n      Z3 = Fp.add(Z3, Z3);\n      X3 = Fp.mul(a, Z3);\n      Y3 = Fp.mul(b3, t2);\n      Y3 = Fp.add(X3, Y3); // step 10\n      X3 = Fp.sub(t1, Y3);\n      Y3 = Fp.add(t1, Y3);\n      Y3 = Fp.mul(X3, Y3);\n      X3 = Fp.mul(t3, X3);\n      Z3 = Fp.mul(b3, Z3); // step 15\n      t2 = Fp.mul(a, t2);\n      t3 = Fp.sub(t0, t2);\n      t3 = Fp.mul(a, t3);\n      t3 = Fp.add(t3, Z3);\n      Z3 = Fp.add(t0, t0); // step 20\n      t0 = Fp.add(Z3, t0);\n      t0 = Fp.add(t0, t2);\n      t0 = Fp.mul(t0, t3);\n      Y3 = Fp.add(Y3, t0);\n      t2 = Fp.mul(Y1, Z1); // step 25\n      t2 = Fp.add(t2, t2);\n      t0 = Fp.mul(t2, t3);\n      X3 = Fp.sub(X3, t0);\n      Z3 = Fp.mul(t2, t1);\n      Z3 = Fp.add(Z3, Z3); // step 30\n      Z3 = Fp.add(Z3, Z3);\n      return new Point(X3, Y3, Z3);\n    }\n\n    // Renes-Costello-Batina exception-free addition formula.\n    // There is 30% faster Jacobian formula, but it is not complete.\n    // https://eprint.iacr.org/2015/1060, algorithm 1\n    // Cost: 12M + 0S + 3*a + 3*b3 + 23add.\n    add(other: Point): Point {\n      aprjpoint(other);\n      const { X: X1, Y: Y1, Z: Z1 } = this;\n      const { X: X2, Y: Y2, Z: Z2 } = other;\n      let X3 = Fp.ZERO, Y3 = Fp.ZERO, Z3 = Fp.ZERO; // prettier-ignore\n      const a = CURVE.a;\n      const b3 = Fp.mul(CURVE.b, _3n);\n      let t0 = Fp.mul(X1, X2); // step 1\n      let t1 = Fp.mul(Y1, Y2);\n      let t2 = Fp.mul(Z1, Z2);\n      let t3 = Fp.add(X1, Y1);\n      let t4 = Fp.add(X2, Y2); // step 5\n      t3 = Fp.mul(t3, t4);\n      t4 = Fp.add(t0, t1);\n      t3 = Fp.sub(t3, t4);\n      t4 = Fp.add(X1, Z1);\n      let t5 = Fp.add(X2, Z2); // step 10\n      t4 = Fp.mul(t4, t5);\n      t5 = Fp.add(t0, t2);\n      t4 = Fp.sub(t4, t5);\n      t5 = Fp.add(Y1, Z1);\n      X3 = Fp.add(Y2, Z2); // step 15\n      t5 = Fp.mul(t5, X3);\n      X3 = Fp.add(t1, t2);\n      t5 = Fp.sub(t5, X3);\n      Z3 = Fp.mul(a, t4);\n      X3 = Fp.mul(b3, t2); // step 20\n      Z3 = Fp.add(X3, Z3);\n      X3 = Fp.sub(t1, Z3);\n      Z3 = Fp.add(t1, Z3);\n      Y3 = Fp.mul(X3, Z3);\n      t1 = Fp.add(t0, t0); // step 25\n      t1 = Fp.add(t1, t0);\n      t2 = Fp.mul(a, t2);\n      t4 = Fp.mul(b3, t4);\n      t1 = Fp.add(t1, t2);\n      t2 = Fp.sub(t0, t2); // step 30\n      t2 = Fp.mul(a, t2);\n      t4 = Fp.add(t4, t2);\n      t0 = Fp.mul(t1, t4);\n      Y3 = Fp.add(Y3, t0);\n      t0 = Fp.mul(t5, t4); // step 35\n      X3 = Fp.mul(t3, X3);\n      X3 = Fp.sub(X3, t0);\n      t0 = Fp.mul(t3, t1);\n      Z3 = Fp.mul(t5, Z3);\n      Z3 = Fp.add(Z3, t0); // step 40\n      return new Point(X3, Y3, Z3);\n    }\n\n    subtract(other: Point) {\n      return this.add(other.negate());\n    }\n\n    is0(): boolean {\n      return this.equals(Point.ZERO);\n    }\n\n    /**\n     * Constant time multiplication.\n     * Uses wNAF method. Windowed method may be 10% faster,\n     * but takes 2x longer to generate and consumes 2x memory.\n     * Uses precomputes when available.\n     * Uses endomorphism for Koblitz curves.\n     * @param scalar by which the point would be multiplied\n     * @returns New point\n     */\n    multiply(scalar: bigint): Point {\n      const { endo } = extraOpts;\n      if (!Fn.isValidNot0(scalar)) throw new Error('invalid scalar: out of range'); // 0 is invalid\n      let point: Point, fake: Point; // Fake point is used to const-time mult\n      const mul = (n: bigint) => wnaf.cached(this, n, (p) => normalizeZ(Point, p));\n      /** See docs for {@link EndomorphismOpts} */\n      if (endo) {\n        const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(scalar);\n        const { p: k1p, f: k1f } = mul(k1);\n        const { p: k2p, f: k2f } = mul(k2);\n        fake = k1f.add(k2f);\n        point = finishEndo(endo.beta, k1p, k2p, k1neg, k2neg);\n      } else {\n        const { p, f } = mul(scalar);\n        point = p;\n        fake = f;\n      }\n      // Normalize `z` for both points, but return only real one\n      return normalizeZ(Point, [point, fake])[0];\n    }\n\n    /**\n     * Non-constant-time multiplication. Uses double-and-add algorithm.\n     * It's faster, but should only be used when you don't care about\n     * an exposed secret key e.g. sig verification, which works over *public* keys.\n     */\n    multiplyUnsafe(sc: bigint): Point {\n      const { endo } = extraOpts;\n      const p = this as Point;\n      if (!Fn.isValid(sc)) throw new Error('invalid scalar: out of range'); // 0 is valid\n      if (sc === _0n || p.is0()) return Point.ZERO;\n      if (sc === _1n) return p; // fast-path\n      if (wnaf.hasCache(this)) return this.multiply(sc);\n      if (endo) {\n        const { k1neg, k1, k2neg, k2 } = splitEndoScalarN(sc);\n        const { p1, p2 } = mulEndoUnsafe(Point, p, k1, k2); // 30% faster vs wnaf.unsafe\n        return finishEndo(endo.beta, p1, p2, k1neg, k2neg);\n      } else {\n        return wnaf.unsafe(p, sc);\n      }\n    }\n\n    multiplyAndAddUnsafe(Q: Point, a: bigint, b: bigint): Point | undefined {\n      const sum = this.multiplyUnsafe(a).add(Q.multiplyUnsafe(b));\n      return sum.is0() ? undefined : sum;\n    }\n\n    /**\n     * Converts Projective point to affine (x, y) coordinates.\n     * @param invertedZ Z^-1 (inverted zero) - optional, precomputation is useful for invertBatch\n     */\n    toAffine(invertedZ?: T): AffinePoint<T> {\n      return toAffineMemo(this, invertedZ);\n    }\n\n    /**\n     * Checks whether Point is free of torsion elements (is in prime subgroup).\n     * Always torsion-free for cofactor=1 curves.\n     */\n    isTorsionFree(): boolean {\n      const { isTorsionFree } = extraOpts;\n      if (cofactor === _1n) return true;\n      if (isTorsionFree) return isTorsionFree(Point, this);\n      return wnaf.unsafe(this, CURVE_ORDER).is0();\n    }\n\n    clearCofactor(): Point {\n      const { clearCofactor } = extraOpts;\n      if (cofactor === _1n) return this; // Fast-path\n      if (clearCofactor) return clearCofactor(Point, this) as Point;\n      return this.multiplyUnsafe(cofactor);\n    }\n\n    isSmallOrder(): boolean {\n      // can we use this.clearCofactor()?\n      return this.multiplyUnsafe(cofactor).is0();\n    }\n\n    toBytes(isCompressed = true): Uint8Array {\n      abool(isCompressed, 'isCompressed');\n      this.assertValidity();\n      return encodePoint(Point, this, isCompressed);\n    }\n\n    toHex(isCompressed = true): string {\n      return bytesToHex(this.toBytes(isCompressed));\n    }\n\n    toString() {\n      return `<Point ${this.is0() ? 'ZERO' : this.toHex()}>`;\n    }\n\n    // TODO: remove\n    get px(): T {\n      return this.X;\n    }\n    get py(): T {\n      return this.X;\n    }\n    get pz(): T {\n      return this.Z;\n    }\n    toRawBytes(isCompressed = true): Uint8Array {\n      return this.toBytes(isCompressed);\n    }\n    _setWindowSize(windowSize: number) {\n      this.precompute(windowSize);\n    }\n    static normalizeZ(points: Point[]): Point[] {\n      return normalizeZ(Point, points);\n    }\n    static msm(points: Point[], scalars: bigint[]): Point {\n      return pippenger(Point, Fn, points, scalars);\n    }\n    static fromPrivateKey(privateKey: PrivKey) {\n      return Point.BASE.multiply(_normFnElement(Fn, privateKey));\n    }\n  }\n  const bits = Fn.BITS;\n  const wnaf = new wNAF(Point, extraOpts.endo ? Math.ceil(bits / 2) : bits);\n  Point.BASE.precompute(8); // Enable precomputes. Slows down first publicKey computation by 20ms.\n  return Point;\n}\n\n/** Methods of ECDSA signature instance. */\nexport interface ECDSASignature {\n  readonly r: bigint;\n  readonly s: bigint;\n  readonly recovery?: number;\n  addRecoveryBit(recovery: number): ECDSASigRecovered;\n  hasHighS(): boolean;\n  toBytes(format?: string): Uint8Array;\n  toHex(format?: string): string;\n\n  /** @deprecated */\n  assertValidity(): void;\n  /** @deprecated */\n  normalizeS(): ECDSASignature;\n  /** @deprecated use standalone method `curve.recoverPublicKey(sig.toBytes('recovered'), msg)` */\n  recoverPublicKey(msgHash: Hex): WeierstrassPoint<bigint>;\n  /** @deprecated use `.toBytes('compact')` */\n  toCompactRawBytes(): Uint8Array;\n  /** @deprecated use `.toBytes('compact')` */\n  toCompactHex(): string;\n  /** @deprecated use `.toBytes('der')` */\n  toDERRawBytes(): Uint8Array;\n  /** @deprecated use `.toBytes('der')` */\n  toDERHex(): string;\n}\nexport type ECDSASigRecovered = ECDSASignature & {\n  readonly recovery: number;\n};\n/** Methods of ECDSA signature constructor. */\nexport type ECDSASignatureCons = {\n  new (r: bigint, s: bigint, recovery?: number): ECDSASignature;\n  fromBytes(bytes: Uint8Array, format?: ECDSASigFormat): ECDSASignature;\n  fromHex(hex: string, format?: ECDSASigFormat): ECDSASignature;\n\n  /** @deprecated use `.fromBytes(bytes, 'compact')` */\n  fromCompact(hex: Hex): ECDSASignature;\n  /** @deprecated use `.fromBytes(bytes, 'der')` */\n  fromDER(hex: Hex): ECDSASignature;\n};\n\n// Points start with byte 0x02 when y is even; otherwise 0x03\nfunction pprefix(hasEvenY: boolean): Uint8Array {\n  return Uint8Array.of(hasEvenY ? 0x02 : 0x03);\n}\n\n/**\n * Implementation of the Shallue and van de Woestijne method for any weierstrass curve.\n * TODO: check if there is a way to merge this with uvRatio in Edwards; move to modular.\n * b = True and y = sqrt(u / v) if (u / v) is square in F, and\n * b = False and y = sqrt(Z * (u / v)) otherwise.\n * @param Fp\n * @param Z\n * @returns\n */\nexport function SWUFpSqrtRatio<T>(\n  Fp: IField<T>,\n  Z: T\n): (u: T, v: T) => { isValid: boolean; value: T } {\n  // Generic implementation\n  const q = Fp.ORDER;\n  let l = _0n;\n  for (let o = q - _1n; o % _2n === _0n; o /= _2n) l += _1n;\n  const c1 = l; // 1. c1, the largest integer such that 2^c1 divides q - 1.\n  // We need 2n ** c1 and 2n ** (c1-1). We can't use **; but we can use <<.\n  // 2n ** c1 == 2n << (c1-1)\n  const _2n_pow_c1_1 = _2n << (c1 - _1n - _1n);\n  const _2n_pow_c1 = _2n_pow_c1_1 * _2n;\n  const c2 = (q - _1n) / _2n_pow_c1; // 2. c2 = (q - 1) / (2^c1)  # Integer arithmetic\n  const c3 = (c2 - _1n) / _2n; // 3. c3 = (c2 - 1) / 2            # Integer arithmetic\n  const c4 = _2n_pow_c1 - _1n; // 4. c4 = 2^c1 - 1                # Integer arithmetic\n  const c5 = _2n_pow_c1_1; // 5. c5 = 2^(c1 - 1)                  # Integer arithmetic\n  const c6 = Fp.pow(Z, c2); // 6. c6 = Z^c2\n  const c7 = Fp.pow(Z, (c2 + _1n) / _2n); // 7. c7 = Z^((c2 + 1) / 2)\n  let sqrtRatio = (u: T, v: T): { isValid: boolean; value: T } => {\n    let tv1 = c6; // 1. tv1 = c6\n    let tv2 = Fp.pow(v, c4); // 2. tv2 = v^c4\n    let tv3 = Fp.sqr(tv2); // 3. tv3 = tv2^2\n    tv3 = Fp.mul(tv3, v); // 4. tv3 = tv3 * v\n    let tv5 = Fp.mul(u, tv3); // 5. tv5 = u * tv3\n    tv5 = Fp.pow(tv5, c3); // 6. tv5 = tv5^c3\n    tv5 = Fp.mul(tv5, tv2); // 7. tv5 = tv5 * tv2\n    tv2 = Fp.mul(tv5, v); // 8. tv2 = tv5 * v\n    tv3 = Fp.mul(tv5, u); // 9. tv3 = tv5 * u\n    let tv4 = Fp.mul(tv3, tv2); // 10. tv4 = tv3 * tv2\n    tv5 = Fp.pow(tv4, c5); // 11. tv5 = tv4^c5\n    let isQR = Fp.eql(tv5, Fp.ONE); // 12. isQR = tv5 == 1\n    tv2 = Fp.mul(tv3, c7); // 13. tv2 = tv3 * c7\n    tv5 = Fp.mul(tv4, tv1); // 14. tv5 = tv4 * tv1\n    tv3 = Fp.cmov(tv2, tv3, isQR); // 15. tv3 = CMOV(tv2, tv3, isQR)\n    tv4 = Fp.cmov(tv5, tv4, isQR); // 16. tv4 = CMOV(tv5, tv4, isQR)\n    // 17. for i in (c1, c1 - 1, ..., 2):\n    for (let i = c1; i > _1n; i--) {\n      let tv5 = i - _2n; // 18.    tv5 = i - 2\n      tv5 = _2n << (tv5 - _1n); // 19.    tv5 = 2^tv5\n      let tvv5 = Fp.pow(tv4, tv5); // 20.    tv5 = tv4^tv5\n      const e1 = Fp.eql(tvv5, Fp.ONE); // 21.    e1 = tv5 == 1\n      tv2 = Fp.mul(tv3, tv1); // 22.    tv2 = tv3 * tv1\n      tv1 = Fp.mul(tv1, tv1); // 23.    tv1 = tv1 * tv1\n      tvv5 = Fp.mul(tv4, tv1); // 24.    tv5 = tv4 * tv1\n      tv3 = Fp.cmov(tv2, tv3, e1); // 25.    tv3 = CMOV(tv2, tv3, e1)\n      tv4 = Fp.cmov(tvv5, tv4, e1); // 26.    tv4 = CMOV(tv5, tv4, e1)\n    }\n    return { isValid: isQR, value: tv3 };\n  };\n  if (Fp.ORDER % _4n === _3n) {\n    // sqrt_ratio_3mod4(u, v)\n    const c1 = (Fp.ORDER - _3n) / _4n; // 1. c1 = (q - 3) / 4     # Integer arithmetic\n    const c2 = Fp.sqrt(Fp.neg(Z)); // 2. c2 = sqrt(-Z)\n    sqrtRatio = (u: T, v: T) => {\n      let tv1 = Fp.sqr(v); // 1. tv1 = v^2\n      const tv2 = Fp.mul(u, v); // 2. tv2 = u * v\n      tv1 = Fp.mul(tv1, tv2); // 3. tv1 = tv1 * tv2\n      let y1 = Fp.pow(tv1, c1); // 4. y1 = tv1^c1\n      y1 = Fp.mul(y1, tv2); // 5. y1 = y1 * tv2\n      const y2 = Fp.mul(y1, c2); // 6. y2 = y1 * c2\n      const tv3 = Fp.mul(Fp.sqr(y1), v); // 7. tv3 = y1^2; 8. tv3 = tv3 * v\n      const isQR = Fp.eql(tv3, u); // 9. isQR = tv3 == u\n      let y = Fp.cmov(y2, y1, isQR); // 10. y = CMOV(y2, y1, isQR)\n      return { isValid: isQR, value: y }; // 11. return (isQR, y) isQR ? y : y*c2\n    };\n  }\n  // No curves uses that\n  // if (Fp.ORDER % _8n === _5n) // sqrt_ratio_5mod8\n  return sqrtRatio;\n}\n/**\n * Simplified Shallue-van de Woestijne-Ulas Method\n * https://www.rfc-editor.org/rfc/rfc9380#section-6.6.2\n */\nexport function mapToCurveSimpleSWU<T>(\n  Fp: IField<T>,\n  opts: {\n    A: T;\n    B: T;\n    Z: T;\n  }\n): (u: T) => { x: T; y: T } {\n  validateField(Fp);\n  const { A, B, Z } = opts;\n  if (!Fp.isValid(A) || !Fp.isValid(B) || !Fp.isValid(Z))\n    throw new Error('mapToCurveSimpleSWU: invalid opts');\n  const sqrtRatio = SWUFpSqrtRatio(Fp, Z);\n  if (!Fp.isOdd) throw new Error('Field does not have .isOdd()');\n  // Input: u, an element of F.\n  // Output: (x, y), a point on E.\n  return (u: T): { x: T; y: T } => {\n    // prettier-ignore\n    let tv1, tv2, tv3, tv4, tv5, tv6, x, y;\n    tv1 = Fp.sqr(u); // 1.  tv1 = u^2\n    tv1 = Fp.mul(tv1, Z); // 2.  tv1 = Z * tv1\n    tv2 = Fp.sqr(tv1); // 3.  tv2 = tv1^2\n    tv2 = Fp.add(tv2, tv1); // 4.  tv2 = tv2 + tv1\n    tv3 = Fp.add(tv2, Fp.ONE); // 5.  tv3 = tv2 + 1\n    tv3 = Fp.mul(tv3, B); // 6.  tv3 = B * tv3\n    tv4 = Fp.cmov(Z, Fp.neg(tv2), !Fp.eql(tv2, Fp.ZERO)); // 7.  tv4 = CMOV(Z, -tv2, tv2 != 0)\n    tv4 = Fp.mul(tv4, A); // 8.  tv4 = A * tv4\n    tv2 = Fp.sqr(tv3); // 9.  tv2 = tv3^2\n    tv6 = Fp.sqr(tv4); // 10. tv6 = tv4^2\n    tv5 = Fp.mul(tv6, A); // 11. tv5 = A * tv6\n    tv2 = Fp.add(tv2, tv5); // 12. tv2 = tv2 + tv5\n    tv2 = Fp.mul(tv2, tv3); // 13. tv2 = tv2 * tv3\n    tv6 = Fp.mul(tv6, tv4); // 14. tv6 = tv6 * tv4\n    tv5 = Fp.mul(tv6, B); // 15. tv5 = B * tv6\n    tv2 = Fp.add(tv2, tv5); // 16. tv2 = tv2 + tv5\n    x = Fp.mul(tv1, tv3); // 17.   x = tv1 * tv3\n    const { isValid, value } = sqrtRatio(tv2, tv6); // 18. (is_gx1_square, y1) = sqrt_ratio(tv2, tv6)\n    y = Fp.mul(tv1, u); // 19.   y = tv1 * u  -> Z * u^3 * y1\n    y = Fp.mul(y, value); // 20.   y = y * y1\n    x = Fp.cmov(x, tv3, isValid); // 21.   x = CMOV(x, tv3, is_gx1_square)\n    y = Fp.cmov(y, value, isValid); // 22.   y = CMOV(y, y1, is_gx1_square)\n    const e1 = Fp.isOdd!(u) === Fp.isOdd!(y); // 23.  e1 = sgn0(u) == sgn0(y)\n    y = Fp.cmov(Fp.neg(y), y, e1); // 24.   y = CMOV(-y, y, e1)\n    const tv4_inv = FpInvertBatch(Fp, [tv4], true)[0];\n    x = Fp.mul(x, tv4_inv); // 25.   x = x / tv4\n    return { x, y };\n  };\n}\n\nfunction getWLengths<T>(Fp: IField<T>, Fn: IField<bigint>) {\n  return {\n    secretKey: Fn.BYTES,\n    publicKey: 1 + Fp.BYTES,\n    publicKeyUncompressed: 1 + 2 * Fp.BYTES,\n    publicKeyHasPrefix: true,\n    signature: 2 * Fn.BYTES,\n  };\n}\n\n/**\n * Sometimes users only need getPublicKey, getSharedSecret, and secret key handling.\n * This helper ensures no signature functionality is present. Less code, smaller bundle size.\n */\nexport function ecdh(\n  Point: WeierstrassPointCons<bigint>,\n  ecdhOpts: { randomBytes?: (bytesLength?: number) => Uint8Array } = {}\n): ECDH {\n  const { Fn } = Point;\n  const randomBytes_ = ecdhOpts.randomBytes || randomBytesWeb;\n  const lengths = Object.assign(getWLengths(Point.Fp, Fn), { seed: getMinHashLength(Fn.ORDER) });\n\n  function isValidSecretKey(secretKey: PrivKey) {\n    try {\n      return !!_normFnElement(Fn, secretKey);\n    } catch (error) {\n      return false;\n    }\n  }\n\n  function isValidPublicKey(publicKey: Uint8Array, isCompressed?: boolean): boolean {\n    const { publicKey: comp, publicKeyUncompressed } = lengths;\n    try {\n      const l = publicKey.length;\n      if (isCompressed === true && l !== comp) return false;\n      if (isCompressed === false && l !== publicKeyUncompressed) return false;\n      return !!Point.fromBytes(publicKey);\n    } catch (error) {\n      return false;\n    }\n  }\n\n  /**\n   * Produces cryptographically secure secret key from random of size\n   * (groupLen + ceil(groupLen / 2)) with modulo bias being negligible.\n   */\n  function randomSecretKey(seed = randomBytes_(lengths.seed)): Uint8Array {\n    return mapHashToField(abytes(seed, lengths.seed, 'seed'), Fn.ORDER);\n  }\n\n  /**\n   * Computes public key for a secret key. Checks for validity of the secret key.\n   * @param isCompressed whether to return compact (default), or full key\n   * @returns Public key, full when isCompressed=false; short when isCompressed=true\n   */\n  function getPublicKey(secretKey: PrivKey, isCompressed = true): Uint8Array {\n    return Point.BASE.multiply(_normFnElement(Fn, secretKey)).toBytes(isCompressed);\n  }\n\n  function keygen(seed?: Uint8Array) {\n    const secretKey = randomSecretKey(seed);\n    return { secretKey, publicKey: getPublicKey(secretKey) };\n  }\n\n  /**\n   * Quick and dirty check for item being public key. Does not validate hex, or being on-curve.\n   */\n  function isProbPub(item: PrivKey | PubKey): boolean | undefined {\n    if (typeof item === 'bigint') return false;\n    if (item instanceof Point) return true;\n    const { secretKey, publicKey, publicKeyUncompressed } = lengths;\n    if (Fn.allowedLengths || secretKey === publicKey) return undefined;\n    const l = ensureBytes('key', item).length;\n    return l === publicKey || l === publicKeyUncompressed;\n  }\n\n  /**\n   * ECDH (Elliptic Curve Diffie Hellman).\n   * Computes shared public key from secret key A and public key B.\n   * Checks: 1) secret key validity 2) shared key is on-curve.\n   * Does NOT hash the result.\n   * @param isCompressed whether to return compact (default), or full key\n   * @returns shared public key\n   */\n  function getSharedSecret(secretKeyA: PrivKey, publicKeyB: Hex, isCompressed = true): Uint8Array {\n    if (isProbPub(secretKeyA) === true) throw new Error('first arg must be private key');\n    if (isProbPub(publicKeyB) === false) throw new Error('second arg must be public key');\n    const s = _normFnElement(Fn, secretKeyA);\n    const b = Point.fromHex(publicKeyB); // checks for being on-curve\n    return b.multiply(s).toBytes(isCompressed);\n  }\n\n  const utils = {\n    isValidSecretKey,\n    isValidPublicKey,\n    randomSecretKey,\n\n    // TODO: remove\n    isValidPrivateKey: isValidSecretKey,\n    randomPrivateKey: randomSecretKey,\n    normPrivateKeyToScalar: (key: PrivKey) => _normFnElement(Fn, key),\n    precompute(windowSize = 8, point = Point.BASE): WeierstrassPoint<bigint> {\n      return point.precompute(windowSize, false);\n    },\n  };\n\n  return Object.freeze({ getPublicKey, getSharedSecret, keygen, Point, utils, lengths });\n}\n\n/**\n * Creates ECDSA signing interface for given elliptic curve `Point` and `hash` function.\n * We need `hash` for 2 features:\n * 1. Message prehash-ing. NOT used if `sign` / `verify` are called with `prehash: false`\n * 2. k generation in `sign`, using HMAC-drbg(hash)\n *\n * ECDSAOpts are only rarely needed.\n *\n * @example\n * ```js\n * const p256_Point = weierstrass(...);\n * const p256_sha256 = ecdsa(p256_Point, sha256);\n * const p256_sha224 = ecdsa(p256_Point, sha224);\n * const p256_sha224_r = ecdsa(p256_Point, sha224, { randomBytes: (length) => { ... } });\n * ```\n */\nexport function ecdsa(\n  Point: WeierstrassPointCons<bigint>,\n  hash: CHash,\n  ecdsaOpts: ECDSAOpts = {}\n): ECDSA {\n  ahash(hash);\n  _validateObject(\n    ecdsaOpts,\n    {},\n    {\n      hmac: 'function',\n      lowS: 'boolean',\n      randomBytes: 'function',\n      bits2int: 'function',\n      bits2int_modN: 'function',\n    }\n  );\n\n  const randomBytes = ecdsaOpts.randomBytes || randomBytesWeb;\n  const hmac: HmacFnSync =\n    ecdsaOpts.hmac ||\n    (((key, ...msgs) => nobleHmac(hash, key, concatBytes(...msgs))) satisfies HmacFnSync);\n\n  const { Fp, Fn } = Point;\n  const { ORDER: CURVE_ORDER, BITS: fnBits } = Fn;\n  const { keygen, getPublicKey, getSharedSecret, utils, lengths } = ecdh(Point, ecdsaOpts);\n  const defaultSigOpts: Required<ECDSASignOpts> = {\n    prehash: false,\n    lowS: typeof ecdsaOpts.lowS === 'boolean' ? ecdsaOpts.lowS : false,\n    format: undefined as any, //'compact' as ECDSASigFormat,\n    extraEntropy: false,\n  };\n  const defaultSigOpts_format = 'compact';\n\n  function isBiggerThanHalfOrder(number: bigint) {\n    const HALF = CURVE_ORDER >> _1n;\n    return number > HALF;\n  }\n  function validateRS(title: string, num: bigint): bigint {\n    if (!Fn.isValidNot0(num))\n      throw new Error(`invalid signature ${title}: out of range 1..Point.Fn.ORDER`);\n    return num;\n  }\n  function validateSigLength(bytes: Uint8Array, format: ECDSASigFormat) {\n    validateSigFormat(format);\n    const size = lengths.signature!;\n    const sizer = format === 'compact' ? size : format === 'recovered' ? size + 1 : undefined;\n    return abytes(bytes, sizer, `${format} signature`);\n  }\n\n  /**\n   * ECDSA signature with its (r, s) properties. Supports compact, recovered & DER representations.\n   */\n  class Signature implements ECDSASignature {\n    readonly r: bigint;\n    readonly s: bigint;\n    readonly recovery?: number;\n    constructor(r: bigint, s: bigint, recovery?: number) {\n      this.r = validateRS('r', r); // r in [1..N-1];\n      this.s = validateRS('s', s); // s in [1..N-1];\n      if (recovery != null) this.recovery = recovery;\n      Object.freeze(this);\n    }\n\n    static fromBytes(bytes: Uint8Array, format: ECDSASigFormat = defaultSigOpts_format): Signature {\n      validateSigLength(bytes, format);\n      let recid: number | undefined;\n      if (format === 'der') {\n        const { r, s } = DER.toSig(abytes(bytes));\n        return new Signature(r, s);\n      }\n      if (format === 'recovered') {\n        recid = bytes[0];\n        format = 'compact';\n        bytes = bytes.subarray(1);\n      }\n      const L = Fn.BYTES;\n      const r = bytes.subarray(0, L);\n      const s = bytes.subarray(L, L * 2);\n      return new Signature(Fn.fromBytes(r), Fn.fromBytes(s), recid);\n    }\n\n    static fromHex(hex: string, format?: ECDSASigFormat) {\n      return this.fromBytes(hexToBytes(hex), format);\n    }\n\n    addRecoveryBit(recovery: number): RecoveredSignature {\n      return new Signature(this.r, this.s, recovery) as RecoveredSignature;\n    }\n\n    recoverPublicKey(messageHash: Hex): WeierstrassPoint<bigint> {\n      const FIELD_ORDER = Fp.ORDER;\n      const { r, s, recovery: rec } = this;\n      if (rec == null || ![0, 1, 2, 3].includes(rec)) throw new Error('recovery id invalid');\n\n      // ECDSA recovery is hard for cofactor > 1 curves.\n      // In sign, `r = q.x mod n`, and here we recover q.x from r.\n      // While recovering q.x >= n, we need to add r+n for cofactor=1 curves.\n      // However, for cofactor>1, r+n may not get q.x:\n      // r+n*i would need to be done instead where i is unknown.\n      // To easily get i, we either need to:\n      // a. increase amount of valid recid values (4, 5...); OR\n      // b. prohibit non-prime-order signatures (recid > 1).\n      const hasCofactor = CURVE_ORDER * _2n < FIELD_ORDER;\n      if (hasCofactor && rec > 1) throw new Error('recovery id is ambiguous for h>1 curve');\n\n      const radj = rec === 2 || rec === 3 ? r + CURVE_ORDER : r;\n      if (!Fp.isValid(radj)) throw new Error('recovery id 2 or 3 invalid');\n      const x = Fp.toBytes(radj);\n      const R = Point.fromBytes(concatBytes(pprefix((rec & 1) === 0), x));\n      const ir = Fn.inv(radj); // r^-1\n      const h = bits2int_modN(ensureBytes('msgHash', messageHash)); // Truncate hash\n      const u1 = Fn.create(-h * ir); // -hr^-1\n      const u2 = Fn.create(s * ir); // sr^-1\n      // (sr^-1)R-(hr^-1)G = -(hr^-1)G + (sr^-1). unsafe is fine: there is no private data.\n      const Q = Point.BASE.multiplyUnsafe(u1).add(R.multiplyUnsafe(u2));\n      if (Q.is0()) throw new Error('point at infinify');\n      Q.assertValidity();\n      return Q;\n    }\n\n    // Signatures should be low-s, to prevent malleability.\n    hasHighS(): boolean {\n      return isBiggerThanHalfOrder(this.s);\n    }\n\n    toBytes(format: ECDSASigFormat = defaultSigOpts_format) {\n      validateSigFormat(format);\n      if (format === 'der') return hexToBytes(DER.hexFromSig(this));\n      const r = Fn.toBytes(this.r);\n      const s = Fn.toBytes(this.s);\n      if (format === 'recovered') {\n        if (this.recovery == null) throw new Error('recovery bit must be present');\n        return concatBytes(Uint8Array.of(this.recovery), r, s);\n      }\n      return concatBytes(r, s);\n    }\n\n    toHex(format?: ECDSASigFormat) {\n      return bytesToHex(this.toBytes(format));\n    }\n\n    // TODO: remove\n    assertValidity(): void {}\n    static fromCompact(hex: Hex) {\n      return Signature.fromBytes(ensureBytes('sig', hex), 'compact');\n    }\n    static fromDER(hex: Hex) {\n      return Signature.fromBytes(ensureBytes('sig', hex), 'der');\n    }\n    normalizeS() {\n      return this.hasHighS() ? new Signature(this.r, Fn.neg(this.s), this.recovery) : this;\n    }\n    toDERRawBytes() {\n      return this.toBytes('der');\n    }\n    toDERHex() {\n      return bytesToHex(this.toBytes('der'));\n    }\n    toCompactRawBytes() {\n      return this.toBytes('compact');\n    }\n    toCompactHex() {\n      return bytesToHex(this.toBytes('compact'));\n    }\n  }\n  type RecoveredSignature = Signature & { recovery: number };\n\n  // RFC6979: ensure ECDSA msg is X bytes and < N. RFC suggests optional truncating via bits2octets.\n  // FIPS 186-4 4.6 suggests the leftmost min(nBitLen, outLen) bits, which matches bits2int.\n  // bits2int can produce res>N, we can do mod(res, N) since the bitLen is the same.\n  // int2octets can't be used; pads small msgs with 0: unacceptatble for trunc as per RFC vectors\n  const bits2int =\n    ecdsaOpts.bits2int ||\n    function bits2int_def(bytes: Uint8Array): bigint {\n      // Our custom check \"just in case\", for protection against DoS\n      if (bytes.length > 8192) throw new Error('input is too large');\n      // For curves with nBitLength % 8 !== 0: bits2octets(bits2octets(m)) !== bits2octets(m)\n      // for some cases, since bytes.length * 8 is not actual bitLength.\n      const num = bytesToNumberBE(bytes); // check for == u8 done here\n      const delta = bytes.length * 8 - fnBits; // truncate to nBitLength leftmost bits\n      return delta > 0 ? num >> BigInt(delta) : num;\n    };\n  const bits2int_modN =\n    ecdsaOpts.bits2int_modN ||\n    function bits2int_modN_def(bytes: Uint8Array): bigint {\n      return Fn.create(bits2int(bytes)); // can't use bytesToNumberBE here\n    };\n  // Pads output with zero as per spec\n  const ORDER_MASK = bitMask(fnBits);\n  /** Converts to bytes. Checks if num in `[0..ORDER_MASK-1]` e.g.: `[0..2^256-1]`. */\n  function int2octets(num: bigint): Uint8Array {\n    // IMPORTANT: the check ensures working for case `Fn.BYTES != Fn.BITS * 8`\n    aInRange('num < 2^' + fnBits, num, _0n, ORDER_MASK);\n    return Fn.toBytes(num);\n  }\n\n  function validateMsgAndHash(message: Uint8Array, prehash: boolean) {\n    abytes(message, undefined, 'message');\n    return prehash ? abytes(hash(message), undefined, 'prehashed message') : message;\n  }\n\n  /**\n   * Steps A, D of RFC6979 3.2.\n   * Creates RFC6979 seed; converts msg/privKey to numbers.\n   * Used only in sign, not in verify.\n   *\n   * Warning: we cannot assume here that message has same amount of bytes as curve order,\n   * this will be invalid at least for P521. Also it can be bigger for P224 + SHA256.\n   */\n  function prepSig(message: Uint8Array, privateKey: PrivKey, opts: ECDSASignOpts) {\n    if (['recovered', 'canonical'].some((k) => k in opts))\n      throw new Error('sign() legacy options not supported');\n    const { lowS, prehash, extraEntropy } = validateSigOpts(opts, defaultSigOpts);\n    message = validateMsgAndHash(message, prehash); // RFC6979 3.2 A: h1 = H(m)\n    // We can't later call bits2octets, since nested bits2int is broken for curves\n    // with fnBits % 8 !== 0. Because of that, we unwrap it here as int2octets call.\n    // const bits2octets = (bits) => int2octets(bits2int_modN(bits))\n    const h1int = bits2int_modN(message);\n    const d = _normFnElement(Fn, privateKey); // validate secret key, convert to bigint\n    const seedArgs = [int2octets(d), int2octets(h1int)];\n    // extraEntropy. RFC6979 3.6: additional k' (optional).\n    if (extraEntropy != null && extraEntropy !== false) {\n      // K = HMAC_K(V || 0x00 || int2octets(x) || bits2octets(h1) || k')\n      // gen random bytes OR pass as-is\n      const e = extraEntropy === true ? randomBytes(lengths.secretKey) : extraEntropy;\n      seedArgs.push(ensureBytes('extraEntropy', e)); // check for being bytes\n    }\n    const seed = concatBytes(...seedArgs); // Step D of RFC6979 3.2\n    const m = h1int; // NOTE: no need to call bits2int second time here, it is inside truncateHash!\n    // Converts signature params into point w r/s, checks result for validity.\n    // To transform k => Signature:\n    // q = k⋅G\n    // r = q.x mod n\n    // s = k^-1(m + rd) mod n\n    // Can use scalar blinding b^-1(bm + bdr) where b ∈ [1,q−1] according to\n    // https://tches.iacr.org/index.php/TCHES/article/view/7337/6509. We've decided against it:\n    // a) dependency on CSPRNG b) 15% slowdown c) doesn't really help since bigints are not CT\n    function k2sig(kBytes: Uint8Array): RecoveredSignature | undefined {\n      // RFC 6979 Section 3.2, step 3: k = bits2int(T)\n      // Important: all mod() calls here must be done over N\n      const k = bits2int(kBytes); // mod n, not mod p\n      if (!Fn.isValidNot0(k)) return; // Valid scalars (including k) must be in 1..N-1\n      const ik = Fn.inv(k); // k^-1 mod n\n      const q = Point.BASE.multiply(k).toAffine(); // q = k⋅G\n      const r = Fn.create(q.x); // r = q.x mod n\n      if (r === _0n) return;\n      const s = Fn.create(ik * Fn.create(m + r * d)); // Not using blinding here, see comment above\n      if (s === _0n) return;\n      let recovery = (q.x === r ? 0 : 2) | Number(q.y & _1n); // recovery bit (2 or 3, when q.x > n)\n      let normS = s;\n      if (lowS && isBiggerThanHalfOrder(s)) {\n        normS = Fn.neg(s); // if lowS was passed, ensure s is always\n        recovery ^= 1; // // in the bottom half of N\n      }\n      return new Signature(r, normS, recovery) as RecoveredSignature; // use normS, not s\n    }\n    return { seed, k2sig };\n  }\n\n  /**\n   * Signs message hash with a secret key.\n   *\n   * ```\n   * sign(m, d) where\n   *   k = rfc6979_hmac_drbg(m, d)\n   *   (x, y) = G × k\n   *   r = x mod n\n   *   s = (m + dr) / k mod n\n   * ```\n   */\n  function sign(message: Hex, secretKey: PrivKey, opts: ECDSASignOpts = {}): RecoveredSignature {\n    message = ensureBytes('message', message);\n    const { seed, k2sig } = prepSig(message, secretKey, opts); // Steps A, D of RFC6979 3.2.\n    const drbg = createHmacDrbg<RecoveredSignature>(hash.outputLen, Fn.BYTES, hmac);\n    const sig = drbg(seed, k2sig); // Steps B, C, D, E, F, G\n    return sig;\n  }\n\n  function tryParsingSig(sg: Hex | SignatureLike) {\n    // Try to deduce format\n    let sig: Signature | undefined = undefined;\n    const isHex = typeof sg === 'string' || isBytes(sg);\n    const isObj =\n      !isHex &&\n      sg !== null &&\n      typeof sg === 'object' &&\n      typeof sg.r === 'bigint' &&\n      typeof sg.s === 'bigint';\n    if (!isHex && !isObj)\n      throw new Error('invalid signature, expected Uint8Array, hex string or Signature instance');\n    if (isObj) {\n      sig = new Signature(sg.r, sg.s);\n    } else if (isHex) {\n      try {\n        sig = Signature.fromBytes(ensureBytes('sig', sg), 'der');\n      } catch (derError) {\n        if (!(derError instanceof DER.Err)) throw derError;\n      }\n      if (!sig) {\n        try {\n          sig = Signature.fromBytes(ensureBytes('sig', sg), 'compact');\n        } catch (error) {\n          return false;\n        }\n      }\n    }\n    if (!sig) return false;\n    return sig;\n  }\n\n  /**\n   * Verifies a signature against message and public key.\n   * Rejects lowS signatures by default: see {@link ECDSAVerifyOpts}.\n   * Implements section 4.1.4 from https://www.secg.org/sec1-v2.pdf:\n   *\n   * ```\n   * verify(r, s, h, P) where\n   *   u1 = hs^-1 mod n\n   *   u2 = rs^-1 mod n\n   *   R = u1⋅G + u2⋅P\n   *   mod(R.x, n) == r\n   * ```\n   */\n  function verify(\n    signature: Hex | SignatureLike,\n    message: Hex,\n    publicKey: Hex,\n    opts: ECDSAVerifyOpts = {}\n  ): boolean {\n    const { lowS, prehash, format } = validateSigOpts(opts, defaultSigOpts);\n    publicKey = ensureBytes('publicKey', publicKey);\n    message = validateMsgAndHash(ensureBytes('message', message), prehash);\n    if ('strict' in opts) throw new Error('options.strict was renamed to lowS');\n    const sig =\n      format === undefined\n        ? tryParsingSig(signature)\n        : Signature.fromBytes(ensureBytes('sig', signature as Hex), format);\n    if (sig === false) return false;\n    try {\n      const P = Point.fromBytes(publicKey);\n      if (lowS && sig.hasHighS()) return false;\n      const { r, s } = sig;\n      const h = bits2int_modN(message); // mod n, not mod p\n      const is = Fn.inv(s); // s^-1 mod n\n      const u1 = Fn.create(h * is); // u1 = hs^-1 mod n\n      const u2 = Fn.create(r * is); // u2 = rs^-1 mod n\n      const R = Point.BASE.multiplyUnsafe(u1).add(P.multiplyUnsafe(u2)); // u1⋅G + u2⋅P\n      if (R.is0()) return false;\n      const v = Fn.create(R.x); // v = r.x mod n\n      return v === r;\n    } catch (e) {\n      return false;\n    }\n  }\n\n  function recoverPublicKey(\n    signature: Uint8Array,\n    message: Uint8Array,\n    opts: ECDSARecoverOpts = {}\n  ): Uint8Array {\n    const { prehash } = validateSigOpts(opts, defaultSigOpts);\n    message = validateMsgAndHash(message, prehash);\n    return Signature.fromBytes(signature, 'recovered').recoverPublicKey(message).toBytes();\n  }\n\n  return Object.freeze({\n    keygen,\n    getPublicKey,\n    getSharedSecret,\n    utils,\n    lengths,\n    Point,\n    sign,\n    verify,\n    recoverPublicKey,\n    Signature,\n    hash,\n  });\n}\n\n// TODO: remove everything below\n/** @deprecated use ECDSASignature */\nexport type SignatureType = ECDSASignature;\n/** @deprecated use ECDSASigRecovered */\nexport type RecoveredSignatureType = ECDSASigRecovered;\n/** @deprecated switch to Uint8Array signatures in format 'compact' */\nexport type SignatureLike = { r: bigint; s: bigint };\nexport type ECDSAExtraEntropy = Hex | boolean;\n/** @deprecated use `ECDSAExtraEntropy` */\nexport type Entropy = Hex | boolean;\nexport type BasicWCurve<T> = BasicCurve<T> & {\n  // Params: a, b\n  a: T;\n  b: T;\n\n  // Optional params\n  allowedPrivateKeyLengths?: readonly number[]; // for P521\n  wrapPrivateKey?: boolean; // bls12-381 requires mod(n) instead of rejecting keys >= n\n  endo?: EndomorphismOpts;\n  // When a cofactor != 1, there can be an effective methods to:\n  // 1. Determine whether a point is torsion-free\n  isTorsionFree?: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => boolean;\n  // 2. Clear torsion component\n  clearCofactor?: (c: WeierstrassPointCons<T>, point: WeierstrassPoint<T>) => WeierstrassPoint<T>;\n};\n/** @deprecated use ECDSASignOpts */\nexport type SignOpts = ECDSASignOpts;\n/** @deprecated use ECDSASignOpts */\nexport type VerOpts = ECDSAVerifyOpts;\n\n/** @deprecated use WeierstrassPoint */\nexport type ProjPointType<T> = WeierstrassPoint<T>;\n/** @deprecated use WeierstrassPointCons */\nexport type ProjConstructor<T> = WeierstrassPointCons<T>;\n/** @deprecated use ECDSASignatureCons */\nexport type SignatureConstructor = ECDSASignatureCons;\n\n// TODO: remove\nexport type CurvePointsType<T> = BasicWCurve<T> & {\n  fromBytes?: (bytes: Uint8Array) => AffinePoint<T>;\n  toBytes?: (\n    c: WeierstrassPointCons<T>,\n    point: WeierstrassPoint<T>,\n    isCompressed: boolean\n  ) => Uint8Array;\n};\n\n// LegacyWeierstrassOpts\nexport type CurvePointsTypeWithLength<T> = Readonly<CurvePointsType<T> & Partial<NLength>>;\n\n// LegacyWeierstrass\nexport type CurvePointsRes<T> = {\n  Point: WeierstrassPointCons<T>;\n\n  /** @deprecated use `Point.CURVE()` */\n  CURVE: CurvePointsType<T>;\n  /** @deprecated use `Point` */\n  ProjectivePoint: WeierstrassPointCons<T>;\n  /** @deprecated use `Point.Fn.fromBytes(privateKey)` */\n  normPrivateKeyToScalar: (key: PrivKey) => bigint;\n  /** @deprecated */\n  weierstrassEquation: (x: T) => T;\n  /** @deprecated use `Point.Fn.isValidNot0(num)` */\n  isWithinCurveOrder: (num: bigint) => boolean;\n};\n\n// Aliases to legacy types\n// export type CurveType = LegacyECDSAOpts;\n// export type CurveFn = LegacyECDSA;\n// export type CurvePointsRes<T> = LegacyWeierstrass<T>;\n// export type CurvePointsType<T> = LegacyWeierstrassOpts<T>;\n// export type CurvePointsTypeWithLength<T> = LegacyWeierstrassOpts<T>;\n// export type BasicWCurve<T> = LegacyWeierstrassOpts<T>;\n\n/** @deprecated use `Uint8Array` */\nexport type PubKey = Hex | WeierstrassPoint<bigint>;\nexport type CurveType = BasicWCurve<bigint> & {\n  hash: CHash; // CHash not FHash because we need outputLen for DRBG\n  hmac?: HmacFnSync;\n  randomBytes?: (bytesLength?: number) => Uint8Array;\n  lowS?: boolean;\n  bits2int?: (bytes: Uint8Array) => bigint;\n  bits2int_modN?: (bytes: Uint8Array) => bigint;\n};\nexport type CurveFn = {\n  /** @deprecated use `Point.CURVE()` */\n  CURVE: CurvePointsType<bigint>;\n  keygen: ECDSA['keygen'];\n  getPublicKey: ECDSA['getPublicKey'];\n  getSharedSecret: ECDSA['getSharedSecret'];\n  sign: ECDSA['sign'];\n  verify: ECDSA['verify'];\n  Point: WeierstrassPointCons<bigint>;\n  /** @deprecated use `Point` */\n  ProjectivePoint: WeierstrassPointCons<bigint>;\n  Signature: ECDSASignatureCons;\n  utils: ECDSA['utils'];\n  lengths: ECDSA['lengths'];\n};\n/** @deprecated use `weierstrass` in newer releases */\nexport function weierstrassPoints<T>(c: CurvePointsTypeWithLength<T>): CurvePointsRes<T> {\n  const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n  const Point = weierstrassN(CURVE, curveOpts);\n  return _weierstrass_new_output_to_legacy(c, Point);\n}\nexport type WsPointComposed<T> = {\n  CURVE: WeierstrassOpts<T>;\n  curveOpts: WeierstrassExtraOpts<T>;\n};\nexport type WsComposed = {\n  /** @deprecated use `Point.CURVE()` */\n  CURVE: WeierstrassOpts<bigint>;\n  hash: CHash;\n  curveOpts: WeierstrassExtraOpts<bigint>;\n  ecdsaOpts: ECDSAOpts;\n};\nfunction _weierstrass_legacy_opts_to_new<T>(c: CurvePointsType<T>): WsPointComposed<T> {\n  const CURVE: WeierstrassOpts<T> = {\n    a: c.a,\n    b: c.b,\n    p: c.Fp.ORDER,\n    n: c.n,\n    h: c.h,\n    Gx: c.Gx,\n    Gy: c.Gy,\n  };\n  const Fp = c.Fp;\n  let allowedLengths = c.allowedPrivateKeyLengths\n    ? Array.from(new Set(c.allowedPrivateKeyLengths.map((l) => Math.ceil(l / 2))))\n    : undefined;\n  const Fn = Field(CURVE.n, {\n    BITS: c.nBitLength,\n    allowedLengths: allowedLengths,\n    modFromBytes: c.wrapPrivateKey,\n  });\n  const curveOpts: WeierstrassExtraOpts<T> = {\n    Fp,\n    Fn,\n    allowInfinityPoint: c.allowInfinityPoint,\n    endo: c.endo,\n    isTorsionFree: c.isTorsionFree,\n    clearCofactor: c.clearCofactor,\n    fromBytes: c.fromBytes,\n    toBytes: c.toBytes,\n  };\n  return { CURVE, curveOpts };\n}\nfunction _ecdsa_legacy_opts_to_new(c: CurveType): WsComposed {\n  const { CURVE, curveOpts } = _weierstrass_legacy_opts_to_new(c);\n  const ecdsaOpts: ECDSAOpts = {\n    hmac: c.hmac,\n    randomBytes: c.randomBytes,\n    lowS: c.lowS,\n    bits2int: c.bits2int,\n    bits2int_modN: c.bits2int_modN,\n  };\n  return { CURVE, curveOpts, hash: c.hash, ecdsaOpts };\n}\nexport function _legacyHelperEquat<T>(Fp: IField<T>, a: T, b: T): (x: T) => T {\n  /**\n   * y² = x³ + ax + b: Short weierstrass curve formula. Takes x, returns y².\n   * @returns y²\n   */\n  function weierstrassEquation(x: T): T {\n    const x2 = Fp.sqr(x); // x * x\n    const x3 = Fp.mul(x2, x); // x² * x\n    return Fp.add(Fp.add(x3, Fp.mul(x, a)), b); // x³ + a * x + b\n  }\n  return weierstrassEquation;\n}\nfunction _weierstrass_new_output_to_legacy<T>(\n  c: CurvePointsType<T>,\n  Point: WeierstrassPointCons<T>\n): CurvePointsRes<T> {\n  const { Fp, Fn } = Point;\n  function isWithinCurveOrder(num: bigint): boolean {\n    return inRange(num, _1n, Fn.ORDER);\n  }\n  const weierstrassEquation = _legacyHelperEquat(Fp, c.a, c.b);\n  return Object.assign(\n    {},\n    {\n      CURVE: c,\n      Point: Point,\n      ProjectivePoint: Point,\n      normPrivateKeyToScalar: (key: PrivKey) => _normFnElement(Fn, key),\n      weierstrassEquation,\n      isWithinCurveOrder,\n    }\n  );\n}\nfunction _ecdsa_new_output_to_legacy(c: CurveType, _ecdsa: ECDSA): CurveFn {\n  const Point = _ecdsa.Point;\n  return Object.assign({}, _ecdsa, {\n    ProjectivePoint: Point,\n    CURVE: Object.assign({}, c, nLength(Point.Fn.ORDER, Point.Fn.BITS)),\n  });\n}\n\n// _ecdsa_legacy\nexport function weierstrass(c: CurveType): CurveFn {\n  const { CURVE, curveOpts, hash, ecdsaOpts } = _ecdsa_legacy_opts_to_new(c);\n  const Point = weierstrassN(CURVE, curveOpts);\n  const signs = ecdsa(Point, hash, ecdsaOpts);\n  return _ecdsa_new_output_to_legacy(c, signs);\n}\n","/**\n * Utilities for short weierstrass curves, combined with noble-hashes.\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { type CurveFn, type CurveType, weierstrass } from './abstract/weierstrass.ts';\nimport type { CHash } from './utils.ts';\n\n/** connects noble-curves to noble-hashes */\nexport function getHash(hash: CHash): { hash: CHash } {\n  return { hash };\n}\n/** Same API as @noble/hashes, with ability to create curve with custom hash */\nexport type CurveDef = Readonly<Omit<CurveType, 'hash'>>;\nexport type CurveFnWithCreate = CurveFn & { create: (hash: CHash) => CurveFn };\n\n/** @deprecated use new `weierstrass()` and `ecdsa()` methods */\nexport function createCurve(curveDef: CurveDef, defHash: CHash): CurveFnWithCreate {\n  const create = (hash: CHash): CurveFn => weierstrass({ ...curveDef, hash: hash });\n  return { ...create(defHash), create };\n}\n","/**\n * SECG secp256k1. See [pdf](https://www.secg.org/sec2-v2.pdf).\n *\n * Belongs to Koblitz curves: it has efficiently-computable GLV endomorphism ψ,\n * check out {@link EndomorphismOpts}. Seems to be rigid (not backdoored).\n * @module\n */\n/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */\nimport { sha256 } from '@noble/hashes/sha2.js';\nimport { randomBytes } from '@noble/hashes/utils.js';\nimport { createCurve, type CurveFnWithCreate } from './_shortw_utils.ts';\nimport type { CurveLengths } from './abstract/curve.ts';\nimport {\n  createHasher,\n  type H2CHasher,\n  type H2CMethod,\n  isogenyMap,\n} from './abstract/hash-to-curve.ts';\nimport { Field, mapHashToField, mod, pow2 } from './abstract/modular.ts';\nimport {\n  _normFnElement,\n  type EndomorphismOpts,\n  mapToCurveSimpleSWU,\n  type WeierstrassPoint as PointType,\n  type WeierstrassOpts,\n  type WeierstrassPointCons,\n} from './abstract/weierstrass.ts';\nimport type { Hex, PrivKey } from './utils.ts';\nimport {\n  bytesToNumberBE,\n  concatBytes,\n  ensureBytes,\n  inRange,\n  numberToBytesBE,\n  utf8ToBytes,\n} from './utils.ts';\n\n// Seems like generator was produced from some seed:\n// `Point.BASE.multiply(Point.Fn.inv(2n, N)).toAffine().x`\n// // gives short x 0x3b78ce563f89a0ed9414f5aa28ad0d96d6795f9c63n\nconst secp256k1_CURVE: WeierstrassOpts<bigint> = {\n  p: BigInt('0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f'),\n  n: BigInt('0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141'),\n  h: BigInt(1),\n  a: BigInt(0),\n  b: BigInt(7),\n  Gx: BigInt('0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798'),\n  Gy: BigInt('0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8'),\n};\n\nconst secp256k1_ENDO: EndomorphismOpts = {\n  beta: BigInt('0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee'),\n  basises: [\n    [BigInt('0x3086d221a7d46bcde86c90e49284eb15'), -BigInt('0xe4437ed6010e88286f547fa90abfe4c3')],\n    [BigInt('0x114ca50f7a8e2f3f657c1108d9d44cfd8'), BigInt('0x3086d221a7d46bcde86c90e49284eb15')],\n  ],\n};\n\nconst _0n = /* @__PURE__ */ BigInt(0);\nconst _1n = /* @__PURE__ */ BigInt(1);\nconst _2n = /* @__PURE__ */ BigInt(2);\n\n/**\n * √n = n^((p+1)/4) for fields p = 3 mod 4. We unwrap the loop and multiply bit-by-bit.\n * (P+1n/4n).toString(2) would produce bits [223x 1, 0, 22x 1, 4x 0, 11, 00]\n */\nfunction sqrtMod(y: bigint): bigint {\n  const P = secp256k1_CURVE.p;\n  // prettier-ignore\n  const _3n = BigInt(3), _6n = BigInt(6), _11n = BigInt(11), _22n = BigInt(22);\n  // prettier-ignore\n  const _23n = BigInt(23), _44n = BigInt(44), _88n = BigInt(88);\n  const b2 = (y * y * y) % P; // x^3, 11\n  const b3 = (b2 * b2 * y) % P; // x^7\n  const b6 = (pow2(b3, _3n, P) * b3) % P;\n  const b9 = (pow2(b6, _3n, P) * b3) % P;\n  const b11 = (pow2(b9, _2n, P) * b2) % P;\n  const b22 = (pow2(b11, _11n, P) * b11) % P;\n  const b44 = (pow2(b22, _22n, P) * b22) % P;\n  const b88 = (pow2(b44, _44n, P) * b44) % P;\n  const b176 = (pow2(b88, _88n, P) * b88) % P;\n  const b220 = (pow2(b176, _44n, P) * b44) % P;\n  const b223 = (pow2(b220, _3n, P) * b3) % P;\n  const t1 = (pow2(b223, _23n, P) * b22) % P;\n  const t2 = (pow2(t1, _6n, P) * b2) % P;\n  const root = pow2(t2, _2n, P);\n  if (!Fpk1.eql(Fpk1.sqr(root), y)) throw new Error('Cannot find square root');\n  return root;\n}\n\nconst Fpk1 = Field(secp256k1_CURVE.p, { sqrt: sqrtMod });\n\n/**\n * secp256k1 curve, ECDSA and ECDH methods.\n *\n * Field: `2n**256n - 2n**32n - 2n**9n - 2n**8n - 2n**7n - 2n**6n - 2n**4n - 1n`\n *\n * @example\n * ```js\n * import { secp256k1 } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = secp256k1.keygen();\n * const msg = new TextEncoder().encode('hello');\n * const sig = secp256k1.sign(msg, secretKey);\n * const isValid = secp256k1.verify(sig, msg, publicKey) === true;\n * ```\n */\nexport const secp256k1: CurveFnWithCreate = createCurve(\n  { ...secp256k1_CURVE, Fp: Fpk1, lowS: true, endo: secp256k1_ENDO },\n  sha256\n);\n\n// Schnorr signatures are superior to ECDSA from above. Below is Schnorr-specific BIP0340 code.\n// https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n/** An object mapping tags to their tagged hash prefix of [SHA256(tag) | SHA256(tag)] */\nconst TAGGED_HASH_PREFIXES: { [tag: string]: Uint8Array } = {};\nfunction taggedHash(tag: string, ...messages: Uint8Array[]): Uint8Array {\n  let tagP = TAGGED_HASH_PREFIXES[tag];\n  if (tagP === undefined) {\n    const tagH = sha256(utf8ToBytes(tag));\n    tagP = concatBytes(tagH, tagH);\n    TAGGED_HASH_PREFIXES[tag] = tagP;\n  }\n  return sha256(concatBytes(tagP, ...messages));\n}\n\n// ECDSA compact points are 33-byte. Schnorr is 32: we strip first byte 0x02 or 0x03\nconst pointToBytes = (point: PointType<bigint>) => point.toBytes(true).slice(1);\nconst Pointk1 = /* @__PURE__ */ (() => secp256k1.Point)();\nconst hasEven = (y: bigint) => y % _2n === _0n;\n\n// Calculate point, scalar and bytes\nfunction schnorrGetExtPubKey(priv: PrivKey) {\n  const { Fn, BASE } = Pointk1;\n  const d_ = _normFnElement(Fn, priv);\n  const p = BASE.multiply(d_); // P = d'⋅G; 0 < d' < n check is done inside\n  const scalar = hasEven(p.y) ? d_ : Fn.neg(d_);\n  return { scalar, bytes: pointToBytes(p) };\n}\n/**\n * lift_x from BIP340. Convert 32-byte x coordinate to elliptic curve point.\n * @returns valid point checked for being on-curve\n */\nfunction lift_x(x: bigint): PointType<bigint> {\n  const Fp = Fpk1;\n  if (!Fp.isValidNot0(x)) throw new Error('invalid x: Fail if x ≥ p');\n  const xx = Fp.create(x * x);\n  const c = Fp.create(xx * x + BigInt(7)); // Let c = x³ + 7 mod p.\n  let y = Fp.sqrt(c); // Let y = c^(p+1)/4 mod p. Same as sqrt().\n  // Return the unique point P such that x(P) = x and\n  // y(P) = y if y mod 2 = 0 or y(P) = p-y otherwise.\n  if (!hasEven(y)) y = Fp.neg(y);\n  const p = Pointk1.fromAffine({ x, y });\n  p.assertValidity();\n  return p;\n}\nconst num = bytesToNumberBE;\n/**\n * Create tagged hash, convert it to bigint, reduce modulo-n.\n */\nfunction challenge(...args: Uint8Array[]): bigint {\n  return Pointk1.Fn.create(num(taggedHash('BIP0340/challenge', ...args)));\n}\n\n/**\n * Schnorr public key is just `x` coordinate of Point as per BIP340.\n */\nfunction schnorrGetPublicKey(secretKey: Hex): Uint8Array {\n  return schnorrGetExtPubKey(secretKey).bytes; // d'=int(sk). Fail if d'=0 or d'≥n. Ret bytes(d'⋅G)\n}\n\n/**\n * Creates Schnorr signature as per BIP340. Verifies itself before returning anything.\n * auxRand is optional and is not the sole source of k generation: bad CSPRNG won't be dangerous.\n */\nfunction schnorrSign(message: Hex, secretKey: PrivKey, auxRand: Hex = randomBytes(32)): Uint8Array {\n  const { Fn } = Pointk1;\n  const m = ensureBytes('message', message);\n  const { bytes: px, scalar: d } = schnorrGetExtPubKey(secretKey); // checks for isWithinCurveOrder\n  const a = ensureBytes('auxRand', auxRand, 32); // Auxiliary random data a: a 32-byte array\n  const t = Fn.toBytes(d ^ num(taggedHash('BIP0340/aux', a))); // Let t be the byte-wise xor of bytes(d) and hash/aux(a)\n  const rand = taggedHash('BIP0340/nonce', t, px, m); // Let rand = hash/nonce(t || bytes(P) || m)\n  // Let k' = int(rand) mod n. Fail if k' = 0. Let R = k'⋅G\n  const { bytes: rx, scalar: k } = schnorrGetExtPubKey(rand);\n  const e = challenge(rx, px, m); // Let e = int(hash/challenge(bytes(R) || bytes(P) || m)) mod n.\n  const sig = new Uint8Array(64); // Let sig = bytes(R) || bytes((k + ed) mod n).\n  sig.set(rx, 0);\n  sig.set(Fn.toBytes(Fn.create(k + e * d)), 32);\n  // If Verify(bytes(P), m, sig) (see below) returns failure, abort\n  if (!schnorrVerify(sig, m, px)) throw new Error('sign: Invalid signature produced');\n  return sig;\n}\n\n/**\n * Verifies Schnorr signature.\n * Will swallow errors & return false except for initial type validation of arguments.\n */\nfunction schnorrVerify(signature: Hex, message: Hex, publicKey: Hex): boolean {\n  const { Fn, BASE } = Pointk1;\n  const sig = ensureBytes('signature', signature, 64);\n  const m = ensureBytes('message', message);\n  const pub = ensureBytes('publicKey', publicKey, 32);\n  try {\n    const P = lift_x(num(pub)); // P = lift_x(int(pk)); fail if that fails\n    const r = num(sig.subarray(0, 32)); // Let r = int(sig[0:32]); fail if r ≥ p.\n    if (!inRange(r, _1n, secp256k1_CURVE.p)) return false;\n    const s = num(sig.subarray(32, 64)); // Let s = int(sig[32:64]); fail if s ≥ n.\n    if (!inRange(s, _1n, secp256k1_CURVE.n)) return false;\n    // int(challenge(bytes(r)||bytes(P)||m))%n\n    const e = challenge(Fn.toBytes(r), pointToBytes(P), m);\n    // R = s⋅G - e⋅P, where -eP == (n-e)P\n    const R = BASE.multiplyUnsafe(s).add(P.multiplyUnsafe(Fn.neg(e)));\n    const { x, y } = R.toAffine();\n    // Fail if is_infinite(R) / not has_even_y(R) / x(R) ≠ r.\n    if (R.is0() || !hasEven(y) || x !== r) return false;\n    return true;\n  } catch (error) {\n    return false;\n  }\n}\n\nexport type SecpSchnorr = {\n  keygen: (seed?: Uint8Array) => { secretKey: Uint8Array; publicKey: Uint8Array };\n  getPublicKey: typeof schnorrGetPublicKey;\n  sign: typeof schnorrSign;\n  verify: typeof schnorrVerify;\n  Point: WeierstrassPointCons<bigint>;\n  utils: {\n    randomSecretKey: (seed?: Uint8Array) => Uint8Array;\n    pointToBytes: (point: PointType<bigint>) => Uint8Array;\n    lift_x: typeof lift_x;\n    taggedHash: typeof taggedHash;\n\n    /** @deprecated use `randomSecretKey` */\n    randomPrivateKey: (seed?: Uint8Array) => Uint8Array;\n    /** @deprecated use `utils` */\n    numberToBytesBE: typeof numberToBytesBE;\n    /** @deprecated use `utils` */\n    bytesToNumberBE: typeof bytesToNumberBE;\n    /** @deprecated use `modular` */\n    mod: typeof mod;\n  };\n  lengths: CurveLengths;\n};\n/**\n * Schnorr signatures over secp256k1.\n * https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki\n * @example\n * ```js\n * import { schnorr } from '@noble/curves/secp256k1';\n * const { secretKey, publicKey } = schnorr.keygen();\n * // const publicKey = schnorr.getPublicKey(secretKey);\n * const msg = new TextEncoder().encode('hello');\n * const sig = schnorr.sign(msg, secretKey);\n * const isValid = schnorr.verify(sig, msg, publicKey);\n * ```\n */\nexport const schnorr: SecpSchnorr = /* @__PURE__ */ (() => {\n  const size = 32;\n  const seedLength = 48;\n  const randomSecretKey = (seed = randomBytes(seedLength)): Uint8Array => {\n    return mapHashToField(seed, secp256k1_CURVE.n);\n  };\n  // TODO: remove\n  secp256k1.utils.randomSecretKey;\n  function keygen(seed?: Uint8Array) {\n    const secretKey = randomSecretKey(seed);\n    return { secretKey, publicKey: schnorrGetPublicKey(secretKey) };\n  }\n  return {\n    keygen,\n    getPublicKey: schnorrGetPublicKey,\n    sign: schnorrSign,\n    verify: schnorrVerify,\n    Point: Pointk1,\n    utils: {\n      randomSecretKey: randomSecretKey,\n      randomPrivateKey: randomSecretKey,\n      taggedHash,\n\n      // TODO: remove\n      lift_x,\n      pointToBytes,\n      numberToBytesBE,\n      bytesToNumberBE,\n      mod,\n    },\n    lengths: {\n      secretKey: size,\n      publicKey: size,\n      publicKeyHasPrefix: false,\n      signature: size * 2,\n      seed: seedLength,\n    },\n  };\n})();\n\nconst isoMap = /* @__PURE__ */ (() =>\n  isogenyMap(\n    Fpk1,\n    [\n      // xNum\n      [\n        '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa8c7',\n        '0x7d3d4c80bc321d5b9f315cea7fd44c5d595d2fc0bf63b92dfff1044f17c6581',\n        '0x534c328d23f234e6e2a413deca25caece4506144037c40314ecbd0b53d9dd262',\n        '0x8e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38e38daaaaa88c',\n      ],\n      // xDen\n      [\n        '0xd35771193d94918a9ca34ccbb7b640dd86cd409542f8487d9fe6b745781eb49b',\n        '0xedadc6f64383dc1df7c4b2d51b54225406d36b641f5e41bbc52a56612a8c6d14',\n        '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n      ],\n      // yNum\n      [\n        '0x4bda12f684bda12f684bda12f684bda12f684bda12f684bda12f684b8e38e23c',\n        '0xc75e0c32d5cb7c0fa9d0a54b12a0a6d5647ab046d686da6fdffc90fc201d71a3',\n        '0x29a6194691f91a73715209ef6512e576722830a201be2018a765e85a9ecee931',\n        '0x2f684bda12f684bda12f684bda12f684bda12f684bda12f684bda12f38e38d84',\n      ],\n      // yDen\n      [\n        '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffff93b',\n        '0x7a06534bb8bdb49fd5e9e6632722c2989467c1bfc8e8d978dfb425d2685c2573',\n        '0x6484aa716545ca2cf3a70c3fa8fe337e0a3d21162f0d6299a7bf8192bfd2a76f',\n        '0x0000000000000000000000000000000000000000000000000000000000000001', // LAST 1\n      ],\n    ].map((i) => i.map((j) => BigInt(j))) as [bigint[], bigint[], bigint[], bigint[]]\n  ))();\nconst mapSWU = /* @__PURE__ */ (() =>\n  mapToCurveSimpleSWU(Fpk1, {\n    A: BigInt('0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533'),\n    B: BigInt('1771'),\n    Z: Fpk1.create(BigInt('-11')),\n  }))();\n\n/** Hashing / encoding to secp256k1 points / field. RFC 9380 methods. */\nexport const secp256k1_hasher: H2CHasher<bigint> = /* @__PURE__ */ (() =>\n  createHasher(\n    secp256k1.Point,\n    (scalars: bigint[]) => {\n      const { x, y } = mapSWU(Fpk1.create(scalars[0]));\n      return isoMap(x, y);\n    },\n    {\n      DST: 'secp256k1_XMD:SHA-256_SSWU_RO_',\n      encodeDST: 'secp256k1_XMD:SHA-256_SSWU_NU_',\n      p: Fpk1.ORDER,\n      m: 1,\n      k: 128,\n      expand: 'xmd',\n      hash: sha256,\n    }\n  ))();\n\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nexport const hashToCurve: H2CMethod<bigint> = /* @__PURE__ */ (() =>\n  secp256k1_hasher.hashToCurve)();\n\n/** @deprecated use `import { secp256k1_hasher } from '@noble/curves/secp256k1.js';` */\nexport const encodeToCurve: H2CMethod<bigint> = /* @__PURE__ */ (() =>\n  secp256k1_hasher.encodeToCurve)();\n",null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,"import type { EvmSigner } from '@moonbeam-network/xcm-sdk';\nimport type { EvmChain, EvmParachain } from '@moonbeam-network/xcm-types';\nimport type {\n  Chain,\n  Network,\n  SignAndSendSigner,\n  SignedTx,\n  UnsignedTransaction,\n} from '@wormhole-foundation/sdk-connect';\nimport {\n  type Address,\n  createPublicClient,\n  type HttpTransport,\n  http,\n  type PublicClient,\n} from 'viem';\n\nexport class WormholeWagmiSigner<\n  N extends Network = Network,\n  C extends Chain = Chain,\n> implements SignAndSendSigner<N, C>\n{\n  readonly #chain: EvmChain | EvmParachain;\n\n  readonly #signer: EvmSigner;\n\n  readonly #publicClient: PublicClient<HttpTransport>;\n\n  constructor(chain: EvmChain | EvmParachain, signer: EvmSigner) {\n    this.#chain = chain;\n    this.#signer = signer;\n    this.#publicClient = createPublicClient({\n      chain: chain.getViemChain(),\n      transport: http(),\n    });\n  }\n\n  chain(): C {\n    // biome-ignore lint/suspicious/noExplicitAny: need to fix types\n    return this.#chain.getWormholeName() as any as C;\n  }\n\n  address(): Address {\n    const address = this.#signer.account?.address;\n\n    if (!address) {\n      throw new Error(\n        `${WormholeWagmiSigner.name}: Account address is not set in signer`,\n      );\n    }\n\n    return address;\n  }\n\n  async signAndSend(\n    transactions: UnsignedTransaction<Network, Chain>[],\n  ): Promise<SignedTx[]> {\n    const signed = [];\n    const signerChainID = await this.#signer.getChainId();\n\n    let nonce = await this.#publicClient.getTransactionCount({\n      address: this.address(),\n    });\n\n    for (const tx of transactions) {\n      const { transaction, description, parallelizable } = tx;\n      console.log(\n        `Signing: ${description} for ${this.address()}, chainId: ${signerChainID}`,\n      );\n\n      const signedTx = await this.#signer.sendTransaction({\n        ...transaction,\n        nonce,\n        retryCount: 5,\n      });\n\n      if (parallelizable === false) {\n        try {\n          await this.#publicClient.waitForTransactionReceipt({\n            hash: signedTx,\n          });\n        } catch (error) {\n          throw new Error(\n            `${WormholeWagmiSigner.name}: Error waiting for transaction, tx: ${signedTx}`,\n            { cause: error },\n          );\n        }\n      }\n\n      signed.push(signedTx);\n\n      nonce += 1;\n    }\n\n    return signed;\n  }\n}\n","import {\n  ContractConfig,\n  ExtrinsicConfig,\n  SnowbridgeConfig,\n  WormholeConfig,\n} from '@moonbeam-network/xcm-builder';\nimport type { MrlAssetRoute } from '@moonbeam-network/xcm-config';\nimport {\n  convertToChainDecimals,\n  EvmService,\n  getDestinationData,\n  PolkadotService,\n} from '@moonbeam-network/xcm-sdk';\nimport {\n  AssetAmount,\n  EvmChain,\n  EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport { toBigInt } from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport type { TransferData, TransferParams } from '../mrl.interfaces';\nimport { SnowbridgeService } from '../services/snowbridge';\nimport { WormholeService } from '../services/wormhole';\nimport { getBridgeChainData } from './getBridgeChainData';\nimport { getSourceData } from './getSourceData';\nimport {\n  buildTransfer,\n  getBridgeChainFeeValueOnSource,\n  getMrlMin,\n} from './getTransferData.utils';\n\ninterface GetTransferDataParams {\n  route: MrlAssetRoute;\n  sourceAddress: string;\n  destinationAddress: string;\n  isAutomatic: boolean;\n}\n\nexport async function getTransferData({\n  route,\n  sourceAddress,\n  destinationAddress,\n  isAutomatic,\n}: GetTransferDataParams): Promise<TransferData> {\n  if (!route.mrl) {\n    throw new Error(\n      `MrlConfigBuilder is not defined for source chain ${route.source.chain.name} and asset ${route.source.asset.originSymbol}`,\n    );\n  }\n\n  const destinationData = await getDestinationData({\n    route,\n    destinationAddress,\n  });\n\n  // NOTE: Here we need to convert the fee on the destination chain\n  // to an asset on source chain.\n  const destinationFee = convertToChainDecimals({\n    asset: destinationData.fee,\n    target: route.getDestinationFeeAssetOnSource(),\n  });\n\n  const bridgeChainData = await getBridgeChainData({\n    route,\n    sourceAddress,\n    destinationAddress,\n  });\n\n  const sourceData = await getSourceData({\n    isAutomatic: route.mrl.isAutomaticPossible && isAutomatic,\n    route,\n    destinationAddress,\n    destinationFee,\n    sourceAddress,\n    bridgeChainData,\n  });\n\n  return {\n    destination: destinationData,\n    getEstimate(amount: number | string) {\n      const isSameAssetPayingDestinationFee =\n        sourceData.balance.isSame(destinationFee);\n      const bigAmount = Big(\n        toBigInt(amount, sourceData.balance.decimals).toString(),\n      );\n      const fee = getBridgeChainFeeValueOnSource({\n        destinationData,\n        bridgeChainData,\n        sourceData,\n      });\n      const result = bigAmount\n        .minus(\n          isSameAssetPayingDestinationFee ? destinationFee.toBig() : Big(0),\n        )\n        .minus(fee)\n        .minus(sourceData.extraFees.remote?.fee.toBig() || Big(0));\n\n      return sourceData.balance.copyWith({\n        amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n      });\n    },\n    isAutomaticPossible: route.mrl.isAutomaticPossible,\n    max: sourceData.max,\n    min: getMrlMin({\n      destinationData,\n      bridgeChainData,\n      sourceData,\n    }),\n    bridgeChain: bridgeChainData,\n    source: sourceData,\n    async transfer({\n      amount,\n      isAutomatic,\n      signers: { evmSigner, polkadotSigner },\n      statusCallback,\n      sendOnlyRemoteExecution,\n    }: TransferParams): Promise<string[]> {\n      const source = route.source.chain;\n\n      const bigintAmount = toBigInt(amount, sourceData.balance.decimals);\n      const asset = AssetAmount.fromChainAsset(\n        route.source.chain.getChainAsset(route.source.asset),\n        { amount: bigintAmount },\n      );\n      const feeAsset = AssetAmount.fromChainAsset(\n        route.source.chain.getChainAsset(\n          route.source.fee?.asset || route.source.asset,\n        ),\n        { amount: sourceData.fee.amount },\n      );\n      const transfer = await buildTransfer({\n        asset,\n        protocolFee: sourceData.extraFees.local?.fee,\n        bridgeChainFee: bridgeChainData.fee,\n        destinationAddress,\n        feeAsset,\n        isAutomatic,\n        route,\n        sendOnlyRemoteExecution,\n        sourceAddress,\n      });\n\n      if (\n        ContractConfig.is(transfer) &&\n        (EvmChain.is(source) || EvmParachain.is(source))\n      ) {\n        if (!evmSigner) {\n          throw new Error('EVM Signer must be provided');\n        }\n\n        const evm = EvmService.create(source);\n        const hash = await evm.transfer(evmSigner, transfer);\n\n        return [hash];\n      }\n\n      if (ExtrinsicConfig.is(transfer) && EvmParachain.isAnyParachain(source)) {\n        if (!polkadotSigner) {\n          throw new Error('Polkadot signer must be provided');\n        }\n\n        const polkadot = await PolkadotService.create(source);\n        const hash = await polkadot.transfer(\n          sourceAddress,\n          transfer,\n          polkadotSigner,\n          statusCallback,\n        );\n\n        return [hash];\n      }\n\n      if (\n        WormholeConfig.is(transfer) &&\n        (EvmChain.is(source) || EvmParachain.is(source))\n      ) {\n        if (!evmSigner) {\n          throw new Error('EVM Signer must be provided');\n        }\n\n        const wh = WormholeService.create(source);\n\n        return wh.transfer(evmSigner, transfer);\n      }\n\n      if (\n        SnowbridgeConfig.is(transfer) &&\n        (EvmChain.is(source) || EvmParachain.is(source))\n      ) {\n        if (!evmSigner) {\n          throw new Error('EVM Signer must be provided');\n        }\n\n        const snowbridge = SnowbridgeService.create(source);\n        const hash = await snowbridge.transfer(evmSigner, transfer);\n\n        return [hash];\n      }\n\n      throw new Error('Either contract or extrinsic must be provided');\n    },\n  };\n}\n","import {\n  ContractConfig,\n  ERC20_ABI,\n  GATEWAY_ABI,\n  type SnowbridgeConfig,\n} from '@moonbeam-network/xcm-builder';\nimport {\n  EvmService,\n  type EvmSigner,\n  getAllowanceSlot,\n  MAX_ALLOWANCE_HEX,\n} from '@moonbeam-network/xcm-sdk';\nimport { type AnyChain, EvmChain } from '@moonbeam-network/xcm-types';\nimport { isEthAddress } from '@moonbeam-network/xcm-utils';\nimport { u8aToHex } from '@polkadot/util';\nimport { decodeAddress } from '@polkadot/util-crypto';\nimport { type Address, encodeFunctionData, type Hash } from 'viem';\n\nexport class SnowbridgeService {\n  readonly chain: EvmChain;\n\n  readonly #evmService: EvmService;\n\n  readonly #gatewayAddress: string;\n\n  static create(chain: AnyChain): SnowbridgeService {\n    return new SnowbridgeService(chain);\n  }\n\n  constructor(chain: AnyChain) {\n    if (!EvmChain.is(chain) || !chain.contracts?.Gateway) {\n      throw new Error(\n        'Chain must be an EVMChain with the Gateway contract address configured for Snowbridge operations',\n      );\n    }\n\n    this.chain = chain;\n    this.#gatewayAddress = chain.contracts.Gateway;\n    this.#evmService = EvmService.create(chain);\n  }\n\n  async checkAllowance(\n    ownerAddress: string,\n    tokenAddress: string,\n    spenderAddress: string,\n  ): Promise<bigint> {\n    const allowance = await this.#evmService.client.readContract({\n      abi: ERC20_ABI,\n      address: tokenAddress as Address,\n      args: [ownerAddress as Address, spenderAddress as Address],\n      functionName: 'allowance',\n    });\n\n    if (typeof allowance !== 'bigint') {\n      throw new Error(\n        `Could not get allowance on ${this.chain.name} for token ${tokenAddress}`,\n      );\n    }\n\n    return allowance;\n  }\n\n  async transfer(signer: EvmSigner, transfer: SnowbridgeConfig): Promise<Hash> {\n    const { args } = transfer;\n    const { tokenAddress, amount, requiresApproval } = args;\n\n    if (!signer.account) {\n      throw new Error('Signer account is required');\n    }\n\n    const contract = this.buildContractConfig(transfer);\n\n    if (!requiresApproval) {\n      return await this.#evmService.transfer(signer, contract);\n    }\n\n    const currentAllowance = await this.checkAllowance(\n      signer.account.address,\n      tokenAddress,\n      this.#gatewayAddress,\n    );\n\n    if (currentAllowance < amount) {\n      await this.approve(signer, tokenAddress, this.#gatewayAddress, amount);\n    }\n\n    return await this.#evmService.transfer(signer, contract);\n  }\n\n  private buildContractConfig(transfer: SnowbridgeConfig): ContractConfig {\n    const { args } = transfer;\n    const {\n      tokenAddress,\n      destinationAddress,\n      destinationParaId,\n      amount,\n      bridgeChainFee,\n      value,\n    } = args;\n\n    const isEthereumDestination = isEthAddress(destinationAddress);\n    // Snowbridge MultiAddress.Kind enum (Index, Address32, Address20):\n    // - Address20 (kind = 2) is used for EVM/H160 addresses\n    // - Address32 (kind = 1) is used for Substrate AccountId32\n    const destination = isEthereumDestination\n      ? { kind: 2, data: destinationAddress }\n      : { kind: 1, data: u8aToHex(decodeAddress(destinationAddress)) };\n\n    const contractArgs = [\n      tokenAddress,\n      destinationParaId,\n      destination,\n      bridgeChainFee,\n      amount,\n    ];\n\n    return new ContractConfig({\n      address: this.#gatewayAddress,\n      abi: GATEWAY_ABI,\n      args: contractArgs,\n      func: 'sendToken',\n      value,\n      module: 'Gateway',\n    });\n  }\n\n  private async approve(\n    signer: EvmSigner,\n    tokenAddress: string,\n    spenderAddress: string,\n    amount: bigint,\n  ): Promise<Hash> {\n    const { request } = await this.#evmService.client.simulateContract({\n      abi: ERC20_ABI,\n      account: signer.account,\n      address: tokenAddress as Address,\n      functionName: 'approve',\n      args: [spenderAddress as Address, amount],\n    });\n\n    const hash = await signer.writeContract(request);\n\n    await this.#evmService.client.waitForTransactionReceipt({\n      hash,\n    });\n\n    return hash;\n  }\n\n  async getFee(\n    address: string,\n    transfer: SnowbridgeConfig,\n    allowanceSlot?: number,\n  ): Promise<bigint> {\n    const { args } = transfer;\n    const { tokenAddress, amount, requiresApproval } = args;\n\n    const contract = this.buildContractConfig(transfer);\n    if (!requiresApproval) {\n      return await this.#evmService.getFee(address, contract);\n    }\n\n    const currentAllowance = await this.checkAllowance(\n      address,\n      tokenAddress,\n      this.#gatewayAddress,\n    );\n\n    if (currentAllowance >= amount) {\n      return await this.#evmService.getFee(address, contract);\n    }\n\n    return await this.estimateApproveAndSendFee(\n      address,\n      transfer,\n      allowanceSlot,\n    );\n  }\n\n  private async estimateApproveAndSendFee(\n    address: string,\n    transfer: SnowbridgeConfig,\n    allowanceSlotNumber?: number,\n  ): Promise<bigint> {\n    const { args } = transfer;\n    const { tokenAddress, amount } = args;\n\n    if (!allowanceSlotNumber) {\n      throw new Error(\n        'Allowance slot is required to calculate the fee for approve and send',\n      );\n    }\n\n    const contract = this.buildContractConfig(transfer);\n\n    try {\n      const approveData = encodeFunctionData({\n        abi: ERC20_ABI,\n        functionName: 'approve',\n        args: [this.#gatewayAddress as Address, amount],\n      });\n\n      const approveGas = await this.#evmService.client.estimateGas({\n        account: address as Address,\n        to: tokenAddress as Address,\n        data: approveData,\n      });\n      const allowanceSlot = getAllowanceSlot(\n        address,\n        this.#gatewayAddress,\n        allowanceSlotNumber,\n      );\n\n      const sendFee = await this.#evmService.getFee(address, contract, [\n        {\n          address: tokenAddress as Address,\n          stateDiff: [\n            {\n              slot: allowanceSlot,\n              value: MAX_ALLOWANCE_HEX,\n            },\n          ],\n        },\n      ]);\n\n      const gasPrice = await this.#evmService.client.getGasPrice();\n\n      return approveGas * gasPrice + sendFee;\n    } catch (error) {\n      console.error('Error estimating approve + send fee:', error);\n      return 0n;\n    }\n  }\n}\n","import type { MrlAssetRoute } from '@moonbeam-network/xcm-config';\nimport { getBalance, getDestinationFee } from '@moonbeam-network/xcm-sdk';\nimport { Parachain } from '@moonbeam-network/xcm-types';\nimport {\n  getMultilocationDerivedAddresses,\n  isEthAddress,\n} from '@moonbeam-network/xcm-utils';\nimport { evmToAddress } from '@polkadot/util-crypto';\nimport type { BridgeChainTransferData } from '../mrl.interfaces';\n\ninterface GetBridgeChainDataParams {\n  route: MrlAssetRoute;\n  sourceAddress: string;\n  destinationAddress: string;\n}\n\nexport async function getBridgeChainData({\n  route,\n  sourceAddress,\n  destinationAddress,\n}: GetBridgeChainDataParams): Promise<BridgeChainTransferData> {\n  if (!route.mrl) {\n    throw new Error(\n      `MRL config is not defined for source chain ${route.source.chain.name} and asset ${route.source.asset.originSymbol}`,\n    );\n  }\n\n  const bridgeChain = route.mrl.bridgeChain.chain;\n  const bridgeChainAddress = getBridgeChainAddress({\n    route,\n    sourceAddress,\n    destinationAddress,\n  });\n\n  const fee = await getDestinationFee({\n    address: bridgeChainAddress,\n    asset: route.source.asset,\n    destination: bridgeChain,\n    fee: route.mrl.bridgeChain.fee.amount,\n    feeAsset: route.mrl.bridgeChain.fee.asset,\n    source: route.source.chain,\n  });\n\n  const balance = await getBalance({\n    address: bridgeChainAddress,\n    asset: bridgeChain.getChainAsset(route.mrl.bridgeChain.asset),\n    builder: route.mrl.bridgeChain.balance,\n    chain: bridgeChain,\n  });\n\n  const feeBalance = await getBalance({\n    address: bridgeChainAddress,\n    asset: bridgeChain.getChainAsset(route.mrl.bridgeChain.fee.asset),\n    builder: route.mrl.bridgeChain.fee.balance,\n    chain: bridgeChain,\n  });\n\n  return {\n    address: bridgeChainAddress,\n    balance,\n    feeBalance,\n    chain: bridgeChain,\n    fee,\n  };\n}\n\ninterface GetBridgeChainAddressParams {\n  route: MrlAssetRoute;\n  sourceAddress: string;\n  destinationAddress: string;\n}\n\nexport function getBridgeChainAddress({\n  route,\n  sourceAddress,\n  destinationAddress,\n}: GetBridgeChainAddressParams): string {\n  const source = route.source.chain;\n  const destination = route.destination.chain;\n  const bridgeChain = route.mrl.bridgeChain.chain;\n  const isDestinationBridgeChain = bridgeChain.isEqual(destination);\n  const isSourceBridgeChain = bridgeChain.isEqual(source);\n\n  const isDifferentEcosystem = source.ecosystem !== bridgeChain.ecosystem;\n\n  let bridgeChainAddress = isDestinationBridgeChain\n    ? destinationAddress\n    : sourceAddress;\n\n  if (Parachain.isExactly(bridgeChain) && isEthAddress(bridgeChainAddress)) {\n    bridgeChainAddress = evmToAddress(bridgeChainAddress);\n    return bridgeChainAddress;\n  }\n\n  // for Parachain to EVM transactions, we use the computed origin account in the bridgeChain\n  if (Parachain.is(source) && !isSourceBridgeChain) {\n    const { address20: computedOriginAccount } =\n      getMultilocationDerivedAddresses({\n        address: sourceAddress,\n        paraId: source.parachainId,\n        parents: isDifferentEcosystem ? 2 : 1,\n      });\n\n    bridgeChainAddress = computedOriginAccount;\n  }\n\n  return bridgeChainAddress;\n}\n","import {\n  ContractConfig,\n  MrlBuilder,\n  type MrlTransferConfig,\n  type ProtocolFeeConfigBuilderParams,\n  Provider,\n  SnowbridgeConfig,\n  SubstrateQueryConfig,\n  WormholeConfig,\n} from '@moonbeam-network/xcm-builder';\nimport type {\n  FeeConfig,\n  MrlAssetRoute,\n  ProtocolFeeConfig,\n} from '@moonbeam-network/xcm-config';\nimport {\n  EvmService,\n  getAssetMin,\n  getBalance,\n  getContractFee,\n  getDestinationFeeBalance,\n  getExistentialDeposit,\n  getExtrinsicFee,\n  PolkadotService,\n} from '@moonbeam-network/xcm-sdk';\nimport {\n  type AnyChain,\n  type AnyParachain,\n  AssetAmount,\n  EvmChain,\n  type EvmParachain,\n} from '@moonbeam-network/xcm-types';\nimport { toBigInt } from '@moonbeam-network/xcm-utils';\nimport type {\n  BridgeChainTransferData,\n  MrlExtraFees,\n  SourceTransferData,\n} from '../mrl.interfaces';\nimport { SnowbridgeService } from '../services/snowbridge';\nimport { WormholeService } from '../services/wormhole';\nimport {\n  type BuildTransferParams,\n  buildTransfer,\n  getAmountForTransferSimulation,\n  getMrlBuilderParams,\n  getMrlMax,\n} from './getTransferData.utils';\n\ninterface GetSourceDataParams {\n  isAutomatic: boolean;\n  route: MrlAssetRoute;\n  destinationAddress: string;\n  destinationFee: AssetAmount;\n  sourceAddress: string;\n  bridgeChainData: BridgeChainTransferData;\n}\n\nexport async function getSourceData({\n  isAutomatic,\n  route,\n  destinationAddress,\n  destinationFee,\n  sourceAddress,\n  bridgeChainData,\n}: GetSourceDataParams): Promise<SourceTransferData> {\n  if (!route.mrl) {\n    throw new Error(\n      `MrlConfigBuilder is not defined for source chain ${route.source.chain.name} and asset ${route.source.asset.originSymbol}`,\n    );\n  }\n\n  const source = route.source.chain;\n  const destination = route.destination.chain;\n  const bridgeChain = route.mrl.bridgeChain.chain;\n  const asset = source.getChainAsset(route.source.asset);\n  const feeAsset = route.source.fee\n    ? source.getChainAsset(route.source.fee.asset)\n    : asset;\n\n  const balance = await getBalance({\n    address: sourceAddress,\n    asset,\n    builder: route.source.balance,\n    chain: source,\n  });\n\n  const feeBalance = route.source.fee\n    ? await getBalance({\n        address: sourceAddress,\n        asset: feeAsset,\n        builder: route.source.fee.balance,\n        chain: source,\n      })\n    : balance;\n\n  const destinationFeeBalance = await getDestinationFeeBalance({\n    balance,\n    feeBalance,\n    route,\n    sourceAddress,\n  });\n\n  const bridgeChainFeeBalance = await getBridgeChainFeeBalance({\n    balance,\n    feeBalance,\n    route,\n    sourceAddress,\n  });\n\n  const existentialDeposit = await getExistentialDeposit(source);\n\n  const min = await getAssetMin({\n    asset,\n    builder: route.source.min,\n    chain: source,\n  });\n\n  const protocolFee = await getProtocolFee({\n    source,\n    destination,\n    asset,\n    feeAsset,\n    balance,\n    protocolFee: route.source.protocolFee,\n    address: destinationAddress,\n    bridgeChain,\n    bridgeChainFee: bridgeChainData.fee,\n  });\n\n  const transfer = await buildTransfer({\n    asset: getAmountForTransferSimulation(balance, protocolFee),\n    protocolFee,\n    bridgeChainFee: bridgeChainData.fee,\n    destinationAddress,\n    feeAsset: feeBalance,\n    isAutomatic,\n    route,\n    sourceAddress,\n  });\n\n  const fee = await getFee({\n    balance,\n    chain: source,\n    destinationFee,\n    transfer,\n    feeBalance,\n    feeConfig: route.source.fee,\n    sourceAddress,\n  });\n\n  const extraFees = await getExtraFees({\n    chain: source,\n    transfer,\n    asset: balance,\n    feeAsset: feeBalance,\n    isAutomatic,\n    destinationAddress,\n    route,\n    sourceAddress,\n    bridgeChainFee: bridgeChainData.fee,\n    protocolFee,\n  });\n\n  const max = getMrlMax({\n    balance,\n    existentialDeposit,\n    fee,\n    min,\n    extraFees,\n  });\n\n  return {\n    balance,\n    chain: source,\n    destinationFee,\n    destinationFeeBalance,\n    bridgeChainFeeBalance,\n    existentialDeposit,\n    fee,\n    feeBalance,\n    max,\n    min,\n    extraFees,\n  };\n}\n\ninterface GetFeeParams {\n  balance: AssetAmount;\n  chain: AnyChain;\n  destinationFee: AssetAmount;\n  feeBalance: AssetAmount;\n  feeConfig?: FeeConfig;\n  sourceAddress: string;\n  transfer: MrlTransferConfig;\n}\n\ninterface GetRelayFeeParams extends BuildTransferParams {\n  chain: AnyChain;\n  transfer: MrlTransferConfig;\n}\n\ninterface GetWormholeFeeParams {\n  asset: AssetAmount;\n  chain: AnyChain;\n  config: MrlTransferConfig;\n}\n\nasync function getFee({\n  balance,\n  feeBalance,\n  chain,\n  destinationFee,\n  transfer,\n  feeConfig,\n  sourceAddress,\n}: GetFeeParams): Promise<AssetAmount> {\n  if (WormholeConfig.is(transfer)) {\n    // TODO\n    return AssetAmount.fromChainAsset(chain.getChainAsset(feeBalance), {\n      amount: 0n,\n    });\n  }\n\n  if (SnowbridgeConfig.is(transfer)) {\n    const snowbridge = SnowbridgeService.create(chain as EvmChain);\n    try {\n      const allowanceSlot = balance.ids?.allowanceSlot;\n      const feeAmount = await snowbridge.getFee(\n        sourceAddress,\n        transfer,\n        allowanceSlot,\n      );\n\n      return AssetAmount.fromChainAsset(chain.getChainAsset(feeBalance), {\n        amount: feeAmount,\n      });\n    } catch (error) {\n      console.error(error);\n      return feeBalance.copyWith({ amount: 0n });\n    }\n  }\n\n  if (ContractConfig.is(transfer)) {\n    try {\n      return getContractFee({\n        address: sourceAddress,\n        balance,\n        chain: chain as EvmChain | EvmParachain,\n        contract: transfer,\n        destinationFee,\n        feeBalance,\n        feeConfig,\n      });\n    } catch (error) {\n      // A lot of EVM chains throw an error if the account has not enough balance or similar situations\n      // So we return 0n here in MRL, so it doesn't affect regular XCM flow\n      console.error(error);\n      return feeBalance.copyWith({ amount: 0n });\n    }\n  }\n\n  return getExtrinsicFee({\n    address: sourceAddress,\n    balance,\n    chain: chain as AnyParachain,\n    extrinsic: transfer,\n    feeBalance,\n    feeConfig,\n  });\n}\n\nasync function getRelayerFee({\n  asset,\n  chain,\n  destinationAddress,\n  feeAsset,\n  isAutomatic,\n  route,\n  sourceAddress,\n  transfer,\n  bridgeChainFee,\n}: GetRelayFeeParams): Promise<AssetAmount | undefined> {\n  if (\n    route.mrl.transfer.provider === Provider.Snowbridge ||\n    SnowbridgeConfig.is(transfer)\n  ) {\n    return undefined;\n  }\n\n  if (WormholeConfig.is(transfer)) {\n    return getWormholeFee({ asset, chain, config: transfer });\n  }\n\n  if (route.mrl.transfer.provider === Provider.Wormhole) {\n    const builderParams = await getMrlBuilderParams({\n      asset,\n      destinationAddress,\n      feeAsset,\n      isAutomatic,\n      route,\n      sourceAddress,\n      bridgeChainFee,\n    });\n\n    const wormholeConfig = MrlBuilder()\n      .wormhole()\n      .wormhole()\n      .tokenTransfer()\n      .build(builderParams);\n\n    return getWormholeFee({ asset, chain, config: wormholeConfig });\n  }\n\n  return;\n}\n\nasync function getWormholeFee({\n  asset,\n  chain,\n  config,\n}: GetWormholeFeeParams): Promise<AssetAmount | undefined> {\n  if (WormholeConfig.is(config)) {\n    const safetyAmount = toBigInt(0.000001, asset.decimals);\n\n    const wh = WormholeService.create(chain as EvmChain | EvmParachain);\n    const fee = await wh.getFee(config);\n\n    return AssetAmount.fromChainAsset(chain.getChainAsset(asset), {\n      amount: fee?.relayFee ? fee.relayFee.amount + safetyAmount : 0n,\n    });\n  }\n\n  return;\n}\n\ninterface GetBridgeChainFeeBalanceParams {\n  balance: AssetAmount;\n  feeBalance: AssetAmount;\n  route: MrlAssetRoute;\n  sourceAddress: string;\n}\n\nasync function getBridgeChainFeeBalance({\n  balance,\n  feeBalance,\n  route,\n  sourceAddress,\n}: GetBridgeChainFeeBalanceParams): Promise<AssetAmount | undefined> {\n  if (!route.source.bridgeChainFee) {\n    return undefined;\n  }\n\n  if (route.mrl?.bridgeChain.fee.asset.isEqual(balance)) {\n    return balance;\n  }\n\n  if (route.mrl?.bridgeChain.fee.asset.isEqual(feeBalance)) {\n    return feeBalance;\n  }\n\n  if (!route.source.bridgeChainFee.balance) {\n    throw new Error(\n      'BalanceBuilder must be defined for source.bridgeChainFee.balance for MrlAssetRoute',\n    );\n  }\n\n  return getBalance({\n    address: sourceAddress,\n    asset: route.source.chain.getChainAsset(route.source.bridgeChainFee.asset),\n    builder: route.source.bridgeChainFee.balance,\n    chain: route.source.chain,\n  });\n}\n\ninterface GetProtocolFeeParams extends ProtocolFeeConfigBuilderParams {\n  protocolFee?: ProtocolFeeConfig;\n  bridgeChain: AnyParachain;\n  bridgeChainFee: AssetAmount;\n}\n\nasync function getProtocolFee({\n  address,\n  asset,\n  balance,\n  protocolFee,\n  destination,\n  source,\n  bridgeChain,\n  bridgeChainFee,\n}: GetProtocolFeeParams): Promise<AssetAmount | undefined> {\n  if (!protocolFee) {\n    return undefined;\n  }\n\n  const protocolFeeAsset = source.getChainAsset(protocolFee.asset);\n\n  if (typeof protocolFee.amount === 'number') {\n    return AssetAmount.fromChainAsset(protocolFeeAsset, {\n      amount: protocolFee.amount,\n    });\n  }\n\n  const config = protocolFee?.amount?.build({\n    address,\n    asset,\n    feeAsset: protocolFeeAsset,\n    balance,\n    destination,\n    source,\n    bridgeChainFee,\n  });\n\n  if (ContractConfig.is(config) && EvmChain.is(source)) {\n    const evm = EvmService.create(source);\n\n    const amount = await evm.read(config);\n\n    if (typeof amount !== 'bigint') {\n      throw new Error(\n        `Error getting bridge fee: expected bigint from contract call, but received ${typeof amount}. `,\n      );\n    }\n\n    return AssetAmount.fromChainAsset(protocolFeeAsset, {\n      amount,\n    });\n  }\n\n  // Calculations are done on the bridge chain\n  if (SubstrateQueryConfig.is(config)) {\n    const polkadot = await PolkadotService.create(bridgeChain);\n    const amount = await polkadot.query(config);\n    return AssetAmount.fromChainAsset(protocolFeeAsset, {\n      amount,\n    });\n  }\n\n  return AssetAmount.fromChainAsset(protocolFeeAsset, {\n    amount: 0n,\n  });\n}\n\ninterface GetExtraFeesParams extends BuildTransferParams {\n  chain: AnyChain;\n  transfer: MrlTransferConfig;\n  protocolFee: AssetAmount | undefined;\n}\n\nasync function getExtraFees({\n  asset,\n  chain,\n  destinationAddress,\n  feeAsset,\n  isAutomatic,\n  route,\n  sourceAddress,\n  transfer,\n  bridgeChainFee,\n  protocolFee,\n}: GetExtraFeesParams): Promise<MrlExtraFees> {\n  const relayerFee = await getRelayerFee({\n    chain,\n    transfer,\n    asset,\n    feeAsset,\n    isAutomatic,\n    destinationAddress,\n    route,\n    sourceAddress,\n    bridgeChainFee,\n  });\n\n  const protocolFeeConfig = route.source.protocolFee;\n\n  const protocolFeeBalance = protocolFeeConfig\n    ? await getBalance({\n        address: sourceAddress,\n        asset: chain.getChainAsset(protocolFeeConfig.asset),\n        builder: protocolFeeConfig.balance,\n        chain,\n      })\n    : undefined;\n\n  const localFee =\n    protocolFee && protocolFeeBalance\n      ? { fee: protocolFee, balance: protocolFeeBalance }\n      : undefined;\n\n  const remoteFee = relayerFee\n    ? { fee: relayerFee, balance: asset }\n    : undefined;\n\n  return {\n    local: localFee,\n    remote: remoteFee,\n  };\n}\n","import {\n  BATCH_CONTRACT_ABI,\n  BATCH_CONTRACT_ADDRESS,\n  type ContractConfig,\n  ERC20_ABI,\n  type ExtrinsicConfig,\n  MrlBuilder,\n  type MrlBuilderParams,\n  Provider,\n  type Transact,\n} from '@moonbeam-network/xcm-builder';\nimport {\n  type MrlAssetRoute,\n  moonbaseAlpha,\n  moonbeam,\n  moonriver,\n} from '@moonbeam-network/xcm-config';\nimport {\n  convertToChainDecimals,\n  type DestinationChainTransferData,\n  type GetMaxParams,\n  getMax,\n  getMin,\n  PolkadotService,\n} from '@moonbeam-network/xcm-sdk';\nimport { AssetAmount, EvmParachain } from '@moonbeam-network/xcm-types';\nimport {\n  getMultilocationDerivedAddresses,\n  getPolkadotApi,\n} from '@moonbeam-network/xcm-utils';\nimport Big from 'big.js';\nimport {\n  type Address,\n  createPublicClient,\n  encodeFunctionData,\n  http,\n} from 'viem';\nimport type {\n  BridgeChainTransferData,\n  SourceTransferData,\n} from '../mrl.interfaces';\n\nconst MOON_CHAIN_AUTOMATIC_GAS_ESTIMATION = {\n  [moonbeam.key]: 1273110n,\n  [moonriver.key]: 1273110n,\n  [moonbaseAlpha.key]: 1470417n,\n};\n\ninterface DataParams {\n  destinationData: DestinationChainTransferData;\n  bridgeChainData: BridgeChainTransferData;\n  sourceData: SourceTransferData;\n}\n\nexport function getBridgeChainFeeValueOnSource({\n  destinationData,\n  bridgeChainData,\n  sourceData,\n}: DataParams): Big {\n  const isSourceParachain = EvmParachain.isAnyParachain(sourceData.chain);\n  const isDestinationBridgeChain = destinationData.chain.isEqual(\n    bridgeChainData.chain,\n  );\n  const isSameAssetPayingBridgeChainFee = sourceData.balance.isSame(\n    bridgeChainData.fee,\n  );\n  return !isDestinationBridgeChain &&\n    isSourceParachain &&\n    isSameAssetPayingBridgeChainFee\n    ? convertToChainDecimals({\n        asset: bridgeChainData.fee,\n        target: sourceData.chain.getChainAsset(bridgeChainData.fee),\n      }).toBig()\n    : Big(0);\n}\n\nexport function getMrlMin({\n  destinationData,\n  bridgeChainData,\n  sourceData,\n}: DataParams): AssetAmount {\n  const minInDestination = getMin(destinationData);\n  const min = AssetAmount.fromChainAsset(\n    sourceData.chain.getChainAsset(sourceData.balance),\n    {\n      amount: minInDestination.amount,\n    },\n  );\n  const bridgeChainFee = getBridgeChainFeeValueOnSource({\n    destinationData,\n    bridgeChainData,\n    sourceData,\n  });\n  const relayerFee = sourceData.extraFees?.remote?.fee.amount\n    ? sourceData.extraFees.remote?.fee.toBig()\n    : Big(0);\n\n  return min.copyWith({\n    amount: BigInt(min.toBig().add(bridgeChainFee).add(relayerFee).toFixed()),\n  });\n}\n\nexport interface BuildTransferParams {\n  asset: AssetAmount;\n  protocolFee?: AssetAmount;\n  bridgeChainFee: AssetAmount;\n  destinationAddress: string;\n  feeAsset: AssetAmount;\n  isAutomatic: boolean;\n  route: MrlAssetRoute;\n  sendOnlyRemoteExecution?: boolean;\n  sourceAddress: string;\n}\n\nfunction requiresTransact(route: MrlAssetRoute): boolean {\n  return (\n    route.mrl?.transfer.provider === Provider.Wormhole &&\n    EvmParachain.isAnyParachain(route.source.chain)\n  );\n}\n\nexport async function buildTransfer(params: BuildTransferParams) {\n  const { route } = params;\n  if (!route.mrl) {\n    throw new Error(\n      `MrlConfigBuilder is not defined for source chain ${route.source.chain.name} and asset ${route.source.asset.originSymbol}`,\n    );\n  }\n  if (params.isAutomatic && !route.mrl.isAutomaticPossible) {\n    throw new Error(\n      `Route from source chain ${route.source.chain.name} and asset ${route.source.asset.originSymbol} does not allow the automatic option`,\n    );\n  }\n\n  const builderParams = await getMrlBuilderParams(params);\n\n  return route.mrl.transfer.build({\n    ...builderParams,\n    transact: requiresTransact(route)\n      ? await getTransact(builderParams)\n      : undefined,\n  });\n}\n\nexport async function getMrlBuilderParams({\n  asset,\n  protocolFee,\n  bridgeChainFee,\n  destinationAddress,\n  feeAsset,\n  isAutomatic,\n  route,\n  sendOnlyRemoteExecution,\n  sourceAddress,\n}: BuildTransferParams): Promise<MrlBuilderParams> {\n  if (!route.mrl) {\n    throw new Error(\n      `MrlConfigBuilder is not defined for source chain ${route.source.chain.name} and asset ${route.source.asset.originSymbol}`,\n    );\n  }\n  const source = route.source.chain;\n  const destination = route.destination.chain;\n\n  const bridgeChain = route.mrl.bridgeChain.chain;\n  const [sourceApi, destinationApi, bridgeApi] = await Promise.all([\n    EvmParachain.isAnyParachain(source) ? getPolkadotApi(source.ws) : undefined,\n    EvmParachain.isAnyParachain(destination)\n      ? getPolkadotApi(destination.ws)\n      : undefined,\n    getPolkadotApi(bridgeChain.ws),\n  ]);\n\n  return {\n    asset,\n    protocolFee,\n    bridgeChainFee,\n    destination,\n    destinationAddress,\n    destinationApi,\n    fee: feeAsset,\n    isAutomatic,\n    moonApi: bridgeApi,\n    moonAsset: bridgeChain.nativeAsset,\n    bridgeChain,\n    sendOnlyRemoteExecution,\n    source,\n    sourceAddress,\n    sourceApi,\n  };\n}\n\nasync function getTransact(\n  params: MrlBuilderParams,\n): Promise<Transact | undefined> {\n  const { sourceAddress, source, bridgeChain } = params;\n  const polkadot = await PolkadotService.create(bridgeChain);\n  const bridgeChainGasLimit = await getBridgeChainGasLimit(params);\n\n  if (!EvmParachain.isAnyParachain(source)) {\n    throw new Error('Source chain must be Parachain or EvmParachain');\n  }\n\n  const isDifferentEcosystem = source.ecosystem !== bridgeChain.ecosystem;\n\n  const { address20 } = getMultilocationDerivedAddresses({\n    address: sourceAddress,\n    paraId: source.parachainId,\n    parents: isDifferentEcosystem ? 2 : 1,\n  });\n\n  const extrinsic = MrlBuilder()\n    .wormhole()\n    .extrinsic()\n    .ethereumXcm()\n    .transact()\n    .build({ ...params, bridgeChainGasLimit }) as ExtrinsicConfig;\n  const { weight } = await polkadot.getPaymentInfo(address20, extrinsic);\n\n  return {\n    call: polkadot.getExtrinsicCallHash(extrinsic),\n    txWeight: {\n      refTime: weight.refTime.toBigInt(),\n      proofSize: weight.proofSize.toBigInt(),\n    },\n  };\n}\n\nasync function getBridgeChainGasLimit(\n  params: MrlBuilderParams,\n): Promise<bigint> {\n  const { asset, isAutomatic, bridgeChain, source, sourceAddress } = params;\n\n  if (!EvmParachain.isAnyParachain(source)) {\n    throw new Error('Source chain must be Parachain or EvmParachain');\n  }\n\n  if (!EvmParachain.is(bridgeChain)) {\n    throw new Error('Bridge chain must be an EvmParachain');\n  }\n\n  const client = createPublicClient({\n    chain: bridgeChain.getViemChain(),\n    transport: http(),\n  });\n  const { address20 } = getMultilocationDerivedAddresses({\n    address: sourceAddress,\n    paraId: source.parachainId,\n    parents: 1,\n  });\n\n  // TODO: we have a problem to calculate the gasEstimation for automatic:\n  // it requires the computedOriginAccount to have the balance for the call\n  // which we don't have when we make the call. We hardcode it for now\n  if (isAutomatic) {\n    return (MOON_CHAIN_AUTOMATIC_GAS_ESTIMATION[bridgeChain.key] * 110n) / 100n;\n  }\n\n  const contract = MrlBuilder()\n    .wormhole()\n    .contract()\n    .TokenBridge()\n    .transferTokens()\n    .build({\n      ...params,\n      asset: asset.copyWith({ amount: 0n }),\n    }) as ContractConfig;\n\n  const approveTx = encodeFunctionData({\n    abi: ERC20_ABI,\n    functionName: 'approve',\n    args: [contract.address as Address, 0n],\n  });\n\n  const tokenAddressOnBridgeChain = bridgeChain.getChainAsset(asset).address as\n    | Address\n    | undefined;\n\n  if (!tokenAddressOnBridgeChain) {\n    throw new Error(\n      `Asset ${asset.symbol} does not have a token address on chain ${bridgeChain.name}`,\n    );\n  }\n\n  const batchAll = encodeFunctionData({\n    abi: BATCH_CONTRACT_ABI,\n    functionName: 'batchAll',\n    args: [\n      [tokenAddressOnBridgeChain, contract.address as Address],\n      [0n, 0n], // Value to send for each call\n      [approveTx, contract.encodeFunctionData()], // Call data for each call\n      [], // Gas limit for each call\n    ],\n  });\n\n  const gasEstimation = await client.estimateGas({\n    account: address20,\n    to: BATCH_CONTRACT_ADDRESS,\n    data: batchAll,\n  });\n\n  return (gasEstimation * 110n) / 100n;\n}\n\nexport function getAmountForTransferSimulation(\n  balance: AssetAmount,\n  protocolFee?: AssetAmount,\n): AssetAmount {\n  if (!protocolFee || !balance.isSame(protocolFee)) {\n    return balance;\n  }\n\n  // We make sure the amount is not negative\n  return balance.copyWith({\n    amount:\n      balance.amount - protocolFee.amount > 0\n        ? balance.amount - protocolFee.amount\n        : 0n,\n  });\n}\n\ninterface GetMrlMaxParams extends GetMaxParams {\n  extraFees?: {\n    local?: {\n      fee: AssetAmount;\n      balance: AssetAmount;\n    };\n  };\n}\n\nexport function getMrlMax({\n  balance,\n  existentialDeposit,\n  fee,\n  min,\n  extraFees,\n}: GetMrlMaxParams): AssetAmount {\n  const xcmMax = getMax({\n    balance,\n    existentialDeposit,\n    fee,\n    min,\n  });\n\n  const result = xcmMax\n    .toBig()\n    .minus(\n      extraFees?.local && balance.isSame(extraFees.local.fee)\n        ? extraFees.local.fee.toBig()\n        : Big(0),\n    );\n\n  return balance.copyWith({\n    amount: result.lt(0) ? 0n : BigInt(result.toFixed()),\n  });\n}\n"],"mappings":"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;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ,CAAA;IACR,MAAM;IACN,SAAS,CAAA;IACT,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ,CAAA;IACR,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ,CAAA;IACR,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,YAAY;cACV;gBACE,cAAc;gBACd,MAAM;gBACN,MAAM;;cAER;gBACE,cAAc;gBACd,MAAM;gBACN,MAAM;;cAER;gBACE,cAAc;gBACd,MAAM;gBACN,MAAM;;cAER;gBACE,cAAc;gBACd,MAAM;gBACN,MAAM;;;YAGV,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,YAAY;cACV;gBACE,cAAc;gBACd,MAAM;gBACN,MAAM;;cAER;gBACE,cAAc;gBACd,MAAM;gBACN,MAAM;;;YAGV,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,YAAY;cACV;gBACE,cAAc;gBACd,MAAM;gBACN,MAAM;;cAER;gBACE,cAAc;gBACd,MAAM;gBACN,MAAM;;cAER;gBACE,cAAc;gBACd,MAAM;gBACN,MAAM;;cAER;gBACE,cAAc;gBACd,MAAM;gBACN,MAAM;;;YAGV,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cA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T,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,MAAM;;EAER;IACE,WAAW;IACX,QAAQ;MACN;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,MAAM;;EAER;IACE,WAAW;IACX,QAAQ;MACN;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,MAAM;;EAER;IACE,WAAW;IACX,QAAQ;MACN;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,MAAM;;EAER;IACE,QAAQ,CAAA;IACR,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,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iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS,CAAA;IACT,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS,CAAA;IACT,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ,CAAA;IACR,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS,CAAA;IACT,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ,CAAA;IACR,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,iBAAiB;IACjB,MAAM;;;AAIV,IAAMC,aACJ;AAMF,IAAMC,eAAc,CAClB,OACwD,GAAG,SAAS;AAEhE,IAAO,kBAAP,cAA+B,gBAAe;EAClD,eAAe,MAA6B;AAC1C,QAAIA,aAAY,IAAI,GAAG;AACrB,YAAM,GAAG,IAAI;IACf,OAAO;AACL,YAAMF,OAAMC,YAAW,KAAK,CAAC,CAAC;IAChC;EACF;EAES,qBACP,WAAmD;AAEnD,WAAO,MAAM,qBAAqB,aAAa,CAAA,CAAE;EACnD;EACS,OAAO,WAAmD;AACjE,WAAO,MAAM,OAAO,aAAa,CAAA,CAAE;EAKrC;EACS,QAAQ,QAA6B;AAC5C,WAAO,MAAM,QAAQ,MAAM;EAC7B;EAEA,OAAgB,WAAWA;EAC3B,OAAgB,MAAMD;EACtB,OAAO,kBAAe;AACpB,WAAO,IAAI,UAAUA,KAAI;EAC3B;EACA,OAAO,QAAQ,SAAiB,QAA8B;AAC5D,WAAO,IAAI,SAAS,SAASA,OAAM,MAAM;EAC3C;;;;AC9tCF,IAAMG,QAAO;EACX;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,WAAW;IACX,QAAQ;MACN;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,MAAM;;EAER;IACE,WAAW;IACX,QAAQ;MACN;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,MAAM;;EAER;IACE,WAAW;IACX,QAAQ;MACN;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,MAAM;;EAER;IACE,WAAW;IACX,QAAQ;MACN;QACE,YAAY;UACV;YACE,cAAc;YACd,MAAM;YACN,MAAM;;UAER;YACE,cAAc;YACd,MAAM;YACN,MAAM;;;QAGV,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,MAAM;;EAER;IACE,WAAW;IACX,QAAQ;MACN;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,SAAS;QACT,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,MAAM;;EAER;IACE,QAAQ,CAAA;IACR,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ,CAAA;IACR,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,MAAM;IACN,SAAS;MACP;QACE,cAAc;QACd,MAAM;QACN,MAAM;;;IAGV,iBAAiB;IACjB,MAAM;;EAER;IACE,QAAQ;MACN;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MAAM;;MAER;QACE,cAAc;QACd,MAAM;QACN,MA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","names":["registerProtocol","_platform","keccak256","nativeChainIds","serialize","EvmAddress","EvmPlatform","EvmUnsignedTransaction","addChainId","addFrom","chain","contracts","count","bytes","bytes","bytes","mask","hex","bytes","output","bytes","payload","length","args","bytes","count","n","b","n","bytes","BN_0","BN_0","count","BN_0","BN_1","b","throwError","_guard","result","value","type","indexed","name","inputs","bytes","PanicReasons","b","bytes","value","BN_0","b","BN_0","blockNumber","receipt","BN_0","internal","fragment","t","listener","count","passProperties","addr","target","code","output","chain","contracts","nativeChainIds","ethers_contracts_exports","EvmPlatform","EvmAddress","keccak256","serialize","payload","addFrom","txReq","EvmUnsignedTransaction","addChainId","isNative","serialize","toNative","nativeChainIds","toChainId","EvmAddress","EvmPlatform","EvmUnsignedTransaction","WETH_CONTRACTS","addChainId","addFrom","chain","contracts","nativeChainIds","ethers_contracts_exports","EvmAddress","serialize","addFrom","EvmPlatform","toChainId","isNative","txReq","toNative","WETH_CONTRACTS","EvmUnsignedTransaction","addChainId","nativeChainIds","toChainId","signedQuoteLayout","isNative","serialize","EvmAddress","EvmPlatform","EvmUnsignedTransaction","addChainId","addFrom","keyCartesianSet","ret","bytes","id","custom","bytes","serialize","value","id","idOrConversionId","count","b","bestBytes","sizePower","bytes","b","n","id","b","padding","mask","n","bytes","alphabet","b","b","encoding","bytes","bytes","b","chain","toChain","chain","isBytes","anumber","n","abytes","b","u32","isLE","isLE","bytes","abytes","hex","utf8ToBytes","toBytes","utf8ToBytes","abytes","abytes","Hash","toBytes","isLE","_32n","b","Hash","toBytes","abytes","U32_MASK64","_32n","fromBig","n","split","rotlSH","rotlSL","rotlBH","rotlBL","split","n","sha256","_0n","_1n","_2n","_7n","_256n","_0x71n","SHA3_PI","SHA3_ROTL","_SHA3_IOTA","split","SHA3_IOTA_H","SHA3_IOTA_L","rotlH","rotlBH","rotlSH","rotlL","rotlBL","rotlSL","keccakP","Keccak","Hash","anumber","u32","toBytes","abytes","bytes","gen","keccak_256","gen","sha512_256","Hash","toBytes","abytes","_0n","_1n","bytes","isBytes","hex","_0n","abytes","n","hex","isBytes","n","_0n","_1n","n","_1n","b","gen","_0n","_1n","_2n","_7n","b","_0n","number","b","_1n","n","gcd","n2","_2n","_7n","_0n","_1n","n","_1n","_2n","n","anumber","isLE","_0n","_1n","bytes","b","isLE","_1n","_0n","_1n","mask","n","wbits","isLE","_0n","_2n","n","_0n","_1n","b","hex","_3n","_4n","bytes","endo","b","randomBytes","hmac","number","_1n","bytes","Signature","r","s","hex","_2n","_0n","isBytes","create","_2n","_3n","UniversalAddress","toNative","sha512_256","serialize","sha256","keccak_256","toNative","chain","UniversalAddress","chain","toChain","id","serialize","SignatureUtils","UniversalAddress","protocol","payloadNames","CircleBridge","keccak_256","serialize","AutomaticCircleBridge","fixedLengthStringItem","PorticoBridge","serialize","namedPayloads","TokenBridge","AutomaticTokenBridge","ExecutorTokenBridge","serialize","bytes","TBTCBridge","chain","toNative","namedPayloads","RelayStatus","RequestPrefix","chain","contracts","nativeChainIds","EvmPlatform","EvmAddress","toChainId","signedQuoteLayout","isNative","txReq","addFrom","serialize","EvmUnsignedTransaction","addChainId","ethers_contracts_exports","_abi","_bytecode","isSuperArgs","_abi","_bytecode","isSuperArgs","registerProtocol","_platform","chain","chain","payload","chain","bytes","ContractConfig","SnowbridgeConfig","WormholeConfig","convertToChainDecimals","EvmService","PolkadotService","AssetAmount","EvmChain","EvmParachain","toBigInt","Big","EvmService","chain","isEthAddress","ContractConfig","MrlBuilder","Provider","EvmService","getBalance","PolkadotService","AssetAmount","EvmChain","toBigInt","ERC20_ABI","MrlBuilder","getMultilocationDerivedAddresses","createPublicClient","encodeFunctionData","http","getBalance","chain","AssetAmount","ContractConfig","Provider","MrlBuilder","toBigInt","EvmChain","EvmService","PolkadotService","convertToChainDecimals","Big","toBigInt","isAutomatic","AssetAmount","ContractConfig","EvmChain","EvmParachain","EvmService","PolkadotService","WormholeConfig","SnowbridgeConfig","chain"]}