@t2000/cli 0.22.22 → 0.22.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/README.md +1 -10
  2. package/dist/{ccip-3TXHQUZ5.js → ccip-JEEJV65M.js} +3 -3
  3. package/dist/{chunk-3W7OQGNS.js → chunk-3XUF7GM3.js} +21 -42
  4. package/dist/chunk-3XUF7GM3.js.map +1 -0
  5. package/dist/chunk-77SWBATH.js +204 -0
  6. package/dist/chunk-77SWBATH.js.map +1 -0
  7. package/dist/{chunk-ML6HST4W.js → chunk-A5X4KG7U.js} +1878 -341
  8. package/dist/chunk-A5X4KG7U.js.map +1 -0
  9. package/dist/{chunk-ZNF5QSAT.js → chunk-BPTNEFB5.js} +33491 -24904
  10. package/dist/chunk-BPTNEFB5.js.map +1 -0
  11. package/dist/{chunk-VREOXJUB.js → chunk-EEPD7SHV.js} +15455 -14941
  12. package/dist/chunk-EEPD7SHV.js.map +1 -0
  13. package/dist/{chunk-AB65Y674.js → chunk-V7PXDEKG.js} +2 -2
  14. package/dist/chunk-V7PXDEKG.js.map +1 -0
  15. package/dist/chunk-XOAZJ42V.js +4016 -0
  16. package/dist/chunk-XOAZJ42V.js.map +1 -0
  17. package/dist/client-CK5OR2TP.js +746 -0
  18. package/dist/client-CK5OR2TP.js.map +1 -0
  19. package/dist/{client-SYS6Z5RX.js → client-R3NRAXMD.js} +5715 -2933
  20. package/dist/client-R3NRAXMD.js.map +1 -0
  21. package/dist/{dist-73ESA7QZ.js → dist-MJOXMRDV.js} +135 -4259
  22. package/dist/dist-MJOXMRDV.js.map +1 -0
  23. package/dist/{dist-IANNA5N7.js → dist-TWST5EWE.js} +11 -27
  24. package/dist/{esm-IQVNJILX.js → esm-QBJBHFZA.js} +11 -11
  25. package/dist/esm-QBJBHFZA.js.map +1 -0
  26. package/dist/index.js +125 -284
  27. package/dist/index.js.map +1 -1
  28. package/package.json +4 -4
  29. package/dist/chunk-3W7OQGNS.js.map +0 -1
  30. package/dist/chunk-AB65Y674.js.map +0 -1
  31. package/dist/chunk-H66DC3S3.js +0 -1908
  32. package/dist/chunk-H66DC3S3.js.map +0 -1
  33. package/dist/chunk-IHPSFXUW.js +0 -5002
  34. package/dist/chunk-IHPSFXUW.js.map +0 -1
  35. package/dist/chunk-ML6HST4W.js.map +0 -1
  36. package/dist/chunk-VREOXJUB.js.map +0 -1
  37. package/dist/chunk-ZNF5QSAT.js.map +0 -1
  38. package/dist/client-4DBCJNJO.js +0 -117
  39. package/dist/client-4DBCJNJO.js.map +0 -1
  40. package/dist/client-SYS6Z5RX.js.map +0 -1
  41. package/dist/dist-73ESA7QZ.js.map +0 -1
  42. package/dist/esm-IQVNJILX.js.map +0 -1
  43. /package/dist/{ccip-3TXHQUZ5.js.map → ccip-JEEJV65M.js.map} +0 -0
  44. /package/dist/{dist-IANNA5N7.js.map → dist-TWST5EWE.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/getAction.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/errors/log.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/abi/encodeEventTopics.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/filters/createFilterRequestScope.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/createContractEventFilter.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/errors/getContractError.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/accounts/utils/publicKeyToAddress.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/signature/recoverPublicKey.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/signature/recoverAddress.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/encoding/toRlp.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/authorization/hashAuthorization.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/authorization/recoverAuthorizationAddress.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/errors/estimateGas.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/errors/getEstimateGasError.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/errors/fee.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/errors/block.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/formatters/transaction.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/formatters/block.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/getBlock.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/getGasPrice.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/estimateMaxPriorityFeePerGas.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/estimateFeesPerGas.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/getTransactionCount.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/blob/blobsToCommitments.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/blob/blobsToProofs.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/hash/sha256.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/blob/commitmentToVersionedHash.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/blob/commitmentsToVersionedHashes.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/constants/blob.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/constants/kzg.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/errors/blob.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/blob/toBlobs.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/blob/toBlobSidecars.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/transaction/getTransactionType.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/errors/getTransactionError.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/getChainId.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/fillTransaction.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/prepareTransactionRequest.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/estimateGas.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/formatters/log.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/abi/decodeEventLog.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/abi/parseEventLogs.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/getLogs.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/getContractEvents.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/readContract.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/observe.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/wait.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/poll.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/promise/withCache.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/getBlockNumber.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/getFilterChanges.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/uninstallFilter.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/watchContractEvent.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/errors/account.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/chain/assertCurrentChain.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/sendRawTransaction.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/sendTransaction.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/writeContract.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/errors/calls.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/promise/withRetry.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/formatters/transactionReceipt.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/sendCalls.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/getCallsStatus.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/waitForCallsStatus.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/uid.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/clients/createClient.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/getCode.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/transaction/assertTransaction.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/transaction/serializeAccessList.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/transaction/serializeTransaction.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/authorization/serializeAuthorizationList.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/authorization/verifyAuthorization.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/promise/withDedupe.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/buildRequest.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/chain/defineChain.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/encoding/fromRlp.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/hash/isHash.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/promise/withTimeout.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/rpc/id.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/rpc/http.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/errors/typedData.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/typedData.ts","../../../node_modules/.pnpm/ox@0.14.5_typescript@5.9.3_zod@4.3.6/node_modules/ox/erc8010/SignatureErc8010.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/transaction/getSerializedTransactionType.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/transaction/parseTransaction.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/errors/unit.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/unit/parseUnits.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/getTransaction.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/getTransactionReceipt.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/multicall.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/constants/address.ts","../../../node_modules/.pnpm/ox@0.14.5_typescript@5.9.3_zod@4.3.6/node_modules/ox/erc6492/SignatureErc6492.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/utils/signature/serializeSignature.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/verifyHash.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/watchBlockNumber.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/public/waitForTransactionReceipt.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/sendRawTransactionSync.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/sendCallsSync.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/sendTransactionSync.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/signTransaction.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/signTypedData.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/actions/wallet/writeContractSync.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/clients/transports/createTransport.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/errors/transport.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/clients/transports/http.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/stripe/Methods.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/stripe/client/Charge.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/stripe/client/Methods.ts","../../../node_modules/.pnpm/ox@0.14.5_typescript@5.9.3_zod@4.3.6/node_modules/ox/tempo/SignatureEnvelope.ts","../../../node_modules/.pnpm/ox@0.14.5_typescript@5.9.3_zod@4.3.6/node_modules/ox/tempo/TempoAddress.ts","../../../node_modules/.pnpm/ox@0.14.5_typescript@5.9.3_zod@4.3.6/node_modules/ox/tempo/AuthorizationTempo.ts","../../../node_modules/.pnpm/ox@0.14.5_typescript@5.9.3_zod@4.3.6/node_modules/ox/tempo/KeyAuthorization.ts","../../../node_modules/.pnpm/ox@0.14.5_typescript@5.9.3_zod@4.3.6/node_modules/ox/tempo/PoolId.ts","../../../node_modules/.pnpm/ox@0.14.5_typescript@5.9.3_zod@4.3.6/node_modules/ox/tempo/TokenId.ts","../../../node_modules/.pnpm/ox@0.14.5_typescript@5.9.3_zod@4.3.6/node_modules/ox/tempo/TokenRole.ts","../../../node_modules/.pnpm/ox@0.14.5_typescript@5.9.3_zod@4.3.6/node_modules/ox/tempo/Transaction.ts","../../../node_modules/.pnpm/ox@0.14.5_typescript@5.9.3_zod@4.3.6/node_modules/ox/tempo/TransactionRequest.ts","../../../node_modules/.pnpm/ox@0.14.5_typescript@5.9.3_zod@4.3.6/node_modules/ox/tempo/TxEnvelopeTempo.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/Transaction.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/Formatters.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/internal/concurrent.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/chainConfig.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/chains/definitions/tempo.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/Abis.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/Account.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/Addresses.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/actions/index.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/actions/accessKey.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/internal/utils.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/actions/amm.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/actions/dex.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/actions/faucet.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/actions/fee.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/actions/nonce.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/actions/policy.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/actions/reward.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/actions/token.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/actions/validator.ts","../../../node_modules/.pnpm/viem@2.47.5_typescript@5.9.3_zod@4.3.6/node_modules/viem/tempo/Transport.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/viem/Account.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/viem/Client.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/Attribution.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/internal/defaults.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/internal/auto-swap.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/Methods.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/client/Charge.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/session/Voucher.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/session/escrow.abi.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/session/Chain.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/session/Channel.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/client/ChannelOps.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/client/Session.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/client/internal/Fetch.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/session/Receipt.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/session/Sse.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/client/SessionManager.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/tempo/client/Methods.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/client/Mppx.ts","../../../node_modules/.pnpm/mppx@0.4.7_@modelcontextprotocol+sdk@1.27.1_zod@4.3.6__express@5.2.1_hono@4.12.5_openap_1951e9436b668c211d009f1bdf7dfd81/node_modules/mppx/src/client/Transport.ts"],"sourcesContent":["import type { Client } from '../clients/createClient.js'\nimport type { PublicActions } from '../clients/decorators/public.js'\nimport type { WalletActions } from '../clients/decorators/wallet.js'\nimport type { Transport } from '../clients/transports/createTransport.js'\nimport type { Account } from '../types/account.js'\nimport type { Chain } from '../types/chain.js'\nimport type { RpcSchema } from '../types/eip1193.js'\n\n/**\n * Retrieves and returns an action from the client (if exists), and falls\n * back to the tree-shakable action.\n *\n * Useful for extracting overridden actions from a client (ie. if a consumer\n * wants to override the `sendTransaction` implementation).\n */\nexport function getAction<\n transport extends Transport,\n chain extends Chain | undefined,\n account extends Account | undefined,\n rpcSchema extends RpcSchema | undefined,\n extended extends { [key: string]: unknown },\n client extends Client<transport, chain, account, rpcSchema, extended>,\n parameters,\n returnType,\n>(\n client: client,\n actionFn: (_: any, parameters: parameters) => returnType,\n // Some minifiers drop `Function.prototype.name`, or replace it with short letters,\n // meaning that `actionFn.name` will not always work. For that case, the consumer\n // needs to pass the name explicitly.\n name: keyof PublicActions | keyof WalletActions | (string & {}),\n): (parameters: parameters) => returnType {\n const action_implicit = client[actionFn.name]\n if (typeof action_implicit === 'function')\n return action_implicit as (params: parameters) => returnType\n\n const action_explicit = client[name]\n if (typeof action_explicit === 'function')\n return action_explicit as (params: parameters) => returnType\n\n return (params) => actionFn(client, params)\n}\n","import { BaseError } from './base.js'\n\nexport type FilterTypeNotSupportedErrorType = FilterTypeNotSupportedError & {\n name: 'FilterTypeNotSupportedError'\n}\nexport class FilterTypeNotSupportedError extends BaseError {\n constructor(type: string) {\n super(`Filter type \"${type}\" is not supported.`, {\n name: 'FilterTypeNotSupportedError',\n })\n }\n}\n","import type {\n Abi,\n AbiParameter,\n AbiParameterToPrimitiveType,\n ExtractAbiEvents,\n} from 'abitype'\n\nimport {\n AbiEventNotFoundError,\n type AbiEventNotFoundErrorType,\n} from '../../errors/abi.js'\nimport {\n FilterTypeNotSupportedError,\n type FilterTypeNotSupportedErrorType,\n} from '../../errors/log.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractEventArgs,\n ContractEventName,\n EventDefinition,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { IsNarrowable, UnionEvaluate } from '../../types/utils.js'\nimport { type ToBytesErrorType, toBytes } from '../encoding/toBytes.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\nimport {\n type ToEventSelectorErrorType,\n toEventSelector,\n} from '../hash/toEventSelector.js'\nimport {\n type EncodeAbiParametersErrorType,\n encodeAbiParameters,\n} from './encodeAbiParameters.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\nimport { type GetAbiItemErrorType, getAbiItem } from './getAbiItem.js'\n\nconst docsPath = '/docs/contract/encodeEventTopics'\n\nexport type EncodeEventTopicsParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName<abi> | undefined = ContractEventName<abi>,\n ///\n hasEvents = abi extends Abi\n ? Abi extends abi\n ? true\n : [ExtractAbiEvents<abi>] extends [never]\n ? false\n : true\n : true,\n allArgs = ContractEventArgs<\n abi,\n eventName extends ContractEventName<abi>\n ? eventName\n : ContractEventName<abi>\n >,\n allErrorNames = ContractEventName<abi>,\n> = {\n abi: abi\n args?: allArgs | undefined\n} & UnionEvaluate<\n IsNarrowable<abi, Abi> extends true\n ? abi['length'] extends 1\n ? { eventName?: eventName | allErrorNames | undefined }\n : { eventName: eventName | allErrorNames }\n : { eventName?: eventName | allErrorNames | undefined }\n> &\n (hasEvents extends true ? unknown : never)\n\nexport type EncodeEventTopicsReturnType = [Hex, ...(Hex | Hex[] | null)[]]\n\nexport type EncodeEventTopicsErrorType =\n | AbiEventNotFoundErrorType\n | EncodeArgErrorType\n | FormatAbiItemErrorType\n | GetAbiItemErrorType\n | ToEventSelectorErrorType\n | ErrorType\n\nexport function encodeEventTopics<\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName<abi> | undefined = undefined,\n>(\n parameters: EncodeEventTopicsParameters<abi, eventName>,\n): EncodeEventTopicsReturnType {\n const { abi, eventName, args } = parameters as EncodeEventTopicsParameters\n\n let abiItem = abi[0]\n if (eventName) {\n const item = getAbiItem({ abi, name: eventName })\n if (!item) throw new AbiEventNotFoundError(eventName, { docsPath })\n abiItem = item\n }\n\n if (abiItem.type !== 'event')\n throw new AbiEventNotFoundError(undefined, { docsPath })\n\n const definition = formatAbiItem(abiItem)\n const signature = toEventSelector(definition as EventDefinition)\n\n let topics: (Hex | Hex[] | null)[] = []\n if (args && 'inputs' in abiItem) {\n const indexedInputs = abiItem.inputs?.filter(\n (param) => 'indexed' in param && param.indexed,\n )\n const args_ = Array.isArray(args)\n ? args\n : Object.values(args).length > 0\n ? (indexedInputs?.map((x: any) => (args as any)[x.name]) ?? [])\n : []\n\n if (args_.length > 0) {\n topics =\n indexedInputs?.map((param, i) => {\n if (Array.isArray(args_[i]))\n return args_[i].map((_: any, j: number) =>\n encodeArg({ param, value: args_[i][j] }),\n )\n return typeof args_[i] !== 'undefined' && args_[i] !== null\n ? encodeArg({ param, value: args_[i] })\n : null\n }) ?? []\n }\n }\n return [signature, ...topics]\n}\n\nexport type EncodeArgErrorType =\n | Keccak256ErrorType\n | ToBytesErrorType\n | EncodeAbiParametersErrorType\n | FilterTypeNotSupportedErrorType\n | ErrorType\n\nfunction encodeArg({\n param,\n value,\n}: {\n param: AbiParameter\n value: AbiParameterToPrimitiveType<AbiParameter>\n}) {\n if (param.type === 'string' || param.type === 'bytes')\n return keccak256(toBytes(value as string))\n if (param.type === 'tuple' || param.type.match(/^(.*)\\[(\\d+)?\\]$/))\n throw new FilterTypeNotSupportedError(param.type)\n return encodeAbiParameters([param], [value])\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { OnResponseFn } from '../../clients/transports/fallback.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { EIP1193RequestFn, PublicRpcSchema } from '../../types/eip1193.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { Filter } from '../../types/utils.js'\n\ntype CreateFilterRequestScopeParameters = {\n method:\n | 'eth_newFilter'\n | 'eth_newPendingTransactionFilter'\n | 'eth_newBlockFilter'\n}\n\ntype FilterRpcSchema = Filter<\n PublicRpcSchema,\n { Method: 'eth_getFilterLogs' | 'eth_getFilterChanges' }\n>\n\ntype CreateFilterRequestScopeReturnType = (\n id: Hex,\n) => EIP1193RequestFn<FilterRpcSchema>\n\n/**\n * Scopes `request` to the filter ID. If the client is a fallback, it will\n * listen for responses and scope the child transport `request` function\n * to the successful filter ID.\n */\nexport function createFilterRequestScope<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n { method }: CreateFilterRequestScopeParameters,\n): CreateFilterRequestScopeReturnType {\n const requestMap: Record<Hex, EIP1193RequestFn> = {}\n\n if (client.transport.type === 'fallback')\n client.transport.onResponse?.(\n ({\n method: method_,\n response: id,\n status,\n transport,\n }: Parameters<OnResponseFn>[0]) => {\n if (status === 'success' && method === method_)\n requestMap[id as Hex] = transport.request\n },\n )\n\n return ((id) =>\n requestMap[id] || client.request) as CreateFilterRequestScopeReturnType\n}\n","import type { Abi, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractEventName,\n MaybeExtractEventArgsFromAbi,\n} from '../../types/contract.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Hex } from '../../types/misc.js'\nimport {\n type EncodeEventTopicsErrorType,\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { createFilterRequestScope } from '../../utils/filters/createFilterRequestScope.js'\n\nexport type CreateContractEventFilterParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName<abi> | undefined = undefined,\n args extends\n | MaybeExtractEventArgsFromAbi<abi, eventName>\n | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = {\n address?: Address | Address[] | undefined\n abi: abi\n eventName?: eventName | ContractEventName<abi> | undefined\n fromBlock?: fromBlock | BlockNumber | BlockTag | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments in the event ABI item.\n * @default false\n */\n strict?: strict | boolean | undefined\n toBlock?: toBlock | BlockNumber | BlockTag | undefined\n} & (undefined extends eventName\n ? {\n args?: undefined\n }\n : MaybeExtractEventArgsFromAbi<abi, eventName> extends infer eventFilterArgs\n ? {\n args?:\n | eventFilterArgs\n | (args extends eventFilterArgs ? args : never)\n | undefined\n }\n : {\n args?: undefined\n })\n\nexport type CreateContractEventFilterReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName<abi> | undefined = undefined,\n args extends\n | MaybeExtractEventArgsFromAbi<abi, eventName>\n | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = Filter<'event', abi, eventName, args, strict, fromBlock, toBlock>\n\nexport type CreateContractEventFilterErrorType =\n | EncodeEventTopicsErrorType\n | RequestErrorType\n | NumberToHexErrorType\n | ErrorType\n\n/**\n * Creates a Filter to retrieve event logs that can be used with [`getFilterChanges`](https://viem.sh/docs/actions/public/getFilterChanges) or [`getFilterLogs`](https://viem.sh/docs/actions/public/getFilterLogs).\n *\n * - Docs: https://viem.sh/docs/contract/createContractEventFilter\n *\n * @param client - Client to use\n * @param parameters - {@link CreateContractEventFilterParameters}\n * @returns [`Filter`](https://viem.sh/docs/glossary/types#filter). {@link CreateContractEventFilterReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createContractEventFilter } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createContractEventFilter(client, {\n * abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']),\n * })\n */\nexport async function createContractEventFilter<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName<abi> | undefined,\n args extends MaybeExtractEventArgsFromAbi<abi, eventName> | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n client: Client<Transport, chain>,\n parameters: CreateContractEventFilterParameters<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >,\n): Promise<\n CreateContractEventFilterReturnType<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >\n> {\n const { address, abi, args, eventName, fromBlock, strict, toBlock } =\n parameters as CreateContractEventFilterParameters\n\n const getRequest = createFilterRequestScope(client, {\n method: 'eth_newFilter',\n })\n\n const topics = eventName\n ? encodeEventTopics({\n abi,\n args,\n eventName,\n } as unknown as EncodeEventTopicsParameters)\n : undefined\n const id: Hex = await client.request({\n method: 'eth_newFilter',\n params: [\n {\n address,\n fromBlock:\n typeof fromBlock === 'bigint' ? numberToHex(fromBlock) : fromBlock,\n toBlock: typeof toBlock === 'bigint' ? numberToHex(toBlock) : toBlock,\n topics,\n },\n ],\n })\n\n return {\n abi,\n args,\n eventName,\n id,\n request: getRequest(id),\n strict: Boolean(strict),\n type: 'event',\n } as unknown as CreateContractEventFilterReturnType<\n abi,\n eventName,\n args,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import type { Abi, Address } from 'abitype'\n\nimport { AbiDecodingZeroDataError } from '../../errors/abi.js'\nimport { BaseError } from '../../errors/base.js'\nimport {\n ContractFunctionExecutionError,\n type ContractFunctionExecutionErrorType,\n ContractFunctionRevertedError,\n type ContractFunctionRevertedErrorType,\n ContractFunctionZeroDataError,\n type ContractFunctionZeroDataErrorType,\n RawContractError,\n} from '../../errors/contract.js'\nimport { RpcRequestError } from '../../errors/request.js'\nimport { InternalRpcError, InvalidInputRpcError } from '../../errors/rpc.js'\nimport type { ErrorType } from '../../errors/utils.js'\n\nconst EXECUTION_REVERTED_ERROR_CODE = 3\n\nexport type GetContractErrorReturnType<cause = ErrorType> = Omit<\n ContractFunctionExecutionErrorType,\n 'cause'\n> & {\n cause:\n | cause\n | ContractFunctionZeroDataErrorType\n | ContractFunctionRevertedErrorType\n}\n\nexport function getContractError<err extends ErrorType<string>>(\n err: err,\n {\n abi,\n address,\n args,\n docsPath,\n functionName,\n sender,\n }: {\n abi: Abi\n args: any\n address?: Address | undefined\n docsPath?: string | undefined\n functionName: string\n sender?: Address | undefined\n },\n): GetContractErrorReturnType {\n const error = (\n err instanceof RawContractError\n ? err\n : err instanceof BaseError\n ? err.walk((err) => 'data' in (err as Error)) || err.walk()\n : {}\n ) as BaseError\n const { code, data, details, message, shortMessage } =\n error as RawContractError\n\n const cause = (() => {\n if (err instanceof AbiDecodingZeroDataError)\n return new ContractFunctionZeroDataError({ functionName, cause: err })\n if (\n ([EXECUTION_REVERTED_ERROR_CODE, InternalRpcError.code].includes(code) &&\n (data || details || message || shortMessage)) ||\n (code === InvalidInputRpcError.code &&\n details === 'execution reverted' &&\n data)\n ) {\n return new ContractFunctionRevertedError({\n abi,\n data: typeof data === 'object' ? data.data : data,\n functionName,\n message:\n error instanceof RpcRequestError\n ? details\n : (shortMessage ?? message),\n cause: err,\n })\n }\n return err\n })()\n\n return new ContractFunctionExecutionError(cause as BaseError, {\n abi,\n args,\n contractAddress: address,\n docsPath,\n functionName,\n sender,\n }) as GetContractErrorReturnType\n}\n","import type { Address } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport {\n type ChecksumAddressErrorType,\n checksumAddress,\n} from '../../utils/address/getAddress.js'\nimport {\n type Keccak256ErrorType,\n keccak256,\n} from '../../utils/hash/keccak256.js'\n\nexport type PublicKeyToAddressErrorType =\n | ChecksumAddressErrorType\n | Keccak256ErrorType\n | ErrorType\n\n/**\n * @description Converts an ECDSA public key to an address.\n *\n * @param publicKey The public key to convert.\n *\n * @returns The address.\n */\nexport function publicKeyToAddress(publicKey: Hex): Address {\n const address = keccak256(`0x${publicKey.substring(4)}`).substring(26)\n return checksumAddress(`0x${address}`) as Address\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { size } from '../data/size.js'\nimport {\n type HexToNumberErrorType,\n hexToBigInt,\n hexToNumber,\n} from '../encoding/fromHex.js'\nimport { toHex } from '../encoding/toHex.js'\n\nexport type RecoverPublicKeyParameters = {\n hash: Hex | ByteArray\n signature: Hex | ByteArray | Signature\n}\n\nexport type RecoverPublicKeyReturnType = Hex\n\nexport type RecoverPublicKeyErrorType =\n | HexToNumberErrorType\n | IsHexErrorType\n | ErrorType\n\nexport async function recoverPublicKey({\n hash,\n signature,\n}: RecoverPublicKeyParameters): Promise<RecoverPublicKeyReturnType> {\n const hashHex = isHex(hash) ? hash : toHex(hash)\n\n const { secp256k1 } = await import('@noble/curves/secp256k1')\n const signature_ = (() => {\n // typeof signature: `Signature`\n if (typeof signature === 'object' && 'r' in signature && 's' in signature) {\n const { r, s, v, yParity } = signature\n const yParityOrV = Number(yParity ?? v)!\n const recoveryBit = toRecoveryBit(yParityOrV)\n return new secp256k1.Signature(\n hexToBigInt(r),\n hexToBigInt(s),\n ).addRecoveryBit(recoveryBit)\n }\n\n // typeof signature: `Hex | ByteArray`\n const signatureHex = isHex(signature) ? signature : toHex(signature)\n if (size(signatureHex) !== 65) throw new Error('invalid signature length')\n const yParityOrV = hexToNumber(`0x${signatureHex.slice(130)}`)\n const recoveryBit = toRecoveryBit(yParityOrV)\n return secp256k1.Signature.fromCompact(\n signatureHex.substring(2, 130),\n ).addRecoveryBit(recoveryBit)\n })()\n\n const publicKey = signature_\n .recoverPublicKey(hashHex.substring(2))\n .toHex(false)\n return `0x${publicKey}`\n}\n\nfunction toRecoveryBit(yParityOrV: number) {\n if (yParityOrV === 0 || yParityOrV === 1) return yParityOrV\n if (yParityOrV === 27) return 0\n if (yParityOrV === 28) return 1\n throw new Error('Invalid yParityOrV value')\n}\n","import type { Address } from 'abitype'\n\nimport { publicKeyToAddress } from '../../accounts/utils/publicKeyToAddress.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport { recoverPublicKey } from './recoverPublicKey.js'\n\nexport type RecoverAddressParameters = {\n hash: Hex | ByteArray\n signature: Hex | ByteArray | Signature\n}\n\nexport type RecoverAddressReturnType = Address\n\nexport type RecoverAddressErrorType = ErrorType\n\nexport async function recoverAddress({\n hash,\n signature,\n}: RecoverAddressParameters): Promise<RecoverAddressReturnType> {\n return publicKeyToAddress(await recoverPublicKey({ hash, signature }))\n}\n","import { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport {\n type CreateCursorErrorType,\n type Cursor,\n createCursor,\n} from '../cursor.js'\n\nimport { type HexToBytesErrorType, hexToBytes } from './toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from './toHex.js'\n\nexport type RecursiveArray<T> = T | readonly RecursiveArray<T>[]\n\ntype To = 'hex' | 'bytes'\n\ntype Encodable = {\n length: number\n encode(cursor: Cursor): void\n}\n\nexport type ToRlpReturnType<to extends To> =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type ToRlpErrorType =\n | CreateCursorErrorType\n | BytesToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\nexport function toRlp<to extends To = 'hex'>(\n bytes: RecursiveArray<ByteArray> | RecursiveArray<Hex>,\n to: to | To | undefined = 'hex',\n): ToRlpReturnType<to> {\n const encodable = getEncodable(bytes)\n const cursor = createCursor(new Uint8Array(encodable.length))\n encodable.encode(cursor)\n\n if (to === 'hex') return bytesToHex(cursor.bytes) as ToRlpReturnType<to>\n return cursor.bytes as ToRlpReturnType<to>\n}\n\nexport type BytesToRlpErrorType = ToRlpErrorType | ErrorType\n\nexport function bytesToRlp<to extends To = 'bytes'>(\n bytes: RecursiveArray<ByteArray>,\n to: to | To | undefined = 'bytes',\n): ToRlpReturnType<to> {\n return toRlp(bytes, to)\n}\n\nexport type HexToRlpErrorType = ToRlpErrorType | ErrorType\n\nexport function hexToRlp<to extends To = 'hex'>(\n hex: RecursiveArray<Hex>,\n to: to | To | undefined = 'hex',\n): ToRlpReturnType<to> {\n return toRlp(hex, to)\n}\n\nfunction getEncodable(\n bytes: RecursiveArray<ByteArray> | RecursiveArray<Hex>,\n): Encodable {\n if (Array.isArray(bytes))\n return getEncodableList(bytes.map((x) => getEncodable(x)))\n return getEncodableBytes(bytes as any)\n}\n\nfunction getEncodableList(list: Encodable[]): Encodable {\n const bodyLength = list.reduce((acc, x) => acc + x.length, 0)\n\n const sizeOfBodyLength = getSizeOfLength(bodyLength)\n const length = (() => {\n if (bodyLength <= 55) return 1 + bodyLength\n return 1 + sizeOfBodyLength + bodyLength\n })()\n\n return {\n length,\n encode(cursor: Cursor) {\n if (bodyLength <= 55) {\n cursor.pushByte(0xc0 + bodyLength)\n } else {\n cursor.pushByte(0xc0 + 55 + sizeOfBodyLength)\n if (sizeOfBodyLength === 1) cursor.pushUint8(bodyLength)\n else if (sizeOfBodyLength === 2) cursor.pushUint16(bodyLength)\n else if (sizeOfBodyLength === 3) cursor.pushUint24(bodyLength)\n else cursor.pushUint32(bodyLength)\n }\n for (const { encode } of list) {\n encode(cursor)\n }\n },\n }\n}\n\nfunction getEncodableBytes(bytesOrHex: ByteArray | Hex): Encodable {\n const bytes =\n typeof bytesOrHex === 'string' ? hexToBytes(bytesOrHex) : bytesOrHex\n\n const sizeOfBytesLength = getSizeOfLength(bytes.length)\n const length = (() => {\n if (bytes.length === 1 && bytes[0] < 0x80) return 1\n if (bytes.length <= 55) return 1 + bytes.length\n return 1 + sizeOfBytesLength + bytes.length\n })()\n\n return {\n length,\n encode(cursor: Cursor) {\n if (bytes.length === 1 && bytes[0] < 0x80) {\n cursor.pushBytes(bytes)\n } else if (bytes.length <= 55) {\n cursor.pushByte(0x80 + bytes.length)\n cursor.pushBytes(bytes)\n } else {\n cursor.pushByte(0x80 + 55 + sizeOfBytesLength)\n if (sizeOfBytesLength === 1) cursor.pushUint8(bytes.length)\n else if (sizeOfBytesLength === 2) cursor.pushUint16(bytes.length)\n else if (sizeOfBytesLength === 3) cursor.pushUint24(bytes.length)\n else cursor.pushUint32(bytes.length)\n cursor.pushBytes(bytes)\n }\n },\n }\n}\n\nfunction getSizeOfLength(length: number) {\n if (length < 2 ** 8) return 1\n if (length < 2 ** 16) return 2\n if (length < 2 ** 24) return 3\n if (length < 2 ** 32) return 4\n throw new BaseError('Length is too large.')\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { AuthorizationRequest } from '../../types/authorization.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type ConcatHexErrorType, concatHex } from '../data/concat.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type NumberToHexErrorType, numberToHex } from '../encoding/toHex.js'\nimport { type ToRlpErrorType, toRlp } from '../encoding/toRlp.js'\nimport { type Keccak256ErrorType, keccak256 } from '../hash/keccak256.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type HashAuthorizationParameters<to extends To> =\n AuthorizationRequest & {\n /** Output format. @default \"hex\" */\n to?: to | To | undefined\n }\n\nexport type HashAuthorizationReturnType<to extends To> =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type HashAuthorizationErrorType =\n | Keccak256ErrorType\n | ConcatHexErrorType\n | ToRlpErrorType\n | NumberToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Computes an Authorization hash in [EIP-7702 format](https://eips.ethereum.org/EIPS/eip-7702): `keccak256('0x05' || rlp([chain_id, address, nonce]))`.\n */\nexport function hashAuthorization<to extends To = 'hex'>(\n parameters: HashAuthorizationParameters<to>,\n): HashAuthorizationReturnType<to> {\n const { chainId, nonce, to } = parameters\n const address = parameters.contractAddress ?? parameters.address\n const hash = keccak256(\n concatHex([\n '0x05',\n toRlp([\n chainId ? numberToHex(chainId) : '0x',\n address,\n nonce ? numberToHex(nonce) : '0x',\n ]),\n ]),\n )\n if (to === 'bytes') return hexToBytes(hash) as HashAuthorizationReturnType<to>\n return hash as HashAuthorizationReturnType<to>\n}\n","import type { Address } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n Authorization,\n AuthorizationRequest,\n SignedAuthorization,\n} from '../../types/authorization.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport type { OneOf } from '../../types/utils.js'\nimport {\n type RecoverAddressErrorType,\n recoverAddress,\n} from '../signature/recoverAddress.js'\nimport {\n type HashAuthorizationErrorType,\n hashAuthorization,\n} from './hashAuthorization.js'\n\nexport type RecoverAuthorizationAddressParameters<\n authorization extends OneOf<\n Authorization | AuthorizationRequest | SignedAuthorization\n > = OneOf<Authorization | AuthorizationRequest | SignedAuthorization>,\n //\n _signature = Hex | ByteArray | OneOf<Signature | SignedAuthorization>,\n> = {\n /**\n * The Authorization object.\n *\n * - If an unsigned `authorization` is provided, the `signature` property is required.\n * - If a signed `authorization` is provided, the `signature` property does not need to be provided.\n */\n authorization:\n | authorization\n | OneOf<Authorization | AuthorizationRequest | SignedAuthorization>\n} & (authorization extends SignedAuthorization\n ? {\n /** Signature of the Authorization. Not required if the `authorization` is signed. */\n signature?: _signature | undefined\n }\n : {\n /** Signature of the Authorization. Not required if the `authorization` is signed. */\n signature: _signature\n })\n\nexport type RecoverAuthorizationAddressReturnType = Address\n\nexport type RecoverAuthorizationAddressErrorType =\n | HashAuthorizationErrorType\n | RecoverAddressErrorType\n | ErrorType\n\nexport async function recoverAuthorizationAddress<\n const authorization extends OneOf<\n Authorization | AuthorizationRequest | SignedAuthorization\n >,\n>(\n parameters: RecoverAuthorizationAddressParameters<authorization>,\n): Promise<RecoverAuthorizationAddressReturnType> {\n const { authorization, signature } = parameters\n\n return recoverAddress({\n hash: hashAuthorization(authorization as AuthorizationRequest),\n signature: (signature ?? authorization) as Signature,\n })\n}\n","import type { Account } from '../accounts/types.js'\nimport type { EstimateGasParameters } from '../actions/public/estimateGas.js'\nimport type { Chain } from '../types/chain.js'\nimport { formatEther } from '../utils/unit/formatEther.js'\nimport { formatGwei } from '../utils/unit/formatGwei.js'\n\nimport { BaseError } from './base.js'\nimport { prettyPrint } from './transaction.js'\n\nexport type EstimateGasExecutionErrorType = EstimateGasExecutionError & {\n name: 'EstimateGasExecutionError'\n}\nexport class EstimateGasExecutionError extends BaseError {\n override cause: BaseError\n\n constructor(\n cause: BaseError,\n {\n account,\n docsPath,\n chain,\n data,\n gas,\n gasPrice,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n value,\n }: Omit<EstimateGasParameters<any>, 'account'> & {\n account?: Account | undefined\n chain?: Chain | undefined\n docsPath?: string | undefined\n },\n ) {\n const prettyArgs = prettyPrint({\n from: account?.address,\n to,\n value:\n typeof value !== 'undefined' &&\n `${formatEther(value)} ${chain?.nativeCurrency?.symbol || 'ETH'}`,\n data,\n gas,\n gasPrice:\n typeof gasPrice !== 'undefined' && `${formatGwei(gasPrice)} gwei`,\n maxFeePerGas:\n typeof maxFeePerGas !== 'undefined' &&\n `${formatGwei(maxFeePerGas)} gwei`,\n maxPriorityFeePerGas:\n typeof maxPriorityFeePerGas !== 'undefined' &&\n `${formatGwei(maxPriorityFeePerGas)} gwei`,\n nonce,\n })\n\n super(cause.shortMessage, {\n cause,\n docsPath,\n metaMessages: [\n ...(cause.metaMessages ? [...cause.metaMessages, ' '] : []),\n 'Estimate Gas Arguments:',\n prettyArgs,\n ].filter(Boolean) as string[],\n name: 'EstimateGasExecutionError',\n })\n this.cause = cause\n }\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { EstimateGasParameters } from '../../actions/public/estimateGas.js'\nimport type { BaseError } from '../../errors/base.js'\nimport {\n EstimateGasExecutionError,\n type EstimateGasExecutionErrorType,\n} from '../../errors/estimateGas.js'\nimport { UnknownNodeError } from '../../errors/node.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\n\nimport {\n type GetNodeErrorParameters,\n type GetNodeErrorReturnType,\n getNodeError,\n} from './getNodeError.js'\n\nexport type GetEstimateGasErrorReturnType<cause = ErrorType> = Omit<\n EstimateGasExecutionErrorType,\n 'cause'\n> & { cause: cause | GetNodeErrorReturnType }\n\nexport function getEstimateGasError<err extends ErrorType<string>>(\n err: err,\n {\n docsPath,\n ...args\n }: Omit<EstimateGasParameters, 'account'> & {\n account?: Account | undefined\n chain?: Chain | undefined\n docsPath?: string | undefined\n },\n): GetEstimateGasErrorReturnType<err> {\n const cause = (() => {\n const cause = getNodeError(\n err as {} as BaseError,\n args as GetNodeErrorParameters,\n )\n if (cause instanceof UnknownNodeError) return err as {} as BaseError\n return cause\n })()\n return new EstimateGasExecutionError(cause, {\n docsPath,\n ...args,\n }) as GetEstimateGasErrorReturnType<err>\n}\n","import { formatGwei } from '../utils/unit/formatGwei.js'\nimport { BaseError } from './base.js'\n\nexport type BaseFeeScalarErrorType = BaseFeeScalarError & {\n name: 'BaseFeeScalarError'\n}\nexport class BaseFeeScalarError extends BaseError {\n constructor() {\n super('`baseFeeMultiplier` must be greater than 1.', {\n name: 'BaseFeeScalarError',\n })\n }\n}\n\nexport type Eip1559FeesNotSupportedErrorType = Eip1559FeesNotSupportedError & {\n name: 'Eip1559FeesNotSupportedError'\n}\nexport class Eip1559FeesNotSupportedError extends BaseError {\n constructor() {\n super('Chain does not support EIP-1559 fees.', {\n name: 'Eip1559FeesNotSupportedError',\n })\n }\n}\n\nexport type MaxFeePerGasTooLowErrorType = MaxFeePerGasTooLowError & {\n name: 'MaxFeePerGasTooLowError'\n}\nexport class MaxFeePerGasTooLowError extends BaseError {\n constructor({ maxPriorityFeePerGas }: { maxPriorityFeePerGas: bigint }) {\n super(\n `\\`maxFeePerGas\\` cannot be less than the \\`maxPriorityFeePerGas\\` (${formatGwei(\n maxPriorityFeePerGas,\n )} gwei).`,\n { name: 'MaxFeePerGasTooLowError' },\n )\n }\n}\n","import type { Hash } from '../types/misc.js'\n\nimport { BaseError } from './base.js'\n\nexport type BlockNotFoundErrorType = BlockNotFoundError & {\n name: 'BlockNotFoundError'\n}\nexport class BlockNotFoundError extends BaseError {\n constructor({\n blockHash,\n blockNumber,\n }: {\n blockHash?: Hash | undefined\n blockNumber?: bigint | undefined\n }) {\n let identifier = 'Block'\n if (blockHash) identifier = `Block at hash \"${blockHash}\"`\n if (blockNumber) identifier = `Block at number \"${blockNumber}\"`\n super(`${identifier} could not be found.`, { name: 'BlockNotFoundError' })\n }\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { SignedAuthorizationList } from '../../types/authorization.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type {\n Chain,\n ExtractChainFormatterExclude,\n ExtractChainFormatterReturnType,\n} from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RpcAuthorizationList, RpcTransaction } from '../../types/rpc.js'\nimport type { Transaction, TransactionType } from '../../types/transaction.js'\nimport type { ExactPartial, UnionLooseOmit } from '../../types/utils.js'\nimport { hexToNumber } from '../encoding/fromHex.js'\nimport { type DefineFormatterErrorType, defineFormatter } from './formatter.js'\n\ntype TransactionPendingDependencies =\n | 'blockHash'\n | 'blockNumber'\n | 'transactionIndex'\n\nexport type FormattedTransaction<\n chain extends Chain | undefined = undefined,\n blockTag extends BlockTag = BlockTag,\n _FormatterReturnType = ExtractChainFormatterReturnType<\n chain,\n 'transaction',\n Transaction\n >,\n _ExcludedPendingDependencies extends string = TransactionPendingDependencies &\n ExtractChainFormatterExclude<chain, 'transaction'>,\n> = UnionLooseOmit<_FormatterReturnType, TransactionPendingDependencies> & {\n [_K in _ExcludedPendingDependencies]: never\n} & Pick<\n Transaction<bigint, number, blockTag extends 'pending' ? true : false>,\n TransactionPendingDependencies\n >\n\nexport const transactionType = {\n '0x0': 'legacy',\n '0x1': 'eip2930',\n '0x2': 'eip1559',\n '0x3': 'eip4844',\n '0x4': 'eip7702',\n} as const satisfies Record<Hex, TransactionType>\n\nexport type FormatTransactionErrorType = ErrorType\n\nexport function formatTransaction(\n transaction: ExactPartial<RpcTransaction>,\n _?: string | undefined,\n) {\n const transaction_ = {\n ...transaction,\n blockHash: transaction.blockHash ? transaction.blockHash : null,\n blockNumber: transaction.blockNumber\n ? BigInt(transaction.blockNumber)\n : null,\n chainId: transaction.chainId ? hexToNumber(transaction.chainId) : undefined,\n gas: transaction.gas ? BigInt(transaction.gas) : undefined,\n gasPrice: transaction.gasPrice ? BigInt(transaction.gasPrice) : undefined,\n maxFeePerBlobGas: transaction.maxFeePerBlobGas\n ? BigInt(transaction.maxFeePerBlobGas)\n : undefined,\n maxFeePerGas: transaction.maxFeePerGas\n ? BigInt(transaction.maxFeePerGas)\n : undefined,\n maxPriorityFeePerGas: transaction.maxPriorityFeePerGas\n ? BigInt(transaction.maxPriorityFeePerGas)\n : undefined,\n nonce: transaction.nonce ? hexToNumber(transaction.nonce) : undefined,\n to: transaction.to ? transaction.to : null,\n transactionIndex: transaction.transactionIndex\n ? Number(transaction.transactionIndex)\n : null,\n type: transaction.type\n ? (transactionType as any)[transaction.type]\n : undefined,\n typeHex: transaction.type ? transaction.type : undefined,\n value: transaction.value ? BigInt(transaction.value) : undefined,\n v: transaction.v ? BigInt(transaction.v) : undefined,\n } as Transaction\n\n if (transaction.authorizationList)\n transaction_.authorizationList = formatAuthorizationList(\n transaction.authorizationList,\n )\n\n transaction_.yParity = (() => {\n // If `yParity` is provided, we will use it.\n if (transaction.yParity) return Number(transaction.yParity)\n\n // If no `yParity` provided, try derive from `v`.\n if (typeof transaction_.v === 'bigint') {\n if (transaction_.v === 0n || transaction_.v === 27n) return 0\n if (transaction_.v === 1n || transaction_.v === 28n) return 1\n if (transaction_.v >= 35n) return transaction_.v % 2n === 0n ? 1 : 0\n }\n\n return undefined\n })()\n\n if (transaction_.type === 'legacy') {\n delete transaction_.accessList\n delete transaction_.maxFeePerBlobGas\n delete transaction_.maxFeePerGas\n delete transaction_.maxPriorityFeePerGas\n delete transaction_.yParity\n }\n if (transaction_.type === 'eip2930') {\n delete transaction_.maxFeePerBlobGas\n delete transaction_.maxFeePerGas\n delete transaction_.maxPriorityFeePerGas\n }\n if (transaction_.type === 'eip1559') delete transaction_.maxFeePerBlobGas\n\n return transaction_\n}\n\nexport type DefineTransactionErrorType = DefineFormatterErrorType | ErrorType\n\nexport const defineTransaction = /*#__PURE__*/ defineFormatter(\n 'transaction',\n formatTransaction,\n)\n\n//////////////////////////////////////////////////////////////////////////////\n\nfunction formatAuthorizationList(\n authorizationList: RpcAuthorizationList,\n): SignedAuthorizationList {\n return authorizationList.map((authorization) => ({\n address: (authorization as any).address,\n chainId: Number(authorization.chainId),\n nonce: Number(authorization.nonce),\n r: authorization.r,\n s: authorization.s,\n yParity: Number(authorization.yParity),\n })) as SignedAuthorizationList\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Block, BlockTag } from '../../types/block.js'\nimport type {\n Chain,\n ExtractChainFormatterExclude,\n ExtractChainFormatterReturnType,\n} from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { RpcBlock } from '../../types/rpc.js'\nimport type { ExactPartial, Prettify } from '../../types/utils.js'\n\nimport { type DefineFormatterErrorType, defineFormatter } from './formatter.js'\nimport { type FormattedTransaction, formatTransaction } from './transaction.js'\n\ntype BlockPendingDependencies = 'hash' | 'logsBloom' | 'nonce' | 'number'\n\nexport type FormattedBlock<\n chain extends Chain | undefined = undefined,\n includeTransactions extends boolean = boolean,\n blockTag extends BlockTag = BlockTag,\n _FormatterReturnType = ExtractChainFormatterReturnType<\n chain,\n 'block',\n Block<bigint, includeTransactions>\n >,\n _ExcludedPendingDependencies extends string = BlockPendingDependencies &\n ExtractChainFormatterExclude<chain, 'block'>,\n _Formatted = Omit<_FormatterReturnType, BlockPendingDependencies> & {\n [_key in _ExcludedPendingDependencies]: never\n } & Pick<\n Block<bigint, includeTransactions, blockTag>,\n BlockPendingDependencies\n >,\n _Transactions = includeTransactions extends true\n ? Prettify<FormattedTransaction<chain, blockTag>>[]\n : Hash[],\n> = Omit<_Formatted, 'transactions'> & {\n transactions: _Transactions\n}\n\nexport type FormatBlockErrorType = ErrorType\n\nexport function formatBlock(\n block: ExactPartial<RpcBlock>,\n _?: string | undefined,\n) {\n const transactions = (block.transactions ?? []).map((transaction) => {\n if (typeof transaction === 'string') return transaction\n return formatTransaction(transaction)\n })\n return {\n ...block,\n baseFeePerGas: block.baseFeePerGas ? BigInt(block.baseFeePerGas) : null,\n blobGasUsed: block.blobGasUsed ? BigInt(block.blobGasUsed) : undefined,\n difficulty: block.difficulty ? BigInt(block.difficulty) : undefined,\n excessBlobGas: block.excessBlobGas\n ? BigInt(block.excessBlobGas)\n : undefined,\n gasLimit: block.gasLimit ? BigInt(block.gasLimit) : undefined,\n gasUsed: block.gasUsed ? BigInt(block.gasUsed) : undefined,\n hash: block.hash ? block.hash : null,\n logsBloom: block.logsBloom ? block.logsBloom : null,\n nonce: block.nonce ? block.nonce : null,\n number: block.number ? BigInt(block.number) : null,\n size: block.size ? BigInt(block.size) : undefined,\n timestamp: block.timestamp ? BigInt(block.timestamp) : undefined,\n transactions,\n totalDifficulty: block.totalDifficulty\n ? BigInt(block.totalDifficulty)\n : null,\n } as Block\n}\n\nexport type DefineBlockErrorType = DefineFormatterErrorType | ErrorType\n\nexport const defineBlock = /*#__PURE__*/ defineFormatter('block', formatBlock)\n","import type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n BlockNotFoundError,\n type BlockNotFoundErrorType,\n} from '../../errors/block.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { RpcBlock } from '../../types/rpc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormattedBlock,\n formatBlock,\n} from '../../utils/formatters/block.js'\n\nexport type GetBlockParameters<\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n> = {\n /** Whether or not to include transaction data in the response. */\n includeTransactions?: includeTransactions | undefined\n} & (\n | {\n /** Hash of the block. */\n blockHash?: Hash | undefined\n blockNumber?: undefined\n blockTag?: undefined\n }\n | {\n blockHash?: undefined\n /** The block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockHash?: undefined\n blockNumber?: undefined\n /**\n * The block tag.\n * @default 'latest'\n */\n blockTag?: blockTag | BlockTag | undefined\n }\n)\n\nexport type GetBlockReturnType<\n chain extends Chain | undefined = undefined,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n> = Prettify<FormattedBlock<chain, includeTransactions, blockTag>>\n\nexport type GetBlockErrorType =\n | BlockNotFoundErrorType\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns information about a block at a block number, hash, or tag.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlock\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_fetching-blocks\n * - JSON-RPC Methods:\n * - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) for `blockNumber` & `blockTag`.\n * - Calls [`eth_getBlockByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbyhash) for `blockHash`.\n *\n * @param client - Client to use\n * @param parameters - {@link GetBlockParameters}\n * @returns Information about the block. {@link GetBlockReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlock } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const block = await getBlock(client)\n */\nexport async function getBlock<\n chain extends Chain | undefined,\n account extends Account | undefined,\n includeTransactions extends boolean = false,\n blockTag extends BlockTag = 'latest',\n>(\n client: Client<Transport, chain, account>,\n {\n blockHash,\n blockNumber,\n blockTag = client.experimental_blockTag ?? 'latest',\n includeTransactions: includeTransactions_,\n }: GetBlockParameters<includeTransactions, blockTag> = {},\n): Promise<GetBlockReturnType<chain, includeTransactions, blockTag>> {\n const includeTransactions = includeTransactions_ ?? false\n\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n\n let block: RpcBlock | null = null\n if (blockHash) {\n block = await client.request(\n {\n method: 'eth_getBlockByHash',\n params: [blockHash, includeTransactions],\n },\n { dedupe: true },\n )\n } else {\n block = await client.request(\n {\n method: 'eth_getBlockByNumber',\n params: [blockNumberHex || blockTag, includeTransactions],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n }\n\n if (!block) throw new BlockNotFoundError({ blockHash, blockNumber })\n\n const format = client.chain?.formatters?.block?.format || formatBlock\n return format(block, 'getBlock')\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\n\nexport type GetGasPriceReturnType = bigint\n\nexport type GetGasPriceErrorType = RequestErrorType | ErrorType\n\n/**\n * Returns the current price of gas (in wei).\n *\n * - Docs: https://viem.sh/docs/actions/public/getGasPrice\n * - JSON-RPC Methods: [`eth_gasPrice`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gasprice)\n *\n * @param client - Client to use\n * @returns The gas price (in wei). {@link GetGasPriceReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getGasPrice } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gasPrice = await getGasPrice(client)\n */\nexport async function getGasPrice<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(client: Client<Transport, chain, account>): Promise<GetGasPriceReturnType> {\n const gasPrice = await client.request({\n method: 'eth_gasPrice',\n })\n return BigInt(gasPrice)\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n Eip1559FeesNotSupportedError,\n type Eip1559FeesNotSupportedErrorType,\n} from '../../errors/fee.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Block } from '../../types/block.js'\nimport type {\n Chain,\n ChainFeesFnParameters,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type HexToBigIntErrorType,\n hexToBigInt,\n} from '../../utils/encoding/fromHex.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { PrepareTransactionRequestParameters } from '../wallet/prepareTransactionRequest.js'\nimport { type GetBlockErrorType, getBlock } from './getBlock.js'\nimport { type GetGasPriceErrorType, getGasPrice } from './getGasPrice.js'\n\nexport type EstimateMaxPriorityFeePerGasParameters<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n> = GetChainParameter<chain, chainOverride>\n\nexport type EstimateMaxPriorityFeePerGasReturnType = bigint\n\nexport type EstimateMaxPriorityFeePerGasErrorType =\n | GetBlockErrorType\n | HexToBigIntErrorType\n | RequestErrorType\n | GetBlockErrorType\n | GetGasPriceErrorType\n | Eip1559FeesNotSupportedErrorType\n | ErrorType\n\n/**\n * Returns an estimate for the max priority fee per gas (in wei) for a\n * transaction to be likely included in the next block.\n * Defaults to [`chain.fees.defaultPriorityFee`](/docs/clients/chains#fees-defaultpriorityfee) if set.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateMaxPriorityFeePerGas\n *\n * @param client - Client to use\n * @returns An estimate (in wei) for the max priority fee per gas. {@link EstimateMaxPriorityFeePerGasReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateMaxPriorityFeePerGas } from 'viem/actions'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const maxPriorityFeePerGas = await estimateMaxPriorityFeePerGas(client)\n * // 10000000n\n */\nexport async function estimateMaxPriorityFeePerGas<\n chain extends Chain | undefined,\n chainOverride extends Chain | undefined,\n>(\n client: Client<Transport, chain>,\n args?:\n | EstimateMaxPriorityFeePerGasParameters<chain, chainOverride>\n | undefined,\n): Promise<EstimateMaxPriorityFeePerGasReturnType> {\n return internal_estimateMaxPriorityFeePerGas(client, args as any)\n}\n\nexport async function internal_estimateMaxPriorityFeePerGas<\n chain extends Chain | undefined,\n chainOverride extends Chain | undefined,\n>(\n client: Client<Transport, chain>,\n args: EstimateMaxPriorityFeePerGasParameters<chain, chainOverride> & {\n block?: Block | undefined\n request?:\n | PrepareTransactionRequestParameters<\n chain,\n Account | undefined,\n chainOverride\n >\n | undefined\n },\n): Promise<EstimateMaxPriorityFeePerGasReturnType> {\n const { block: block_, chain = client.chain, request } = args || {}\n\n try {\n const maxPriorityFeePerGas =\n chain?.fees?.maxPriorityFeePerGas ?? chain?.fees?.defaultPriorityFee\n\n if (typeof maxPriorityFeePerGas === 'function') {\n const block =\n block_ || (await getAction(client, getBlock, 'getBlock')({}))\n const maxPriorityFeePerGas_ = await maxPriorityFeePerGas({\n block,\n client,\n request,\n } as ChainFeesFnParameters)\n if (maxPriorityFeePerGas_ === null) throw new Error()\n return maxPriorityFeePerGas_\n }\n\n if (typeof maxPriorityFeePerGas !== 'undefined') return maxPriorityFeePerGas\n\n const maxPriorityFeePerGasHex = await client.request({\n method: 'eth_maxPriorityFeePerGas',\n })\n return hexToBigInt(maxPriorityFeePerGasHex)\n } catch {\n // If the RPC Provider does not support `eth_maxPriorityFeePerGas`\n // fall back to calculating it manually via `gasPrice - baseFeePerGas`.\n // See: https://github.com/ethereum/pm/issues/328#:~:text=eth_maxPriorityFeePerGas%20after%20London%20will%20effectively%20return%20eth_gasPrice%20%2D%20baseFee\n const [block, gasPrice] = await Promise.all([\n block_\n ? Promise.resolve(block_)\n : getAction(client, getBlock, 'getBlock')({}),\n getAction(client, getGasPrice, 'getGasPrice')({}),\n ])\n\n if (typeof block.baseFeePerGas !== 'bigint')\n throw new Eip1559FeesNotSupportedError()\n\n const maxPriorityFeePerGas = gasPrice - block.baseFeePerGas\n\n if (maxPriorityFeePerGas < 0n) return 0n\n return maxPriorityFeePerGas\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n BaseFeeScalarError,\n type BaseFeeScalarErrorType,\n Eip1559FeesNotSupportedError,\n type Eip1559FeesNotSupportedErrorType,\n} from '../../errors/fee.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Block } from '../../types/block.js'\nimport type {\n Chain,\n ChainEstimateFeesPerGasFnParameters,\n ChainFeesFnParameters,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type {\n FeeValuesEIP1559,\n FeeValuesLegacy,\n FeeValuesType,\n} from '../../types/fee.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { PrepareTransactionRequestParameters } from '../wallet/prepareTransactionRequest.js'\nimport {\n type EstimateMaxPriorityFeePerGasErrorType,\n internal_estimateMaxPriorityFeePerGas,\n} from './estimateMaxPriorityFeePerGas.js'\nimport { getBlock } from './getBlock.js'\nimport { type GetGasPriceErrorType, getGasPrice } from './getGasPrice.js'\n\nexport type EstimateFeesPerGasParameters<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n type extends FeeValuesType = FeeValuesType,\n> = {\n /**\n * The type of fee values to return.\n *\n * - `legacy`: Returns the legacy gas price.\n * - `eip1559`: Returns the max fee per gas and max priority fee per gas.\n *\n * @default 'eip1559'\n */\n type?: type | FeeValuesType | undefined\n} & GetChainParameter<chain, chainOverride>\n\nexport type EstimateFeesPerGasReturnType<\n type extends FeeValuesType = FeeValuesType,\n> =\n | (type extends 'legacy' ? FeeValuesLegacy : never)\n | (type extends 'eip1559' ? FeeValuesEIP1559 : never)\n\nexport type EstimateFeesPerGasErrorType =\n | BaseFeeScalarErrorType\n | EstimateMaxPriorityFeePerGasErrorType\n | GetGasPriceErrorType\n | Eip1559FeesNotSupportedErrorType\n | ErrorType\n\n/**\n * Returns an estimate for the fees per gas (in wei) for a\n * transaction to be likely included in the next block.\n * Defaults to [`chain.fees.estimateFeesPerGas`](/docs/clients/chains#fees-estimatefeespergas) if set.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateFeesPerGas\n *\n * @param client - Client to use\n * @param parameters - {@link EstimateFeesPerGasParameters}\n * @returns An estimate (in wei) for the fees per gas. {@link EstimateFeesPerGasReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateFeesPerGas } from 'viem/actions'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const maxPriorityFeePerGas = await estimateFeesPerGas(client)\n * // { maxFeePerGas: ..., maxPriorityFeePerGas: ... }\n */\nexport async function estimateFeesPerGas<\n chain extends Chain | undefined,\n chainOverride extends Chain | undefined,\n type extends FeeValuesType = 'eip1559',\n>(\n client: Client<Transport, chain>,\n args?: EstimateFeesPerGasParameters<chain, chainOverride, type> | undefined,\n): Promise<EstimateFeesPerGasReturnType<type>> {\n return internal_estimateFeesPerGas(client, args as any)\n}\n\nexport async function internal_estimateFeesPerGas<\n chain extends Chain | undefined,\n chainOverride extends Chain | undefined,\n type extends FeeValuesType = 'eip1559',\n>(\n client: Client<Transport, chain>,\n args: EstimateFeesPerGasParameters<chain, chainOverride, type> & {\n block?: Block | undefined\n request?: PrepareTransactionRequestParameters<Chain, Account> | undefined\n },\n): Promise<EstimateFeesPerGasReturnType<type>> {\n const {\n block: block_,\n chain = client.chain,\n request,\n type = 'eip1559',\n } = args || {}\n\n const baseFeeMultiplier = await (async () => {\n if (typeof chain?.fees?.baseFeeMultiplier === 'function')\n return chain.fees.baseFeeMultiplier({\n block: block_ as Block,\n client,\n request,\n } as ChainFeesFnParameters)\n return chain?.fees?.baseFeeMultiplier ?? 1.2\n })()\n if (baseFeeMultiplier < 1) throw new BaseFeeScalarError()\n\n const decimals = baseFeeMultiplier.toString().split('.')[1]?.length ?? 0\n const denominator = 10 ** decimals\n const multiply = (base: bigint) =>\n (base * BigInt(Math.ceil(baseFeeMultiplier * denominator))) /\n BigInt(denominator)\n\n const block = block_\n ? block_\n : await getAction(client, getBlock, 'getBlock')({})\n\n if (typeof chain?.fees?.estimateFeesPerGas === 'function') {\n const fees = (await chain.fees.estimateFeesPerGas({\n block: block_ as Block,\n client,\n multiply,\n request,\n type,\n } as ChainEstimateFeesPerGasFnParameters)) as unknown as EstimateFeesPerGasReturnType<type>\n\n if (fees !== null) return fees\n }\n\n if (type === 'eip1559') {\n if (typeof block.baseFeePerGas !== 'bigint')\n throw new Eip1559FeesNotSupportedError()\n\n const maxPriorityFeePerGas =\n typeof request?.maxPriorityFeePerGas === 'bigint'\n ? request.maxPriorityFeePerGas\n : await internal_estimateMaxPriorityFeePerGas(\n client as Client<Transport, Chain>,\n {\n block: block as Block,\n chain,\n request,\n },\n )\n\n const baseFeePerGas = multiply(block.baseFeePerGas)\n const maxFeePerGas =\n request?.maxFeePerGas ?? baseFeePerGas + maxPriorityFeePerGas\n\n return {\n maxFeePerGas,\n maxPriorityFeePerGas,\n } as EstimateFeesPerGasReturnType<type>\n }\n\n const gasPrice =\n request?.gasPrice ??\n multiply(await getAction(client, getGasPrice, 'getGasPrice')({}))\n return {\n gasPrice,\n } as EstimateFeesPerGasReturnType<type>\n}\n","import type { Address } from 'abitype'\n\nimport type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type HexToNumberErrorType,\n hexToNumber,\n} from '../../utils/encoding/fromHex.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\n\nexport type GetTransactionCountParameters = {\n /** The account address. */\n address: Address\n} & (\n | {\n /** The block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /** The block tag. Defaults to 'latest'. */\n blockTag?: BlockTag | undefined\n }\n)\nexport type GetTransactionCountReturnType = number\n\nexport type GetTransactionCountErrorType =\n | RequestErrorType\n | NumberToHexErrorType\n | HexToNumberErrorType\n | ErrorType\n\n/**\n * Returns the number of [Transactions](https://viem.sh/docs/glossary/terms#transaction) an Account has sent.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionCount\n * - JSON-RPC Methods: [`eth_getTransactionCount`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactioncount)\n *\n * @param client - Client to use\n * @param parameters - {@link GetTransactionCountParameters}\n * @returns The number of transactions an account has sent. {@link GetTransactionCountReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getTransactionCount } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionCount = await getTransactionCount(client, {\n * address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * })\n */\nexport async function getTransactionCount<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n { address, blockTag = 'latest', blockNumber }: GetTransactionCountParameters,\n): Promise<GetTransactionCountReturnType> {\n const count = await client.request(\n {\n method: 'eth_getTransactionCount',\n params: [\n address,\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : blockTag,\n ],\n },\n {\n dedupe: Boolean(blockNumber),\n },\n )\n return hexToNumber(count)\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Kzg } from '../../types/kzg.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type BlobsToCommitmentsParameters<\n blobs extends readonly ByteArray[] | readonly Hex[] =\n | readonly ByteArray[]\n | readonly Hex[],\n to extends To | undefined = undefined,\n> = {\n /** Blobs to transform into commitments. */\n blobs: blobs | readonly ByteArray[] | readonly Hex[]\n /** KZG implementation. */\n kzg: Pick<Kzg, 'blobToKzgCommitment'>\n /** Return type. */\n to?: to | To | undefined\n}\n\nexport type BlobsToCommitmentsReturnType<to extends To> =\n | (to extends 'bytes' ? readonly ByteArray[] : never)\n | (to extends 'hex' ? readonly Hex[] : never)\n\nexport type BlobsToCommitmentsErrorType =\n | HexToBytesErrorType\n | BytesToHexErrorType\n | ErrorType\n\n/**\n * Compute commitments from a list of blobs.\n *\n * @example\n * ```ts\n * import { blobsToCommitments, toBlobs } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * ```\n */\nexport function blobsToCommitments<\n const blobs extends readonly ByteArray[] | readonly Hex[],\n to extends To =\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n>(\n parameters: BlobsToCommitmentsParameters<blobs, to>,\n): BlobsToCommitmentsReturnType<to> {\n const { kzg } = parameters\n\n const to =\n parameters.to ?? (typeof parameters.blobs[0] === 'string' ? 'hex' : 'bytes')\n const blobs = (\n typeof parameters.blobs[0] === 'string'\n ? parameters.blobs.map((x) => hexToBytes(x as any))\n : parameters.blobs\n ) as ByteArray[]\n\n const commitments: ByteArray[] = []\n for (const blob of blobs)\n commitments.push(Uint8Array.from(kzg.blobToKzgCommitment(blob)))\n\n return (to === 'bytes'\n ? commitments\n : commitments.map((x) =>\n bytesToHex(x),\n )) as {} as BlobsToCommitmentsReturnType<to>\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Kzg } from '../../types/kzg.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type blobsToProofsParameters<\n blobs extends readonly ByteArray[] | readonly Hex[],\n commitments extends readonly ByteArray[] | readonly Hex[],\n to extends To =\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n ///\n _blobsType =\n | (blobs extends readonly Hex[] ? readonly Hex[] : never)\n | (blobs extends readonly ByteArray[] ? readonly ByteArray[] : never),\n> = {\n /** Blobs to transform into proofs. */\n blobs: blobs\n /** Commitments for the blobs. */\n commitments: commitments &\n (commitments extends _blobsType\n ? {}\n : `commitments must be the same type as blobs`)\n /** KZG implementation. */\n kzg: Pick<Kzg, 'computeBlobKzgProof'>\n /** Return type. */\n to?: to | To | undefined\n}\n\nexport type blobsToProofsReturnType<to extends To> =\n | (to extends 'bytes' ? ByteArray[] : never)\n | (to extends 'hex' ? Hex[] : never)\n\nexport type blobsToProofsErrorType =\n | BytesToHexErrorType\n | HexToBytesErrorType\n | ErrorType\n\n/**\n * Compute the proofs for a list of blobs and their commitments.\n *\n * @example\n * ```ts\n * import {\n * blobsToCommitments,\n * toBlobs\n * } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * const proofs = blobsToProofs({ blobs, commitments, kzg })\n * ```\n */\nexport function blobsToProofs<\n const blobs extends readonly ByteArray[] | readonly Hex[],\n const commitments extends readonly ByteArray[] | readonly Hex[],\n to extends To =\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n>(\n parameters: blobsToProofsParameters<blobs, commitments, to>,\n): blobsToProofsReturnType<to> {\n const { kzg } = parameters\n\n const to =\n parameters.to ?? (typeof parameters.blobs[0] === 'string' ? 'hex' : 'bytes')\n\n const blobs = (\n typeof parameters.blobs[0] === 'string'\n ? parameters.blobs.map((x) => hexToBytes(x as any))\n : parameters.blobs\n ) as ByteArray[]\n const commitments = (\n typeof parameters.commitments[0] === 'string'\n ? parameters.commitments.map((x) => hexToBytes(x as any))\n : parameters.commitments\n ) as ByteArray[]\n\n const proofs: ByteArray[] = []\n for (let i = 0; i < blobs.length; i++) {\n const blob = blobs[i]\n const commitment = commitments[i]\n proofs.push(Uint8Array.from(kzg.computeBlobKzgProof(blob, commitment)))\n }\n\n return (to === 'bytes'\n ? proofs\n : proofs.map((x) => bytesToHex(x))) as {} as blobsToProofsReturnType<to>\n}\n","import { sha256 as noble_sha256 } from '@noble/hashes/sha256'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type ToBytesErrorType, toBytes } from '../encoding/toBytes.js'\nimport { type ToHexErrorType, toHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type Sha256Hash<to extends To> =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type Sha256ErrorType =\n | IsHexErrorType\n | ToBytesErrorType\n | ToHexErrorType\n | ErrorType\n\nexport function sha256<to extends To = 'hex'>(\n value: Hex | ByteArray,\n to_?: to | undefined,\n): Sha256Hash<to> {\n const to = to_ || 'hex'\n const bytes = noble_sha256(\n isHex(value, { strict: false }) ? toBytes(value) : value,\n )\n if (to === 'bytes') return bytes as Sha256Hash<to>\n return toHex(bytes) as Sha256Hash<to>\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\nimport { type Sha256ErrorType, sha256 } from '../hash/sha256.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type CommitmentToVersionedHashParameters<\n commitment extends Uint8Array | Hex = Uint8Array | Hex,\n to extends To | undefined = undefined,\n> = {\n /** Commitment from blob. */\n commitment: commitment | Uint8Array | Hex\n /** Return type. */\n to?: to | To | undefined\n /** Version to tag onto the hash. */\n version?: number | undefined\n}\n\nexport type CommitmentToVersionedHashReturnType<to extends To> =\n | (to extends 'bytes' ? ByteArray : never)\n | (to extends 'hex' ? Hex : never)\n\nexport type CommitmentToVersionedHashErrorType =\n | Sha256ErrorType\n | BytesToHexErrorType\n | ErrorType\n\n/**\n * Transform a commitment to it's versioned hash.\n *\n * @example\n * ```ts\n * import {\n * blobsToCommitments,\n * commitmentToVersionedHash,\n * toBlobs\n * } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const [commitment] = blobsToCommitments({ blobs, kzg })\n * const versionedHash = commitmentToVersionedHash({ commitment })\n * ```\n */\nexport function commitmentToVersionedHash<\n const commitment extends Hex | ByteArray,\n to extends To =\n | (commitment extends Hex ? 'hex' : never)\n | (commitment extends ByteArray ? 'bytes' : never),\n>(\n parameters: CommitmentToVersionedHashParameters<commitment, to>,\n): CommitmentToVersionedHashReturnType<to> {\n const { commitment, version = 1 } = parameters\n const to = parameters.to ?? (typeof commitment === 'string' ? 'hex' : 'bytes')\n\n const versionedHash = sha256(commitment, 'bytes')\n versionedHash.set([version], 0)\n return (\n to === 'bytes' ? versionedHash : bytesToHex(versionedHash)\n ) as CommitmentToVersionedHashReturnType<to>\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport {\n type CommitmentToVersionedHashErrorType,\n commitmentToVersionedHash,\n} from './commitmentToVersionedHash.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type CommitmentsToVersionedHashesParameters<\n commitments extends readonly Uint8Array[] | readonly Hex[] =\n | readonly Uint8Array[]\n | readonly Hex[],\n to extends To | undefined = undefined,\n> = {\n /** Commitments from blobs. */\n commitments: commitments | readonly Uint8Array[] | readonly Hex[]\n /** Return type. */\n to?: to | To | undefined\n /** Version to tag onto the hashes. */\n version?: number | undefined\n}\n\nexport type CommitmentsToVersionedHashesReturnType<to extends To> =\n | (to extends 'bytes' ? readonly ByteArray[] : never)\n | (to extends 'hex' ? readonly Hex[] : never)\n\nexport type CommitmentsToVersionedHashesErrorType =\n | CommitmentToVersionedHashErrorType\n | ErrorType\n\n/**\n * Transform a list of commitments to their versioned hashes.\n *\n * @example\n * ```ts\n * import {\n * blobsToCommitments,\n * commitmentsToVersionedHashes,\n * toBlobs\n * } from 'viem'\n * import { kzg } from './kzg'\n *\n * const blobs = toBlobs({ data: '0x1234' })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * const versionedHashes = commitmentsToVersionedHashes({ commitments })\n * ```\n */\nexport function commitmentsToVersionedHashes<\n const commitments extends readonly Uint8Array[] | readonly Hex[],\n to extends To =\n | (commitments extends readonly Hex[] ? 'hex' : never)\n | (commitments extends readonly ByteArray[] ? 'bytes' : never),\n>(\n parameters: CommitmentsToVersionedHashesParameters<commitments, to>,\n): CommitmentsToVersionedHashesReturnType<to> {\n const { commitments, version } = parameters\n\n const to =\n parameters.to ?? (typeof commitments[0] === 'string' ? 'hex' : 'bytes')\n\n const hashes: Uint8Array[] | Hex[] = []\n for (const commitment of commitments) {\n hashes.push(\n commitmentToVersionedHash({\n commitment,\n to,\n version,\n }) as any,\n )\n }\n return hashes as any\n}\n","// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-4844.md#parameters\n\n/** Blob limit per transaction. */\nconst blobsPerTransaction = 6\n\n/** The number of bytes in a BLS scalar field element. */\nexport const bytesPerFieldElement = 32\n\n/** The number of field elements in a blob. */\nexport const fieldElementsPerBlob = 4096\n\n/** The number of bytes in a blob. */\nexport const bytesPerBlob = bytesPerFieldElement * fieldElementsPerBlob\n\n/** Blob bytes limit per transaction. */\nexport const maxBytesPerTransaction =\n bytesPerBlob * blobsPerTransaction -\n // terminator byte (0x80).\n 1 -\n // zero byte (0x00) appended to each field element.\n 1 * fieldElementsPerBlob * blobsPerTransaction\n","// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-4844.md#parameters\n\nexport const versionedHashVersionKzg = 1\n","import { versionedHashVersionKzg } from '../constants/kzg.js'\nimport type { Hash } from '../types/misc.js'\n\nimport { BaseError } from './base.js'\n\nexport type BlobSizeTooLargeErrorType = BlobSizeTooLargeError & {\n name: 'BlobSizeTooLargeError'\n}\nexport class BlobSizeTooLargeError extends BaseError {\n constructor({ maxSize, size }: { maxSize: number; size: number }) {\n super('Blob size is too large.', {\n metaMessages: [`Max: ${maxSize} bytes`, `Given: ${size} bytes`],\n name: 'BlobSizeTooLargeError',\n })\n }\n}\n\nexport type EmptyBlobErrorType = EmptyBlobError & {\n name: 'EmptyBlobError'\n}\nexport class EmptyBlobError extends BaseError {\n constructor() {\n super('Blob data must not be empty.', { name: 'EmptyBlobError' })\n }\n}\n\nexport type InvalidVersionedHashSizeErrorType =\n InvalidVersionedHashSizeError & {\n name: 'InvalidVersionedHashSizeError'\n }\nexport class InvalidVersionedHashSizeError extends BaseError {\n constructor({\n hash,\n size,\n }: {\n hash: Hash\n size: number\n }) {\n super(`Versioned hash \"${hash}\" size is invalid.`, {\n metaMessages: ['Expected: 32', `Received: ${size}`],\n name: 'InvalidVersionedHashSizeError',\n })\n }\n}\n\nexport type InvalidVersionedHashVersionErrorType =\n InvalidVersionedHashVersionError & {\n name: 'InvalidVersionedHashVersionError'\n }\nexport class InvalidVersionedHashVersionError extends BaseError {\n constructor({\n hash,\n version,\n }: {\n hash: Hash\n version: number\n }) {\n super(`Versioned hash \"${hash}\" version is invalid.`, {\n metaMessages: [\n `Expected: ${versionedHashVersionKzg}`,\n `Received: ${version}`,\n ],\n name: 'InvalidVersionedHashVersionError',\n })\n }\n}\n","import {\n bytesPerBlob,\n bytesPerFieldElement,\n fieldElementsPerBlob,\n maxBytesPerTransaction,\n} from '../../constants/blob.js'\nimport {\n BlobSizeTooLargeError,\n type BlobSizeTooLargeErrorType,\n EmptyBlobError,\n type EmptyBlobErrorType,\n} from '../../errors/blob.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport { type CreateCursorErrorType, createCursor } from '../cursor.js'\nimport { type SizeErrorType, size } from '../data/size.js'\nimport { type HexToBytesErrorType, hexToBytes } from '../encoding/toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from '../encoding/toHex.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type ToBlobsParameters<\n data extends Hex | ByteArray = Hex | ByteArray,\n to extends To | undefined = undefined,\n> = {\n /** Data to transform to a blob. */\n data: data | Hex | ByteArray\n /** Return type. */\n to?: to | To | undefined\n}\n\nexport type ToBlobsReturnType<to extends To> =\n | (to extends 'bytes' ? readonly ByteArray[] : never)\n | (to extends 'hex' ? readonly Hex[] : never)\n\nexport type ToBlobsErrorType =\n | BlobSizeTooLargeErrorType\n | BytesToHexErrorType\n | CreateCursorErrorType\n | EmptyBlobErrorType\n | HexToBytesErrorType\n | SizeErrorType\n | ErrorType\n\n/**\n * Transforms arbitrary data to blobs.\n *\n * @example\n * ```ts\n * import { toBlobs, stringToHex } from 'viem'\n *\n * const blobs = toBlobs({ data: stringToHex('hello world') })\n * ```\n */\nexport function toBlobs<\n const data extends Hex | ByteArray,\n to extends To =\n | (data extends Hex ? 'hex' : never)\n | (data extends ByteArray ? 'bytes' : never),\n>(parameters: ToBlobsParameters<data, to>): ToBlobsReturnType<to> {\n const to =\n parameters.to ?? (typeof parameters.data === 'string' ? 'hex' : 'bytes')\n const data = (\n typeof parameters.data === 'string'\n ? hexToBytes(parameters.data)\n : parameters.data\n ) as ByteArray\n\n const size_ = size(data)\n if (!size_) throw new EmptyBlobError()\n if (size_ > maxBytesPerTransaction)\n throw new BlobSizeTooLargeError({\n maxSize: maxBytesPerTransaction,\n size: size_,\n })\n\n const blobs = []\n\n let active = true\n let position = 0\n while (active) {\n const blob = createCursor(new Uint8Array(bytesPerBlob))\n\n let size = 0\n while (size < fieldElementsPerBlob) {\n const bytes = data.slice(position, position + (bytesPerFieldElement - 1))\n\n // Push a zero byte so the field element doesn't overflow the BLS modulus.\n blob.pushByte(0x00)\n\n // Push the current segment of data bytes.\n blob.pushBytes(bytes)\n\n // If we detect that the current segment of data bytes is less than 31 bytes,\n // we can stop processing and push a terminator byte to indicate the end of the blob.\n if (bytes.length < 31) {\n blob.pushByte(0x80)\n active = false\n break\n }\n\n size++\n position += 31\n }\n\n blobs.push(blob)\n }\n\n return (\n to === 'bytes'\n ? blobs.map((x) => x.bytes)\n : blobs.map((x) => bytesToHex(x.bytes))\n ) as any\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { BlobSidecars } from '../../types/eip4844.js'\nimport type { Kzg } from '../../types/kzg.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport type { OneOf } from '../../types/utils.js'\nimport {\n type BlobsToCommitmentsErrorType,\n blobsToCommitments,\n} from './blobsToCommitments.js'\nimport { blobsToProofs, type blobsToProofsErrorType } from './blobsToProofs.js'\nimport { type ToBlobsErrorType, toBlobs } from './toBlobs.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type ToBlobSidecarsParameters<\n data extends Hex | ByteArray | undefined = undefined,\n blobs extends readonly Hex[] | readonly ByteArray[] | undefined = undefined,\n to extends To =\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n ///\n _blobsType =\n | (blobs extends readonly Hex[] ? readonly Hex[] : never)\n | (blobs extends readonly ByteArray[] ? readonly ByteArray[] : never),\n> = {\n /** Return type. */\n to?: to | To | undefined\n} & OneOf<\n | {\n /** Data to transform into blobs. */\n data: data | Hex | ByteArray\n /** KZG implementation. */\n kzg: Kzg\n }\n | {\n /** Blobs. */\n blobs: blobs | readonly Hex[] | readonly ByteArray[]\n /** Commitment for each blob. */\n commitments: _blobsType | readonly Hex[] | readonly ByteArray[]\n /** Proof for each blob. */\n proofs: _blobsType | readonly Hex[] | readonly ByteArray[]\n }\n>\n\nexport type ToBlobSidecarsReturnType<to extends To> =\n | (to extends 'bytes' ? BlobSidecars<ByteArray> : never)\n | (to extends 'hex' ? BlobSidecars<Hex> : never)\n\nexport type ToBlobSidecarsErrorType =\n | BlobsToCommitmentsErrorType\n | ToBlobsErrorType\n | blobsToProofsErrorType\n | ErrorType\n\n/**\n * Transforms arbitrary data (or blobs, commitments, & proofs) into a sidecar array.\n *\n * @example\n * ```ts\n * import { toBlobSidecars, stringToHex } from 'viem'\n *\n * const sidecars = toBlobSidecars({ data: stringToHex('hello world') })\n * ```\n *\n * @example\n * ```ts\n * import {\n * blobsToCommitments,\n * toBlobs,\n * blobsToProofs,\n * toBlobSidecars,\n * stringToHex\n * } from 'viem'\n *\n * const blobs = toBlobs({ data: stringToHex('hello world') })\n * const commitments = blobsToCommitments({ blobs, kzg })\n * const proofs = blobsToProofs({ blobs, commitments, kzg })\n *\n * const sidecars = toBlobSidecars({ blobs, commitments, proofs })\n * ```\n */\nexport function toBlobSidecars<\n const data extends Hex | ByteArray | undefined = undefined,\n const blobs extends\n | readonly Hex[]\n | readonly ByteArray[]\n | undefined = undefined,\n to extends To =\n | (data extends Hex ? 'hex' : never)\n | (data extends ByteArray ? 'bytes' : never)\n | (blobs extends readonly Hex[] ? 'hex' : never)\n | (blobs extends readonly ByteArray[] ? 'bytes' : never),\n>(\n parameters: ToBlobSidecarsParameters<data, blobs, to>,\n): ToBlobSidecarsReturnType<to> {\n const { data, kzg, to } = parameters\n const blobs = parameters.blobs ?? toBlobs({ data: data!, to })\n const commitments =\n parameters.commitments ?? blobsToCommitments({ blobs, kzg: kzg!, to })\n const proofs =\n parameters.proofs ?? blobsToProofs({ blobs, commitments, kzg: kzg!, to })\n\n const sidecars: BlobSidecars = []\n for (let i = 0; i < blobs.length; i++)\n sidecars.push({\n blob: blobs[i],\n commitment: commitments[i],\n proof: proofs[i],\n })\n\n return sidecars as ToBlobSidecarsReturnType<to>\n}\n","import {\n InvalidSerializableTransactionError,\n type InvalidSerializableTransactionErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n FeeValuesEIP1559,\n FeeValuesEIP4844,\n FeeValuesLegacy,\n} from '../../index.js'\nimport type {\n TransactionRequestGeneric,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableGeneric,\n} from '../../types/transaction.js'\nimport type { Assign, ExactPartial, IsNever, OneOf } from '../../types/utils.js'\n\nexport type GetTransactionType<\n transaction extends OneOf<\n TransactionSerializableGeneric | TransactionRequestGeneric\n > = TransactionSerializableGeneric,\n result =\n | (transaction extends LegacyProperties ? 'legacy' : never)\n | (transaction extends EIP1559Properties ? 'eip1559' : never)\n | (transaction extends EIP2930Properties ? 'eip2930' : never)\n | (transaction extends EIP4844Properties ? 'eip4844' : never)\n | (transaction extends EIP7702Properties ? 'eip7702' : never)\n | (transaction['type'] extends TransactionSerializableGeneric['type']\n ? Extract<transaction['type'], string>\n : never),\n> = IsNever<keyof transaction> extends true\n ? string\n : IsNever<result> extends false\n ? result\n : string\n\nexport type GetTransactionTypeErrorType =\n | InvalidSerializableTransactionErrorType\n | ErrorType\n\nexport function getTransactionType<\n const transaction extends OneOf<\n TransactionSerializableGeneric | TransactionRequestGeneric\n >,\n>(transaction: transaction): GetTransactionType<transaction> {\n if (transaction.type)\n return transaction.type as GetTransactionType<transaction>\n\n if (typeof transaction.authorizationList !== 'undefined')\n return 'eip7702' as any\n\n if (\n typeof transaction.blobs !== 'undefined' ||\n typeof transaction.blobVersionedHashes !== 'undefined' ||\n typeof transaction.maxFeePerBlobGas !== 'undefined' ||\n typeof transaction.sidecars !== 'undefined'\n )\n return 'eip4844' as any\n\n if (\n typeof transaction.maxFeePerGas !== 'undefined' ||\n typeof transaction.maxPriorityFeePerGas !== 'undefined'\n ) {\n return 'eip1559' as any\n }\n\n if (typeof transaction.gasPrice !== 'undefined') {\n if (typeof transaction.accessList !== 'undefined') return 'eip2930' as any\n return 'legacy' as any\n }\n\n throw new InvalidSerializableTransactionError({ transaction })\n}\n\n////////////////////////////////////////////////////////////////////////////////////////////\n// Types\n\ntype BaseProperties = {\n accessList?: undefined\n authorizationList?: undefined\n blobs?: undefined\n blobVersionedHashes?: undefined\n gasPrice?: undefined\n maxFeePerBlobGas?: undefined\n maxFeePerGas?: undefined\n maxPriorityFeePerGas?: undefined\n sidecars?: undefined\n}\n\ntype LegacyProperties = Assign<BaseProperties, FeeValuesLegacy>\ntype EIP1559Properties = Assign<\n BaseProperties,\n OneOf<\n | {\n maxFeePerGas: FeeValuesEIP1559['maxFeePerGas']\n }\n | {\n maxPriorityFeePerGas: FeeValuesEIP1559['maxPriorityFeePerGas']\n },\n FeeValuesEIP1559\n > & {\n accessList?: TransactionSerializableEIP2930['accessList'] | undefined\n }\n>\ntype EIP2930Properties = Assign<\n ExactPartial<LegacyProperties>,\n {\n accessList: TransactionSerializableEIP2930['accessList']\n }\n>\ntype EIP4844Properties = Assign<\n ExactPartial<EIP1559Properties>,\n ExactPartial<FeeValuesEIP4844> &\n OneOf<\n | {\n blobs: TransactionSerializableEIP4844['blobs']\n }\n | {\n blobVersionedHashes: TransactionSerializableEIP4844['blobVersionedHashes']\n }\n | {\n sidecars: TransactionSerializableEIP4844['sidecars']\n },\n TransactionSerializableEIP4844\n >\n>\ntype EIP7702Properties = Assign<\n ExactPartial<EIP1559Properties>,\n {\n authorizationList: TransactionSerializableEIP7702['authorizationList']\n }\n>\n","import type { Account } from '../../accounts/types.js'\nimport type { SendTransactionParameters } from '../../actions/wallet/sendTransaction.js'\nimport type { BaseError } from '../../errors/base.js'\nimport { UnknownNodeError } from '../../errors/node.js'\nimport {\n TransactionExecutionError,\n type TransactionExecutionErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\n\nimport {\n type GetNodeErrorParameters,\n type GetNodeErrorReturnType,\n getNodeError,\n} from './getNodeError.js'\n\nexport type GetTransactionErrorParameters = Omit<\n SendTransactionParameters,\n 'account' | 'chain'\n> & {\n account: Account | null\n chain?: Chain | undefined\n docsPath?: string | undefined\n}\n\nexport type GetTransactionErrorReturnType<cause = ErrorType> = Omit<\n TransactionExecutionErrorType,\n 'cause'\n> & { cause: cause | GetNodeErrorReturnType }\n\nexport function getTransactionError<err extends ErrorType<string>>(\n err: err,\n { docsPath, ...args }: GetTransactionErrorParameters,\n): GetTransactionErrorReturnType<err> {\n const cause = (() => {\n const cause = getNodeError(\n err as {} as BaseError,\n args as GetNodeErrorParameters,\n )\n if (cause instanceof UnknownNodeError) return err as {} as BaseError\n return cause\n })()\n return new TransactionExecutionError(cause, {\n docsPath,\n ...args,\n }) as GetTransactionErrorReturnType<err>\n}\n","import type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type HexToNumberErrorType,\n hexToNumber,\n} from '../../utils/encoding/fromHex.js'\n\nexport type GetChainIdReturnType = number\n\nexport type GetChainIdErrorType =\n | HexToNumberErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns the chain ID associated with the current network.\n *\n * - Docs: https://viem.sh/docs/actions/public/getChainId\n * - JSON-RPC Methods: [`eth_chainId`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_chainid)\n *\n * @param client - Client to use\n * @returns The current chain ID. {@link GetChainIdReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getChainId } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const chainId = await getChainId(client)\n * // 1\n */\nexport async function getChainId<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(client: Client<Transport, chain, account>): Promise<GetChainIdReturnType> {\n const chainIdHex = await client.request(\n {\n method: 'eth_chainId',\n },\n { dedupe: true },\n )\n return hexToNumber(chainIdHex)\n}\n","import type { Address } from 'abitype'\nimport { parseAccount } from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseError } from '../../errors/base.js'\nimport { BaseFeeScalarError } from '../../errors/fee.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account, GetAccountParameter } from '../../types/account.js'\nimport type {\n Chain,\n ChainFeesFnParameters,\n DeriveChain,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport {\n type GetTransactionErrorReturnType,\n getTransactionError,\n} from '../../utils/errors/getTransactionError.js'\nimport { extract } from '../../utils/formatters/extract.js'\nimport {\n type FormattedTransaction,\n formatTransaction,\n} from '../../utils/formatters/transaction.js'\nimport {\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { NonceManager } from '../../utils/nonceManager.js'\nimport { assertRequest } from '../../utils/transaction/assertRequest.js'\nimport { getBlock } from './getBlock.js'\nimport { getChainId as getChainId_ } from './getChainId.js'\n\nexport type FillTransactionParameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n accountOverride extends Account | Address | undefined =\n | Account\n | Address\n | undefined,\n ///\n _derivedChain extends Chain | undefined = DeriveChain<chain, chainOverride>,\n> = UnionOmit<FormattedTransactionRequest<_derivedChain>, 'from'> &\n GetAccountParameter<account, accountOverride, false, true> &\n GetChainParameter<chain, chainOverride> & {\n /**\n * Nonce manager to use for the transaction request.\n */\n nonceManager?: NonceManager | undefined\n }\n\nexport type FillTransactionReturnType<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n ///\n _derivedChain extends Chain | undefined = DeriveChain<chain, chainOverride>,\n> = {\n raw: Hex\n transaction: FormattedTransaction<_derivedChain>\n}\n\nexport type FillTransactionErrorType =\n | GetTransactionErrorReturnType<ErrorType>\n | ErrorType\n\n/**\n * Fills a transaction request with the necessary fields to be signed over.\n *\n * - Docs: https://viem.sh/docs/actions/public/fillTransaction\n *\n * @param client - Client to use\n * @param parameters - {@link FillTransactionParameters}\n * @returns The filled transaction. {@link FillTransactionReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { fillTransaction } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await fillTransaction(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * })\n */\nexport async function fillTransaction<\n chain extends Chain | undefined,\n account extends Account | undefined,\n chainOverride extends Chain | undefined = undefined,\n accountOverride extends Account | Address | undefined = undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: FillTransactionParameters<\n chain,\n account,\n chainOverride,\n accountOverride\n >,\n): Promise<FillTransactionReturnType<chain, chainOverride>> {\n const {\n account = client.account,\n accessList,\n authorizationList,\n chain = client.chain,\n blobVersionedHashes,\n blobs,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: nonce_,\n nonceManager,\n to,\n type,\n value,\n ...rest\n } = parameters\n\n const nonce = await (async () => {\n if (!account) return nonce_\n if (!nonceManager) return nonce_\n if (typeof nonce_ !== 'undefined') return nonce_\n const account_ = parseAccount(account)\n const chainId = chain\n ? chain.id\n : await getAction(client, getChainId_, 'getChainId')({})\n return await nonceManager.consume({\n address: account_.address,\n chainId,\n client,\n })\n })()\n\n assertRequest(parameters)\n\n const chainFormat = chain?.formatters?.transactionRequest?.format\n const format = chainFormat || formatTransactionRequest\n\n const request = format(\n {\n // Pick out extra data that might exist on the chain's transaction request type.\n ...extract(rest, { format: chainFormat }),\n account: account ? parseAccount(account) : undefined,\n accessList,\n authorizationList,\n blobs,\n blobVersionedHashes,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n type,\n value,\n } as TransactionRequest,\n 'fillTransaction',\n )\n\n try {\n const response = await client.request({\n method: 'eth_fillTransaction',\n params: [request],\n })\n const format = chain?.formatters?.transaction?.format || formatTransaction\n\n const transaction = format(response.tx)\n\n // Remove unnecessary fields.\n delete transaction.blockHash\n delete transaction.blockNumber\n delete transaction.r\n delete transaction.s\n delete transaction.transactionIndex\n delete transaction.v\n delete transaction.yParity\n\n // Rewrite fields.\n transaction.data = transaction.input\n\n // Preference supplied fees (some nodes do not take these preferences).\n if (transaction.gas) transaction.gas = parameters.gas ?? transaction.gas\n if (transaction.gasPrice)\n transaction.gasPrice = parameters.gasPrice ?? transaction.gasPrice\n if (transaction.maxFeePerBlobGas)\n transaction.maxFeePerBlobGas =\n parameters.maxFeePerBlobGas ?? transaction.maxFeePerBlobGas\n if (transaction.maxFeePerGas)\n transaction.maxFeePerGas =\n parameters.maxFeePerGas ?? transaction.maxFeePerGas\n if (transaction.maxPriorityFeePerGas)\n transaction.maxPriorityFeePerGas =\n parameters.maxPriorityFeePerGas ?? transaction.maxPriorityFeePerGas\n if (transaction.nonce)\n transaction.nonce = parameters.nonce ?? transaction.nonce\n\n // Build fee multiplier function.\n const feeMultiplier = await (async () => {\n if (typeof chain?.fees?.baseFeeMultiplier === 'function') {\n const block = await getAction(client, getBlock, 'getBlock')({})\n return chain.fees.baseFeeMultiplier({\n block,\n client,\n request: parameters,\n } as ChainFeesFnParameters)\n }\n return chain?.fees?.baseFeeMultiplier ?? 1.2\n })()\n if (feeMultiplier < 1) throw new BaseFeeScalarError()\n\n const decimals = feeMultiplier.toString().split('.')[1]?.length ?? 0\n const denominator = 10 ** decimals\n const multiplyFee = (base: bigint) =>\n (base * BigInt(Math.ceil(feeMultiplier * denominator))) /\n BigInt(denominator)\n\n // Apply fee multiplier.\n if (transaction.maxFeePerGas && !parameters.maxFeePerGas)\n transaction.maxFeePerGas = multiplyFee(transaction.maxFeePerGas)\n if (transaction.gasPrice && !parameters.gasPrice)\n transaction.gasPrice = multiplyFee(transaction.gasPrice)\n\n return {\n raw: response.raw,\n transaction: {\n from: request.from,\n ...transaction,\n },\n }\n } catch (err) {\n throw getTransactionError(\n err as BaseError,\n {\n ...parameters,\n chain: client.chain,\n } as never,\n )\n }\n}\n","import type { Address } from 'abitype'\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport {\n type EstimateFeesPerGasErrorType,\n internal_estimateFeesPerGas,\n} from '../../actions/public/estimateFeesPerGas.js'\nimport {\n type EstimateGasErrorType,\n type EstimateGasParameters,\n estimateGas,\n} from '../../actions/public/estimateGas.js'\nimport {\n type GetBlockErrorType,\n getBlock as getBlock_,\n} from '../../actions/public/getBlock.js'\nimport {\n type GetTransactionCountErrorType,\n getTransactionCount,\n} from '../../actions/public/getTransactionCount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { AccountNotFoundErrorType } from '../../errors/account.js'\nimport type { BaseError } from '../../errors/base.js'\nimport {\n Eip1559FeesNotSupportedError,\n MaxFeePerGasTooLowError,\n} from '../../errors/fee.js'\nimport type { DeriveAccount, GetAccountParameter } from '../../types/account.js'\nimport type { Block } from '../../types/block.js'\nimport type {\n Chain,\n DeriveChain,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type { GetTransactionRequestKzgParameter } from '../../types/kzg.js'\nimport type {\n TransactionRequest,\n TransactionRequestEIP1559,\n TransactionRequestEIP2930,\n TransactionRequestEIP4844,\n TransactionRequestEIP7702,\n TransactionRequestLegacy,\n TransactionSerializable,\n} from '../../types/transaction.js'\nimport type {\n ExactPartial,\n IsNever,\n Prettify,\n UnionOmit,\n UnionRequiredBy,\n} from '../../types/utils.js'\nimport { blobsToCommitments } from '../../utils/blob/blobsToCommitments.js'\nimport { blobsToProofs } from '../../utils/blob/blobsToProofs.js'\nimport { commitmentsToVersionedHashes } from '../../utils/blob/commitmentsToVersionedHashes.js'\nimport { toBlobSidecars } from '../../utils/blob/toBlobSidecars.js'\nimport type { FormattedTransactionRequest } from '../../utils/formatters/transactionRequest.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { LruMap } from '../../utils/lru.js'\nimport type { NonceManager } from '../../utils/nonceManager.js'\nimport {\n type AssertRequestErrorType,\n type AssertRequestParameters,\n assertRequest,\n} from '../../utils/transaction/assertRequest.js'\nimport {\n type GetTransactionType,\n getTransactionType,\n} from '../../utils/transaction/getTransactionType.js'\nimport {\n type FillTransactionErrorType,\n type FillTransactionParameters,\n fillTransaction,\n} from '../public/fillTransaction.js'\nimport { getChainId as getChainId_ } from '../public/getChainId.js'\n\nexport const defaultParameters = [\n 'blobVersionedHashes',\n 'chainId',\n 'fees',\n 'gas',\n 'nonce',\n 'type',\n] as const\n\n/** @internal */\nexport const eip1559NetworkCache = /*#__PURE__*/ new Map<string, boolean>()\n\n/** @internal */\nexport const supportsFillTransaction = /*#__PURE__*/ new LruMap<boolean>(128)\n\nexport type PrepareTransactionRequestParameterType =\n | 'blobVersionedHashes'\n | 'chainId'\n | 'fees'\n | 'gas'\n | 'nonce'\n | 'sidecars'\n | 'type'\ntype ParameterTypeToParameters<\n parameterType extends PrepareTransactionRequestParameterType,\n> = parameterType extends 'fees'\n ? 'maxFeePerGas' | 'maxPriorityFeePerGas' | 'gasPrice'\n : parameterType\n\nexport type PrepareTransactionRequestRequest<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n ///\n _derivedChain extends Chain | undefined = DeriveChain<chain, chainOverride>,\n> = UnionOmit<FormattedTransactionRequest<_derivedChain>, 'from'> &\n GetTransactionRequestKzgParameter & {\n /**\n * Nonce manager to use for the transaction request.\n */\n nonceManager?: NonceManager | undefined\n /**\n * Parameters to prepare for the transaction request.\n *\n * @default ['blobVersionedHashes', 'chainId', 'fees', 'gas', 'nonce', 'type']\n */\n parameters?: readonly PrepareTransactionRequestParameterType[] | undefined\n }\n\nexport type PrepareTransactionRequestParameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n accountOverride extends Account | Address | undefined =\n | Account\n | Address\n | undefined,\n request extends PrepareTransactionRequestRequest<\n chain,\n chainOverride\n > = PrepareTransactionRequestRequest<chain, chainOverride>,\n> = request &\n GetAccountParameter<account, accountOverride, false, true> &\n GetChainParameter<chain, chainOverride> &\n GetTransactionRequestKzgParameter<request> & { chainId?: number | undefined }\n\nexport type PrepareTransactionRequestReturnType<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n accountOverride extends Account | Address | undefined =\n | Account\n | Address\n | undefined,\n request extends PrepareTransactionRequestRequest<\n chain,\n chainOverride\n > = PrepareTransactionRequestRequest<chain, chainOverride>,\n ///\n _derivedAccount extends Account | Address | undefined = DeriveAccount<\n account,\n accountOverride\n >,\n _derivedChain extends Chain | undefined = DeriveChain<chain, chainOverride>,\n _transactionType = request['type'] extends string | undefined\n ? request['type']\n : GetTransactionType<request> extends 'legacy'\n ? unknown\n : GetTransactionType<request>,\n _transactionRequest extends TransactionRequest =\n | (_transactionType extends 'legacy' ? TransactionRequestLegacy : never)\n | (_transactionType extends 'eip1559' ? TransactionRequestEIP1559 : never)\n | (_transactionType extends 'eip2930' ? TransactionRequestEIP2930 : never)\n | (_transactionType extends 'eip4844' ? TransactionRequestEIP4844 : never)\n | (_transactionType extends 'eip7702' ? TransactionRequestEIP7702 : never),\n> = Prettify<\n UnionRequiredBy<\n Extract<\n UnionOmit<FormattedTransactionRequest<_derivedChain>, 'from'> &\n (_derivedChain extends Chain\n ? { chain: _derivedChain }\n : { chain?: undefined }) &\n (_derivedAccount extends Account\n ? { account: _derivedAccount; from: Address }\n : { account?: undefined; from?: undefined }),\n IsNever<_transactionRequest> extends true\n ? unknown\n : ExactPartial<_transactionRequest>\n > & { chainId?: number | undefined },\n ParameterTypeToParameters<\n request['parameters'] extends readonly PrepareTransactionRequestParameterType[]\n ? request['parameters'][number]\n : (typeof defaultParameters)[number]\n >\n > &\n (unknown extends request['kzg'] ? {} : Pick<request, 'kzg'>)\n>\n\nexport type PrepareTransactionRequestErrorType =\n | AccountNotFoundErrorType\n | AssertRequestErrorType\n | ParseAccountErrorType\n | GetBlockErrorType\n | GetTransactionCountErrorType\n | EstimateGasErrorType\n | EstimateFeesPerGasErrorType\n\n/**\n * Prepares a transaction request for signing.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/prepareTransactionRequest\n *\n * @param args - {@link PrepareTransactionRequestParameters}\n * @returns The transaction request. {@link PrepareTransactionRequestReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { prepareTransactionRequest } from 'viem/actions'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const request = await prepareTransactionRequest(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x0000000000000000000000000000000000000000',\n * value: 1n,\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n * import { prepareTransactionRequest } from 'viem/actions'\n *\n * const client = createWalletClient({\n * account: privateKeyToAccount('0x…'),\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const request = await prepareTransactionRequest(client, {\n * to: '0x0000000000000000000000000000000000000000',\n * value: 1n,\n * })\n */\nexport async function prepareTransactionRequest<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const request extends PrepareTransactionRequestRequest<chain, chainOverride>,\n accountOverride extends Account | Address | undefined = undefined,\n chainOverride extends Chain | undefined = undefined,\n>(\n client: Client<Transport, chain, account>,\n args: PrepareTransactionRequestParameters<\n chain,\n account,\n chainOverride,\n accountOverride,\n request\n >,\n): Promise<\n PrepareTransactionRequestReturnType<\n chain,\n account,\n chainOverride,\n accountOverride,\n request\n >\n> {\n let request = args as PrepareTransactionRequestParameters\n\n request.account ??= client.account\n request.parameters ??= defaultParameters\n\n const {\n account: account_,\n chain = client.chain,\n nonceManager,\n parameters,\n } = request\n\n const prepareTransactionRequest = (() => {\n if (typeof chain?.prepareTransactionRequest === 'function')\n return {\n fn: chain.prepareTransactionRequest,\n runAt: ['beforeFillTransaction'],\n }\n if (Array.isArray(chain?.prepareTransactionRequest))\n return {\n fn: chain.prepareTransactionRequest[0],\n runAt: chain.prepareTransactionRequest[1].runAt,\n }\n return undefined\n })()\n\n let chainId: number | undefined\n async function getChainId(): Promise<number> {\n if (chainId) return chainId\n if (typeof request.chainId !== 'undefined') return request.chainId\n if (chain) return chain.id\n const chainId_ = await getAction(client, getChainId_, 'getChainId')({})\n chainId = chainId_\n return chainId\n }\n\n const account = account_ ? parseAccount(account_) : account_\n\n let nonce = request.nonce\n if (\n parameters.includes('nonce') &&\n typeof nonce === 'undefined' &&\n account &&\n nonceManager\n ) {\n const chainId = await getChainId()\n nonce = await nonceManager.consume({\n address: account.address,\n chainId,\n client,\n })\n }\n\n if (\n prepareTransactionRequest?.fn &&\n prepareTransactionRequest.runAt?.includes('beforeFillTransaction')\n ) {\n request = await prepareTransactionRequest.fn(\n { ...request, chain },\n {\n phase: 'beforeFillTransaction',\n },\n )\n nonce ??= request.nonce\n }\n\n const attemptFill = (() => {\n // Do not attempt if blobs are provided.\n if (\n (parameters.includes('blobVersionedHashes') ||\n parameters.includes('sidecars')) &&\n request.kzg &&\n request.blobs\n )\n return false\n\n // Do not attempt if `eth_fillTransaction` is not supported.\n if (supportsFillTransaction.get(client.uid) === false) return false\n\n // Should attempt `eth_fillTransaction` if \"fees\" or \"gas\" are required to be populated,\n // otherwise, can just use the other individual calls.\n const shouldAttempt = ['fees', 'gas'].some((parameter) =>\n parameters.includes(parameter as PrepareTransactionRequestParameterType),\n )\n if (!shouldAttempt) return false\n\n // Check if `eth_fillTransaction` needs to be called.\n if (parameters.includes('chainId') && typeof request.chainId !== 'number')\n return true\n if (parameters.includes('nonce') && typeof nonce !== 'number') return true\n if (\n parameters.includes('fees') &&\n typeof request.gasPrice !== 'bigint' &&\n (typeof request.maxFeePerGas !== 'bigint' ||\n typeof (request as any).maxPriorityFeePerGas !== 'bigint')\n )\n return true\n if (parameters.includes('gas') && typeof request.gas !== 'bigint')\n return true\n return false\n })()\n\n const fillResult = attemptFill\n ? await getAction(\n client,\n fillTransaction,\n 'fillTransaction',\n )({ ...request, nonce } as FillTransactionParameters)\n .then((result) => {\n const {\n chainId,\n from,\n gas,\n gasPrice,\n nonce,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n type,\n ...rest\n } = result.transaction\n supportsFillTransaction.set(client.uid, true)\n return {\n ...request,\n ...(from ? { from } : {}),\n ...(type && !request.type ? { type } : {}),\n ...(typeof chainId !== 'undefined' ? { chainId } : {}),\n ...(typeof gas !== 'undefined' ? { gas } : {}),\n ...(typeof gasPrice !== 'undefined' ? { gasPrice } : {}),\n ...(typeof nonce !== 'undefined' ? { nonce } : {}),\n ...(typeof maxFeePerBlobGas !== 'undefined' &&\n request.type !== 'legacy' &&\n request.type !== 'eip2930'\n ? { maxFeePerBlobGas }\n : {}),\n ...(typeof maxFeePerGas !== 'undefined' &&\n request.type !== 'legacy' &&\n request.type !== 'eip2930'\n ? { maxFeePerGas }\n : {}),\n ...(typeof maxPriorityFeePerGas !== 'undefined' &&\n request.type !== 'legacy' &&\n request.type !== 'eip2930'\n ? { maxPriorityFeePerGas }\n : {}),\n ...('nonceKey' in rest && typeof rest.nonceKey !== 'undefined'\n ? { nonceKey: rest.nonceKey }\n : {}),\n }\n })\n .catch((e) => {\n const error = e as FillTransactionErrorType\n\n if (error.name !== 'TransactionExecutionError') return request\n\n const unsupported = error.walk?.((e) => {\n const error = e as BaseError\n return (\n error.name === 'MethodNotFoundRpcError' ||\n error.name === 'MethodNotSupportedRpcError'\n )\n })\n if (unsupported) supportsFillTransaction.set(client.uid, false)\n\n return request\n })\n : request\n\n nonce ??= fillResult.nonce\n\n request = {\n ...(fillResult as any),\n ...(account ? { from: account?.address } : {}),\n ...(nonce ? { nonce } : {}),\n }\n const { blobs, gas, kzg, type } = request\n\n if (\n prepareTransactionRequest?.fn &&\n prepareTransactionRequest.runAt?.includes('beforeFillParameters')\n ) {\n request = await prepareTransactionRequest.fn(\n { ...request, chain },\n {\n phase: 'beforeFillParameters',\n },\n )\n }\n\n let block: Block | undefined\n async function getBlock(): Promise<Block> {\n if (block) return block\n block = await getAction(\n client,\n getBlock_,\n 'getBlock',\n )({ blockTag: 'latest' })\n return block\n }\n\n if (\n parameters.includes('nonce') &&\n typeof nonce === 'undefined' &&\n account &&\n !nonceManager\n )\n request.nonce = await getAction(\n client,\n getTransactionCount,\n 'getTransactionCount',\n )({\n address: account.address,\n blockTag: 'pending',\n })\n\n if (\n (parameters.includes('blobVersionedHashes') ||\n parameters.includes('sidecars')) &&\n blobs &&\n kzg\n ) {\n const commitments = blobsToCommitments({ blobs, kzg })\n\n if (parameters.includes('blobVersionedHashes')) {\n const versionedHashes = commitmentsToVersionedHashes({\n commitments,\n to: 'hex',\n })\n request.blobVersionedHashes = versionedHashes\n }\n if (parameters.includes('sidecars')) {\n const proofs = blobsToProofs({ blobs, commitments, kzg })\n const sidecars = toBlobSidecars({\n blobs,\n commitments,\n proofs,\n to: 'hex',\n })\n request.sidecars = sidecars\n }\n }\n\n if (parameters.includes('chainId')) request.chainId = await getChainId()\n\n if (\n (parameters.includes('fees') || parameters.includes('type')) &&\n typeof type === 'undefined'\n ) {\n try {\n request.type = getTransactionType(\n request as TransactionSerializable,\n ) as any\n } catch {\n let isEip1559Network = eip1559NetworkCache.get(client.uid)\n if (typeof isEip1559Network === 'undefined') {\n const block = await getBlock()\n isEip1559Network = typeof block?.baseFeePerGas === 'bigint'\n eip1559NetworkCache.set(client.uid, isEip1559Network)\n }\n request.type = isEip1559Network ? 'eip1559' : 'legacy'\n }\n }\n\n if (parameters.includes('fees')) {\n // TODO(4844): derive blob base fees once https://github.com/ethereum/execution-apis/pull/486 is merged.\n\n if (request.type !== 'legacy' && request.type !== 'eip2930') {\n // EIP-1559 fees\n if (\n typeof request.maxFeePerGas === 'undefined' ||\n typeof request.maxPriorityFeePerGas === 'undefined'\n ) {\n const block = await getBlock()\n const { maxFeePerGas, maxPriorityFeePerGas } =\n await internal_estimateFeesPerGas(client, {\n block: block as Block,\n chain,\n request: request as PrepareTransactionRequestParameters,\n })\n\n if (\n typeof request.maxPriorityFeePerGas === 'undefined' &&\n request.maxFeePerGas &&\n request.maxFeePerGas < maxPriorityFeePerGas\n )\n throw new MaxFeePerGasTooLowError({\n maxPriorityFeePerGas,\n })\n\n request.maxPriorityFeePerGas = maxPriorityFeePerGas\n request.maxFeePerGas = maxFeePerGas\n }\n } else {\n // Legacy fees\n if (\n typeof request.maxFeePerGas !== 'undefined' ||\n typeof request.maxPriorityFeePerGas !== 'undefined'\n )\n throw new Eip1559FeesNotSupportedError()\n\n if (typeof request.gasPrice === 'undefined') {\n const block = await getBlock()\n const { gasPrice: gasPrice_ } = await internal_estimateFeesPerGas(\n client,\n {\n block: block as Block,\n chain,\n request: request as PrepareTransactionRequestParameters,\n type: 'legacy',\n },\n )\n request.gasPrice = gasPrice_\n }\n }\n }\n\n if (parameters.includes('gas') && typeof gas === 'undefined')\n request.gas = await getAction(\n client,\n estimateGas,\n 'estimateGas',\n )({\n ...request,\n account,\n prepare: account?.type === 'local' ? [] : ['blobVersionedHashes'],\n } as EstimateGasParameters)\n\n if (\n prepareTransactionRequest?.fn &&\n prepareTransactionRequest.runAt?.includes('afterFillParameters')\n )\n request = await prepareTransactionRequest.fn(\n { ...request, chain },\n {\n phase: 'afterFillParameters',\n },\n )\n\n assertRequest(request as AssertRequestParameters)\n\n delete request.parameters\n\n return request as any\n}\n","import type { Address } from 'abitype'\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { BaseError } from '../../errors/base.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { StateOverride } from '../../types/stateOverride.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport {\n type RecoverAuthorizationAddressErrorType,\n recoverAuthorizationAddress,\n} from '../../utils/authorization/recoverAuthorizationAddress.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type GetEstimateGasErrorReturnType,\n getEstimateGasError,\n} from '../../utils/errors/getEstimateGasError.js'\nimport { extract } from '../../utils/formatters/extract.js'\nimport {\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport { serializeStateOverride } from '../../utils/stateOverride.js'\nimport {\n type AssertRequestErrorType,\n type AssertRequestParameters,\n assertRequest,\n} from '../../utils/transaction/assertRequest.js'\nimport {\n type PrepareTransactionRequestParameters,\n type PrepareTransactionRequestParameterType,\n prepareTransactionRequest,\n} from '../wallet/prepareTransactionRequest.js'\n\nexport type EstimateGasParameters<\n chain extends Chain | undefined = Chain | undefined,\n> = UnionOmit<FormattedEstimateGas<chain>, 'from'> & {\n account?: Account | Address | undefined\n prepare?:\n | boolean\n | readonly PrepareTransactionRequestParameterType[]\n | undefined\n stateOverride?: StateOverride | undefined\n} & (\n | {\n /** The balance of the account at a block number. */\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n | {\n blockNumber?: undefined\n /**\n * The balance of the account at a block tag.\n * @default 'latest'\n */\n blockTag?: BlockTag | undefined\n }\n )\ntype FormattedEstimateGas<chain extends Chain | undefined = Chain | undefined> =\n FormattedTransactionRequest<chain>\n\nexport type EstimateGasReturnType = bigint\n\nexport type EstimateGasErrorType = GetEstimateGasErrorReturnType<\n | ParseAccountErrorType\n | NumberToHexErrorType\n | RequestErrorType\n | RecoverAuthorizationAddressErrorType\n | AssertRequestErrorType\n>\n\n/**\n * Estimates the gas necessary to complete a transaction without submitting it to the network.\n *\n * - Docs: https://viem.sh/docs/actions/public/estimateGas\n * - JSON-RPC Methods: [`eth_estimateGas`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_estimategas)\n *\n * @param client - Client to use\n * @param parameters - {@link EstimateGasParameters}\n * @returns The gas estimate (in gas units). {@link EstimateGasReturnType}\n *\n * @example\n * import { createPublicClient, http, parseEther } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { estimateGas } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const gasEstimate = await estimateGas(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: parseEther('1'),\n * })\n */\nexport async function estimateGas<\n chain extends Chain | undefined,\n account extends Account | undefined = undefined,\n>(\n client: Client<Transport, chain, account>,\n args: EstimateGasParameters<chain>,\n): Promise<EstimateGasReturnType> {\n const { account: account_ = client.account, prepare = true } = args\n const account = account_ ? parseAccount(account_) : undefined\n\n const parameters = (() => {\n if (Array.isArray(prepare)) return prepare\n // Some RPC Providers do not compute versioned hashes from blobs. We will need\n // to compute them.\n if (account?.type !== 'local') return ['blobVersionedHashes']\n return undefined\n })()\n\n try {\n const to = await (async () => {\n // If `to` exists on the parameters, use that.\n if (args.to) return args.to\n\n // If no `to` exists, and we are sending a EIP-7702 transaction, use the\n // address of the first authorization in the list.\n if (args.authorizationList && args.authorizationList.length > 0)\n return await recoverAuthorizationAddress({\n authorization: args.authorizationList[0],\n }).catch(() => {\n throw new BaseError(\n '`to` is required. Could not infer from `authorizationList`',\n )\n })\n\n // Otherwise, we are sending a deployment transaction.\n return undefined\n })()\n\n const {\n accessList,\n authorizationList,\n blobs,\n blobVersionedHashes,\n blockNumber,\n blockTag,\n data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n value,\n stateOverride,\n ...rest\n } = prepare\n ? ((await prepareTransactionRequest(client, {\n ...args,\n parameters,\n to,\n } as PrepareTransactionRequestParameters)) as EstimateGasParameters)\n : args\n\n // If we get `gas` back from the prepared transaction request, which is\n // different from the `gas` we provided, it was likely filled by other means\n // during request preparation (e.g. `eth_fillTransaction` or `chain.transactionRequest.prepare`).\n // (e.g. `eth_fillTransaction` or `chain.transactionRequest.prepare`).\n if (gas && args.gas !== gas) return gas\n\n const blockNumberHex =\n typeof blockNumber === 'bigint' ? numberToHex(blockNumber) : undefined\n const block = blockNumberHex || blockTag\n\n const rpcStateOverride = serializeStateOverride(stateOverride)\n\n assertRequest(args as AssertRequestParameters)\n\n const chainFormat = client.chain?.formatters?.transactionRequest?.format\n const format = chainFormat || formatTransactionRequest\n\n const request = format(\n {\n // Pick out extra data that might exist on the chain's transaction request type.\n ...extract(rest, { format: chainFormat }),\n account,\n accessList,\n authorizationList,\n blobs,\n blobVersionedHashes,\n data,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n value,\n } as TransactionRequest,\n 'estimateGas',\n )\n\n return BigInt(\n await client.request({\n method: 'eth_estimateGas',\n params: rpcStateOverride\n ? [\n request,\n block ?? client.experimental_blockTag ?? 'latest',\n rpcStateOverride,\n ]\n : block\n ? [request, block]\n : [request],\n }),\n )\n } catch (err) {\n throw getEstimateGasError(err as BaseError, {\n ...args,\n account,\n chain: client.chain,\n })\n }\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Log } from '../../types/log.js'\nimport type { RpcLog } from '../../types/rpc.js'\nimport type { ExactPartial } from '../../types/utils.js'\n\nexport type FormatLogErrorType = ErrorType\n\nexport function formatLog(\n log: ExactPartial<RpcLog>,\n {\n args,\n eventName,\n }: { args?: unknown | undefined; eventName?: string | undefined } = {},\n) {\n return {\n ...log,\n blockHash: log.blockHash ? log.blockHash : null,\n blockNumber: log.blockNumber ? BigInt(log.blockNumber) : null,\n blockTimestamp: log.blockTimestamp\n ? BigInt(log.blockTimestamp)\n : log.blockTimestamp === null\n ? null\n : undefined,\n logIndex: log.logIndex ? Number(log.logIndex) : null,\n transactionHash: log.transactionHash ? log.transactionHash : null,\n transactionIndex: log.transactionIndex\n ? Number(log.transactionIndex)\n : null,\n ...(eventName ? { args, eventName } : {}),\n } as Log\n}\n","import type { Abi, AbiParameter } from 'abitype'\n\nimport {\n AbiDecodingDataSizeTooSmallError,\n type AbiDecodingDataSizeTooSmallErrorType,\n AbiEventSignatureEmptyTopicsError,\n type AbiEventSignatureEmptyTopicsErrorType,\n AbiEventSignatureNotFoundError,\n type AbiEventSignatureNotFoundErrorType,\n DecodeLogDataMismatch,\n type DecodeLogDataMismatchErrorType,\n DecodeLogTopicsMismatch,\n type DecodeLogTopicsMismatchErrorType,\n} from '../../errors/abi.js'\nimport { PositionOutOfBoundsError } from '../../errors/cursor.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ContractEventArgsFromTopics,\n ContractEventName,\n EventDefinition,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type {\n IsNarrowable,\n Prettify,\n UnionEvaluate,\n} from '../../types/utils.js'\nimport { size } from '../data/size.js'\nimport {\n type ToEventSelectorErrorType,\n toEventSelector,\n} from '../hash/toEventSelector.js'\nimport {\n type DecodeAbiParametersErrorType,\n decodeAbiParameters,\n} from './decodeAbiParameters.js'\nimport { type FormatAbiItemErrorType, formatAbiItem } from './formatAbiItem.js'\n\nexport type DecodeEventLogParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName<abi> | undefined = ContractEventName<abi>,\n topics extends Hex[] = Hex[],\n data extends Hex | undefined = undefined,\n strict extends boolean = true,\n> = {\n abi: abi\n data?: data | undefined\n eventName?: eventName | ContractEventName<abi> | undefined\n strict?: strict | boolean | undefined\n topics: [signature: Hex, ...args: topics] | []\n}\n\nexport type DecodeEventLogReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName<abi> | undefined = ContractEventName<abi>,\n topics extends Hex[] = Hex[],\n data extends Hex | undefined = undefined,\n strict extends boolean = true,\n ///\n allEventNames extends\n ContractEventName<abi> = eventName extends ContractEventName<abi>\n ? eventName\n : ContractEventName<abi>,\n> = IsNarrowable<abi, Abi> extends true\n ? {\n [name in allEventNames]: Prettify<\n {\n eventName: name\n } & UnionEvaluate<\n ContractEventArgsFromTopics<abi, name, strict> extends infer allArgs\n ? topics extends readonly []\n ? data extends undefined\n ? { args?: undefined }\n : { args?: allArgs | undefined }\n : { args: allArgs }\n : never\n >\n >\n }[allEventNames]\n : {\n eventName: eventName\n args: readonly unknown[] | undefined\n }\n\nexport type DecodeEventLogErrorType =\n | AbiDecodingDataSizeTooSmallErrorType\n | AbiEventSignatureEmptyTopicsErrorType\n | AbiEventSignatureNotFoundErrorType\n | DecodeAbiParametersErrorType\n | DecodeLogTopicsMismatchErrorType\n | DecodeLogDataMismatchErrorType\n | FormatAbiItemErrorType\n | ToEventSelectorErrorType\n | ErrorType\n\nconst docsPath = '/docs/contract/decodeEventLog'\n\nexport function decodeEventLog<\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName<abi> | undefined = undefined,\n topics extends Hex[] = Hex[],\n data extends Hex | undefined = undefined,\n strict extends boolean = true,\n>(\n parameters: DecodeEventLogParameters<abi, eventName, topics, data, strict>,\n): DecodeEventLogReturnType<abi, eventName, topics, data, strict> {\n const {\n abi,\n data,\n strict: strict_,\n topics,\n } = parameters as DecodeEventLogParameters\n\n const strict = strict_ ?? true\n const [signature, ...argTopics] = topics\n if (!signature) throw new AbiEventSignatureEmptyTopicsError({ docsPath })\n\n const abiItem = abi.find(\n (x) =>\n x.type === 'event' &&\n signature === toEventSelector(formatAbiItem(x) as EventDefinition),\n )\n\n if (!(abiItem && 'name' in abiItem) || abiItem.type !== 'event')\n throw new AbiEventSignatureNotFoundError(signature, { docsPath })\n\n const { name, inputs } = abiItem\n const isUnnamed = inputs?.some((x) => !('name' in x && x.name))\n\n const args: any = isUnnamed ? [] : {}\n\n // Decode topics (indexed args).\n const indexedInputs = inputs\n .map((x, i) => [x, i] as const)\n .filter(([x]) => 'indexed' in x && x.indexed)\n\n const missingIndexedInputs: [AbiParameter, number][] = []\n\n for (let i = 0; i < indexedInputs.length; i++) {\n const [param, argIndex] = indexedInputs[i]\n const topic = argTopics[i]\n if (!topic) {\n if (strict)\n throw new DecodeLogTopicsMismatch({\n abiItem,\n param: param as AbiParameter & { indexed: boolean },\n })\n // Track missing indexed inputs to decode from data when strict is false\n missingIndexedInputs.push([param, argIndex])\n continue\n }\n args[isUnnamed ? argIndex : param.name || argIndex] = decodeTopic({\n param,\n value: topic,\n })\n }\n\n // Decode data (non-indexed args + missing indexed args when strict is false).\n const nonIndexedInputs = inputs.filter((x) => !('indexed' in x && x.indexed))\n\n // When strict is false, missing indexed inputs should be decoded from data\n const inputsToDecode = strict\n ? nonIndexedInputs\n : [...missingIndexedInputs.map(([param]) => param), ...nonIndexedInputs]\n\n if (inputsToDecode.length > 0) {\n if (data && data !== '0x') {\n try {\n const decodedData = decodeAbiParameters(\n inputsToDecode,\n data,\n ) as unknown[]\n if (decodedData) {\n let dataIndex = 0\n // First, assign missing indexed parameters (when strict is false)\n if (!strict) {\n for (const [param, argIndex] of missingIndexedInputs) {\n args[isUnnamed ? argIndex : param.name || argIndex] =\n decodedData[dataIndex++]\n }\n }\n // Then, assign non-indexed parameters\n if (isUnnamed) {\n for (let i = 0; i < inputs.length; i++)\n if (args[i] === undefined && dataIndex < decodedData.length)\n args[i] = decodedData[dataIndex++]\n } else\n for (let i = 0; i < nonIndexedInputs.length; i++)\n args[nonIndexedInputs[i].name!] = decodedData[dataIndex++]\n }\n } catch (err) {\n if (strict) {\n if (\n err instanceof AbiDecodingDataSizeTooSmallError ||\n err instanceof PositionOutOfBoundsError\n )\n throw new DecodeLogDataMismatch({\n abiItem,\n data: data,\n params: inputsToDecode,\n size: size(data),\n })\n throw err\n }\n }\n } else if (strict) {\n throw new DecodeLogDataMismatch({\n abiItem,\n data: '0x',\n params: inputsToDecode,\n size: 0,\n })\n }\n }\n\n return {\n eventName: name,\n args: Object.values(args).length > 0 ? args : undefined,\n } as unknown as DecodeEventLogReturnType<abi, eventName, topics, data, strict>\n}\n\nfunction decodeTopic({ param, value }: { param: AbiParameter; value: Hex }) {\n if (\n param.type === 'string' ||\n param.type === 'bytes' ||\n param.type === 'tuple' ||\n param.type.match(/^(.*)\\[(\\d+)?\\]$/)\n )\n return value\n const decodedArg = decodeAbiParameters([param], value) || []\n return decodedArg[0]\n}\n","// TODO(v3): checksum address.\n\nimport type { Abi, AbiEvent, AbiEventParameter, Address } from 'abitype'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ContractEventName, GetEventArgs } from '../../types/contract.js'\nimport type { Log } from '../../types/log.js'\nimport type { RpcLog } from '../../types/rpc.js'\nimport { isAddressEqual } from '../address/isAddressEqual.js'\nimport { toBytes } from '../encoding/toBytes.js'\nimport { formatLog } from '../formatters/log.js'\nimport { keccak256 } from '../hash/keccak256.js'\nimport { toEventSelector } from '../hash/toEventSelector.js'\nimport {\n type DecodeEventLogErrorType,\n decodeEventLog,\n} from './decodeEventLog.js'\n\nexport type ParseEventLogsParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends\n | ContractEventName<abi>\n | ContractEventName<abi>[]\n | undefined = ContractEventName<abi>,\n strict extends boolean | undefined = boolean | undefined,\n ///\n allArgs = GetEventArgs<\n abi,\n eventName extends ContractEventName<abi>\n ? eventName\n : ContractEventName<abi>,\n {\n EnableUnion: true\n IndexedOnly: false\n Required: false\n }\n >,\n> = {\n /** Contract ABI. */\n abi: abi\n /** Arguments for the event. */\n args?: allArgs | undefined\n /** Contract event. */\n eventName?:\n | eventName\n | ContractEventName<abi>\n | ContractEventName<abi>[]\n | undefined\n /** List of logs. */\n logs: (Log | RpcLog)[]\n strict?: strict | boolean | undefined\n}\n\nexport type ParseEventLogsReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends\n | ContractEventName<abi>\n | ContractEventName<abi>[]\n | undefined = ContractEventName<abi>,\n strict extends boolean | undefined = boolean | undefined,\n ///\n derivedEventName extends\n | ContractEventName<abi>\n | undefined = eventName extends ContractEventName<abi>[]\n ? eventName[number]\n : eventName,\n> = Log<bigint, number, false, undefined, strict, abi, derivedEventName>[]\n\nexport type ParseEventLogsErrorType = DecodeEventLogErrorType | ErrorType\n\n/**\n * Extracts & decodes logs matching the provided signature(s) (`abi` + optional `eventName`)\n * from a set of opaque logs.\n *\n * @param parameters - {@link ParseEventLogsParameters}\n * @returns The logs. {@link ParseEventLogsReturnType}\n *\n * @example\n * import { createClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { parseEventLogs } from 'viem/op-stack'\n *\n * const client = createClient({\n * chain: mainnet,\n * transport: http(),\n * })\n *\n * const receipt = await getTransactionReceipt(client, {\n * hash: '0xec23b2ba4bc59ba61554507c1b1bc91649e6586eb2dd00c728e8ed0db8bb37ea',\n * })\n *\n * const logs = parseEventLogs({ logs: receipt.logs })\n * // [{ args: { ... }, eventName: 'TransactionDeposited', ... }, ...]\n */\nexport function parseEventLogs<\n abi extends Abi | readonly unknown[],\n strict extends boolean | undefined = true,\n eventName extends\n | ContractEventName<abi>\n | ContractEventName<abi>[]\n | undefined = undefined,\n>(\n parameters: ParseEventLogsParameters<abi, eventName, strict>,\n): ParseEventLogsReturnType<abi, eventName, strict> {\n const { abi, args, logs, strict = true } = parameters\n\n const eventName = (() => {\n if (!parameters.eventName) return undefined\n if (Array.isArray(parameters.eventName)) return parameters.eventName\n return [parameters.eventName as string]\n })()\n\n const abiTopics = (abi as Abi)\n .filter((abiItem) => abiItem.type === 'event')\n .map((abiItem) => ({\n abi: abiItem,\n selector: toEventSelector(abiItem),\n }))\n\n return logs\n .map((log) => {\n // Normalize RpcLog (hex-encoded quantities) to Log (bigint/number).\n // When logs come directly from an RPC response (e.g. eth_getLogs),\n // fields like blockNumber are hex strings instead of bigints.\n const formattedLog =\n typeof log.blockNumber === 'string' ? formatLog(log as RpcLog) : log\n\n // Find all matching ABI items with the same selector.\n // Multiple events can share the same selector but differ in indexed parameters\n // (e.g., ERC20 vs ERC721 Transfer events).\n const abiItems = abiTopics.filter(\n (abiTopic) => formattedLog.topics[0] === abiTopic.selector,\n )\n if (abiItems.length === 0) return null\n\n // Try each matching ABI item until one successfully decodes.\n let event: { eventName: string; args: unknown } | undefined\n let abiItem: { abi: AbiEvent; selector: Address } | undefined\n\n for (const item of abiItems) {\n try {\n event = decodeEventLog({\n ...formattedLog,\n abi: [item.abi],\n strict: true,\n })\n abiItem = item\n break\n } catch {\n // Try next ABI item\n }\n }\n\n // If strict decoding failed for all, and we're in non-strict mode,\n // fall back to the first matching ABI item.\n if (!event && !strict) {\n abiItem = abiItems[0]\n try {\n event = decodeEventLog({\n data: formattedLog.data,\n topics: formattedLog.topics,\n abi: [abiItem.abi],\n strict: false,\n })\n } catch {\n // If decoding still fails, return partial log in non-strict mode.\n const isUnnamed = abiItem.abi.inputs?.some(\n (x) => !('name' in x && x.name),\n )\n return {\n ...formattedLog,\n args: isUnnamed ? [] : {},\n eventName: abiItem.abi.name,\n }\n }\n }\n\n // If no event was found, return null.\n if (!event || !abiItem) return null\n\n // Check that the decoded event name matches the provided event name.\n if (eventName && !eventName.includes(event.eventName)) return null\n\n // Check that the decoded event args match the provided args.\n if (\n !includesArgs({\n args: event.args,\n inputs: abiItem.abi.inputs,\n matchArgs: args,\n })\n )\n return null\n\n return { ...event, ...formattedLog }\n })\n .filter(Boolean) as unknown as ParseEventLogsReturnType<\n abi,\n eventName,\n strict\n >\n}\n\nfunction includesArgs(parameters: {\n args: unknown\n inputs: AbiEvent['inputs']\n matchArgs: unknown\n}) {\n const { args, inputs, matchArgs } = parameters\n\n if (!matchArgs) return true\n if (!args) return false\n\n function isEqual(input: AbiEventParameter, value: unknown, arg: unknown) {\n try {\n if (input.type === 'address')\n return isAddressEqual(value as Address, arg as Address)\n if (input.type === 'string' || input.type === 'bytes')\n return keccak256(toBytes(value as string)) === arg\n return value === arg\n } catch {\n return false\n }\n }\n\n if (Array.isArray(args) && Array.isArray(matchArgs)) {\n return matchArgs.every((value, index) => {\n if (value === null || value === undefined) return true\n const input = inputs[index]\n if (!input) return false\n const value_ = Array.isArray(value) ? value : [value]\n return value_.some((value) => isEqual(input, value, args[index]))\n })\n }\n\n if (\n typeof args === 'object' &&\n !Array.isArray(args) &&\n typeof matchArgs === 'object' &&\n !Array.isArray(matchArgs)\n )\n return Object.entries(matchArgs).every(([key, value]) => {\n if (value === null || value === undefined) return true\n const input = inputs.find((input) => input.name === key)\n if (!input) return false\n const value_ = Array.isArray(value) ? value : [value]\n return value_.some((value) =>\n isEqual(input, value, (args as Record<string, unknown>)[key]),\n )\n })\n\n return false\n}\n","import type { AbiEvent, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n MaybeAbiEventName,\n MaybeExtractEventArgsFromAbi,\n} from '../../types/contract.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hash, LogTopic } from '../../types/misc.js'\nimport type { RpcLog } from '../../types/rpc.js'\nimport type { DecodeEventLogErrorType } from '../../utils/abi/decodeEventLog.js'\nimport {\n type EncodeEventTopicsErrorType,\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormatLogErrorType,\n formatLog,\n} from '../../utils/formatters/log.js'\n\nexport type GetLogsParameters<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n //\n _eventName extends string | undefined = MaybeAbiEventName<abiEvent>,\n> = {\n /** Address or list of addresses from which logs originated */\n address?: Address | Address[] | undefined\n} & (\n | {\n event: abiEvent\n events?: undefined\n args?: MaybeExtractEventArgsFromAbi<abiEvents, _eventName> | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n event?: undefined\n events: abiEvents\n args?: undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | undefined\n }\n | {\n event?: undefined\n events?: undefined\n args?: undefined\n strict?: undefined\n }\n) &\n (\n | {\n /** Block number or tag after which to include logs */\n fromBlock?: fromBlock | BlockNumber | BlockTag | undefined\n /** Block number or tag before which to include logs */\n toBlock?: toBlock | BlockNumber | BlockTag | undefined\n blockHash?: undefined\n }\n | {\n fromBlock?: undefined\n toBlock?: undefined\n /** Hash of block to include logs from */\n blockHash?: Hash | undefined\n }\n )\n\nexport type GetLogsReturnType<\n abiEvent extends AbiEvent | undefined = undefined,\n abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n //\n _eventName extends string | undefined = MaybeAbiEventName<abiEvent>,\n _pending extends boolean =\n | (fromBlock extends 'pending' ? true : false)\n | (toBlock extends 'pending' ? true : false),\n> = Log<bigint, number, _pending, abiEvent, strict, abiEvents, _eventName>[]\n\nexport type GetLogsErrorType =\n | DecodeEventLogErrorType\n | EncodeEventTopicsErrorType\n | FormatLogErrorType\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns a list of event logs matching the provided parameters.\n *\n * - Docs: https://viem.sh/docs/actions/public/getLogs\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/logs_event-logs\n * - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs)\n *\n * @param client - Client to use\n * @param parameters - {@link GetLogsParameters}\n * @returns A list of event logs. {@link GetLogsReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getLogs } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const logs = await getLogs(client)\n */\nexport async function getLogs<\n chain extends Chain | undefined,\n const abiEvent extends AbiEvent | undefined = undefined,\n const abiEvents extends\n | readonly AbiEvent[]\n | readonly unknown[]\n | undefined = abiEvent extends AbiEvent ? [abiEvent] : undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n client: Client<Transport, chain>,\n {\n address,\n blockHash,\n fromBlock,\n toBlock,\n event,\n events: events_,\n args,\n strict: strict_,\n }: GetLogsParameters<abiEvent, abiEvents, strict, fromBlock, toBlock> = {},\n): Promise<GetLogsReturnType<abiEvent, abiEvents, strict, fromBlock, toBlock>> {\n const strict = strict_ ?? false\n const events = events_ ?? (event ? [event] : undefined)\n\n let topics: LogTopic[] = []\n if (events) {\n const encoded = (events as AbiEvent[]).flatMap((event) =>\n encodeEventTopics({\n abi: [event],\n eventName: (event as AbiEvent).name,\n args: events_ ? undefined : args,\n } as EncodeEventTopicsParameters),\n )\n // TODO: Clean up type casting\n topics = [encoded as LogTopic]\n if (event) topics = topics[0] as LogTopic[]\n }\n\n let logs: RpcLog[]\n if (blockHash) {\n logs = await client.request({\n method: 'eth_getLogs',\n params: [{ address, topics, blockHash }],\n })\n } else {\n logs = await client.request({\n method: 'eth_getLogs',\n params: [\n {\n address,\n topics,\n fromBlock:\n typeof fromBlock === 'bigint' ? numberToHex(fromBlock) : fromBlock,\n toBlock: typeof toBlock === 'bigint' ? numberToHex(toBlock) : toBlock,\n },\n ],\n })\n }\n\n const formattedLogs = logs.map((log) => formatLog(log))\n if (!events)\n return formattedLogs as GetLogsReturnType<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock\n >\n return parseEventLogs({\n abi: events,\n args: args as any,\n logs: formattedLogs,\n strict,\n }) as unknown as GetLogsReturnType<\n abiEvent,\n abiEvents,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import type { Abi, Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractEventArgs,\n ContractEventName,\n} from '../../types/contract.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hash } from '../../types/misc.js'\nimport {\n type GetAbiItemErrorType,\n type GetAbiItemParameters,\n getAbiItem,\n} from '../../utils/abi/getAbiItem.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type GetLogsErrorType,\n type GetLogsParameters,\n getLogs,\n} from './getLogs.js'\n\nexport type GetContractEventsParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName<abi> | undefined =\n | ContractEventName<abi>\n | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = {\n /** The address of the contract. */\n address?: Address | Address[] | undefined\n /** Contract ABI. */\n abi: abi\n args?:\n | ContractEventArgs<\n abi,\n eventName extends ContractEventName<abi>\n ? eventName\n : ContractEventName<abi>\n >\n | undefined\n /** Contract event. */\n eventName?: eventName | ContractEventName<abi> | undefined\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | boolean | undefined\n} & (\n | {\n /** Block number or tag after which to include logs */\n fromBlock?: fromBlock | BlockNumber | BlockTag | undefined\n /** Block number or tag before which to include logs */\n toBlock?: toBlock | BlockNumber | BlockTag | undefined\n blockHash?: undefined\n }\n | {\n fromBlock?: undefined\n toBlock?: undefined\n /** Hash of block to include logs from */\n blockHash?: Hash | undefined\n }\n)\n\nexport type GetContractEventsReturnType<\n abi extends Abi | readonly unknown[] = readonly unknown[],\n eventName extends ContractEventName<abi> | undefined =\n | ContractEventName<abi>\n | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n ///\n isPending extends boolean =\n | (fromBlock extends 'pending' ? true : false)\n | (toBlock extends 'pending' ? true : false),\n> = Log<bigint, number, isPending, undefined, strict, abi, eventName>[]\n\nexport type GetContractEventsErrorType =\n | GetAbiItemErrorType\n | GetLogsErrorType\n | ErrorType\n\n/**\n * Returns a list of event logs emitted by a contract.\n *\n * - Docs: https://viem.sh/docs/contract/getContractEvents#getcontractevents\n * - JSON-RPC Methods: [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs)\n *\n * @param client - Client to use\n * @param parameters - {@link GetContractEventsParameters}\n * @returns A list of event logs. {@link GetContractEventsReturnType}\n *\n * @example\n * import { createClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getContractEvents } from 'viem/public'\n * import { wagmiAbi } from './abi'\n *\n * const client = createClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const logs = await getContractEvents(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: wagmiAbi,\n * eventName: 'Transfer'\n * })\n */\nexport async function getContractEvents<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName<abi> | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n client: Client<Transport, chain>,\n parameters: GetContractEventsParameters<\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >,\n): Promise<\n GetContractEventsReturnType<abi, eventName, strict, fromBlock, toBlock>\n> {\n const {\n abi,\n address,\n args,\n blockHash,\n eventName,\n fromBlock,\n toBlock,\n strict,\n } = parameters\n const event = eventName\n ? getAbiItem({ abi, name: eventName } as GetAbiItemParameters)\n : undefined\n const events = !event\n ? (abi as Abi).filter((x) => x.type === 'event')\n : undefined\n return getAction(\n client,\n getLogs,\n 'getLogs',\n )({\n address,\n args,\n blockHash,\n event,\n events,\n fromBlock,\n toBlock,\n strict,\n } as {} as GetLogsParameters) as unknown as GetContractEventsReturnType<\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import type { Abi } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseError } from '../../errors/base.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionParameters,\n ContractFunctionReturnType,\n} from '../../types/contract.js'\nimport type { UnionEvaluate } from '../../types/utils.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n type EncodeFunctionDataParameters,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetContractErrorReturnType,\n getContractError,\n} from '../../utils/errors/getContractError.js'\nimport { getAction } from '../../utils/getAction.js'\n\nimport { type CallErrorType, type CallParameters, call } from './call.js'\n\nexport type ReadContractParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends ContractFunctionName<\n abi,\n 'pure' | 'view'\n > = ContractFunctionName<abi, 'pure' | 'view'>,\n args extends ContractFunctionArgs<\n abi,\n 'pure' | 'view',\n functionName\n > = ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n> = UnionEvaluate<\n Pick<\n CallParameters,\n | 'account'\n | 'authorizationList'\n | 'blockNumber'\n | 'blockOverrides'\n | 'blockTag'\n | 'factory'\n | 'factoryData'\n | 'stateOverride'\n >\n> &\n ContractFunctionParameters<abi, 'pure' | 'view', functionName, args, boolean>\n\nexport type ReadContractReturnType<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends ContractFunctionName<\n abi,\n 'pure' | 'view'\n > = ContractFunctionName<abi, 'pure' | 'view'>,\n args extends ContractFunctionArgs<\n abi,\n 'pure' | 'view',\n functionName\n > = ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n> = ContractFunctionReturnType<abi, 'pure' | 'view', functionName, args>\n\nexport type ReadContractErrorType = GetContractErrorReturnType<\n CallErrorType | EncodeFunctionDataErrorType | DecodeFunctionResultErrorType\n>\n\n/**\n * Calls a read-only function on a contract, and returns the response.\n *\n * - Docs: https://viem.sh/docs/contract/readContract\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts_reading-contracts\n *\n * A \"read-only\" function (constant function) on a Solidity contract is denoted by a `view` or `pure` keyword. They can only read the state of the contract, and cannot make any changes to it. Since read-only methods do not change the state of the contract, they do not require any gas to be executed, and can be called by any user without the need to pay for gas.\n *\n * Internally, uses a [Public Client](https://viem.sh/docs/clients/public) to call the [`call` action](https://viem.sh/docs/actions/public/call) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * @param client - Client to use\n * @param parameters - {@link ReadContractParameters}\n * @returns The response from the contract. Type is inferred. {@link ReadContractReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { readContract } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const result = await readContract(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function balanceOf(address) view returns (uint256)']),\n * functionName: 'balanceOf',\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * })\n * // 424122n\n */\nexport async function readContract<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName<abi, 'pure' | 'view'>,\n const args extends ContractFunctionArgs<abi, 'pure' | 'view', functionName>,\n>(\n client: Client<Transport, chain>,\n parameters: ReadContractParameters<abi, functionName, args>,\n): Promise<ReadContractReturnType<abi, functionName, args>> {\n const { abi, address, args, functionName, ...rest } =\n parameters as ReadContractParameters\n const calldata = encodeFunctionData({\n abi,\n args,\n functionName,\n } as EncodeFunctionDataParameters)\n try {\n const { data } = await getAction(\n client,\n call,\n 'call',\n )({\n ...(rest as CallParameters),\n data: calldata,\n to: address!,\n })\n return decodeFunctionResult({\n abi,\n args,\n functionName,\n data: data || '0x',\n }) as ReadContractReturnType<abi, functionName>\n } catch (error) {\n throw getContractError(error as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/readContract',\n functionName,\n })\n }\n}\n","import type { ErrorType } from '../errors/utils.js'\nimport type { MaybePromise } from '../types/utils.js'\n\ntype Callback = ((...args: any[]) => any) | undefined\ntype Callbacks = Record<string, Callback>\n\nexport type ObserveErrorType = ErrorType\n\n/** @internal */\nexport const listenersCache = /*#__PURE__*/ new Map<\n string,\n { id: number; fns: Callbacks }[]\n>()\n/** @internal */\nexport const cleanupCache = /*#__PURE__*/ new Map<\n string,\n () => void | Promise<void>\n>()\n\ntype EmitFunction<callbacks extends Callbacks> = (\n emit: callbacks,\n) => MaybePromise<void | (() => void) | (() => Promise<void>)>\n\nlet callbackCount = 0\n\n/**\n * @description Sets up an observer for a given function. If another function\n * is set up under the same observer id, the function will only be called once\n * for both instances of the observer.\n */\nexport function observe<callbacks extends Callbacks>(\n observerId: string,\n callbacks: callbacks,\n fn: EmitFunction<callbacks>,\n) {\n const callbackId = ++callbackCount\n\n const getListeners = () => listenersCache.get(observerId) || []\n\n const unsubscribe = () => {\n const listeners = getListeners()\n listenersCache.set(\n observerId,\n listeners.filter((cb: any) => cb.id !== callbackId),\n )\n }\n\n const unwatch = () => {\n const listeners = getListeners()\n if (!listeners.some((cb: any) => cb.id === callbackId)) return\n const cleanup = cleanupCache.get(observerId)\n if (listeners.length === 1 && cleanup) {\n const p = cleanup()\n if (p instanceof Promise) p.catch(() => {})\n }\n unsubscribe()\n }\n\n const listeners = getListeners()\n listenersCache.set(observerId, [\n ...listeners,\n { id: callbackId, fns: callbacks },\n ])\n\n if (listeners && listeners.length > 0) return unwatch\n\n const emit: callbacks = {} as callbacks\n for (const key in callbacks) {\n emit[key] = ((\n ...args: Parameters<NonNullable<callbacks[keyof callbacks]>>\n ) => {\n const listeners = getListeners()\n if (listeners.length === 0) return\n for (const listener of listeners) listener.fns[key]?.(...args)\n }) as callbacks[Extract<keyof callbacks, string>]\n }\n\n const cleanup = fn(emit)\n if (typeof cleanup === 'function') cleanupCache.set(observerId, cleanup)\n\n return unwatch\n}\n","export async function wait(time: number) {\n return new Promise((res) => setTimeout(res, time))\n}\n","import type { ErrorType } from '../errors/utils.js'\nimport { wait } from './wait.js'\n\ntype PollOptions<data> = {\n // Whether or not to emit when the polling starts.\n emitOnBegin?: boolean | undefined\n // The initial wait time (in ms) before polling.\n initialWaitTime?: ((data: data | void) => Promise<number>) | undefined\n // The interval (in ms).\n interval: number\n}\n\nexport type PollErrorType = ErrorType\n\n/**\n * @description Polls a function at a specified interval.\n */\nexport function poll<data>(\n fn: ({ unpoll }: { unpoll: () => void }) => Promise<data | void>,\n { emitOnBegin, initialWaitTime, interval }: PollOptions<data>,\n) {\n let active = true\n\n const unwatch = () => (active = false)\n\n const watch = async () => {\n let data: data | undefined | void\n if (emitOnBegin) data = await fn({ unpoll: unwatch })\n\n const initialWait = (await initialWaitTime?.(data)) ?? interval\n await wait(initialWait)\n\n const poll = async () => {\n if (!active) return\n await fn({ unpoll: unwatch })\n await wait(interval)\n poll()\n }\n\n poll()\n }\n watch()\n\n return unwatch\n}\n","import type { ErrorType } from '../../errors/utils.js'\n\n/** @internal */\nexport const promiseCache = /*#__PURE__*/ new Map()\n/** @internal */\nexport const responseCache = /*#__PURE__*/ new Map()\n\nexport type GetCacheErrorType = ErrorType\n\nexport function getCache<data>(cacheKey: string) {\n const buildCache = <data>(cacheKey: string, cache: Map<string, data>) => ({\n clear: () => cache.delete(cacheKey),\n get: () => cache.get(cacheKey),\n set: (data: data) => cache.set(cacheKey, data),\n })\n\n const promise = buildCache<Promise<data>>(cacheKey, promiseCache)\n const response = buildCache<{ created: Date; data: data }>(\n cacheKey,\n responseCache,\n )\n\n return {\n clear: () => {\n promise.clear()\n response.clear()\n },\n promise,\n response,\n }\n}\n\ntype WithCacheParameters = {\n /** The key to cache the data against. */\n cacheKey: string\n /** The time that cached data will remain in memory. Default: Infinity (no expiry) */\n cacheTime?: number | undefined\n}\n\n/**\n * @description Returns the result of a given promise, and caches the result for\n * subsequent invocations against a provided cache key.\n */\nexport async function withCache<data>(\n fn: () => Promise<data>,\n { cacheKey, cacheTime = Number.POSITIVE_INFINITY }: WithCacheParameters,\n) {\n const cache = getCache<data>(cacheKey)\n\n // If a response exists in the cache, and it's not expired, return it\n // and do not invoke the promise.\n // If the max age is 0, the cache is disabled.\n const response = cache.response.get()\n if (response && cacheTime > 0) {\n const age = Date.now() - response.created.getTime()\n if (age < cacheTime) return response.data\n }\n\n let promise = cache.promise.get()\n if (!promise) {\n promise = fn()\n\n // Store the promise in the cache so that subsequent invocations\n // will wait for the same promise to resolve (deduping).\n cache.promise.set(promise)\n }\n\n try {\n const data = await promise\n\n // Store the response in the cache so that subsequent invocations\n // will return the same response.\n cache.response.set({ created: new Date(), data })\n\n return data\n } finally {\n // Clear the promise cache so that subsequent invocations will\n // invoke the promise again.\n cache.promise.clear()\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type GetCacheErrorType,\n getCache,\n withCache,\n} from '../../utils/promise/withCache.js'\n\nexport type GetBlockNumberParameters = {\n /** Time (in ms) that cached block number will remain in memory. */\n cacheTime?: number | undefined\n}\n\nexport type GetBlockNumberReturnType = bigint\n\nexport type GetBlockNumberErrorType = RequestErrorType | ErrorType\n\nconst cacheKey = (id: string) => `blockNumber.${id}`\n\n/** @internal */\nexport type GetBlockNumberCacheErrorType = GetCacheErrorType | ErrorType\n\n/** @internal */\nexport function getBlockNumberCache(id: string) {\n return getCache(cacheKey(id))\n}\n\n/**\n * Returns the number of the most recent block seen.\n *\n * - Docs: https://viem.sh/docs/actions/public/getBlockNumber\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_fetching-blocks\n * - JSON-RPC Methods: [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber)\n *\n * @param client - Client to use\n * @param parameters - {@link GetBlockNumberParameters}\n * @returns The number of the block. {@link GetBlockNumberReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getBlockNumber } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const blockNumber = await getBlockNumber(client)\n * // 69420n\n */\nexport async function getBlockNumber<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n { cacheTime = client.cacheTime }: GetBlockNumberParameters = {},\n): Promise<GetBlockNumberReturnType> {\n const blockNumberHex = await withCache(\n () =>\n client.request({\n method: 'eth_blockNumber',\n }),\n { cacheKey: cacheKey(client.uid), cacheTime },\n )\n return BigInt(blockNumberHex)\n}\n","import type { Abi, AbiEvent, ExtractAbiEvent } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { RpcLog } from '../../index.js'\nimport type { BlockNumber, BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter, FilterType } from '../../types/filter.js'\nimport type { Log } from '../../types/log.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { DecodeEventLogErrorType } from '../../utils/abi/decodeEventLog.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type FormatLogErrorType,\n formatLog,\n} from '../../utils/formatters/log.js'\n\nexport type GetFilterChangesParameters<\n filterType extends FilterType = FilterType,\n abi extends Abi | readonly unknown[] | undefined = undefined,\n eventName extends string | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n> = {\n filter: Filter<filterType, abi, eventName, any, strict, fromBlock, toBlock>\n}\n\nexport type GetFilterChangesReturnType<\n filterType extends FilterType = FilterType,\n abi extends Abi | readonly unknown[] | undefined = undefined,\n eventName extends string | undefined = undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n _AbiEvent extends AbiEvent | undefined = abi extends Abi\n ? eventName extends string\n ? ExtractAbiEvent<abi, eventName>\n : undefined\n : undefined,\n _Pending extends boolean =\n | (fromBlock extends 'pending' ? true : false)\n | (toBlock extends 'pending' ? true : false),\n> = filterType extends 'event'\n ? Log<bigint, number, _Pending, _AbiEvent, strict, abi, eventName>[]\n : Hash[]\n\nexport type GetFilterChangesErrorType =\n | RequestErrorType\n | DecodeEventLogErrorType\n | FormatLogErrorType\n | ErrorType\n\n/**\n * Returns a list of logs or hashes based on a [Filter](/docs/glossary/terms#filter) since the last time it was called.\n *\n * - Docs: https://viem.sh/docs/actions/public/getFilterChanges\n * - JSON-RPC Methods: [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges)\n *\n * A Filter can be created from the following actions:\n *\n * - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter)\n * - [`createContractEventFilter`](https://viem.sh/docs/contract/createContractEventFilter)\n * - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter)\n * - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter)\n *\n * Depending on the type of filter, the return value will be different:\n *\n * - If the filter was created with `createContractEventFilter` or `createEventFilter`, it returns a list of logs.\n * - If the filter was created with `createPendingTransactionFilter`, it returns a list of transaction hashes.\n * - If the filter was created with `createBlockFilter`, it returns a list of block hashes.\n *\n * @param client - Client to use\n * @param parameters - {@link GetFilterChangesParameters}\n * @returns Logs or hashes. {@link GetFilterChangesReturnType}\n *\n * @example\n * // Blocks\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createBlockFilter, getFilterChanges } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createBlockFilter(client)\n * const hashes = await getFilterChanges(client, { filter })\n *\n * @example\n * // Contract Events\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createContractEventFilter, getFilterChanges } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createContractEventFilter(client, {\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * abi: parseAbi(['event Transfer(address indexed, address indexed, uint256)']),\n * eventName: 'Transfer',\n * })\n * const logs = await getFilterChanges(client, { filter })\n *\n * @example\n * // Raw Events\n * import { createPublicClient, http, parseAbiItem } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createEventFilter, getFilterChanges } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createEventFilter(client, {\n * address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48',\n * event: parseAbiItem('event Transfer(address indexed, address indexed, uint256)'),\n * })\n * const logs = await getFilterChanges(client, { filter })\n *\n * @example\n * // Transactions\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createPendingTransactionFilter, getFilterChanges } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const filter = await createPendingTransactionFilter(client)\n * const hashes = await getFilterChanges(client, { filter })\n */\nexport async function getFilterChanges<\n transport extends Transport,\n chain extends Chain | undefined,\n filterType extends FilterType,\n const abi extends Abi | readonly unknown[] | undefined,\n eventName extends string | undefined,\n strict extends boolean | undefined = undefined,\n fromBlock extends BlockNumber | BlockTag | undefined = undefined,\n toBlock extends BlockNumber | BlockTag | undefined = undefined,\n>(\n _client: Client<transport, chain>,\n {\n filter,\n }: GetFilterChangesParameters<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >,\n): Promise<\n GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n> {\n const strict = 'strict' in filter && filter.strict\n\n const logs = await filter.request({\n method: 'eth_getFilterChanges',\n params: [filter.id],\n })\n\n if (typeof logs[0] === 'string')\n return logs as GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n\n const formattedLogs = logs.map((log) => formatLog(log as RpcLog))\n if (!('abi' in filter) || !filter.abi)\n return formattedLogs as GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n return parseEventLogs({\n abi: filter.abi,\n logs: formattedLogs,\n strict,\n }) as unknown as GetFilterChangesReturnType<\n filterType,\n abi,\n eventName,\n strict,\n fromBlock,\n toBlock\n >\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\n\nexport type UninstallFilterParameters = {\n filter: Filter<any>\n}\nexport type UninstallFilterReturnType = boolean\n\nexport type UninstallFilterErrorType = RequestErrorType | ErrorType\n\n/**\n * Destroys a [`Filter`](https://viem.sh/docs/glossary/types#filter).\n *\n * - Docs: https://viem.sh/docs/actions/public/uninstallFilter\n * - JSON-RPC Methods: [`eth_uninstallFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_uninstallFilter)\n *\n * Destroys a Filter that was created from one of the following Actions:\n * - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter)\n * - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter)\n * - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter)\n *\n * @param client - Client to use\n * @param parameters - {@link UninstallFilterParameters}\n * @returns A boolean indicating if the Filter was successfully uninstalled. {@link UninstallFilterReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { createPendingTransactionFilter, uninstallFilter } from 'viem/public'\n *\n * const filter = await createPendingTransactionFilter(client)\n * const uninstalled = await uninstallFilter(client, { filter })\n * // true\n */\nexport async function uninstallFilter<\n transport extends Transport,\n chain extends Chain | undefined,\n>(\n _client: Client<transport, chain>,\n { filter }: UninstallFilterParameters,\n): Promise<UninstallFilterReturnType> {\n return filter.request({\n method: 'eth_uninstallFilter',\n params: [filter.id],\n })\n}\n","import type { Abi, Address, ExtractAbiEvent } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n DecodeLogDataMismatch,\n DecodeLogTopicsMismatch,\n} from '../../errors/abi.js'\nimport { InvalidInputRpcError } from '../../errors/rpc.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockNumber } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractEventArgs,\n ContractEventName,\n} from '../../types/contract.js'\nimport type { Filter } from '../../types/filter.js'\nimport type { Log } from '../../types/log.js'\nimport type { LogTopic } from '../../types/misc.js'\nimport type { GetPollOptions } from '../../types/transport.js'\nimport { decodeEventLog } from '../../utils/abi/decodeEventLog.js'\nimport {\n type EncodeEventTopicsParameters,\n encodeEventTopics,\n} from '../../utils/abi/encodeEventTopics.js'\nimport { formatLog } from '../../utils/formatters/log.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type ObserveErrorType, observe } from '../../utils/observe.js'\nimport { poll } from '../../utils/poll.js'\nimport { type StringifyErrorType, stringify } from '../../utils/stringify.js'\nimport { createContractEventFilter } from './createContractEventFilter.js'\nimport { getBlockNumber } from './getBlockNumber.js'\nimport {\n type GetContractEventsParameters,\n getContractEvents,\n} from './getContractEvents.js'\nimport { getFilterChanges } from './getFilterChanges.js'\nimport { uninstallFilter } from './uninstallFilter.js'\n\nexport type WatchContractEventOnLogsParameter<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName<abi> = ContractEventName<abi>,\n strict extends boolean | undefined = undefined,\n> = abi extends Abi\n ? Abi extends abi\n ? Log[]\n : Log<bigint, number, false, ExtractAbiEvent<abi, eventName>, strict>[]\n : Log[]\n\nexport type WatchContractEventOnLogsFn<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName<abi> = ContractEventName<abi>,\n strict extends boolean | undefined = undefined,\n> = (logs: WatchContractEventOnLogsParameter<abi, eventName, strict>) => void\n\nexport type WatchContractEventParameters<\n abi extends Abi | readonly unknown[] = Abi,\n eventName extends ContractEventName<abi> | undefined = ContractEventName<abi>,\n strict extends boolean | undefined = undefined,\n transport extends Transport = Transport,\n> = {\n /** The address of the contract. */\n address?: Address | Address[] | undefined\n /** Contract ABI. */\n abi: abi\n args?:\n | ContractEventArgs<\n abi,\n eventName extends ContractEventName<abi>\n ? eventName\n : ContractEventName<abi>\n >\n | undefined\n /** Contract event. */\n eventName?: eventName | ContractEventName<abi> | undefined\n /** Block to start listening from. */\n fromBlock?: BlockNumber<bigint> | undefined\n /** The callback to call when an error occurred when trying to get for a new block. */\n onError?: ((error: Error) => void) | undefined\n /** The callback to call when new event logs are received. */\n onLogs: WatchContractEventOnLogsFn<\n abi,\n eventName extends ContractEventName<abi>\n ? eventName\n : ContractEventName<abi>,\n strict\n >\n /**\n * Whether or not the logs must match the indexed/non-indexed arguments on `event`.\n * @default false\n */\n strict?: strict | boolean | undefined\n} & GetPollOptions<transport>\n\nexport type WatchContractEventReturnType = () => void\n\nexport type WatchContractEventErrorType =\n | StringifyErrorType\n | ObserveErrorType\n | ErrorType\n\n/**\n * Watches and returns emitted contract event logs.\n *\n * - Docs: https://viem.sh/docs/contract/watchContractEvent\n *\n * This Action will batch up all the event logs found within the [`pollingInterval`](https://viem.sh/docs/contract/watchContractEvent#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/contract/watchContractEvent#onLogs).\n *\n * `watchContractEvent` will attempt to create an [Event Filter](https://viem.sh/docs/contract/createContractEventFilter) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchContractEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs) instead.\n *\n * @param client - Client to use\n * @param parameters - {@link WatchContractEventParameters}\n * @returns A function that can be invoked to stop watching for new event logs. {@link WatchContractEventReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { watchContractEvent } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = watchContractEvent(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['event Transfer(address indexed from, address indexed to, uint256 value)']),\n * eventName: 'Transfer',\n * args: { from: '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b' },\n * onLogs: (logs) => console.log(logs),\n * })\n */\nexport function watchContractEvent<\n chain extends Chain | undefined,\n const abi extends Abi | readonly unknown[],\n eventName extends ContractEventName<abi> | undefined = undefined,\n strict extends boolean | undefined = undefined,\n transport extends Transport = Transport,\n>(\n client: Client<transport, chain>,\n parameters: WatchContractEventParameters<abi, eventName, strict, transport>,\n): WatchContractEventReturnType {\n const {\n abi,\n address,\n args,\n batch = true,\n eventName,\n fromBlock,\n onError,\n onLogs,\n poll: poll_,\n pollingInterval = client.pollingInterval,\n strict: strict_,\n } = parameters\n\n const enablePolling = (() => {\n if (typeof poll_ !== 'undefined') return poll_\n if (typeof fromBlock === 'bigint') return true\n if (\n client.transport.type === 'webSocket' ||\n client.transport.type === 'ipc'\n )\n return false\n if (\n client.transport.type === 'fallback' &&\n (client.transport.transports[0].config.type === 'webSocket' ||\n client.transport.transports[0].config.type === 'ipc')\n )\n return false\n return true\n })()\n\n const pollContractEvent = () => {\n const strict = strict_ ?? false\n const observerId = stringify([\n 'watchContractEvent',\n address,\n args,\n batch,\n client.uid,\n eventName,\n pollingInterval,\n strict,\n fromBlock,\n ])\n\n return observe(observerId, { onLogs, onError }, (emit) => {\n let previousBlockNumber: bigint\n if (fromBlock !== undefined) previousBlockNumber = fromBlock - 1n\n let filter: Filter<'event', abi, eventName> | undefined\n let initialized = false\n\n const unwatch = poll(\n async () => {\n if (!initialized) {\n try {\n filter = (await getAction(\n client,\n createContractEventFilter,\n 'createContractEventFilter',\n )({\n abi,\n address,\n args: args as any,\n eventName: eventName as any,\n strict: strict as any,\n fromBlock,\n })) as Filter<'event', abi, eventName>\n } catch {}\n initialized = true\n return\n }\n\n try {\n let logs: Log[]\n if (filter) {\n logs = await getAction(\n client,\n getFilterChanges,\n 'getFilterChanges',\n )({ filter })\n } else {\n // If the filter doesn't exist, we will fall back to use `getLogs`.\n // The fall back exists because some RPC Providers do not support filters.\n\n // Fetch the block number to use for `getLogs`.\n const blockNumber = await getAction(\n client,\n getBlockNumber,\n 'getBlockNumber',\n )({})\n\n // If the block number has changed, we will need to fetch the logs.\n // If the block number doesn't exist, we are yet to reach the first poll interval,\n // so do not emit any logs.\n if (previousBlockNumber && previousBlockNumber < blockNumber) {\n logs = await getAction(\n client,\n getContractEvents,\n 'getContractEvents',\n )({\n abi,\n address,\n args,\n eventName,\n fromBlock: previousBlockNumber + 1n,\n toBlock: blockNumber,\n strict,\n } as {} as GetContractEventsParameters)\n } else {\n logs = []\n }\n previousBlockNumber = blockNumber\n }\n\n if (logs.length === 0) return\n if (batch) emit.onLogs(logs as any)\n else for (const log of logs) emit.onLogs([log] as any)\n } catch (err) {\n // If a filter has been set and gets uninstalled, providers will throw an InvalidInput error.\n // Reinitialize the filter when this occurs\n if (filter && err instanceof InvalidInputRpcError)\n initialized = false\n emit.onError?.(err as Error)\n }\n },\n {\n emitOnBegin: true,\n interval: pollingInterval,\n },\n )\n\n return async () => {\n if (filter)\n await getAction(\n client,\n uninstallFilter,\n 'uninstallFilter',\n )({ filter })\n unwatch()\n }\n })\n }\n\n const subscribeContractEvent = () => {\n const strict = strict_ ?? false\n const observerId = stringify([\n 'watchContractEvent',\n address,\n args,\n batch,\n client.uid,\n eventName,\n pollingInterval,\n strict,\n ])\n\n let active = true\n let unsubscribe = () => (active = false)\n return observe(observerId, { onLogs, onError }, (emit) => {\n ;(async () => {\n try {\n const transport = (() => {\n if (client.transport.type === 'fallback') {\n const transport = client.transport.transports.find(\n (transport: ReturnType<Transport>) =>\n transport.config.type === 'webSocket' ||\n transport.config.type === 'ipc',\n )\n if (!transport) return client.transport\n return transport.value\n }\n return client.transport\n })()\n\n const topics: LogTopic[] = eventName\n ? encodeEventTopics({\n abi: abi,\n eventName: eventName,\n args,\n } as EncodeEventTopicsParameters)\n : []\n\n const { unsubscribe: unsubscribe_ } = await transport.subscribe({\n params: ['logs', { address, topics }],\n onData(data: any) {\n if (!active) return\n const log = data.result\n try {\n const { eventName, args } = decodeEventLog({\n abi: abi,\n data: log.data,\n topics: log.topics as any,\n strict: strict_,\n })\n const formatted = formatLog(log, {\n args,\n eventName: eventName as string,\n })\n emit.onLogs([formatted] as any)\n } catch (err) {\n let eventName: string | undefined\n let isUnnamed: boolean | undefined\n if (\n err instanceof DecodeLogDataMismatch ||\n err instanceof DecodeLogTopicsMismatch\n ) {\n // If strict mode is on, and log data/topics do not match event definition, skip.\n if (strict_) return\n eventName = err.abiItem.name\n isUnnamed = err.abiItem.inputs?.some(\n (x) => !('name' in x && x.name),\n )\n }\n\n // Set args to empty if there is an error decoding (e.g. indexed/non-indexed params mismatch).\n const formatted = formatLog(log, {\n args: isUnnamed ? [] : {},\n eventName,\n })\n emit.onLogs([formatted] as any)\n }\n },\n onError(error: Error) {\n emit.onError?.(error)\n },\n })\n unsubscribe = unsubscribe_\n if (!active) unsubscribe()\n } catch (err) {\n onError?.(err as Error)\n }\n })()\n return () => unsubscribe()\n })\n }\n\n return enablePolling ? pollContractEvent() : subscribeContractEvent()\n}\n","import { BaseError } from './base.js'\n\nexport type AccountNotFoundErrorType = AccountNotFoundError & {\n name: 'AccountNotFoundError'\n}\nexport class AccountNotFoundError extends BaseError {\n constructor({ docsPath }: { docsPath?: string | undefined } = {}) {\n super(\n [\n 'Could not find an Account to execute with this Action.',\n 'Please provide an Account with the `account` argument on the Action, or by supplying an `account` to the Client.',\n ].join('\\n'),\n {\n docsPath,\n docsSlug: 'account',\n name: 'AccountNotFoundError',\n },\n )\n }\n}\n\nexport type AccountTypeNotSupportedErrorType = AccountTypeNotSupportedError & {\n name: 'AccountTypeNotSupportedError'\n}\nexport class AccountTypeNotSupportedError extends BaseError {\n constructor({\n docsPath,\n metaMessages,\n type,\n }: {\n docsPath?: string | undefined\n metaMessages?: string[] | undefined\n type: string\n }) {\n super(`Account type \"${type}\" is not supported.`, {\n docsPath,\n metaMessages,\n name: 'AccountTypeNotSupportedError',\n })\n }\n}\n","import {\n ChainMismatchError,\n type ChainMismatchErrorType,\n ChainNotFoundError,\n type ChainNotFoundErrorType,\n} from '../../errors/chain.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\n\nexport type AssertCurrentChainParameters = {\n chain?: Chain | undefined\n currentChainId: number\n}\n\nexport type AssertCurrentChainErrorType =\n | ChainNotFoundErrorType\n | ChainMismatchErrorType\n | ErrorType\n\nexport function assertCurrentChain({\n chain,\n currentChainId,\n}: AssertCurrentChainParameters): void {\n if (!chain) throw new ChainNotFoundError()\n if (currentChainId !== chain.id)\n throw new ChainMismatchError({ chain, currentChainId })\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { TransactionSerializedGeneric } from '../../types/transaction.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\n\nexport type SendRawTransactionParameters = {\n /** The signed serialized transaction. */\n serializedTransaction: TransactionSerializedGeneric\n}\n\nexport type SendRawTransactionReturnType = Hash\n\nexport type SendRawTransactionErrorType = RequestErrorType | ErrorType\n\n/**\n * Sends a **signed** transaction to the network\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendRawTransaction\n * - JSON-RPC Method: [`eth_sendRawTransaction`](https://ethereum.github.io/execution-apis/api-documentation/)\n *\n * @param client - Client to use\n * @param parameters - {@link SendRawTransactionParameters}\n * @returns The transaction hash. {@link SendRawTransactionReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendRawTransaction } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n *\n * const hash = await sendRawTransaction(client, {\n * serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33'\n * })\n */\nexport async function sendRawTransaction<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n { serializedTransaction }: SendRawTransactionParameters,\n): Promise<SendRawTransactionReturnType> {\n return client.request(\n {\n method: 'eth_sendRawTransaction',\n params: [serializedTransaction],\n },\n { retryCount: 0 },\n )\n}\n","import type { Address } from 'abitype'\n\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { SignTransactionErrorType } from '../../accounts/utils/signTransaction.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n AccountNotFoundError,\n type AccountNotFoundErrorType,\n AccountTypeNotSupportedError,\n type AccountTypeNotSupportedErrorType,\n} from '../../errors/account.js'\nimport { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { GetAccountParameter } from '../../types/account.js'\nimport type {\n Chain,\n DeriveChain,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type { GetTransactionRequestKzgParameter } from '../../types/kzg.js'\nimport type { Hash, Hex } from '../../types/misc.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport {\n type RecoverAuthorizationAddressErrorType,\n recoverAuthorizationAddress,\n} from '../../utils/authorization/recoverAuthorizationAddress.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type AssertCurrentChainErrorType,\n assertCurrentChain,\n} from '../../utils/chain/assertCurrentChain.js'\nimport { concat } from '../../utils/data/concat.js'\nimport {\n type GetTransactionErrorReturnType,\n getTransactionError,\n} from '../../utils/errors/getTransactionError.js'\nimport { extract } from '../../utils/formatters/extract.js'\nimport {\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { LruMap } from '../../utils/lru.js'\nimport {\n type AssertRequestErrorType,\n type AssertRequestParameters,\n assertRequest,\n} from '../../utils/transaction/assertRequest.js'\nimport { type GetChainIdErrorType, getChainId } from '../public/getChainId.js'\nimport {\n defaultParameters,\n type PrepareTransactionRequestErrorType,\n prepareTransactionRequest,\n} from './prepareTransactionRequest.js'\nimport {\n type SendRawTransactionErrorType,\n sendRawTransaction,\n} from './sendRawTransaction.js'\n\nconst supportsWalletNamespace = new LruMap<boolean>(128)\n\nexport type SendTransactionRequest<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n ///\n _derivedChain extends Chain | undefined = DeriveChain<chain, chainOverride>,\n> = UnionOmit<FormattedTransactionRequest<_derivedChain>, 'from'> &\n GetTransactionRequestKzgParameter\n\nexport type SendTransactionParameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n request extends SendTransactionRequest<\n chain,\n chainOverride\n > = SendTransactionRequest<chain, chainOverride>,\n> = request &\n GetAccountParameter<account, Account | Address, true, true> &\n GetChainParameter<chain, chainOverride> &\n GetTransactionRequestKzgParameter<request> & {\n /** Whether to assert that the client chain is on the correct chain. @default true */\n assertChainId?: boolean | undefined\n /** Data to append to the end of the calldata. Takes precedence over `client.dataSuffix`. */\n dataSuffix?: Hex | undefined\n }\n\nexport type SendTransactionReturnType = Hash\n\nexport type SendTransactionErrorType =\n | ParseAccountErrorType\n | GetTransactionErrorReturnType<\n | AccountNotFoundErrorType\n | AccountTypeNotSupportedErrorType\n | AssertCurrentChainErrorType\n | AssertRequestErrorType\n | GetChainIdErrorType\n | PrepareTransactionRequestErrorType\n | SendRawTransactionErrorType\n | RecoverAuthorizationAddressErrorType\n | SignTransactionErrorType\n | RequestErrorType\n >\n | ErrorType\n\n/**\n * Creates, signs, and sends a new transaction to the network.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendTransaction\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_sending-transactions\n * - JSON-RPC Methods:\n * - JSON-RPC Accounts: [`eth_sendTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sendtransaction)\n * - Local Accounts: [`eth_sendRawTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_sendrawtransaction)\n *\n * @param client - Client to use\n * @param parameters - {@link SendTransactionParameters}\n * @returns The [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash. {@link SendTransactionReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendTransaction } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const hash = await sendTransaction(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: 1000000000000000000n,\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n * import { sendTransaction } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * account: privateKeyToAccount('0x…'),\n * chain: mainnet,\n * transport: http(),\n * })\n * const hash = await sendTransaction(client, {\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: 1000000000000000000n,\n * })\n */\nexport async function sendTransaction<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const request extends SendTransactionRequest<chain, chainOverride>,\n chainOverride extends Chain | undefined = undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: SendTransactionParameters<chain, account, chainOverride, request>,\n): Promise<SendTransactionReturnType> {\n const {\n account: account_ = client.account,\n assertChainId = true,\n chain = client.chain,\n accessList,\n authorizationList,\n blobs,\n data,\n dataSuffix = typeof client.dataSuffix === 'string'\n ? client.dataSuffix\n : client.dataSuffix?.value,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n type,\n value,\n ...rest\n } = parameters\n\n if (typeof account_ === 'undefined')\n throw new AccountNotFoundError({\n docsPath: '/docs/actions/wallet/sendTransaction',\n })\n const account = account_ ? parseAccount(account_) : null\n\n try {\n assertRequest(parameters as AssertRequestParameters)\n\n const to = await (async () => {\n // If `to` exists on the parameters, use that.\n if (parameters.to) return parameters.to\n\n // If `to` is null, we are sending a deployment transaction.\n if (parameters.to === null) return undefined\n\n // If no `to` exists, and we are sending a EIP-7702 transaction, use the\n // address of the first authorization in the list.\n if (authorizationList && authorizationList.length > 0)\n return await recoverAuthorizationAddress({\n authorization: authorizationList[0],\n }).catch(() => {\n throw new BaseError(\n '`to` is required. Could not infer from `authorizationList`.',\n )\n })\n\n // Otherwise, we are sending a deployment transaction.\n return undefined\n })()\n\n if (account?.type === 'json-rpc' || account === null) {\n let chainId: number | undefined\n if (chain !== null) {\n chainId = await getAction(client, getChainId, 'getChainId')({})\n if (assertChainId)\n assertCurrentChain({\n currentChainId: chainId,\n chain,\n })\n }\n\n const chainFormat = client.chain?.formatters?.transactionRequest?.format\n const format = chainFormat || formatTransactionRequest\n\n const request = format(\n {\n // Pick out extra data that might exist on the chain's transaction request type.\n ...extract(rest, { format: chainFormat }),\n accessList,\n account,\n authorizationList,\n blobs,\n chainId,\n data: data ? concat([data, dataSuffix ?? '0x']) : data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n type,\n value,\n } as TransactionRequest,\n 'sendTransaction',\n )\n\n const isWalletNamespaceSupported = supportsWalletNamespace.get(client.uid)\n const method = isWalletNamespaceSupported\n ? 'wallet_sendTransaction'\n : 'eth_sendTransaction'\n\n try {\n return await client.request(\n {\n method,\n params: [request],\n },\n { retryCount: 0 },\n )\n } catch (e) {\n if (isWalletNamespaceSupported === false) throw e\n\n const error = e as BaseError\n // If the transport does not support the method or input, attempt to use the\n // `wallet_sendTransaction` method.\n if (\n error.name === 'InvalidInputRpcError' ||\n error.name === 'InvalidParamsRpcError' ||\n error.name === 'MethodNotFoundRpcError' ||\n error.name === 'MethodNotSupportedRpcError'\n ) {\n return await client\n .request(\n {\n method: 'wallet_sendTransaction',\n params: [request],\n },\n { retryCount: 0 },\n )\n .then((hash) => {\n supportsWalletNamespace.set(client.uid, true)\n return hash\n })\n .catch((e) => {\n const walletNamespaceError = e as BaseError\n if (\n walletNamespaceError.name === 'MethodNotFoundRpcError' ||\n walletNamespaceError.name === 'MethodNotSupportedRpcError'\n ) {\n supportsWalletNamespace.set(client.uid, false)\n throw error\n }\n\n throw walletNamespaceError\n })\n }\n\n throw error\n }\n }\n\n if (account?.type === 'local') {\n // Prepare the request for signing (assign appropriate fees, etc.)\n const request = await getAction(\n client,\n prepareTransactionRequest,\n 'prepareTransactionRequest',\n )({\n account,\n accessList,\n authorizationList,\n blobs,\n chain,\n data: data ? concat([data, dataSuffix ?? '0x']) : data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n nonceManager: account.nonceManager,\n parameters: [...defaultParameters, 'sidecars'],\n type,\n value,\n ...rest,\n to,\n } as any)\n\n const serializer = chain?.serializers?.transaction\n const serializedTransaction = (await account.signTransaction(request, {\n serializer,\n })) as Hash\n return await getAction(\n client,\n sendRawTransaction,\n 'sendRawTransaction',\n )({\n serializedTransaction,\n })\n }\n\n if (account?.type === 'smart')\n throw new AccountTypeNotSupportedError({\n metaMessages: [\n 'Consider using the `sendUserOperation` Action instead.',\n ],\n docsPath: '/docs/actions/bundler/sendUserOperation',\n type: 'smart',\n })\n\n throw new AccountTypeNotSupportedError({\n docsPath: '/docs/actions/wallet/sendTransaction',\n type: (account as any)?.type,\n })\n } catch (err) {\n if (err instanceof AccountTypeNotSupportedError) throw err\n throw getTransactionError(err as BaseError, {\n ...parameters,\n account,\n chain: parameters.chain || undefined,\n })\n }\n}\n","import type { Abi, Address } from 'abitype'\n\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n AccountNotFoundError,\n type AccountNotFoundErrorType,\n} from '../../errors/account.js'\nimport type { BaseError } from '../../errors/base.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { GetAccountParameter } from '../../types/account.js'\nimport type {\n Chain,\n DeriveChain,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n ContractFunctionParameters,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { Prettify, UnionEvaluate, UnionOmit } from '../../types/utils.js'\nimport {\n type EncodeFunctionDataErrorType,\n type EncodeFunctionDataParameters,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetContractErrorReturnType,\n getContractError,\n} from '../../utils/errors/getContractError.js'\nimport type { FormattedTransactionRequest } from '../../utils/formatters/transactionRequest.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { GetMutabilityAwareValue } from '../public/simulateContract.js'\nimport {\n type SendTransactionErrorType,\n type SendTransactionReturnType,\n sendTransaction,\n} from './sendTransaction.js'\nimport type { sendTransactionSync } from './sendTransactionSync.js'\n\nexport type WriteContractParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends ContractFunctionName<\n abi,\n 'nonpayable' | 'payable'\n > = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n > = ContractFunctionArgs<abi, 'nonpayable' | 'payable', functionName>,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n ///\n allFunctionNames = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n derivedChain extends Chain | undefined = DeriveChain<chain, chainOverride>,\n> = ContractFunctionParameters<\n abi,\n 'nonpayable' | 'payable',\n functionName,\n args,\n false,\n allFunctionNames\n> &\n GetChainParameter<chain, chainOverride> &\n Prettify<\n GetAccountParameter<account, Account | Address, true, true> &\n GetMutabilityAwareValue<\n abi,\n 'nonpayable' | 'payable',\n functionName,\n FormattedTransactionRequest<derivedChain>['value'],\n args\n > & {\n /** Data to append to the end of the calldata. Useful for adding a [\"domain\" tag](https://opensea.notion.site/opensea/Seaport-Order-Attributions-ec2d69bf455041a5baa490941aad307f). */\n dataSuffix?: Hex | undefined\n }\n > &\n UnionEvaluate<\n UnionOmit<\n FormattedTransactionRequest<derivedChain>,\n 'data' | 'from' | 'to' | 'value'\n >\n >\n\nexport type WriteContractReturnType = SendTransactionReturnType\n\nexport type WriteContractErrorType =\n | EncodeFunctionDataErrorType\n | AccountNotFoundErrorType\n | ParseAccountErrorType\n | GetContractErrorReturnType<SendTransactionErrorType>\n | ErrorType\n\n/**\n * Executes a write function on a contract.\n *\n * - Docs: https://viem.sh/docs/contract/writeContract\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/contracts_writing-to-contracts\n *\n * A \"write\" function on a Solidity contract modifies the state of the blockchain. These types of functions require gas to be executed, and hence a [Transaction](https://viem.sh/docs/glossary/terms) is needed to be broadcast in order to change the state.\n *\n * Internally, uses a [Wallet Client](https://viem.sh/docs/clients/wallet) to call the [`sendTransaction` action](https://viem.sh/docs/actions/wallet/sendTransaction) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * __Warning: The `write` internally sends a transaction – it does not validate if the contract write will succeed (the contract may throw an error). It is highly recommended to [simulate the contract write with `contract.simulate`](https://viem.sh/docs/contract/writeContract#usage) before you execute it.__\n *\n * @param client - Client to use\n * @param parameters - {@link WriteContractParameters}\n * @returns A [Transaction Hash](https://viem.sh/docs/glossary/terms#hash). {@link WriteContractReturnType}\n *\n * @example\n * import { createWalletClient, custom, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { writeContract } from 'viem/contract'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const hash = await writeContract(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function mint(uint32 tokenId) nonpayable']),\n * functionName: 'mint',\n * args: [69420],\n * })\n *\n * @example\n * // With Validation\n * import { createWalletClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { simulateContract, writeContract } from 'viem/contract'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const { request } = await simulateContract(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function mint(uint32 tokenId) nonpayable']),\n * functionName: 'mint',\n * args: [69420],\n * }\n * const hash = await writeContract(client, request)\n */\nexport async function writeContract<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n >,\n chainOverride extends Chain | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: WriteContractParameters<\n abi,\n functionName,\n args,\n chain,\n account,\n chainOverride\n >,\n): Promise<WriteContractReturnType> {\n return writeContract.internal(\n client,\n sendTransaction,\n 'sendTransaction',\n parameters,\n ) as never\n}\n\nexport namespace writeContract {\n export async function internal<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n >,\n chainOverride extends Chain | undefined,\n >(\n client: Client<Transport, chain, account>,\n actionFn: typeof sendTransaction | typeof sendTransactionSync,\n name: 'sendTransaction' | 'sendTransactionSync',\n parameters: WriteContractParameters<\n abi,\n functionName,\n args,\n chain,\n account,\n chainOverride\n >,\n ) {\n const {\n abi,\n account: account_ = client.account,\n address,\n args,\n functionName,\n ...request\n } = parameters as WriteContractParameters\n\n if (typeof account_ === 'undefined')\n throw new AccountNotFoundError({\n docsPath: '/docs/contract/writeContract',\n })\n const account = account_ ? parseAccount(account_) : null\n\n const data = encodeFunctionData({\n abi,\n args,\n functionName,\n } as EncodeFunctionDataParameters)\n\n try {\n return await getAction(\n client,\n actionFn as never,\n name,\n )({\n data,\n to: address,\n account,\n ...request,\n })\n } catch (error) {\n throw getContractError(error as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/writeContract',\n functionName,\n sender: account?.address,\n })\n }\n }\n}\n","import type { GetCallsStatusReturnType } from '../actions/wallet/getCallsStatus.js'\nimport { BaseError } from './base.js'\n\nexport type BundleFailedErrorType = BundleFailedError & {\n name: 'BundleFailedError'\n}\nexport class BundleFailedError extends BaseError {\n result: GetCallsStatusReturnType\n\n constructor(result: GetCallsStatusReturnType) {\n super(`Call bundle failed with status: ${result.statusCode}`, {\n name: 'BundleFailedError',\n })\n\n this.result = result\n }\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport { wait } from '../wait.js'\n\nexport type WithRetryParameters = {\n // The delay (in ms) between retries.\n delay?:\n | ((config: { count: number; error: Error }) => number)\n | number\n | undefined\n // The max number of times to retry.\n retryCount?: number | undefined\n // Whether or not to retry when an error is thrown.\n shouldRetry?:\n | (({\n count,\n error,\n }: {\n count: number\n error: Error\n }) => Promise<boolean> | boolean)\n | undefined\n}\n\nexport type WithRetryErrorType = ErrorType\n\nexport function withRetry<data>(\n fn: () => Promise<data>,\n {\n delay: delay_ = 100,\n retryCount = 2,\n shouldRetry = () => true,\n }: WithRetryParameters = {},\n) {\n return new Promise<data>((resolve, reject) => {\n const attemptRetry = async ({ count = 0 } = {}) => {\n const retry = async ({ error }: { error: Error }) => {\n const delay =\n typeof delay_ === 'function' ? delay_({ count, error }) : delay_\n if (delay) await wait(delay)\n attemptRetry({ count: count + 1 })\n }\n\n try {\n const data = await fn()\n resolve(data)\n } catch (err) {\n if (\n count < retryCount &&\n (await shouldRetry({ count, error: err as Error }))\n )\n return retry({ error: err as Error })\n reject(err)\n }\n }\n attemptRetry()\n })\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type {\n Chain,\n ExtractChainFormatterReturnType,\n} from '../../types/chain.js'\nimport type { RpcTransactionReceipt } from '../../types/rpc.js'\nimport type { TransactionReceipt } from '../../types/transaction.js'\nimport type { ExactPartial } from '../../types/utils.js'\nimport { hexToNumber } from '../encoding/fromHex.js'\n\nimport { type DefineFormatterErrorType, defineFormatter } from './formatter.js'\nimport { formatLog } from './log.js'\nimport { transactionType } from './transaction.js'\n\nexport type FormattedTransactionReceipt<\n chain extends Chain | undefined = undefined,\n> = ExtractChainFormatterReturnType<\n chain,\n 'transactionReceipt',\n TransactionReceipt\n>\n\nexport const receiptStatuses = {\n '0x0': 'reverted',\n '0x1': 'success',\n} as const\n\nexport type FormatTransactionReceiptErrorType = ErrorType\n\nexport function formatTransactionReceipt(\n transactionReceipt: ExactPartial<RpcTransactionReceipt>,\n _?: string | undefined,\n) {\n const receipt = {\n ...transactionReceipt,\n blockNumber: transactionReceipt.blockNumber\n ? BigInt(transactionReceipt.blockNumber)\n : null,\n contractAddress: transactionReceipt.contractAddress\n ? transactionReceipt.contractAddress\n : null,\n cumulativeGasUsed: transactionReceipt.cumulativeGasUsed\n ? BigInt(transactionReceipt.cumulativeGasUsed)\n : null,\n effectiveGasPrice: transactionReceipt.effectiveGasPrice\n ? BigInt(transactionReceipt.effectiveGasPrice)\n : null,\n gasUsed: transactionReceipt.gasUsed\n ? BigInt(transactionReceipt.gasUsed)\n : null,\n logs: transactionReceipt.logs\n ? transactionReceipt.logs.map((log) => formatLog(log))\n : null,\n to: transactionReceipt.to ? transactionReceipt.to : null,\n transactionIndex: transactionReceipt.transactionIndex\n ? hexToNumber(transactionReceipt.transactionIndex)\n : null,\n status: transactionReceipt.status\n ? receiptStatuses[transactionReceipt.status]\n : null,\n type: transactionReceipt.type\n ? transactionType[\n transactionReceipt.type as keyof typeof transactionType\n ] || transactionReceipt.type\n : null,\n } as TransactionReceipt\n\n if (transactionReceipt.blobGasPrice)\n receipt.blobGasPrice = BigInt(transactionReceipt.blobGasPrice)\n if (transactionReceipt.blobGasUsed)\n receipt.blobGasUsed = BigInt(transactionReceipt.blobGasUsed)\n\n return receipt\n}\n\nexport type DefineTransactionReceiptErrorType =\n | DefineFormatterErrorType\n | ErrorType\n\nexport const defineTransactionReceipt = /*#__PURE__*/ defineFormatter(\n 'transactionReceipt',\n formatTransactionReceipt,\n)\n","import type { Address, Narrow } from 'abitype'\nimport { parseAccount } from '../../accounts/utils/parseAccount.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { BaseError } from '../../errors/base.js'\nimport {\n AtomicityNotSupportedError,\n UnsupportedNonOptionalCapabilityError,\n} from '../../errors/rpc.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account, GetAccountParameter } from '../../types/account.js'\nimport type { Call, Calls } from '../../types/calls.js'\nimport type { ExtractCapabilities } from '../../types/capabilities.js'\nimport type { Chain, DeriveChain } from '../../types/chain.js'\nimport type { WalletSendCallsParameters } from '../../types/eip1193.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport { encodeFunctionData } from '../../utils/abi/encodeFunctionData.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport { concat } from '../../utils/data/concat.js'\nimport { hexToBigInt } from '../../utils/encoding/fromHex.js'\nimport { numberToHex } from '../../utils/encoding/toHex.js'\nimport { getTransactionError } from '../../utils/errors/getTransactionError.js'\nimport { sendTransaction } from './sendTransaction.js'\n\nexport const fallbackMagicIdentifier =\n '0x5792579257925792579257925792579257925792579257925792579257925792'\nexport const fallbackTransactionErrorMagicIdentifier = numberToHex(0, {\n size: 32,\n})\n\nexport type SendCallsParameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n calls extends readonly unknown[] = readonly unknown[],\n //\n _chain extends Chain | undefined = DeriveChain<chain, chainOverride>,\n> = {\n chain?: chainOverride | Chain | undefined\n calls: Calls<Narrow<calls>>\n capabilities?: ExtractCapabilities<'sendCalls', 'Request'> | undefined\n experimental_fallback?: boolean | undefined\n experimental_fallbackDelay?: number | undefined\n forceAtomic?: boolean | undefined\n id?: string | undefined\n version?: WalletSendCallsParameters[number]['version'] | undefined\n} & GetAccountParameter<account, Account | Address, false, true>\n\nexport type SendCallsReturnType = Prettify<{\n capabilities?: ExtractCapabilities<'sendCalls', 'ReturnType'> | undefined\n id: string\n}>\n\nexport type SendCallsErrorType = RequestErrorType | ErrorType\n\n/**\n * Requests the connected wallet to send a batch of calls.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendCalls\n * - JSON-RPC Methods: [`wallet_sendCalls`](https://eips.ethereum.org/EIPS/eip-5792)\n *\n * @param client - Client to use\n * @returns Transaction identifier. {@link SendCallsReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendCalls } from 'viem/actions'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const id = await sendCalls(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * calls: [\n * {\n * data: '0xdeadbeef',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * },\n * {\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: 69420n,\n * },\n * ],\n * })\n */\nexport async function sendCalls<\n const calls extends readonly unknown[],\n chain extends Chain | undefined,\n account extends Account | undefined = undefined,\n chainOverride extends Chain | undefined = undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: SendCallsParameters<chain, account, chainOverride, calls>,\n): Promise<SendCallsReturnType> {\n const {\n account: account_ = client.account,\n chain = client.chain,\n experimental_fallback,\n experimental_fallbackDelay = 32,\n forceAtomic = false,\n id,\n version = '2.0.0',\n } = parameters\n\n const account = account_ ? parseAccount(account_) : null\n\n let capabilities = parameters.capabilities\n\n if (client.dataSuffix && !parameters.capabilities?.dataSuffix) {\n if (typeof client.dataSuffix === 'string')\n capabilities = {\n ...parameters.capabilities,\n dataSuffix: { value: client.dataSuffix, optional: true },\n }\n else\n capabilities = {\n ...parameters.capabilities,\n dataSuffix: {\n value: client.dataSuffix.value,\n ...(client.dataSuffix.required ? {} : { optional: true }),\n },\n }\n }\n\n const calls = parameters.calls.map((call_: unknown) => {\n const call = call_ as Call\n\n const data = call.abi\n ? encodeFunctionData({\n abi: call.abi,\n functionName: call.functionName,\n args: call.args,\n })\n : call.data\n\n return {\n data: call.dataSuffix && data ? concat([data, call.dataSuffix]) : data,\n to: call.to,\n value: call.value ? numberToHex(call.value) : undefined,\n }\n })\n\n try {\n const response = await client.request(\n {\n method: 'wallet_sendCalls',\n params: [\n {\n atomicRequired: forceAtomic,\n calls,\n capabilities,\n chainId: numberToHex(chain!.id),\n from: account?.address,\n id,\n version,\n },\n ],\n },\n { retryCount: 0 },\n )\n if (typeof response === 'string') return { id: response }\n return response as never\n } catch (err) {\n const error = err as BaseError\n\n // If the transport does not support EIP-5792, fall back to\n // `eth_sendTransaction`.\n if (\n experimental_fallback &&\n (error.name === 'MethodNotFoundRpcError' ||\n error.name === 'MethodNotSupportedRpcError' ||\n error.name === 'UnknownRpcError' ||\n error.details\n .toLowerCase()\n .includes('does not exist / is not available') ||\n error.details.toLowerCase().includes('missing or invalid. request()') ||\n error.details\n .toLowerCase()\n .includes('did not match any variant of untagged enum') ||\n error.details\n .toLowerCase()\n .includes('account upgraded to unsupported contract') ||\n error.details.toLowerCase().includes('eip-7702 not supported') ||\n error.details.toLowerCase().includes('unsupported wc_ method') ||\n // magic.link\n error.details\n .toLowerCase()\n .includes('feature toggled misconfigured') ||\n // Trust Wallet\n error.details\n .toLowerCase()\n .includes(\n 'jsonrpcengine: response has no error or result for request',\n ))\n ) {\n if (capabilities) {\n const hasNonOptionalCapability = Object.values(capabilities).some(\n (capability) => !capability.optional,\n )\n if (hasNonOptionalCapability) {\n const message =\n 'non-optional `capabilities` are not supported on fallback to `eth_sendTransaction`.'\n throw new UnsupportedNonOptionalCapabilityError(\n new BaseError(message, {\n details: message,\n }),\n )\n }\n }\n if (forceAtomic && calls.length > 1) {\n const message =\n '`forceAtomic` is not supported on fallback to `eth_sendTransaction`.'\n throw new AtomicityNotSupportedError(\n new BaseError(message, {\n details: message,\n }),\n )\n }\n\n const promises: Promise<Hex>[] = []\n for (const call of calls) {\n const promise = sendTransaction(client, {\n account,\n chain,\n data: call.data,\n to: call.to,\n value: call.value ? hexToBigInt(call.value) : undefined,\n })\n promises.push(promise)\n\n // Note: some browser wallets require a small delay between transactions\n // to prevent duplicate JSON-RPC requests.\n if (experimental_fallbackDelay > 0)\n await new Promise((resolve) =>\n setTimeout(resolve, experimental_fallbackDelay),\n )\n }\n\n const results = await Promise.allSettled(promises)\n if (results.every((r) => r.status === 'rejected')) throw results[0].reason\n\n const hashes = results.map((result) => {\n if (result.status === 'fulfilled') return result.value\n return fallbackTransactionErrorMagicIdentifier\n })\n return {\n id: concat([\n ...hashes,\n numberToHex(chain!.id, { size: 32 }),\n fallbackMagicIdentifier,\n ]),\n }\n }\n\n throw getTransactionError(err as BaseError, {\n ...parameters,\n account,\n chain: parameters.chain!,\n })\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { ExtractCapabilities } from '../../types/capabilities.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { WalletGetCallsStatusReturnType } from '../../types/eip1193.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RpcTransactionReceipt } from '../../types/rpc.js'\nimport type { Prettify } from '../../types/utils.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport { sliceHex } from '../../utils/data/slice.js'\nimport { trim } from '../../utils/data/trim.js'\nimport { hexToBigInt, hexToNumber } from '../../utils/encoding/fromHex.js'\nimport { receiptStatuses } from '../../utils/formatters/transactionReceipt.js'\nimport {\n fallbackMagicIdentifier,\n fallbackTransactionErrorMagicIdentifier,\n} from './sendCalls.js'\n\nexport type GetCallsStatusParameters = { id: string }\n\nexport type GetCallsStatusReturnType = Prettify<\n Omit<\n WalletGetCallsStatusReturnType<\n ExtractCapabilities<'getCallsStatus', 'ReturnType'>,\n number,\n bigint,\n 'success' | 'reverted'\n >,\n 'status'\n > & {\n statusCode: number\n status: 'pending' | 'success' | 'failure' | undefined\n }\n>\n\nexport type GetCallsStatusErrorType = RequestErrorType | ErrorType\n\n/**\n * Returns the status of a call batch that was sent via `sendCalls`.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/getCallsStatus\n * - JSON-RPC Methods: [`wallet_getCallsStatus`](https://eips.ethereum.org/EIPS/eip-5792)\n *\n * @param client - Client to use\n * @returns Status of the calls. {@link GetCallsStatusReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getCallsStatus } from 'viem/actions'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const { receipts, status } = await getCallsStatus(client, { id: '0xdeadbeef' })\n */\nexport async function getCallsStatus<\n chain extends Chain | undefined,\n account extends Account | undefined = undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: GetCallsStatusParameters,\n): Promise<GetCallsStatusReturnType> {\n async function getStatus(id: Hex) {\n const isTransactions = id.endsWith(fallbackMagicIdentifier.slice(2))\n if (isTransactions) {\n const chainId = trim(sliceHex(id, -64, -32))\n const hashes = sliceHex(id, 0, -64)\n .slice(2)\n .match(/.{1,64}/g)\n\n const receipts = await Promise.all(\n hashes!.map((hash) =>\n fallbackTransactionErrorMagicIdentifier.slice(2) !== hash\n ? client.request(\n {\n method: 'eth_getTransactionReceipt',\n params: [`0x${hash}`],\n },\n { dedupe: true },\n )\n : undefined,\n ),\n )\n\n const status = (() => {\n if (receipts.some((r) => r === null)) return 100 // pending\n if (receipts.every((r) => r?.status === '0x1')) return 200 // success\n if (receipts.every((r) => r?.status === '0x0')) return 500 // complete failure\n return 600 // partial failure\n })()\n\n return {\n atomic: false,\n chainId: hexToNumber(chainId),\n receipts: receipts.filter(Boolean) as RpcTransactionReceipt[],\n status,\n version: '2.0.0',\n }\n }\n return client.request({\n method: 'wallet_getCallsStatus',\n params: [id],\n })\n }\n\n const {\n atomic = false,\n chainId,\n receipts,\n version = '2.0.0',\n ...response\n } = await getStatus(parameters.id as Hex)\n const [status, statusCode] = (() => {\n const statusCode = response.status\n if (statusCode >= 100 && statusCode < 200)\n return ['pending', statusCode] as const\n if (statusCode >= 200 && statusCode < 300)\n return ['success', statusCode] as const\n if (statusCode >= 300 && statusCode < 700)\n return ['failure', statusCode] as const\n // @ts-expect-error: for backwards compatibility\n if (statusCode === 'CONFIRMED') return ['success', 200] as const\n // @ts-expect-error: for backwards compatibility\n if (statusCode === 'PENDING') return ['pending', 100] as const\n return [undefined, statusCode]\n })()\n return {\n ...response,\n atomic,\n // @ts-expect-error: for backwards compatibility\n chainId: chainId ? hexToNumber(chainId) : undefined,\n receipts:\n receipts?.map((receipt) => ({\n ...receipt,\n blockNumber: hexToBigInt(receipt.blockNumber),\n gasUsed: hexToBigInt(receipt.gasUsed),\n status: receiptStatuses[receipt.status as '0x0' | '0x1'],\n })) ?? [],\n statusCode,\n status,\n version,\n }\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { BaseError } from '../../errors/base.js'\nimport { BundleFailedError } from '../../errors/calls.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type ObserveErrorType, observe } from '../../utils/observe.js'\nimport { type PollErrorType, poll } from '../../utils/poll.js'\nimport { withResolvers } from '../../utils/promise/withResolvers.js'\nimport {\n type WithRetryParameters,\n withRetry,\n} from '../../utils/promise/withRetry.js'\nimport { stringify } from '../../utils/stringify.js'\nimport {\n type GetCallsStatusErrorType,\n type GetCallsStatusReturnType,\n getCallsStatus,\n} from './getCallsStatus.js'\n\nexport type WaitForCallsStatusParameters = {\n /**\n * The id of the call batch to wait for.\n */\n id: string\n /**\n * Polling frequency (in ms). Defaults to the client's pollingInterval config.\n *\n * @default client.pollingInterval\n */\n pollingInterval?: number | undefined\n /**\n * Number of times to retry if the call bundle failed.\n * @default 4 (exponential backoff)\n */\n retryCount?: WithRetryParameters['retryCount'] | undefined\n /**\n * Time to wait (in ms) between retries.\n * @default `({ count }) => ~~(1 << count) * 200` (exponential backoff)\n */\n retryDelay?: WithRetryParameters['delay'] | undefined\n /**\n * The status range to wait for.\n *\n * @default (status) => status >= 200\n */\n status?: ((parameters: GetCallsStatusReturnType) => boolean) | undefined\n /**\n * Whether to throw an error if the call bundle fails.\n *\n * @default false\n */\n throwOnFailure?: boolean | undefined\n /**\n * Optional timeout (in milliseconds) to wait before stopping polling.\n *\n * @default 60_000\n */\n timeout?: number | undefined\n}\n\nexport type WaitForCallsStatusReturnType = GetCallsStatusReturnType\n\nexport type WaitForCallsStatusErrorType =\n | ObserveErrorType\n | PollErrorType\n | GetCallsStatusErrorType\n | WaitForCallsStatusTimeoutError\n | ErrorType\n\n/**\n * Waits for the status & receipts of a call bundle that was sent via `sendCalls`.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/waitForCallsStatus\n * - JSON-RPC Methods: [`wallet_getCallsStatus`](https://eips.ethereum.org/EIPS/eip-5792)\n *\n * @param client - Client to use\n * @param parameters - {@link WaitForCallsStatusParameters}\n * @returns Status & receipts of the call bundle. {@link WaitForCallsStatusReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { waitForCallsStatus } from 'viem/actions'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n *\n * const { receipts, status } = await waitForCallsStatus(client, { id: '0xdeadbeef' })\n */\nexport async function waitForCallsStatus<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: WaitForCallsStatusParameters,\n): Promise<WaitForCallsStatusReturnType> {\n const {\n id,\n pollingInterval = client.pollingInterval,\n status = ({ statusCode }) => statusCode === 200 || statusCode >= 300,\n retryCount = 4,\n retryDelay = ({ count }) => ~~(1 << count) * 200, // exponential backoff\n timeout = 60_000,\n throwOnFailure = false,\n } = parameters\n const observerId = stringify(['waitForCallsStatus', client.uid, id])\n\n const { promise, resolve, reject } =\n withResolvers<WaitForCallsStatusReturnType>()\n\n let timer: Timer | undefined\n\n const unobserve = observe(observerId, { resolve, reject }, (emit) => {\n const unpoll = poll(\n async () => {\n const done = (fn: () => void) => {\n clearTimeout(timer)\n unpoll()\n fn()\n unobserve()\n }\n\n try {\n const result = await withRetry(\n async () => {\n const result = await getAction(\n client,\n getCallsStatus,\n 'getCallsStatus',\n )({ id })\n if (throwOnFailure && result.status === 'failure')\n throw new BundleFailedError(result)\n return result\n },\n {\n retryCount,\n delay: retryDelay,\n },\n )\n if (!status(result)) return\n done(() => emit.resolve(result))\n } catch (error) {\n done(() => emit.reject(error))\n }\n },\n {\n interval: pollingInterval,\n emitOnBegin: true,\n },\n )\n\n return unpoll\n })\n\n timer = timeout\n ? setTimeout(() => {\n unobserve()\n clearTimeout(timer)\n reject(new WaitForCallsStatusTimeoutError({ id }))\n }, timeout)\n : undefined\n\n return await promise\n}\n\nexport type WaitForCallsStatusTimeoutErrorType =\n WaitForCallsStatusTimeoutError & {\n name: 'WaitForCallsStatusTimeoutError'\n }\nexport class WaitForCallsStatusTimeoutError extends BaseError {\n constructor({ id }: { id: string }) {\n super(\n `Timed out while waiting for call bundle with id \"${id}\" to be confirmed.`,\n { name: 'WaitForCallsStatusTimeoutError' },\n )\n }\n}\n","const size = 256\nlet index = size\nlet buffer: string\n\nexport function uid(length = 11) {\n if (!buffer || index + length > size * 2) {\n buffer = ''\n index = 0\n for (let i = 0; i < size; i++) {\n buffer += ((256 + Math.random() * 256) | 0).toString(16).substring(1)\n }\n }\n return buffer.substring(index, index++ + length)\n}\n","import type { Address } from 'abitype'\n\nimport type { JsonRpcAccount } from '../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../accounts/utils/parseAccount.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { Account } from '../types/account.js'\nimport type { BlockTag } from '../types/block.js'\nimport type { Chain } from '../types/chain.js'\nimport type { DataSuffix } from '../types/dataSuffix.js'\nimport type {\n EIP1193RequestFn,\n EIP1474Methods,\n RpcSchema,\n} from '../types/eip1193.js'\nimport type { ExactPartial, Prettify } from '../types/utils.js'\nimport type {\n CcipRequestParameters,\n CcipRequestReturnType,\n} from '../utils/ccip.js'\nimport { uid } from '../utils/uid.js'\nimport type { PublicActions } from './decorators/public.js'\nimport type { WalletActions } from './decorators/wallet.js'\nimport type { Transport } from './transports/createTransport.js'\n\nexport type ClientConfig<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n accountOrAddress extends Account | Address | undefined =\n | Account\n | Address\n | undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n> = {\n /** The Account to use for the Client. This will be used for Actions that require an account as an argument. */\n account?: accountOrAddress | Account | Address | undefined\n /** Flags for batch settings. */\n batch?:\n | {\n /** Toggle to enable `eth_call` multicall aggregation. */\n multicall?: boolean | Prettify<MulticallBatchOptions> | undefined\n }\n | undefined\n /**\n * Default block tag to use for RPC requests.\n *\n * If the chain supports a pre-confirmation mechanism\n * (set via `chain.experimental_preconfirmationTime`), defaults to `'pending'`.\n *\n * @default 'latest'\n */\n experimental_blockTag?: BlockTag | undefined\n /**\n * Time (in ms) that cached data will remain in memory.\n * @default chain.blockTime / 3\n */\n cacheTime?: number | undefined\n /**\n * [CCIP Read](https://eips.ethereum.org/EIPS/eip-3668) configuration.\n * If `false`, the client will not support offchain CCIP lookups.\n */\n ccipRead?:\n | {\n /**\n * A function that will be called to make the offchain CCIP lookup request.\n * @see https://eips.ethereum.org/EIPS/eip-3668#client-lookup-protocol\n */\n request?: (\n parameters: CcipRequestParameters,\n ) => Promise<CcipRequestReturnType>\n }\n | false\n | undefined\n /** Chain for the client. */\n chain?: Chain | undefined | chain\n /** Data suffix to append to transaction data. */\n dataSuffix?: DataSuffix | undefined\n /** A key for the client. */\n key?: string | undefined\n /** A name for the client. */\n name?: string | undefined\n /**\n * Frequency (in ms) for polling enabled actions & events.\n * @default chain.blockTime / 3\n */\n pollingInterval?: number | undefined\n /**\n * Typed JSON-RPC schema for the client.\n */\n rpcSchema?: rpcSchema | undefined\n /** The RPC transport */\n transport: transport\n /** The type of client. */\n type?: string | undefined\n}\n\n// Actions that are used internally by other Actions (ie. `call` is used by `readContract`).\n// They are allowed to be extended, but must conform to their parameter & return type interfaces.\n// Example: an extended `call` action must accept `CallParameters` as parameters,\n// and conform to the `CallReturnType` return type.\ntype ExtendableProtectedActions<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n> = Pick<\n PublicActions<transport, chain, account>,\n | 'call'\n | 'createContractEventFilter'\n | 'createEventFilter'\n | 'estimateContractGas'\n | 'estimateGas'\n | 'getBlock'\n | 'getBlockNumber'\n | 'getChainId'\n | 'getContractEvents'\n | 'getEnsText'\n | 'getFilterChanges'\n | 'getGasPrice'\n | 'getLogs'\n | 'getTransaction'\n | 'getTransactionCount'\n | 'getTransactionReceipt'\n | 'prepareTransactionRequest'\n | 'readContract'\n | 'sendRawTransaction'\n | 'simulateContract'\n | 'uninstallFilter'\n | 'watchBlockNumber'\n | 'watchContractEvent'\n> &\n Pick<WalletActions<chain, account>, 'sendTransaction' | 'writeContract'>\n\n// TODO: Move `transport` to slot index 2 since `chain` and `account` used more frequently.\n// Otherwise, we end up with a lot of `Client<Transport, chain, account>` in actions.\nexport type Client<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n extended extends Extended | undefined = Extended | undefined,\n> = Client_Base<transport, chain, account, rpcSchema> &\n (extended extends Extended ? extended : unknown) & {\n extend: <\n const client extends Extended &\n ExactPartial<ExtendableProtectedActions<transport, chain, account>>,\n >(\n fn: (\n client: Client<transport, chain, account, rpcSchema, extended>,\n ) => client,\n ) => Client<\n transport,\n chain,\n account,\n rpcSchema,\n Prettify<client> & (extended extends Extended ? extended : unknown)\n >\n }\n\ntype Client_Base<\n transport extends Transport = Transport,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n> = {\n /** The Account of the Client. */\n account: account\n /** Flags for batch settings. */\n batch?: ClientConfig['batch'] | undefined\n /** Time (in ms) that cached data will remain in memory. */\n cacheTime: number\n /** [CCIP Read](https://eips.ethereum.org/EIPS/eip-3668) configuration. */\n ccipRead?: ClientConfig['ccipRead'] | undefined\n /** Chain for the client. */\n chain: chain\n /** Data suffix to append to transaction data. */\n dataSuffix?: DataSuffix | undefined\n /** Default block tag to use for RPC requests. */\n experimental_blockTag?: BlockTag | undefined\n /** A key for the client. */\n key: string\n /** A name for the client. */\n name: string\n /** Frequency (in ms) for polling enabled actions & events. Defaults to 4_000 milliseconds. */\n pollingInterval: number\n /** Request function wrapped with friendly error handling */\n request: EIP1193RequestFn<\n rpcSchema extends undefined ? EIP1474Methods : rpcSchema\n >\n /** The RPC transport */\n transport: ReturnType<transport>['config'] & ReturnType<transport>['value']\n /** The type of client. */\n type: string\n /** A unique ID for the client. */\n uid: string\n}\n\ntype Extended = Prettify<\n // disallow redefining base properties\n { [_ in keyof Client_Base]?: undefined } & {\n [key: string]: unknown\n }\n>\n\nexport type MulticallBatchOptions = {\n /** The maximum size (in bytes) for each calldata chunk. @default 1_024 */\n batchSize?: number | undefined\n /** Enable deployless multicall. */\n deployless?: boolean | undefined\n /** The maximum number of milliseconds to wait before sending a batch. @default 0 */\n wait?: number | undefined\n}\n\nexport type CreateClientErrorType = ParseAccountErrorType | ErrorType\n\nexport function createClient<\n transport extends Transport,\n chain extends Chain | undefined = undefined,\n accountOrAddress extends Account | Address | undefined = undefined,\n rpcSchema extends RpcSchema | undefined = undefined,\n>(\n parameters: ClientConfig<transport, chain, accountOrAddress, rpcSchema>,\n): Prettify<\n Client<\n transport,\n chain,\n accountOrAddress extends Address\n ? Prettify<JsonRpcAccount<accountOrAddress>>\n : accountOrAddress,\n rpcSchema\n >\n>\n\nexport function createClient(parameters: ClientConfig): Client {\n const {\n batch,\n chain,\n ccipRead,\n dataSuffix,\n key = 'base',\n name = 'Base Client',\n type = 'base',\n } = parameters\n\n const experimental_blockTag =\n parameters.experimental_blockTag ??\n (typeof chain?.experimental_preconfirmationTime === 'number'\n ? 'pending'\n : undefined)\n const blockTime = chain?.blockTime ?? 12_000\n\n const defaultPollingInterval = Math.min(\n Math.max(Math.floor(blockTime / 2), 500),\n 4_000,\n )\n const pollingInterval = parameters.pollingInterval ?? defaultPollingInterval\n const cacheTime = parameters.cacheTime ?? pollingInterval\n\n const account = parameters.account\n ? parseAccount(parameters.account)\n : undefined\n const { config, request, value } = parameters.transport({\n account,\n chain,\n pollingInterval,\n })\n const transport = { ...config, ...value }\n\n const client = {\n account,\n batch,\n cacheTime,\n ccipRead,\n chain,\n dataSuffix,\n key,\n name,\n pollingInterval,\n request,\n transport,\n type,\n uid: uid(),\n ...(experimental_blockTag ? { experimental_blockTag } : {}),\n }\n\n function extend(base: typeof client) {\n type ExtendFn = (base: typeof client) => unknown\n return (extendFn: ExtendFn) => {\n const extended = extendFn(base) as Extended\n for (const key in client) delete extended[key]\n const combined = { ...base, ...extended }\n return Object.assign(combined, { extend: extend(combined as any) })\n }\n }\n\n return Object.assign(client, { extend: extend(client) as any })\n}\n\n/**\n * Defines a typed JSON-RPC schema for the client.\n * Note: This is a runtime noop function.\n */\nexport function rpcSchema<rpcSchema extends RpcSchema>(): rpcSchema {\n return null as any\n}\n","import type { Address } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\n\nexport type GetCodeParameters = {\n address: Address\n} & (\n | {\n blockNumber?: undefined\n blockTag?: BlockTag | undefined\n }\n | {\n blockNumber?: bigint | undefined\n blockTag?: undefined\n }\n)\n\nexport type GetCodeReturnType = Hex | undefined\n\nexport type GetCodeErrorType =\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Retrieves the bytecode at an address.\n *\n * - Docs: https://viem.sh/docs/contract/getCode\n * - JSON-RPC Methods: [`eth_getCode`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getcode)\n *\n * @param client - Client to use\n * @param parameters - {@link GetCodeParameters}\n * @returns The contract's bytecode. {@link GetCodeReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getCode } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const code = await getCode(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * })\n */\nexport async function getCode<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n { address, blockNumber, blockTag = 'latest' }: GetCodeParameters,\n): Promise<GetCodeReturnType> {\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n const hex = await client.request(\n {\n method: 'eth_getCode',\n params: [address, blockNumberHex || blockTag],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n if (hex === '0x') return undefined\n return hex\n}\n","import { versionedHashVersionKzg } from '../../constants/kzg.js'\nimport { maxUint256 } from '../../constants/number.js'\nimport {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport { BaseError, type BaseErrorType } from '../../errors/base.js'\nimport {\n EmptyBlobError,\n type EmptyBlobErrorType,\n InvalidVersionedHashSizeError,\n type InvalidVersionedHashSizeErrorType,\n InvalidVersionedHashVersionError,\n type InvalidVersionedHashVersionErrorType,\n} from '../../errors/blob.js'\nimport {\n InvalidChainIdError,\n type InvalidChainIdErrorType,\n} from '../../errors/chain.js'\nimport {\n FeeCapTooHighError,\n type FeeCapTooHighErrorType,\n TipAboveFeeCapError,\n type TipAboveFeeCapErrorType,\n} from '../../errors/node.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n TransactionSerializableEIP1559,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableLegacy,\n} from '../../types/transaction.js'\nimport { type IsAddressErrorType, isAddress } from '../address/isAddress.js'\nimport { size } from '../data/size.js'\nimport { slice } from '../data/slice.js'\nimport { hexToNumber } from '../encoding/fromHex.js'\n\nexport type AssertTransactionEIP7702ErrorType =\n | AssertTransactionEIP1559ErrorType\n | InvalidAddressErrorType\n | InvalidChainIdErrorType\n | ErrorType\n\nexport function assertTransactionEIP7702(\n transaction: TransactionSerializableEIP7702,\n) {\n const { authorizationList } = transaction\n if (authorizationList) {\n for (const authorization of authorizationList) {\n const { chainId } = authorization\n const address = authorization.address\n if (!isAddress(address)) throw new InvalidAddressError({ address })\n if (chainId < 0) throw new InvalidChainIdError({ chainId })\n }\n }\n assertTransactionEIP1559(transaction as {} as TransactionSerializableEIP1559)\n}\n\nexport type AssertTransactionEIP4844ErrorType =\n | AssertTransactionEIP1559ErrorType\n | EmptyBlobErrorType\n | InvalidVersionedHashSizeErrorType\n | InvalidVersionedHashVersionErrorType\n | ErrorType\n\nexport function assertTransactionEIP4844(\n transaction: TransactionSerializableEIP4844,\n) {\n const { blobVersionedHashes } = transaction\n if (blobVersionedHashes) {\n if (blobVersionedHashes.length === 0) throw new EmptyBlobError()\n for (const hash of blobVersionedHashes) {\n const size_ = size(hash)\n const version = hexToNumber(slice(hash, 0, 1))\n if (size_ !== 32)\n throw new InvalidVersionedHashSizeError({ hash, size: size_ })\n if (version !== versionedHashVersionKzg)\n throw new InvalidVersionedHashVersionError({\n hash,\n version,\n })\n }\n }\n assertTransactionEIP1559(transaction as {} as TransactionSerializableEIP1559)\n}\n\nexport type AssertTransactionEIP1559ErrorType =\n | BaseErrorType\n | IsAddressErrorType\n | InvalidAddressErrorType\n | InvalidChainIdErrorType\n | FeeCapTooHighErrorType\n | TipAboveFeeCapErrorType\n | ErrorType\n\nexport function assertTransactionEIP1559(\n transaction: TransactionSerializableEIP1559,\n) {\n const { chainId, maxPriorityFeePerGas, maxFeePerGas, to } = transaction\n if (chainId <= 0) throw new InvalidChainIdError({ chainId })\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n if (maxFeePerGas && maxFeePerGas > maxUint256)\n throw new FeeCapTooHighError({ maxFeePerGas })\n if (\n maxPriorityFeePerGas &&\n maxFeePerGas &&\n maxPriorityFeePerGas > maxFeePerGas\n )\n throw new TipAboveFeeCapError({ maxFeePerGas, maxPriorityFeePerGas })\n}\n\nexport type AssertTransactionEIP2930ErrorType =\n | BaseErrorType\n | IsAddressErrorType\n | InvalidAddressErrorType\n | InvalidChainIdErrorType\n | FeeCapTooHighErrorType\n | ErrorType\n\nexport function assertTransactionEIP2930(\n transaction: TransactionSerializableEIP2930,\n) {\n const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } =\n transaction\n if (chainId <= 0) throw new InvalidChainIdError({ chainId })\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n if (maxPriorityFeePerGas || maxFeePerGas)\n throw new BaseError(\n '`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid EIP-2930 Transaction attribute.',\n )\n if (gasPrice && gasPrice > maxUint256)\n throw new FeeCapTooHighError({ maxFeePerGas: gasPrice })\n}\n\nexport type AssertTransactionLegacyErrorType =\n | BaseErrorType\n | IsAddressErrorType\n | InvalidAddressErrorType\n | InvalidChainIdErrorType\n | FeeCapTooHighErrorType\n | ErrorType\n\nexport function assertTransactionLegacy(\n transaction: TransactionSerializableLegacy,\n) {\n const { chainId, maxPriorityFeePerGas, gasPrice, maxFeePerGas, to } =\n transaction\n if (to && !isAddress(to)) throw new InvalidAddressError({ address: to })\n if (typeof chainId !== 'undefined' && chainId <= 0)\n throw new InvalidChainIdError({ chainId })\n if (maxPriorityFeePerGas || maxFeePerGas)\n throw new BaseError(\n '`maxFeePerGas`/`maxPriorityFeePerGas` is not a valid Legacy Transaction attribute.',\n )\n if (gasPrice && gasPrice > maxUint256)\n throw new FeeCapTooHighError({ maxFeePerGas: gasPrice })\n}\n","import {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport {\n InvalidStorageKeySizeError,\n type InvalidStorageKeySizeErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { AccessList } from '../../types/transaction.js'\nimport { type IsAddressErrorType, isAddress } from '../address/isAddress.js'\nimport type { RecursiveArray } from '../encoding/toRlp.js'\n\nexport type SerializeAccessListErrorType =\n | InvalidStorageKeySizeErrorType\n | InvalidAddressErrorType\n | IsAddressErrorType\n | ErrorType\n\n/*\n * Serialize an EIP-2930 access list\n * @remarks\n * Use to create a transaction serializer with support for EIP-2930 access lists\n *\n * @param accessList - Array of objects of address and arrays of Storage Keys\n * @throws InvalidAddressError, InvalidStorageKeySizeError\n * @returns Array of hex strings\n */\nexport function serializeAccessList(\n accessList?: AccessList | undefined,\n): RecursiveArray<Hex> {\n if (!accessList || accessList.length === 0) return []\n\n const serializedAccessList = []\n for (let i = 0; i < accessList.length; i++) {\n const { address, storageKeys } = accessList[i]\n\n for (let j = 0; j < storageKeys.length; j++) {\n if (storageKeys[j].length - 2 !== 64) {\n throw new InvalidStorageKeySizeError({ storageKey: storageKeys[j] })\n }\n }\n\n if (!isAddress(address, { strict: false })) {\n throw new InvalidAddressError({ address })\n }\n\n serializedAccessList.push([address, storageKeys])\n }\n return serializedAccessList\n}\n","import {\n InvalidLegacyVError,\n type InvalidLegacyVErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n ByteArray,\n Hex,\n Signature,\n SignatureLegacy,\n} from '../../types/misc.js'\nimport type {\n TransactionSerializable,\n TransactionSerializableEIP1559,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableGeneric,\n TransactionSerializableLegacy,\n TransactionSerialized,\n TransactionSerializedEIP1559,\n TransactionSerializedEIP2930,\n TransactionSerializedEIP4844,\n TransactionSerializedEIP7702,\n TransactionSerializedLegacy,\n TransactionType,\n} from '../../types/transaction.js'\nimport type { MaybePromise, OneOf } from '../../types/utils.js'\nimport {\n type SerializeAuthorizationListErrorType,\n serializeAuthorizationList,\n} from '../authorization/serializeAuthorizationList.js'\nimport {\n type BlobsToCommitmentsErrorType,\n blobsToCommitments,\n} from '../blob/blobsToCommitments.js'\nimport {\n blobsToProofs,\n type blobsToProofsErrorType,\n} from '../blob/blobsToProofs.js'\nimport {\n type CommitmentsToVersionedHashesErrorType,\n commitmentsToVersionedHashes,\n} from '../blob/commitmentsToVersionedHashes.js'\nimport {\n type ToBlobSidecarsErrorType,\n toBlobSidecars,\n} from '../blob/toBlobSidecars.js'\nimport { type ConcatHexErrorType, concatHex } from '../data/concat.js'\nimport { trim } from '../data/trim.js'\nimport {\n bytesToHex,\n type NumberToHexErrorType,\n numberToHex,\n} from '../encoding/toHex.js'\nimport { type ToRlpErrorType, toRlp } from '../encoding/toRlp.js'\n\nimport {\n type AssertTransactionEIP1559ErrorType,\n type AssertTransactionEIP2930ErrorType,\n type AssertTransactionEIP4844ErrorType,\n type AssertTransactionEIP7702ErrorType,\n type AssertTransactionLegacyErrorType,\n assertTransactionEIP1559,\n assertTransactionEIP2930,\n assertTransactionEIP4844,\n assertTransactionEIP7702,\n assertTransactionLegacy,\n} from './assertTransaction.js'\nimport {\n type GetTransactionType,\n type GetTransactionTypeErrorType,\n getTransactionType,\n} from './getTransactionType.js'\nimport {\n type SerializeAccessListErrorType,\n serializeAccessList,\n} from './serializeAccessList.js'\n\nexport type SerializedTransactionReturnType<\n transaction extends TransactionSerializable = TransactionSerializable,\n ///\n _transactionType extends TransactionType = GetTransactionType<transaction>,\n> = TransactionSerialized<_transactionType>\n\nexport type SerializeTransactionFn<\n transaction extends TransactionSerializableGeneric = TransactionSerializable,\n ///\n _transactionType extends TransactionType = never,\n> = (\n transaction: OneOf<TransactionSerializable | transaction>,\n signature?: Signature | undefined,\n) => MaybePromise<\n SerializedTransactionReturnType<\n OneOf<TransactionSerializable | transaction>,\n _transactionType\n >\n>\n\nexport type SerializeTransactionErrorType =\n | GetTransactionTypeErrorType\n | SerializeTransactionEIP1559ErrorType\n | SerializeTransactionEIP2930ErrorType\n | SerializeTransactionEIP4844ErrorType\n | SerializeTransactionEIP7702ErrorType\n | SerializeTransactionLegacyErrorType\n | ErrorType\n\nexport function serializeTransaction<\n const transaction extends TransactionSerializable,\n ///\n _transactionType extends TransactionType = GetTransactionType<transaction>,\n>(\n transaction: transaction,\n signature?: Signature | undefined,\n): SerializedTransactionReturnType<transaction, _transactionType> {\n const type = getTransactionType(transaction) as GetTransactionType\n\n if (type === 'eip1559')\n return serializeTransactionEIP1559(\n transaction as TransactionSerializableEIP1559,\n signature,\n ) as SerializedTransactionReturnType<transaction>\n\n if (type === 'eip2930')\n return serializeTransactionEIP2930(\n transaction as TransactionSerializableEIP2930,\n signature,\n ) as SerializedTransactionReturnType<transaction>\n\n if (type === 'eip4844')\n return serializeTransactionEIP4844(\n transaction as TransactionSerializableEIP4844,\n signature,\n ) as SerializedTransactionReturnType<transaction>\n\n if (type === 'eip7702')\n return serializeTransactionEIP7702(\n transaction as TransactionSerializableEIP7702,\n signature,\n ) as SerializedTransactionReturnType<transaction>\n\n return serializeTransactionLegacy(\n transaction as TransactionSerializableLegacy,\n signature as SignatureLegacy,\n ) as SerializedTransactionReturnType<transaction>\n}\n\ntype SerializeTransactionEIP7702ErrorType =\n | AssertTransactionEIP7702ErrorType\n | SerializeAuthorizationListErrorType\n | ConcatHexErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | SerializeAccessListErrorType\n | ErrorType\n\nfunction serializeTransactionEIP7702(\n transaction: TransactionSerializableEIP7702,\n signature?: Signature | undefined,\n): TransactionSerializedEIP7702 {\n const {\n authorizationList,\n chainId,\n gas,\n nonce,\n to,\n value,\n maxFeePerGas,\n maxPriorityFeePerGas,\n accessList,\n data,\n } = transaction\n\n assertTransactionEIP7702(transaction)\n\n const serializedAccessList = serializeAccessList(accessList)\n const serializedAuthorizationList =\n serializeAuthorizationList(authorizationList)\n\n return concatHex([\n '0x04',\n toRlp([\n numberToHex(chainId),\n nonce ? numberToHex(nonce) : '0x',\n maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : '0x',\n maxFeePerGas ? numberToHex(maxFeePerGas) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n serializedAccessList,\n serializedAuthorizationList,\n ...toYParitySignatureArray(transaction, signature),\n ]),\n ]) as TransactionSerializedEIP7702\n}\n\ntype SerializeTransactionEIP4844ErrorType =\n | AssertTransactionEIP4844ErrorType\n | BlobsToCommitmentsErrorType\n | CommitmentsToVersionedHashesErrorType\n | blobsToProofsErrorType\n | ToBlobSidecarsErrorType\n | ConcatHexErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | SerializeAccessListErrorType\n | ErrorType\n\nfunction serializeTransactionEIP4844(\n transaction: TransactionSerializableEIP4844,\n signature?: Signature | undefined,\n): TransactionSerializedEIP4844 {\n const {\n chainId,\n gas,\n nonce,\n to,\n value,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n accessList,\n data,\n } = transaction\n\n assertTransactionEIP4844(transaction)\n\n let blobVersionedHashes = transaction.blobVersionedHashes\n let sidecars = transaction.sidecars\n // If `blobs` are passed, we will need to compute the KZG commitments & proofs.\n if (\n transaction.blobs &&\n (typeof blobVersionedHashes === 'undefined' ||\n typeof sidecars === 'undefined')\n ) {\n const blobs = (\n typeof transaction.blobs[0] === 'string'\n ? transaction.blobs\n : (transaction.blobs as ByteArray[]).map((x) => bytesToHex(x))\n ) as Hex[]\n const kzg = transaction.kzg!\n const commitments = blobsToCommitments({\n blobs,\n kzg,\n })\n\n if (typeof blobVersionedHashes === 'undefined')\n blobVersionedHashes = commitmentsToVersionedHashes({\n commitments,\n })\n if (typeof sidecars === 'undefined') {\n const proofs = blobsToProofs({ blobs, commitments, kzg })\n sidecars = toBlobSidecars({ blobs, commitments, proofs })\n }\n }\n\n const serializedAccessList = serializeAccessList(accessList)\n\n const serializedTransaction = [\n numberToHex(chainId),\n nonce ? numberToHex(nonce) : '0x',\n maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : '0x',\n maxFeePerGas ? numberToHex(maxFeePerGas) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n serializedAccessList,\n maxFeePerBlobGas ? numberToHex(maxFeePerBlobGas) : '0x',\n blobVersionedHashes ?? [],\n ...toYParitySignatureArray(transaction, signature),\n ] as const\n\n const blobs: Hex[] = []\n const commitments: Hex[] = []\n const proofs: Hex[] = []\n if (sidecars)\n for (let i = 0; i < sidecars.length; i++) {\n const { blob, commitment, proof } = sidecars[i]\n blobs.push(blob)\n commitments.push(commitment)\n proofs.push(proof)\n }\n\n return concatHex([\n '0x03',\n sidecars\n ? // If sidecars are enabled, envelope turns into a \"wrapper\":\n toRlp([serializedTransaction, blobs, commitments, proofs])\n : // If sidecars are disabled, standard envelope is used:\n toRlp(serializedTransaction),\n ]) as TransactionSerializedEIP4844\n}\n\ntype SerializeTransactionEIP1559ErrorType =\n | AssertTransactionEIP1559ErrorType\n | ConcatHexErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | SerializeAccessListErrorType\n | ErrorType\n\nfunction serializeTransactionEIP1559(\n transaction: TransactionSerializableEIP1559,\n signature?: Signature | undefined,\n): TransactionSerializedEIP1559 {\n const {\n chainId,\n gas,\n nonce,\n to,\n value,\n maxFeePerGas,\n maxPriorityFeePerGas,\n accessList,\n data,\n } = transaction\n\n assertTransactionEIP1559(transaction)\n\n const serializedAccessList = serializeAccessList(accessList)\n\n const serializedTransaction = [\n numberToHex(chainId),\n nonce ? numberToHex(nonce) : '0x',\n maxPriorityFeePerGas ? numberToHex(maxPriorityFeePerGas) : '0x',\n maxFeePerGas ? numberToHex(maxFeePerGas) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n serializedAccessList,\n ...toYParitySignatureArray(transaction, signature),\n ]\n\n return concatHex([\n '0x02',\n toRlp(serializedTransaction),\n ]) as TransactionSerializedEIP1559\n}\n\ntype SerializeTransactionEIP2930ErrorType =\n | AssertTransactionEIP2930ErrorType\n | ConcatHexErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | SerializeAccessListErrorType\n | ErrorType\n\nfunction serializeTransactionEIP2930(\n transaction: TransactionSerializableEIP2930,\n signature?: Signature | undefined,\n): TransactionSerializedEIP2930 {\n const { chainId, gas, data, nonce, to, value, accessList, gasPrice } =\n transaction\n\n assertTransactionEIP2930(transaction)\n\n const serializedAccessList = serializeAccessList(accessList)\n\n const serializedTransaction = [\n numberToHex(chainId),\n nonce ? numberToHex(nonce) : '0x',\n gasPrice ? numberToHex(gasPrice) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n serializedAccessList,\n ...toYParitySignatureArray(transaction, signature),\n ]\n\n return concatHex([\n '0x01',\n toRlp(serializedTransaction),\n ]) as TransactionSerializedEIP2930\n}\n\ntype SerializeTransactionLegacyErrorType =\n | AssertTransactionLegacyErrorType\n | InvalidLegacyVErrorType\n | NumberToHexErrorType\n | ToRlpErrorType\n | ErrorType\n\nfunction serializeTransactionLegacy(\n transaction: TransactionSerializableLegacy,\n signature?: SignatureLegacy | undefined,\n): TransactionSerializedLegacy {\n const { chainId = 0, gas, data, nonce, to, value, gasPrice } = transaction\n\n assertTransactionLegacy(transaction)\n\n let serializedTransaction = [\n nonce ? numberToHex(nonce) : '0x',\n gasPrice ? numberToHex(gasPrice) : '0x',\n gas ? numberToHex(gas) : '0x',\n to ?? '0x',\n value ? numberToHex(value) : '0x',\n data ?? '0x',\n ]\n\n if (signature) {\n const v = (() => {\n // EIP-155 (inferred chainId)\n if (signature.v >= 35n) {\n const inferredChainId = (signature.v - 35n) / 2n\n if (inferredChainId > 0) return signature.v\n return 27n + (signature.v === 35n ? 0n : 1n)\n }\n\n // EIP-155 (explicit chainId)\n if (chainId > 0)\n return BigInt(chainId * 2) + BigInt(35n + signature.v - 27n)\n\n // Pre-EIP-155 (no chainId)\n const v = 27n + (signature.v === 27n ? 0n : 1n)\n if (signature.v !== v) throw new InvalidLegacyVError({ v: signature.v })\n return v\n })()\n\n const r = trim(signature.r)\n const s = trim(signature.s)\n\n serializedTransaction = [\n ...serializedTransaction,\n numberToHex(v),\n r === '0x00' ? '0x' : r,\n s === '0x00' ? '0x' : s,\n ]\n } else if (chainId > 0) {\n serializedTransaction = [\n ...serializedTransaction,\n numberToHex(chainId),\n '0x',\n '0x',\n ]\n }\n\n return toRlp(serializedTransaction) as TransactionSerializedLegacy\n}\n\nexport function toYParitySignatureArray(\n transaction: TransactionSerializableGeneric,\n signature_?: Signature | undefined,\n) {\n const signature = signature_ ?? transaction\n const { v, yParity } = signature\n\n if (typeof signature.r === 'undefined') return []\n if (typeof signature.s === 'undefined') return []\n if (typeof v === 'undefined' && typeof yParity === 'undefined') return []\n\n const r = trim(signature.r)\n const s = trim(signature.s)\n\n const yParity_ = (() => {\n if (typeof yParity === 'number') return yParity ? numberToHex(1) : '0x'\n if (v === 0n) return '0x'\n if (v === 1n) return numberToHex(1)\n\n return v === 27n ? '0x' : numberToHex(1)\n })()\n\n return [yParity_, r === '0x00' ? '0x' : r, s === '0x00' ? '0x' : s]\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type {\n AuthorizationList,\n SerializedAuthorizationList,\n} from '../../types/authorization.js'\nimport { toHex } from '../encoding/toHex.js'\nimport { toYParitySignatureArray } from '../transaction/serializeTransaction.js'\n\nexport type SerializeAuthorizationListReturnType = SerializedAuthorizationList\n\nexport type SerializeAuthorizationListErrorType = ErrorType\n\n/*\n * Serializes an EIP-7702 authorization list.\n */\nexport function serializeAuthorizationList(\n authorizationList?: AuthorizationList<number, true> | undefined,\n): SerializeAuthorizationListReturnType {\n if (!authorizationList || authorizationList.length === 0) return []\n\n const serializedAuthorizationList = []\n for (const authorization of authorizationList) {\n const { chainId, nonce, ...signature } = authorization\n const contractAddress = authorization.address\n serializedAuthorizationList.push([\n chainId ? toHex(chainId) : '0x',\n contractAddress,\n nonce ? toHex(nonce) : '0x',\n ...toYParitySignatureArray({}, signature),\n ])\n }\n\n return serializedAuthorizationList as {} as SerializeAuthorizationListReturnType\n}\n","import type { Address } from 'abitype'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport { type GetAddressErrorType, getAddress } from '../address/getAddress.js'\nimport {\n type IsAddressEqualErrorType,\n isAddressEqual,\n} from '../address/isAddressEqual.js'\nimport {\n type RecoverAuthorizationAddressErrorType,\n type RecoverAuthorizationAddressParameters,\n recoverAuthorizationAddress,\n} from './recoverAuthorizationAddress.js'\n\nexport type VerifyAuthorizationParameters =\n RecoverAuthorizationAddressParameters & {\n /** The address that signed the Authorization object. */\n address: Address\n }\n\nexport type VerifyAuthorizationReturnType = boolean\n\nexport type VerifyAuthorizationErrorType =\n | IsAddressEqualErrorType\n | GetAddressErrorType\n | RecoverAuthorizationAddressErrorType\n | ErrorType\n\n/**\n * Verify that an Authorization object was signed by the provided address.\n *\n * - Docs {@link https://viem.sh/docs/utilities/verifyAuthorization}\n *\n * @param parameters - {@link VerifyAuthorizationParameters}\n * @returns Whether or not the signature is valid. {@link VerifyAuthorizationReturnType}\n */\nexport async function verifyAuthorization({\n address,\n authorization,\n signature,\n}: VerifyAuthorizationParameters): Promise<VerifyAuthorizationReturnType> {\n return isAddressEqual(\n getAddress(address),\n await recoverAuthorizationAddress({\n authorization,\n signature,\n }),\n )\n}\n","import { LruMap } from '../lru.js'\n\n/** @internal */\nexport const promiseCache = /*#__PURE__*/ new LruMap<Promise<any>>(8192)\n\ntype WithDedupeOptions = {\n enabled?: boolean | undefined\n id?: string | undefined\n}\n\n/** Deduplicates in-flight promises. */\nexport function withDedupe<data>(\n fn: () => Promise<data>,\n { enabled = true, id }: WithDedupeOptions,\n): Promise<data> {\n if (!enabled || !id) return fn()\n if (promiseCache.get(id)) return promiseCache.get(id)!\n const promise = fn().finally(() => promiseCache.delete(id))\n promiseCache.set(id, promise)\n return promise\n}\n","import { BaseError } from '../errors/base.js'\nimport {\n HttpRequestError,\n type HttpRequestErrorType,\n type RpcRequestErrorType,\n type TimeoutErrorType,\n type WebSocketRequestErrorType,\n} from '../errors/request.js'\nimport {\n AtomicityNotSupportedError,\n type AtomicityNotSupportedErrorType,\n AtomicReadyWalletRejectedUpgradeError,\n type AtomicReadyWalletRejectedUpgradeErrorType,\n BundleTooLargeError,\n type BundleTooLargeErrorType,\n ChainDisconnectedError,\n type ChainDisconnectedErrorType,\n DuplicateIdError,\n type DuplicateIdErrorType,\n InternalRpcError,\n type InternalRpcErrorType,\n InvalidInputRpcError,\n type InvalidInputRpcErrorType,\n InvalidParamsRpcError,\n type InvalidParamsRpcErrorType,\n InvalidRequestRpcError,\n type InvalidRequestRpcErrorType,\n JsonRpcVersionUnsupportedError,\n type JsonRpcVersionUnsupportedErrorType,\n LimitExceededRpcError,\n type LimitExceededRpcErrorType,\n MethodNotFoundRpcError,\n type MethodNotFoundRpcErrorType,\n MethodNotSupportedRpcError,\n type MethodNotSupportedRpcErrorType,\n ParseRpcError,\n type ParseRpcErrorType,\n ProviderDisconnectedError,\n type ProviderDisconnectedErrorType,\n type ProviderRpcErrorCode,\n ResourceNotFoundRpcError,\n type ResourceNotFoundRpcErrorType,\n ResourceUnavailableRpcError,\n type ResourceUnavailableRpcErrorType,\n type RpcError,\n type RpcErrorCode,\n type RpcErrorType,\n SwitchChainError,\n type SwitchChainErrorType,\n TransactionRejectedRpcError,\n type TransactionRejectedRpcErrorType,\n UnauthorizedProviderError,\n type UnauthorizedProviderErrorType,\n UnknownBundleIdError,\n type UnknownBundleIdErrorType,\n UnknownRpcError,\n type UnknownRpcErrorType,\n UnsupportedChainIdError,\n type UnsupportedChainIdErrorType,\n UnsupportedNonOptionalCapabilityError,\n type UnsupportedNonOptionalCapabilityErrorType,\n UnsupportedProviderMethodError,\n type UnsupportedProviderMethodErrorType,\n UserRejectedRequestError,\n type UserRejectedRequestErrorType,\n WalletConnectSessionSettlementError,\n type WalletConnectSessionSettlementErrorType,\n} from '../errors/rpc.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type {\n EIP1193RequestFn,\n EIP1193RequestOptions,\n} from '../types/eip1193.js'\nimport { stringToHex } from './encoding/toHex.js'\nimport type { CreateBatchSchedulerErrorType } from './promise/createBatchScheduler.js'\nimport { withDedupe } from './promise/withDedupe.js'\nimport { type WithRetryErrorType, withRetry } from './promise/withRetry.js'\nimport type { GetSocketRpcClientErrorType } from './rpc/socket.js'\nimport { stringify } from './stringify.js'\n\nexport type RequestErrorType =\n | AtomicityNotSupportedErrorType\n | AtomicReadyWalletRejectedUpgradeErrorType\n | BundleTooLargeErrorType\n | ChainDisconnectedErrorType\n | CreateBatchSchedulerErrorType\n | DuplicateIdErrorType\n | HttpRequestErrorType\n | InternalRpcErrorType\n | InvalidInputRpcErrorType\n | InvalidParamsRpcErrorType\n | InvalidRequestRpcErrorType\n | GetSocketRpcClientErrorType\n | JsonRpcVersionUnsupportedErrorType\n | LimitExceededRpcErrorType\n | MethodNotFoundRpcErrorType\n | MethodNotSupportedRpcErrorType\n | ParseRpcErrorType\n | ProviderDisconnectedErrorType\n | ResourceNotFoundRpcErrorType\n | ResourceUnavailableRpcErrorType\n | RpcErrorType\n | RpcRequestErrorType\n | SwitchChainErrorType\n | TimeoutErrorType\n | TransactionRejectedRpcErrorType\n | UnauthorizedProviderErrorType\n | UnknownBundleIdErrorType\n | UnknownRpcErrorType\n | UnsupportedChainIdErrorType\n | UnsupportedNonOptionalCapabilityErrorType\n | UnsupportedProviderMethodErrorType\n | UserRejectedRequestErrorType\n | WalletConnectSessionSettlementErrorType\n | WebSocketRequestErrorType\n | WithRetryErrorType\n | ErrorType\n\nexport function buildRequest<request extends (args: any) => Promise<any>>(\n request: request,\n options: EIP1193RequestOptions = {},\n): EIP1193RequestFn {\n return async (args, overrideOptions = {}) => {\n const {\n dedupe = false,\n methods,\n retryDelay = 150,\n retryCount = 3,\n uid,\n } = {\n ...options,\n ...overrideOptions,\n }\n\n const { method } = args\n if (methods?.exclude?.includes(method))\n throw new MethodNotSupportedRpcError(new Error('method not supported'), {\n method,\n })\n if (methods?.include && !methods.include.includes(method))\n throw new MethodNotSupportedRpcError(new Error('method not supported'), {\n method,\n })\n\n const requestId = dedupe\n ? stringToHex(`${uid}.${stringify(args)}`)\n : undefined\n return withDedupe(\n () =>\n withRetry(\n async () => {\n try {\n return await request(args)\n } catch (err_) {\n const err = err_ as unknown as RpcError<\n RpcErrorCode | ProviderRpcErrorCode\n >\n switch (err.code) {\n // -32700\n case ParseRpcError.code:\n throw new ParseRpcError(err)\n // -32600\n case InvalidRequestRpcError.code:\n throw new InvalidRequestRpcError(err)\n // -32601\n case MethodNotFoundRpcError.code:\n throw new MethodNotFoundRpcError(err, { method: args.method })\n // -32602\n case InvalidParamsRpcError.code:\n throw new InvalidParamsRpcError(err)\n // -32603\n case InternalRpcError.code:\n throw new InternalRpcError(err)\n // -32000\n case InvalidInputRpcError.code:\n throw new InvalidInputRpcError(err)\n // -32001\n case ResourceNotFoundRpcError.code:\n throw new ResourceNotFoundRpcError(err)\n // -32002\n case ResourceUnavailableRpcError.code:\n throw new ResourceUnavailableRpcError(err)\n // -32003\n case TransactionRejectedRpcError.code:\n throw new TransactionRejectedRpcError(err)\n // -32004\n case MethodNotSupportedRpcError.code:\n throw new MethodNotSupportedRpcError(err, {\n method: args.method,\n })\n // -32005\n case LimitExceededRpcError.code:\n throw new LimitExceededRpcError(err)\n // -32006\n case JsonRpcVersionUnsupportedError.code:\n throw new JsonRpcVersionUnsupportedError(err)\n\n // 4001\n case UserRejectedRequestError.code:\n throw new UserRejectedRequestError(err)\n // 4100\n case UnauthorizedProviderError.code:\n throw new UnauthorizedProviderError(err)\n // 4200\n case UnsupportedProviderMethodError.code:\n throw new UnsupportedProviderMethodError(err)\n // 4900\n case ProviderDisconnectedError.code:\n throw new ProviderDisconnectedError(err)\n // 4901\n case ChainDisconnectedError.code:\n throw new ChainDisconnectedError(err)\n // 4902\n case SwitchChainError.code:\n throw new SwitchChainError(err)\n\n // 5700\n case UnsupportedNonOptionalCapabilityError.code:\n throw new UnsupportedNonOptionalCapabilityError(err)\n // 5710\n case UnsupportedChainIdError.code:\n throw new UnsupportedChainIdError(err)\n // 5720\n case DuplicateIdError.code:\n throw new DuplicateIdError(err)\n // 5730\n case UnknownBundleIdError.code:\n throw new UnknownBundleIdError(err)\n // 5740\n case BundleTooLargeError.code:\n throw new BundleTooLargeError(err)\n // 5750\n case AtomicReadyWalletRejectedUpgradeError.code:\n throw new AtomicReadyWalletRejectedUpgradeError(err)\n // 5760\n case AtomicityNotSupportedError.code:\n throw new AtomicityNotSupportedError(err)\n\n // CAIP-25: User Rejected Error\n // https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes#rejected-caip-25\n case 5000:\n throw new UserRejectedRequestError(err)\n\n // WalletConnect: Session Settlement Failed\n // https://docs.walletconnect.com/2.0/specs/clients/sign/error-codes\n case WalletConnectSessionSettlementError.code:\n throw new WalletConnectSessionSettlementError(err)\n\n default:\n if (err_ instanceof BaseError) throw err_\n throw new UnknownRpcError(err as Error)\n }\n }\n },\n {\n delay: ({ count, error }) => {\n // If we find a Retry-After header, let's retry after the given time.\n if (error && error instanceof HttpRequestError) {\n const retryAfter = error?.headers?.get('Retry-After')\n if (retryAfter?.match(/\\d/))\n return Number.parseInt(retryAfter, 10) * 1000\n }\n\n // Otherwise, let's retry with an exponential backoff.\n return ~~(1 << count) * retryDelay\n },\n retryCount,\n shouldRetry: ({ error }) => shouldRetry(error),\n },\n ),\n { enabled: dedupe, id: requestId },\n )\n }\n}\n\n/** @internal */\nexport function shouldRetry(error: Error) {\n if ('code' in error && typeof error.code === 'number') {\n if (error.code === -1) return true // Unknown error\n if (error.code === LimitExceededRpcError.code) return true\n if (error.code === InternalRpcError.code) return true\n return false\n }\n if (error instanceof HttpRequestError && error.status) {\n // Forbidden\n if (error.status === 403) return true\n // Request Timeout\n if (error.status === 408) return true\n // Request Entity Too Large\n if (error.status === 413) return true\n // Too Many Requests\n if (error.status === 429) return true\n // Internal Server Error\n if (error.status === 500) return true\n // Bad Gateway\n if (error.status === 502) return true\n // Service Unavailable\n if (error.status === 503) return true\n // Gateway Timeout\n if (error.status === 504) return true\n return false\n }\n return true\n}\n","import type { Chain, ChainFormatters } from '../../types/chain.js'\nimport type { Assign, Prettify } from '../../types/utils.js'\n\nexport type DefineChainReturnType<chain extends Chain = Chain> = Prettify<\n chain &\n (chain['extendSchema'] extends Record<string, unknown>\n ? {\n extend: <const extended extends chain['extendSchema']>(\n extended: extended,\n ) => Assign<chain, extended>\n }\n : {})\n>\n\nexport function defineChain<\n formatters extends ChainFormatters,\n const chain extends Chain<formatters>,\n>(chain: chain): DefineChainReturnType<Assign<Chain<undefined>, chain>> {\n const chainInstance = {\n formatters: undefined,\n fees: undefined,\n serializers: undefined,\n ...chain,\n } as Assign<Chain<undefined>, chain>\n\n function extend(base: typeof chainInstance) {\n type ExtendFn = (base: typeof chainInstance) => unknown\n return (fnOrExtended: ExtendFn | Record<string, unknown>) => {\n const properties = (\n typeof fnOrExtended === 'function' ? fnOrExtended(base) : fnOrExtended\n ) as (typeof chainInstance)['extendSchema']\n const combined = { ...base, ...properties }\n return Object.assign(combined, { extend: extend(combined) })\n }\n }\n\n return Object.assign(chainInstance, {\n extend: extend(chainInstance),\n }) as never\n}\n\nexport function extendSchema<schema extends Record<string, unknown>>(): schema {\n return {} as schema\n}\n","import { BaseError, type BaseErrorType } from '../../errors/base.js'\nimport {\n InvalidHexValueError,\n type InvalidHexValueErrorType,\n} from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex } from '../../types/misc.js'\nimport {\n type CreateCursorErrorType,\n type Cursor,\n createCursor,\n} from '../cursor.js'\nimport { type HexToBytesErrorType, hexToBytes } from './toBytes.js'\nimport { type BytesToHexErrorType, bytesToHex } from './toHex.js'\n\nimport type { RecursiveArray } from './toRlp.js'\n\ntype To = 'hex' | 'bytes'\n\nexport type FromRlpReturnType<to extends To> =\n | (to extends 'bytes' ? RecursiveArray<ByteArray> : never)\n | (to extends 'hex' ? RecursiveArray<Hex> : never)\n\nexport type FromRlpErrorType =\n | CreateCursorErrorType\n | FromRlpCursorErrorType\n | HexToBytesErrorType\n | InvalidHexValueErrorType\n | ErrorType\n\nexport function fromRlp<to extends To = 'hex'>(\n value: ByteArray | Hex,\n to: to | To | undefined = 'hex',\n): FromRlpReturnType<to> {\n const bytes = (() => {\n if (typeof value === 'string') {\n if (value.length > 3 && value.length % 2 !== 0)\n throw new InvalidHexValueError(value)\n return hexToBytes(value)\n }\n return value\n })()\n\n const cursor = createCursor(bytes, {\n recursiveReadLimit: Number.POSITIVE_INFINITY,\n })\n const result = fromRlpCursor(cursor, to)\n\n return result as FromRlpReturnType<to>\n}\n\ntype FromRlpCursorErrorType =\n | BytesToHexErrorType\n | ReadLengthErrorType\n | ReadListErrorType\n | ErrorType\n\nfunction fromRlpCursor<to extends To = 'hex'>(\n cursor: Cursor,\n to: to | To | undefined = 'hex',\n): FromRlpReturnType<to> {\n if (cursor.bytes.length === 0)\n return (\n to === 'hex' ? bytesToHex(cursor.bytes) : cursor.bytes\n ) as FromRlpReturnType<to>\n\n const prefix = cursor.readByte()\n if (prefix < 0x80) cursor.decrementPosition(1)\n\n // bytes\n if (prefix < 0xc0) {\n const length = readLength(cursor, prefix, 0x80)\n const bytes = cursor.readBytes(length)\n return (to === 'hex' ? bytesToHex(bytes) : bytes) as FromRlpReturnType<to>\n }\n\n // list\n const length = readLength(cursor, prefix, 0xc0)\n return readList(cursor, length, to) as {} as FromRlpReturnType<to>\n}\n\ntype ReadLengthErrorType = BaseErrorType | ErrorType\n\nfunction readLength(cursor: Cursor, prefix: number, offset: number) {\n if (offset === 0x80 && prefix < 0x80) return 1\n if (prefix <= offset + 55) return prefix - offset\n if (prefix === offset + 55 + 1) return cursor.readUint8()\n if (prefix === offset + 55 + 2) return cursor.readUint16()\n if (prefix === offset + 55 + 3) return cursor.readUint24()\n if (prefix === offset + 55 + 4) return cursor.readUint32()\n throw new BaseError('Invalid RLP prefix')\n}\n\ntype ReadListErrorType = ErrorType\n\nfunction readList<to extends To>(cursor: Cursor, length: number, to: to | To) {\n const position = cursor.position\n const value: FromRlpReturnType<to>[] = []\n while (cursor.position - position < length)\n value.push(fromRlpCursor(cursor, to))\n return value\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../types/misc.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type SizeErrorType, size } from '../data/size.js'\n\nexport type IsHashErrorType = IsHexErrorType | SizeErrorType | ErrorType\n\nexport function isHash(hash: string): hash is Hex {\n return isHex(hash) && size(hash) === 32\n}\n","import type { ErrorType } from '../../errors/utils.js'\n\nexport type WithTimeoutErrorType = ErrorType\n\nexport function withTimeout<data>(\n fn: ({\n signal,\n }: {\n signal: AbortController['signal'] | null\n }) => Promise<data>,\n {\n errorInstance = new Error('timed out'),\n timeout,\n signal,\n }: {\n // The error instance to throw when the timeout is reached.\n errorInstance?: Error | undefined\n // The timeout (in ms).\n timeout: number\n // Whether or not the timeout should use an abort signal.\n signal?: boolean | undefined\n },\n): Promise<data> {\n return new Promise((resolve, reject) => {\n ;(async () => {\n let timeoutId!: NodeJS.Timeout\n try {\n const controller = new AbortController()\n if (timeout > 0) {\n timeoutId = setTimeout(() => {\n if (signal) {\n controller.abort()\n } else {\n reject(errorInstance)\n }\n }, timeout) as NodeJS.Timeout // need to cast because bun globals.d.ts overrides @types/node\n }\n resolve(await fn({ signal: controller?.signal || null }))\n } catch (err) {\n if ((err as Error)?.name === 'AbortError') reject(errorInstance)\n reject(err)\n } finally {\n clearTimeout(timeoutId)\n }\n })()\n })\n}\n","function createIdStore() {\n return {\n current: 0,\n take() {\n return this.current++\n },\n reset() {\n this.current = 0\n },\n }\n}\n\nexport const idCache = /*#__PURE__*/ createIdStore()\n","import {\n HttpRequestError,\n type HttpRequestErrorType as HttpRequestErrorType_,\n TimeoutError,\n type TimeoutErrorType,\n} from '../../errors/request.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { RpcRequest, RpcResponse } from '../../types/rpc.js'\nimport type { MaybePromise } from '../../types/utils.js'\nimport {\n type WithTimeoutErrorType,\n withTimeout,\n} from '../promise/withTimeout.js'\nimport { stringify } from '../stringify.js'\nimport { idCache } from './id.js'\n\nexport type HttpRpcClientOptions = {\n /** Override for the fetch function used to make requests. */\n fetchFn?:\n | ((input: string | URL | Request, init?: RequestInit) => Promise<Response>)\n | undefined\n /** Request configuration to pass to `fetch`. */\n fetchOptions?: Omit<RequestInit, 'body'> | undefined\n /** A callback to handle the request. */\n onRequest?:\n | ((\n request: Request,\n init: RequestInit,\n ) => MaybePromise<\n void | undefined | (RequestInit & { url?: string | undefined })\n >)\n | undefined\n /** A callback to handle the response. */\n onResponse?: ((response: Response) => Promise<void> | void) | undefined\n /** The timeout (in ms) for the request. */\n timeout?: number | undefined\n}\n\nexport type HttpRequestParameters<\n body extends RpcRequest | RpcRequest[] = RpcRequest,\n> = {\n /** The RPC request body. */\n body: body\n /** Override for the fetch function used to make requests. */\n fetchFn?: HttpRpcClientOptions['fetchFn'] | undefined\n /** Request configuration to pass to `fetch`. */\n fetchOptions?: HttpRpcClientOptions['fetchOptions'] | undefined\n /** A callback to handle the response. */\n onRequest?:\n | ((\n request: Request,\n init: RequestInit,\n ) => MaybePromise<\n void | undefined | (RequestInit & { url?: string | undefined })\n >)\n | undefined\n /** A callback to handle the response. */\n onResponse?: ((response: Response) => Promise<void> | void) | undefined\n /** The timeout (in ms) for the request. */\n timeout?: HttpRpcClientOptions['timeout'] | undefined\n}\n\nexport type HttpRequestReturnType<\n body extends RpcRequest | RpcRequest[] = RpcRequest,\n> = body extends RpcRequest[] ? RpcResponse[] : RpcResponse\n\nexport type HttpRequestErrorType =\n | HttpRequestErrorType_\n | TimeoutErrorType\n | WithTimeoutErrorType\n | ErrorType\n\nexport type HttpRpcClient = {\n request<body extends RpcRequest | RpcRequest[]>(\n params: HttpRequestParameters<body>,\n ): Promise<HttpRequestReturnType<body>>\n}\n\nexport function getHttpRpcClient(\n url_: string,\n options: HttpRpcClientOptions = {},\n): HttpRpcClient {\n const { url, headers: headers_url } = parseUrl(url_)\n\n return {\n async request(params) {\n const {\n body,\n fetchFn = options.fetchFn ?? fetch,\n onRequest = options.onRequest,\n onResponse = options.onResponse,\n timeout = options.timeout ?? 10_000,\n } = params\n\n const fetchOptions = {\n ...(options.fetchOptions ?? {}),\n ...(params.fetchOptions ?? {}),\n }\n\n const { headers, method, signal: signal_ } = fetchOptions\n\n try {\n const response = await withTimeout(\n async ({ signal }) => {\n const init: RequestInit = {\n ...fetchOptions,\n body: Array.isArray(body)\n ? stringify(\n body.map((body) => ({\n jsonrpc: '2.0',\n id: body.id ?? idCache.take(),\n ...body,\n })),\n )\n : stringify({\n jsonrpc: '2.0',\n id: body.id ?? idCache.take(),\n ...body,\n }),\n headers: {\n ...headers_url,\n 'Content-Type': 'application/json',\n ...headers,\n },\n method: method || 'POST',\n signal: signal_ || (timeout > 0 ? signal : null),\n }\n const request = new Request(url, init)\n const args = (await onRequest?.(request, init)) ?? { ...init, url }\n const response = await fetchFn(args.url ?? url, args)\n return response\n },\n {\n errorInstance: new TimeoutError({ body, url }),\n timeout,\n signal: true,\n },\n )\n\n if (onResponse) await onResponse(response)\n\n let data: any\n if (\n response.headers.get('Content-Type')?.startsWith('application/json')\n )\n data = await response.json()\n else {\n data = await response.text()\n try {\n data = JSON.parse(data || '{}')\n } catch (err) {\n if (response.ok) throw err\n data = { error: data }\n }\n }\n\n if (!response.ok) {\n throw new HttpRequestError({\n body,\n details: stringify(data.error) || response.statusText,\n headers: response.headers,\n status: response.status,\n url,\n })\n }\n\n return data\n } catch (err) {\n if (err instanceof HttpRequestError) throw err\n if (err instanceof TimeoutError) throw err\n throw new HttpRequestError({\n body,\n cause: err as Error,\n url,\n })\n }\n },\n }\n}\n\n/** @internal */\nexport function parseUrl(url_: string) {\n try {\n const url = new URL(url_)\n\n const result = (() => {\n // Handle Basic authentication credentials\n if (url.username) {\n const credentials = `${decodeURIComponent(url.username)}:${decodeURIComponent(url.password)}`\n url.username = ''\n url.password = ''\n\n return {\n url: url.toString(),\n headers: { Authorization: `Basic ${btoa(credentials)}` },\n }\n }\n\n return\n })()\n\n return { url: url.toString(), ...result }\n } catch {\n return { url: url_ }\n }\n}\n","import type { TypedData } from 'abitype'\n\nimport { stringify } from '../utils/stringify.js'\nimport { BaseError } from './base.js'\n\nexport type InvalidDomainErrorType = InvalidDomainError & {\n name: 'InvalidDomainError'\n}\nexport class InvalidDomainError extends BaseError {\n constructor({ domain }: { domain: unknown }) {\n super(`Invalid domain \"${stringify(domain)}\".`, {\n metaMessages: ['Must be a valid EIP-712 domain.'],\n })\n }\n}\n\nexport type InvalidPrimaryTypeErrorType = InvalidPrimaryTypeError & {\n name: 'InvalidPrimaryTypeError'\n}\nexport class InvalidPrimaryTypeError extends BaseError {\n constructor({\n primaryType,\n types,\n }: { primaryType: string; types: TypedData | Record<string, unknown> }) {\n super(\n `Invalid primary type \\`${primaryType}\\` must be one of \\`${JSON.stringify(Object.keys(types))}\\`.`,\n {\n docsPath: '/api/glossary/Errors#typeddatainvalidprimarytypeerror',\n metaMessages: ['Check that the primary type is a key in `types`.'],\n },\n )\n }\n}\n\nexport type InvalidStructTypeErrorType = InvalidStructTypeError & {\n name: 'InvalidStructTypeError'\n}\nexport class InvalidStructTypeError extends BaseError {\n constructor({ type }: { type: string }) {\n super(`Struct type \"${type}\" is invalid.`, {\n metaMessages: ['Struct type must not be a Solidity type.'],\n name: 'InvalidStructTypeError',\n })\n }\n}\n","import type { TypedData, TypedDataDomain, TypedDataParameter } from 'abitype'\n\nimport { BytesSizeMismatchError } from '../errors/abi.js'\nimport { InvalidAddressError } from '../errors/address.js'\nimport {\n InvalidDomainError,\n InvalidPrimaryTypeError,\n InvalidStructTypeError,\n} from '../errors/typedData.js'\nimport type { ErrorType } from '../errors/utils.js'\nimport type { Hex } from '../types/misc.js'\nimport type { TypedDataDefinition } from '../types/typedData.js'\nimport { type IsAddressErrorType, isAddress } from './address/isAddress.js'\nimport { type SizeErrorType, size } from './data/size.js'\nimport { type NumberToHexErrorType, numberToHex } from './encoding/toHex.js'\nimport { bytesRegex, integerRegex } from './regex.js'\nimport {\n type HashDomainErrorType,\n hashDomain,\n} from './signature/hashTypedData.js'\nimport { stringify } from './stringify.js'\n\nexport type SerializeTypedDataErrorType =\n | HashDomainErrorType\n | IsAddressErrorType\n | NumberToHexErrorType\n | SizeErrorType\n | ErrorType\n\nexport function serializeTypedData<\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | 'EIP712Domain',\n>(parameters: TypedDataDefinition<typedData, primaryType>) {\n const {\n domain: domain_,\n message: message_,\n primaryType,\n types,\n } = parameters as unknown as TypedDataDefinition\n\n const normalizeData = (\n struct: readonly TypedDataParameter[],\n data_: Record<string, unknown>,\n ) => {\n const data = { ...data_ }\n for (const param of struct) {\n const { name, type } = param\n if (type === 'address') data[name] = (data[name] as string).toLowerCase()\n }\n return data\n }\n\n const domain = (() => {\n if (!types.EIP712Domain) return {}\n if (!domain_) return {}\n return normalizeData(types.EIP712Domain, domain_)\n })()\n\n const message = (() => {\n if (primaryType === 'EIP712Domain') return undefined\n return normalizeData(types[primaryType], message_)\n })()\n\n return stringify({ domain, message, primaryType, types })\n}\n\nexport type ValidateTypedDataErrorType =\n | HashDomainErrorType\n | IsAddressErrorType\n | NumberToHexErrorType\n | SizeErrorType\n | ErrorType\n\nexport function validateTypedData<\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | 'EIP712Domain',\n>(parameters: TypedDataDefinition<typedData, primaryType>) {\n const { domain, message, primaryType, types } =\n parameters as unknown as TypedDataDefinition\n\n const validateData = (\n struct: readonly TypedDataParameter[],\n data: Record<string, unknown>,\n ) => {\n for (const param of struct) {\n const { name, type } = param\n const value = data[name]\n\n const integerMatch = type.match(integerRegex)\n if (\n integerMatch &&\n (typeof value === 'number' || typeof value === 'bigint')\n ) {\n const [_type, base, size_] = integerMatch\n // If number cannot be cast to a sized hex value, it is out of range\n // and will throw.\n numberToHex(value, {\n signed: base === 'int',\n size: Number.parseInt(size_, 10) / 8,\n })\n }\n\n if (type === 'address' && typeof value === 'string' && !isAddress(value))\n throw new InvalidAddressError({ address: value })\n\n const bytesMatch = type.match(bytesRegex)\n if (bytesMatch) {\n const [_type, size_] = bytesMatch\n if (size_ && size(value as Hex) !== Number.parseInt(size_, 10))\n throw new BytesSizeMismatchError({\n expectedSize: Number.parseInt(size_, 10),\n givenSize: size(value as Hex),\n })\n }\n\n const struct = types[type]\n if (struct) {\n validateReference(type)\n validateData(struct, value as Record<string, unknown>)\n }\n }\n }\n\n // Validate domain types.\n if (types.EIP712Domain && domain) {\n if (typeof domain !== 'object') throw new InvalidDomainError({ domain })\n validateData(types.EIP712Domain, domain)\n }\n\n // Validate message types.\n if (primaryType !== 'EIP712Domain') {\n if (types[primaryType]) validateData(types[primaryType], message)\n else throw new InvalidPrimaryTypeError({ primaryType, types })\n }\n}\n\nexport type GetTypesForEIP712DomainErrorType = ErrorType\n\nexport function getTypesForEIP712Domain({\n domain,\n}: {\n domain?: TypedDataDomain | undefined\n}): TypedDataParameter[] {\n return [\n typeof domain?.name === 'string' && { name: 'name', type: 'string' },\n domain?.version && { name: 'version', type: 'string' },\n (typeof domain?.chainId === 'number' ||\n typeof domain?.chainId === 'bigint') && {\n name: 'chainId',\n type: 'uint256',\n },\n domain?.verifyingContract && {\n name: 'verifyingContract',\n type: 'address',\n },\n domain?.salt && { name: 'salt', type: 'bytes32' },\n ].filter(Boolean) as TypedDataParameter[]\n}\n\nexport type DomainSeparatorErrorType =\n | GetTypesForEIP712DomainErrorType\n | HashDomainErrorType\n | ErrorType\n\nexport function domainSeparator({ domain }: { domain: TypedDataDomain }): Hex {\n return hashDomain({\n domain: domain as never,\n types: {\n EIP712Domain: getTypesForEIP712Domain({ domain }),\n },\n })\n}\n\n/** @internal */\nfunction validateReference(type: string) {\n // Struct type must not be a Solidity type.\n if (\n type === 'address' ||\n type === 'bool' ||\n type === 'string' ||\n type.startsWith('bytes') ||\n type.startsWith('uint') ||\n type.startsWith('int')\n )\n throw new InvalidStructTypeError({ type })\n}\n","import * as AbiParameters from '../core/AbiParameters.js'\nimport type * as Address from '../core/Address.js'\nimport * as Authorization from '../core/Authorization.js'\nimport * as Errors from '../core/Errors.js'\nimport * as Hex from '../core/Hex.js'\nimport * as Secp256k1 from '../core/Secp256k1.js'\nimport * as Signature from '../core/Signature.js'\n\n/** Unwrapped ERC-8010 signature. */\nexport type Unwrapped = {\n /** Authorization signed by the delegatee. */\n authorization: Authorization.Authorization<true>\n /** Data to initialize the delegation. */\n data?: Hex.Hex | undefined\n /** The original signature. */\n signature: Hex.Hex\n /** Address of the initializer. */\n to?: Address.Address | undefined\n}\n\n/** Wrapped ERC-8010 signature. */\nexport type Wrapped = Hex.Hex\n\n/**\n * Magic bytes used to identify ERC-8010 wrapped signatures.\n */\nexport const magicBytes =\n '0x8010801080108010801080108010801080108010801080108010801080108010' as const\n\n/** Suffix ABI parameters for the ERC-8010 wrapped signature. */\nexport const suffixParameters = AbiParameters.from(\n '(uint256 chainId, address delegation, uint256 nonce, uint8 yParity, uint256 r, uint256 s), address to, bytes data',\n)\n\n/**\n * Asserts that the wrapped signature is valid.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc8010 } from 'ox/erc8010'\n *\n * SignatureErc8010.assert('0xdeadbeef')\n * // @error: InvalidWrappedSignatureError: Value `0xdeadbeef` is an invalid ERC-8010 wrapped signature.\n * ```\n *\n * @param value - The value to assert.\n */\nexport function assert(value: Unwrapped | Wrapped) {\n if (typeof value === 'string') {\n if (Hex.slice(value, -32) !== magicBytes)\n throw new InvalidWrappedSignatureError(value)\n } else Signature.assert(value.authorization)\n}\n\nexport declare namespace assert {\n type ErrorType =\n | InvalidWrappedSignatureError\n | Hex.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Parses an [ERC-8010 wrapped signature](https://github.com/jxom/ERCs/blob/16f7e3891fff2e1e9c25dea0485497739db8a816/ERCS/erc-8010.md) into its constituent parts.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1 } from 'ox'\n * import { SignatureErc8010 } from 'ox/erc8010' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: '0x...',\n * privateKey: '0x...',\n * })\n *\n * // Instantiate from serialized format. // [!code focus]\n * const wrapped = SignatureErc8010.from('0x...') // [!code focus]\n * // @log: { authorization: { ... }, data: '0x...', signature: { ... } } // [!code focus]\n *\n * // Instantiate from constituent parts. // [!code focus]\n * const wrapped = SignatureErc8010.from({ // [!code focus]\n * authorization: { ... }, // [!code focus]\n * data: '0x...', // [!code focus]\n * signature, // [!code focus]\n * })\n * // @log: { authorization: { ... }, data: '0x...', signature: { ... } }\n * ```\n *\n * @param value - Value to parse.\n * @returns Parsed value.\n */\nexport function from(value: Unwrapped | Wrapped): Unwrapped {\n if (typeof value === 'string') return unwrap(value)\n return value\n}\n\nexport declare namespace from {\n type ErrorType = unwrap.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Unwraps an [ERC-8010 wrapped signature](https://github.com/jxom/ERCs/blob/16f7e3891fff2e1e9c25dea0485497739db8a816/ERCS/erc-8010.md) into its constituent parts.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc8010 } from 'ox/erc8010'\n *\n * const { authorization, data, signature } = SignatureErc8010.unwrap('0x...')\n * ```\n *\n * @param wrapped - Wrapped signature to unwrap.\n * @returns Unwrapped signature.\n */\nexport function unwrap(wrapped: Wrapped): Unwrapped {\n assert(wrapped)\n\n const suffixLength = Hex.toNumber(Hex.slice(wrapped, -64, -32))\n const suffix = Hex.slice(wrapped, -suffixLength - 64, -64)\n const signature = Hex.slice(wrapped, 0, -suffixLength - 64)\n\n const [auth, to, data] = AbiParameters.decode(suffixParameters, suffix)\n\n const authorization = Authorization.from({\n address: auth.delegation,\n chainId: Number(auth.chainId),\n nonce: auth.nonce,\n yParity: auth.yParity,\n r: auth.r,\n s: auth.s,\n })\n\n return {\n authorization,\n signature,\n ...(data && data !== '0x' ? { data, to } : {}),\n }\n}\n\nexport declare namespace unwrap {\n type ErrorType = assert.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Wraps a signature into [ERC-8010 format](https://github.com/jxom/ERCs/blob/16f7e3891fff2e1e9c25dea0485497739db8a816/ERCS/erc-8010.md).\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1, Signature } from 'ox'\n * import { SignatureErc8010 } from 'ox/erc8010' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: '0x...',\n * privateKey: '0x...',\n * })\n *\n * const wrapped = SignatureErc8010.wrap({ // [!code focus]\n * authorization: { ... }, // [!code focus]\n * data: '0xdeadbeef', // [!code focus]\n * signature: Signature.toHex(signature), // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param value - Values to wrap.\n * @returns Wrapped signature.\n */\nexport function wrap(value: Unwrapped): Wrapped {\n const { data, signature } = value\n\n assert(value)\n\n const self = Secp256k1.recoverAddress({\n payload: Authorization.getSignPayload(value.authorization),\n signature: Signature.from(value.authorization),\n })\n\n const suffix = AbiParameters.encode(suffixParameters, [\n {\n ...value.authorization,\n delegation: value.authorization.address,\n chainId: BigInt(value.authorization.chainId),\n },\n value.to ?? self,\n data ?? '0x',\n ])\n const suffixLength = Hex.fromNumber(Hex.size(suffix), { size: 32 })\n return Hex.concat(signature, suffix, suffixLength, magicBytes)\n}\n\nexport declare namespace wrap {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Validates a wrapped signature. Returns `true` if the wrapped signature is valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc8010 } from 'ox/erc8010'\n *\n * const valid = SignatureErc8010.validate('0xdeadbeef')\n * // @log: false\n * ```\n *\n * @param value - The value to validate.\n * @returns `true` if the value is valid, `false` otherwise.\n */\nexport function validate(value: Unwrapped | Wrapped): boolean {\n try {\n assert(value)\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/** Thrown when the ERC-8010 wrapped signature is invalid. */\nexport class InvalidWrappedSignatureError extends Errors.BaseError {\n override readonly name = 'SignatureErc8010.InvalidWrappedSignatureError'\n\n constructor(wrapped: Wrapped) {\n super(`Value \\`${wrapped}\\` is an invalid ERC-8010 wrapped signature.`)\n }\n}\n","import {\n InvalidSerializedTransactionTypeError,\n type InvalidSerializedTransactionTypeErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Hex } from '../../index.js'\nimport type {\n TransactionSerialized,\n TransactionSerializedEIP1559,\n TransactionSerializedEIP2930,\n TransactionSerializedEIP4844,\n TransactionSerializedEIP7702,\n TransactionSerializedGeneric,\n TransactionSerializedLegacy,\n TransactionType,\n} from '../../types/transaction.js'\nimport type { IsNarrowable, IsNever } from '../../types/utils.js'\nimport { type SliceHexErrorType, sliceHex } from '../data/slice.js'\nimport { type HexToNumberErrorType, hexToNumber } from '../encoding/fromHex.js'\n\nexport type GetSerializedTransactionType<\n serializedTransaction extends\n TransactionSerializedGeneric = TransactionSerialized,\n result =\n | (serializedTransaction extends TransactionSerializedEIP1559\n ? 'eip1559'\n : never)\n | (serializedTransaction extends TransactionSerializedEIP2930\n ? 'eip2930'\n : never)\n | (serializedTransaction extends TransactionSerializedEIP4844\n ? 'eip4844'\n : never)\n | (serializedTransaction extends TransactionSerializedEIP7702\n ? 'eip7702'\n : never)\n | (serializedTransaction extends TransactionSerializedLegacy\n ? 'legacy'\n : never),\n> = IsNarrowable<serializedTransaction, Hex> extends true\n ? IsNever<result> extends false\n ? result\n : 'legacy'\n : TransactionType\n\nexport type GetSerializedTransactionTypeErrorType =\n | HexToNumberErrorType\n | InvalidSerializedTransactionTypeErrorType\n | SliceHexErrorType\n | ErrorType\n\nexport function getSerializedTransactionType<\n const serializedTransaction extends TransactionSerializedGeneric,\n>(\n serializedTransaction: serializedTransaction,\n): GetSerializedTransactionType<serializedTransaction> {\n const serializedType = sliceHex(serializedTransaction, 0, 1)\n\n if (serializedType === '0x04')\n return 'eip7702' as GetSerializedTransactionType<serializedTransaction>\n\n if (serializedType === '0x03')\n return 'eip4844' as GetSerializedTransactionType<serializedTransaction>\n\n if (serializedType === '0x02')\n return 'eip1559' as GetSerializedTransactionType<serializedTransaction>\n\n if (serializedType === '0x01')\n return 'eip2930' as GetSerializedTransactionType<serializedTransaction>\n\n if (serializedType !== '0x' && hexToNumber(serializedType) >= 0xc0)\n return 'legacy' as GetSerializedTransactionType<serializedTransaction>\n\n throw new InvalidSerializedTransactionTypeError({ serializedType })\n}\n","import {\n InvalidAddressError,\n type InvalidAddressErrorType,\n} from '../../errors/address.js'\nimport {\n InvalidLegacyVError,\n type InvalidLegacyVErrorType,\n InvalidSerializedTransactionError,\n type InvalidSerializedTransactionErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type {\n SerializedAuthorizationList,\n SignedAuthorizationList,\n} from '../../types/authorization.js'\nimport type { Hex, Signature } from '../../types/misc.js'\nimport type {\n AccessList,\n TransactionRequestEIP2930,\n TransactionRequestLegacy,\n TransactionSerializable,\n TransactionSerializableEIP1559,\n TransactionSerializableEIP2930,\n TransactionSerializableEIP4844,\n TransactionSerializableEIP7702,\n TransactionSerializableLegacy,\n TransactionSerialized,\n TransactionSerializedEIP1559,\n TransactionSerializedEIP2930,\n TransactionSerializedEIP4844,\n TransactionSerializedEIP7702,\n TransactionSerializedGeneric,\n TransactionType,\n} from '../../types/transaction.js'\nimport type { IsNarrowable, Mutable } from '../../types/utils.js'\nimport { type IsAddressErrorType, isAddress } from '../address/isAddress.js'\nimport { toBlobSidecars } from '../blob/toBlobSidecars.js'\nimport { type IsHexErrorType, isHex } from '../data/isHex.js'\nimport { type PadHexErrorType, padHex } from '../data/pad.js'\nimport { trim } from '../data/trim.js'\nimport {\n type HexToBigIntErrorType,\n type HexToNumberErrorType,\n hexToBigInt,\n hexToNumber,\n} from '../encoding/fromHex.js'\nimport { type FromRlpErrorType, fromRlp } from '../encoding/fromRlp.js'\nimport type { RecursiveArray } from '../encoding/toRlp.js'\nimport { isHash } from '../hash/isHash.js'\n\nimport {\n type AssertTransactionEIP1559ErrorType,\n type AssertTransactionEIP2930ErrorType,\n type AssertTransactionEIP4844ErrorType,\n type AssertTransactionEIP7702ErrorType,\n type AssertTransactionLegacyErrorType,\n assertTransactionEIP1559,\n assertTransactionEIP2930,\n assertTransactionEIP4844,\n assertTransactionEIP7702,\n assertTransactionLegacy,\n} from './assertTransaction.js'\nimport {\n type GetSerializedTransactionType,\n type GetSerializedTransactionTypeErrorType,\n getSerializedTransactionType,\n} from './getSerializedTransactionType.js'\n\nexport type ParseTransactionReturnType<\n serialized extends TransactionSerializedGeneric = TransactionSerialized,\n type extends TransactionType = GetSerializedTransactionType<serialized>,\n> = IsNarrowable<serialized, Hex> extends true\n ?\n | (type extends 'eip1559' ? TransactionSerializableEIP1559 : never)\n | (type extends 'eip2930' ? TransactionSerializableEIP2930 : never)\n | (type extends 'eip4844'\n ? TransactionSerializableEIP4844<bigint, number, false>\n : never)\n | (type extends 'eip7702' ? TransactionSerializableEIP7702 : never)\n | (type extends 'legacy' ? TransactionSerializableLegacy : never)\n : TransactionSerializable\n\nexport type ParseTransactionErrorType =\n | GetSerializedTransactionTypeErrorType\n | ParseTransactionEIP1559ErrorType\n | ParseTransactionEIP2930ErrorType\n | ParseTransactionEIP4844ErrorType\n | ParseTransactionEIP7702ErrorType\n | ParseTransactionLegacyErrorType\n\nexport function parseTransaction<\n const serialized extends TransactionSerializedGeneric,\n>(serializedTransaction: serialized): ParseTransactionReturnType<serialized> {\n const type = getSerializedTransactionType(serializedTransaction)\n\n if (type === 'eip1559')\n return parseTransactionEIP1559(\n serializedTransaction as TransactionSerializedEIP1559,\n ) as ParseTransactionReturnType<serialized>\n\n if (type === 'eip2930')\n return parseTransactionEIP2930(\n serializedTransaction as TransactionSerializedEIP2930,\n ) as ParseTransactionReturnType<serialized>\n\n if (type === 'eip4844')\n return parseTransactionEIP4844(\n serializedTransaction as TransactionSerializedEIP4844,\n ) as ParseTransactionReturnType<serialized>\n\n if (type === 'eip7702')\n return parseTransactionEIP7702(\n serializedTransaction as TransactionSerializedEIP7702,\n ) as ParseTransactionReturnType<serialized>\n\n return parseTransactionLegacy(\n serializedTransaction,\n ) as ParseTransactionReturnType<serialized>\n}\n\ntype ParseTransactionEIP7702ErrorType =\n | ToTransactionArrayErrorType\n | AssertTransactionEIP7702ErrorType\n | ToTransactionArrayErrorType\n | HexToBigIntErrorType\n | HexToNumberErrorType\n | InvalidLegacyVErrorType\n | InvalidSerializedTransactionErrorType\n | IsHexErrorType\n | ParseAuthorizationListErrorType\n | ParseEIP155SignatureErrorType\n | ErrorType\n\nfunction parseTransactionEIP7702(\n serializedTransaction: TransactionSerializedEIP7702,\n): TransactionSerializableEIP7702 {\n const transactionArray = toTransactionArray(serializedTransaction)\n\n const [\n chainId,\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gas,\n to,\n value,\n data,\n accessList,\n authorizationList,\n v,\n r,\n s,\n ] = transactionArray\n\n if (transactionArray.length !== 10 && transactionArray.length !== 13)\n throw new InvalidSerializedTransactionError({\n attributes: {\n chainId,\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gas,\n to,\n value,\n data,\n accessList,\n authorizationList,\n ...(transactionArray.length > 9\n ? {\n v,\n r,\n s,\n }\n : {}),\n },\n serializedTransaction,\n type: 'eip7702',\n })\n\n const transaction = {\n chainId: hexToNumber(chainId as Hex),\n type: 'eip7702',\n } as TransactionSerializableEIP7702\n if (isHex(to) && to !== '0x') transaction.to = to\n if (isHex(gas) && gas !== '0x') transaction.gas = hexToBigInt(gas)\n if (isHex(data) && data !== '0x') transaction.data = data\n if (isHex(nonce)) transaction.nonce = nonce === '0x' ? 0 : hexToNumber(nonce)\n if (isHex(value) && value !== '0x') transaction.value = hexToBigInt(value)\n if (isHex(maxFeePerGas) && maxFeePerGas !== '0x')\n transaction.maxFeePerGas = hexToBigInt(maxFeePerGas)\n if (isHex(maxPriorityFeePerGas) && maxPriorityFeePerGas !== '0x')\n transaction.maxPriorityFeePerGas = hexToBigInt(maxPriorityFeePerGas)\n if (accessList.length !== 0 && accessList !== '0x')\n transaction.accessList = parseAccessList(accessList as RecursiveArray<Hex>)\n if (authorizationList.length !== 0 && authorizationList !== '0x')\n transaction.authorizationList = parseAuthorizationList(\n authorizationList as SerializedAuthorizationList,\n )\n\n assertTransactionEIP7702(transaction)\n\n const signature =\n transactionArray.length === 13\n ? parseEIP155Signature(transactionArray as RecursiveArray<Hex>)\n : undefined\n\n return { ...signature, ...transaction }\n}\n\ntype ParseTransactionEIP4844ErrorType =\n | ToTransactionArrayErrorType\n | AssertTransactionEIP4844ErrorType\n | ToTransactionArrayErrorType\n | HexToBigIntErrorType\n | HexToNumberErrorType\n | InvalidLegacyVErrorType\n | InvalidSerializedTransactionErrorType\n | IsHexErrorType\n | ParseEIP155SignatureErrorType\n | ErrorType\n\nfunction parseTransactionEIP4844(\n serializedTransaction: TransactionSerializedEIP4844,\n): TransactionSerializableEIP4844 {\n const transactionOrWrapperArray = toTransactionArray(serializedTransaction)\n\n const hasNetworkWrapper = transactionOrWrapperArray.length === 4\n\n const transactionArray = hasNetworkWrapper\n ? transactionOrWrapperArray[0]\n : transactionOrWrapperArray\n const wrapperArray = hasNetworkWrapper\n ? transactionOrWrapperArray.slice(1)\n : []\n\n const [\n chainId,\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gas,\n to,\n value,\n data,\n accessList,\n maxFeePerBlobGas,\n blobVersionedHashes,\n v,\n r,\n s,\n ] = transactionArray\n const [blobs, commitments, proofs] = wrapperArray\n\n if (!(transactionArray.length === 11 || transactionArray.length === 14))\n throw new InvalidSerializedTransactionError({\n attributes: {\n chainId,\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gas,\n to,\n value,\n data,\n accessList,\n ...(transactionArray.length > 9\n ? {\n v,\n r,\n s,\n }\n : {}),\n },\n serializedTransaction,\n type: 'eip4844',\n })\n\n const transaction = {\n blobVersionedHashes: blobVersionedHashes as Hex[],\n chainId: hexToNumber(chainId as Hex),\n to,\n type: 'eip4844',\n } as TransactionSerializableEIP4844\n if (isHex(gas) && gas !== '0x') transaction.gas = hexToBigInt(gas)\n if (isHex(data) && data !== '0x') transaction.data = data\n if (isHex(nonce)) transaction.nonce = nonce === '0x' ? 0 : hexToNumber(nonce)\n if (isHex(value) && value !== '0x') transaction.value = hexToBigInt(value)\n if (isHex(maxFeePerBlobGas) && maxFeePerBlobGas !== '0x')\n transaction.maxFeePerBlobGas = hexToBigInt(maxFeePerBlobGas)\n if (isHex(maxFeePerGas) && maxFeePerGas !== '0x')\n transaction.maxFeePerGas = hexToBigInt(maxFeePerGas)\n if (isHex(maxPriorityFeePerGas) && maxPriorityFeePerGas !== '0x')\n transaction.maxPriorityFeePerGas = hexToBigInt(maxPriorityFeePerGas)\n if (accessList.length !== 0 && accessList !== '0x')\n transaction.accessList = parseAccessList(accessList as RecursiveArray<Hex>)\n if (blobs && commitments && proofs)\n transaction.sidecars = toBlobSidecars({\n blobs: blobs as Hex[],\n commitments: commitments as Hex[],\n proofs: proofs as Hex[],\n })\n\n assertTransactionEIP4844(transaction)\n\n const signature =\n transactionArray.length === 14\n ? parseEIP155Signature(transactionArray as RecursiveArray<Hex>)\n : undefined\n\n return { ...signature, ...transaction }\n}\n\ntype ParseTransactionEIP1559ErrorType =\n | ToTransactionArrayErrorType\n | AssertTransactionEIP1559ErrorType\n | ToTransactionArrayErrorType\n | HexToBigIntErrorType\n | HexToNumberErrorType\n | InvalidLegacyVErrorType\n | InvalidSerializedTransactionErrorType\n | IsHexErrorType\n | ParseEIP155SignatureErrorType\n | ParseAccessListErrorType\n | ErrorType\n\nfunction parseTransactionEIP1559(\n serializedTransaction: TransactionSerializedEIP1559,\n): TransactionSerializableEIP1559 {\n const transactionArray = toTransactionArray(serializedTransaction)\n\n const [\n chainId,\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gas,\n to,\n value,\n data,\n accessList,\n v,\n r,\n s,\n ] = transactionArray\n\n if (!(transactionArray.length === 9 || transactionArray.length === 12))\n throw new InvalidSerializedTransactionError({\n attributes: {\n chainId,\n nonce,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gas,\n to,\n value,\n data,\n accessList,\n ...(transactionArray.length > 9\n ? {\n v,\n r,\n s,\n }\n : {}),\n },\n serializedTransaction,\n type: 'eip1559',\n })\n\n const transaction: TransactionSerializableEIP1559 = {\n chainId: hexToNumber(chainId as Hex),\n type: 'eip1559',\n }\n if (isHex(to) && to !== '0x') transaction.to = to\n if (isHex(gas) && gas !== '0x') transaction.gas = hexToBigInt(gas)\n if (isHex(data) && data !== '0x') transaction.data = data\n if (isHex(nonce)) transaction.nonce = nonce === '0x' ? 0 : hexToNumber(nonce)\n if (isHex(value) && value !== '0x') transaction.value = hexToBigInt(value)\n if (isHex(maxFeePerGas) && maxFeePerGas !== '0x')\n transaction.maxFeePerGas = hexToBigInt(maxFeePerGas)\n if (isHex(maxPriorityFeePerGas) && maxPriorityFeePerGas !== '0x')\n transaction.maxPriorityFeePerGas = hexToBigInt(maxPriorityFeePerGas)\n if (accessList.length !== 0 && accessList !== '0x')\n transaction.accessList = parseAccessList(accessList as RecursiveArray<Hex>)\n\n assertTransactionEIP1559(transaction)\n\n const signature =\n transactionArray.length === 12\n ? parseEIP155Signature(transactionArray)\n : undefined\n\n return { ...signature, ...transaction }\n}\n\ntype ParseTransactionEIP2930ErrorType =\n | ToTransactionArrayErrorType\n | AssertTransactionEIP2930ErrorType\n | ToTransactionArrayErrorType\n | HexToBigIntErrorType\n | HexToNumberErrorType\n | InvalidLegacyVErrorType\n | InvalidSerializedTransactionErrorType\n | IsHexErrorType\n | ParseEIP155SignatureErrorType\n | ParseAccessListErrorType\n | ErrorType\n\nfunction parseTransactionEIP2930(\n serializedTransaction: TransactionSerializedEIP2930,\n): Omit<TransactionRequestEIP2930, 'from'> &\n ({ chainId: number } | ({ chainId: number } & Signature)) {\n const transactionArray = toTransactionArray(serializedTransaction)\n\n const [chainId, nonce, gasPrice, gas, to, value, data, accessList, v, r, s] =\n transactionArray\n\n if (!(transactionArray.length === 8 || transactionArray.length === 11))\n throw new InvalidSerializedTransactionError({\n attributes: {\n chainId,\n nonce,\n gasPrice,\n gas,\n to,\n value,\n data,\n accessList,\n ...(transactionArray.length > 8\n ? {\n v,\n r,\n s,\n }\n : {}),\n },\n serializedTransaction,\n type: 'eip2930',\n })\n\n const transaction: TransactionSerializableEIP2930 = {\n chainId: hexToNumber(chainId as Hex),\n type: 'eip2930',\n }\n if (isHex(to) && to !== '0x') transaction.to = to\n if (isHex(gas) && gas !== '0x') transaction.gas = hexToBigInt(gas)\n if (isHex(data) && data !== '0x') transaction.data = data\n if (isHex(nonce)) transaction.nonce = nonce === '0x' ? 0 : hexToNumber(nonce)\n if (isHex(value) && value !== '0x') transaction.value = hexToBigInt(value)\n if (isHex(gasPrice) && gasPrice !== '0x')\n transaction.gasPrice = hexToBigInt(gasPrice)\n if (accessList.length !== 0 && accessList !== '0x')\n transaction.accessList = parseAccessList(accessList as RecursiveArray<Hex>)\n\n assertTransactionEIP2930(transaction)\n\n const signature =\n transactionArray.length === 11\n ? parseEIP155Signature(transactionArray)\n : undefined\n\n return { ...signature, ...transaction }\n}\n\ntype ParseTransactionLegacyErrorType =\n | AssertTransactionLegacyErrorType\n | FromRlpErrorType\n | HexToBigIntErrorType\n | HexToNumberErrorType\n | InvalidLegacyVErrorType\n | InvalidSerializedTransactionErrorType\n | IsHexErrorType\n | ErrorType\n\nfunction parseTransactionLegacy(\n serializedTransaction: Hex,\n): Omit<TransactionRequestLegacy, 'from'> &\n ({ chainId?: number | undefined } | ({ chainId: number } & Signature)) {\n const transactionArray = fromRlp(serializedTransaction, 'hex')\n\n const [nonce, gasPrice, gas, to, value, data, chainIdOrV_, r, s] =\n transactionArray\n\n if (!(transactionArray.length === 6 || transactionArray.length === 9))\n throw new InvalidSerializedTransactionError({\n attributes: {\n nonce,\n gasPrice,\n gas,\n to,\n value,\n data,\n ...(transactionArray.length > 6\n ? {\n v: chainIdOrV_,\n r,\n s,\n }\n : {}),\n },\n serializedTransaction,\n type: 'legacy',\n })\n\n const transaction: TransactionSerializableLegacy = {\n type: 'legacy',\n }\n if (isHex(to) && to !== '0x') transaction.to = to\n if (isHex(gas) && gas !== '0x') transaction.gas = hexToBigInt(gas)\n if (isHex(data) && data !== '0x') transaction.data = data\n if (isHex(nonce)) transaction.nonce = nonce === '0x' ? 0 : hexToNumber(nonce)\n if (isHex(value) && value !== '0x') transaction.value = hexToBigInt(value)\n if (isHex(gasPrice) && gasPrice !== '0x')\n transaction.gasPrice = hexToBigInt(gasPrice)\n\n assertTransactionLegacy(transaction)\n\n if (transactionArray.length === 6) return transaction\n\n const chainIdOrV =\n isHex(chainIdOrV_) && chainIdOrV_ !== '0x'\n ? hexToBigInt(chainIdOrV_ as Hex)\n : 0n\n\n if (s === '0x' && r === '0x') {\n if (chainIdOrV > 0) transaction.chainId = Number(chainIdOrV)\n return transaction\n }\n\n const v = chainIdOrV\n\n const chainId: number | undefined = Number((v - 35n) / 2n)\n if (chainId > 0) transaction.chainId = chainId\n else if (v !== 27n && v !== 28n) throw new InvalidLegacyVError({ v })\n\n transaction.v = v\n transaction.s = s as Hex\n transaction.r = r as Hex\n transaction.yParity = v % 2n === 0n ? 1 : 0\n\n return transaction\n}\n\ntype ToTransactionArrayErrorType = FromRlpErrorType | ErrorType\n\nexport function toTransactionArray(serializedTransaction: string) {\n return fromRlp(`0x${serializedTransaction.slice(4)}` as Hex, 'hex')\n}\n\ntype ParseAccessListErrorType =\n | InvalidAddressErrorType\n | IsAddressErrorType\n | ErrorType\n\nexport function parseAccessList(accessList_: RecursiveArray<Hex>): AccessList {\n const accessList: Mutable<AccessList> = []\n for (let i = 0; i < accessList_.length; i++) {\n const [address, storageKeys] = accessList_[i] as [Hex, Hex[]]\n\n if (!isAddress(address, { strict: false }))\n throw new InvalidAddressError({ address })\n\n accessList.push({\n address: address,\n storageKeys: storageKeys.map((key) => (isHash(key) ? key : trim(key))),\n })\n }\n return accessList\n}\n\ntype ParseAuthorizationListErrorType =\n | HexToNumberErrorType\n | ParseEIP155SignatureErrorType\n | ErrorType\n\nfunction parseAuthorizationList(\n serializedAuthorizationList: SerializedAuthorizationList,\n): SignedAuthorizationList {\n const authorizationList: Mutable<SignedAuthorizationList> = []\n for (let i = 0; i < serializedAuthorizationList.length; i++) {\n const [chainId, address, nonce, yParity, r, s] =\n serializedAuthorizationList[i]\n\n authorizationList.push({\n address,\n chainId: chainId === '0x' ? 0 : hexToNumber(chainId),\n nonce: nonce === '0x' ? 0 : hexToNumber(nonce),\n ...parseEIP155Signature([yParity, r, s]),\n })\n }\n return authorizationList\n}\n\ntype ParseEIP155SignatureErrorType =\n | HexToBigIntErrorType\n | PadHexErrorType\n | ErrorType\n\nfunction parseEIP155Signature(\n transactionArray: RecursiveArray<Hex>,\n): Signature & { yParity: number } {\n const signature = transactionArray.slice(-3)\n const v =\n signature[0] === '0x' || hexToBigInt(signature[0] as Hex) === 0n ? 27n : 28n\n return {\n r: padHex(signature[1] as Hex, { size: 32 }),\n s: padHex(signature[2] as Hex, { size: 32 }),\n v,\n yParity: v === 27n ? 0 : 1,\n }\n}\n","import { BaseError } from './base.js'\n\nexport type InvalidDecimalNumberErrorType = InvalidDecimalNumberError & {\n name: 'InvalidDecimalNumberError'\n}\nexport class InvalidDecimalNumberError extends BaseError {\n constructor({ value }: { value: string }) {\n super(`Number \\`${value}\\` is not a valid decimal number.`, {\n name: 'InvalidDecimalNumberError',\n })\n }\n}\n","import { InvalidDecimalNumberError } from '../../errors/unit.js'\nimport type { ErrorType } from '../../errors/utils.js'\n\nexport type ParseUnitsErrorType = ErrorType\n\n/**\n * Multiplies a string representation of a number by a given exponent of base 10 (10exponent).\n *\n * - Docs: https://viem.sh/docs/utilities/parseUnits\n *\n * @example\n * import { parseUnits } from 'viem'\n *\n * parseUnits('420', 9)\n * // 420000000000n\n */\nexport function parseUnits(value: string, decimals: number) {\n if (!/^(-?)([0-9]*)\\.?([0-9]*)$/.test(value))\n throw new InvalidDecimalNumberError({ value })\n\n let [integer, fraction = '0'] = value.split('.')\n\n const negative = integer.startsWith('-')\n if (negative) integer = integer.slice(1)\n\n // trim trailing zeros.\n fraction = fraction.replace(/(0+)$/, '')\n\n // round off if the fraction is larger than the number of decimals.\n if (decimals === 0) {\n if (Math.round(Number(`.${fraction}`)) === 1)\n integer = `${BigInt(integer) + 1n}`\n fraction = ''\n } else if (fraction.length > decimals) {\n const [left, unit, right] = [\n fraction.slice(0, decimals - 1),\n fraction.slice(decimals - 1, decimals),\n fraction.slice(decimals),\n ]\n\n const rounded = Math.round(Number(`${unit}.${right}`))\n if (rounded > 9)\n fraction = `${BigInt(left) + BigInt(1)}0`.padStart(left.length + 1, '0')\n else fraction = `${left}${rounded}`\n\n if (fraction.length > decimals) {\n fraction = fraction.slice(1)\n integer = `${BigInt(integer) + 1n}`\n }\n\n fraction = fraction.slice(0, decimals)\n } else {\n fraction = fraction.padEnd(decimals, '0')\n }\n\n return BigInt(`${negative ? '-' : ''}${integer}${fraction}`)\n}\n","import type { Address } from '../../accounts/index.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n TransactionNotFoundError,\n type TransactionNotFoundErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { BlockTag } from '../../types/block.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { RpcTransaction } from '../../types/rpc.js'\nimport type { OneOf, Prettify } from '../../types/utils.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport {\n type FormattedTransaction,\n formatTransaction,\n} from '../../utils/formatters/transaction.js'\n\nexport type GetTransactionParameters<blockTag extends BlockTag = 'latest'> =\n OneOf<\n // eth_getTransactionByBlockHashAndIndex\n | {\n /** The block hash */\n blockHash: Hash\n /** The index of the transaction on the block. */\n index: number\n }\n // eth_getTransactionByBlockNumberAndIndex\n | {\n /** The block number */\n blockNumber: bigint\n /** The index of the transaction on the block. */\n index: number\n }\n // eth_getTransactionByBlockNumberAndIndex\n | {\n /** The block tag. */\n blockTag: blockTag | BlockTag\n /** The index of the transaction on the block. */\n index: number\n }\n // eth_getTransactionByHash\n | {\n /** The hash of the transaction. */\n hash: Hash\n }\n // eth_getTransactionBySenderAndNonce\n | {\n /** The sender of the transaction. */\n sender: Address\n /** The nonce of the transaction on the sender. */\n nonce: number\n }\n >\n\nexport type GetTransactionReturnType<\n chain extends Chain | undefined = undefined,\n blockTag extends BlockTag = 'latest',\n> = Prettify<FormattedTransaction<chain, blockTag>>\n\nexport type GetTransactionErrorType =\n | TransactionNotFoundErrorType\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Returns information about a [Transaction](https://viem.sh/docs/glossary/terms#transaction) given a hash or block identifier.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransaction\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionByHash`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionByHash)\n *\n * @param client - Client to use\n * @param parameters - {@link GetTransactionParameters}\n * @returns The transaction information. {@link GetTransactionReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getTransaction } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transaction = await getTransaction(client, {\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\nexport async function getTransaction<\n chain extends Chain | undefined,\n blockTag extends BlockTag = 'latest',\n>(\n client: Client<Transport, chain>,\n {\n blockHash,\n blockNumber,\n blockTag: blockTag_,\n hash,\n index,\n sender,\n nonce,\n }: GetTransactionParameters<blockTag>,\n): Promise<GetTransactionReturnType<chain, blockTag>> {\n const blockTag = blockTag_ || 'latest'\n\n const blockNumberHex =\n blockNumber !== undefined ? numberToHex(blockNumber) : undefined\n\n let transaction: RpcTransaction | null = null\n if (hash) {\n transaction = await client.request(\n {\n method: 'eth_getTransactionByHash',\n params: [hash],\n },\n { dedupe: true },\n )\n } else if (blockHash) {\n transaction = await client.request(\n {\n method: 'eth_getTransactionByBlockHashAndIndex',\n params: [blockHash, numberToHex(index)],\n },\n { dedupe: true },\n )\n } else if ((blockNumberHex || blockTag) && typeof index === 'number') {\n transaction = await client.request(\n {\n method: 'eth_getTransactionByBlockNumberAndIndex',\n params: [blockNumberHex || blockTag, numberToHex(index)],\n },\n { dedupe: Boolean(blockNumberHex) },\n )\n } else if (sender && typeof nonce === 'number') {\n transaction = await client.request(\n {\n method: 'eth_getTransactionBySenderAndNonce',\n params: [sender, numberToHex(nonce)],\n },\n { dedupe: true },\n )\n }\n\n if (!transaction)\n throw new TransactionNotFoundError({\n blockHash,\n blockNumber,\n blockTag,\n hash,\n index,\n })\n\n const format =\n client.chain?.formatters?.transaction?.format || formatTransaction\n return format(transaction, 'getTransaction')\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n TransactionReceiptNotFoundError,\n type TransactionReceiptNotFoundErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type FormattedTransactionReceipt,\n formatTransactionReceipt,\n} from '../../utils/formatters/transactionReceipt.js'\n\nexport type GetTransactionReceiptParameters = {\n /** The hash of the transaction. */\n hash: Hash\n}\n\nexport type GetTransactionReceiptReturnType<\n chain extends Chain | undefined = undefined,\n> = FormattedTransactionReceipt<chain>\n\nexport type GetTransactionReceiptErrorType =\n | RequestErrorType\n | TransactionReceiptNotFoundErrorType\n | ErrorType\n\n/**\n * Returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt) given a [Transaction](https://viem.sh/docs/glossary/terms#transaction) hash.\n *\n * - Docs: https://viem.sh/docs/actions/public/getTransactionReceipt\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_fetching-transactions\n * - JSON-RPC Methods: [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_gettransactionreceipt)\n *\n * @param client - Client to use\n * @param parameters - {@link GetTransactionReceiptParameters}\n * @returns The transaction receipt. {@link GetTransactionReceiptReturnType}\n *\n * @example\n * import { createPublicClient, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { getTransactionReceipt } from 'viem/public'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionReceipt = await getTransactionReceipt(client, {\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\nexport async function getTransactionReceipt<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n { hash }: GetTransactionReceiptParameters,\n) {\n const receipt = await client.request(\n {\n method: 'eth_getTransactionReceipt',\n params: [hash],\n },\n { dedupe: true },\n )\n\n if (!receipt) throw new TransactionReceiptNotFoundError({ hash })\n\n const format =\n client.chain?.formatters?.transactionReceipt?.format ||\n formatTransactionReceipt\n return format(\n receipt,\n 'getTransactionReceipt',\n ) as GetTransactionReceiptReturnType<chain>\n}\n","import type { AbiStateMutability, Address, Narrow } from 'abitype'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { multicall3Abi } from '../../constants/abis.js'\nimport { multicall3Bytecode } from '../../constants/contracts.js'\nimport { AbiDecodingZeroDataError } from '../../errors/abi.js'\nimport { BaseError } from '../../errors/base.js'\nimport { RawContractError } from '../../errors/contract.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ContractFunctionParameters } from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport type {\n MulticallContracts,\n MulticallResults,\n} from '../../types/multicall.js'\nimport {\n type DecodeFunctionResultErrorType,\n decodeFunctionResult,\n} from '../../utils/abi/decodeFunctionResult.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetChainContractAddressErrorType,\n getChainContractAddress,\n} from '../../utils/chain/getChainContractAddress.js'\nimport {\n type GetContractErrorReturnType,\n getContractError,\n} from '../../utils/errors/getContractError.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { CallParameters } from './call.js'\nimport { type ReadContractErrorType, readContract } from './readContract.js'\n\nexport type MulticallParameters<\n contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n allowFailure extends boolean = true,\n options extends {\n optional?: boolean\n properties?: Record<string, any>\n } = {},\n> = Pick<\n CallParameters,\n | 'authorizationList'\n | 'blockNumber'\n | 'blockOverrides'\n | 'blockTag'\n | 'stateOverride'\n> & {\n /** The account to use for the multicall. */\n account?: Address | undefined\n /** Whether to allow failures. */\n allowFailure?: allowFailure | boolean | undefined\n /** The size of each batch of calls. */\n batchSize?: number | undefined\n /** Enable deployless multicall. */\n deployless?: boolean | undefined\n /** The contracts to call. */\n contracts: MulticallContracts<\n Narrow<contracts>,\n { mutability: AbiStateMutability } & options\n >\n /** The address of the multicall3 contract to use. */\n multicallAddress?: Address | undefined\n}\n\nexport type MulticallReturnType<\n contracts extends readonly unknown[] = readonly ContractFunctionParameters[],\n allowFailure extends boolean = true,\n options extends {\n error?: Error\n } = { error: Error },\n> = MulticallResults<\n Narrow<contracts>,\n allowFailure,\n { mutability: AbiStateMutability } & options\n>\n\nexport type MulticallErrorType =\n | GetChainContractAddressErrorType\n | ReadContractErrorType\n | GetContractErrorReturnType<\n EncodeFunctionDataErrorType | DecodeFunctionResultErrorType\n >\n | ErrorType\n\n/**\n * Similar to [`readContract`](https://viem.sh/docs/contract/readContract), but batches up multiple functions on a contract in a single RPC call via the [`multicall3` contract](https://github.com/mds1/multicall).\n *\n * - Docs: https://viem.sh/docs/contract/multicall\n *\n * @param client - Client to use\n * @param parameters - {@link MulticallParameters}\n * @returns An array of results with accompanying status. {@link MulticallReturnType}\n *\n * @example\n * import { createPublicClient, http, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { multicall } from 'viem/contract'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const abi = parseAbi([\n * 'function balanceOf(address) view returns (uint256)',\n * 'function totalSupply() view returns (uint256)',\n * ])\n * const results = await multicall(client, {\n * contracts: [\n * {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi,\n * functionName: 'balanceOf',\n * args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],\n * },\n * {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi,\n * functionName: 'totalSupply',\n * },\n * ],\n * })\n * // [{ result: 424122n, status: 'success' }, { result: 1000000n, status: 'success' }]\n */\nexport async function multicall<\n const contracts extends readonly unknown[],\n chain extends Chain | undefined,\n allowFailure extends boolean = true,\n>(\n client: Client<Transport, chain>,\n parameters: MulticallParameters<contracts, allowFailure>,\n): Promise<MulticallReturnType<contracts, allowFailure>> {\n const {\n account,\n authorizationList,\n allowFailure = true,\n blockNumber,\n blockOverrides,\n blockTag,\n stateOverride,\n } = parameters\n const contracts = parameters.contracts as ContractFunctionParameters[]\n\n const {\n batchSize = parameters.batchSize ?? 1024,\n deployless = parameters.deployless ?? false,\n } = typeof client.batch?.multicall === 'object' ? client.batch.multicall : {}\n\n const multicallAddress = (() => {\n if (parameters.multicallAddress) return parameters.multicallAddress\n if (deployless) return null\n if (client.chain) {\n return getChainContractAddress({\n blockNumber,\n chain: client.chain,\n contract: 'multicall3',\n })\n }\n throw new Error(\n 'client chain not configured. multicallAddress is required.',\n )\n })()\n\n type Aggregate3Calls = {\n allowFailure: boolean\n callData: Hex\n target: Address\n }[]\n\n const chunkedCalls: Aggregate3Calls[] = [[]]\n let currentChunk = 0\n let currentChunkSize = 0\n for (let i = 0; i < contracts.length; i++) {\n const { abi, address, args, functionName } = contracts[i]\n try {\n const callData = encodeFunctionData({ abi, args, functionName })\n\n currentChunkSize += (callData.length - 2) / 2\n // Check to see if we need to create a new chunk.\n if (\n // Check if batching is enabled.\n batchSize > 0 &&\n // Check if the current size of the batch exceeds the size limit.\n currentChunkSize > batchSize &&\n // Check if the current chunk is not already empty.\n chunkedCalls[currentChunk].length > 0\n ) {\n currentChunk++\n currentChunkSize = (callData.length - 2) / 2\n chunkedCalls[currentChunk] = []\n }\n\n chunkedCalls[currentChunk] = [\n ...chunkedCalls[currentChunk],\n {\n allowFailure: true,\n callData,\n target: address,\n },\n ]\n } catch (err) {\n const error = getContractError(err as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/multicall',\n functionName,\n sender: account,\n })\n if (!allowFailure) throw error\n chunkedCalls[currentChunk] = [\n ...chunkedCalls[currentChunk],\n {\n allowFailure: true,\n callData: '0x' as Hex,\n target: address,\n },\n ]\n }\n }\n\n const aggregate3Results = await Promise.allSettled(\n chunkedCalls.map((calls) =>\n getAction(\n client,\n readContract,\n 'readContract',\n )({\n ...(multicallAddress === null\n ? { code: multicall3Bytecode }\n : { address: multicallAddress }),\n abi: multicall3Abi,\n account,\n args: [calls],\n authorizationList,\n blockNumber,\n blockOverrides,\n blockTag,\n functionName: 'aggregate3',\n stateOverride,\n }),\n ),\n )\n\n const results = []\n for (let i = 0; i < aggregate3Results.length; i++) {\n const result = aggregate3Results[i]\n\n // If an error occurred in a `readContract` invocation (ie. network error),\n // then append the failure reason to each contract result.\n if (result.status === 'rejected') {\n if (!allowFailure) throw result.reason\n for (let j = 0; j < chunkedCalls[i].length; j++) {\n results.push({\n status: 'failure',\n error: result.reason,\n result: undefined,\n })\n }\n continue\n }\n\n // If the `readContract` call was successful, then decode the results.\n const aggregate3Result = result.value\n for (let j = 0; j < aggregate3Result.length; j++) {\n // Extract the response from `readContract`\n const { returnData, success } = aggregate3Result[j]\n\n // Extract the request call data from the original call.\n const { callData } = chunkedCalls[i][j]\n\n // Extract the contract config for this call from the `contracts` argument\n // for decoding.\n const { abi, address, functionName, args } = contracts[\n results.length\n ] as ContractFunctionParameters\n\n try {\n if (callData === '0x') throw new AbiDecodingZeroDataError()\n if (!success) throw new RawContractError({ data: returnData })\n const result = decodeFunctionResult({\n abi,\n args,\n data: returnData,\n functionName,\n })\n results.push(allowFailure ? { result, status: 'success' } : result)\n } catch (err) {\n const error = getContractError(err as BaseError, {\n abi,\n address,\n args,\n docsPath: '/docs/contract/multicall',\n functionName,\n })\n if (!allowFailure) throw error\n results.push({ error, result: undefined, status: 'failure' })\n }\n }\n }\n\n if (results.length !== contracts.length)\n throw new BaseError('multicall results mismatch')\n return results as MulticallReturnType<contracts, allowFailure>\n}\n","export const ethAddress = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee' as const\n\nexport const zeroAddress = '0x0000000000000000000000000000000000000000' as const\n","import type * as Abi from '../core/Abi.js'\nimport * as AbiParameters from '../core/AbiParameters.js'\nimport type * as Address from '../core/Address.js'\nimport * as Errors from '../core/Errors.js'\nimport * as Hex from '../core/Hex.js'\nimport type * as Signature from '../core/Signature.js'\n\n/** Unwrapped ERC-6492 signature. */\nexport type Unwrapped = {\n /** Calldata to pass to the target address for counterfactual verification. */\n data: Hex.Hex\n /** The original signature. */\n signature: Hex.Hex\n /** The target address to use for counterfactual verification. */\n to: Address.Address\n}\n\n/** Wrapped ERC-6492 signature. */\nexport type Wrapped = Hex.Hex\n\n/**\n * Magic bytes used to identify ERC-6492 wrapped signatures.\n */\nexport const magicBytes =\n '0x6492649264926492649264926492649264926492649264926492649264926492' as const\n\n/**\n * Deployless ERC-6492 signature verification bytecode.\n */\nexport const universalSignatureValidatorBytecode =\n '0x608060405234801561001057600080fd5b5060405161069438038061069483398101604081905261002f9161051e565b600061003c848484610048565b9050806000526001601ff35b60007f64926492649264926492649264926492649264926492649264926492649264926100748361040c565b036101e7576000606080848060200190518101906100929190610577565b60405192955090935091506000906001600160a01b038516906100b69085906105dd565b6000604051808303816000865af19150503d80600081146100f3576040519150601f19603f3d011682016040523d82523d6000602084013e6100f8565b606091505b50509050876001600160a01b03163b60000361016057806101605760405162461bcd60e51b815260206004820152601e60248201527f5369676e617475726556616c696461746f723a206465706c6f796d656e74000060448201526064015b60405180910390fd5b604051630b135d3f60e11b808252906001600160a01b038a1690631626ba7e90610190908b9087906004016105f9565b602060405180830381865afa1580156101ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101d19190610633565b6001600160e01b03191614945050505050610405565b6001600160a01b0384163b1561027a57604051630b135d3f60e11b808252906001600160a01b03861690631626ba7e9061022790879087906004016105f9565b602060405180830381865afa158015610244573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102689190610633565b6001600160e01b031916149050610405565b81516041146102df5760405162461bcd60e51b815260206004820152603a602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e6174757265206c656e6774680000000000006064820152608401610157565b6102e7610425565b5060208201516040808401518451859392600091859190811061030c5761030c61065d565b016020015160f81c9050601b811480159061032b57508060ff16601c14155b1561038c5760405162461bcd60e51b815260206004820152603b602482015260008051602061067483398151915260448201527f3a20696e76616c6964207369676e617475726520762076616c756500000000006064820152608401610157565b60408051600081526020810180835289905260ff83169181019190915260608101849052608081018390526001600160a01b0389169060019060a0016020604051602081039080840390855afa1580156103ea573d6000803e3d6000fd5b505050602060405103516001600160a01b0316149450505050505b9392505050565b600060208251101561041d57600080fd5b508051015190565b60405180606001604052806003906020820280368337509192915050565b6001600160a01b038116811461045857600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b60005b8381101561048c578181015183820152602001610474565b50506000910152565b600082601f8301126104a657600080fd5b81516001600160401b038111156104bf576104bf61045b565b604051601f8201601f19908116603f011681016001600160401b03811182821017156104ed576104ed61045b565b60405281815283820160200185101561050557600080fd5b610516826020830160208701610471565b949350505050565b60008060006060848603121561053357600080fd5b835161053e81610443565b6020850151604086015191945092506001600160401b0381111561056157600080fd5b61056d86828701610495565b9150509250925092565b60008060006060848603121561058c57600080fd5b835161059781610443565b60208501519093506001600160401b038111156105b357600080fd5b6105bf86828701610495565b604086015190935090506001600160401b0381111561056157600080fd5b600082516105ef818460208701610471565b9190910192915050565b828152604060208201526000825180604084015261061e816060850160208701610471565b601f01601f1916919091016060019392505050565b60006020828403121561064557600080fd5b81516001600160e01b03198116811461040557600080fd5b634e487b7160e01b600052603260045260246000fdfe5369676e617475726556616c696461746f72237265636f7665725369676e6572'\n\n/**\n * ABI for the ERC-6492 universal deployless signature validator contract.\n *\n * Constructor return value is `0x1` (valid) or `0x0` (invalid).\n */\nexport const universalSignatureValidatorAbi = [\n {\n inputs: [\n {\n name: '_signer',\n type: 'address',\n },\n {\n name: '_hash',\n type: 'bytes32',\n },\n {\n name: '_signature',\n type: 'bytes',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'constructor',\n },\n {\n inputs: [\n {\n name: '_signer',\n type: 'address',\n },\n {\n name: '_hash',\n type: 'bytes32',\n },\n {\n name: '_signature',\n type: 'bytes',\n },\n ],\n outputs: [\n {\n type: 'bool',\n },\n ],\n stateMutability: 'nonpayable',\n type: 'function',\n name: 'isValidSig',\n },\n] as const satisfies Abi.Abi\n\n/**\n * Asserts that the wrapped signature is valid.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc6492 } from 'ox/erc6492'\n *\n * SignatureErc6492.assert('0xdeadbeef')\n * // @error: InvalidWrappedSignatureError: Value `0xdeadbeef` is an invalid ERC-6492 wrapped signature.\n * ```\n *\n * @param wrapped - The wrapped signature to assert.\n */\nexport function assert(wrapped: Wrapped) {\n if (Hex.slice(wrapped, -32) !== magicBytes)\n throw new InvalidWrappedSignatureError(wrapped)\n}\n\nexport declare namespace assert {\n type ErrorType =\n | InvalidWrappedSignatureError\n | Hex.slice.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Parses an [ERC-6492 wrapped signature](https://eips.ethereum.org/EIPS/eip-6492#specification) into its constituent parts.\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1 } from 'ox'\n * import { SignatureErc6492 } from 'ox/erc6492' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: '0x...',\n * privateKey: '0x...',\n * })\n *\n * // Instantiate from serialized format. // [!code focus]\n * const wrapped = SignatureErc6492.from('0x...') // [!code focus]\n * // @log: { data: '0x...', signature: { ... }, to: '0x...', } // [!code focus]\n *\n * // Instantiate from constituent parts. // [!code focus]\n * const wrapped = SignatureErc6492.from({ // [!code focus]\n * data: '0x...', // [!code focus]\n * signature, // [!code focus]\n * to: '0x...', // [!code focus]\n * })\n * // @log: { data: '0x...', signature: { ... }, to: '0x...', }\n * ```\n *\n * @param wrapped - Wrapped signature to parse.\n * @returns Wrapped signature.\n */\nexport function from(wrapped: Unwrapped | Wrapped): Unwrapped {\n if (typeof wrapped === 'string') return unwrap(wrapped)\n return wrapped\n}\n\nexport declare namespace from {\n type ReturnType = Unwrapped\n\n type ErrorType =\n | AbiParameters.from.ErrorType\n | AbiParameters.decode.ErrorType\n | Signature.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Parses an [ERC-6492 wrapped signature](https://eips.ethereum.org/EIPS/eip-6492#specification) into its constituent parts.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc6492 } from 'ox/erc6492'\n *\n * const { data, signature, to } = SignatureErc6492.unwrap('0x...')\n * ```\n *\n * @param wrapped - Wrapped signature to parse.\n * @returns Wrapped signature.\n */\nexport function unwrap(wrapped: Wrapped): Unwrapped {\n assert(wrapped)\n\n const [to, data, signature] = AbiParameters.decode(\n AbiParameters.from('address, bytes, bytes'),\n wrapped,\n )\n\n return { data, signature, to }\n}\n\nexport declare namespace unwrap {\n type ErrorType =\n | AbiParameters.from.ErrorType\n | AbiParameters.decode.ErrorType\n | Signature.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Serializes an [ERC-6492 wrapped signature](https://eips.ethereum.org/EIPS/eip-6492#specification).\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1, Signature } from 'ox'\n * import { SignatureErc6492 } from 'ox/erc6492' // [!code focus]\n *\n * const signature = Secp256k1.sign({\n * payload: '0x...',\n * privateKey: '0x...',\n * })\n *\n * const wrapped = SignatureErc6492.wrap({ // [!code focus]\n * data: '0xdeadbeef', // [!code focus]\n * signature: Signature.toHex(signature), // [!code focus]\n * to: '0x00000000219ab540356cBB839Cbe05303d7705Fa', // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param value - Wrapped signature to serialize.\n * @returns Serialized wrapped signature.\n */\nexport function wrap(value: Unwrapped): Wrapped {\n const { data, signature, to } = value\n\n return Hex.concat(\n AbiParameters.encode(AbiParameters.from('address, bytes, bytes'), [\n to,\n data,\n signature,\n ]),\n magicBytes,\n )\n}\n\nexport declare namespace wrap {\n type ErrorType =\n | AbiParameters.encode.ErrorType\n | Hex.concat.ErrorType\n | Signature.toHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Validates a wrapped signature. Returns `true` if the wrapped signature is valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { SignatureErc6492 } from 'ox/erc6492'\n *\n * const valid = SignatureErc6492.validate('0xdeadbeef')\n * // @log: false\n * ```\n *\n * @param wrapped - The wrapped signature to validate.\n * @returns `true` if the wrapped signature is valid, `false` otherwise.\n */\nexport function validate(wrapped: Wrapped): boolean {\n try {\n assert(wrapped)\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/** Thrown when the ERC-6492 wrapped signature is invalid. */\nexport class InvalidWrappedSignatureError extends Errors.BaseError {\n override readonly name = 'SignatureErc6492.InvalidWrappedSignatureError'\n\n constructor(wrapped: Wrapped) {\n super(`Value \\`${wrapped}\\` is an invalid ERC-6492 wrapped signature.`)\n }\n}\n","import { secp256k1 } from '@noble/curves/secp256k1'\n\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport { type HexToBigIntErrorType, hexToBigInt } from '../encoding/fromHex.js'\nimport { hexToBytes } from '../encoding/toBytes.js'\nimport type { ToHexErrorType } from '../encoding/toHex.js'\n\ntype To = 'bytes' | 'hex'\n\nexport type SerializeSignatureParameters<to extends To = 'hex'> = Signature & {\n to?: to | To | undefined\n}\n\nexport type SerializeSignatureReturnType<to extends To = 'hex'> =\n | (to extends 'hex' ? Hex : never)\n | (to extends 'bytes' ? ByteArray : never)\n\nexport type SerializeSignatureErrorType =\n | HexToBigIntErrorType\n | ToHexErrorType\n | ErrorType\n\n/**\n * @description Converts a signature into hex format.\n *\n * @param signature The signature to convert.\n * @returns The signature in hex format.\n *\n * @example\n * serializeSignature({\n * r: '0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf',\n * s: '0x4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db8',\n * yParity: 1\n * })\n * // \"0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db81c\"\n */\nexport function serializeSignature<to extends To = 'hex'>({\n r,\n s,\n to = 'hex',\n v,\n yParity,\n}: SerializeSignatureParameters<to>): SerializeSignatureReturnType<to> {\n const yParity_ = (() => {\n if (yParity === 0 || yParity === 1) return yParity\n if (v && (v === 27n || v === 28n || v >= 35n)) return v % 2n === 0n ? 1 : 0\n throw new Error('Invalid `v` or `yParity` value')\n })()\n const signature = `0x${new secp256k1.Signature(\n hexToBigInt(r),\n hexToBigInt(s),\n ).toCompactHex()}${yParity_ === 0 ? '1b' : '1c'}` as const\n\n if (to === 'hex') return signature as SerializeSignatureReturnType<to>\n return hexToBytes(signature) as SerializeSignatureReturnType<to>\n}\n","import type { Address } from 'abitype'\nimport { SignatureErc6492 } from 'ox/erc6492'\nimport { SignatureErc8010 } from 'ox/erc8010'\n\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n erc1271Abi,\n erc6492SignatureValidatorAbi,\n multicall3Abi,\n} from '../../constants/abis.js'\nimport {\n erc6492SignatureValidatorByteCode,\n multicall3Bytecode,\n} from '../../constants/contracts.js'\nimport {\n CallExecutionError,\n ContractFunctionExecutionError,\n} from '../../errors/contract.js'\nimport type { InvalidHexBooleanError } from '../../errors/encoding.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ByteArray, Hex, Signature } from '../../types/misc.js'\nimport type { OneOf } from '../../types/utils.js'\nimport {\n type EncodeDeployDataErrorType,\n encodeDeployData,\n} from '../../utils/abi/encodeDeployData.js'\nimport {\n type EncodeFunctionDataErrorType,\n encodeFunctionData,\n} from '../../utils/abi/encodeFunctionData.js'\nimport {\n type GetAddressErrorType,\n getAddress,\n} from '../../utils/address/getAddress.js'\nimport {\n type IsAddressEqualErrorType,\n isAddressEqual,\n} from '../../utils/address/isAddressEqual.js'\nimport { verifyAuthorization } from '../../utils/authorization/verifyAuthorization.js'\nimport { type ConcatHexErrorType, concatHex } from '../../utils/data/concat.js'\nimport { type IsHexErrorType, isHex } from '../../utils/data/isHex.js'\nimport { hexToBool } from '../../utils/encoding/fromHex.js'\nimport {\n type BytesToHexErrorType,\n bytesToHex,\n type NumberToHexErrorType,\n numberToHex,\n} from '../../utils/encoding/toHex.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type RecoverAddressErrorType,\n recoverAddress,\n} from '../../utils/signature/recoverAddress.js'\nimport {\n type SerializeSignatureErrorType,\n serializeSignature,\n} from '../../utils/signature/serializeSignature.js'\nimport { type CallErrorType, type CallParameters, call } from './call.js'\nimport { type GetCodeErrorType, getCode } from './getCode.js'\nimport { type ReadContractErrorType, readContract } from './readContract.js'\n\nexport type VerifyHashParameters = Pick<\n CallParameters,\n 'blockNumber' | 'blockTag'\n> & {\n /** The address that signed the original message. */\n address: Address\n /** The chain to use. */\n chain?: Chain | null | undefined\n /** The address of the ERC-6492 signature verifier contract. */\n erc6492VerifierAddress?: Address | undefined\n /** The hash to be verified. */\n hash: Hex\n /** Multicall3 address for ERC-8010 verification. */\n multicallAddress?: Address | undefined\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex | ByteArray | Signature\n /** @deprecated use `erc6492VerifierAddress` instead. */\n universalSignatureVerifierAddress?: Address | undefined\n} & OneOf<{ factory: Address; factoryData: Hex } | {}>\n\nexport type VerifyHashReturnType = boolean\n\nexport type VerifyHashErrorType =\n | BytesToHexErrorType\n | CallErrorType\n | ConcatHexErrorType\n | EncodeDeployDataErrorType\n | EncodeFunctionDataErrorType\n | ErrorType\n | GetAddressErrorType\n | GetCodeErrorType\n | InvalidHexBooleanError\n | IsAddressEqualErrorType\n | IsHexErrorType\n | NumberToHexErrorType\n | ReadContractErrorType\n | RecoverAddressErrorType\n | SerializeSignatureErrorType\n\n/**\n * Verifies a message hash onchain using ERC-6492.\n *\n * @param client - Client to use.\n * @param parameters - {@link VerifyHashParameters}\n * @returns Whether or not the signature is valid. {@link VerifyHashReturnType}\n */\nexport async function verifyHash<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: VerifyHashParameters,\n): Promise<VerifyHashReturnType> {\n const {\n address,\n chain = client.chain,\n hash,\n erc6492VerifierAddress:\n verifierAddress = parameters.universalSignatureVerifierAddress ??\n chain?.contracts?.erc6492Verifier?.address,\n multicallAddress = parameters.multicallAddress ??\n chain?.contracts?.multicall3?.address,\n } = parameters\n\n if (chain?.verifyHash) return await chain.verifyHash(client, parameters)\n\n const signature = (() => {\n const signature = parameters.signature\n if (isHex(signature)) return signature\n if (typeof signature === 'object' && 'r' in signature && 's' in signature)\n return serializeSignature(signature)\n return bytesToHex(signature)\n })()\n\n try {\n if (SignatureErc8010.validate(signature))\n return await verifyErc8010(client, {\n ...parameters,\n multicallAddress,\n signature,\n })\n return await verifyErc6492(client, {\n ...parameters,\n verifierAddress,\n signature,\n })\n } catch (error) {\n // Fallback attempt to verify the signature via ECDSA recovery.\n try {\n const verified = isAddressEqual(\n getAddress(address),\n await recoverAddress({ hash, signature }),\n )\n if (verified) return true\n } catch {}\n\n if (error instanceof VerificationError) {\n // if the execution fails, the signature was not valid and an internal method inside of the validator reverted\n // this can happen for many reasons, for example if signer can not be recovered from the signature\n // or if the signature has no valid format\n return false\n }\n\n throw error\n }\n}\n\n/** @internal */\nexport async function verifyErc8010(\n client: Client,\n parameters: verifyErc8010.Parameters,\n) {\n const { address, blockNumber, blockTag, hash, multicallAddress } = parameters\n\n const {\n authorization: authorization_ox,\n data: initData,\n signature,\n to,\n } = SignatureErc8010.unwrap(parameters.signature)\n\n // Check if already delegated\n const code = await getCode(client, {\n address,\n blockNumber,\n blockTag,\n } as never)\n\n // If already delegated, perform standard ERC-1271 verification.\n if (code === concatHex(['0xef0100', authorization_ox.address]))\n return await verifyErc1271(client, {\n address,\n blockNumber,\n blockTag,\n hash,\n signature,\n })\n\n const authorization = {\n address: authorization_ox.address,\n chainId: Number(authorization_ox.chainId),\n nonce: Number(authorization_ox.nonce),\n r: numberToHex(authorization_ox.r, { size: 32 }),\n s: numberToHex(authorization_ox.s, { size: 32 }),\n yParity: authorization_ox.yParity,\n } as const\n\n const valid = await verifyAuthorization({\n address,\n authorization,\n })\n if (!valid) throw new VerificationError()\n\n // Deployless verification.\n const results = await getAction(\n client,\n readContract,\n 'readContract',\n )({\n ...(multicallAddress\n ? { address: multicallAddress }\n : { code: multicall3Bytecode }),\n authorizationList: [authorization],\n abi: multicall3Abi,\n blockNumber,\n blockTag: 'pending',\n functionName: 'aggregate3',\n args: [\n [\n ...(initData\n ? ([\n {\n allowFailure: true,\n target: to ?? address,\n callData: initData,\n },\n ] as const)\n : []),\n {\n allowFailure: true,\n target: address,\n callData: encodeFunctionData({\n abi: erc1271Abi,\n functionName: 'isValidSignature',\n args: [hash, signature],\n }),\n },\n ],\n ],\n })\n\n const data = results[results.length - 1]?.returnData\n\n if (data?.startsWith('0x1626ba7e')) return true\n throw new VerificationError()\n}\n\nexport namespace verifyErc8010 {\n export type Parameters = Pick<CallParameters, 'blockNumber' | 'blockTag'> & {\n /** The address that signed the original message. */\n address: Address\n /** The hash to be verified. */\n hash: Hex\n /** Multicall3 address for ERC-8010 verification. */\n multicallAddress?: Address | undefined\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex\n }\n}\n\n/** @internal */\n// biome-ignore lint/correctness/noUnusedVariables: _\nasync function verifyErc6492(\n client: Client,\n parameters: verifyErc6492.Parameters,\n) {\n const {\n address,\n factory,\n factoryData,\n hash,\n signature,\n verifierAddress,\n ...rest\n } = parameters\n\n const wrappedSignature = await (async () => {\n // If no `factory` or `factoryData` is provided, it is assumed that the\n // address is not a Smart Account, or the Smart Account is already deployed.\n if (!factory && !factoryData) return signature\n\n // If the signature is already wrapped, return the signature.\n if (SignatureErc6492.validate(signature)) return signature\n\n // If the Smart Account is not deployed, wrap the signature with a 6492 wrapper\n // to perform counterfactual validation.\n return SignatureErc6492.wrap({\n data: factoryData!,\n signature,\n to: factory!,\n })\n })()\n\n const args = verifierAddress\n ? ({\n to: verifierAddress,\n data: encodeFunctionData({\n abi: erc6492SignatureValidatorAbi,\n functionName: 'isValidSig',\n args: [address, hash, wrappedSignature],\n }),\n ...rest,\n } as unknown as CallParameters)\n : ({\n data: encodeDeployData({\n abi: erc6492SignatureValidatorAbi,\n args: [address, hash, wrappedSignature],\n bytecode: erc6492SignatureValidatorByteCode,\n }),\n ...rest,\n } as unknown as CallParameters)\n\n const { data } = await getAction(\n client,\n call,\n 'call',\n )(args).catch((error) => {\n if (error instanceof CallExecutionError) throw new VerificationError()\n throw error\n })\n\n if (hexToBool(data ?? '0x0')) return true\n throw new VerificationError()\n}\n\nexport namespace verifyErc6492 {\n export type Parameters = Pick<CallParameters, 'blockNumber' | 'blockTag'> & {\n /** The address that signed the original message. */\n address: Address\n /** The hash to be verified. */\n hash: Hex\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex\n /** The address of the ERC-6492 signature verifier contract. */\n verifierAddress?: Address | undefined\n } & OneOf<{ factory: Address; factoryData: Hex } | {}>\n}\n\n/** @internal */\nexport async function verifyErc1271(\n client: Client,\n parameters: verifyErc1271.Parameters,\n) {\n const { address, blockNumber, blockTag, hash, signature } = parameters\n\n const result = await getAction(\n client,\n readContract,\n 'readContract',\n )({\n address,\n abi: erc1271Abi,\n args: [hash, signature],\n blockNumber,\n blockTag,\n functionName: 'isValidSignature',\n }).catch((error) => {\n if (error instanceof ContractFunctionExecutionError)\n throw new VerificationError()\n throw error\n })\n\n if (result.startsWith('0x1626ba7e')) return true\n throw new VerificationError()\n}\n\nexport namespace verifyErc1271 {\n export type Parameters = Pick<CallParameters, 'blockNumber' | 'blockTag'> & {\n /** The address that signed the original message. */\n address: Address\n /** The hash to be verified. */\n hash: Hex\n /** The signature that was generated by signing the message with the address's private key. */\n signature: Hex\n }\n}\n\nclass VerificationError extends Error {}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { HasTransportType } from '../../types/transport.js'\nimport { hexToBigInt } from '../../utils/encoding/fromHex.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { observe } from '../../utils/observe.js'\nimport { type PollErrorType, poll } from '../../utils/poll.js'\nimport { stringify } from '../../utils/stringify.js'\n\nimport {\n type GetBlockNumberReturnType,\n getBlockNumber,\n} from './getBlockNumber.js'\n\nexport type OnBlockNumberParameter = GetBlockNumberReturnType\nexport type OnBlockNumberFn = (\n blockNumber: OnBlockNumberParameter,\n prevBlockNumber: OnBlockNumberParameter | undefined,\n) => void\n\nexport type WatchBlockNumberParameters<\n transport extends Transport = Transport,\n> = {\n /** The callback to call when a new block number is received. */\n onBlockNumber: OnBlockNumberFn\n /** The callback to call when an error occurred when trying to get for a new block. */\n onError?: ((error: Error) => void) | undefined\n} & (\n | (HasTransportType<transport, 'webSocket' | 'ipc'> extends true\n ? {\n emitMissed?: undefined\n emitOnBegin?: undefined\n /** Whether or not the WebSocket Transport should poll the JSON-RPC, rather than using `eth_subscribe`. */\n poll?: false | undefined\n pollingInterval?: undefined\n }\n : never)\n | {\n /** Whether or not to emit the missed block numbers to the callback. */\n emitMissed?: boolean | undefined\n /** Whether or not to emit the latest block number to the callback when the subscription opens. */\n emitOnBegin?: boolean | undefined\n poll?: true | undefined\n /** Polling frequency (in ms). Defaults to Client's pollingInterval config. */\n pollingInterval?: number | undefined\n }\n)\n\nexport type WatchBlockNumberReturnType = () => void\n\nexport type WatchBlockNumberErrorType = PollErrorType | ErrorType\n\n/**\n * Watches and returns incoming block numbers.\n *\n * - Docs: https://viem.sh/docs/actions/public/watchBlockNumber\n * - Examples: https://stackblitz.com/github/wevm/viem/tree/main/examples/blocks_watching-blocks\n * - JSON-RPC Methods:\n * - When `poll: true`, calls [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) on a polling interval.\n * - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `\"newHeads\"` event.\n *\n * @param client - Client to use\n * @param parameters - {@link WatchBlockNumberParameters}\n * @returns A function that can be invoked to stop watching for new block numbers. {@link WatchBlockNumberReturnType}\n *\n * @example\n * import { createPublicClient, watchBlockNumber, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const unwatch = watchBlockNumber(client, {\n * onBlockNumber: (blockNumber) => console.log(blockNumber),\n * })\n */\nexport function watchBlockNumber<\n chain extends Chain | undefined,\n transport extends Transport,\n>(\n client: Client<transport, chain>,\n {\n emitOnBegin = false,\n emitMissed = false,\n onBlockNumber,\n onError,\n poll: poll_,\n pollingInterval = client.pollingInterval,\n }: WatchBlockNumberParameters<transport>,\n): WatchBlockNumberReturnType {\n const enablePolling = (() => {\n if (typeof poll_ !== 'undefined') return poll_\n if (\n client.transport.type === 'webSocket' ||\n client.transport.type === 'ipc'\n )\n return false\n if (\n client.transport.type === 'fallback' &&\n (client.transport.transports[0].config.type === 'webSocket' ||\n client.transport.transports[0].config.type === 'ipc')\n )\n return false\n return true\n })()\n\n let prevBlockNumber: GetBlockNumberReturnType | undefined\n\n const pollBlockNumber = () => {\n const observerId = stringify([\n 'watchBlockNumber',\n client.uid,\n emitOnBegin,\n emitMissed,\n pollingInterval,\n ])\n\n return observe(observerId, { onBlockNumber, onError }, (emit) =>\n poll(\n async () => {\n try {\n const blockNumber = await getAction(\n client,\n getBlockNumber,\n 'getBlockNumber',\n )({ cacheTime: 0 })\n\n if (prevBlockNumber !== undefined) {\n // If the current block number is the same as the previous,\n // we can skip.\n if (blockNumber === prevBlockNumber) return\n\n // If we have missed out on some previous blocks, and the\n // `emitMissed` flag is truthy, let's emit those blocks.\n if (blockNumber - prevBlockNumber > 1 && emitMissed) {\n for (let i = prevBlockNumber + 1n; i < blockNumber; i++) {\n emit.onBlockNumber(i, prevBlockNumber)\n prevBlockNumber = i\n }\n }\n }\n\n // If the next block number is greater than the previous,\n // it is not in the past, and we can emit the new block number.\n if (\n prevBlockNumber === undefined ||\n blockNumber > prevBlockNumber\n ) {\n emit.onBlockNumber(blockNumber, prevBlockNumber)\n prevBlockNumber = blockNumber\n }\n } catch (err) {\n emit.onError?.(err as Error)\n }\n },\n {\n emitOnBegin,\n interval: pollingInterval,\n },\n ),\n )\n }\n\n const subscribeBlockNumber = () => {\n const observerId = stringify([\n 'watchBlockNumber',\n client.uid,\n emitOnBegin,\n emitMissed,\n ])\n\n return observe(observerId, { onBlockNumber, onError }, (emit) => {\n let active = true\n let unsubscribe = () => (active = false)\n ;(async () => {\n try {\n const transport = (() => {\n if (client.transport.type === 'fallback') {\n const transport = client.transport.transports.find(\n (transport: ReturnType<Transport>) =>\n transport.config.type === 'webSocket' ||\n transport.config.type === 'ipc',\n )\n if (!transport) return client.transport\n return transport.value\n }\n return client.transport\n })()\n\n const { unsubscribe: unsubscribe_ } = await transport.subscribe({\n params: ['newHeads'],\n onData(data: any) {\n if (!active) return\n const blockNumber = hexToBigInt(data.result?.number)\n emit.onBlockNumber(blockNumber, prevBlockNumber)\n prevBlockNumber = blockNumber\n },\n onError(error: Error) {\n emit.onError?.(error)\n },\n })\n unsubscribe = unsubscribe_\n if (!active) unsubscribe()\n } catch (err) {\n onError?.(err as Error)\n }\n })()\n return () => unsubscribe()\n })\n }\n\n return enablePolling ? pollBlockNumber() : subscribeBlockNumber()\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { BlockNotFoundError } from '../../errors/block.js'\nimport {\n TransactionNotFoundError,\n TransactionReceiptNotFoundError,\n WaitForTransactionReceiptTimeoutError,\n type WaitForTransactionReceiptTimeoutErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { Transaction } from '../../types/transaction.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { type ObserveErrorType, observe } from '../../utils/observe.js'\nimport { withResolvers } from '../../utils/promise/withResolvers.js'\nimport {\n type WithRetryParameters,\n withRetry,\n} from '../../utils/promise/withRetry.js'\nimport { stringify } from '../../utils/stringify.js'\n\nimport { type GetBlockErrorType, getBlock } from './getBlock.js'\nimport {\n type GetTransactionErrorType,\n type GetTransactionReturnType,\n getTransaction,\n} from './getTransaction.js'\nimport {\n type GetTransactionReceiptErrorType,\n type GetTransactionReceiptReturnType,\n getTransactionReceipt,\n} from './getTransactionReceipt.js'\nimport {\n type WatchBlockNumberErrorType,\n watchBlockNumber,\n} from './watchBlockNumber.js'\n\nexport type ReplacementReason = 'cancelled' | 'replaced' | 'repriced'\nexport type ReplacementReturnType<\n chain extends Chain | undefined = Chain | undefined,\n> = {\n reason: ReplacementReason\n replacedTransaction: Transaction\n transaction: Transaction\n transactionReceipt: GetTransactionReceiptReturnType<chain>\n}\n\nexport type WaitForTransactionReceiptReturnType<\n chain extends Chain | undefined = Chain | undefined,\n> = GetTransactionReceiptReturnType<chain>\n\nexport type WaitForTransactionReceiptParameters<\n chain extends Chain | undefined = Chain | undefined,\n> = {\n /**\n * Whether to check for transaction replacements.\n * @default true\n */\n checkReplacement?: boolean | undefined\n /**\n * The number of confirmations (blocks that have passed) to wait before resolving.\n * @default 1\n */\n confirmations?: number | undefined\n /** The hash of the transaction. */\n hash: Hash\n /** Optional callback to emit if the transaction has been replaced. */\n onReplaced?: ((response: ReplacementReturnType<chain>) => void) | undefined\n /**\n * Polling frequency (in ms). Defaults to the client's pollingInterval config.\n * @default client.pollingInterval\n */\n pollingInterval?: number | undefined\n /**\n * Number of times to retry if the transaction or block is not found.\n * @default 6 (exponential backoff)\n */\n retryCount?: WithRetryParameters['retryCount'] | undefined\n /**\n * Time to wait (in ms) between retries.\n * @default `({ count }) => ~~(1 << count) * 200` (exponential backoff)\n */\n retryDelay?: WithRetryParameters['delay'] | undefined\n /**\n * Optional timeout (in milliseconds) to wait before stopping polling.\n * @default 180_000\n */\n timeout?: number | undefined\n}\n\nexport type WaitForTransactionReceiptErrorType =\n | ObserveErrorType\n | GetBlockErrorType\n | GetTransactionErrorType\n | GetTransactionReceiptErrorType\n | WatchBlockNumberErrorType\n | WaitForTransactionReceiptTimeoutErrorType\n | ErrorType\n\n/**\n * Waits for the [Transaction](https://viem.sh/docs/glossary/terms#transaction) to be included on a [Block](https://viem.sh/docs/glossary/terms#block) (one confirmation), and then returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms#transaction-receipt).\n *\n * - Docs: https://viem.sh/docs/actions/public/waitForTransactionReceipt\n * - Example: https://stackblitz.com/github/wevm/viem/tree/main/examples/transactions_sending-transactions\n * - JSON-RPC Methods:\n * - Polls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) on each block until it has been processed.\n * - If a Transaction has been replaced:\n * - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) and extracts the transactions\n * - Checks if one of the Transactions is a replacement\n * - If so, calls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt).\n *\n * The `waitForTransactionReceipt` action additionally supports Replacement detection (e.g. sped up Transactions).\n *\n * Transactions can be replaced when a user modifies their transaction in their wallet (to speed up or cancel). Transactions are replaced when they are sent from the same nonce.\n *\n * There are 3 types of Transaction Replacement reasons:\n *\n * - `repriced`: The gas price has been modified (e.g. different `maxFeePerGas`)\n * - `cancelled`: The Transaction has been cancelled (e.g. `value === 0n`)\n * - `replaced`: The Transaction has been replaced (e.g. different `value` or `data`)\n *\n * @param client - Client to use\n * @param parameters - {@link WaitForTransactionReceiptParameters}\n * @returns The transaction receipt. {@link WaitForTransactionReceiptReturnType}\n *\n * @example\n * import { createPublicClient, waitForTransactionReceipt, http } from 'viem'\n * import { mainnet } from 'viem/chains'\n *\n * const client = createPublicClient({\n * chain: mainnet,\n * transport: http(),\n * })\n * const transactionReceipt = await waitForTransactionReceipt(client, {\n * hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',\n * })\n */\nexport async function waitForTransactionReceipt<\n chain extends Chain | undefined,\n>(\n client: Client<Transport, chain>,\n parameters: WaitForTransactionReceiptParameters<chain>,\n): Promise<WaitForTransactionReceiptReturnType<chain>> {\n const {\n checkReplacement = true,\n confirmations = 1,\n hash,\n onReplaced,\n retryCount = 6,\n retryDelay = ({ count }) => ~~(1 << count) * 200, // exponential backoff\n timeout = 180_000,\n } = parameters\n\n const observerId = stringify(['waitForTransactionReceipt', client.uid, hash])\n\n const pollingInterval = (() => {\n if (parameters.pollingInterval) return parameters.pollingInterval\n if (client.chain?.experimental_preconfirmationTime)\n return client.chain.experimental_preconfirmationTime\n return client.pollingInterval\n })()\n\n let transaction: GetTransactionReturnType<chain> | undefined\n let replacedTransaction: GetTransactionReturnType<chain> | undefined\n let receipt: GetTransactionReceiptReturnType<chain> | undefined\n let retrying = false\n\n let _unobserve: () => void\n let _unwatch: () => void\n\n const { promise, resolve, reject } =\n withResolvers<WaitForTransactionReceiptReturnType<chain>>()\n\n const timer = timeout\n ? setTimeout(() => {\n _unwatch?.()\n _unobserve?.()\n reject(new WaitForTransactionReceiptTimeoutError({ hash }))\n }, timeout)\n : undefined\n\n _unobserve = observe(\n observerId,\n { onReplaced, resolve, reject },\n async (emit) => {\n receipt = await getAction(\n client,\n getTransactionReceipt,\n 'getTransactionReceipt',\n )({ hash }).catch(() => undefined)\n\n if (receipt && confirmations <= 1) {\n clearTimeout(timer)\n emit.resolve(receipt)\n _unobserve?.()\n return\n }\n\n _unwatch = getAction(\n client,\n watchBlockNumber,\n 'watchBlockNumber',\n )({\n emitMissed: true,\n emitOnBegin: true,\n poll: true,\n pollingInterval,\n async onBlockNumber(blockNumber_) {\n const done = (fn: () => void) => {\n clearTimeout(timer)\n _unwatch?.()\n fn()\n _unobserve?.()\n }\n\n let blockNumber = blockNumber_\n\n if (retrying) return\n\n try {\n // If we already have a valid receipt, let's check if we have enough\n // confirmations. If we do, then we can resolve.\n if (receipt) {\n if (\n confirmations > 1 &&\n (!receipt.blockNumber ||\n blockNumber - receipt.blockNumber + 1n < confirmations)\n )\n return\n\n done(() => emit.resolve(receipt!))\n return\n }\n\n // Get the transaction to check if it's been replaced.\n // We need to retry as some RPC Providers may be slow to sync\n // up mined transactions.\n if (checkReplacement && !transaction) {\n retrying = true\n await withRetry(\n async () => {\n transaction = (await getAction(\n client,\n getTransaction,\n 'getTransaction',\n )({ hash })) as GetTransactionReturnType<chain>\n if (transaction.blockNumber)\n blockNumber = transaction.blockNumber\n },\n {\n delay: retryDelay,\n retryCount,\n },\n )\n retrying = false\n }\n\n // Get the receipt to check if it's been processed.\n receipt = await getAction(\n client,\n getTransactionReceipt,\n 'getTransactionReceipt',\n )({ hash })\n\n // Check if we have enough confirmations. If not, continue polling.\n if (\n confirmations > 1 &&\n (!receipt.blockNumber ||\n blockNumber - receipt.blockNumber + 1n < confirmations)\n )\n return\n\n done(() => emit.resolve(receipt!))\n } catch (err) {\n // If the receipt is not found, the transaction will be pending.\n // We need to check if it has potentially been replaced.\n if (\n err instanceof TransactionNotFoundError ||\n err instanceof TransactionReceiptNotFoundError\n ) {\n if (!transaction) {\n retrying = false\n return\n }\n\n try {\n replacedTransaction = transaction\n\n // Let's retrieve the transactions from the current block.\n // We need to retry as some RPC Providers may be slow to sync\n // up mined blocks.\n retrying = true\n const block = await withRetry(\n () =>\n getAction(\n client,\n getBlock,\n 'getBlock',\n )({\n blockNumber,\n includeTransactions: true,\n }),\n {\n delay: retryDelay,\n retryCount,\n shouldRetry: ({ error }) =>\n error instanceof BlockNotFoundError,\n },\n )\n retrying = false\n\n const replacementTransaction = (\n block.transactions as {} as Transaction[]\n ).find(\n ({ from, nonce }) =>\n from === replacedTransaction!.from &&\n nonce === replacedTransaction!.nonce,\n )\n\n // If we couldn't find a replacement transaction, continue polling.\n if (!replacementTransaction) return\n\n // If we found a replacement transaction, return it's receipt.\n receipt = await getAction(\n client,\n getTransactionReceipt,\n 'getTransactionReceipt',\n )({\n hash: replacementTransaction.hash,\n })\n\n // Check if we have enough confirmations. If not, continue polling.\n if (\n confirmations > 1 &&\n (!receipt.blockNumber ||\n blockNumber - receipt.blockNumber + 1n < confirmations)\n )\n return\n\n let reason: ReplacementReason = 'replaced'\n if (\n replacementTransaction.to === replacedTransaction.to &&\n replacementTransaction.value === replacedTransaction.value &&\n replacementTransaction.input === replacedTransaction.input\n ) {\n reason = 'repriced'\n } else if (\n replacementTransaction.from === replacementTransaction.to &&\n replacementTransaction.value === 0n\n ) {\n reason = 'cancelled'\n }\n\n done(() => {\n emit.onReplaced?.({\n reason,\n replacedTransaction: replacedTransaction! as any,\n transaction: replacementTransaction,\n transactionReceipt: receipt!,\n })\n emit.resolve(receipt!)\n })\n } catch (err_) {\n done(() => emit.reject(err_))\n }\n } else {\n done(() => emit.reject(err))\n }\n }\n },\n })\n },\n )\n\n return promise\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { TransactionReceiptRevertedError } from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { TransactionSerializedGeneric } from '../../types/transaction.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport { formatTransactionReceipt } from '../../utils/formatters/transactionReceipt.js'\nimport type { FormattedTransactionReceipt } from '../../utils/index.js'\n\nexport type SendRawTransactionSyncParameters = {\n /** The signed serialized transaction. */\n serializedTransaction: TransactionSerializedGeneric\n /** Whether to throw an error if the transaction was detected as reverted. @default true */\n throwOnReceiptRevert?: boolean | undefined\n /** The timeout for the transaction. */\n timeout?: number | undefined\n}\n\nexport type SendRawTransactionSyncReturnType<\n chain extends Chain | undefined = undefined,\n> = FormattedTransactionReceipt<chain>\n\nexport type SendRawTransactionSyncErrorType = RequestErrorType | ErrorType\n\n/**\n * Sends a **signed** transaction to the network synchronously,\n * and waits for the transaction to be included in a block.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendRawTransactionSync\n * - JSON-RPC Method: [`eth_sendRawTransactionSync`](https://eips.ethereum.org/EIPS/eip-7966)\n *\n * @param client - Client to use\n * @param parameters - {@link SendRawTransactionParameters}\n * @returns The transaction receipt. {@link SendRawTransactionSyncReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendRawTransactionSync } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n *\n * const receipt = await sendRawTransactionSync(client, {\n * serializedTransaction: '0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33'\n * })\n */\nexport async function sendRawTransactionSync<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n {\n serializedTransaction,\n throwOnReceiptRevert,\n timeout,\n }: SendRawTransactionSyncParameters,\n): Promise<SendRawTransactionSyncReturnType<chain>> {\n const receipt = await client.request(\n {\n method: 'eth_sendRawTransactionSync',\n params: timeout\n ? [serializedTransaction, timeout]\n : [serializedTransaction],\n },\n { retryCount: 0 },\n )\n const format =\n client.chain?.formatters?.transactionReceipt?.format ||\n formatTransactionReceipt\n\n const formatted = format(receipt) as SendRawTransactionSyncReturnType<chain>\n if (formatted.status === 'reverted' && throwOnReceiptRevert)\n throw new TransactionReceiptRevertedError({ receipt: formatted })\n return formatted\n}\n","import type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { Account } from '../../types/account.js'\nimport type { Chain } from '../../types/chain.js'\nimport { getAction } from '../../utils/getAction.js'\nimport type { GetCallsStatusReturnType } from './getCallsStatus.js'\nimport {\n type SendCallsErrorType,\n type SendCallsParameters,\n sendCalls,\n} from './sendCalls.js'\nimport {\n type WaitForCallsStatusParameters,\n waitForCallsStatus,\n} from './waitForCallsStatus.js'\n\nexport type SendCallsSyncParameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n calls extends readonly unknown[] = readonly unknown[],\n> = SendCallsParameters<chain, account, chainOverride, calls> &\n Pick<\n WaitForCallsStatusParameters,\n 'pollingInterval' | 'status' | 'throwOnFailure'\n > & {\n /** Timeout (ms) to wait for calls to be included in a block. @default chain.blockTime * 3 */\n timeout?: number | undefined\n }\n\nexport type SendCallsSyncReturnType = GetCallsStatusReturnType\n\nexport type SendCallsSyncErrorType = SendCallsErrorType\n\n/**\n * Requests the connected wallet to send a batch of calls, and waits for the calls to be included in a block.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/sendCallsSync\n * - JSON-RPC Methods: [`wallet_sendCalls`](https://eips.ethereum.org/EIPS/eip-5792)\n *\n * @param client - Client to use\n * @returns Calls status. {@link SendCallsSyncReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendCalls } from 'viem/actions'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const status = await sendCallsSync(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * calls: [\n * {\n * data: '0xdeadbeef',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * },\n * {\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: 69420n,\n * },\n * ],\n * })\n */\nexport async function sendCallsSync<\n const calls extends readonly unknown[],\n chain extends Chain | undefined,\n account extends Account | undefined = undefined,\n chainOverride extends Chain | undefined = undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: SendCallsSyncParameters<chain, account, chainOverride, calls>,\n): Promise<SendCallsSyncReturnType> {\n const { chain = client.chain } = parameters\n const timeout =\n parameters.timeout ?? Math.max((chain?.blockTime ?? 0) * 3, 5_000)\n const result = await getAction(client, sendCalls, 'sendCalls')(parameters)\n const status = await getAction(\n client,\n waitForCallsStatus,\n 'waitForCallsStatus',\n )({\n ...parameters,\n id: result.id,\n timeout,\n })\n return status\n}\n","import type { Address } from 'abitype'\n\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { SignTransactionErrorType } from '../../accounts/utils/signTransaction.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n AccountNotFoundError,\n type AccountNotFoundErrorType,\n AccountTypeNotSupportedError,\n type AccountTypeNotSupportedErrorType,\n} from '../../errors/account.js'\nimport { BaseError } from '../../errors/base.js'\nimport {\n TransactionReceiptRevertedError,\n type TransactionReceiptRevertedErrorType,\n} from '../../errors/transaction.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { GetAccountParameter } from '../../types/account.js'\nimport type {\n Chain,\n DeriveChain,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type { GetTransactionRequestKzgParameter } from '../../types/kzg.js'\nimport type { Hash, Hex } from '../../types/misc.js'\nimport type { TransactionRequest } from '../../types/transaction.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport {\n type RecoverAuthorizationAddressErrorType,\n recoverAuthorizationAddress,\n} from '../../utils/authorization/recoverAuthorizationAddress.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type AssertCurrentChainErrorType,\n assertCurrentChain,\n} from '../../utils/chain/assertCurrentChain.js'\nimport { concat } from '../../utils/data/concat.js'\nimport {\n type GetTransactionErrorReturnType,\n getTransactionError,\n} from '../../utils/errors/getTransactionError.js'\nimport { extract } from '../../utils/formatters/extract.js'\nimport {\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport { getAction } from '../../utils/getAction.js'\nimport { LruMap } from '../../utils/lru.js'\nimport {\n type AssertRequestErrorType,\n type AssertRequestParameters,\n assertRequest,\n} from '../../utils/transaction/assertRequest.js'\nimport { type GetChainIdErrorType, getChainId } from '../public/getChainId.js'\nimport {\n type WaitForTransactionReceiptErrorType,\n waitForTransactionReceipt,\n} from '../public/waitForTransactionReceipt.js'\nimport {\n defaultParameters,\n type PrepareTransactionRequestErrorType,\n prepareTransactionRequest,\n} from './prepareTransactionRequest.js'\nimport {\n type SendRawTransactionSyncErrorType,\n type SendRawTransactionSyncReturnType,\n sendRawTransactionSync,\n} from './sendRawTransactionSync.js'\n\nconst supportsWalletNamespace = new LruMap<boolean>(128)\n\nexport type SendTransactionSyncRequest<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n ///\n _derivedChain extends Chain | undefined = DeriveChain<chain, chainOverride>,\n> = UnionOmit<FormattedTransactionRequest<_derivedChain>, 'from'> &\n GetTransactionRequestKzgParameter\n\nexport type SendTransactionSyncParameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n request extends SendTransactionSyncRequest<\n chain,\n chainOverride\n > = SendTransactionSyncRequest<chain, chainOverride>,\n> = request &\n GetAccountParameter<account, Account | Address, true, true> &\n GetChainParameter<chain, chainOverride> &\n GetTransactionRequestKzgParameter<request> & {\n /** Whether to assert that the client chain is on the correct chain. @default true */\n assertChainId?: boolean | undefined\n /** Data to append to the end of the calldata. Takes precedence over `client.dataSuffix`. */\n dataSuffix?: Hex | undefined\n /** Polling interval (ms) to poll for the transaction receipt. @default client.pollingInterval */\n pollingInterval?: number | undefined\n /** Whether to throw an error if the transaction was detected as reverted. @default true */\n throwOnReceiptRevert?: boolean | undefined\n /** Timeout (ms) to wait for a response. @default Math.max(chain.blockTime * 3, 5_000) */\n timeout?: number | undefined\n }\n\nexport type SendTransactionSyncReturnType<\n chain extends Chain | undefined = Chain | undefined,\n> = SendRawTransactionSyncReturnType<chain>\n\nexport type SendTransactionSyncErrorType =\n | ParseAccountErrorType\n | GetTransactionErrorReturnType<\n | AccountNotFoundErrorType\n | AccountTypeNotSupportedErrorType\n | AssertCurrentChainErrorType\n | AssertRequestErrorType\n | GetChainIdErrorType\n | PrepareTransactionRequestErrorType\n | SendRawTransactionSyncErrorType\n | RecoverAuthorizationAddressErrorType\n | SignTransactionErrorType\n | TransactionReceiptRevertedErrorType\n | RequestErrorType\n >\n | WaitForTransactionReceiptErrorType\n | ErrorType\n\n/**\n * Creates, signs, and sends a new transaction to the network synchronously.\n * Returns the transaction receipt.\n *\n * @param client - Client to use\n * @param parameters - {@link SendTransactionSyncParameters}\n * @returns The transaction receipt. {@link SendTransactionSyncReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { sendTransactionSync } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const receipt = await sendTransactionSync(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: 1000000000000000000n,\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n * import { sendTransactionSync } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * account: privateKeyToAccount('0x…'),\n * chain: mainnet,\n * transport: http(),\n * })\n * const receipt = await sendTransactionSync(client, {\n * to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * value: 1000000000000000000n,\n * })\n */\nexport async function sendTransactionSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const request extends SendTransactionSyncRequest<chain, chainOverride>,\n chainOverride extends Chain | undefined = undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: SendTransactionSyncParameters<\n chain,\n account,\n chainOverride,\n request\n >,\n): Promise<SendTransactionSyncReturnType<chain>> {\n const {\n account: account_ = client.account,\n assertChainId = true,\n chain = client.chain,\n accessList,\n authorizationList,\n blobs,\n data,\n dataSuffix = typeof client.dataSuffix === 'string'\n ? client.dataSuffix\n : client.dataSuffix?.value,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n pollingInterval,\n throwOnReceiptRevert,\n type,\n value,\n ...rest\n } = parameters\n const timeout =\n parameters.timeout ?? Math.max((chain?.blockTime ?? 0) * 3, 5_000)\n\n if (typeof account_ === 'undefined')\n throw new AccountNotFoundError({\n docsPath: '/docs/actions/wallet/sendTransactionSync',\n })\n const account = account_ ? parseAccount(account_) : null\n\n try {\n assertRequest(parameters as AssertRequestParameters)\n\n const to = await (async () => {\n // If `to` exists on the parameters, use that.\n if (parameters.to) return parameters.to\n\n // If `to` is null, we are sending a deployment transaction.\n if (parameters.to === null) return undefined\n\n // If no `to` exists, and we are sending a EIP-7702 transaction, use the\n // address of the first authorization in the list.\n if (authorizationList && authorizationList.length > 0)\n return await recoverAuthorizationAddress({\n authorization: authorizationList[0],\n }).catch(() => {\n throw new BaseError(\n '`to` is required. Could not infer from `authorizationList`.',\n )\n })\n\n // Otherwise, we are sending a deployment transaction.\n return undefined\n })()\n\n if (account?.type === 'json-rpc' || account === null) {\n let chainId: number | undefined\n if (chain !== null) {\n chainId = await getAction(client, getChainId, 'getChainId')({})\n if (assertChainId)\n assertCurrentChain({\n currentChainId: chainId,\n chain,\n })\n }\n\n const chainFormat = client.chain?.formatters?.transactionRequest?.format\n const format = chainFormat || formatTransactionRequest\n\n const request = format(\n {\n // Pick out extra data that might exist on the chain's transaction request type.\n ...extract(rest, { format: chainFormat }),\n accessList,\n account,\n authorizationList,\n blobs,\n chainId,\n data: data ? concat([data, dataSuffix ?? '0x']) : data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n to,\n type,\n value,\n } as TransactionRequest,\n 'sendTransaction',\n )\n\n const isWalletNamespaceSupported = supportsWalletNamespace.get(client.uid)\n const method = isWalletNamespaceSupported\n ? 'wallet_sendTransaction'\n : 'eth_sendTransaction'\n\n const hash = await (async () => {\n try {\n return await client.request(\n {\n method,\n params: [request],\n },\n { retryCount: 0 },\n )\n } catch (e) {\n if (isWalletNamespaceSupported === false) throw e\n\n const error = e as BaseError\n // If the transport does not support the method or input, attempt to use the\n // `wallet_sendTransaction` method.\n if (\n error.name === 'InvalidInputRpcError' ||\n error.name === 'InvalidParamsRpcError' ||\n error.name === 'MethodNotFoundRpcError' ||\n error.name === 'MethodNotSupportedRpcError'\n ) {\n return (await client\n .request(\n {\n method: 'wallet_sendTransaction',\n params: [request],\n },\n { retryCount: 0 },\n )\n .then((hash) => {\n supportsWalletNamespace.set(client.uid, true)\n return hash\n })\n .catch((e) => {\n const walletNamespaceError = e as BaseError\n if (\n walletNamespaceError.name === 'MethodNotFoundRpcError' ||\n walletNamespaceError.name === 'MethodNotSupportedRpcError'\n ) {\n supportsWalletNamespace.set(client.uid, false)\n throw error\n }\n\n throw walletNamespaceError\n })) as never\n }\n\n throw error\n }\n })()\n\n const receipt = await getAction(\n client,\n waitForTransactionReceipt,\n 'waitForTransactionReceipt',\n )({\n checkReplacement: false,\n hash,\n pollingInterval,\n timeout,\n })\n if (throwOnReceiptRevert && receipt.status === 'reverted')\n throw new TransactionReceiptRevertedError({ receipt })\n return receipt\n }\n\n if (account?.type === 'local') {\n // Prepare the request for signing (assign appropriate fees, etc.)\n const request = await getAction(\n client,\n prepareTransactionRequest,\n 'prepareTransactionRequest',\n )({\n account,\n accessList,\n authorizationList,\n blobs,\n chain,\n data: data ? concat([data, dataSuffix ?? '0x']) : data,\n gas,\n gasPrice,\n maxFeePerBlobGas,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce,\n nonceManager: account.nonceManager,\n parameters: [...defaultParameters, 'sidecars'],\n type,\n value,\n ...rest,\n to,\n } as any)\n\n const serializer = chain?.serializers?.transaction\n const serializedTransaction = (await account.signTransaction(request, {\n serializer,\n })) as Hash\n return (await getAction(\n client,\n sendRawTransactionSync,\n 'sendRawTransactionSync',\n )({\n serializedTransaction,\n throwOnReceiptRevert,\n timeout: parameters.timeout,\n })) as never\n }\n\n if (account?.type === 'smart')\n throw new AccountTypeNotSupportedError({\n metaMessages: [\n 'Consider using the `sendUserOperation` Action instead.',\n ],\n docsPath: '/docs/actions/bundler/sendUserOperation',\n type: 'smart',\n })\n\n throw new AccountTypeNotSupportedError({\n docsPath: '/docs/actions/wallet/sendTransactionSync',\n type: (account as any)?.type,\n })\n } catch (err) {\n if (err instanceof AccountTypeNotSupportedError) throw err\n throw getTransactionError(err as BaseError, {\n ...parameters,\n account,\n chain: parameters.chain || undefined,\n })\n }\n}\n","import type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { SignTransactionErrorType as SignTransactionErrorType_account } from '../../accounts/utils/signTransaction.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { AccountNotFoundError } from '../../errors/account.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { GetAccountParameter } from '../../types/account.js'\nimport type {\n Chain,\n DeriveChain,\n GetChainParameter,\n} from '../../types/chain.js'\nimport type { GetTransactionRequestKzgParameter } from '../../types/kzg.js'\nimport type { RpcTransactionRequest } from '../../types/rpc.js'\nimport type {\n TransactionRequest,\n TransactionSerializable,\n TransactionSerialized,\n} from '../../types/transaction.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport {\n type AssertCurrentChainErrorType,\n assertCurrentChain,\n} from '../../utils/chain/assertCurrentChain.js'\nimport type { NumberToHexErrorType } from '../../utils/encoding/toHex.js'\nimport { numberToHex } from '../../utils/encoding/toHex.js'\nimport {\n type FormattedTransactionRequest,\n formatTransactionRequest,\n} from '../../utils/formatters/transactionRequest.js'\nimport { getAction } from '../../utils/getAction.js'\nimport {\n type AssertRequestErrorType,\n assertRequest,\n} from '../../utils/transaction/assertRequest.js'\nimport type { GetTransactionType } from '../../utils/transaction/getTransactionType.js'\nimport { type GetChainIdErrorType, getChainId } from '../public/getChainId.js'\n\nexport type SignTransactionRequest<\n chain extends Chain | undefined = Chain | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n ///\n _derivedChain extends Chain | undefined = DeriveChain<chain, chainOverride>,\n> = UnionOmit<FormattedTransactionRequest<_derivedChain>, 'from'>\n\nexport type SignTransactionParameters<\n chain extends Chain | undefined,\n account extends Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n request extends SignTransactionRequest<\n chain,\n chainOverride\n > = SignTransactionRequest<chain, chainOverride>,\n> = request &\n GetAccountParameter<account> &\n GetChainParameter<chain, chainOverride> &\n GetTransactionRequestKzgParameter<request>\n\nexport type SignTransactionReturnType<\n request extends SignTransactionRequest = SignTransactionRequest,\n> = TransactionSerialized<GetTransactionType<request>>\n\nexport type SignTransactionErrorType =\n | ParseAccountErrorType\n | AssertRequestErrorType\n | GetChainIdErrorType\n | AssertCurrentChainErrorType\n | SignTransactionErrorType_account\n | NumberToHexErrorType\n | RequestErrorType\n | ErrorType\n\n/**\n * Signs a transaction.\n *\n * - Docs: https://viem.sh/docs/actions/wallet/signTransaction\n * - JSON-RPC Methods:\n * - JSON-RPC Accounts: [`eth_signTransaction`](https://ethereum.github.io/execution-apis/api-documentation/)\n * - Local Accounts: Signs locally. No JSON-RPC request.\n *\n * @param args - {@link SignTransactionParameters}\n * @returns The signed serialized transaction. {@link SignTransactionReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { signTransaction } from 'viem/actions'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const signature = await signTransaction(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * to: '0x0000000000000000000000000000000000000000',\n * value: 1n,\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n * import { signTransaction } from 'viem/actions'\n *\n * const client = createWalletClient({\n * account: privateKeyToAccount('0x…'),\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const signature = await signTransaction(client, {\n * to: '0x0000000000000000000000000000000000000000',\n * value: 1n,\n * })\n */\nexport async function signTransaction<\n chain extends Chain | undefined,\n account extends Account | undefined,\n chainOverride extends Chain | undefined = undefined,\n const request extends SignTransactionRequest<\n chain,\n chainOverride\n > = SignTransactionRequest<chain, chainOverride>,\n>(\n client: Client<Transport, chain, account>,\n parameters: SignTransactionParameters<chain, account, chainOverride, request>,\n): Promise<SignTransactionReturnType<request>> {\n const {\n account: account_ = client.account,\n chain = client.chain,\n ...transaction\n } = parameters\n\n if (!account_)\n throw new AccountNotFoundError({\n docsPath: '/docs/actions/wallet/signTransaction',\n })\n const account = parseAccount(account_)\n\n assertRequest({\n account,\n ...parameters,\n })\n\n const chainId = await getAction(client, getChainId, 'getChainId')({})\n if (chain !== null)\n assertCurrentChain({\n currentChainId: chainId,\n chain,\n })\n\n const formatters = chain?.formatters || client.chain?.formatters\n const format =\n formatters?.transactionRequest?.format || formatTransactionRequest\n\n if (account.signTransaction)\n return account.signTransaction(\n {\n ...transaction,\n chainId,\n } as TransactionSerializable,\n { serializer: client.chain?.serializers?.transaction },\n ) as Promise<SignTransactionReturnType<request>>\n\n return await client.request(\n {\n method: 'eth_signTransaction',\n params: [\n {\n ...format(\n {\n ...transaction,\n account,\n } as unknown as TransactionRequest,\n 'signTransaction',\n ),\n chainId: numberToHex(chainId),\n from: account.address,\n } as unknown as RpcTransactionRequest,\n ],\n },\n { retryCount: 0 },\n )\n}\n","import type { TypedData } from 'abitype'\n\nimport type { Account } from '../../accounts/types.js'\nimport {\n type ParseAccountErrorType,\n parseAccount,\n} from '../../accounts/utils/parseAccount.js'\nimport type { SignTypedDataErrorType as SignTypedDataErrorType_account } from '../../accounts/utils/signTypedData.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport {\n AccountNotFoundError,\n type AccountNotFoundErrorType,\n} from '../../errors/account.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { GetAccountParameter } from '../../types/account.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { TypedDataDefinition } from '../../types/typedData.js'\nimport type { RequestErrorType } from '../../utils/buildRequest.js'\nimport type { IsHexErrorType } from '../../utils/data/isHex.js'\nimport type { StringifyErrorType } from '../../utils/stringify.js'\nimport {\n type GetTypesForEIP712DomainErrorType,\n getTypesForEIP712Domain,\n type SerializeTypedDataErrorType,\n serializeTypedData,\n type ValidateTypedDataErrorType,\n validateTypedData,\n} from '../../utils/typedData.js'\n\nexport type SignTypedDataParameters<\n typedData extends TypedData | Record<string, unknown> = TypedData,\n primaryType extends keyof typedData | 'EIP712Domain' = keyof typedData,\n account extends Account | undefined = undefined,\n ///\n primaryTypes = typedData extends TypedData ? keyof typedData : string,\n> = TypedDataDefinition<typedData, primaryType, primaryTypes> &\n GetAccountParameter<account>\n\nexport type SignTypedDataReturnType = Hex\n\nexport type SignTypedDataErrorType =\n | AccountNotFoundErrorType\n | ParseAccountErrorType\n | GetTypesForEIP712DomainErrorType\n | ValidateTypedDataErrorType\n | StringifyErrorType\n | SignTypedDataErrorType_account\n | IsHexErrorType\n | RequestErrorType\n | SerializeTypedDataErrorType\n | ErrorType\n\n/**\n * Signs typed data and calculates an Ethereum-specific signature in [https://eips.ethereum.org/EIPS/eip-712](https://eips.ethereum.org/EIPS/eip-712): `sign(keccak256(\"\\x19\\x01\" ‖ domainSeparator ‖ hashStruct(message)))`\n *\n * - Docs: https://viem.sh/docs/actions/wallet/signTypedData\n * - JSON-RPC Methods:\n * - JSON-RPC Accounts: [`eth_signTypedData_v4`](https://docs.metamask.io/guide/signing-data#signtypeddata-v4)\n * - Local Accounts: Signs locally. No JSON-RPC request.\n *\n * @param client - Client to use\n * @param parameters - {@link SignTypedDataParameters}\n * @returns The signed data. {@link SignTypedDataReturnType}\n *\n * @example\n * import { createWalletClient, custom } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { signTypedData } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const signature = await signTypedData(client, {\n * account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',\n * domain: {\n * name: 'Ether Mail',\n * version: '1',\n * chainId: 1,\n * verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n * },\n * types: {\n * Person: [\n * { name: 'name', type: 'string' },\n * { name: 'wallet', type: 'address' },\n * ],\n * Mail: [\n * { name: 'from', type: 'Person' },\n * { name: 'to', type: 'Person' },\n * { name: 'contents', type: 'string' },\n * ],\n * },\n * primaryType: 'Mail',\n * message: {\n * from: {\n * name: 'Cow',\n * wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n * },\n * to: {\n * name: 'Bob',\n * wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n * },\n * contents: 'Hello, Bob!',\n * },\n * })\n *\n * @example\n * // Account Hoisting\n * import { createWalletClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { mainnet } from 'viem/chains'\n * import { signTypedData } from 'viem/wallet'\n *\n * const client = createWalletClient({\n * account: privateKeyToAccount('0x…'),\n * chain: mainnet,\n * transport: http(),\n * })\n * const signature = await signTypedData(client, {\n * domain: {\n * name: 'Ether Mail',\n * version: '1',\n * chainId: 1,\n * verifyingContract: '0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC',\n * },\n * types: {\n * Person: [\n * { name: 'name', type: 'string' },\n * { name: 'wallet', type: 'address' },\n * ],\n * Mail: [\n * { name: 'from', type: 'Person' },\n * { name: 'to', type: 'Person' },\n * { name: 'contents', type: 'string' },\n * ],\n * },\n * primaryType: 'Mail',\n * message: {\n * from: {\n * name: 'Cow',\n * wallet: '0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826',\n * },\n * to: {\n * name: 'Bob',\n * wallet: '0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB',\n * },\n * contents: 'Hello, Bob!',\n * },\n * })\n */\nexport async function signTypedData<\n const typedData extends TypedData | Record<string, unknown>,\n primaryType extends keyof typedData | 'EIP712Domain',\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: SignTypedDataParameters<typedData, primaryType, account>,\n): Promise<SignTypedDataReturnType> {\n const {\n account: account_ = client.account,\n domain,\n message,\n primaryType,\n } = parameters as unknown as SignTypedDataParameters\n\n if (!account_)\n throw new AccountNotFoundError({\n docsPath: '/docs/actions/wallet/signTypedData',\n })\n const account = parseAccount(account_)\n\n const types = {\n EIP712Domain: getTypesForEIP712Domain({ domain }),\n ...parameters.types,\n }\n\n // Need to do a runtime validation check on addresses, byte ranges, integer ranges, etc\n // as we can't statically check this with TypeScript.\n validateTypedData({ domain, message, primaryType, types })\n\n if (account.signTypedData)\n return account.signTypedData({ domain, message, primaryType, types })\n\n const typedData = serializeTypedData({ domain, message, primaryType, types })\n return client.request(\n {\n method: 'eth_signTypedData_v4',\n params: [account.address, typedData],\n },\n { retryCount: 0 },\n )\n}\n","import type { Abi } from 'abitype'\n\nimport type { Account } from '../../accounts/types.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { Chain } from '../../types/chain.js'\nimport type {\n ContractFunctionArgs,\n ContractFunctionName,\n} from '../../types/contract.js'\nimport {\n type SendTransactionSyncParameters,\n type SendTransactionSyncReturnType,\n sendTransactionSync,\n} from './sendTransactionSync.js'\nimport { type WriteContractParameters, writeContract } from './writeContract.js'\n\nexport type { WriteContractErrorType as WriteContractSyncErrorType } from './writeContract.js'\n\nexport type WriteContractSyncParameters<\n abi extends Abi | readonly unknown[] = Abi,\n functionName extends ContractFunctionName<\n abi,\n 'nonpayable' | 'payable'\n > = ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n > = ContractFunctionArgs<abi, 'nonpayable' | 'payable', functionName>,\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n chainOverride extends Chain | undefined = Chain | undefined,\n> = WriteContractParameters<\n abi,\n functionName,\n args,\n chain,\n account,\n chainOverride\n> &\n Pick<\n SendTransactionSyncParameters<chain>,\n 'pollingInterval' | 'throwOnReceiptRevert' | 'timeout'\n >\n\nexport type WriteContractSyncReturnType<\n chain extends Chain | undefined = Chain | undefined,\n> = SendTransactionSyncReturnType<chain>\n\n/**\n * Executes a write function on a contract synchronously.\n * Returns the transaction receipt.\n *\n * - Docs: https://viem.sh/docs/contract/writeContractSync\n *\n * A \"write\" function on a Solidity contract modifies the state of the blockchain. These types of functions require gas to be executed, and hence a [Transaction](https://viem.sh/docs/glossary/terms) is needed to be broadcast in order to change the state.\n *\n * Internally, uses a [Wallet Client](https://viem.sh/docs/clients/wallet) to call the [`sendTransaction` action](https://viem.sh/docs/actions/wallet/sendTransaction) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData).\n *\n * __Warning: The `write` internally sends a transaction – it does not validate if the contract write will succeed (the contract may throw an error). It is highly recommended to [simulate the contract write with `contract.simulate`](https://viem.sh/docs/contract/writeContract#usage) before you execute it.__\n *\n * @param client - Client to use\n * @param parameters - {@link WriteContractParameters}\n * @returns A [Transaction Hash](https://viem.sh/docs/glossary/terms#hash). {@link WriteContractReturnType}\n *\n * @example\n * import { createWalletClient, custom, parseAbi } from 'viem'\n * import { mainnet } from 'viem/chains'\n * import { writeContract } from 'viem/contract'\n *\n * const client = createWalletClient({\n * chain: mainnet,\n * transport: custom(window.ethereum),\n * })\n * const receipt = await writeContractSync(client, {\n * address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',\n * abi: parseAbi(['function mint(uint32 tokenId) nonpayable']),\n * functionName: 'mint',\n * args: [69420],\n * })\n */\nexport async function writeContractSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n const abi extends Abi | readonly unknown[],\n functionName extends ContractFunctionName<abi, 'nonpayable' | 'payable'>,\n args extends ContractFunctionArgs<\n abi,\n 'nonpayable' | 'payable',\n functionName\n >,\n chainOverride extends Chain | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: WriteContractSyncParameters<\n abi,\n functionName,\n args,\n chain,\n account,\n chainOverride\n >,\n): Promise<WriteContractSyncReturnType<chain>> {\n return writeContract.internal(\n client,\n sendTransactionSync,\n 'sendTransactionSync',\n parameters as never,\n ) as never\n}\n","import type { ErrorType } from '../../errors/utils.js'\nimport type { Account } from '../../types/account.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { EIP1193RequestFn } from '../../types/eip1193.js'\nimport type { OneOf } from '../../types/utils.js'\nimport { buildRequest } from '../../utils/buildRequest.js'\nimport { uid as uid_ } from '../../utils/uid.js'\nimport type { ClientConfig } from '../createClient.js'\n\nexport type TransportConfig<\n type extends string = string,\n eip1193RequestFn extends EIP1193RequestFn = EIP1193RequestFn,\n> = {\n /** The name of the transport. */\n name: string\n /** The key of the transport. */\n key: string\n /** Methods to include or exclude from executing RPC requests. */\n methods?:\n | OneOf<\n | {\n include?: string[] | undefined\n }\n | {\n exclude?: string[] | undefined\n }\n >\n | undefined\n /** The JSON-RPC request function that matches the EIP-1193 request spec. */\n request: eip1193RequestFn\n /** The base delay (in ms) between retries. */\n retryDelay?: number | undefined\n /** The max number of times to retry. */\n retryCount?: number | undefined\n /** The timeout (in ms) for requests. */\n timeout?: number | undefined\n /** The type of the transport. */\n type: type\n}\n\nexport type Transport<\n type extends string = string,\n rpcAttributes = Record<string, any>,\n eip1193RequestFn extends EIP1193RequestFn = EIP1193RequestFn,\n> = <chain extends Chain | undefined = Chain>({\n chain,\n}: {\n account?: Account | undefined\n chain?: chain | undefined\n pollingInterval?: ClientConfig['pollingInterval'] | undefined\n retryCount?: TransportConfig['retryCount'] | undefined\n timeout?: TransportConfig['timeout'] | undefined\n}) => {\n config: TransportConfig<type>\n request: eip1193RequestFn\n value?: rpcAttributes | undefined\n}\n\nexport type CreateTransportErrorType = ErrorType\n\n/**\n * @description Creates an transport intended to be used with a client.\n */\nexport function createTransport<\n type extends string,\n rpcAttributes extends Record<string, any>,\n>(\n {\n key,\n methods,\n name,\n request,\n retryCount = 3,\n retryDelay = 150,\n timeout,\n type,\n }: TransportConfig<type>,\n value?: rpcAttributes | undefined,\n): ReturnType<Transport<type, rpcAttributes>> {\n const uid = uid_()\n return {\n config: {\n key,\n methods,\n name,\n request,\n retryCount,\n retryDelay,\n timeout,\n type,\n },\n request: buildRequest(request, { methods, retryCount, retryDelay, uid }),\n value,\n }\n}\n","import { BaseError } from './base.js'\n\nexport type UrlRequiredErrorType = UrlRequiredError & {\n name: 'UrlRequiredError'\n}\nexport class UrlRequiredError extends BaseError {\n constructor() {\n super(\n 'No URL was provided to the Transport. Please provide a valid RPC URL to the Transport.',\n {\n docsPath: '/docs/clients/intro',\n name: 'UrlRequiredError',\n },\n )\n }\n}\n","import { RpcRequestError } from '../../errors/request.js'\nimport {\n UrlRequiredError,\n type UrlRequiredErrorType,\n} from '../../errors/transport.js'\nimport type { ErrorType } from '../../errors/utils.js'\nimport type { EIP1193RequestFn, RpcSchema } from '../../types/eip1193.js'\nimport type { RpcRequest } from '../../types/rpc.js'\nimport { createBatchScheduler } from '../../utils/promise/createBatchScheduler.js'\nimport {\n getHttpRpcClient,\n type HttpRpcClientOptions,\n} from '../../utils/rpc/http.js'\n\nimport {\n type CreateTransportErrorType,\n createTransport,\n type Transport,\n type TransportConfig,\n} from './createTransport.js'\n\nexport type HttpTransportConfig<\n rpcSchema extends RpcSchema | undefined = undefined,\n raw extends boolean = false,\n> = {\n /**\n * Whether to enable Batch JSON-RPC.\n * @link https://www.jsonrpc.org/specification#batch\n */\n batch?:\n | boolean\n | {\n /** The maximum number of JSON-RPC requests to send in a batch. @default 1_000 */\n batchSize?: number | undefined\n /** The maximum number of milliseconds to wait before sending a batch. @default 0 */\n wait?: number | undefined\n }\n | undefined\n fetchFn?: HttpRpcClientOptions['fetchFn'] | undefined\n /**\n * Request configuration to pass to `fetch`.\n * @link https://developer.mozilla.org/en-US/docs/Web/API/fetch\n */\n fetchOptions?: HttpRpcClientOptions['fetchOptions'] | undefined\n /** A callback to handle the response from `fetch`. */\n onFetchRequest?: HttpRpcClientOptions['onRequest'] | undefined\n /** A callback to handle the response from `fetch`. */\n onFetchResponse?: HttpRpcClientOptions['onResponse'] | undefined\n /** The key of the HTTP transport. */\n key?: TransportConfig['key'] | undefined\n /** Methods to include or exclude from executing RPC requests. */\n methods?: TransportConfig['methods'] | undefined\n /** The name of the HTTP transport. */\n name?: TransportConfig['name'] | undefined\n /** Whether to return JSON RPC errors as responses instead of throwing. */\n raw?: raw | boolean | undefined\n /** The max number of times to retry. */\n retryCount?: TransportConfig['retryCount'] | undefined\n /** The base delay (in ms) between retries. */\n retryDelay?: TransportConfig['retryDelay'] | undefined\n /** Typed JSON-RPC schema for the transport. */\n rpcSchema?: rpcSchema | RpcSchema | undefined\n /** The timeout (in ms) for the HTTP request. Default: 10_000 */\n timeout?: TransportConfig['timeout'] | undefined\n}\n\nexport type HttpTransport<\n rpcSchema extends RpcSchema | undefined = undefined,\n raw extends boolean = false,\n> = Transport<\n 'http',\n {\n fetchOptions?: HttpTransportConfig['fetchOptions'] | undefined\n url?: string | undefined\n },\n EIP1193RequestFn<rpcSchema, raw>\n>\n\nexport type HttpTransportErrorType =\n | CreateTransportErrorType\n | UrlRequiredErrorType\n | ErrorType\n\n/**\n * @description Creates a HTTP transport that connects to a JSON-RPC API.\n */\nexport function http<\n rpcSchema extends RpcSchema | undefined = undefined,\n raw extends boolean = false,\n>(\n /** URL of the JSON-RPC API. Defaults to the chain's public RPC URL. */\n url?: string | undefined,\n config: HttpTransportConfig<rpcSchema, raw> = {},\n): HttpTransport<rpcSchema, raw> {\n const {\n batch,\n fetchFn,\n fetchOptions,\n key = 'http',\n methods,\n name = 'HTTP JSON-RPC',\n onFetchRequest,\n onFetchResponse,\n retryDelay,\n raw,\n } = config\n return ({ chain, retryCount: retryCount_, timeout: timeout_ }) => {\n const { batchSize = 1000, wait = 0 } =\n typeof batch === 'object' ? batch : {}\n const retryCount = config.retryCount ?? retryCount_\n const timeout = timeout_ ?? config.timeout ?? 10_000\n const url_ = url || chain?.rpcUrls.default.http[0]\n if (!url_) throw new UrlRequiredError()\n\n const rpcClient = getHttpRpcClient(url_, {\n fetchFn,\n fetchOptions,\n onRequest: onFetchRequest,\n onResponse: onFetchResponse,\n timeout,\n })\n\n return createTransport(\n {\n key,\n methods,\n name,\n async request({ method, params }) {\n const body = { method, params }\n\n const { schedule } = createBatchScheduler({\n id: url_,\n wait,\n shouldSplitBatch(requests) {\n return requests.length > batchSize\n },\n fn: (body: RpcRequest[]) =>\n rpcClient.request({\n body,\n }),\n sort: (a, b) => a.id - b.id,\n })\n\n const fn = async (body: RpcRequest) =>\n batch\n ? schedule(body)\n : [\n await rpcClient.request({\n body,\n }),\n ]\n\n const [{ error, result }] = await fn(body)\n\n if (raw) return { error, result }\n if (error)\n throw new RpcRequestError({\n body,\n error,\n url: url_,\n })\n return result\n },\n retryCount,\n retryDelay,\n timeout,\n type: 'http',\n },\n {\n fetchOptions,\n url: url_,\n },\n )\n }\n}\n","import { parseUnits } from 'viem'\nimport * as Method from '../Method.js'\nimport * as z from '../zod.js'\n\n/**\n * Stripe charge intent for one-time payments via Shared Payment Tokens (SPTs).\n *\n * @see https://github.com/tempoxyz/payment-auth-spec/blob/main/specs/methods/stripe/draft-stripe-charge-00.md\n */\nexport const charge = Method.from({\n name: 'stripe',\n intent: 'charge',\n schema: {\n credential: {\n payload: z.object({\n externalId: z.optional(z.string()),\n spt: z.string(),\n }),\n },\n request: z.pipe(\n z.object({\n amount: z.amount(),\n currency: z.string(),\n decimals: z.number(),\n description: z.optional(z.string()),\n externalId: z.optional(z.string()),\n metadata: z.optional(z.record(z.string(), z.string())),\n networkId: z.string(),\n paymentMethodTypes: z.array(z.string()).check(z.minLength(1)),\n recipient: z.optional(z.string()),\n }),\n z.transform(({ amount, decimals, metadata, networkId, paymentMethodTypes, ...rest }) => ({\n ...rest,\n amount: parseUnits(amount, decimals).toString(),\n methodDetails: {\n networkId,\n paymentMethodTypes,\n ...(metadata !== undefined && { metadata }),\n },\n })),\n ),\n },\n})\n","import type * as Challenge from '../../Challenge.js'\nimport * as Credential from '../../Credential.js'\nimport * as Method from '../../Method.js'\nimport * as z from '../../zod.js'\nimport type { StripeJs } from '../internal/types.js'\nimport * as Methods from '../Methods.js'\n\n/**\n * Creates a Stripe charge method intent for usage on the client.\n *\n * Accepts a `createToken` callback that handles SPT creation (requires\n * a secret key, so typically proxied through a server endpoint) and\n * returns a credential for retrying the request.\n *\n * The `paymentMethod` (e.g. from Stripe Elements) can be provided at\n * initialization or at credential-creation time via `context`.\n *\n * Optionally accepts a `client` (a Stripe.js instance from `@stripe/stripe-js`)\n * which is forwarded to the `createToken` callback for use with Elements.\n *\n * @example\n * ```ts\n * import { loadStripe } from '@stripe/stripe-js'\n * import { stripe } from 'mppx/client'\n *\n * const stripeJs = await loadStripe('pk_...')\n *\n * const charge = stripe.charge({\n * client: stripeJs,\n * createToken: async ({ amount, currency, expiresAt, metadata, networkId, paymentMethod }) => {\n * const res = await fetch('/api/create-spt', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify({ paymentMethod, amount, currency, networkId, expiresAt, metadata }),\n * })\n * const { spt } = await res.json()\n * return spt\n * },\n * })\n * ```\n */\nexport function charge(parameters: charge.Parameters) {\n const { client, createToken, externalId, paymentMethod: defaultPaymentMethod } = parameters\n\n return Method.toClient(Methods.charge, {\n context: z.object({\n paymentMethod: z.optional(z.string()),\n }),\n\n async createCredential({ challenge, context }) {\n const paymentMethod = context?.paymentMethod ?? defaultPaymentMethod\n if (!paymentMethod) {\n throw new Error('paymentMethod is required (pass via context or parameters)')\n }\n\n const amount = challenge.request.amount as string\n const currency = challenge.request.currency as string\n const networkId = challenge.request.methodDetails?.networkId as string | undefined\n if (!networkId) throw new Error('networkId is required in challenge.methodDetails')\n const metadata = challenge.request.methodDetails?.metadata as\n | Record<string, string>\n | undefined\n if (metadata?.externalId) {\n throw new Error(\n 'methodDetails.metadata.externalId is reserved; use credential externalId instead',\n )\n }\n\n const expiresAt = challenge.expires\n ? Math.floor(new Date(challenge.expires).getTime() / 1000)\n : Math.floor(Date.now() / 1000) + 3600\n\n const spt = await createToken({\n amount,\n challenge,\n client,\n currency,\n expiresAt,\n metadata,\n networkId,\n paymentMethod,\n })\n\n return Credential.serialize({\n challenge,\n payload: {\n spt,\n ...(externalId ? { externalId } : {}),\n },\n })\n },\n })\n}\n\nexport declare namespace charge {\n type Parameters = {\n /** Stripe.js instance from `@stripe/stripe-js`. Forwarded to `createToken` for use with Elements. */\n client?: StripeJs | undefined\n /** Called when a Stripe challenge is received. Create an SPT to retry. */\n createToken: (parameters: OnChallengeParameters) => Promise<string>\n /** Optional client-side external reference ID for the credential payload. */\n externalId?: string | undefined\n /** Default payment method ID. Overridden by `context.paymentMethod`. */\n paymentMethod?: string | undefined\n }\n\n type OnChallengeParameters = {\n /** Payment amount (in smallest currency unit). */\n amount: string\n challenge: Challenge.Challenge<\n z.output<typeof Methods.charge.schema.request>,\n typeof Methods.charge.intent,\n typeof Methods.charge.name\n >\n /** Stripe.js instance, if provided to `stripe.charge()`. */\n client?: StripeJs | undefined\n /** Three-letter ISO currency code. */\n currency: string\n /** SPT expiration as a Unix timestamp (seconds). */\n expiresAt: number\n /** Optional metadata to associate with the SPT. */\n metadata?: Record<string, string> | undefined\n /** Stripe Business Network profile ID. */\n networkId: string | undefined\n /** Stripe payment method ID (e.g. from Stripe Elements). */\n paymentMethod?: string | undefined\n }\n}\n","import { charge as charge_ } from './Charge.js'\n\n/**\n * Creates a Stripe `charge` client method.\n *\n * @example\n * ```ts\n * import { Mppx, stripe } from 'mppx/client'\n *\n * const mppx = Mppx.create({\n * methods: [\n * stripe({\n * createToken: async (params) => {\n * const res = await fetch('/api/create-spt', {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify(params),\n * })\n * const { spt } = await res.json()\n * return spt\n * },\n * paymentMethod: 'pm_card_visa',\n * }),\n * ],\n * })\n * ```\n */\nexport function stripe(parameters: stripe.Parameters) {\n return [charge_(parameters)] as const\n}\n\nexport namespace stripe {\n export type Parameters = charge_.Parameters\n\n /** Creates a Stripe `charge` client method for SPT-based payments. */\n export const charge = charge_\n}\n","import * as Address from '../core/Address.js'\nimport type * as Bytes from '../core/Bytes.js'\nimport * as Errors from '../core/Errors.js'\nimport * as Hex from '../core/Hex.js'\nimport type {\n Assign,\n Compute,\n IsNarrowable,\n OneOf,\n PartialBy,\n UnionPartialBy,\n} from '../core/internal/types.js'\nimport * as Json from '../core/Json.js'\nimport * as ox_P256 from '../core/P256.js'\nimport type * as PublicKey from '../core/PublicKey.js'\nimport * as ox_Secp256k1 from '../core/Secp256k1.js'\nimport * as Signature from '../core/Signature.js'\nimport type * as WebAuthnP256 from '../core/WebAuthnP256.js'\nimport * as ox_WebAuthnP256 from '../core/WebAuthnP256.js'\n\n/** Signature type identifiers for encoding/decoding */\nconst serializedP256Type = '0x01'\nconst serializedWebAuthnType = '0x02'\nconst serializedKeychainType = '0x03'\nconst serializedKeychainV2Type = '0x04'\n\n/** Serialized magic identifier for Tempo signature envelopes. */\nexport const magicBytes =\n '0x7777777777777777777777777777777777777777777777777777777777777777' // 32 \"T\"s\n\n/**\n * Statically determines the signature type of an envelope at compile time.\n *\n * @example\n * ```ts twoslash\n * import type { SignatureEnvelope } from 'ox/tempo'\n *\n * type Type = SignatureEnvelope.GetType<{ r: bigint; s: bigint; yParity: number }>\n * // @log: 'secp256k1'\n * ```\n */\nexport type GetType<\n envelope extends PartialBy<SignatureEnvelope, 'type'> | unknown,\n> = unknown extends envelope\n ? envelope extends unknown\n ? Type\n : never\n : envelope extends { type: infer T extends Type }\n ? T\n : envelope extends {\n signature: { r: bigint; s: bigint }\n prehash: boolean\n publicKey: PublicKey.PublicKey\n }\n ? 'p256'\n : envelope extends {\n signature: { r: bigint; s: bigint }\n metadata: any\n publicKey: PublicKey.PublicKey\n }\n ? 'webAuthn'\n : envelope extends { r: bigint; s: bigint; yParity: number }\n ? 'secp256k1'\n : envelope extends {\n signature: { r: bigint; s: bigint; yParity: number }\n }\n ? 'secp256k1'\n : envelope extends {\n userAddress: Address.Address\n }\n ? 'keychain'\n : never\n\n/**\n * Represents a signature envelope that can contain different signature types.\n *\n * Tempo transactions support multiple signature types, each with different wire formats:\n *\n * - **secp256k1** (no type prefix, 65 bytes): Standard Ethereum ECDSA signature. The sender\n * address is recovered via `ecrecover`. Base transaction cost: 21,000 gas.\n *\n * - **p256** (type `0x01`, 130 bytes): P256/secp256r1 curve signature for passkey accounts.\n * Includes embedded public key (64 bytes) and prehash flag. Enables native WebCrypto\n * key support. Additional gas cost: +5,000 gas over secp256k1.\n *\n * - **webAuthn** (type `0x02`, 129-2049 bytes): WebAuthn signature with authenticator data\n * and clientDataJSON. Enables browser passkey authentication. The signature is also\n * charged as calldata (16 gas/non-zero byte, 4 gas/zero byte).\n *\n * - **keychain** (type `0x03` V1, `0x04` V2): Access key signature that wraps an inner signature\n * (secp256k1, p256, or webAuthn). Format: type byte + user_address (20 bytes) + inner signature.\n * V2 binds the signature to the user account via `keccak256(sigHash || userAddress)`.\n * The protocol validates the access key authorization via the AccountKeychain precompile.\n *\n * [Signature Types Specification](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#signature-types)\n */\nexport type SignatureEnvelope<bigintType = bigint, numberType = number> = OneOf<\n | Secp256k1<bigintType, numberType>\n | P256<bigintType, numberType>\n | WebAuthn<bigintType, numberType>\n | Keychain<bigintType, numberType>\n>\n\n/**\n * RPC-formatted signature envelope.\n */\nexport type SignatureEnvelopeRpc = OneOf<\n Secp256k1Rpc | P256Rpc | WebAuthnRpc | KeychainRpc\n>\n\n/**\n * Keychain signature version.\n *\n * - `'v1'`: Legacy format. Inner signature signs the raw `sig_hash` directly. Deprecated at T1C.\n * - `'v2'`: Inner signature signs `keccak256(sig_hash || user_address)`, binding the signature\n * to the specific user account.\n */\nexport type KeychainVersion = 'v1' | 'v2'\n\nexport type Keychain<bigintType = bigint, numberType = number> = {\n /** Root account address that this transaction is being executed for */\n userAddress: Address.Address\n /** The actual signature from the access key (can be Secp256k1, P256, or WebAuthn) */\n inner: SignatureEnvelope<bigintType, numberType>\n /** The access key address (recovered address of the access key signer). */\n keyId?: Address.Address | undefined\n type: 'keychain'\n /** Keychain signature version. @default 'v1' */\n version?: KeychainVersion | undefined\n}\n\nexport type KeychainRpc = {\n type: 'keychain'\n userAddress: Address.Address\n keyId?: Address.Address | undefined\n signature: SignatureEnvelopeRpc\n version?: KeychainVersion | undefined\n}\n\nexport type P256<bigintType = bigint, numberType = number> = {\n prehash: boolean\n publicKey: PublicKey.PublicKey\n signature: Signature.Signature<false, bigintType, numberType>\n type: 'p256'\n}\n\nexport type P256Rpc = {\n preHash: boolean\n pubKeyX: Hex.Hex\n pubKeyY: Hex.Hex\n r: Hex.Hex\n s: Hex.Hex\n type: 'p256'\n}\n\nexport type Secp256k1<bigintType = bigint, numberType = number> = {\n signature: Signature.Signature<true, bigintType, numberType>\n type: 'secp256k1'\n}\n\nexport type Secp256k1Rpc = Compute<\n Signature.Rpc<true> & {\n v?: Hex.Hex | undefined\n type: 'secp256k1'\n }\n>\n\nexport type Secp256k1Flat<\n bigintType = bigint,\n numberType = number,\n> = Signature.Signature<true, bigintType, numberType> & {\n type?: 'secp256k1' | undefined\n}\n\nexport type WebAuthn<bigintType = bigint, numberType = number> = {\n metadata: Pick<\n WebAuthnP256.SignMetadata,\n 'authenticatorData' | 'clientDataJSON'\n >\n signature: Signature.Signature<false, bigintType, numberType>\n publicKey: PublicKey.PublicKey\n type: 'webAuthn'\n}\n\nexport type WebAuthnRpc = {\n pubKeyX: Hex.Hex\n pubKeyY: Hex.Hex\n r: Hex.Hex\n s: Hex.Hex\n type: 'webAuthn'\n webauthnData: Hex.Hex\n}\n\n/** Hex-encoded serialized signature envelope. */\nexport type Serialized = Hex.Hex\n\n/** List of supported signature types. */\nexport const types = ['secp256k1', 'p256', 'webAuthn'] as const\n\n/** Union type of supported signature types. */\nexport type Type = (typeof types)[number]\n\n/**\n * Asserts that a {@link ox#SignatureEnvelope.SignatureEnvelope} is valid.\n *\n * @example\n * ```ts twoslash\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * SignatureEnvelope.assert({\n * type: 'secp256k1',\n * signature: {\n * r: 0n,\n * s: 0n,\n * yParity: 0,\n * },\n * })\n * ```\n *\n * @param envelope - The signature envelope to assert.\n * @throws `CoercionError` if the envelope type cannot be determined.\n */\nexport function assert(envelope: PartialBy<SignatureEnvelope, 'type'>): void {\n const type = getType(envelope)\n\n if (type === 'secp256k1') {\n const secp256k1 = envelope as Secp256k1\n Signature.assert(secp256k1.signature)\n return\n }\n\n if (type === 'p256') {\n const p256 = envelope as P256\n const missing: string[] = []\n\n if (typeof p256.signature?.r !== 'bigint') missing.push('signature.r')\n if (typeof p256.signature?.s !== 'bigint') missing.push('signature.s')\n if (typeof p256.prehash !== 'boolean') missing.push('prehash')\n if (!p256.publicKey) missing.push('publicKey')\n else {\n if (typeof p256.publicKey.x !== 'bigint') missing.push('publicKey.x')\n if (typeof p256.publicKey.y !== 'bigint') missing.push('publicKey.y')\n }\n\n if (missing.length > 0)\n throw new MissingPropertiesError({ envelope, missing, type: 'p256' })\n return\n }\n\n if (type === 'webAuthn') {\n const webauthn = envelope as WebAuthn\n const missing: string[] = []\n\n if (typeof webauthn.signature?.r !== 'bigint') missing.push('signature.r')\n if (typeof webauthn.signature?.s !== 'bigint') missing.push('signature.s')\n if (!webauthn.metadata) missing.push('metadata')\n else {\n if (!webauthn.metadata.authenticatorData)\n missing.push('metadata.authenticatorData')\n if (!webauthn.metadata.clientDataJSON)\n missing.push('metadata.clientDataJSON')\n }\n if (!webauthn.publicKey) missing.push('publicKey')\n else {\n if (typeof webauthn.publicKey.x !== 'bigint') missing.push('publicKey.x')\n if (typeof webauthn.publicKey.y !== 'bigint') missing.push('publicKey.y')\n }\n\n if (missing.length > 0)\n throw new MissingPropertiesError({ envelope, missing, type: 'webAuthn' })\n return\n }\n\n if (type === 'keychain') {\n const keychain = envelope as Keychain\n assert(keychain.inner)\n return\n }\n}\n\nexport declare namespace assert {\n type ErrorType =\n | CoercionError\n | MissingPropertiesError\n | Signature.assert.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Extracts the address of the signer from a {@link ox#SignatureEnvelope.SignatureEnvelope}.\n *\n * - **secp256k1**: Recovers the address from the payload via `ecrecover`.\n * - **p256** / **webAuthn**: Derives the address from the embedded public key.\n * - **keychain**: Extracts from the inner signature (or returns `userAddress` if `user` is `true`).\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const payload = '0xdeadbeef'\n * const signature = Secp256k1.sign({ payload, privateKey: '0x...' })\n * const envelope = SignatureEnvelope.from(signature)\n *\n * const address = SignatureEnvelope.extractAddress({ // [!code focus]\n * payload, // [!code focus]\n * signature: envelope, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param options - The extraction options.\n * @returns The signer address.\n */\nexport function extractAddress(\n options: extractAddress.Options,\n): extractAddress.ReturnType {\n const { signature, root } = options\n if (signature.type === 'keychain') {\n if (root) return signature.userAddress\n return extractAddress({ ...options, signature: signature.inner })\n }\n return Address.fromPublicKey(extractPublicKey(options))\n}\n\nexport declare namespace extractAddress {\n type Options = {\n /** The sign payload that was signed (only required for secp256k1 signatures). */\n payload: Hex.Hex | Bytes.Bytes\n /** The signature envelope. */\n signature: SignatureEnvelope\n /** Whether to return the root `userAddress` for keychain signatures instead of extracting from the inner signature. */\n root?: boolean | undefined\n }\n\n type ReturnType = Address.Address\n\n type ErrorType =\n | Address.fromPublicKey.ErrorType\n | extractPublicKey.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Extracts the public key of the signer from a {@link ox#SignatureEnvelope.SignatureEnvelope}.\n *\n * - **secp256k1**: Recovers the public key from the payload via `ecrecover`.\n * - **p256** / **webAuthn**: Returns the embedded public key.\n * - **keychain**: Extracts from the inner signature.\n *\n * @example\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const payload = '0xdeadbeef'\n * const signature = Secp256k1.sign({ payload, privateKey: '0x...' })\n * const envelope = SignatureEnvelope.from(signature)\n *\n * const publicKey = SignatureEnvelope.extractPublicKey({ // [!code focus]\n * payload, // [!code focus]\n * signature: envelope, // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param options - The extraction options.\n * @returns The signer's public key.\n */\nexport function extractPublicKey(\n options: extractPublicKey.Options,\n): extractPublicKey.ReturnType {\n const { payload, signature } = options\n\n switch (signature.type) {\n case 'secp256k1':\n return ox_Secp256k1.recoverPublicKey({\n payload,\n signature: signature.signature,\n })\n case 'p256':\n case 'webAuthn':\n return signature.publicKey\n case 'keychain':\n return extractPublicKey({ payload, signature: signature.inner })\n }\n}\n\nexport declare namespace extractPublicKey {\n type Options = {\n /** The sign payload that was signed (only required for secp256k1 signatures). */\n payload: Hex.Hex | Bytes.Bytes\n /** The signature envelope. */\n signature: SignatureEnvelope\n }\n\n type ReturnType = PublicKey.PublicKey\n\n type ErrorType =\n | ox_Secp256k1.recoverPublicKey.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Deserializes a hex-encoded signature envelope into a typed signature object.\n *\n * Wire format detection:\n * - 65 bytes (no prefix): secp256k1 signature\n * - Type `0x01` + 129 bytes: P256 signature (r, s, pubKeyX, pubKeyY, prehash)\n * - Type `0x02` + variable: WebAuthn signature (webauthnData, r, s, pubKeyX, pubKeyY)\n * - Type `0x03` + 20 bytes + inner: Keychain V1 signature (userAddress + inner signature)\n * - Type `0x04` + 20 bytes + inner: Keychain V2 signature (userAddress + inner signature)\n *\n * [Signature Types](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#signature-types)\n *\n * @example\n * ```ts twoslash\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const envelope = SignatureEnvelope.deserialize('0x...')\n * ```\n *\n * @param serialized - The hex-encoded signature envelope to deserialize.\n * @returns The deserialized signature envelope.\n * @throws `CoercionError` if the serialized value cannot be coerced to a valid signature envelope.\n */\nexport function deserialize(value: Serialized): SignatureEnvelope {\n const serialized = value.endsWith(magicBytes.slice(2))\n ? Hex.slice(value, 0, -Hex.size(magicBytes))\n : value\n\n const size = Hex.size(serialized)\n\n // Backward compatibility: 65 bytes means secp256k1 without type identifier\n if (size === 65) {\n const signature = Signature.fromHex(serialized)\n Signature.assert(signature)\n return { signature, type: 'secp256k1' } satisfies Secp256k1\n }\n\n // For all other lengths, first byte is the type identifier\n const typeId = Hex.slice(serialized, 0, 1)\n const data = Hex.slice(serialized, 1)\n const dataSize = Hex.size(data)\n\n if (typeId === serializedP256Type) {\n // P256: 32 (r) + 32 (s) + 32 (pubKeyX) + 32 (pubKeyY) + 1 (prehash) = 129 bytes\n if (dataSize !== 129)\n throw new InvalidSerializedError({\n reason: `Invalid P256 signature envelope size: expected 129 bytes, got ${dataSize} bytes`,\n serialized,\n })\n\n return {\n publicKey: {\n prefix: 4,\n x: Hex.toBigInt(Hex.slice(data, 64, 96)),\n y: Hex.toBigInt(Hex.slice(data, 96, 128)),\n },\n prehash: Hex.toNumber(Hex.slice(data, 128, 129)) !== 0,\n signature: {\n r: Hex.toBigInt(Hex.slice(data, 0, 32)),\n s: Hex.toBigInt(Hex.slice(data, 32, 64)),\n },\n type: 'p256',\n } satisfies P256\n }\n\n if (typeId === serializedWebAuthnType) {\n // WebAuthn: variable (webauthnData) + 32 (r) + 32 (s) + 32 (pubKeyX) + 32 (pubKeyY)\n // Minimum: 128 bytes (at least some authenticator data + signature components)\n if (dataSize < 128)\n throw new InvalidSerializedError({\n reason: `Invalid WebAuthn signature envelope size: expected at least 128 bytes, got ${dataSize} bytes`,\n serialized,\n })\n\n const webauthnDataSize = dataSize - 128\n const webauthnData = Hex.slice(data, 0, webauthnDataSize)\n\n // Parse webauthnData into authenticatorData and clientDataJSON\n // According to the Rust code, it's authenticatorData || clientDataJSON\n // We need to find the split point (minimum authenticatorData is 37 bytes)\n let authenticatorData: Hex.Hex | undefined\n let clientDataJSON: string | undefined\n\n // Try to find the JSON start (clientDataJSON should start with '{')\n for (let split = 37; split < webauthnDataSize; split++) {\n const potentialJson = Hex.toString(Hex.slice(webauthnData, split))\n if (potentialJson.startsWith('{') && potentialJson.endsWith('}')) {\n try {\n JSON.parse(potentialJson)\n authenticatorData = Hex.slice(webauthnData, 0, split)\n clientDataJSON = potentialJson\n break\n } catch {}\n }\n }\n\n if (!authenticatorData || !clientDataJSON)\n throw new InvalidSerializedError({\n reason:\n 'Unable to parse WebAuthn metadata: could not extract valid authenticatorData and clientDataJSON',\n serialized,\n })\n\n return {\n publicKey: {\n prefix: 4,\n x: Hex.toBigInt(\n Hex.slice(data, webauthnDataSize + 64, webauthnDataSize + 96),\n ),\n y: Hex.toBigInt(\n Hex.slice(data, webauthnDataSize + 96, webauthnDataSize + 128),\n ),\n },\n metadata: {\n authenticatorData,\n clientDataJSON,\n },\n signature: {\n r: Hex.toBigInt(\n Hex.slice(data, webauthnDataSize, webauthnDataSize + 32),\n ),\n s: Hex.toBigInt(\n Hex.slice(data, webauthnDataSize + 32, webauthnDataSize + 64),\n ),\n },\n type: 'webAuthn',\n } satisfies WebAuthn\n }\n\n if (\n typeId === serializedKeychainType ||\n typeId === serializedKeychainV2Type\n ) {\n const userAddress = Hex.slice(data, 0, 20)\n const inner = deserialize(Hex.slice(data, 20))\n\n return {\n userAddress,\n inner,\n type: 'keychain',\n version: typeId === serializedKeychainV2Type ? 'v2' : 'v1',\n } satisfies Keychain\n }\n\n throw new InvalidSerializedError({\n reason: `Unknown signature type identifier: ${typeId}. Expected ${serializedP256Type} (P256), ${serializedWebAuthnType} (WebAuthn), ${serializedKeychainType} (Keychain V1), or ${serializedKeychainV2Type} (Keychain V2)`,\n serialized,\n })\n}\n\n/**\n * Coerces a value to a signature envelope.\n *\n * Accepts either a serialized hex string or an existing signature envelope object.\n * Use this to wrap raw signatures from {@link ox#Secp256k1.(sign:function)}, {@link ox#P256.(sign:function)},\n * {@link ox#WebCryptoP256.(sign:function)}, or {@link ox#WebAuthnP256.(sign:function)} into the envelope format\n * required by Tempo transactions.\n *\n * [Signature Types](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#signature-types)\n *\n * @example\n * ### Secp256k1\n *\n * Standard Ethereum ECDSA signature using the secp256k1 curve.\n *\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const privateKey = Secp256k1.randomPrivateKey()\n * const signature = Secp256k1.sign({ payload: '0xdeadbeef', privateKey })\n *\n * const envelope = SignatureEnvelope.from(signature)\n * ```\n *\n * @example\n * ### P256\n *\n * ECDSA signature using the P-256 (secp256r1) curve. Requires embedding the\n * public key.\n *\n * ```ts twoslash\n * import { P256 } from 'ox'\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const { privateKey, publicKey } = P256.createKeyPair()\n * const signature = P256.sign({ payload: '0xdeadbeef', privateKey })\n *\n * const envelope = SignatureEnvelope.from({\n * signature,\n * publicKey,\n * })\n * ```\n *\n * @example\n * ### P256 (WebCrypto)\n *\n * When using WebCrypto keys, `prehash` must be `true` since WebCrypto always\n * SHA256 hashes the digest before signing.\n *\n * ```ts twoslash\n * // @noErrors\n * import { WebCryptoP256 } from 'ox'\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const { privateKey, publicKey } = await WebCryptoP256.createKeyPair()\n * const signature = await WebCryptoP256.sign({ payload: '0xdeadbeef', privateKey })\n *\n * const envelope = SignatureEnvelope.from({\n * signature,\n * publicKey,\n * prehash: true,\n * })\n * ```\n *\n * @example\n * ### WebAuthn\n *\n * Passkey-based signature using WebAuthn. Includes authenticator metadata\n * (authenticatorData and clientDataJSON) along with the P-256 signature and\n * public key.\n *\n * ```ts twoslash\n * // @noErrors\n * import { WebAuthnP256 } from 'ox'\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const credential = await WebAuthnP256.createCredential({\n * name: 'Example',\n * })\n *\n * const { metadata, signature } = await WebAuthnP256.sign({\n * challenge: '0xdeadbeef',\n * credentialId: credential.id,\n * })\n *\n * const envelope = SignatureEnvelope.from({\n * signature,\n * publicKey: credential.publicKey,\n * metadata,\n * })\n * ```\n *\n * @example\n * ### Keychain\n *\n * Wraps another signature type with a user address, used for delegated signing\n * via access keys on behalf of a root account.\n *\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const privateKey = Secp256k1.randomPrivateKey()\n * const signature = Secp256k1.sign({ payload: '0xdeadbeef', privateKey })\n *\n * const envelope = SignatureEnvelope.from({\n * userAddress: '0x1234567890123456789012345678901234567890',\n * inner: SignatureEnvelope.from(signature),\n * })\n * ```\n *\n * @param value - The value to coerce (either a hex string or signature envelope).\n * @returns The signature envelope.\n */\nexport function from<const value extends from.Value>(\n value: value | from.Value,\n options?: from.Options | undefined,\n): from.ReturnValue<value> {\n if (typeof value === 'string') return deserialize(value) as never\n\n if (\n typeof value === 'object' &&\n value !== null &&\n 'r' in value &&\n 's' in value &&\n 'yParity' in value\n )\n return { signature: value, type: 'secp256k1' } as never\n\n const type = getType(value)\n return {\n ...value,\n ...(type === 'p256' ? { prehash: value.prehash } : {}),\n ...(type === 'keychain'\n ? {\n ...(!(\n typeof value === 'object' &&\n value !== null &&\n 'version' in value &&\n value.version\n )\n ? { version: 'v2' }\n : {}),\n ...(!(typeof value === 'object' && 'keyId' in value && value.keyId)\n ? (() => {\n const inner = (value as Keychain).inner\n if (inner.type === 'p256' || inner.type === 'webAuthn')\n return { keyId: Address.fromPublicKey(inner.publicKey) }\n if (inner.type === 'secp256k1' && options?.payload)\n return {\n keyId: Address.fromPublicKey(\n ox_Secp256k1.recoverPublicKey({\n payload: options.payload,\n signature: inner.signature,\n }),\n ),\n }\n return {}\n })()\n : {}),\n }\n : {}),\n type,\n } as never\n}\n\nexport declare namespace from {\n type Options = {\n /** Payload that was signed. Used to recover `keyId` for keychain envelopes with secp256k1 inner signatures. */\n payload?: Hex.Hex | Bytes.Bytes | undefined\n }\n\n type Value =\n | UnionPartialBy<SignatureEnvelope, 'prehash' | 'type'>\n | Secp256k1Flat\n | Serialized\n\n type ReturnValue<value extends Value> = Compute<\n OneOf<\n value extends Serialized\n ? SignatureEnvelope\n : value extends Secp256k1Flat\n ? Secp256k1\n : IsNarrowable<value, SignatureEnvelope> extends true\n ? SignatureEnvelope\n : Assign<\n value,\n {\n readonly type: GetType<value>\n } & (GetType<value> extends 'keychain'\n ? { keyId?: Address.Address | undefined }\n : {})\n >\n >\n >\n}\n\n/**\n * Converts an RPC-formatted signature envelope to a typed signature envelope.\n *\n * @example\n * ```ts twoslash\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const envelope = SignatureEnvelope.fromRpc({\n * r: '0x0',\n * s: '0x0',\n * yParity: '0x0',\n * type: 'secp256k1',\n * })\n * ```\n *\n * @param envelope - The RPC signature envelope to convert.\n * @returns The signature envelope with bigint values.\n */\nexport function fromRpc(envelope: SignatureEnvelopeRpc): SignatureEnvelope {\n if (envelope.type === 'secp256k1')\n return {\n signature: Signature.fromRpc(envelope),\n type: 'secp256k1',\n }\n\n if (envelope.type === 'p256') {\n return {\n prehash: envelope.preHash,\n publicKey: {\n prefix: 4,\n x: Hex.toBigInt(envelope.pubKeyX),\n y: Hex.toBigInt(envelope.pubKeyY),\n },\n signature: {\n r: Hex.toBigInt(envelope.r),\n s: Hex.toBigInt(envelope.s),\n },\n type: 'p256',\n }\n }\n\n if (envelope.type === 'webAuthn') {\n const webauthnData = envelope.webauthnData\n const webauthnDataSize = Hex.size(webauthnData)\n\n // Parse webauthnData into authenticatorData and clientDataJSON\n let authenticatorData: Hex.Hex | undefined\n let clientDataJSON: string | undefined\n\n // Try to find the JSON start (clientDataJSON should start with '{')\n for (let split = 37; split < webauthnDataSize; split++) {\n const potentialJson = Hex.toString(Hex.slice(webauthnData, split))\n if (potentialJson.startsWith('{') && potentialJson.endsWith('}')) {\n try {\n JSON.parse(potentialJson)\n authenticatorData = Hex.slice(webauthnData, 0, split)\n clientDataJSON = potentialJson\n break\n } catch {}\n }\n }\n\n if (!authenticatorData || !clientDataJSON)\n throw new InvalidSerializedError({\n reason:\n 'Unable to parse WebAuthn metadata: could not extract valid authenticatorData and clientDataJSON',\n serialized: webauthnData,\n })\n\n return {\n metadata: {\n authenticatorData,\n clientDataJSON,\n },\n publicKey: {\n prefix: 4,\n x: Hex.toBigInt(envelope.pubKeyX),\n y: Hex.toBigInt(envelope.pubKeyY),\n },\n signature: {\n r: Hex.toBigInt(envelope.r),\n s: Hex.toBigInt(envelope.s),\n },\n type: 'webAuthn',\n }\n }\n\n if (\n envelope.type === 'keychain' ||\n ('userAddress' in envelope && 'signature' in envelope)\n )\n return {\n type: 'keychain',\n userAddress: envelope.userAddress,\n inner: fromRpc(envelope.signature),\n ...(envelope.keyId ? { keyId: envelope.keyId } : {}),\n ...(envelope.version ? { version: envelope.version } : {}),\n }\n\n throw new CoercionError({ envelope })\n}\n\nexport declare namespace fromRpc {\n type ErrorType =\n | CoercionError\n | InvalidSerializedError\n | Signature.fromRpc.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Determines the signature type of an envelope.\n *\n * @example\n * ```ts twoslash\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const type = SignatureEnvelope.getType({\n * signature: { r: 0n, s: 0n, yParity: 0 },\n * })\n * // @log: 'secp256k1'\n * ```\n *\n * @param envelope - The signature envelope to inspect.\n * @returns The signature type ('secp256k1', 'p256', or 'webAuthn').\n * @throws `CoercionError` if the envelope type cannot be determined.\n */\nexport function getType<\n envelope extends\n | PartialBy<SignatureEnvelope, 'type'>\n | Secp256k1Flat\n | unknown,\n>(envelope: envelope): GetType<envelope> {\n if (typeof envelope !== 'object' || envelope === null)\n throw new CoercionError({ envelope })\n\n if ('type' in envelope && envelope.type) return envelope.type as never\n\n // Detect secp256k1 signature (backwards compatibility: also support flat structure)\n if (\n 'signature' in envelope &&\n !('publicKey' in envelope) &&\n typeof envelope.signature === 'object' &&\n envelope.signature !== null &&\n 'r' in envelope.signature &&\n 's' in envelope.signature &&\n 'yParity' in envelope.signature\n )\n return 'secp256k1' as never\n\n // Detect secp256k1 signature (flat structure)\n if ('r' in envelope && 's' in envelope && 'yParity' in envelope)\n return 'secp256k1' as never\n\n // Detect P256 signature\n if (\n 'signature' in envelope &&\n 'prehash' in envelope &&\n 'publicKey' in envelope &&\n typeof envelope.prehash === 'boolean'\n )\n return 'p256' as never\n\n // Detect WebAuthn signature\n if (\n 'signature' in envelope &&\n 'metadata' in envelope &&\n 'publicKey' in envelope\n )\n return 'webAuthn' as never\n\n // Detect Keychain signature\n if ('userAddress' in envelope && 'inner' in envelope)\n return 'keychain' as never\n\n throw new CoercionError({\n envelope,\n })\n}\n\n/**\n * Serializes a signature envelope to a hex-encoded string.\n *\n * Wire format:\n * - secp256k1: 65 bytes (no type prefix, for backward compatibility)\n * - P256: `0x01` + r (32) + s (32) + pubKeyX (32) + pubKeyY (32) + prehash (1) = 130 bytes\n * - WebAuthn: `0x02` + webauthnData (variable) + r (32) + s (32) + pubKeyX (32) + pubKeyY (32)\n * - Keychain V1: `0x03` + userAddress (20) + inner signature (recursive)\n * - Keychain V2: `0x04` + userAddress (20) + inner signature (recursive)\n *\n * [Signature Types](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#signature-types)\n *\n * @example\n * ```ts twoslash\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const serialized = SignatureEnvelope.serialize({\n * signature: { r: 0n, s: 0n, yParity: 0 },\n * type: 'secp256k1',\n * })\n * ```\n *\n * @param envelope - The signature envelope to serialize.\n * @returns The hex-encoded serialized signature.\n * @throws `CoercionError` if the envelope cannot be serialized.\n */\nexport function serialize(\n envelope: UnionPartialBy<SignatureEnvelope, 'prehash'>,\n options: serialize.Options = {},\n): Serialized {\n const type = getType(envelope)\n\n // Backward compatibility: no type identifier for secp256k1\n if (type === 'secp256k1') {\n const secp256k1 = envelope as Secp256k1\n return Hex.concat(\n Signature.toHex(secp256k1.signature),\n options.magic ? magicBytes : '0x',\n )\n }\n\n if (type === 'p256') {\n const p256 = envelope as P256\n // Format: 1 byte (type) + 32 (r) + 32 (s) + 32 (pubKeyX) + 32 (pubKeyY) + 1 (prehash)\n return Hex.concat(\n serializedP256Type,\n Hex.fromNumber(p256.signature.r, { size: 32 }),\n Hex.fromNumber(p256.signature.s, { size: 32 }),\n Hex.fromNumber(p256.publicKey.x, { size: 32 }),\n Hex.fromNumber(p256.publicKey.y, { size: 32 }),\n Hex.fromNumber(p256.prehash ? 1 : 0, { size: 1 }),\n options.magic ? magicBytes : '0x',\n )\n }\n\n if (type === 'webAuthn') {\n const webauthn = envelope as WebAuthn\n // Format: 1 byte (type) + variable (authenticatorData || clientDataJSON) + 32 (r) + 32 (s) + 32 (pubKeyX) + 32 (pubKeyY)\n const webauthnData = Hex.concat(\n webauthn.metadata.authenticatorData,\n Hex.fromString(webauthn.metadata.clientDataJSON),\n )\n\n return Hex.concat(\n serializedWebAuthnType,\n webauthnData,\n Hex.fromNumber(webauthn.signature.r, { size: 32 }),\n Hex.fromNumber(webauthn.signature.s, { size: 32 }),\n Hex.fromNumber(webauthn.publicKey.x, { size: 32 }),\n Hex.fromNumber(webauthn.publicKey.y, { size: 32 }),\n options.magic ? magicBytes : '0x',\n )\n }\n\n if (type === 'keychain') {\n const keychain = envelope as Keychain\n const keychainTypeId =\n keychain.version === 'v1'\n ? serializedKeychainType\n : serializedKeychainV2Type\n return Hex.concat(\n keychainTypeId,\n keychain.userAddress,\n serialize(keychain.inner),\n options.magic ? magicBytes : '0x',\n )\n }\n\n throw new CoercionError({ envelope })\n}\n\nexport declare namespace serialize {\n type Options = {\n /**\n * Whether to serialize the signature envelope with the Tempo magic identifier.\n * This is useful for being able to distinguish between Tempo and non-Tempo (e.g. ERC-1271) signatures.\n */\n magic?: boolean | undefined\n }\n}\n\n/**\n * Converts a signature envelope to RPC format.\n *\n * @example\n * ```ts twoslash\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const rpc = SignatureEnvelope.toRpc({\n * signature: { r: 0n, s: 0n, yParity: 0 },\n * type: 'secp256k1',\n * })\n * ```\n *\n * @param envelope - The signature envelope to convert.\n * @returns The RPC signature envelope with hex values.\n */\nexport function toRpc(envelope: SignatureEnvelope): SignatureEnvelopeRpc {\n const type = getType(envelope)\n\n if (type === 'secp256k1') {\n const secp256k1 = envelope as Secp256k1\n return {\n ...Signature.toRpc(secp256k1.signature),\n type: 'secp256k1',\n }\n }\n\n if (type === 'p256') {\n const p256 = envelope as P256\n return {\n preHash: p256.prehash,\n pubKeyX: Hex.fromNumber(p256.publicKey.x, { size: 32 }),\n pubKeyY: Hex.fromNumber(p256.publicKey.y, { size: 32 }),\n r: Hex.fromNumber(p256.signature.r, { size: 32 }),\n s: Hex.fromNumber(p256.signature.s, { size: 32 }),\n type: 'p256',\n }\n }\n\n if (type === 'webAuthn') {\n const webauthn = envelope as WebAuthn\n const webauthnData = Hex.concat(\n webauthn.metadata.authenticatorData,\n Hex.fromString(webauthn.metadata.clientDataJSON),\n )\n\n return {\n pubKeyX: Hex.fromNumber(webauthn.publicKey.x, { size: 32 }),\n pubKeyY: Hex.fromNumber(webauthn.publicKey.y, { size: 32 }),\n r: Hex.fromNumber(webauthn.signature.r, { size: 32 }),\n s: Hex.fromNumber(webauthn.signature.s, { size: 32 }),\n type: 'webAuthn',\n webauthnData,\n }\n }\n\n if (type === 'keychain') {\n const keychain = envelope as Keychain\n return {\n type: 'keychain',\n userAddress: keychain.userAddress,\n signature: toRpc(keychain.inner),\n ...(keychain.keyId ? { keyId: keychain.keyId } : {}),\n ...(keychain.version ? { version: keychain.version } : {}),\n }\n }\n\n throw new CoercionError({ envelope })\n}\n\nexport declare namespace toRpc {\n type ErrorType =\n | CoercionError\n | Signature.toRpc.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Validates a signature envelope. Returns `true` if the envelope is valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { SignatureEnvelope } from 'ox/tempo'\n *\n * const valid = SignatureEnvelope.validate({\n * signature: { r: 0n, s: 0n, yParity: 0 },\n * type: 'secp256k1',\n * })\n * // @log: true\n * ```\n *\n * @param envelope - The signature envelope to validate.\n * @returns `true` if valid, `false` otherwise.\n */\nexport function validate(\n envelope: PartialBy<SignatureEnvelope, 'type'>,\n): boolean {\n try {\n assert(envelope)\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Verifies a signature envelope against a digest/payload.\n *\n * Supports `secp256k1`, `p256`, and `webAuthn` signature types.\n *\n * :::warning\n * `keychain` signatures are not supported and will throw an error.\n * :::\n *\n * @example\n * ### Secp256k1\n *\n * ```ts twoslash\n * import { SignatureEnvelope } from 'ox/tempo'\n * import { Secp256k1 } from 'ox'\n *\n * const privateKey = Secp256k1.randomPrivateKey()\n * const publicKey = Secp256k1.getPublicKey({ privateKey })\n * const payload = '0xdeadbeef'\n *\n * const signature = Secp256k1.sign({ payload, privateKey })\n * const envelope = SignatureEnvelope.from(signature)\n *\n * const valid = SignatureEnvelope.verify(envelope, {\n * payload,\n * publicKey,\n * })\n * // @log: true\n * ```\n *\n * @example\n * ### P256\n *\n * For P256 signatures, the `address` or `publicKey` must match the embedded\n * public key in the signature envelope.\n *\n * ```ts twoslash\n * import { SignatureEnvelope } from 'ox/tempo'\n * import { P256 } from 'ox'\n *\n * const privateKey = P256.randomPrivateKey()\n * const publicKey = P256.getPublicKey({ privateKey })\n * const payload = '0xdeadbeef'\n *\n * const signature = P256.sign({ payload, privateKey })\n * const envelope = SignatureEnvelope.from({ prehash: false, publicKey, signature })\n *\n * const valid = SignatureEnvelope.verify(envelope, {\n * payload,\n * publicKey,\n * })\n * // @log: true\n * ```\n *\n * @example\n * ### WebCryptoP256\n *\n * ```ts twoslash\n * import { SignatureEnvelope } from 'ox/tempo'\n * import { WebCryptoP256 } from 'ox'\n *\n * const { privateKey, publicKey } = await WebCryptoP256.createKeyPair()\n * const payload = '0xdeadbeef'\n *\n * const signature = await WebCryptoP256.sign({ payload, privateKey })\n * const envelope = SignatureEnvelope.from({ prehash: true, publicKey, signature })\n *\n * const valid = SignatureEnvelope.verify(envelope, {\n * payload,\n * publicKey,\n * })\n * // @log: true\n * ```\n *\n * @example\n * ### WebAuthnP256\n *\n * ```ts twoslash\n * import { SignatureEnvelope } from 'ox/tempo'\n * import { WebAuthnP256 } from 'ox'\n *\n * const credential = await WebAuthnP256.createCredential({ name: 'Example' })\n * const payload = '0xdeadbeef'\n *\n * const { metadata, signature } = await WebAuthnP256.sign({\n * challenge: payload,\n * credentialId: credential.id,\n * })\n * const envelope = SignatureEnvelope.from({\n * metadata,\n * signature,\n * publicKey: credential.publicKey,\n * })\n *\n * const valid = SignatureEnvelope.verify(envelope, {\n * payload,\n * publicKey: credential.publicKey,\n * })\n * // @log: true\n * ```\n *\n * @param parameters - Verification parameters.\n * @returns `true` if the signature is valid, `false` otherwise.\n */\nexport function verify(\n signature: SignatureEnvelope,\n parameters: verify.Parameters,\n): boolean {\n const { payload } = parameters\n\n const address = (() => {\n if (parameters.address) return parameters.address\n if (parameters.publicKey) return Address.fromPublicKey(parameters.publicKey)\n return undefined\n })()\n if (!address) return false\n\n const envelope = from(signature)\n\n if (envelope.type === 'secp256k1') {\n if (!address) return false\n return ox_Secp256k1.verify({\n address,\n payload,\n signature: envelope.signature,\n })\n }\n\n if (envelope.type === 'p256') {\n const envelopeAddress = Address.fromPublicKey(envelope.publicKey)\n if (!Address.isEqual(envelopeAddress, address)) return false\n return ox_P256.verify({\n hash: envelope.prehash,\n publicKey: envelope.publicKey,\n payload,\n signature: envelope.signature,\n })\n }\n\n if (envelope.type === 'webAuthn') {\n const envelopeAddress = Address.fromPublicKey(envelope.publicKey)\n if (!Address.isEqual(envelopeAddress, address)) return false\n return ox_WebAuthnP256.verify({\n challenge: Hex.from(payload),\n metadata: envelope.metadata,\n publicKey: envelope.publicKey,\n signature: envelope.signature,\n })\n }\n\n throw new VerificationError(\n `Unable to verify signature envelope of type \"${envelope.type}\".`,\n )\n}\n\nexport declare namespace verify {\n type Parameters = {\n /** Payload that was signed. */\n payload: Hex.Hex | Bytes.Bytes\n } & OneOf<\n | {\n /** Public key that signed the payload. */\n publicKey: PublicKey.PublicKey\n }\n | {\n /** Address that signed the payload. */\n address: Address.Address\n }\n >\n}\n\n/**\n * Error thrown when a signature envelope cannot be coerced to a valid type.\n */\nexport class CoercionError extends Errors.BaseError {\n override readonly name = 'SignatureEnvelope.CoercionError'\n constructor({ envelope }: { envelope: unknown }) {\n super(\n `Unable to coerce value (\\`${Json.stringify(envelope)}\\`) to a valid signature envelope.`,\n )\n }\n}\n\n/**\n * Error thrown when a signature envelope is missing required properties.\n */\nexport class MissingPropertiesError extends Errors.BaseError {\n override readonly name = 'SignatureEnvelope.MissingPropertiesError'\n constructor({\n envelope,\n missing,\n type,\n }: {\n envelope: unknown\n missing: string[]\n type: Type\n }) {\n super(\n `Signature envelope of type \"${type}\" is missing required properties: ${missing.map((m) => `\\`${m}\\``).join(', ')}.\\n\\nProvided: ${Json.stringify(envelope)}`,\n )\n }\n}\n\n/**\n * Error thrown when a serialized signature envelope cannot be deserialized.\n */\nexport class InvalidSerializedError extends Errors.BaseError {\n override readonly name = 'SignatureEnvelope.InvalidSerializedError'\n constructor({\n reason,\n serialized,\n }: {\n reason: string\n serialized: Hex.Hex\n }) {\n super(`Unable to deserialize signature envelope: ${reason}`, {\n metaMessages: [`Serialized: ${serialized}`],\n })\n }\n}\n\n/**\n * Error thrown when a signature envelope fails to verify.\n */\nexport class VerificationError extends Errors.BaseError {\n override readonly name = 'SignatureEnvelope.VerificationError'\n}\n","import * as core_Address from '../core/Address.js'\nimport * as Errors from '../core/Errors.js'\nimport * as Hex from '../core/Hex.js'\nimport type { Compute } from '../core/internal/types.js'\n\n/** An address that can be either an Ethereum hex address or a Tempo address. */\nexport type Address = core_Address.Address | Tempo\n\n/** Root type for a Tempo Address. */\nexport type Tempo = Compute<`tempox${string}`>\n\n/**\n * Resolves an address input (either an Ethereum hex address or a Tempo address)\n * to an Ethereum hex address.\n *\n * @example\n * ```ts twoslash\n * import { TempoAddress } from 'ox/tempo'\n *\n * const address = TempoAddress.resolve('tempox0x742d35cc6634c0532925a3b844bc9e7595f2bd28')\n * // @log: '0x742d35CC6634c0532925a3B844bc9e7595F2Bd28'\n * ```\n *\n * @example\n * ### Hex Address Passthrough\n * ```ts twoslash\n * import { TempoAddress } from 'ox/tempo'\n *\n * const address = TempoAddress.resolve('0x742d35Cc6634C0532925a3b844Bc9e7595f2bD28')\n * // @log: '0x742d35CC6634c0532925a3B844bc9e7595F2Bd28'\n * ```\n *\n * @param address - An Ethereum hex address or Tempo address.\n * @returns The resolved Ethereum hex address.\n */\nexport function resolve(address: Address): core_Address.Address {\n if (address.startsWith('tempo')) return parse(address).address\n return address as core_Address.Address\n}\n\n/**\n * Formats a raw Ethereum address into a Tempo address string.\n *\n * @example\n * ```ts twoslash\n * import { TempoAddress } from 'ox/tempo'\n *\n * const address = TempoAddress.format('0x742d35Cc6634C0532925a3b844Bc9e7595f2bD28')\n * // @log: 'tempox0x742d35cc6634c0532925a3b844bc9e7595f2bd28'\n * ```\n *\n * @param address - The raw 20-byte Ethereum address.\n * @returns The encoded Tempo address string.\n */\nexport function format(address: Address): Tempo {\n const resolved = resolve(address)\n return `tempox${resolved.toLowerCase()}` as Tempo\n}\n\nexport declare namespace format {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Parses a Tempo address string into a raw Ethereum address.\n *\n * @example\n * ```ts twoslash\n * import { TempoAddress } from 'ox/tempo'\n *\n * const result = TempoAddress.parse(\n * 'tempox0x742d35cc6634c0532925a3b844bc9e7595f2bd28',\n * )\n * // @log: { address: '0x742d35CC6634c0532925a3B844bc9e7595F2Bd28' }\n * ```\n *\n * @param tempoAddress - The Tempo address string to parse.\n * @returns The parsed raw address.\n */\nexport function parse(tempoAddress: string): parse.ReturnType {\n if (!tempoAddress.startsWith('tempox'))\n throw new InvalidPrefixError({ address: tempoAddress })\n\n const hex = tempoAddress.slice('tempox'.length)\n Hex.assert(hex, { strict: true })\n\n const address = core_Address.checksum(hex)\n\n return { address }\n}\n\nexport declare namespace parse {\n type ReturnType = {\n /** The raw 20-byte Ethereum address. */\n address: core_Address.Address\n }\n\n type ErrorType = InvalidPrefixError | Errors.GlobalErrorType\n}\n\n/**\n * Validates a Tempo address string.\n *\n * @example\n * ```ts twoslash\n * import { TempoAddress } from 'ox/tempo'\n *\n * const valid = TempoAddress.validate(\n * 'tempox0x742d35cc6634c0532925a3b844bc9e7595f2bd28',\n * )\n * // @log: true\n * ```\n *\n * @param tempoAddress - The Tempo address string to validate.\n * @returns Whether the address is valid.\n */\nexport function validate(tempoAddress: string): boolean {\n try {\n parse(tempoAddress)\n return true\n } catch {\n return false\n }\n}\n\n/** Thrown when a Tempo address has an invalid prefix. */\nexport class InvalidPrefixError extends Errors.BaseError {\n override readonly name = 'TempoAddress.InvalidPrefixError'\n\n constructor({ address }: { address: string }) {\n super(\n `Tempo address \"${address}\" has an invalid prefix. Expected \"tempox\".`,\n )\n }\n}\n","import type * as Errors from '../core/Errors.js'\nimport * as Hash from '../core/Hash.js'\nimport * as Hex from '../core/Hex.js'\nimport type { Compute, Mutable } from '../core/internal/types.js'\nimport * as Rlp from '../core/Rlp.js'\nimport * as SignatureEnvelope from './SignatureEnvelope.js'\nimport * as TempoAddress from './TempoAddress.js'\n\n/**\n * Root type for a Tempo Authorization.\n *\n * Tempo extends EIP-7702 to support secp256k1, P256, and WebAuthn signature types,\n * enabling passkey-based account delegation.\n *\n * [Tempo Authorization Specification](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#tempo-authorization-list)\n */\nexport type AuthorizationTempo<\n signed extends boolean = boolean,\n bigintType = bigint,\n numberType = number,\n> = Compute<\n {\n /** Address of the contract to set as code for the Authority. */\n address: TempoAddress.Address\n /** Chain ID to authorize. */\n chainId: numberType\n /** Nonce of the Authority to authorize. */\n nonce: bigintType\n } & (signed extends true\n ? { signature: SignatureEnvelope.SignatureEnvelope<bigintType, numberType> }\n : {\n signature?:\n | SignatureEnvelope.SignatureEnvelope<bigintType, numberType>\n | undefined\n })\n>\n\n/** RPC representation of an {@link ox#AuthorizationTempo.AuthorizationTempo}. */\nexport type Rpc = Omit<\n AuthorizationTempo<false, Hex.Hex, Hex.Hex>,\n 'signature'\n> & {\n signature: SignatureEnvelope.SignatureEnvelopeRpc\n}\n\n/** List of {@link ox#AuthorizationTempo.AuthorizationTempo}. */\nexport type List<\n signed extends boolean = boolean,\n bigintType = bigint,\n numberType = number,\n> = Compute<readonly AuthorizationTempo<signed, bigintType, numberType>[]>\n\n/** RPC representation of a list of AA Authorizations. */\nexport type ListRpc = readonly Rpc[]\n\n/** Signed representation of a list of AA Authorizations. */\nexport type ListSigned<bigintType = bigint, numberType = number> = List<\n true,\n bigintType,\n numberType\n>\n\n/** Signed representation of an AA Authorization. */\nexport type Signed<\n bigintType = bigint,\n numberType = number,\n> = AuthorizationTempo<true, bigintType, numberType>\n\n/** Tuple representation of an AA Authorization. */\nexport type Tuple<signed extends boolean = boolean> = signed extends true\n ? readonly [\n chainId: Hex.Hex,\n address: Hex.Hex,\n nonce: Hex.Hex,\n signature: Hex.Hex,\n ]\n : readonly [chainId: Hex.Hex, address: Hex.Hex, nonce: Hex.Hex]\n\n/** Tuple representation of a signed {@link ox#AuthorizationTempo.AuthorizationTempo}. */\nexport type TupleSigned = Tuple<true>\n\n/** Tuple representation of a list of {@link ox#AuthorizationTempo.AuthorizationTempo}. */\nexport type TupleList<signed extends boolean = boolean> =\n readonly Tuple<signed>[]\n\n/** Tuple representation of a list of signed {@link ox#AuthorizationTempo.AuthorizationTempo}. */\nexport type TupleListSigned = TupleList<true>\n\n/**\n * Converts an EIP-7702 Authorization object into a typed {@link ox#AuthorizationTempo.AuthorizationTempo}.\n *\n * Tempo extends EIP-7702 to support secp256k1, P256, and WebAuthn signature types.\n *\n * [Tempo Authorization Specification](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#tempo-authorization-list)\n *\n * @example\n * An Authorization can be instantiated from an EIP-7702 Authorization tuple in object format.\n *\n * ```ts twoslash\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const authorization = AuthorizationTempo.from({\n * address: 'tempox0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n * ```\n *\n * @example\n * ### Attaching Signatures (Secp256k1)\n *\n * Standard Ethereum ECDSA signature using the secp256k1 curve.\n *\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const privateKey = Secp256k1.randomPrivateKey()\n *\n * const authorization = AuthorizationTempo.from({\n * address: 'tempox0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * chainId: 1,\n * nonce: 40n,\n * })\n *\n * const signature = Secp256k1.sign({\n * payload: AuthorizationTempo.getSignPayload(authorization),\n * privateKey,\n * })\n *\n * const authorization_signed = AuthorizationTempo.from(\n * authorization,\n * { signature }, // [!code focus]\n * )\n * ```\n *\n * @example\n * ### Attaching Signatures (P256)\n *\n * ECDSA signature using the P-256 (secp256r1) curve. Requires embedding the\n * public key and a `prehash` flag indicating whether the payload was hashed\n * before signing.\n *\n * ```ts twoslash\n * import { P256 } from 'ox'\n * import { AuthorizationTempo, SignatureEnvelope } from 'ox/tempo'\n *\n * const { privateKey, publicKey } = P256.createKeyPair()\n *\n * const authorization = AuthorizationTempo.from({\n * address: 'tempox0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * chainId: 1,\n * nonce: 40n,\n * })\n *\n * const signature = P256.sign({\n * payload: AuthorizationTempo.getSignPayload(authorization),\n * privateKey,\n * })\n * const signatureEnvelope = SignatureEnvelope.from({\n * signature,\n * publicKey,\n * prehash: false,\n * })\n *\n * const authorization_signed = AuthorizationTempo.from(\n * authorization,\n * { signature: signatureEnvelope }, // [!code focus]\n * )\n * ```\n *\n * @example\n * ### Attaching Signatures (P256 WebCrypto)\n *\n * When using WebCrypto keys, `prehash` must be `true` since WebCrypto always\n * hashes the payload internally before signing.\n *\n * ```ts twoslash\n * // @noErrors\n * import { WebCryptoP256 } from 'ox'\n * import { AuthorizationTempo, SignatureEnvelope } from 'ox/tempo'\n *\n * const { privateKey, publicKey } = await WebCryptoP256.createKeyPair()\n *\n * const authorization = AuthorizationTempo.from({\n * address: 'tempox0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * chainId: 1,\n * nonce: 40n,\n * })\n *\n * const signature = await WebCryptoP256.sign({\n * payload: AuthorizationTempo.getSignPayload(authorization),\n * privateKey,\n * })\n * const signatureEnvelope = SignatureEnvelope.from({\n * signature,\n * publicKey,\n * prehash: true,\n * })\n *\n * const authorization_signed = AuthorizationTempo.from(\n * authorization,\n * { signature: signatureEnvelope }, // [!code focus]\n * )\n * ```\n *\n * @example\n * ### Attaching Signatures (WebAuthn)\n *\n * Passkey-based signature using WebAuthn. Includes authenticator metadata\n * (authenticatorData and clientDataJSON) along with the P-256 signature and\n * public key.\n *\n * ```ts twoslash\n * // @noErrors\n * import { WebAuthnP256 } from 'ox'\n * import { AuthorizationTempo, SignatureEnvelope } from 'ox/tempo'\n *\n * const credential = await WebAuthnP256.createCredential({ name: 'Example' })\n *\n * const authorization = AuthorizationTempo.from({\n * address: 'tempox0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * chainId: 1,\n * nonce: 40n,\n * })\n *\n * const { metadata, signature } = await WebAuthnP256.sign({\n * challenge: AuthorizationTempo.getSignPayload(authorization),\n * credentialId: credential.id,\n * })\n * const signatureEnvelope = SignatureEnvelope.from({\n * signature,\n * publicKey: credential.publicKey,\n * metadata,\n * })\n *\n * const authorization_signed = AuthorizationTempo.from(\n * authorization,\n * { signature: signatureEnvelope }, // [!code focus]\n * )\n * ```\n *\n * @param authorization - An [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) AA Authorization tuple in object format.\n * @param options - AA Authorization options.\n * @returns The {@link ox#AuthorizationTempo.AuthorizationTempo}.\n */\nexport function from<\n const authorization extends AuthorizationTempo | Rpc,\n const signature extends SignatureEnvelope.from.Value | undefined = undefined,\n>(\n authorization: authorization | AuthorizationTempo,\n options: from.Options<signature> = {},\n): from.ReturnType<authorization, signature> {\n if (typeof authorization.chainId === 'string')\n return fromRpc(authorization as Rpc) as never\n const resolved = {\n ...authorization,\n address: TempoAddress.resolve(\n authorization.address as TempoAddress.Address,\n ),\n }\n if (options.signature) {\n return { ...resolved, signature: options.signature } as never\n }\n return resolved as never\n}\n\nexport declare namespace from {\n type Options<\n signature extends SignatureEnvelope.from.Value | undefined =\n | SignatureEnvelope.from.Value\n | undefined,\n > = {\n /** The {@link ox#SignatureEnvelope.SignatureEnvelope} to attach to the AA Authorization. */\n signature?: signature | SignatureEnvelope.SignatureEnvelope | undefined\n }\n\n type ReturnType<\n authorization extends AuthorizationTempo | Rpc = AuthorizationTempo,\n signature extends SignatureEnvelope.from.Value | undefined =\n | SignatureEnvelope.from.Value\n | undefined,\n > = Compute<\n authorization extends Rpc\n ? Signed\n : authorization &\n (signature extends SignatureEnvelope.from.Value\n ? { signature: SignatureEnvelope.from.ReturnValue<signature> }\n : {})\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#AuthorizationTempo.Rpc} to an {@link ox#AuthorizationTempo.AuthorizationTempo}.\n *\n * @example\n * ```ts twoslash\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const authorization = AuthorizationTempo.fromRpc({\n * address: 'tempox0x0000000000000000000000000000000000000000',\n * chainId: '0x1',\n * nonce: '0x1',\n * signature: {\n * type: 'secp256k1',\n * r: '0x635dc2033e60185bb36709c29c75d64ea51dfbd91c32ef4be198e4ceb169fb4d',\n * s: '0x50c2667ac4c771072746acfdcf1f1483336dcca8bd2df47cd83175dbe60f0540',\n * yParity: '0x0',\n * },\n * })\n * ```\n *\n * @param authorization - The RPC-formatted AA Authorization.\n * @returns A signed {@link ox#AuthorizationTempo.AuthorizationTempo}.\n */\nexport function fromRpc(authorization: Rpc): Signed {\n const { address, chainId, nonce } = authorization\n const signature = SignatureEnvelope.fromRpc(authorization.signature)\n return {\n address,\n chainId: Number(chainId),\n nonce: BigInt(nonce),\n signature,\n } as never\n}\n\nexport declare namespace fromRpc {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#AuthorizationTempo.ListRpc} to an {@link ox#AuthorizationTempo.List}.\n *\n * @example\n * ```ts twoslash\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const authorizationList = AuthorizationTempo.fromRpcList([{\n * address: 'tempox0x0000000000000000000000000000000000000000',\n * chainId: '0x1',\n * nonce: '0x1',\n * signature: {\n * type: 'secp256k1',\n * r: '0x635dc2033e60185bb36709c29c75d64ea51dfbd91c32ef4be198e4ceb169fb4d',\n * s: '0x50c2667ac4c771072746acfdcf1f1483336dcca8bd2df47cd83175dbe60f0540',\n * yParity: '0x0',\n * },\n * }])\n * ```\n *\n * @param authorizationList - The RPC-formatted AA Authorization list.\n * @returns A signed {@link ox#AuthorizationTempo.List}.\n */\nexport function fromRpcList(authorizationList: ListRpc): ListSigned {\n return authorizationList.map((x) => fromRpc(x as unknown as Rpc))\n}\n\nexport declare namespace fromRpcList {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#AuthorizationTempo.Tuple} to an {@link ox#AuthorizationTempo.AuthorizationTempo}.\n *\n * @example\n * ```ts twoslash\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const authorization = AuthorizationTempo.fromTuple([\n * '0x1',\n * '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * '0x3'\n * ])\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 1,\n * // @log: nonce: 3n\n * // @log: }\n * ```\n *\n * @example\n * It is also possible to append a serialized SignatureEnvelope to the end of an AA Authorization tuple.\n *\n * ```ts twoslash\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const authorization = AuthorizationTempo.fromTuple([\n * '0x1',\n * '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * '0x3',\n * '0x01a068a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b907e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064',\n * ])\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 1,\n * // @log: nonce: 3n\n * // @log: signature: {\n * // @log: r: BigInt('0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90'),\n * // @log: s: BigInt('0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'),\n * // @log: yParity: 0,\n * // @log: },\n * // @log: }\n * ```\n *\n * @param tuple - The [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) AA Authorization tuple.\n * @returns The {@link ox#AuthorizationTempo.AuthorizationTempo}.\n */\nexport function fromTuple<const tuple extends Tuple>(\n tuple: tuple,\n): fromTuple.ReturnType<tuple> {\n const [chainId, address, nonce, signatureSerialized] = tuple\n const args: AuthorizationTempo = {\n address,\n chainId: chainId === '0x' ? 0 : Number(chainId),\n nonce: nonce === '0x' ? 0n : BigInt(nonce),\n }\n if (signatureSerialized)\n args.signature = SignatureEnvelope.deserialize(signatureSerialized)\n return from(args) as never\n}\n\nexport declare namespace fromTuple {\n type ReturnType<authorization extends Tuple = Tuple> = Compute<\n AuthorizationTempo<authorization extends Tuple<true> ? true : false>\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#AuthorizationTempo.TupleList} to an {@link ox#AuthorizationTempo.List}.\n *\n * @example\n * ```ts twoslash\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const authorizationList = AuthorizationTempo.fromTupleList([\n * ['0x1', '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c', '0x3'],\n * ['0x3', '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c', '0x14'],\n * ])\n * // @log: [\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 1,\n * // @log: nonce: 3n,\n * // @log: },\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 3,\n * // @log: nonce: 20n,\n * // @log: },\n * // @log: ]\n * ```\n *\n * @example\n * It is also possible to append a serialized SignatureEnvelope to the end of an AA Authorization tuple.\n *\n * ```ts twoslash\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const authorizationList = AuthorizationTempo.fromTupleList([\n * ['0x1', '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c', '0x3', '0x01a068a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b907e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'],\n * ['0x3', '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c', '0x14', '0x01a068a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b907e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'],\n * ])\n * // @log: [\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 1,\n * // @log: nonce: 3n,\n * // @log: signature: {\n * // @log: r: BigInt('0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90'),\n * // @log: s: BigInt('0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'),\n * // @log: yParity: 0,\n * // @log: },\n * // @log: },\n * // @log: {\n * // @log: address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: chainId: 3,\n * // @log: nonce: 20n,\n * // @log: signature: {\n * // @log: r: BigInt('0x68a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b90'),\n * // @log: s: BigInt('0x7e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064'),\n * // @log: yParity: 0,\n * // @log: },\n * // @log: },\n * // @log: ]\n * ```\n *\n * @param tupleList - The [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) AA Authorization tuple list.\n * @returns An {@link ox#AuthorizationTempo.List}.\n */\nexport function fromTupleList<const tupleList extends TupleList>(\n tupleList: tupleList,\n): fromTupleList.ReturnType<tupleList> {\n const list: Mutable<List> = []\n for (const tuple of tupleList) list.push(fromTuple(tuple))\n return list as never\n}\n\nexport declare namespace fromTupleList {\n type ReturnType<tupleList extends TupleList> = Compute<\n TupleList<tupleList extends TupleList<true> ? true : false>\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Computes the sign payload for an {@link ox#AuthorizationTempo.AuthorizationTempo} in [EIP-7702 format](https://eips.ethereum.org/EIPS/eip-7702): `keccak256('0x05' || rlp([chain_id, address, nonce]))`.\n *\n * @example\n * ### Secp256k1\n *\n * Standard Ethereum ECDSA signature using the secp256k1 curve.\n *\n * ```ts twoslash\n * import { Secp256k1 } from 'ox'\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const privateKey = Secp256k1.randomPrivateKey()\n *\n * const authorization = AuthorizationTempo.from({\n * address: 'tempox0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const payload = AuthorizationTempo.getSignPayload(authorization) // [!code focus]\n *\n * const signature = Secp256k1.sign({ payload, privateKey })\n * const authorization_signed = AuthorizationTempo.from(\n * authorization,\n * { signature }\n * )\n * ```\n *\n * @example\n * ### P256\n *\n * ECDSA signature using the P-256 (secp256r1) curve. Requires embedding the\n * public key and a `prehash` flag indicating whether the payload was hashed\n * before signing.\n *\n * ```ts twoslash\n * import { P256 } from 'ox'\n * import { AuthorizationTempo, SignatureEnvelope } from 'ox/tempo'\n *\n * const { privateKey, publicKey } = P256.createKeyPair()\n *\n * const authorization = AuthorizationTempo.from({\n * address: 'tempox0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const payload = AuthorizationTempo.getSignPayload(authorization) // [!code focus]\n *\n * const signature = P256.sign({ payload, privateKey })\n * const signatureEnvelope = SignatureEnvelope.from({\n * prehash: false,\n * publicKey,\n * signature,\n * })\n * const authorization_signed = AuthorizationTempo.from(\n * authorization,\n * { signature: signatureEnvelope }\n * )\n * ```\n *\n * @example\n * ### P256 (WebCrypto)\n *\n * When using WebCrypto keys, `prehash` must be `true` since WebCrypto always\n * hashes the payload internally before signing.\n *\n * ```ts twoslash\n * // @noErrors\n * import { WebCryptoP256 } from 'ox'\n * import { AuthorizationTempo, SignatureEnvelope } from 'ox/tempo'\n *\n * const { privateKey, publicKey } = await WebCryptoP256.createKeyPair()\n *\n * const authorization = AuthorizationTempo.from({\n * address: 'tempox0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const payload = AuthorizationTempo.getSignPayload(authorization) // [!code focus]\n *\n * const signature = await WebCryptoP256.sign({ payload, privateKey })\n * const signatureEnvelope = SignatureEnvelope.from({\n * prehash: true,\n * publicKey,\n * signature,\n * })\n * const authorization_signed = AuthorizationTempo.from(\n * authorization,\n * { signature: signatureEnvelope }\n * )\n * ```\n *\n * @example\n * ### WebAuthn\n *\n * Passkey-based signature using WebAuthn. Includes authenticator metadata\n * (authenticatorData and clientDataJSON) along with the P-256 signature and\n * public key.\n *\n * ```ts twoslash\n * // @noErrors\n * import { WebAuthnP256 } from 'ox'\n * import { AuthorizationTempo, SignatureEnvelope } from 'ox/tempo'\n *\n * const credential = await WebAuthnP256.createCredential({ name: 'Example' })\n *\n * const authorization = AuthorizationTempo.from({\n * address: 'tempox0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const challenge = AuthorizationTempo.getSignPayload(authorization) // [!code focus]\n *\n * const { metadata, signature } = await WebAuthnP256.sign({\n * challenge,\n * credentialId: credential.id,\n * })\n * const signatureEnvelope = SignatureEnvelope.from({\n * signature,\n * publicKey: credential.publicKey,\n * metadata,\n * })\n * const authorization_signed = AuthorizationTempo.from(\n * authorization,\n * { signature: signatureEnvelope }\n * )\n * ```\n *\n * @param authorization - The {@link ox#AuthorizationTempo.AuthorizationTempo}.\n * @returns The sign payload.\n */\nexport function getSignPayload(authorization: AuthorizationTempo): Hex.Hex {\n return hash(authorization, { presign: true })\n}\n\nexport declare namespace getSignPayload {\n type ErrorType = hash.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Computes the hash for an {@link ox#AuthorizationTempo.AuthorizationTempo} in [EIP-7702 format](https://eips.ethereum.org/EIPS/eip-7702): `keccak256('0x05' || rlp([chain_id, address, nonce]))`.\n *\n * @example\n * ```ts twoslash\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const authorization = AuthorizationTempo.from({\n * address: 'tempox0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const hash = AuthorizationTempo.hash(authorization) // [!code focus]\n * ```\n *\n * @param authorization - The {@link ox#AuthorizationTempo.AuthorizationTempo}.\n * @returns The hash.\n */\nexport function hash(\n authorization: AuthorizationTempo,\n options: hash.Options = {},\n): Hex.Hex {\n const { presign } = options\n return Hash.keccak256(\n Hex.concat(\n '0x05',\n Rlp.fromHex(\n toTuple(\n presign\n ? {\n address: authorization.address,\n chainId: authorization.chainId,\n nonce: authorization.nonce,\n }\n : authorization,\n ),\n ),\n ),\n )\n}\n\nexport declare namespace hash {\n type ErrorType =\n | toTuple.ErrorType\n | Hash.keccak256.ErrorType\n | Hex.concat.ErrorType\n | Rlp.fromHex.ErrorType\n | Errors.GlobalErrorType\n\n type Options = {\n /** Whether to hash this authorization for signing. @default false */\n presign?: boolean | undefined\n }\n}\n\n/**\n * Converts an {@link ox#AuthorizationTempo.AuthorizationTempo} to an {@link ox#AuthorizationTempo.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const authorization = AuthorizationTempo.toRpc({\n * address: 'tempox0x0000000000000000000000000000000000000000',\n * chainId: 1,\n * nonce: 1n,\n * signature: {\n * type: 'secp256k1',\n * signature: {\n * r: 44944627813007772897391531230081695102703289123332187696115181104739239197517n,\n * s: 36528503505192438307355164441104001310566505351980369085208178712678799181120n,\n * yParity: 0,\n * },\n * },\n * })\n * ```\n *\n * @param authorization - An AA Authorization.\n * @returns An RPC-formatted AA Authorization.\n */\nexport function toRpc(authorization: Signed): Rpc {\n const { address, chainId, nonce, signature } = authorization\n\n return {\n address,\n chainId: Hex.fromNumber(chainId),\n nonce: Hex.fromNumber(nonce),\n signature: SignatureEnvelope.toRpc(signature),\n }\n}\n\nexport declare namespace toRpc {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#AuthorizationTempo.List} to an {@link ox#AuthorizationTempo.ListRpc}.\n *\n * @example\n * ```ts twoslash\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const authorization = AuthorizationTempo.toRpcList([{\n * address: 'tempox0x0000000000000000000000000000000000000000',\n * chainId: 1,\n * nonce: 1n,\n * signature: {\n * type: 'secp256k1',\n * signature: {\n * r: 44944627813007772897391531230081695102703289123332187696115181104739239197517n,\n * s: 36528503505192438307355164441104001310566505351980369085208178712678799181120n,\n * yParity: 0,\n * },\n * },\n * }])\n * ```\n *\n * @param authorizationList - An AA Authorization List.\n * @returns An RPC-formatted AA Authorization List.\n */\nexport function toRpcList(authorizationList: ListSigned): ListRpc {\n return authorizationList.map((x) => toRpc(x as unknown as Signed)) as never\n}\n\nexport declare namespace toRpcList {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#AuthorizationTempo.AuthorizationTempo} to an {@link ox#AuthorizationTempo.Tuple}.\n *\n * @example\n * ```ts twoslash\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const authorization = AuthorizationTempo.from({\n * address: 'tempox0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n *\n * const tuple = AuthorizationTempo.toTuple(authorization) // [!code focus]\n * // @log: [\n * // @log: address: '0x1234567890abcdef1234567890abcdef12345678',\n * // @log: chainId: 1,\n * // @log: nonce: 69n,\n * // @log: ]\n * ```\n *\n * @param authorization - The {@link ox#AuthorizationTempo.AuthorizationTempo}.\n * @returns An [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) AA Authorization tuple.\n */\nexport function toTuple<const authorization extends AuthorizationTempo>(\n authorization: authorization,\n): toTuple.ReturnType<authorization> {\n const { address, chainId, nonce } = authorization\n const signature = authorization.signature\n ? SignatureEnvelope.serialize(authorization.signature)\n : undefined\n return [\n chainId ? Hex.fromNumber(chainId) : '0x',\n address,\n nonce ? Hex.fromNumber(nonce) : '0x',\n ...(signature ? [signature] : []),\n ] as never\n}\n\nexport declare namespace toTuple {\n type ReturnType<\n authorization extends AuthorizationTempo = AuthorizationTempo,\n > = Compute<\n Tuple<authorization extends AuthorizationTempo<true> ? true : false>\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#AuthorizationTempo.List} to an {@link ox#AuthorizationTempo.TupleList}.\n *\n * @example\n * ```ts twoslash\n * import { AuthorizationTempo } from 'ox/tempo'\n *\n * const authorization_1 = AuthorizationTempo.from({\n * address: 'tempox0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 1,\n * nonce: 69n,\n * })\n * const authorization_2 = AuthorizationTempo.from({\n * address: 'tempox0x1234567890abcdef1234567890abcdef12345678',\n * chainId: 3,\n * nonce: 20n,\n * })\n *\n * const tuple = AuthorizationTempo.toTupleList([authorization_1, authorization_2]) // [!code focus]\n * // @log: [\n * // @log: [\n * // @log: address: '0x1234567890abcdef1234567890abcdef12345678',\n * // @log: chainId: 1,\n * // @log: nonce: 69n,\n * // @log: ],\n * // @log: [\n * // @log: address: '0x1234567890abcdef1234567890abcdef12345678',\n * // @log: chainId: 3,\n * // @log: nonce: 20n,\n * // @log: ],\n * // @log: ]\n * ```\n *\n * @param list - An {@link ox#AuthorizationTempo.List}.\n * @returns An [EIP-7702](https://eips.ethereum.org/EIPS/eip-7702) AA Authorization tuple list.\n */\nexport function toTupleList<\n const list extends\n | readonly AuthorizationTempo<true>[]\n | readonly AuthorizationTempo<false>[],\n>(list?: list | undefined): toTupleList.ReturnType<list> {\n if (!list || list.length === 0) return []\n\n const tupleList: Mutable<TupleList> = []\n for (const authorization of list) tupleList.push(toTuple(authorization))\n\n return tupleList as never\n}\n\nexport declare namespace toTupleList {\n type ReturnType<\n list extends\n | readonly AuthorizationTempo<true>[]\n | readonly AuthorizationTempo<false>[],\n > = Compute<\n TupleList<list extends readonly AuthorizationTempo<true>[] ? true : false>\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n","import type * as Address from '../core/Address.js'\nimport type * as Errors from '../core/Errors.js'\nimport * as Hash from '../core/Hash.js'\nimport * as Hex from '../core/Hex.js'\nimport type { Compute } from '../core/internal/types.js'\nimport * as Rlp from '../core/Rlp.js'\nimport * as SignatureEnvelope from './SignatureEnvelope.js'\nimport * as TempoAddress from './TempoAddress.js'\n\n/**\n * Key authorization for provisioning access keys.\n *\n * Access keys allow a root key (e.g., a passkey) to delegate transaction signing to secondary\n * keys with customizable permissions including expiry timestamps and per-TIP-20 token spending\n * limits. This enables a user to sign transactions without repeated passkey prompts.\n *\n * The root key signs a `KeyAuthorization` to grant an access key permission to sign transactions\n * on its behalf. The authorization is attached to a transaction (which can be signed by the access\n * key itself), and the protocol validates the authorization before storing the key in the\n * AccountKeychain precompile.\n *\n * Key authorization fields:\n * - `address`: Address derived from the access key's public key (the \"key ID\")\n * - `chainId`: Chain ID for replay protection (0 = valid on any chain)\n * - `expiry`: Unix timestamp when the key expires (undefined = never expires)\n * - `limits`: Per-TIP-20 token spending limits (only applies to `transfer()` and `approve()` calls)\n * - `type`: Key type (`secp256k1`, `p256`, or `webAuthn`)\n *\n * [Access Keys Specification](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#access-keys)\n */\nexport type KeyAuthorization<\n signed extends boolean = boolean,\n bigintType = bigint,\n numberType = number,\n> = {\n /** Address derived from the public key of the key type. */\n address: TempoAddress.Address\n /** Chain ID for replay protection. */\n chainId: bigintType\n /** Unix timestamp when key expires (0 = never expires). */\n expiry?: numberType | null | undefined\n /** TIP20 spending limits for this key. */\n limits?: readonly TokenLimit<bigintType>[] | undefined\n /** Key type. (secp256k1, P256, WebAuthn). */\n type: SignatureEnvelope.Type\n} & (signed extends true\n ? { signature: SignatureEnvelope.SignatureEnvelope<bigintType, numberType> }\n : {\n signature?:\n | SignatureEnvelope.SignatureEnvelope<bigintType, numberType>\n | undefined\n })\n\n/** RPC representation of an {@link ox#KeyAuthorization.KeyAuthorization}. */\nexport type Rpc = Omit<\n KeyAuthorization<false, Hex.Hex, Hex.Hex>,\n 'address' | 'signature' | 'type'\n> & {\n keyId: Address.Address\n keyType: SignatureEnvelope.Type\n signature: SignatureEnvelope.SignatureEnvelopeRpc\n}\n\n/** Signed representation of a Key Authorization. */\nexport type Signed<bigintType = bigint, numberType = number> = KeyAuthorization<\n true,\n bigintType,\n numberType\n>\n\ntype BaseTuple = readonly [\n chainId: Hex.Hex,\n keyType: Hex.Hex,\n keyId: Address.Address,\n]\n\n/** Tuple representation of a Key Authorization. */\nexport type Tuple<signed extends boolean = boolean> = signed extends true\n ? readonly [\n authorization:\n | BaseTuple\n | readonly [...BaseTuple, expiry: Hex.Hex]\n | readonly [\n ...BaseTuple,\n expiry: Hex.Hex,\n limits: readonly [token: Address.Address, limit: Hex.Hex][],\n ],\n signature: Hex.Hex,\n ]\n : readonly [\n authorization:\n | BaseTuple\n | readonly [...BaseTuple, expiry: Hex.Hex]\n | readonly [\n ...BaseTuple,\n expiry: Hex.Hex,\n limits: readonly [token: Address.Address, limit: Hex.Hex][],\n ],\n ]\n\n/**\n * Token spending limit for access keys.\n *\n * Defines a per-TIP-20 token spending limit for an access key. Limits deplete as tokens\n * are spent and can be updated by the root key via `updateSpendingLimit()`.\n *\n * [Access Keys Specification](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#access-keys)\n */\nexport type TokenLimit<bigintType = bigint> = {\n /** Address of the TIP-20 token. */\n token: TempoAddress.Address\n /** Maximum spending amount for this token (enforced over the key's lifetime). */\n limit: bigintType\n}\n\n/**\n * Converts a Key Authorization object into a typed {@link ox#KeyAuthorization.KeyAuthorization}.\n *\n * Use this to create an unsigned key authorization, then sign it with the root key using\n * {@link ox#KeyAuthorization.(getSignPayload:function)} and attach the signature. The signed authorization\n * can be included in a {@link ox#TxEnvelopeTempo.TxEnvelopeTempo} via the\n * `keyAuthorization` field to provision the access key on-chain.\n *\n * [Access Keys Specification](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#access-keys)\n *\n * @example\n * ### Secp256k1 Key\n *\n * Standard Ethereum ECDSA key using the secp256k1 curve.\n *\n * ```ts twoslash\n * import { Address, Secp256k1, Value } from 'ox'\n * import { KeyAuthorization } from 'ox/tempo'\n *\n * const privateKey = Secp256k1.randomPrivateKey()\n * const address = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey }))\n *\n * const authorization = KeyAuthorization.from({\n * address,\n * chainId: 4217n,\n * expiry: 1234567890,\n * type: 'secp256k1',\n * limits: [{\n * token: '0x20c0000000000000000000000000000000000001',\n * limit: Value.from('10', 6),\n * }],\n * })\n * ```\n *\n * @example\n * ### WebCryptoP256 Key\n *\n * ```ts twoslash\n * import { Address, WebCryptoP256, Value } from 'ox'\n * import { KeyAuthorization } from 'ox/tempo'\n *\n * const keyPair = await WebCryptoP256.createKeyPair()\n * const address = Address.fromPublicKey(keyPair.publicKey)\n *\n * const authorization = KeyAuthorization.from({\n * address,\n * chainId: 4217n,\n * expiry: 1234567890,\n * type: 'p256',\n * limits: [{\n * token: '0x20c0000000000000000000000000000000000001',\n * limit: Value.from('10', 6),\n * }],\n * })\n * ```\n *\n * @example\n * ### Attaching Signatures (Secp256k1)\n *\n * Attach a signature to a Key Authorization using a Secp256k1 private key to\n * authorize another Secp256k1 key on the account.\n *\n * ```ts twoslash\n * import { Address, Secp256k1, Value } from 'ox'\n * import { KeyAuthorization } from 'ox/tempo'\n *\n * const privateKey = '0x...'\n * const address = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey }))\n *\n * const authorization = KeyAuthorization.from({\n * address,\n * chainId: 4217n,\n * expiry: 1234567890,\n * type: 'secp256k1',\n * limits: [{\n * token: '0x20c0000000000000000000000000000000000001',\n * limit: Value.from('10', 6),\n * }],\n * })\n *\n * const rootPrivateKey = '0x...'\n * const signature = Secp256k1.sign({\n * payload: KeyAuthorization.getSignPayload(authorization),\n * privateKey: rootPrivateKey,\n * })\n *\n * const authorization_signed = KeyAuthorization.from(authorization, { signature })\n * ```\n *\n * @example\n * ### Attaching Signatures (WebAuthn)\n *\n * Attach a signature to a Key Authorization using a WebAuthn credential to\n * authorize a new WebCryptoP256 key on the account.\n *\n * ```ts twoslash\n * // @noErrors\n * import { Address, Value, WebCryptoP256, WebAuthnP256 } from 'ox'\n * import { KeyAuthorization, SignatureEnvelope } from 'ox/tempo'\n *\n * const keyPair = await WebCryptoP256.createKeyPair()\n * const address = Address.fromPublicKey(keyPair.publicKey)\n *\n * const authorization = KeyAuthorization.from({\n * address,\n * chainId: 4217n,\n * expiry: 1234567890,\n * type: 'p256',\n * limits: [{\n * token: '0x20c0000000000000000000000000000000000001',\n * limit: Value.from('10', 6),\n * }],\n * })\n *\n * const credential = await WebAuthnP256.createCredential({ name: 'Example' })\n *\n * const { metadata, signature } = await WebAuthnP256.sign({\n * challenge: KeyAuthorization.getSignPayload(authorization),\n * credentialId: credential.id,\n * })\n *\n * const signatureEnvelope = SignatureEnvelope.from({ // [!code focus]\n * signature, // [!code focus]\n * publicKey: credential.publicKey, // [!code focus]\n * metadata, // [!code focus]\n * })\n * const authorization_signed = KeyAuthorization.from(\n * authorization,\n * { signature: signatureEnvelope }, // [!code focus]\n * )\n * ```\n *\n * @param authorization - A Key Authorization tuple in object format.\n * @param options - Key Authorization options.\n * @returns The {@link ox#KeyAuthorization.KeyAuthorization}.\n */\nexport function from<\n const authorization extends KeyAuthorization | Rpc,\n const signature extends SignatureEnvelope.from.Value | undefined = undefined,\n>(\n authorization: authorization | KeyAuthorization,\n options: from.Options<signature> = {},\n): from.ReturnType<authorization, signature> {\n if ('keyId' in authorization) return fromRpc(authorization as Rpc) as never\n const auth = authorization as KeyAuthorization & {\n limits?: readonly { token: TempoAddress.Address; limit: bigint }[]\n }\n const resolved = {\n ...auth,\n address: TempoAddress.resolve(auth.address as TempoAddress.Address),\n ...(auth.limits\n ? {\n limits: auth.limits.map((l) => ({\n ...l,\n token: TempoAddress.resolve(l.token as TempoAddress.Address),\n })),\n }\n : {}),\n }\n if (options.signature)\n return {\n ...resolved,\n signature: SignatureEnvelope.from(options.signature),\n } as never\n return resolved as never\n}\n\nexport declare namespace from {\n type Options<\n signature extends SignatureEnvelope.from.Value | undefined =\n | SignatureEnvelope.from.Value\n | undefined,\n > = {\n /** The {@link ox#SignatureEnvelope.SignatureEnvelope} to attach to the Key Authorization. */\n signature?: signature | SignatureEnvelope.SignatureEnvelope | undefined\n }\n\n type ReturnType<\n authorization extends KeyAuthorization | Rpc = KeyAuthorization,\n signature extends SignatureEnvelope.from.Value | undefined =\n | SignatureEnvelope.from.Value\n | undefined,\n > = Compute<\n authorization extends Rpc\n ? Signed\n : authorization &\n (signature extends SignatureEnvelope.from.Value\n ? { signature: SignatureEnvelope.from.ReturnValue<signature> }\n : {})\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#AuthorizationTempo.Rpc} to an {@link ox#AuthorizationTempo.AuthorizationTempo}.\n *\n * @example\n * ```ts twoslash\n * import { KeyAuthorization } from 'ox/tempo'\n *\n * const keyAuthorization = KeyAuthorization.fromRpc({\n * chainId: '0x1079',\n * expiry: '0x174876e800',\n * keyId: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * keyType: 'secp256k1',\n * limits: [{ token: '0x20c0000000000000000000000000000000000001', limit: '0xf4240' }],\n * signature: {\n * type: 'secp256k1',\n * r: '0x635dc2033e60185bb36709c29c75d64ea51dfbd91c32ef4be198e4ceb169fb4d',\n * s: '0x50c2667ac4c771072746acfdcf1f1483336dcca8bd2df47cd83175dbe60f0540',\n * yParity: '0x0'\n * },\n * })\n * ```\n *\n * @param authorization - The RPC-formatted Key Authorization.\n * @returns A signed {@link ox#AuthorizationTempo.AuthorizationTempo}.\n */\nexport function fromRpc(authorization: Rpc): Signed {\n const { chainId, keyId, expiry = 0, limits, keyType } = authorization\n const signature = SignatureEnvelope.fromRpc(authorization.signature)\n return {\n address: keyId,\n chainId: chainId === '0x' ? 0n : Hex.toBigInt(chainId),\n expiry: Number(expiry),\n limits: limits?.map((limit) => ({\n token: limit.token,\n limit: BigInt(limit.limit),\n })),\n signature,\n type: keyType,\n }\n}\n\nexport declare namespace fromRpc {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#KeyAuthorization.Tuple} to an {@link ox#KeyAuthorization.KeyAuthorization}.\n *\n * @example\n * ```ts twoslash\n * import { KeyAuthorization } from 'ox/tempo'\n *\n * const authorization = KeyAuthorization.fromTuple([\n * [\n * '0x',\n * '0x00',\n * '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * '0x174876e800',\n * [['0x20c0000000000000000000000000000000000001', '0xf4240']],\n * ],\n * '0x01a068a020a209d3d56c46f38cc50a33f704f4a9a10a59377f8dd762ac66910e9b907e865ad05c4035ab5792787d4a0297a43617ae897930a6fe4d822b8faea52064',\n * ])\n * ```\n *\n * @example\n * Unsigned Key Authorization tuple (no signature):\n *\n * ```ts twoslash\n * import { KeyAuthorization } from 'ox/tempo'\n *\n * const authorization = KeyAuthorization.fromTuple([\n * [\n * '0x',\n * '0x00',\n * '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * '0x174876e800',\n * [['0x20c0000000000000000000000000000000000001', '0xf4240']],\n * ],\n * ])\n * ```\n *\n * @param tuple - The Key Authorization tuple.\n * @returns The {@link ox#KeyAuthorization.KeyAuthorization}.\n */\nexport function fromTuple<const tuple extends Tuple>(\n tuple: tuple,\n): fromTuple.ReturnType<tuple> {\n const [authorization, signatureSerialized] = tuple\n const [chainId, keyType_hex, keyId, expiry, limits] = authorization\n const keyType = (() => {\n switch (keyType_hex) {\n case '0x':\n case '0x00':\n return 'secp256k1'\n case '0x01':\n return 'p256'\n case '0x02':\n return 'webAuthn'\n default:\n throw new Error(`Invalid key type: ${keyType_hex}`)\n }\n })()\n const args: KeyAuthorization = {\n address: keyId,\n expiry: typeof expiry !== 'undefined' ? hexToNumber(expiry) : undefined,\n type: keyType,\n chainId: chainId === '0x' ? 0n : Hex.toBigInt(chainId),\n ...(typeof expiry !== 'undefined' ? { expiry: hexToNumber(expiry) } : {}),\n ...(typeof limits !== 'undefined'\n ? {\n limits: limits.map(([token, limit]) => ({\n token,\n limit: hexToBigint(limit),\n })),\n }\n : {}),\n }\n if (signatureSerialized)\n args.signature = SignatureEnvelope.deserialize(signatureSerialized)\n return from(args) as never\n}\n\nexport declare namespace fromTuple {\n type ReturnType<authorization extends Tuple = Tuple> = Compute<\n KeyAuthorization<authorization extends Tuple<true> ? true : false>\n >\n\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Computes the sign payload for an {@link ox#KeyAuthorization.KeyAuthorization}.\n *\n * The root key must sign this payload to authorize the access key. The resulting signature\n * is attached to the key authorization via {@link ox#KeyAuthorization.(from:function)} with the\n * `signature` option.\n *\n * [Access Keys Specification](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#access-keys)\n *\n * @example\n * ```ts twoslash\n * import { Address, Secp256k1, Value } from 'ox'\n * import { KeyAuthorization } from 'ox/tempo'\n *\n * const privateKey = '0x...'\n * const address = Address.fromPublicKey(Secp256k1.getPublicKey({ privateKey }))\n *\n * const authorization = KeyAuthorization.from({\n * address,\n * chainId: 4217n,\n * expiry: 1234567890,\n * type: 'secp256k1',\n * limits: [{\n * token: '0x20c0000000000000000000000000000000000001',\n * limit: Value.from('10', 6),\n * }],\n * })\n *\n * const payload = KeyAuthorization.getSignPayload(authorization) // [!code focus]\n * ```\n *\n * @param authorization - The {@link ox#KeyAuthorization.KeyAuthorization}.\n * @returns The sign payload.\n */\nexport function getSignPayload(authorization: KeyAuthorization): Hex.Hex {\n return hash(authorization)\n}\n\nexport declare namespace getSignPayload {\n type ErrorType = hash.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Deserializes an RLP-encoded {@link ox#KeyAuthorization.KeyAuthorization}.\n *\n * @example\n * ```ts twoslash\n * import { KeyAuthorization } from 'ox/tempo'\n * import { Value } from 'ox'\n *\n * const authorization = KeyAuthorization.from({\n * address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * chainId: 4217n,\n * expiry: 1234567890,\n * type: 'secp256k1',\n * limits: [{\n * token: '0x20c0000000000000000000000000000000000001',\n * limit: Value.from('10', 6)\n * }],\n * })\n *\n * const serialized = KeyAuthorization.serialize(authorization)\n * const deserialized = KeyAuthorization.deserialize(serialized) // [!code focus]\n * ```\n *\n * @param serialized - The RLP-encoded Key Authorization.\n * @returns The {@link ox#KeyAuthorization.KeyAuthorization}.\n */\nexport function deserialize(serialized: Hex.Hex): KeyAuthorization {\n const tuple = Rlp.toHex(serialized) as unknown as Tuple\n return fromTuple(tuple)\n}\n\nexport declare namespace deserialize {\n type ErrorType =\n | Rlp.toHex.ErrorType\n | fromTuple.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Computes the hash for an {@link ox#KeyAuthorization.KeyAuthorization}.\n *\n * @example\n * ```ts twoslash\n * import { KeyAuthorization } from 'ox/tempo'\n * import { Value } from 'ox'\n *\n * const authorization = KeyAuthorization.from({\n * address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * chainId: 4217n,\n * expiry: 1234567890,\n * type: 'secp256k1',\n * limits: [{\n * token: '0x20c0000000000000000000000000000000000001',\n * limit: Value.from('10', 6)\n * }],\n * })\n *\n * const hash = KeyAuthorization.hash(authorization) // [!code focus]\n * ```\n *\n * @param authorization - The {@link ox#KeyAuthorization.KeyAuthorization}.\n * @returns The hash.\n */\nexport function hash(authorization: KeyAuthorization): Hex.Hex {\n const [authorizationTuple] = toTuple(authorization)\n const serialized = Rlp.fromHex(authorizationTuple)\n return Hash.keccak256(serialized)\n}\n\nexport declare namespace hash {\n type ErrorType =\n | toTuple.ErrorType\n | Hash.keccak256.ErrorType\n | Hex.concat.ErrorType\n | Rlp.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Serializes a {@link ox#KeyAuthorization.KeyAuthorization} to RLP-encoded hex.\n *\n * @example\n * ```ts twoslash\n * import { KeyAuthorization } from 'ox/tempo'\n * import { Value } from 'ox'\n *\n * const authorization = KeyAuthorization.from({\n * address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * chainId: 4217n,\n * expiry: 1234567890,\n * type: 'secp256k1',\n * limits: [{\n * token: '0x20c0000000000000000000000000000000000001',\n * limit: Value.from('10', 6)\n * }],\n * })\n *\n * const serialized = KeyAuthorization.serialize(authorization) // [!code focus]\n * ```\n *\n * @param authorization - The {@link ox#KeyAuthorization.KeyAuthorization}.\n * @returns The RLP-encoded Key Authorization.\n */\nexport function serialize(authorization: KeyAuthorization): Hex.Hex {\n const tuple = toTuple(authorization)\n return Rlp.fromHex(tuple as any)\n}\n\nexport declare namespace serialize {\n type ErrorType =\n | toTuple.ErrorType\n | Rlp.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#KeyAuthorization.KeyAuthorization} to an {@link ox#KeyAuthorization.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { KeyAuthorization } from 'ox/tempo'\n * import { Value } from 'ox'\n *\n * const authorization = KeyAuthorization.toRpc({\n * address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * chainId: 4217n,\n * expiry: 1234567890,\n * type: 'secp256k1',\n * limits: [{\n * token: '0x20c0000000000000000000000000000000000001',\n * limit: Value.from('10', 6)\n * }],\n * signature: {\n * type: 'secp256k1',\n * signature: {\n * r: 44944627813007772897391531230081695102703289123332187696115181104739239197517n,\n * s: 36528503505192438307355164441104001310566505351980369085208178712678799181120n,\n * yParity: 0,\n * },\n * },\n * })\n * ```\n *\n * @param authorization - A Key Authorization.\n * @returns An RPC-formatted Key Authorization.\n */\nexport function toRpc(authorization: Signed): Rpc {\n const { address, chainId, expiry, limits, type, signature } = authorization\n\n return {\n chainId: chainId === 0n ? '0x' : Hex.fromNumber(chainId),\n expiry: typeof expiry === 'number' ? Hex.fromNumber(expiry) : null,\n limits: limits?.map(({ token, limit }) => ({\n token,\n limit: Hex.fromNumber(limit),\n })),\n keyId: TempoAddress.resolve(address),\n signature: SignatureEnvelope.toRpc(signature),\n keyType: type,\n }\n}\n\nexport declare namespace toRpc {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#KeyAuthorization.KeyAuthorization} to an {@link ox#KeyAuthorization.Tuple}.\n *\n * @example\n * ```ts twoslash\n * import { KeyAuthorization } from 'ox/tempo'\n * import { Value } from 'ox'\n *\n * const authorization = KeyAuthorization.from({\n * address: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * chainId: 4217n,\n * expiry: 1234567890,\n * type: 'secp256k1',\n * limits: [{\n * token: '0x20c0000000000000000000000000000000000001',\n * limit: Value.from('10', 6)\n * }],\n * })\n *\n * const tuple = KeyAuthorization.toTuple(authorization) // [!code focus]\n * // @log: [\n * // @log: '0x174876e800',\n * // @log: [['0x20c0000000000000000000000000000000000001', '0xf4240']],\n * // @log: '0xbe95c3f554e9fc85ec51be69a3d807a0d55bcf2c',\n * // @log: 'secp256k1',\n * // @log: ]\n * ```\n *\n * @param authorization - The {@link ox#KeyAuthorization.KeyAuthorization}.\n * @returns A Tempo Key Authorization tuple.\n */\nexport function toTuple<const authorization extends KeyAuthorization>(\n authorization: authorization,\n): toTuple.ReturnType<authorization> {\n const { address, chainId, expiry, limits } = authorization\n const signature = authorization.signature\n ? SignatureEnvelope.serialize(authorization.signature)\n : undefined\n const type = (() => {\n switch (authorization.type) {\n case 'secp256k1':\n return '0x'\n case 'p256':\n return '0x01'\n case 'webAuthn':\n return '0x02'\n default:\n throw new Error(`Invalid key type: ${authorization.type}`)\n }\n })()\n const limitsValue = limits?.map((limit) => [\n limit.token,\n bigintToHex(limit.limit),\n ])\n const authorizationTuple = [\n bigintToHex(chainId),\n type,\n address,\n // expiry is required in the tuple when limits are present\n typeof expiry === 'number' || limitsValue\n ? numberToHex(expiry ?? 0)\n : undefined,\n limitsValue,\n ].filter(Boolean)\n return [authorizationTuple, ...(signature ? [signature] : [])] as never\n}\n\nexport declare namespace toTuple {\n type ReturnType<authorization extends KeyAuthorization = KeyAuthorization> =\n Compute<Tuple<authorization extends KeyAuthorization<true> ? true : false>>\n\n type ErrorType = Errors.GlobalErrorType\n}\n\nfunction bigintToHex(value: bigint): Hex.Hex {\n return value === 0n ? '0x' : Hex.fromNumber(value)\n}\n\nfunction numberToHex(value: number): Hex.Hex {\n return value === 0 ? '0x' : Hex.fromNumber(value)\n}\n\nfunction hexToBigint(hex: Hex.Hex): bigint {\n return hex === '0x' ? 0n : BigInt(hex)\n}\n\nfunction hexToNumber(hex: Hex.Hex): number {\n return hex === '0x' ? 0 : Hex.toNumber(hex)\n}\n","import * as Hash from '../core/Hash.js'\nimport * as Hex from '../core/Hex.js'\nimport * as TokenId from './TokenId.js'\n\n/**\n * Converts a user token and validator token to a pool ID.\n *\n * Pool IDs are deterministic keys derived from two token addresses (order-independent)\n * used to identify trading pairs on Tempo's enshrined stablecoin DEX.\n *\n * [Stablecoin DEX Specification](https://docs.tempo.xyz/protocol/exchange/spec)\n *\n * @example\n * ```ts twoslash\n * import { PoolId } from 'ox/tempo'\n *\n * const poolId = PoolId.from({\n * userToken: 1n,\n * validatorToken: 2n,\n * })\n * ```\n *\n * @param value - User token and validator token.\n * @returns The pool ID.\n */\nexport function from(value: from.Value): Hex.Hex {\n return Hash.keccak256(\n Hex.concat(\n Hex.padLeft(TokenId.toAddress(value.userToken), 32),\n Hex.padLeft(TokenId.toAddress(value.validatorToken), 32),\n ),\n )\n}\n\nexport declare namespace from {\n export type Value = {\n /** User token. */\n userToken: TokenId.TokenIdOrAddress\n /** Validator token. */\n validatorToken: TokenId.TokenIdOrAddress\n }\n}\n","import * as AbiParameters from '../core/AbiParameters.js'\nimport * as Address from '../core/Address.js'\nimport * as Hash from '../core/Hash.js'\nimport * as Hex from '../core/Hex.js'\nimport * as TempoAddress from './TempoAddress.js'\n\nconst tip20Prefix = '0x20c0'\n\nexport type TokenId = bigint\nexport type TokenIdOrAddress = TokenId | TempoAddress.Address\n\n/**\n * Converts a token ID or address to a token ID.\n *\n * TIP-20 is Tempo's native token standard for stablecoins with deterministic addresses\n * derived from sequential token IDs (prefix `0x20c0`).\n *\n * [TIP-20 Token Standard](https://docs.tempo.xyz/protocol/tip20/overview)\n *\n * @example\n * ```ts twoslash\n * import { TokenId } from 'ox/tempo'\n *\n * const tokenId = TokenId.from(1n)\n * ```\n *\n * @param tokenIdOrAddress - The token ID or address.\n * @returns The token ID.\n */\nexport function from(tokenIdOrAddress: TokenIdOrAddress | number): TokenId {\n if (\n typeof tokenIdOrAddress === 'bigint' ||\n typeof tokenIdOrAddress === 'number'\n )\n return BigInt(tokenIdOrAddress)\n return fromAddress(tokenIdOrAddress)\n}\n\n/**\n * Converts a TIP-20 token address to a token ID.\n *\n * [TIP-20 Token Standard](https://docs.tempo.xyz/protocol/tip20/overview)\n *\n * @example\n * ```ts twoslash\n * import { TokenId } from 'ox/tempo'\n *\n * const tokenId = TokenId.fromAddress('0x20c0000000000000000000000000000000000001')\n * ```\n *\n * @param address - The token address.\n * @returns The token ID.\n */\nexport function fromAddress(address: TempoAddress.Address): TokenId {\n const resolved = TempoAddress.resolve(address)\n if (!resolved.toLowerCase().startsWith(tip20Prefix))\n throw new Error('invalid tip20 address.')\n return Hex.toBigInt(Hex.slice(resolved, tip20Prefix.length))\n}\n\n/**\n * Converts a TIP-20 token ID to an address.\n *\n * [TIP-20 Token Standard](https://docs.tempo.xyz/protocol/tip20/overview)\n *\n * @example\n * ```ts twoslash\n * import { TokenId } from 'ox/tempo'\n *\n * const address = TokenId.toAddress(1n)\n * ```\n *\n * @param tokenId - The token ID.\n * @returns The address.\n */\nexport function toAddress(tokenId: TokenIdOrAddress): Address.Address {\n if (typeof tokenId === 'string') {\n const resolved = TempoAddress.resolve(tokenId as TempoAddress.Address)\n Address.assert(resolved)\n return resolved\n }\n\n const tokenIdHex = Hex.fromNumber(tokenId, { size: 18 })\n return Hex.concat(tip20Prefix, tokenIdHex)\n}\n\n/**\n * Computes a deterministic TIP-20 token address from a sender address and salt.\n *\n * The address is computed as: `TIP20_PREFIX (12 bytes) || keccak256(abi.encode(sender, salt))[:8]`\n *\n * [TIP-20 Token Standard](https://docs.tempo.xyz/protocol/tip20/overview)\n *\n * @example\n * ```ts twoslash\n * import { TokenId } from 'ox/tempo'\n *\n * const id = TokenId.compute({\n * sender: '0x1234567890123456789012345678901234567890',\n * salt: '0x0000000000000000000000000000000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param value - The sender address and salt.\n * @returns The computed TIP-20 token id.\n */\nexport function compute(value: compute.Value): bigint {\n const hash = Hash.keccak256(\n AbiParameters.encode(AbiParameters.from('address, bytes32'), [\n TempoAddress.resolve(value.sender),\n value.salt,\n ]),\n )\n return Hex.toBigInt(Hex.slice(hash, 0, 8))\n}\n\nexport declare namespace compute {\n export type Value = {\n /** The salt (32 bytes). */\n salt: Hex.Hex\n /** The sender address. Accepts both hex and Tempo bech32m addresses. */\n sender: TempoAddress.Address\n }\n}\n","import * as Hash from '../core/Hash.js'\nimport * as Hex from '../core/Hex.js'\n\nexport const roles = [\n 'defaultAdmin',\n 'pause',\n 'unpause',\n 'issuer',\n 'burnBlocked',\n] as const\nexport type TokenRole = (typeof roles)[number]\n\nexport const toPreHashed = {\n defaultAdmin: 'DEFAULT_ADMIN_ROLE',\n pause: 'PAUSE_ROLE',\n unpause: 'UNPAUSE_ROLE',\n issuer: 'ISSUER_ROLE',\n burnBlocked: 'BURN_BLOCKED_ROLE',\n} as const satisfies Record<TokenRole, string>\n\n/**\n * Serializes a token role to its keccak256 hash representation.\n *\n * TIP-20 includes a built-in RBAC system with roles like `ISSUER_ROLE` (mint/burn),\n * `PAUSE_ROLE`/`UNPAUSE_ROLE` (emergency controls), and `BURN_BLOCKED_ROLE` (compliance).\n *\n * [TIP-20 RBAC](https://docs.tempo.xyz/protocol/tip20/overview#role-based-access-control-rbac)\n *\n * @example\n * ```ts twoslash\n * import { TokenRole } from 'ox/tempo'\n *\n * const hash = TokenRole.serialize('issuer')\n * ```\n *\n * @param role - The token role to serialize.\n * @returns The keccak256 hash of the role.\n */\nexport function serialize(role: TokenRole) {\n if (role === 'defaultAdmin')\n return '0x0000000000000000000000000000000000000000000000000000000000000000'\n return Hash.keccak256(\n Hex.fromString(toPreHashed[role as keyof typeof toPreHashed] ?? role),\n )\n}\n","import type * as AccessList from '../core/AccessList.js'\nimport type * as Address from '../core/Address.js'\nimport type * as Errors from '../core/Errors.js'\nimport * as Hex from '../core/Hex.js'\nimport type { Compute, OneOf, UnionCompute } from '../core/internal/types.js'\nimport * as Signature from '../core/Signature.js'\nimport * as ox_Transaction from '../core/Transaction.js'\nimport * as AuthorizationTempo from './AuthorizationTempo.js'\nimport * as KeyAuthorization from './KeyAuthorization.js'\nimport * as SignatureEnvelope from './SignatureEnvelope.js'\nimport type { Call } from './TxEnvelopeTempo.js'\n\n/**\n * A Transaction as defined in the [Execution API specification](https://github.com/ethereum/execution-apis/blob/main/src/schemas/transaction.yaml).\n *\n * @see {@link https://docs.tempo.xyz/protocol/transactions}\n */\nexport type Transaction<\n pending extends boolean = false,\n bigintType = bigint,\n numberType = number,\n> = UnionCompute<\n OneOf<\n | Tempo<pending, bigintType, numberType>\n | ox_Transaction.Transaction<pending, bigintType, numberType>\n >\n>\n\n/**\n * An RPC Transaction as defined in the [Execution API specification](https://github.com/ethereum/execution-apis/blob/main/src/schemas/transaction.yaml).\n */\nexport type Rpc<pending extends boolean = false> = UnionCompute<\n OneOf<TempoRpc<pending> | ox_Transaction.Rpc<pending>>\n>\n\n/**\n * Native account abstraction transaction (type `0x76`).\n *\n * Features configurable fee tokens, call batching, fee sponsorship, access keys,\n * parallelizable nonces, and scheduled execution via `validAfter`/`validBefore`.\n *\n * @see {@link https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction}\n */\nexport type Tempo<\n pending extends boolean = false,\n bigintType = bigint,\n numberType = number,\n type extends string = 'tempo',\n> = Compute<\n Omit<\n ox_Transaction.Base<type, pending, bigintType, numberType>,\n // Tempo transactions don't have these properties.\n 'input' | 'to' | 'value' | 'v' | 'r' | 's' | 'yParity'\n > & {\n /** EIP-2930 Access List. */\n accessList: AccessList.AccessList\n /** EIP-7702 Authorization list for the transaction. */\n authorizationList?:\n | AuthorizationTempo.ListSigned<bigintType, numberType>\n | undefined\n /** Array of calls to execute. */\n calls: readonly Call<bigintType>[]\n /** Fee payer signature. */\n feePayerSignature?:\n | {\n /** ECDSA signature r. */\n r: bigintType\n /** ECDSA signature s. */\n s: bigintType\n /** ECDSA signature yParity. */\n yParity: numberType\n /** @deprecated ECDSA signature v (for backwards compatibility). */\n v?: numberType | undefined\n }\n | undefined\n /** Fee token preference. */\n feeToken: Address.Address\n /** Effective gas price paid by the sender in wei. */\n gasPrice?: bigintType | undefined\n /** Key authorization for provisioning a new access key. */\n keyAuthorization?:\n | KeyAuthorization.KeyAuthorization<true, bigintType, numberType>\n | undefined\n /** Total fee per gas in wei (gasPrice/baseFeePerGas + maxPriorityFeePerGas). */\n maxFeePerGas: bigintType\n /** Max priority fee per gas (in wei). */\n maxPriorityFeePerGas: bigintType\n /** Nonce key for 2D nonce system (192 bits). */\n nonceKey?: bigintType | undefined\n /** Sender signature. */\n signature: SignatureEnvelope.SignatureEnvelope<bigintType, numberType>\n /** Transaction can only be included in a block before this timestamp. */\n validBefore?: numberType | undefined\n /** Transaction can only be included in a block after this timestamp. */\n validAfter?: numberType | undefined\n }\n>\n\n/**\n * Native account abstraction transaction in RPC format.\n */\nexport type TempoRpc<pending extends boolean = false> = Compute<\n Omit<\n Tempo<pending, Hex.Hex, Hex.Hex, ToRpcType['tempo']>,\n 'authorizationList' | 'calls' | 'keyAuthorization' | 'signature'\n > & {\n aaAuthorizationList?: AuthorizationTempo.ListRpc | undefined\n calls:\n | readonly {\n input?: Hex.Hex | undefined\n to?: Hex.Hex | undefined\n value?: Hex.Hex | undefined\n }[]\n | undefined\n keyAuthorization?: KeyAuthorization.Rpc | undefined\n signature: SignatureEnvelope.SignatureEnvelopeRpc\n }\n>\n\n/** Type to RPC Type mapping. */\nexport const toRpcType = {\n ...ox_Transaction.toRpcType,\n tempo: '0x76',\n} as const\n\n/** Type to RPC Type mapping. */\nexport type ToRpcType = typeof toRpcType & {\n [type: string]: `0x${string}`\n}\n\n/** RPC Type to Type mapping. */\nexport const fromRpcType = {\n ...ox_Transaction.fromRpcType,\n '0x76': 'tempo',\n} as const\n\n/** RPC Type to Type mapping. */\n\nexport type FromRpcType = typeof fromRpcType & {\n [type: `0x${string}`]: string\n}\n\n/**\n * Converts an {@link ox#Transaction.Rpc} to an {@link ox#Transaction.Transaction}.\n *\n * @example\n * ```ts twoslash\n * import { Transaction } from 'ox/tempo'\n *\n * const transaction = Transaction.fromRpc({\n * hash: '0x353fdfc38a2f26115daadee9f5b8392ce62b84f410957967e2ed56b35338cdd0',\n * nonce: '0x357',\n * blockHash:\n * '0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b',\n * blockNumber: '0x12f296f',\n * calls: [\n * {\n * input: '0xdeadbeef',\n * to: '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad',\n * value: '0x9b6e64a8ec60000',\n * },\n * ],\n * feeToken: '0x20c0000000000000000000000000000000000000',\n * transactionIndex: '0x2',\n * from: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',\n * value: '0x9b6e64a8ec60000',\n * gas: '0x43f5d',\n * maxFeePerGas: '0x2ca6ae494',\n * maxPriorityFeePerGas: '0x41cc3c0',\n * input:\n * '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000006643504700000000000000000000000000000000000000000000000000000000000000040b080604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000009b6e64a8ec600000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000009b6e64a8ec60000000000000000000000000000000000000000000000000000019124bb5ae978c000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c56c7a0eaa804f854b536a5f3d5f49d2ec4b12b80000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c56c7a0eaa804f854b536a5f3d5f49d2ec4b12b8000000000000000000000000000000fee13a103a10d593b9ae06b3e05f2e7e1c00000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c56c7a0eaa804f854b536a5f3d5f49d2ec4b12b800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000190240001b9872b',\n * signature: {\n * r: '0x635dc2033e60185bb36709c29c75d64ea51dfbd91c32ef4be198e4ceb169fb4d',\n * s: '0x50c2667ac4c771072746acfdcf1f1483336dcca8bd2df47cd83175dbe60f0540',\n * type: 'secp256k1',\n * yParity: '0x0',\n * },\n * chainId: '0x1',\n * accessList: [],\n * type: '0x76',\n * })\n * ```\n *\n * @param transaction - The RPC transaction to convert.\n * @returns An instantiated {@link ox#Transaction.Transaction}.\n */\nexport function fromRpc<\n const transaction extends Rpc | null,\n pending extends boolean = false,\n>(\n transaction: transaction | Rpc<pending> | null,\n _options: fromRpc.Options<pending> = {},\n): transaction extends Rpc<pending> ? Transaction<pending> : null {\n if (!transaction) return null as never\n\n const transaction_ = ox_Transaction.fromRpc(\n transaction as ox_Transaction.Rpc<pending>,\n ) as Transaction<pending>\n\n transaction_.type = fromRpcType[transaction.type as keyof typeof fromRpcType]\n\n if (transaction.aaAuthorizationList) {\n transaction_.authorizationList = AuthorizationTempo.fromRpcList(\n transaction.aaAuthorizationList,\n )\n delete (transaction_ as any).aaAuthorizationList\n }\n if (transaction.calls)\n transaction_.calls = transaction.calls.map((call) => ({\n to: call.to,\n value: call.value && call.value !== '0x' ? BigInt(call.value) : undefined,\n // @ts-expect-error\n data: call.input || call.data || '0x',\n }))\n if (transaction.feeToken) transaction_.feeToken = transaction.feeToken\n if (transaction.nonceKey) transaction_.nonceKey = BigInt(transaction.nonceKey)\n if (transaction.signature)\n transaction_.signature = SignatureEnvelope.fromRpc(transaction.signature)\n if (transaction.validAfter)\n transaction_.validAfter = Number(transaction.validAfter)\n if (transaction.validBefore)\n transaction_.validBefore = Number(transaction.validBefore)\n if (transaction.keyAuthorization)\n transaction_.keyAuthorization = KeyAuthorization.fromRpc(\n transaction.keyAuthorization,\n )\n if (transaction.feePayerSignature) {\n transaction_.feePayerSignature = Signature.fromRpc(\n transaction.feePayerSignature,\n )\n ;(transaction_.feePayerSignature as any).v = Signature.yParityToV(\n transaction_.feePayerSignature.yParity,\n )\n }\n\n return transaction_ as never\n}\n\nexport declare namespace fromRpc {\n type Options<pending extends boolean = false> = {\n pending?: pending | boolean | undefined\n }\n\n type ErrorType = ox_Transaction.fromRpc.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Converts an {@link ox#Transaction.Transaction} to an {@link ox#Transaction.Rpc}.\n *\n * @example\n * ```ts twoslash\n * import { Transaction } from 'ox/tempo'\n *\n * const transaction = Transaction.toRpc({\n * accessList: [],\n * blockHash:\n * '0xc350d807505fb835650f0013632c5515592987ba169bbc6626d9fc54d91f0f0b',\n * blockNumber: 19868015n,\n * calls: [\n * {\n * data: '0xdeadbeef',\n * to: '0x3fc91a3afd70395cd496c647d5a6cc9d4b2b7fad',\n * value: 700000000000000000n,\n * },\n * ],\n * chainId: 1,\n * feeToken: '0x20c0000000000000000000000000000000000000',\n * from: '0x814e5e0e31016b9a7f138c76b7e7b2bb5c1ab6a6',\n * gas: 278365n,\n * hash: '0x353fdfc38a2f26115daadee9f5b8392ce62b84f410957967e2ed56b35338cdd0',\n * input:\n * '0x3593564c000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000006643504700000000000000000000000000000000000000000000000000000000000000040b080604000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002800000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000009b6e64a8ec600000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000009b6e64a8ec60000000000000000000000000000000000000000000000000000019124bb5ae978c000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c56c7a0eaa804f854b536a5f3d5f49d2ec4b12b80000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c56c7a0eaa804f854b536a5f3d5f49d2ec4b12b8000000000000000000000000000000fee13a103a10d593b9ae06b3e05f2e7e1c00000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000000000060000000000000000000000000c56c7a0eaa804f854b536a5f3d5f49d2ec4b12b800000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000190240001b9872b',\n * maxFeePerGas: 11985937556n,\n * maxPriorityFeePerGas: 68993984n,\n * nonce: 855n,\n * signature: {\n * signature: {\n * r: 44944627813007772897391531230081695102703289123332187696115181104739239197517n,\n * s: 36528503505192438307355164441104001310566505351980369085208178712678799181120n,\n * yParity: 0,\n * },\n * type: 'secp256k1',\n * },\n * transactionIndex: 2,\n * type: 'tempo',\n * })\n * ```\n *\n * @param transaction - The transaction to convert.\n * @returns An RPC-formatted transaction.\n */\nexport function toRpc<pending extends boolean = false>(\n transaction: Transaction<pending>,\n _options?: toRpc.Options<pending>,\n): Rpc<pending> {\n const rpc = ox_Transaction.toRpc(\n transaction as ox_Transaction.Transaction<pending>,\n ) as Rpc<pending>\n\n rpc.type = toRpcType[transaction.type as keyof typeof toRpcType]\n\n if (transaction.authorizationList)\n rpc.aaAuthorizationList = AuthorizationTempo.toRpcList(\n transaction.authorizationList as AuthorizationTempo.ListSigned,\n )\n if (transaction.calls)\n rpc.calls = transaction.calls.map((call) => ({\n to: call.to,\n value: call.value ? Hex.fromNumber(call.value) : undefined,\n data: call.data,\n }))\n if (transaction.feeToken) rpc.feeToken = transaction.feeToken\n if (transaction.keyAuthorization)\n rpc.keyAuthorization = KeyAuthorization.toRpc(transaction.keyAuthorization)\n if (transaction.feePayerSignature) {\n rpc.feePayerSignature = Signature.toRpc(\n transaction.feePayerSignature,\n ) as any\n ;(rpc.feePayerSignature as any).v = Hex.fromNumber(\n Signature.yParityToV(transaction.feePayerSignature?.yParity),\n )\n }\n if (transaction.signature)\n rpc.signature = SignatureEnvelope.toRpc(transaction.signature)\n if (typeof transaction.validAfter === 'number')\n rpc.validAfter = Hex.fromNumber(transaction.validAfter)\n if (typeof transaction.validBefore === 'number')\n rpc.validBefore = Hex.fromNumber(transaction.validBefore)\n\n return rpc as Rpc<pending>\n}\n\nexport declare namespace toRpc {\n type Options<pending extends boolean = false> = {\n pending?: pending | boolean | undefined\n }\n\n type ErrorType = ox_Transaction.toRpc.ErrorType | Errors.GlobalErrorType\n}\n","import type * as Errors from '../core/Errors.js'\nimport * as Hex from '../core/Hex.js'\nimport type { Compute } from '../core/internal/types.js'\nimport * as ox_TransactionRequest from '../core/TransactionRequest.js'\nimport * as AuthorizationTempo from './AuthorizationTempo.js'\nimport * as KeyAuthorization from './KeyAuthorization.js'\nimport * as TempoAddress from './TempoAddress.js'\nimport * as TokenId from './TokenId.js'\nimport * as Transaction from './Transaction.js'\nimport type { Call } from './TxEnvelopeTempo.js'\n\ntype KeyType = 'secp256k1' | 'p256' | 'webAuthn'\n\n/**\n * A Transaction Request that is generic to all transaction types.\n *\n * Extends the [Execution API specification](https://github.com/ethereum/execution-apis/blob/4aca1d7a3e5aab24c8f6437131289ad386944eaa/src/schemas/transaction.yaml#L358-L423)\n * with Tempo-specific fields for batched calls, fee tokens, access keys, and scheduled execution.\n *\n * @see {@link https://docs.tempo.xyz/protocol/transactions}\n */\nexport type TransactionRequest<\n bigintType = bigint,\n numberType = number,\n type extends string = string,\n> = Compute<\n Omit<\n ox_TransactionRequest.TransactionRequest<bigintType, numberType, type>,\n 'authorizationList'\n > & {\n authorizationList?:\n | AuthorizationTempo.ListSigned<bigintType, numberType>\n | undefined\n calls?: readonly Call<bigintType, TempoAddress.Address>[] | undefined\n keyAuthorization?: KeyAuthorization.KeyAuthorization<true> | undefined\n keyData?: Hex.Hex | undefined\n keyType?: KeyType | undefined\n feeToken?: TokenId.TokenIdOrAddress | undefined\n nonceKey?: 'random' | bigintType | undefined\n validBefore?: numberType | undefined\n validAfter?: numberType | undefined\n }\n>\n\n/** RPC representation of a {@link ox#TransactionRequest.TransactionRequest}. */\nexport type Rpc = Omit<\n TransactionRequest<Hex.Hex, Hex.Hex, string>,\n 'authorizationList' | 'keyAuthorization'\n> & {\n authorizationList?: AuthorizationTempo.ListRpc | undefined\n keyAuthorization?: KeyAuthorization.Rpc | undefined\n nonceKey?: Hex.Hex | undefined\n}\n\n/**\n * Converts a {@link ox#TransactionRequest.TransactionRequest} to a {@link ox#TransactionRequest.Rpc}.\n *\n * @see {@link https://docs.tempo.xyz/protocol/transactions}\n *\n * @example\n * ```ts twoslash\n * import { Value } from 'ox'\n * import { TransactionRequest } from 'ox/tempo'\n *\n * const request = TransactionRequest.toRpc({\n * calls: [{\n * data: '0xdeadbeef',\n * to: '0xcafebabecafebabecafebabecafebabecafebabe',\n * }],\n * feeToken: '0x20c0000000000000000000000000000000000000',\n * })\n * ```\n *\n * @example\n * ### Using with a Provider\n *\n * You can use {@link ox#Provider.(from:function)} to instantiate an EIP-1193 Provider and\n * send a transaction to the Wallet using the `eth_sendTransaction` method.\n *\n * ```ts twoslash\n * import 'ox/window'\n * import { Provider, Value } from 'ox'\n * import { TransactionRequest } from 'ox/tempo'\n *\n * const provider = Provider.from(window.ethereum!)\n *\n * const request = TransactionRequest.toRpc({\n * calls: [{\n * data: '0xdeadbeef',\n * to: '0xcafebabecafebabecafebabecafebabecafebabe',\n * }],\n * feeToken: '0x20c0000000000000000000000000000000000000',\n * })\n *\n * const hash = await provider.request({ // [!code focus]\n * method: 'eth_sendTransaction', // [!code focus]\n * params: [request], // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @param request - The request to convert.\n * @returns An RPC request.\n */\nexport function toRpc(request: TransactionRequest): Rpc {\n const request_rpc = ox_TransactionRequest.toRpc({\n ...request,\n authorizationList: undefined,\n }) as Rpc\n\n if (request.authorizationList)\n request_rpc.authorizationList = AuthorizationTempo.toRpcList(\n request.authorizationList,\n )\n if (request.calls)\n request_rpc.calls = request.calls.map((call) => ({\n to: call.to ? TempoAddress.resolve(call.to) : call.to,\n value: call.value ? Hex.fromNumber(call.value) : '0x',\n data: call.data ?? '0x',\n }))\n if (typeof request.feeToken !== 'undefined')\n request_rpc.feeToken = TokenId.toAddress(request.feeToken)\n if (request.keyAuthorization)\n request_rpc.keyAuthorization = KeyAuthorization.toRpc(\n request.keyAuthorization,\n )\n if (typeof request.validBefore !== 'undefined')\n request_rpc.validBefore = Hex.fromNumber(request.validBefore)\n if (typeof request.validAfter !== 'undefined')\n request_rpc.validAfter = Hex.fromNumber(request.validAfter)\n\n const nonceKey = (() => {\n if (request.nonceKey === 'random') return Hex.random(6)\n if (typeof request.nonceKey === 'bigint')\n return Hex.fromNumber(request.nonceKey)\n return undefined\n })()\n if (nonceKey) request_rpc.nonceKey = nonceKey\n\n if (\n typeof request.calls !== 'undefined' ||\n typeof request.feeToken !== 'undefined' ||\n typeof request.keyAuthorization !== 'undefined' ||\n typeof request.nonceKey !== 'undefined' ||\n typeof request.validBefore !== 'undefined' ||\n typeof request.validAfter !== 'undefined' ||\n request.type === 'tempo'\n ) {\n request_rpc.type = Transaction.toRpcType.tempo\n delete request_rpc.data\n delete request_rpc.input\n delete request_rpc.to\n delete request_rpc.value\n }\n\n return request_rpc\n}\n\nexport declare namespace toRpc {\n export type ErrorType =\n | AuthorizationTempo.toRpcList.ErrorType\n | Hex.fromNumber.ErrorType\n | Errors.GlobalErrorType\n}\n","import * as AccessList from '../core/AccessList.js'\nimport * as Address from '../core/Address.js'\nimport * as Errors from '../core/Errors.js'\nimport * as Hash from '../core/Hash.js'\nimport * as Hex from '../core/Hex.js'\nimport type {\n Assign,\n Compute,\n OneOf,\n PartialBy,\n UnionPartialBy,\n} from '../core/internal/types.js'\nimport * as Rlp from '../core/Rlp.js'\nimport * as Secp256k1 from '../core/Secp256k1.js'\nimport * as Signature from '../core/Signature.js'\nimport * as TransactionEnvelope from '../core/TxEnvelope.js'\nimport * as AuthorizationTempo from './AuthorizationTempo.js'\nimport * as KeyAuthorization from './KeyAuthorization.js'\nimport * as SignatureEnvelope from './SignatureEnvelope.js'\nimport * as TempoAddress from './TempoAddress.js'\nimport * as TokenId from './TokenId.js'\n\n/**\n * Represents a single call within a Tempo transaction.\n *\n * Tempo transactions support batching multiple calls for atomic execution.\n *\n * [Batch Calls](https://docs.tempo.xyz/protocol/transactions#batch-calls)\n */\nexport type Call<bigintType = bigint, addressType = Address.Address> = {\n /** Call data. */\n data?: Hex.Hex | undefined\n /** The target address or contract creation. */\n to?: addressType | undefined\n /** Value to send (in wei). */\n value?: bigintType | undefined\n}\n\n/**\n * Tempo transaction envelope (type `0x76`).\n *\n * A new EIP-2718 transaction type exclusively available on Tempo, designed for payment\n * use cases with the following features:\n *\n * - **Configurable Fee Tokens**: Pay transaction fees with any USD-denominated TIP-20 token.\n * The Fee AMM automatically converts to the validator's preferred token.\n *\n * - **Fee Sponsorship**: A third-party fee payer can pay fees on behalf of the sender using\n * a dual-signature scheme (sender signs tx, fee payer signs over tx + sender address).\n *\n * - **Batch Calls**: Execute multiple operations atomically in a single transaction via\n * the `calls` array, reducing overhead and simplifying wallet management.\n *\n * - **Access Keys**: Delegate signing to secondary keys with expiry and per-TIP-20 spending\n * limits via `keyAuthorization`. Enables passkey UX without repeated prompts.\n *\n * - **Parallelizable Nonces**: Use different `nonceKey` values to submit multiple transactions\n * in parallel without waiting for sequential nonce confirmation.\n *\n * - **Scheduled Transactions**: Set `validAfter` and `validBefore` timestamps to define a\n * time window for when the transaction can be included in a block.\n *\n * - **Multi-Signature Support**: Sign with secp256k1, P256 (passkeys), or WebAuthn credentials.\n *\n * [Tempo Transaction Specification](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction)\n */\nexport type TxEnvelopeTempo<\n signed extends boolean = boolean,\n bigintType = bigint,\n numberType = number,\n type extends string = Type,\n> = Compute<\n {\n /** EIP-2930 Access List. */\n accessList?: AccessList.AccessList | undefined\n /** EIP-7702 (Tempo) Authorization list for the transaction. */\n authorizationList?:\n | AuthorizationTempo.ListSigned<bigintType, numberType>\n | undefined\n /** Array of calls to execute. */\n calls: readonly Call<bigintType, TempoAddress.Address>[]\n /** EIP-155 Chain ID. */\n chainId: numberType\n /** Sender of the transaction. */\n from?: TempoAddress.Address | undefined\n /** Gas provided for transaction execution */\n gas?: bigintType | undefined\n /** Fee payer signature. */\n feePayerSignature?:\n | Signature.Signature<true, bigintType, numberType>\n | null\n | undefined\n /** Fee token preference. Address or ID of the TIP-20 token. */\n feeToken?: TokenId.TokenIdOrAddress | undefined\n /**\n * Key authorization for provisioning a new access key.\n *\n * When present, this transaction will add the specified key to the AccountKeychain precompile,\n * before verifying the transaction signature.\n * The authorization must be signed with the root key, the tx can be signed by the Keychain signature.\n */\n keyAuthorization?:\n | KeyAuthorization.Signed<bigintType, numberType>\n | undefined\n /** Total fee per gas in wei (gasPrice/baseFeePerGas + maxPriorityFeePerGas). */\n maxFeePerGas?: bigintType | undefined\n /** Max priority fee per gas (in wei). */\n maxPriorityFeePerGas?: bigintType | undefined\n /** Nonce key for 2D nonce system (192 bits). */\n nonceKey?: bigintType | undefined\n /** Unique number identifying this transaction */\n nonce?: bigintType | undefined\n /** Transaction type */\n type: type\n /** Transaction can only be included in a block before this timestamp. */\n validBefore?: numberType | undefined\n /** Transaction can only be included in a block after this timestamp. */\n validAfter?: numberType | undefined\n } & (signed extends true\n ? {\n signature: SignatureEnvelope.SignatureEnvelope<bigintType, numberType>\n }\n : {\n signature?:\n | SignatureEnvelope.SignatureEnvelope<bigintType, numberType>\n | undefined\n })\n>\n\nexport type Rpc<signed extends boolean = boolean> = TxEnvelopeTempo<\n signed,\n Hex.Hex,\n Hex.Hex,\n '0x76'\n>\n\nexport const feePayerMagic = '0x78' as const\nexport type FeePayerMagic = typeof feePayerMagic\n\nexport type Serialized = `${SerializedType}${string}`\n\nexport type Signed = TxEnvelopeTempo<true>\n\nexport const serializedType = '0x76' as const\nexport type SerializedType = typeof serializedType\n\nexport const type = 'tempo' as const\nexport type Type = typeof type\n\n/**\n * Asserts a {@link ox#TxEnvelopeTempo.TxEnvelopeTempo} is valid.\n *\n * @example\n * ```ts twoslash\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * TxEnvelopeTempo.assert({\n * calls: [{ to: 'tempox0x0000000000000000000000000000000000000000', value: 0n }],\n * chainId: 1,\n * maxFeePerGas: 1000000000n,\n * })\n * ```\n *\n * @param envelope - The transaction envelope to assert.\n */\nexport function assert(envelope: PartialBy<TxEnvelopeTempo, 'type'>) {\n const {\n calls,\n chainId,\n maxFeePerGas,\n maxPriorityFeePerGas,\n validBefore,\n validAfter,\n } = envelope\n\n // Calls must not be empty\n if (!calls || calls.length === 0) throw new CallsEmptyError()\n\n // validBefore must be greater than validAfter if both are set\n if (\n typeof validBefore === 'number' &&\n typeof validAfter === 'number' &&\n validBefore <= validAfter\n ) {\n throw new InvalidValidityWindowError({\n validBefore: validBefore,\n validAfter: validAfter,\n })\n }\n\n // Validate each call\n if (calls)\n for (const call of calls)\n if (call.to) Address.assert(call.to, { strict: false })\n\n // Validate chain ID\n if (chainId <= 0)\n throw new TransactionEnvelope.InvalidChainIdError({ chainId })\n\n // Validate max fee per gas\n if (maxFeePerGas && BigInt(maxFeePerGas) > 2n ** 256n - 1n)\n throw new TransactionEnvelope.FeeCapTooHighError({\n feeCap: maxFeePerGas,\n })\n\n if (\n maxPriorityFeePerGas &&\n maxFeePerGas &&\n maxPriorityFeePerGas > maxFeePerGas\n )\n throw new TransactionEnvelope.TipAboveFeeCapError({\n maxFeePerGas,\n maxPriorityFeePerGas,\n })\n}\n\nexport declare namespace assert {\n type ErrorType =\n | Address.assert.ErrorType\n | CallsEmptyError\n | InvalidValidityWindowError\n | Errors.GlobalErrorType\n}\n\n/**\n * Deserializes a {@link ox#TxEnvelopeTempo.TxEnvelopeTempo} from its serialized form.\n *\n * @example\n * ```ts twoslash\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * const envelope = TxEnvelopeTempo.deserialize('0x76f84a0182031184773594008477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c0808080')\n * // @log: {\n * // @log: type: 'tempo',\n * // @log: nonce: 785n,\n * // @log: maxFeePerGas: 2000000000n,\n * // @log: gas: 1000000n,\n * // @log: calls: [{ to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8', value: 1000000000000000000n }],\n * // @log: }\n * ```\n *\n * @param serialized - The serialized transaction.\n * @returns Deserialized Transaction Envelope.\n */\nexport function deserialize(serialized: Serialized): Compute<TxEnvelopeTempo> {\n const transactionArray = Rlp.toHex(Hex.slice(serialized, 1))\n\n const [\n chainId,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gas,\n calls,\n accessList,\n nonceKey,\n nonce,\n validBefore,\n validAfter,\n feeToken,\n feePayerSignatureOrSender,\n authorizationList,\n keyAuthorizationOrSignature,\n maybeSignature,\n ] = transactionArray as readonly Hex.Hex[]\n\n const keyAuthorization = Array.isArray(keyAuthorizationOrSignature)\n ? keyAuthorizationOrSignature\n : undefined\n const signature = keyAuthorization\n ? maybeSignature\n : keyAuthorizationOrSignature\n\n if (\n !(\n transactionArray.length === 13 ||\n transactionArray.length === 14 ||\n transactionArray.length === 15\n )\n )\n throw new TransactionEnvelope.InvalidSerializedError({\n attributes: {\n authorizationList,\n chainId,\n maxPriorityFeePerGas,\n maxFeePerGas,\n gas,\n calls,\n accessList,\n keyAuthorization,\n nonceKey,\n nonce,\n validBefore,\n validAfter,\n feeToken,\n feePayerSignatureOrSender,\n ...(transactionArray.length > 12\n ? {\n signature,\n }\n : {}),\n },\n serialized,\n type,\n })\n\n let transaction = {\n chainId: Number(chainId),\n type,\n } as TxEnvelopeTempo\n\n if (Hex.validate(gas) && gas !== '0x') transaction.gas = BigInt(gas)\n if (Hex.validate(nonce))\n transaction.nonce = nonce === '0x' ? 0n : BigInt(nonce)\n if (Hex.validate(maxFeePerGas) && maxFeePerGas !== '0x')\n transaction.maxFeePerGas = BigInt(maxFeePerGas)\n if (Hex.validate(maxPriorityFeePerGas) && maxPriorityFeePerGas !== '0x')\n transaction.maxPriorityFeePerGas = BigInt(maxPriorityFeePerGas)\n if (Hex.validate(nonceKey))\n transaction.nonceKey = nonceKey === '0x' ? 0n : BigInt(nonceKey)\n if (Hex.validate(validBefore) && validBefore !== '0x')\n transaction.validBefore = Number(validBefore)\n if (Hex.validate(validAfter) && validAfter !== '0x')\n transaction.validAfter = Number(validAfter)\n if (Hex.validate(feeToken) && feeToken !== '0x')\n transaction.feeToken = feeToken\n\n // Parse calls array\n if (calls && calls !== '0x') {\n const callsArray = calls as unknown as readonly Hex.Hex[][]\n transaction.calls = callsArray.map((callTuple) => {\n const [to, value, data] = callTuple\n const call: Call = {}\n if (to && to !== '0x') call.to = to\n if (value && value !== '0x') call.value = BigInt(value)\n if (data && data !== '0x') call.data = data\n return call\n })\n }\n\n if (accessList?.length !== 0 && accessList !== '0x')\n transaction.accessList = AccessList.fromTupleList(accessList as never)\n\n if (authorizationList?.length !== 0 && authorizationList !== '0x')\n transaction.authorizationList = AuthorizationTempo.fromTupleList(\n authorizationList as never,\n )\n\n if (\n feePayerSignatureOrSender !== '0x' &&\n feePayerSignatureOrSender !== undefined\n ) {\n if (\n feePayerSignatureOrSender === '0x00' ||\n Address.validate(feePayerSignatureOrSender)\n ) {\n transaction.feePayerSignature = null\n if (Address.validate(feePayerSignatureOrSender))\n transaction.from = feePayerSignatureOrSender\n } else\n transaction.feePayerSignature = Signature.fromTuple(\n feePayerSignatureOrSender as never,\n )\n }\n\n if (keyAuthorization)\n transaction.keyAuthorization = KeyAuthorization.fromTuple(\n keyAuthorization as never,\n )\n\n const signatureEnvelope = signature\n ? SignatureEnvelope.deserialize(signature)\n : undefined\n if (signatureEnvelope)\n transaction = {\n ...transaction,\n signature: signatureEnvelope,\n }\n\n // Recover sender address from the signature if not already set.\n if (!transaction.from && signatureEnvelope) {\n try {\n transaction.from = SignatureEnvelope.extractAddress({\n payload: getSignPayload(from(transaction)),\n signature: signatureEnvelope,\n root: true,\n })\n } catch {}\n }\n\n assert(transaction)\n\n return transaction\n}\n\nexport declare namespace deserialize {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Converts an arbitrary transaction object into a Tempo Transaction Envelope.\n *\n * Use this to create transaction envelopes with Tempo-specific features like batched calls,\n * fee tokens, access keys, and scheduled execution. Attach a signature using the `signature`\n * option after signing with {@link ox#TxEnvelopeTempo.(getSignPayload:function)}.\n *\n * [Tempo Transaction Specification](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction)\n *\n * @example\n * ```ts twoslash\n * import { Value } from 'ox'\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * const envelope = TxEnvelopeTempo.from({ // [!code focus]\n * chainId: 1, // [!code focus]\n * calls: [{ // [!code focus]\n * data: '0xdeadbeef', // [!code focus]\n * to: 'tempox0x0000000000000000000000000000000000000000', // [!code focus]\n * }], // [!code focus]\n * maxFeePerGas: Value.fromGwei('10'), // [!code focus]\n * maxPriorityFeePerGas: Value.fromGwei('1'), // [!code focus]\n * }) // [!code focus]\n * ```\n *\n * @example\n * ### Attaching Signatures\n *\n * It is possible to attach a `signature` to the transaction envelope.\n *\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1, Value } from 'ox'\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * const envelope = TxEnvelopeTempo.from({\n * chainId: 1,\n * calls: [{\n * data: '0xdeadbeef',\n * to: 'tempox0x0000000000000000000000000000000000000000',\n * }],\n * maxFeePerGas: Value.fromGwei('10'),\n * maxPriorityFeePerGas: Value.fromGwei('1'),\n * })\n *\n * const signature = Secp256k1.sign({\n * payload: TxEnvelopeTempo.getSignPayload(envelope),\n * privateKey: '0x...',\n * })\n *\n * const envelope_signed = TxEnvelopeTempo.from(envelope, { // [!code focus]\n * signature, // [!code focus]\n * }) // [!code focus]\n * // @log: {\n * // @log: chainId: 1,\n * // @log: calls: [{ to: '0x0000000000000000000000000000000000000000', value: 1000000000000000000n }],\n * // @log: maxFeePerGas: 10000000000n,\n * // @log: maxPriorityFeePerGas: 1000000000n,\n * // @log: type: 'tempo',\n * // @log: r: 125...n,\n * // @log: s: 642...n,\n * // @log: yParity: 0,\n * // @log: }\n * ```\n *\n * @example\n * ### From Serialized\n *\n * It is possible to instantiate a Tempo Transaction Envelope from a {@link ox#TxEnvelopeTempo.Serialized} value.\n *\n * ```ts twoslash\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * const envelope = TxEnvelopeTempo.from('0x76f84a0182031184773594008477359400809470997970c51812dc3a010c7d01b50e0d17dc79c8880de0b6b3a764000080c0808080')\n * // @log: {\n * // @log: chainId: 1,\n * // @log: calls: [{\n * // @log: data: '0xdeadbeef',\n * // @log: to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * // @log: }],\n * // @log: maxFeePerGas: 10000000000n,\n * // @log: type: 'tempo',\n * // @log: }\n * ```\n *\n * @param envelope - The transaction object to convert.\n * @param options - Options.\n * @returns A Tempo Transaction Envelope.\n */\nexport function from<\n const envelope extends UnionPartialBy<TxEnvelopeTempo, 'type'> | Serialized,\n const signature extends SignatureEnvelope.from.Value | undefined = undefined,\n>(\n envelope: envelope | UnionPartialBy<TxEnvelopeTempo, 'type'> | Serialized,\n options: from.Options<signature> = {},\n): from.ReturnValue<envelope, signature> {\n const { feePayerSignature, signature } = options\n\n const envelope_ = (\n typeof envelope === 'string' ? deserialize(envelope) : envelope\n ) as TxEnvelopeTempo\n\n // Resolve TempoAddress inputs to hex addresses.\n if (envelope_.from)\n envelope_.from = TempoAddress.resolve(\n envelope_.from as TempoAddress.Address,\n )\n if (envelope_.calls)\n envelope_.calls = (envelope_.calls as readonly Call[]).map((call) => ({\n ...call,\n ...(call.to\n ? { to: TempoAddress.resolve(call.to as TempoAddress.Address) }\n : {}),\n })) as readonly Call[]\n\n assert(envelope_)\n\n return {\n ...envelope_,\n ...(signature ? { signature: SignatureEnvelope.from(signature) } : {}),\n ...(feePayerSignature\n ? { feePayerSignature: Signature.from(feePayerSignature) }\n : {}),\n type: 'tempo',\n } as never\n}\n\nexport declare namespace from {\n type Options<\n signature extends SignatureEnvelope.from.Value | undefined = undefined,\n > = {\n feePayerSignature?: Signature.Signature | null | undefined\n signature?: signature | SignatureEnvelope.from.Value | undefined\n }\n\n type ReturnValue<\n envelope extends UnionPartialBy<TxEnvelopeTempo, 'type'> | Hex.Hex =\n | TxEnvelopeTempo\n | Hex.Hex,\n signature extends SignatureEnvelope.from.Value | undefined = undefined,\n > = Compute<\n envelope extends Hex.Hex\n ? TxEnvelopeTempo\n : Assign<\n envelope,\n (signature extends SignatureEnvelope.from.Value\n ? { signature: SignatureEnvelope.from.ReturnValue<signature> }\n : {}) & {\n readonly type: 'tempo'\n }\n >\n >\n\n type ErrorType =\n | deserialize.ErrorType\n | assert.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Serializes a {@link ox#TxEnvelopeTempo.TxEnvelopeTempo}.\n *\n * RLP-encodes the transaction with type prefix `0x76`. For fee sponsorship, use `format: 'feePayer'`\n * to serialize with the fee payer magic `0x78` and the sender address.\n *\n * [RLP Encoding](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#rlp-encoding)\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Value } from 'ox'\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * const envelope = TxEnvelopeTempo.from({\n * chainId: 1,\n * calls: [{\n * data: '0xdeadbeef',\n * to: 'tempox0x0000000000000000000000000000000000000000',\n * }],\n * maxFeePerGas: Value.fromGwei('10'),\n * })\n *\n * const serialized = TxEnvelopeTempo.serialize(envelope) // [!code focus]\n * ```\n *\n * @example\n * ### Attaching Signatures\n *\n * It is possible to attach a `signature` to the serialized Transaction Envelope.\n *\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1, Value } from 'ox'\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * const envelope = TxEnvelopeTempo.from({\n * chainId: 1,\n * calls: [{\n * data: '0xdeadbeef',\n * to: 'tempox0x0000000000000000000000000000000000000000',\n * }],\n * maxFeePerGas: Value.fromGwei('10'),\n * })\n *\n * const signature = Secp256k1.sign({\n * payload: TxEnvelopeTempo.getSignPayload(envelope),\n * privateKey: '0x...',\n * })\n *\n * const serialized = TxEnvelopeTempo.serialize(envelope, { // [!code focus]\n * signature, // [!code focus]\n * }) // [!code focus]\n *\n * // ... send `serialized` transaction to JSON-RPC `eth_sendRawTransaction`\n * ```\n *\n * @param envelope - The Transaction Envelope to serialize.\n * @param options - Options.\n * @returns The serialized Transaction Envelope.\n */\nexport function serialize(\n envelope: PartialBy<TxEnvelopeTempo, 'type'>,\n options: serialize.Options = {},\n): Serialized {\n const {\n accessList,\n authorizationList,\n calls,\n chainId,\n feeToken,\n gas,\n keyAuthorization,\n nonce,\n nonceKey,\n maxFeePerGas,\n maxPriorityFeePerGas,\n validBefore,\n validAfter,\n } = envelope\n\n assert(envelope)\n\n const accessTupleList = AccessList.toTupleList(accessList)\n const signature = options.signature || envelope.signature\n\n const authorizationTupleList =\n AuthorizationTempo.toTupleList(authorizationList)\n\n // Encode calls as RLP list of [to, value, data] tuples\n const callsTupleList = calls.map((call) => [\n call.to ? TempoAddress.resolve(call.to) : '0x',\n call.value ? Hex.fromNumber(call.value) : '0x',\n call.data ?? '0x',\n ])\n\n let skipFeeToken = false\n const feePayerSignatureOrSender = (() => {\n // Explicit sender address provided — use as-is.\n if (options.sender) return options.sender\n\n // When serializing in fee payer format and a signature is present,\n // derive the sender address from the signature so the fee payer proxy\n // knows which account to cover fees for.\n //\n // - secp256k1: recover address via ecrecover from the sign payload.\n // - p256/webAuthn: derive address from the embedded public key.\n // - keychain: use the explicit `userAddress` on the signature.\n if (options.format === 'feePayer' && signature) {\n const sig = SignatureEnvelope.from(signature)\n if (sig.type === 'keychain') return sig.userAddress\n if (sig.type === 'p256' || sig.type === 'webAuthn')\n return Address.fromPublicKey(sig.publicKey)\n if (sig.type === 'secp256k1')\n return Secp256k1.recoverAddress({\n payload: getSignPayload(from(envelope)),\n signature: sig.signature,\n })\n }\n\n const feePayerSignature =\n typeof options.feePayerSignature !== 'undefined'\n ? options.feePayerSignature\n : envelope.feePayerSignature\n // `null` indicates the envelope is intended to be signed by a fee payer\n // but hasn't been signed yet — encode as a single zero byte marker.\n // The sender does not commit to feeToken, so skip it.\n if (feePayerSignature === null) {\n skipFeeToken = true\n return '0x00'\n }\n // No fee payer involvement — omit from the envelope.\n if (!feePayerSignature) return '0x'\n // Fee payer has signed — encode the signature as an RLP tuple.\n return Signature.toTuple(feePayerSignature)\n })()\n\n const serialized = [\n Hex.fromNumber(chainId),\n maxPriorityFeePerGas ? Hex.fromNumber(maxPriorityFeePerGas) : '0x',\n maxFeePerGas ? Hex.fromNumber(maxFeePerGas) : '0x',\n gas ? Hex.fromNumber(gas) : '0x',\n callsTupleList,\n accessTupleList,\n nonceKey ? Hex.fromNumber(nonceKey) : '0x',\n nonce ? Hex.fromNumber(nonce) : '0x',\n typeof validBefore === 'number' ? Hex.fromNumber(validBefore) : '0x',\n typeof validAfter === 'number' ? Hex.fromNumber(validAfter) : '0x',\n !skipFeeToken &&\n (typeof feeToken === 'bigint' || typeof feeToken === 'string')\n ? TokenId.toAddress(feeToken)\n : '0x',\n feePayerSignatureOrSender,\n authorizationTupleList,\n ...(keyAuthorization ? [KeyAuthorization.toTuple(keyAuthorization)] : []),\n ...(signature\n ? [SignatureEnvelope.serialize(SignatureEnvelope.from(signature))]\n : []),\n ] as const\n\n return Hex.concat(\n options.format === 'feePayer' ? feePayerMagic : serializedType,\n Rlp.fromHex(serialized),\n ) as Serialized\n}\n\nexport declare namespace serialize {\n type Options = {\n /**\n * Sender signature to append to the serialized envelope.\n */\n signature?: SignatureEnvelope.from.Value | undefined\n } & OneOf<\n | {\n /**\n * Sender address to cover the fee of.\n *\n * If not provided and a signature is present, the sender will be\n * automatically derived from the signature.\n */\n sender?: Address.Address | undefined\n /**\n * Whether to serialize the transaction in the fee payer format.\n *\n * - If `'feePayer'`, then the transaction will be serialized in the fee payer format.\n * - If `undefined` (default), then the transaction will be serialized in the normal format.\n */\n format: 'feePayer'\n }\n | {\n /**\n * Fee payer signature or the sender to cover the fee of.\n *\n * - If `Signature.Signature`, then this is the fee payer signature.\n * - If `null`, then this indicates the envelope is intended to be signed by a fee payer.\n */\n feePayerSignature?: Signature.Signature | null | undefined\n format?: undefined\n }\n >\n\n type ErrorType =\n | assert.ErrorType\n | Hex.fromNumber.ErrorType\n | Signature.toTuple.ErrorType\n | Hex.concat.ErrorType\n | Rlp.fromHex.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Returns the payload to sign for a {@link ox#TxEnvelopeTempo.TxEnvelopeTempo}.\n *\n * Computes the keccak256 hash of the unsigned serialized transaction. Sign this payload\n * with secp256k1, P256, or WebAuthn, then attach the signature via {@link ox#TxEnvelopeTempo.(from:function)}.\n *\n * [Tempo Transaction Specification](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction)\n *\n * @example\n * The example below demonstrates how to compute the sign payload which can be used\n * with ECDSA signing utilities like {@link ox#Secp256k1.(sign:function)}.\n *\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1 } from 'ox'\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * const envelope = TxEnvelopeTempo.from({\n * chainId: 1,\n * calls: [{\n * data: '0xdeadbeef',\n * to: 'tempox0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * }],\n * nonce: 0n,\n * maxFeePerGas: 1000000000n,\n * gas: 21000n,\n * })\n *\n * const payload = TxEnvelopeTempo.getSignPayload(envelope) // [!code focus]\n * // @log: '0x...'\n *\n * const signature = Secp256k1.sign({ payload, privateKey: '0x...' })\n * ```\n *\n * @example\n * ### Access Keys\n *\n * When signing as an access key on behalf of a root account, pass the\n * `from` option with the root account address. This computes\n * `keccak256(0x04 || sigHash || from)` which binds the signature to the\n * specific user account (V2 keychain format).\n *\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1 } from 'ox'\n * import { TxEnvelopeTempo, SignatureEnvelope } from 'ox/tempo'\n *\n * const envelope = TxEnvelopeTempo.from({\n * chainId: 1,\n * calls: [{\n * data: '0xdeadbeef',\n * to: 'tempox0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * }],\n * nonce: 0n,\n * maxFeePerGas: 1000000000n,\n * gas: 21000n,\n * })\n *\n * const payload = TxEnvelopeTempo.getSignPayload(envelope, { from: '0x...' }) // [!code focus]\n *\n * const signature = Secp256k1.sign({ payload, privateKey: '0x...' })\n *\n * const signed = TxEnvelopeTempo.serialize(envelope, {\n * signature: SignatureEnvelope.from({\n * userAddress: from,\n * inner: SignatureEnvelope.from(signature),\n * }),\n * })\n * ```\n *\n * @param envelope - The transaction envelope to get the sign payload for.\n * @param options - Options.\n * @returns The sign payload.\n */\nexport function getSignPayload(\n envelope: TxEnvelopeTempo,\n options: getSignPayload.Options = {},\n): getSignPayload.ReturnValue {\n const sigHash = hash(envelope, { presign: true })\n if (options.from)\n return Hash.keccak256(\n Hex.concat('0x04', sigHash, TempoAddress.resolve(options.from)),\n )\n return sigHash\n}\n\nexport declare namespace getSignPayload {\n type Options = {\n /**\n * The root account address for access key signing.\n *\n * When provided, computes `keccak256(0x04 || sigHash || from)` instead of\n * the raw `sigHash`, binding the access key signature to the specific user account.\n */\n from?: TempoAddress.Address | undefined\n }\n\n type ReturnValue = Hex.Hex\n\n type ErrorType = hash.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Hashes a {@link ox#TxEnvelopeTempo.TxEnvelopeTempo}. This is the \"transaction hash\".\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1 } from 'ox'\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * const envelope = TxEnvelopeTempo.from({\n * chainId: 1,\n * calls: [{\n * data: '0xdeadbeef',\n * to: 'tempox0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * }],\n * nonce: 0n,\n * maxFeePerGas: 1000000000n,\n * gas: 21000n,\n * })\n *\n * const signature = Secp256k1.sign({\n * payload: TxEnvelopeTempo.getSignPayload(envelope),\n * privateKey: '0x...'\n * })\n *\n * const envelope_signed = TxEnvelopeTempo.from(envelope, { signature })\n *\n * const hash = TxEnvelopeTempo.hash(envelope_signed) // [!code focus]\n * ```\n *\n * @param envelope - The Tempo Transaction Envelope to hash.\n * @param options - Options.\n * @returns The hash of the transaction envelope.\n */\nexport function hash<presign extends boolean = false>(\n envelope: TxEnvelopeTempo<presign extends true ? false : true>,\n options: hash.Options<presign> = {},\n): hash.ReturnValue {\n const serialized = serialize({\n ...envelope,\n ...(options.presign\n ? {\n signature: undefined,\n // When a fee payer signature is present, normalize to `null`\n // (the presign marker).\n ...(envelope.feePayerSignature !== undefined\n ? { feePayerSignature: null }\n : {}),\n }\n : {}),\n })\n return Hash.keccak256(serialized)\n}\n\nexport declare namespace hash {\n type Options<presign extends boolean = false> = {\n /**\n * Whether to hash this transaction for signing.\n *\n * @default false\n */\n presign?: presign | boolean | undefined\n }\n\n type ReturnValue = Hex.Hex\n\n type ErrorType =\n | Hash.keccak256.ErrorType\n | serialize.ErrorType\n | Errors.GlobalErrorType\n}\n\n/**\n * Returns the fee payer payload to sign for a {@link ox#TxEnvelopeTempo.TxEnvelopeTempo}.\n *\n * Fee sponsorship uses a dual-signature scheme: the sender signs the transaction, then a fee payer\n * signs over the transaction with the sender's address to commit to paying fees. The fee payer's\n * signature includes the `feeToken` and `sender_address`, using magic byte `0x78` for domain separation.\n *\n * [Fee Payer Signature](https://docs.tempo.xyz/protocol/transactions/spec-tempo-transaction#fee-payer-signature)\n * [Fee Sponsorship Guide](https://docs.tempo.xyz/protocol/transactions#fee-sponsorship)\n *\n * @example\n * ```ts twoslash\n * // @noErrors\n * import { Secp256k1 } from 'ox'\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * const envelope = TxEnvelopeTempo.from({\n * chainId: 1,\n * calls: [{\n * data: '0xdeadbeef',\n * to: 'tempox0x70997970c51812dc3a010c7d01b50e0d17dc79c8',\n * }],\n * nonce: 0n,\n * maxFeePerGas: 1000000000n,\n * gas: 21000n,\n * })\n *\n * const payload = TxEnvelopeTempo.getFeePayerSignPayload(envelope, {\n * sender: 'tempox0xd8da6bf26964af9d7eed9e03e53415d37aa96045'\n * }) // [!code focus]\n * // @log: '0x...'\n *\n * const signature = Secp256k1.sign({ payload, privateKey: '0x...' })\n * ```\n *\n * @param envelope - The transaction envelope to get the fee payer sign payload for.\n * @param options - Options.\n * @returns The fee payer sign payload.\n */\nexport function getFeePayerSignPayload(\n envelope: TxEnvelopeTempo,\n options: getFeePayerSignPayload.Options,\n): getFeePayerSignPayload.ReturnValue {\n const sender = TempoAddress.resolve(options.sender)\n const serialized = serialize(\n { ...envelope, signature: undefined },\n {\n sender,\n format: 'feePayer',\n },\n )\n return Hash.keccak256(serialized)\n}\n\nexport declare namespace getFeePayerSignPayload {\n type Options = {\n /**\n * Sender address to cover the fee of.\n */\n sender: TempoAddress.Address\n }\n\n type ReturnValue = Hex.Hex\n\n type ErrorType = hash.ErrorType | Errors.GlobalErrorType\n}\n\n/**\n * Validates a {@link ox#TxEnvelopeTempo.TxEnvelopeTempo}. Returns `true` if the envelope is valid, `false` otherwise.\n *\n * @example\n * ```ts twoslash\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * const valid = TxEnvelopeTempo.validate({\n * calls: [{\n * data: '0xdeadbeef',\n * to: 'tempox0x0000000000000000000000000000000000000000',\n * }],\n * chainId: 1,\n * maxFeePerGas: 1000000000n,\n * })\n * // @log: true\n * ```\n *\n * @param envelope - The transaction envelope to validate.\n */\nexport function validate(envelope: PartialBy<TxEnvelopeTempo, 'type'>) {\n try {\n assert(envelope)\n return true\n } catch {\n return false\n }\n}\n\nexport declare namespace validate {\n type ErrorType = Errors.GlobalErrorType\n}\n\n/**\n * Thrown when a transaction's calls list is empty.\n *\n * @example\n * ```ts twoslash\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * TxEnvelopeTempo.assert({\n * calls: [],\n * chainId: 1,\n * })\n * // @error: TxEnvelopeTempo.CallsEmptyError: Calls list cannot be empty.\n * ```\n */\nexport class CallsEmptyError extends Errors.BaseError {\n override readonly name = 'TxEnvelopeTempo.CallsEmptyError'\n constructor() {\n super('Calls list cannot be empty.')\n }\n}\n\n/**\n * Thrown when validBefore is not greater than validAfter.\n *\n * @example\n * ```ts twoslash\n * import { TxEnvelopeTempo } from 'ox/tempo'\n *\n * TxEnvelopeTempo.assert({\n * calls: [{ to: 'tempox0x0000000000000000000000000000000000000000' }],\n * chainId: 1,\n * validBefore: 100,\n * validAfter: 200,\n * })\n * // @error: TxEnvelopeTempo.InvalidValidityWindowError: validBefore (100) must be greater than validAfter (200).\n * ```\n */\nexport class InvalidValidityWindowError extends Errors.BaseError {\n override readonly name = 'TxEnvelopeTempo.InvalidValidityWindowError'\n constructor({\n validBefore,\n validAfter,\n }: {\n validBefore: number\n validAfter: number\n }) {\n super(\n `validBefore (${validBefore}) must be greater than validAfter (${validAfter}).`,\n )\n }\n}\n","// TODO: Find opportunities to make this file less duplicated + more simplified with Viem v3.\n\nimport type { Address } from 'abitype'\nimport * as Hex from 'ox/Hex'\nimport * as Secp256k1 from 'ox/Secp256k1'\nimport * as Signature from 'ox/Signature'\nimport {\n type AuthorizationTempo,\n type KeyAuthorization,\n type TransactionReceipt as ox_TransactionReceipt,\n SignatureEnvelope,\n type TempoAddress,\n TxEnvelopeTempo as TxTempo,\n} from 'ox/tempo'\nimport type { Account } from '../accounts/types.js'\nimport type { FeeValuesEIP1559 } from '../types/fee.js'\nimport type { Signature as viem_Signature } from '../types/misc.js'\nimport type {\n RpcTransaction as viem_RpcTransaction,\n RpcTransactionRequest as viem_RpcTransactionRequest,\n} from '../types/rpc.js'\nimport type {\n AccessList,\n TransactionBase,\n TransactionRequestBase,\n TransactionSerializableBase,\n TransactionSerializedGeneric,\n Transaction as viem_Transaction,\n TransactionReceipt as viem_TransactionReceipt,\n TransactionRequest as viem_TransactionRequest,\n TransactionSerializable as viem_TransactionSerializable,\n TransactionSerialized as viem_TransactionSerialized,\n TransactionType as viem_TransactionType,\n} from '../types/transaction.js'\nimport type { ExactPartial, OneOf, PartialBy } from '../types/utils.js'\nimport { getTransactionType as viem_getTransactionType } from '../utils/transaction/getTransactionType.js'\nimport {\n type ParseTransactionReturnType,\n parseTransaction as viem_parseTransaction,\n} from '../utils/transaction/parseTransaction.js'\nimport { serializeTransaction as viem_serializeTransaction } from '../utils/transaction/serializeTransaction.js'\n\nexport type Transaction<\n bigintType = bigint,\n numberType = number,\n pending extends boolean = false,\n> = OneOf<\n | viem_Transaction<bigintType, numberType, pending>\n | TransactionTempo<bigintType, numberType, pending>\n>\nexport type TransactionRpc<pending extends boolean = false> = OneOf<\n | viem_RpcTransaction<pending>\n | (Omit<\n TransactionTempo<Hex.Hex, Hex.Hex, pending, '0x76'>,\n 'authorizationList' | 'keyAuthorization' | 'signature'\n > & {\n authorizationList?: AuthorizationTempo.ListRpc | undefined\n keyAuthorization?: KeyAuthorization.Rpc | null | undefined\n signature: SignatureEnvelope.SignatureEnvelopeRpc\n })\n>\n\nexport type TransactionTempo<\n quantity = bigint,\n index = number,\n isPending extends boolean = boolean,\n type = 'tempo',\n> = PartialBy<\n Omit<TransactionBase<quantity, index, isPending>, 'input' | 'value' | 'to'>,\n 'r' | 's' | 'v' | 'yParity'\n> & {\n accessList: AccessList\n authorizationList?: AuthorizationTempo.ListSigned<quantity, index> | undefined\n calls: readonly TxTempo.Call<quantity>[]\n chainId: index\n feeToken?: TempoAddress.Address | undefined\n feePayerSignature?: viem_Signature | undefined\n keyAuthorization?: KeyAuthorization.Signed<quantity, index> | null | undefined\n nonceKey?: quantity | undefined\n signature: SignatureEnvelope.SignatureEnvelope\n type: type\n validBefore?: index | undefined\n validAfter?: index | undefined\n} & FeeValuesEIP1559<quantity>\n\nexport type TransactionRequest<\n bigintType = bigint,\n numberType = number,\n> = OneOf<\n | viem_TransactionRequest<bigintType, numberType>\n | TransactionRequestTempo<bigintType, numberType>\n>\nexport type TransactionRequestRpc = OneOf<\n viem_RpcTransactionRequest | TransactionRequestTempo<Hex.Hex, Hex.Hex, '0x76'>\n>\n\nexport type TransactionReceipt<\n quantity = bigint,\n index = number,\n status = 'success' | 'reverted',\n type = TransactionType,\n> = viem_TransactionReceipt<quantity, index, status, type> & {\n feePayer?: TempoAddress.Address | undefined\n feeToken?: TempoAddress.Address | undefined\n}\n\nexport type TransactionReceiptRpc = TransactionReceipt<\n Hex.Hex,\n Hex.Hex,\n ox_TransactionReceipt.RpcStatus,\n ox_TransactionReceipt.RpcType\n>\n\nexport type TransactionRequestTempo<\n quantity = bigint,\n index = number,\n type = 'tempo',\n> = TransactionRequestBase<quantity, index, type> &\n ExactPartial<FeeValuesEIP1559<quantity>> & {\n accessList?: AccessList | undefined\n keyAuthorization?: KeyAuthorization.Signed<quantity, index> | undefined\n calls?: readonly TxTempo.Call<quantity, TempoAddress.Address>[] | undefined\n feePayer?: Account | true | undefined\n feeToken?: TempoAddress.Address | bigint | undefined\n nonceKey?: 'expiring' | quantity | undefined\n validBefore?: index | undefined\n validAfter?: index | undefined\n }\n\nexport type TransactionSerializable = OneOf<\n viem_TransactionSerializable | TransactionSerializableTempo\n>\n\nexport type TransactionSerializableTempo<\n quantity = bigint,\n index = number,\n> = TransactionSerializableBase<quantity, index> &\n ExactPartial<FeeValuesEIP1559<quantity>> & {\n accessList?: AccessList | undefined\n calls: readonly TxTempo.Call<quantity, TempoAddress.Address>[]\n chainId: number\n feeToken?: TempoAddress.Address | bigint | undefined\n feePayerSignature?: viem_Signature | null | undefined\n from?: TempoAddress.Address | undefined\n keyAuthorization?: KeyAuthorization.Signed<quantity, index> | undefined\n nonceKey?: quantity | undefined\n signature?: SignatureEnvelope.SignatureEnvelope<quantity, index> | undefined\n validBefore?: index | undefined\n validAfter?: index | undefined\n type?: 'tempo' | undefined\n }\n\nexport type TransactionSerialized<\n type extends TransactionType = TransactionType,\n> = viem_TransactionSerialized<type> | TransactionSerializedTempo\n\nexport type TransactionSerializedTempo = `0x76${string}`\nexport type TransactionSerializedFeePayer = `0x78${string}`\n\nexport type TransactionType = viem_TransactionType | 'tempo'\n\nexport function getType(\n transaction: Record<string, unknown>,\n): Transaction['type'] {\n const account = transaction.account as\n | { keyType?: string | undefined }\n | undefined\n if (\n (account?.keyType && account.keyType !== 'secp256k1') ||\n typeof transaction.calls !== 'undefined' ||\n typeof transaction.feePayer !== 'undefined' ||\n typeof transaction.feeToken !== 'undefined' ||\n typeof transaction.keyAuthorization !== 'undefined' ||\n typeof transaction.nonceKey !== 'undefined' ||\n typeof transaction.signature !== 'undefined' ||\n typeof transaction.validBefore !== 'undefined' ||\n typeof transaction.validAfter !== 'undefined'\n )\n return 'tempo' as never\n if (transaction.type) return transaction.type as never\n return viem_getTransactionType(transaction) as never\n}\n\nexport function isTempo(transaction: Record<string, unknown>) {\n try {\n const type = getType(transaction)\n return type === 'tempo'\n } catch {\n return false\n }\n}\n\nexport function deserialize<\n const serialized extends TransactionSerializedGeneric,\n>(serializedTransaction: serialized): deserialize.ReturnValue<serialized> {\n const type = Hex.slice(serializedTransaction, 0, 1)\n if (type === '0x76' || type === '0x78')\n return deserializeTempo(serializedTransaction as `0x76${string}`) as never\n return viem_parseTransaction(serializedTransaction) as never\n}\n\nexport declare namespace deserialize {\n export type ReturnValue<\n serialized extends\n TransactionSerializedGeneric = TransactionSerializedGeneric,\n > = serialized extends TransactionSerializedTempo\n ? TransactionSerializableTempo\n : serialized extends TransactionSerializedFeePayer\n ? TransactionSerializableTempo\n : ParseTransactionReturnType<serialized>\n}\n\nexport async function serialize(\n transaction: TransactionSerializable & {\n feePayer?: Account | true | undefined\n from?: TempoAddress.Address | undefined\n },\n signature?:\n | OneOf<SignatureEnvelope.SignatureEnvelope | viem_Signature>\n | undefined,\n) {\n // If the transaction is not a Tempo transaction, route to Viem serializer.\n if (!isTempo(transaction)) {\n if (signature && 'type' in signature && signature.type !== 'secp256k1')\n throw new Error(\n 'Unsupported signature type. Expected `secp256k1` but got `' +\n signature.type +\n '`.',\n )\n if (signature && 'type' in signature) {\n const { r, s, yParity } = signature?.signature!\n return viem_serializeTransaction(transaction as never, {\n r: Hex.fromNumber(r, { size: 32 }),\n s: Hex.fromNumber(s, { size: 32 }),\n yParity,\n })\n }\n return viem_serializeTransaction(transaction as never, signature)\n }\n\n const type = getType(transaction)\n if (type === 'tempo') return serializeTempo(transaction as never, signature)\n\n throw new Error('Unsupported transaction type')\n}\n\n////////////////////////////////////////////////////////////////////////////////////\n// Internal\n\n/** @internal */\nfunction deserializeTempo(\n serializedTransaction: TransactionSerializedTempo,\n): TransactionSerializableTempo {\n const { feePayerSignature, nonce, ...tx } = TxTempo.deserialize(\n serializedTransaction,\n )\n return {\n ...tx,\n nonce: Number(nonce ?? 0n),\n feePayerSignature: feePayerSignature\n ? {\n r: Hex.fromNumber(feePayerSignature.r, { size: 32 }),\n s: Hex.fromNumber(feePayerSignature.s, { size: 32 }),\n yParity: feePayerSignature.yParity,\n }\n : feePayerSignature,\n } satisfies TransactionSerializableTempo\n}\n\n/** @internal */\nasync function serializeTempo(\n transaction: TransactionSerializableTempo & {\n feePayer?: Account | true | undefined\n from?: Address | undefined\n },\n sig?: OneOf<SignatureEnvelope.SignatureEnvelope | viem_Signature> | undefined,\n) {\n const signature = (() => {\n if (transaction.signature) return transaction.signature\n if (sig && 'type' in sig) return sig as SignatureEnvelope.SignatureEnvelope\n if (sig)\n return SignatureEnvelope.from({\n r: BigInt(sig.r!),\n s: BigInt(sig.s!),\n yParity: Number(sig.yParity!),\n })\n return undefined\n })()\n\n const { chainId, feePayer, feePayerSignature, nonce, ...rest } = transaction\n\n const transaction_ox = {\n ...rest,\n calls: rest.calls?.length\n ? rest.calls\n : [\n {\n to:\n rest.to ||\n (!rest.data || rest.data === '0x'\n ? '0x0000000000000000000000000000000000000000'\n : undefined),\n value: rest.value,\n data: rest.data,\n },\n ],\n chainId: Number(chainId),\n feePayerSignature: feePayerSignature\n ? {\n r: BigInt(feePayerSignature.r!),\n s: BigInt(feePayerSignature.s!),\n yParity: Number(feePayerSignature.yParity),\n }\n : feePayer\n ? null\n : undefined,\n type: 'tempo',\n ...(nonce ? { nonce: BigInt(nonce) } : {}),\n } satisfies TxTempo.TxEnvelopeTempo\n\n // If we have marked the transaction as intended to be paid\n // by a fee payer (feePayer: true), we will not use the fee token\n // as the fee payer will choose their fee token.\n if (feePayer === true) delete transaction_ox.feeToken\n\n if (signature && typeof transaction.feePayer === 'object') {\n const tx = TxTempo.from(transaction_ox, {\n signature,\n })\n\n const sender = (() => {\n if (transaction.from) return transaction.from\n if (signature.type === 'secp256k1')\n return Secp256k1.recoverAddress({\n payload: TxTempo.getSignPayload(tx),\n signature: signature.signature,\n })\n throw new Error('Unable to extract sender from transaction or signature.')\n })()\n\n const hash = TxTempo.getFeePayerSignPayload(tx, {\n sender,\n })\n\n const feePayerSignature = await transaction.feePayer.sign!({\n hash,\n })\n\n return TxTempo.serialize(tx, {\n feePayerSignature: Signature.from(feePayerSignature),\n })\n }\n\n if (feePayer === true) {\n if (signature)\n return TxTempo.serialize(transaction_ox, {\n format: 'feePayer',\n sender: transaction.from,\n signature,\n })\n return TxTempo.serialize(transaction_ox, {\n feePayerSignature: null,\n })\n }\n\n return TxTempo.serialize(\n // If we have specified a fee payer, the user will not be signing over the fee token.\n // Defer the fee token signing to the fee payer.\n { ...transaction_ox, ...(feePayer ? { feeToken: undefined } : {}) },\n {\n feePayerSignature: undefined,\n signature,\n },\n )\n}\n\n// Export types required for inference.\n// biome-ignore lint/performance/noBarrelFile: _\nexport {\n /** @deprecated */\n KeyAuthorization as z_KeyAuthorization,\n /** @deprecated */\n SignatureEnvelope as z_SignatureEnvelope,\n /** @deprecated */\n TxEnvelopeTempo as z_TxEnvelopeTempo,\n} from 'ox/tempo'\n","// TODO: Find opportunities to make this file less duplicated + more simplified with Viem v3.\n\nimport type { Address } from 'abitype'\nimport * as Hex from 'ox/Hex'\nimport {\n Transaction as ox_Transaction,\n TransactionRequest as ox_TransactionRequest,\n} from 'ox/tempo'\nimport type { Account as viem_Account } from '../accounts/types.js'\nimport { parseAccount } from '../accounts/utils/parseAccount.js'\nimport { formatTransaction as viem_formatTransaction } from '../utils/formatters/transaction.js'\nimport { formatTransactionReceipt as viem_formatTransactionReceipt } from '../utils/formatters/transactionReceipt.js'\nimport { formatTransactionRequest as viem_formatTransactionRequest } from '../utils/formatters/transactionRequest.js'\nimport type { Account } from './Account.js'\nimport {\n isTempo,\n type Transaction,\n type TransactionReceipt,\n type TransactionReceiptRpc,\n type TransactionRequest,\n type TransactionRequestRpc,\n type TransactionRpc,\n} from './Transaction.js'\n\nexport function formatTransaction(\n transaction: TransactionRpc,\n): Transaction<bigint, number, boolean> {\n if (!isTempo(transaction)) return viem_formatTransaction(transaction as never)\n\n const {\n feePayerSignature,\n gasPrice: _,\n nonce,\n ...tx\n } = ox_Transaction.fromRpc(transaction as never) as ox_Transaction.Tempo\n\n return {\n ...tx,\n accessList: tx.accessList!,\n feePayerSignature: feePayerSignature\n ? {\n r: Hex.fromNumber(feePayerSignature.r, { size: 32 }),\n s: Hex.fromNumber(feePayerSignature.s, { size: 32 }),\n v: BigInt(feePayerSignature.v ?? 27),\n yParity: feePayerSignature.yParity,\n }\n : undefined,\n nonce: Number(nonce),\n typeHex:\n ox_Transaction.toRpcType[\n tx.type as keyof typeof ox_Transaction.toRpcType\n ],\n type: tx.type as 'tempo',\n }\n}\n\nexport function formatTransactionReceipt(\n receipt: TransactionReceiptRpc,\n): TransactionReceipt {\n return viem_formatTransactionReceipt(receipt as never)\n}\n\nexport function formatTransactionRequest(\n r: TransactionRequest,\n action?: string | undefined,\n): TransactionRequestRpc {\n const request = r as TransactionRequest & {\n account?: viem_Account | Address | undefined\n }\n const account = request.account\n ? parseAccount<Account | viem_Account | Address>(request.account)\n : undefined\n\n // If the request is not a Tempo transaction, route to Viem formatter.\n if (!isTempo(request))\n return viem_formatTransactionRequest(\n r as never,\n action,\n ) as TransactionRequestRpc\n\n if (action)\n request.calls = request.calls ?? [\n {\n to:\n r.to ||\n (!r.data || r.data === '0x'\n ? '0x0000000000000000000000000000000000000000'\n : undefined),\n value: r.value,\n data: r.data,\n },\n ]\n\n // If we have marked the transaction as intended to be paid\n // by a fee payer (feePayer: true), we will not use the fee token\n // as the fee payer will choose their fee token.\n if (request.feePayer === true) delete request.feeToken\n\n const rpc = ox_TransactionRequest.toRpc({\n ...request,\n type: 'tempo',\n } as never)\n\n if (action === 'estimateGas') {\n rpc.maxFeePerGas = undefined\n rpc.maxPriorityFeePerGas = undefined\n }\n\n rpc.to = undefined\n rpc.data = undefined\n rpc.value = undefined\n\n const [keyType, keyData] = (() => {\n const type =\n account && 'keyType' in account ? account.keyType : account?.source\n if (!type) return [undefined, undefined]\n if (type === 'webAuthn')\n // TODO: derive correct bytes size of key data based on webauthn create metadata.\n return ['webAuthn', `0x${'ff'.repeat(1400)}`]\n if (['p256', 'secp256k1'].includes(type)) return [type, undefined]\n return [undefined, undefined]\n })()\n\n const keyId =\n account && 'accessKeyAddress' in account\n ? account.accessKeyAddress\n : undefined\n\n return {\n ...rpc,\n ...(keyData ? { keyData } : {}),\n ...(keyId ? { keyId } : {}),\n ...(keyType ? { keyType } : {}),\n ...(request.feePayer\n ? {\n feePayer:\n typeof request.feePayer === 'object'\n ? parseAccount(request.feePayer)\n : request.feePayer,\n }\n : {}),\n } as never\n}\n","const concurrentCounts = new Map<string, number>()\n\n/**\n * Detects if there are concurrent tasks occuring for a given key\n * within the same event loop tick. Registers the request, yields to allow\n * other concurrent calls to register, then returns whether multiple requests\n * were detected.\n *\n * @example\n * ```ts\n * const isConcurrent = await Concurrent.detect(address)\n * ```\n */\nexport async function detect(key: string): Promise<boolean> {\n concurrentCounts.set(key, (concurrentCounts.get(key) ?? 0) + 1)\n await Promise.resolve()\n const isConcurrent = (concurrentCounts.get(key) ?? 0) > 1\n queueMicrotask(() => {\n const count = concurrentCounts.get(key) ?? 0\n if (count <= 1) concurrentCounts.delete(key)\n else concurrentCounts.set(key, count - 1)\n })\n return isConcurrent\n}\n","import { SignatureEnvelope, type TokenId } from 'ox/tempo'\nimport { getCode } from '../actions/public/getCode.js'\nimport { verifyHash } from '../actions/public/verifyHash.js'\nimport { maxUint256 } from '../constants/number.js'\nimport type { Chain, ChainConfig as viem_ChainConfig } from '../types/chain.js'\nimport { extendSchema } from '../utils/chain/defineChain.js'\nimport { defineTransaction } from '../utils/formatters/transaction.js'\nimport { defineTransactionReceipt } from '../utils/formatters/transactionReceipt.js'\nimport { defineTransactionRequest } from '../utils/formatters/transactionRequest.js'\nimport { getAction } from '../utils/getAction.js'\nimport type { SerializeTransactionFn } from '../utils/transaction/serializeTransaction.js'\nimport type { Account } from './Account.js'\nimport * as Formatters from './Formatters.js'\nimport * as Concurrent from './internal/concurrent.js'\nimport * as Transaction from './Transaction.js'\n\nconst maxExpirySecs = 25\n\nexport const chainConfig = {\n blockTime: 1_000,\n extendSchema: extendSchema<{\n feeToken?: TokenId.TokenIdOrAddress | undefined\n }>(),\n formatters: {\n transaction: defineTransaction({\n exclude: ['aaAuthorizationList' as never],\n format: Formatters.formatTransaction,\n }),\n transactionReceipt: defineTransactionReceipt({\n format: Formatters.formatTransactionReceipt,\n }),\n transactionRequest: defineTransactionRequest({\n format: Formatters.formatTransactionRequest,\n }),\n },\n prepareTransactionRequest: [\n async (r, { phase }) => {\n const request = r as Transaction.TransactionRequest & {\n account?: Account | undefined\n chain?:\n | (Chain & { feeToken?: TokenId.TokenIdOrAddress | undefined })\n | undefined\n }\n\n // FIXME: node does not account for fee payer + key authorization combinartion; bump gas for now.\n if (phase === 'afterFillParameters') {\n if (\n request.feePayer &&\n request.keyAuthorization?.signature.type === 'webAuthn'\n )\n request.gas = (request.gas ?? 0n) + 20_000n\n return request as unknown as typeof r\n }\n\n // Use expiring nonces for concurrent transactions (TIP-1009).\n // When nonceKey is 'expiring', feePayer is specified, or concurrent requests\n // are detected, we use expiring nonces (nonceKey = uint256.max) with a\n // validBefore timestamp.\n const useExpiringNonce = await (async () => {\n if (request.nonceKey === 'expiring') return true\n if (request.feePayer && typeof request.nonceKey === 'undefined')\n return true\n const address = request.account?.address\n if (address && typeof request.nonceKey === 'undefined')\n return await Concurrent.detect(address)\n return false\n })()\n\n if (useExpiringNonce) {\n request.nonceKey = maxUint256\n request.nonce = 0\n if (typeof request.validBefore === 'undefined')\n request.validBefore = Math.floor(Date.now() / 1000) + maxExpirySecs\n } else if (typeof request.nonceKey !== 'undefined') {\n // Explicit nonceKey provided (2D nonce mode)\n request.nonce = typeof request.nonce === 'number' ? request.nonce : 0\n }\n\n if (!request.feeToken && request.chain?.feeToken)\n request.feeToken = request.chain.feeToken\n\n return request as unknown as typeof r\n },\n { runAt: ['beforeFillTransaction', 'afterFillParameters'] },\n ],\n serializers: {\n // TODO: casting to satisfy viem – viem v3 to have more flexible serializer type.\n transaction: ((transaction, signature) =>\n Transaction.serialize(transaction, signature)) as SerializeTransactionFn,\n },\n async verifyHash(client, parameters) {\n const { address, hash, signature } = parameters\n\n // `verifyHash` supports \"signature envelopes\" (a Tempo proposal) to natively verify arbitrary\n // envelope-compatible (WebAuthn, P256, etc.) signatures.\n // We can directly verify stateless, non-keychain signature envelopes without a\n // network request to the chain.\n if (\n typeof signature === 'string' &&\n signature.endsWith(SignatureEnvelope.magicBytes.slice(2))\n ) {\n const envelope = SignatureEnvelope.deserialize(signature)\n if (envelope.type !== 'keychain') {\n const code = await getCode(client, {\n address,\n blockNumber: parameters.blockNumber,\n blockTag: parameters.blockTag,\n } as never)\n // Check if EOA, if not, we want to go down the ERC-1271 flow.\n if (\n // not a contract (EOA)\n !code ||\n // default delegation (tempo EOA)\n code === '0xef01007702c00000000000000000000000000000000000'\n )\n return SignatureEnvelope.verify(envelope, {\n address,\n payload: hash,\n })\n }\n }\n\n return await getAction(\n client,\n verifyHash,\n 'verifyHash',\n )({ ...parameters, chain: null })\n },\n} as const satisfies viem_ChainConfig & { blockTime: number }\n\nexport type ChainConfig = typeof chainConfig\n","import { chainConfig } from '../../tempo/chainConfig.js'\nimport { defineChain } from '../../utils/chain/defineChain.js'\n\nexport const tempo = /*#__PURE__*/ defineChain({\n ...chainConfig,\n id: 4217,\n blockExplorers: {\n default: {\n name: 'Tempo Explorer',\n url: 'https://explore.tempo.xyz',\n },\n },\n name: 'Tempo Mainnet',\n nativeCurrency: {\n name: 'USD',\n symbol: 'USD',\n decimals: 6,\n },\n rpcUrls: {\n default: {\n http: ['https://rpc.presto.tempo.xyz'],\n webSocket: ['wss://rpc.presto.tempo.xyz'],\n },\n },\n})\n","// Generated with `pnpm gen:abis`. Do not modify manually.\n\nexport const tip20 = [\n {\n name: 'name',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'string' }],\n },\n {\n name: 'symbol',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'string' }],\n },\n {\n name: 'decimals',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint8' }],\n },\n {\n name: 'totalSupply',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'quoteToken',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'address' }],\n },\n {\n name: 'nextQuoteToken',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'address' }],\n },\n {\n name: 'balanceOf',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'address', name: 'account' }],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'transfer',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'to' },\n { type: 'uint256', name: 'amount' },\n ],\n outputs: [{ type: 'bool' }],\n },\n {\n name: 'approve',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'spender' },\n { type: 'uint256', name: 'amount' },\n ],\n outputs: [{ type: 'bool' }],\n },\n {\n name: 'allowance',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'address', name: 'owner' },\n { type: 'address', name: 'spender' },\n ],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'transferFrom',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'from' },\n { type: 'address', name: 'to' },\n { type: 'uint256', name: 'amount' },\n ],\n outputs: [{ type: 'bool' }],\n },\n {\n name: 'mint',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'to' },\n { type: 'uint256', name: 'amount' },\n ],\n outputs: [],\n },\n {\n name: 'burn',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'uint256', name: 'amount' }],\n outputs: [],\n },\n {\n name: 'currency',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'string' }],\n },\n {\n name: 'supplyCap',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'paused',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'bool' }],\n },\n {\n name: 'transferPolicyId',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint64' }],\n },\n {\n name: 'burnBlocked',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'from' },\n { type: 'uint256', name: 'amount' },\n ],\n outputs: [],\n },\n {\n name: 'mintWithMemo',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'to' },\n { type: 'uint256', name: 'amount' },\n { type: 'bytes32', name: 'memo' },\n ],\n outputs: [],\n },\n {\n name: 'burnWithMemo',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'uint256', name: 'amount' },\n { type: 'bytes32', name: 'memo' },\n ],\n outputs: [],\n },\n {\n name: 'transferWithMemo',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'to' },\n { type: 'uint256', name: 'amount' },\n { type: 'bytes32', name: 'memo' },\n ],\n outputs: [],\n },\n {\n name: 'transferFromWithMemo',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'from' },\n { type: 'address', name: 'to' },\n { type: 'uint256', name: 'amount' },\n { type: 'bytes32', name: 'memo' },\n ],\n outputs: [{ type: 'bool' }],\n },\n {\n name: 'changeTransferPolicyId',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'uint64', name: 'newPolicyId' }],\n outputs: [],\n },\n {\n name: 'setSupplyCap',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'uint256', name: 'newSupplyCap' }],\n outputs: [],\n },\n {\n name: 'pause',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [],\n outputs: [],\n },\n {\n name: 'unpause',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [],\n outputs: [],\n },\n {\n name: 'setNextQuoteToken',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'address', name: 'newQuoteToken' }],\n outputs: [],\n },\n {\n name: 'completeQuoteTokenUpdate',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [],\n outputs: [],\n },\n {\n name: 'PAUSE_ROLE',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'bytes32' }],\n },\n {\n name: 'UNPAUSE_ROLE',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'bytes32' }],\n },\n {\n name: 'ISSUER_ROLE',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'bytes32' }],\n },\n {\n name: 'BURN_BLOCKED_ROLE',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'bytes32' }],\n },\n {\n name: 'distributeReward',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'uint256', name: 'amount' }],\n outputs: [],\n },\n {\n name: 'setRewardRecipient',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'address', name: 'recipient' }],\n outputs: [],\n },\n {\n name: 'claimRewards',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'optedInSupply',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint128' }],\n },\n {\n name: 'globalRewardPerToken',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'userRewardInfo',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'address', name: 'account' }],\n outputs: [\n {\n type: 'tuple',\n components: [\n { type: 'address', name: 'rewardRecipient' },\n { type: 'uint256', name: 'rewardPerToken' },\n { type: 'uint256', name: 'rewardBalance' },\n ],\n },\n ],\n },\n {\n name: 'getPendingRewards',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'address', name: 'account' }],\n outputs: [{ type: 'uint128' }],\n },\n {\n name: 'Transfer',\n type: 'event',\n inputs: [\n { type: 'address', name: 'from', indexed: true },\n { type: 'address', name: 'to', indexed: true },\n { type: 'uint256', name: 'amount' },\n ],\n },\n {\n name: 'Approval',\n type: 'event',\n inputs: [\n { type: 'address', name: 'owner', indexed: true },\n { type: 'address', name: 'spender', indexed: true },\n { type: 'uint256', name: 'amount' },\n ],\n },\n {\n name: 'Mint',\n type: 'event',\n inputs: [\n { type: 'address', name: 'to', indexed: true },\n { type: 'uint256', name: 'amount' },\n ],\n },\n {\n name: 'Burn',\n type: 'event',\n inputs: [\n { type: 'address', name: 'from', indexed: true },\n { type: 'uint256', name: 'amount' },\n ],\n },\n {\n name: 'BurnBlocked',\n type: 'event',\n inputs: [\n { type: 'address', name: 'from', indexed: true },\n { type: 'uint256', name: 'amount' },\n ],\n },\n {\n name: 'TransferWithMemo',\n type: 'event',\n inputs: [\n { type: 'address', name: 'from', indexed: true },\n { type: 'address', name: 'to', indexed: true },\n { type: 'uint256', name: 'amount' },\n { type: 'bytes32', name: 'memo', indexed: true },\n ],\n },\n {\n name: 'TransferPolicyUpdate',\n type: 'event',\n inputs: [\n { type: 'address', name: 'updater', indexed: true },\n { type: 'uint64', name: 'newPolicyId', indexed: true },\n ],\n },\n {\n name: 'SupplyCapUpdate',\n type: 'event',\n inputs: [\n { type: 'address', name: 'updater', indexed: true },\n { type: 'uint256', name: 'newSupplyCap', indexed: true },\n ],\n },\n {\n name: 'PauseStateUpdate',\n type: 'event',\n inputs: [\n { type: 'address', name: 'updater', indexed: true },\n { type: 'bool', name: 'isPaused' },\n ],\n },\n {\n name: 'NextQuoteTokenSet',\n type: 'event',\n inputs: [\n { type: 'address', name: 'updater', indexed: true },\n { type: 'address', name: 'nextQuoteToken', indexed: true },\n ],\n },\n {\n name: 'QuoteTokenUpdate',\n type: 'event',\n inputs: [\n { type: 'address', name: 'updater', indexed: true },\n { type: 'address', name: 'newQuoteToken', indexed: true },\n ],\n },\n {\n name: 'RewardDistributed',\n type: 'event',\n inputs: [\n { type: 'address', name: 'funder', indexed: true },\n { type: 'uint256', name: 'amount' },\n ],\n },\n {\n name: 'RewardRecipientSet',\n type: 'event',\n inputs: [\n { type: 'address', name: 'holder', indexed: true },\n { type: 'address', name: 'recipient', indexed: true },\n ],\n },\n {\n name: 'InsufficientBalance',\n type: 'error',\n inputs: [\n { type: 'uint256', name: 'available' },\n { type: 'uint256', name: 'required' },\n { type: 'address', name: 'token' },\n ],\n },\n { name: 'InsufficientAllowance', type: 'error', inputs: [] },\n { name: 'SupplyCapExceeded', type: 'error', inputs: [] },\n { name: 'InvalidSupplyCap', type: 'error', inputs: [] },\n { name: 'InvalidPayload', type: 'error', inputs: [] },\n { name: 'StringTooLong', type: 'error', inputs: [] },\n { name: 'PolicyForbids', type: 'error', inputs: [] },\n { name: 'InvalidRecipient', type: 'error', inputs: [] },\n { name: 'ContractPaused', type: 'error', inputs: [] },\n { name: 'InvalidCurrency', type: 'error', inputs: [] },\n { name: 'InvalidQuoteToken', type: 'error', inputs: [] },\n { name: 'TransfersDisabled', type: 'error', inputs: [] },\n { name: 'InvalidAmount', type: 'error', inputs: [] },\n { name: 'NoOptedInSupply', type: 'error', inputs: [] },\n { name: 'Unauthorized', type: 'error', inputs: [] },\n { name: 'ProtectedAddress', type: 'error', inputs: [] },\n { name: 'InvalidToken', type: 'error', inputs: [] },\n { name: 'Uninitialized', type: 'error', inputs: [] },\n { name: 'InvalidTransferPolicyId', type: 'error', inputs: [] },\n {\n name: 'hasRole',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'address', name: 'account' },\n { type: 'bytes32', name: 'role' },\n ],\n outputs: [{ type: 'bool' }],\n },\n {\n name: 'getRoleAdmin',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'bytes32', name: 'role' }],\n outputs: [{ type: 'bytes32' }],\n },\n {\n name: 'grantRole',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'bytes32', name: 'role' },\n { type: 'address', name: 'account' },\n ],\n outputs: [],\n },\n {\n name: 'revokeRole',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'bytes32', name: 'role' },\n { type: 'address', name: 'account' },\n ],\n outputs: [],\n },\n {\n name: 'renounceRole',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'bytes32', name: 'role' }],\n outputs: [],\n },\n {\n name: 'setRoleAdmin',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'bytes32', name: 'role' },\n { type: 'bytes32', name: 'adminRole' },\n ],\n outputs: [],\n },\n {\n name: 'RoleMembershipUpdated',\n type: 'event',\n inputs: [\n { type: 'bytes32', name: 'role', indexed: true },\n { type: 'address', name: 'account', indexed: true },\n { type: 'address', name: 'sender', indexed: true },\n { type: 'bool', name: 'hasRole' },\n ],\n },\n {\n name: 'RoleAdminUpdated',\n type: 'event',\n inputs: [\n { type: 'bytes32', name: 'role', indexed: true },\n { type: 'bytes32', name: 'newAdminRole', indexed: true },\n { type: 'address', name: 'sender', indexed: true },\n ],\n },\n { name: 'Unauthorized', type: 'error', inputs: [] },\n] as const\n\nexport const stablecoinDex = [\n {\n name: 'createPair',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'address', name: 'base' }],\n outputs: [{ type: 'bytes32', name: 'key' }],\n },\n {\n name: 'place',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'token' },\n { type: 'uint128', name: 'amount' },\n { type: 'bool', name: 'isBid' },\n { type: 'int16', name: 'tick' },\n ],\n outputs: [{ type: 'uint128', name: 'orderId' }],\n },\n {\n name: 'placeFlip',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'token' },\n { type: 'uint128', name: 'amount' },\n { type: 'bool', name: 'isBid' },\n { type: 'int16', name: 'tick' },\n { type: 'int16', name: 'flipTick' },\n ],\n outputs: [{ type: 'uint128', name: 'orderId' }],\n },\n {\n name: 'cancel',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'uint128', name: 'orderId' }],\n outputs: [],\n },\n {\n name: 'cancelStaleOrder',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'uint128', name: 'orderId' }],\n outputs: [],\n },\n {\n name: 'swapExactAmountIn',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'tokenIn' },\n { type: 'address', name: 'tokenOut' },\n { type: 'uint128', name: 'amountIn' },\n { type: 'uint128', name: 'minAmountOut' },\n ],\n outputs: [{ type: 'uint128', name: 'amountOut' }],\n },\n {\n name: 'swapExactAmountOut',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'tokenIn' },\n { type: 'address', name: 'tokenOut' },\n { type: 'uint128', name: 'amountOut' },\n { type: 'uint128', name: 'maxAmountIn' },\n ],\n outputs: [{ type: 'uint128', name: 'amountIn' }],\n },\n {\n name: 'quoteSwapExactAmountIn',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'address', name: 'tokenIn' },\n { type: 'address', name: 'tokenOut' },\n { type: 'uint128', name: 'amountIn' },\n ],\n outputs: [{ type: 'uint128', name: 'amountOut' }],\n },\n {\n name: 'quoteSwapExactAmountOut',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'address', name: 'tokenIn' },\n { type: 'address', name: 'tokenOut' },\n { type: 'uint128', name: 'amountOut' },\n ],\n outputs: [{ type: 'uint128', name: 'amountIn' }],\n },\n {\n name: 'balanceOf',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'address', name: 'user' },\n { type: 'address', name: 'token' },\n ],\n outputs: [{ type: 'uint128' }],\n },\n {\n name: 'withdraw',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'token' },\n { type: 'uint128', name: 'amount' },\n ],\n outputs: [],\n },\n {\n name: 'getOrder',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'uint128', name: 'orderId' }],\n outputs: [\n {\n type: 'tuple',\n components: [\n { type: 'uint128', name: 'orderId' },\n { type: 'address', name: 'maker' },\n { type: 'bytes32', name: 'bookKey' },\n { type: 'bool', name: 'isBid' },\n { type: 'int16', name: 'tick' },\n { type: 'uint128', name: 'amount' },\n { type: 'uint128', name: 'remaining' },\n { type: 'uint128', name: 'prev' },\n { type: 'uint128', name: 'next' },\n { type: 'bool', name: 'isFlip' },\n { type: 'int16', name: 'flipTick' },\n ],\n },\n ],\n },\n {\n name: 'getTickLevel',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'address', name: 'base' },\n { type: 'int16', name: 'tick' },\n { type: 'bool', name: 'isBid' },\n ],\n outputs: [\n { type: 'uint128', name: 'head' },\n { type: 'uint128', name: 'tail' },\n { type: 'uint128', name: 'totalLiquidity' },\n ],\n },\n {\n name: 'pairKey',\n type: 'function',\n stateMutability: 'pure',\n inputs: [\n { type: 'address', name: 'tokenA' },\n { type: 'address', name: 'tokenB' },\n ],\n outputs: [{ type: 'bytes32' }],\n },\n {\n name: 'nextOrderId',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint128' }],\n },\n {\n name: 'books',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'bytes32', name: 'pairKey' }],\n outputs: [\n {\n type: 'tuple',\n components: [\n { type: 'address', name: 'base' },\n { type: 'address', name: 'quote' },\n { type: 'int16', name: 'bestBidTick' },\n { type: 'int16', name: 'bestAskTick' },\n ],\n },\n ],\n },\n {\n name: 'MIN_TICK',\n type: 'function',\n stateMutability: 'pure',\n inputs: [],\n outputs: [{ type: 'int16' }],\n },\n {\n name: 'MAX_TICK',\n type: 'function',\n stateMutability: 'pure',\n inputs: [],\n outputs: [{ type: 'int16' }],\n },\n {\n name: 'TICK_SPACING',\n type: 'function',\n stateMutability: 'pure',\n inputs: [],\n outputs: [{ type: 'int16' }],\n },\n {\n name: 'PRICE_SCALE',\n type: 'function',\n stateMutability: 'pure',\n inputs: [],\n outputs: [{ type: 'uint32' }],\n },\n {\n name: 'MIN_ORDER_AMOUNT',\n type: 'function',\n stateMutability: 'pure',\n inputs: [],\n outputs: [{ type: 'uint128' }],\n },\n {\n name: 'MIN_PRICE',\n type: 'function',\n stateMutability: 'pure',\n inputs: [],\n outputs: [{ type: 'uint32' }],\n },\n {\n name: 'MAX_PRICE',\n type: 'function',\n stateMutability: 'pure',\n inputs: [],\n outputs: [{ type: 'uint32' }],\n },\n {\n name: 'tickToPrice',\n type: 'function',\n stateMutability: 'pure',\n inputs: [{ type: 'int16', name: 'tick' }],\n outputs: [{ type: 'uint32', name: 'price' }],\n },\n {\n name: 'priceToTick',\n type: 'function',\n stateMutability: 'pure',\n inputs: [{ type: 'uint32', name: 'price' }],\n outputs: [{ type: 'int16', name: 'tick' }],\n },\n {\n name: 'PairCreated',\n type: 'event',\n inputs: [\n { type: 'bytes32', name: 'key', indexed: true },\n { type: 'address', name: 'base', indexed: true },\n { type: 'address', name: 'quote', indexed: true },\n ],\n },\n {\n name: 'OrderPlaced',\n type: 'event',\n inputs: [\n { type: 'uint128', name: 'orderId', indexed: true },\n { type: 'address', name: 'maker', indexed: true },\n { type: 'address', name: 'token', indexed: true },\n { type: 'uint128', name: 'amount' },\n { type: 'bool', name: 'isBid' },\n { type: 'int16', name: 'tick' },\n { type: 'bool', name: 'isFlipOrder' },\n { type: 'int16', name: 'flipTick' },\n ],\n },\n {\n name: 'OrderFilled',\n type: 'event',\n inputs: [\n { type: 'uint128', name: 'orderId', indexed: true },\n { type: 'address', name: 'maker', indexed: true },\n { type: 'address', name: 'taker', indexed: true },\n { type: 'uint128', name: 'amountFilled' },\n { type: 'bool', name: 'partialFill' },\n ],\n },\n {\n name: 'OrderCancelled',\n type: 'event',\n inputs: [{ type: 'uint128', name: 'orderId', indexed: true }],\n },\n { name: 'Unauthorized', type: 'error', inputs: [] },\n { name: 'PairDoesNotExist', type: 'error', inputs: [] },\n { name: 'PairAlreadyExists', type: 'error', inputs: [] },\n { name: 'OrderDoesNotExist', type: 'error', inputs: [] },\n { name: 'IdenticalTokens', type: 'error', inputs: [] },\n { name: 'InvalidToken', type: 'error', inputs: [] },\n {\n name: 'TickOutOfBounds',\n type: 'error',\n inputs: [{ type: 'int16', name: 'tick' }],\n },\n { name: 'InvalidTick', type: 'error', inputs: [] },\n { name: 'InvalidFlipTick', type: 'error', inputs: [] },\n { name: 'InsufficientBalance', type: 'error', inputs: [] },\n { name: 'InsufficientLiquidity', type: 'error', inputs: [] },\n { name: 'InsufficientOutput', type: 'error', inputs: [] },\n { name: 'MaxInputExceeded', type: 'error', inputs: [] },\n {\n name: 'BelowMinimumOrderSize',\n type: 'error',\n inputs: [{ type: 'uint128', name: 'amount' }],\n },\n { name: 'InvalidBaseToken', type: 'error', inputs: [] },\n { name: 'OrderNotStale', type: 'error', inputs: [] },\n] as const\n\nexport const feeManager = [\n {\n name: 'userTokens',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'address', name: 'user' }],\n outputs: [{ type: 'address' }],\n },\n {\n name: 'validatorTokens',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'address', name: 'validator' }],\n outputs: [{ type: 'address' }],\n },\n {\n name: 'setUserToken',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'address', name: 'token' }],\n outputs: [],\n },\n {\n name: 'setValidatorToken',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'address', name: 'token' }],\n outputs: [],\n },\n {\n name: 'distributeFees',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'validator' },\n { type: 'address', name: 'token' },\n ],\n outputs: [],\n },\n {\n name: 'collectedFees',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'address', name: 'validator' },\n { type: 'address', name: 'token' },\n ],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'UserTokenSet',\n type: 'event',\n inputs: [\n { type: 'address', name: 'user', indexed: true },\n { type: 'address', name: 'token', indexed: true },\n ],\n },\n {\n name: 'ValidatorTokenSet',\n type: 'event',\n inputs: [\n { type: 'address', name: 'validator', indexed: true },\n { type: 'address', name: 'token', indexed: true },\n ],\n },\n {\n name: 'FeesDistributed',\n type: 'event',\n inputs: [\n { type: 'address', name: 'validator', indexed: true },\n { type: 'address', name: 'token', indexed: true },\n { type: 'uint256', name: 'amount' },\n ],\n },\n { name: 'OnlyValidator', type: 'error', inputs: [] },\n { name: 'OnlySystemContract', type: 'error', inputs: [] },\n { name: 'InvalidToken', type: 'error', inputs: [] },\n { name: 'PoolDoesNotExist', type: 'error', inputs: [] },\n { name: 'InsufficientFeeTokenBalance', type: 'error', inputs: [] },\n { name: 'InternalError', type: 'error', inputs: [] },\n { name: 'CannotChangeWithinBlock', type: 'error', inputs: [] },\n { name: 'CannotChangeWithPendingFees', type: 'error', inputs: [] },\n { name: 'TokenPolicyForbids', type: 'error', inputs: [] },\n] as const\n\nexport const feeAmm = [\n {\n name: 'M',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'N',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'SCALE',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'MIN_LIQUIDITY',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'getPoolId',\n type: 'function',\n stateMutability: 'pure',\n inputs: [\n { type: 'address', name: 'userToken' },\n { type: 'address', name: 'validatorToken' },\n ],\n outputs: [{ type: 'bytes32' }],\n },\n {\n name: 'getPool',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'address', name: 'userToken' },\n { type: 'address', name: 'validatorToken' },\n ],\n outputs: [\n {\n type: 'tuple',\n components: [\n { type: 'uint128', name: 'reserveUserToken' },\n { type: 'uint128', name: 'reserveValidatorToken' },\n ],\n },\n ],\n },\n {\n name: 'pools',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'bytes32', name: 'poolId' }],\n outputs: [\n {\n type: 'tuple',\n components: [\n { type: 'uint128', name: 'reserveUserToken' },\n { type: 'uint128', name: 'reserveValidatorToken' },\n ],\n },\n ],\n },\n {\n name: 'mint',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'userToken' },\n { type: 'address', name: 'validatorToken' },\n { type: 'uint256', name: 'amountValidatorToken' },\n { type: 'address', name: 'to' },\n ],\n outputs: [{ type: 'uint256', name: 'liquidity' }],\n },\n {\n name: 'burn',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'userToken' },\n { type: 'address', name: 'validatorToken' },\n { type: 'uint256', name: 'liquidity' },\n { type: 'address', name: 'to' },\n ],\n outputs: [\n { type: 'uint256', name: 'amountUserToken' },\n { type: 'uint256', name: 'amountValidatorToken' },\n ],\n },\n {\n name: 'totalSupply',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'bytes32', name: 'poolId' }],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'liquidityBalances',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'bytes32', name: 'poolId' },\n { type: 'address', name: 'user' },\n ],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'rebalanceSwap',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'userToken' },\n { type: 'address', name: 'validatorToken' },\n { type: 'uint256', name: 'amountOut' },\n { type: 'address', name: 'to' },\n ],\n outputs: [{ type: 'uint256', name: 'amountIn' }],\n },\n {\n name: 'Mint',\n type: 'event',\n inputs: [\n { type: 'address', name: 'sender' },\n { type: 'address', name: 'to', indexed: true },\n { type: 'address', name: 'userToken', indexed: true },\n { type: 'address', name: 'validatorToken', indexed: true },\n { type: 'uint256', name: 'amountValidatorToken' },\n { type: 'uint256', name: 'liquidity' },\n ],\n },\n {\n name: 'Burn',\n type: 'event',\n inputs: [\n { type: 'address', name: 'sender', indexed: true },\n { type: 'address', name: 'userToken', indexed: true },\n { type: 'address', name: 'validatorToken', indexed: true },\n { type: 'uint256', name: 'amountUserToken' },\n { type: 'uint256', name: 'amountValidatorToken' },\n { type: 'uint256', name: 'liquidity' },\n { type: 'address', name: 'to' },\n ],\n },\n {\n name: 'RebalanceSwap',\n type: 'event',\n inputs: [\n { type: 'address', name: 'userToken', indexed: true },\n { type: 'address', name: 'validatorToken', indexed: true },\n { type: 'address', name: 'swapper', indexed: true },\n { type: 'uint256', name: 'amountIn' },\n { type: 'uint256', name: 'amountOut' },\n ],\n },\n { name: 'IdenticalAddresses', type: 'error', inputs: [] },\n { name: 'InvalidToken', type: 'error', inputs: [] },\n { name: 'InsufficientLiquidity', type: 'error', inputs: [] },\n { name: 'InsufficientReserves', type: 'error', inputs: [] },\n { name: 'InvalidAmount', type: 'error', inputs: [] },\n { name: 'DivisionByZero', type: 'error', inputs: [] },\n { name: 'InvalidSwapCalculation', type: 'error', inputs: [] },\n] as const\n\nexport const accountKeychain = [\n {\n name: 'authorizeKey',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'keyId' },\n { type: 'uint8', name: 'signatureType' },\n { type: 'uint64', name: 'expiry' },\n { type: 'bool', name: 'enforceLimits' },\n {\n type: 'tuple[]',\n name: 'limits',\n components: [\n { type: 'address', name: 'token' },\n { type: 'uint256', name: 'amount' },\n ],\n },\n ],\n outputs: [],\n },\n {\n name: 'revokeKey',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'address', name: 'keyId' }],\n outputs: [],\n },\n {\n name: 'updateSpendingLimit',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'keyId' },\n { type: 'address', name: 'token' },\n { type: 'uint256', name: 'newLimit' },\n ],\n outputs: [],\n },\n {\n name: 'getKey',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'address', name: 'account' },\n { type: 'address', name: 'keyId' },\n ],\n outputs: [\n {\n type: 'tuple',\n components: [\n { type: 'uint8', name: 'signatureType' },\n { type: 'address', name: 'keyId' },\n { type: 'uint64', name: 'expiry' },\n { type: 'bool', name: 'enforceLimits' },\n { type: 'bool', name: 'isRevoked' },\n ],\n },\n ],\n },\n {\n name: 'getRemainingLimit',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'address', name: 'account' },\n { type: 'address', name: 'keyId' },\n { type: 'address', name: 'token' },\n ],\n outputs: [{ type: 'uint256' }],\n },\n {\n name: 'getTransactionKey',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'address' }],\n },\n {\n name: 'KeyAuthorized',\n type: 'event',\n inputs: [\n { type: 'address', name: 'account', indexed: true },\n { type: 'address', name: 'publicKey', indexed: true },\n { type: 'uint8', name: 'signatureType' },\n { type: 'uint64', name: 'expiry' },\n ],\n },\n {\n name: 'KeyRevoked',\n type: 'event',\n inputs: [\n { type: 'address', name: 'account', indexed: true },\n { type: 'address', name: 'publicKey', indexed: true },\n ],\n },\n {\n name: 'SpendingLimitUpdated',\n type: 'event',\n inputs: [\n { type: 'address', name: 'account', indexed: true },\n { type: 'address', name: 'publicKey', indexed: true },\n { type: 'address', name: 'token', indexed: true },\n { type: 'uint256', name: 'newLimit' },\n ],\n },\n { name: 'UnauthorizedCaller', type: 'error', inputs: [] },\n { name: 'KeyAlreadyExists', type: 'error', inputs: [] },\n { name: 'KeyNotFound', type: 'error', inputs: [] },\n { name: 'KeyExpired', type: 'error', inputs: [] },\n { name: 'SpendingLimitExceeded', type: 'error', inputs: [] },\n { name: 'InvalidSignatureType', type: 'error', inputs: [] },\n { name: 'ZeroPublicKey', type: 'error', inputs: [] },\n { name: 'ExpiryInPast', type: 'error', inputs: [] },\n { name: 'KeyAlreadyRevoked', type: 'error', inputs: [] },\n] as const\n\nexport const nonce = [\n {\n name: 'getNonce',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'address', name: 'account' },\n { type: 'uint256', name: 'nonceKey' },\n ],\n outputs: [{ type: 'uint64', name: 'nonce' }],\n },\n {\n name: 'NonceIncremented',\n type: 'event',\n inputs: [\n { type: 'address', name: 'account', indexed: true },\n { type: 'uint256', name: 'nonceKey', indexed: true },\n { type: 'uint64', name: 'newNonce' },\n ],\n },\n { name: 'ProtocolNonceNotSupported', type: 'error', inputs: [] },\n { name: 'InvalidNonceKey', type: 'error', inputs: [] },\n { name: 'NonceOverflow', type: 'error', inputs: [] },\n] as const\n\nexport const tip20Factory = [\n {\n name: 'createToken',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'string', name: 'name' },\n { type: 'string', name: 'symbol' },\n { type: 'string', name: 'currency' },\n { type: 'address', name: 'quoteToken' },\n { type: 'address', name: 'admin' },\n { type: 'bytes32', name: 'salt' },\n ],\n outputs: [{ type: 'address' }],\n },\n {\n name: 'isTIP20',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'address', name: 'token' }],\n outputs: [{ type: 'bool' }],\n },\n {\n name: 'getTokenAddress',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'address', name: 'sender' },\n { type: 'bytes32', name: 'salt' },\n ],\n outputs: [{ type: 'address' }],\n },\n {\n name: 'TokenCreated',\n type: 'event',\n inputs: [\n { type: 'address', name: 'token', indexed: true },\n { type: 'string', name: 'name' },\n { type: 'string', name: 'symbol' },\n { type: 'string', name: 'currency' },\n { type: 'address', name: 'quoteToken' },\n { type: 'address', name: 'admin' },\n { type: 'bytes32', name: 'salt' },\n ],\n },\n { name: 'AddressReserved', type: 'error', inputs: [] },\n { name: 'AddressNotReserved', type: 'error', inputs: [] },\n { name: 'InvalidQuoteToken', type: 'error', inputs: [] },\n {\n name: 'TokenAlreadyExists',\n type: 'error',\n inputs: [{ type: 'address', name: 'token' }],\n },\n] as const\n\nexport const tip403Registry = [\n {\n name: 'policyIdCounter',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint64' }],\n },\n {\n name: 'policyExists',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'uint64', name: 'policyId' }],\n outputs: [{ type: 'bool' }],\n },\n {\n name: 'policyData',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'uint64', name: 'policyId' }],\n outputs: [\n { type: 'uint8', name: 'policyType' },\n { type: 'address', name: 'admin' },\n ],\n },\n {\n name: 'isAuthorized',\n type: 'function',\n stateMutability: 'view',\n inputs: [\n { type: 'uint64', name: 'policyId' },\n { type: 'address', name: 'user' },\n ],\n outputs: [{ type: 'bool' }],\n },\n {\n name: 'createPolicy',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'admin' },\n { type: 'uint8', name: 'policyType' },\n ],\n outputs: [{ type: 'uint64' }],\n },\n {\n name: 'createPolicyWithAccounts',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'admin' },\n { type: 'uint8', name: 'policyType' },\n { type: 'address[]', name: 'accounts' },\n ],\n outputs: [{ type: 'uint64' }],\n },\n {\n name: 'setPolicyAdmin',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'uint64', name: 'policyId' },\n { type: 'address', name: 'admin' },\n ],\n outputs: [],\n },\n {\n name: 'modifyPolicyWhitelist',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'uint64', name: 'policyId' },\n { type: 'address', name: 'account' },\n { type: 'bool', name: 'allowed' },\n ],\n outputs: [],\n },\n {\n name: 'modifyPolicyBlacklist',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'uint64', name: 'policyId' },\n { type: 'address', name: 'account' },\n { type: 'bool', name: 'restricted' },\n ],\n outputs: [],\n },\n {\n name: 'PolicyAdminUpdated',\n type: 'event',\n inputs: [\n { type: 'uint64', name: 'policyId', indexed: true },\n { type: 'address', name: 'updater', indexed: true },\n { type: 'address', name: 'admin', indexed: true },\n ],\n },\n {\n name: 'PolicyCreated',\n type: 'event',\n inputs: [\n { type: 'uint64', name: 'policyId', indexed: true },\n { type: 'address', name: 'updater', indexed: true },\n { type: 'uint8', name: 'policyType' },\n ],\n },\n {\n name: 'WhitelistUpdated',\n type: 'event',\n inputs: [\n { type: 'uint64', name: 'policyId', indexed: true },\n { type: 'address', name: 'updater', indexed: true },\n { type: 'address', name: 'account', indexed: true },\n { type: 'bool', name: 'allowed' },\n ],\n },\n {\n name: 'BlacklistUpdated',\n type: 'event',\n inputs: [\n { type: 'uint64', name: 'policyId', indexed: true },\n { type: 'address', name: 'updater', indexed: true },\n { type: 'address', name: 'account', indexed: true },\n { type: 'bool', name: 'restricted' },\n ],\n },\n { name: 'Unauthorized', type: 'error', inputs: [] },\n { name: 'IncompatiblePolicyType', type: 'error', inputs: [] },\n { name: 'PolicyNotFound', type: 'error', inputs: [] },\n] as const\n\nexport const validator = [\n {\n name: 'getValidators',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [\n {\n type: 'tuple[]',\n name: 'validators',\n components: [\n { type: 'bytes32', name: 'publicKey' },\n { type: 'bool', name: 'active' },\n { type: 'uint64', name: 'index' },\n { type: 'address', name: 'validatorAddress' },\n { type: 'string', name: 'inboundAddress' },\n { type: 'string', name: 'outboundAddress' },\n ],\n },\n ],\n },\n {\n name: 'addValidator',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'newValidatorAddress' },\n { type: 'bytes32', name: 'publicKey' },\n { type: 'bool', name: 'active' },\n { type: 'string', name: 'inboundAddress' },\n { type: 'string', name: 'outboundAddress' },\n ],\n outputs: [],\n },\n {\n name: 'updateValidator',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'newValidatorAddress' },\n { type: 'bytes32', name: 'publicKey' },\n { type: 'string', name: 'inboundAddress' },\n { type: 'string', name: 'outboundAddress' },\n ],\n outputs: [],\n },\n {\n name: 'changeValidatorStatus',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [\n { type: 'address', name: 'validator' },\n { type: 'bool', name: 'active' },\n ],\n outputs: [],\n },\n {\n name: 'owner',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'address' }],\n },\n {\n name: 'changeOwner',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'address', name: 'newOwner' }],\n outputs: [],\n },\n {\n name: 'getNextFullDkgCeremony',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint64' }],\n },\n {\n name: 'setNextFullDkgCeremony',\n type: 'function',\n stateMutability: 'nonpayable',\n inputs: [{ type: 'uint64', name: 'epoch' }],\n outputs: [],\n },\n {\n name: 'validatorsArray',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'uint256', name: 'index' }],\n outputs: [{ type: 'address' }],\n },\n {\n name: 'validators',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ type: 'address', name: 'validator' }],\n outputs: [\n {\n type: 'tuple',\n components: [\n { type: 'bytes32', name: 'publicKey' },\n { type: 'bool', name: 'active' },\n { type: 'uint64', name: 'index' },\n { type: 'address', name: 'validatorAddress' },\n { type: 'string', name: 'inboundAddress' },\n { type: 'string', name: 'outboundAddress' },\n ],\n },\n ],\n },\n {\n name: 'validatorCount',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ type: 'uint64' }],\n },\n { name: 'Unauthorized', type: 'error', inputs: [] },\n { name: 'ValidatorAlreadyExists', type: 'error', inputs: [] },\n { name: 'ValidatorNotFound', type: 'error', inputs: [] },\n { name: 'InvalidPublicKey', type: 'error', inputs: [] },\n {\n name: 'NotHostPort',\n type: 'error',\n inputs: [\n { type: 'string', name: 'field' },\n { type: 'string', name: 'input' },\n { type: 'string', name: 'backtrace' },\n ],\n },\n {\n name: 'NotIpPort',\n type: 'error',\n inputs: [\n { type: 'string', name: 'field' },\n { type: 'string', name: 'input' },\n { type: 'string', name: 'backtrace' },\n ],\n },\n] as const\n","import * as Address from 'ox/Address'\nimport * as Hex from 'ox/Hex'\nimport * as P256 from 'ox/P256'\nimport * as PublicKey from 'ox/PublicKey'\nimport * as Secp256k1 from 'ox/Secp256k1'\nimport * as Signature from 'ox/Signature'\nimport { KeyAuthorization, SignatureEnvelope } from 'ox/tempo'\nimport * as WebAuthnP256 from 'ox/WebAuthnP256'\nimport * as WebCryptoP256 from 'ox/WebCryptoP256'\nimport type {\n LocalAccount,\n Account as viem_Account,\n} from '../accounts/types.js'\nimport { parseAccount } from '../accounts/utils/parseAccount.js'\nimport type { TransactionSerializable } from '../types/transaction.js'\nimport type { OneOf, RequiredBy } from '../types/utils.js'\nimport { hashAuthorization } from '../utils/authorization/hashAuthorization.js'\nimport { keccak256 } from '../utils/hash/keccak256.js'\nimport { hashMessage } from '../utils/signature/hashMessage.js'\nimport { hashTypedData } from '../utils/signature/hashTypedData.js'\nimport type { SerializeTransactionFn } from '../utils/transaction/serializeTransaction.js'\nimport * as Transaction from './Transaction.js'\n\nexport type Account_base<source extends string = string> = RequiredBy<\n LocalAccount<source>,\n 'sign' | 'signAuthorization' | 'signTransaction'\n> & {\n /** Key type. */\n keyType: SignatureEnvelope.Type\n /** Sign transaction fn. */\n signTransaction: <\n serializer extends\n SerializeTransactionFn<TransactionSerializable> = SerializeTransactionFn<Transaction.TransactionSerializableTempo>,\n transaction extends Parameters<serializer>[0] = Parameters<serializer>[0],\n >(\n transaction: transaction,\n options?:\n | {\n serializer?: serializer | undefined\n }\n | undefined,\n ) => Promise<Hex.Hex>\n}\n\nexport type RootAccount = Account_base<'root'> & {\n /** Sign key authorization. */\n signKeyAuthorization: (\n key: Pick<AccessKeyAccount, 'accessKeyAddress' | 'keyType'>,\n parameters: Pick<\n KeyAuthorization.KeyAuthorization,\n 'chainId' | 'expiry' | 'limits'\n >,\n ) => Promise<KeyAuthorization.Signed>\n}\n\nexport type AccessKeyAccount = Account_base<'accessKey'> & {\n /** Access key ID. */\n accessKeyAddress: Address.Address\n}\n\nexport type Account = OneOf<RootAccount | AccessKeyAccount>\n\n/** Instantiates an Account. */\nexport function from<const parameters extends from.Parameters>(\n parameters: parameters | from.Parameters,\n): from.ReturnValue<parameters> {\n const { access } = parameters\n if (access) return fromAccessKey(parameters) as never\n return fromRoot(parameters) as never\n}\n\nexport declare namespace from {\n export type Parameters = OneOf<fromRoot.Parameters | fromAccessKey.Parameters>\n\n export type ReturnValue<\n parameters extends {\n access?: fromAccessKey.Parameters['access'] | undefined\n } = {\n access?: fromAccessKey.Parameters['access'] | undefined\n },\n > = parameters extends {\n access: fromAccessKey.Parameters['access']\n }\n ? AccessKeyAccount\n : RootAccount\n}\n\n/**\n * Instantiates an Account from a headless WebAuthn credential (P256 private key).\n *\n * @example\n * ```ts\n * import { Account } from 'viem/tempo'\n *\n * const account = Account.fromHeadlessWebAuthn('0x...')\n * ```\n *\n * @param privateKey P256 private key.\n * @returns Account.\n */\nexport function fromHeadlessWebAuthn<\n const options extends fromHeadlessWebAuthn.Options,\n>(\n privateKey: Hex.Hex,\n options: options | fromHeadlessWebAuthn.Options,\n): fromHeadlessWebAuthn.ReturnValue<options> {\n const { access, rpId, origin, internal_version } = options\n\n const publicKey = P256.getPublicKey({ privateKey })\n\n return from({\n access,\n internal_version,\n keyType: 'webAuthn',\n publicKey,\n async sign({ hash }) {\n const { metadata, payload } = WebAuthnP256.getSignPayload({\n ...options,\n challenge: hash,\n rpId,\n origin,\n })\n const signature = P256.sign({\n payload,\n privateKey,\n hash: true,\n })\n return SignatureEnvelope.serialize({\n metadata,\n signature,\n publicKey,\n type: 'webAuthn',\n })\n },\n }) as never\n}\n\nexport declare namespace fromHeadlessWebAuthn {\n export type Options = Omit<\n WebAuthnP256.getSignPayload.Options,\n 'challenge' | 'rpId' | 'origin'\n > &\n Pick<from.Parameters, 'access' | 'internal_version'> & {\n rpId: string\n origin: string\n }\n\n export type ReturnValue<options extends Options = Options> =\n from.ReturnValue<options>\n}\n\n/**\n * Instantiates an Account from a P256 private key.\n *\n * @example\n * ```ts\n * import { Account } from 'viem/tempo'\n *\n * const account = Account.fromP256('0x...')\n * ```\n *\n * @param privateKey P256 private key.\n * @returns Account.\n */\nexport function fromP256<const options extends fromP256.Options>(\n privateKey: Hex.Hex,\n options: options | fromP256.Options = {},\n): fromP256.ReturnValue<options> {\n const { access, internal_version } = options\n const publicKey = P256.getPublicKey({ privateKey })\n\n return from({\n access,\n internal_version,\n keyType: 'p256',\n publicKey,\n async sign({ hash }) {\n const signature = P256.sign({ payload: hash, privateKey })\n return SignatureEnvelope.serialize({\n signature,\n publicKey,\n type: 'p256',\n })\n },\n }) as never\n}\n\nexport declare namespace fromP256 {\n export type Options = Pick<from.Parameters, 'access' | 'internal_version'>\n\n export type ReturnValue<options extends Options = Options> =\n from.ReturnValue<options>\n}\n\n/**\n * Instantiates an Account from a Secp256k1 private key.\n *\n * @example\n * ```ts\n * import { Account } from 'viem/tempo'\n *\n * const account = Account.fromSecp256k1('0x...')\n * ```\n *\n * @param privateKey Secp256k1 private key.\n * @returns Account.\n */\nexport function fromSecp256k1<const options extends fromSecp256k1.Options>(\n privateKey: Hex.Hex,\n options: options | fromSecp256k1.Options = {},\n): fromSecp256k1.ReturnValue<options> {\n const { access, internal_version } = options\n const publicKey = Secp256k1.getPublicKey({ privateKey })\n\n return from({\n access,\n internal_version,\n keyType: 'secp256k1',\n publicKey,\n async sign(parameters) {\n const { hash } = parameters\n const signature = Secp256k1.sign({ payload: hash, privateKey })\n return Signature.toHex(signature)\n },\n }) as never\n}\n\nexport declare namespace fromSecp256k1 {\n export type Options = Pick<from.Parameters, 'access' | 'internal_version'>\n\n export type ReturnValue<options extends Options = Options> =\n from.ReturnValue<options>\n}\n\n/**\n * Instantiates an Account from a WebAuthn credential.\n *\n * @example\n *\n * ### Create Passkey + Instantiate Account\n *\n * Create a credential with `WebAuthnP256.createCredential` and then instantiate\n * a Viem Account with `Account.fromWebAuthnP256`.\n *\n * It is highly recommended to store the credential's public key in an external store\n * for future use (ie. for future calls to `WebAuthnP256.getCredential`).\n *\n * ```ts\n * import { Account, WebAuthnP256 } from 'viem/tempo'\n * import { publicKeyStore } from './store'\n *\n * // 1. Create credential\n * const credential = await WebAuthnP256.createCredential({ name: 'Example' })\n *\n * // 2. Instantiate account\n * const account = Account.fromWebAuthnP256(credential)\n *\n * // 3. Store public key\n * await publicKeyStore.set(credential.id, credential.publicKey)\n *\n * ```\n *\n * @example\n *\n * ### Get Credential + Instantiate Account\n *\n * Gets a credential from `WebAuthnP256.getCredential` and then instantiates\n * an account with `Account.fromWebAuthnP256`.\n *\n * The `getPublicKey` function is required to fetch the public key paired with the credential\n * from an external store. The public key is required to derive the account's address.\n *\n * ```ts\n * import { Account, WebAuthnP256 } from 'viem/tempo'\n * import { publicKeyStore } from './store'\n *\n * // 1. Get credential\n * const credential = await WebAuthnP256.getCredential({\n * async getPublicKey(credential) {\n * // 2. Get public key from external store.\n * return await publicKeyStore.get(credential.id)\n * }\n * })\n *\n * // 3. Instantiate account\n * const account = Account.fromWebAuthnP256(credential)\n * ```\n *\n * @param credential WebAuthnP256 credential.\n * @returns Account.\n */\nexport function fromWebAuthnP256(\n credential: fromWebAuthnP256.Credential,\n options: fromWebAuthnP256.Options = {},\n): fromWebAuthnP256.ReturnValue {\n const { id } = credential\n const publicKey = PublicKey.fromHex(credential.publicKey)\n return from({\n keyType: 'webAuthn',\n publicKey,\n async sign({ hash }) {\n const { metadata, signature } = await WebAuthnP256.sign({\n ...options,\n challenge: hash,\n credentialId: id,\n })\n return SignatureEnvelope.serialize({\n publicKey,\n metadata,\n signature,\n type: 'webAuthn',\n })\n },\n })\n}\n\nexport declare namespace fromWebAuthnP256 {\n export type Credential = {\n id: WebAuthnP256.P256Credential['id']\n publicKey: Hex.Hex\n }\n\n export type Options = {\n getFn?: WebAuthnP256.sign.Options['getFn'] | undefined\n rpId?: WebAuthnP256.sign.Options['rpId'] | undefined\n }\n\n export type ReturnValue = from.ReturnValue\n}\n\n/**\n * Instantiates an Account from a P256 private key.\n *\n * @example\n * ```ts\n * import { Account } from 'viem/tempo'\n * import { WebCryptoP256 } from 'ox'\n *\n * const keyPair = await WebCryptoP256.createKeyPair()\n *\n * const account = Account.fromWebCryptoP256(keyPair)\n * ```\n *\n * @param keyPair WebCryptoP256 key pair.\n * @returns Account.\n */\nexport function fromWebCryptoP256<\n const options extends fromWebCryptoP256.Options,\n>(\n keyPair: Awaited<ReturnType<typeof WebCryptoP256.createKeyPair>>,\n options: options | fromWebCryptoP256.Options = {},\n): fromWebCryptoP256.ReturnValue<options> {\n const { access, internal_version } = options\n const { publicKey, privateKey } = keyPair\n\n return from({\n access,\n internal_version,\n keyType: 'p256',\n publicKey,\n async sign({ hash }) {\n const signature = await WebCryptoP256.sign({ payload: hash, privateKey })\n return SignatureEnvelope.serialize({\n signature,\n prehash: true,\n publicKey,\n type: 'p256',\n })\n },\n }) as never\n}\n\nexport declare namespace fromWebCryptoP256 {\n export type Options = Pick<from.Parameters, 'access' | 'internal_version'>\n\n export type ReturnValue<options extends Options = Options> =\n from.ReturnValue<options>\n}\n\nexport async function signKeyAuthorization(\n account: LocalAccount,\n parameters: signKeyAuthorization.Parameters,\n): Promise<signKeyAuthorization.ReturnValue> {\n const { chainId, key, expiry, limits } = parameters\n const { accessKeyAddress, keyType: type } = key\n\n const signature = await account.sign!({\n hash: KeyAuthorization.getSignPayload({\n address: accessKeyAddress,\n chainId,\n expiry,\n limits,\n type,\n }),\n })\n return KeyAuthorization.from({\n address: accessKeyAddress,\n chainId,\n expiry,\n limits,\n signature: SignatureEnvelope.from(signature),\n type,\n })\n}\n\nexport declare namespace signKeyAuthorization {\n type Parameters = Pick<\n KeyAuthorization.KeyAuthorization,\n 'chainId' | 'expiry' | 'limits'\n > & {\n key: Pick<AccessKeyAccount, 'accessKeyAddress' | 'keyType'>\n }\n\n type ReturnValue = KeyAuthorization.Signed\n}\n\n/** @internal */\n// biome-ignore lint/correctness/noUnusedVariables: _\nfunction fromBase(parameters: fromBase.Parameters): Account_base {\n const {\n keyType = 'secp256k1',\n parentAddress,\n source = 'privateKey',\n internal_version = 'v2',\n } = parameters\n\n const address = parentAddress ?? Address.fromPublicKey(parameters.publicKey)\n const publicKey = PublicKey.toHex(parameters.publicKey, {\n includePrefix: false,\n })\n\n async function sign({ hash }: { hash: Hex.Hex }) {\n const innerHash =\n parentAddress && internal_version === 'v2'\n ? keccak256(Hex.concat('0x04', hash, parentAddress))\n : hash\n const signature = await parameters.sign({ hash: innerHash })\n if (parentAddress)\n return SignatureEnvelope.serialize(\n SignatureEnvelope.from({\n userAddress: parentAddress,\n inner: SignatureEnvelope.from(signature),\n type: 'keychain',\n version: internal_version,\n }),\n )\n // Don't need to append magic bytes to secp256k1 signatures as they are\n // backwards compatible with existing verification logic.\n if (keyType === 'secp256k1') return signature\n return Hex.concat(signature, SignatureEnvelope.magicBytes)\n }\n\n return {\n address: Address.checksum(address),\n keyType,\n sign,\n async signAuthorization(parameters) {\n const { chainId, nonce } = parameters\n const address = parameters.contractAddress ?? parameters.address\n const signature = await sign({\n hash: hashAuthorization({ address, chainId, nonce }),\n })\n const envelope = SignatureEnvelope.from(signature)\n if (envelope.type !== 'secp256k1')\n throw new Error(\n 'Unsupported signature type. Expected `secp256k1` but got `' +\n envelope.type +\n '`.',\n )\n const { r, s, yParity } = envelope.signature\n return {\n address,\n chainId,\n nonce,\n r: Hex.fromNumber(r, { size: 32 }),\n s: Hex.fromNumber(s, { size: 32 }),\n yParity,\n }\n },\n async signMessage(parameters) {\n const { message } = parameters\n return await sign({ hash: hashMessage(message) })\n },\n async signTransaction(transaction, options) {\n const { serializer = Transaction.serialize } = options ?? {}\n const signature = await sign({\n hash: keccak256(await serializer(transaction)),\n })\n const envelope = SignatureEnvelope.from(signature)\n return await serializer(transaction, envelope as never)\n },\n async signTypedData(typedData) {\n return await sign({ hash: hashTypedData(typedData) })\n },\n publicKey,\n source,\n type: 'local',\n }\n}\n\ndeclare namespace fromBase {\n export type Parameters = {\n /** Parent address. */\n parentAddress?: Address.Address | undefined\n /** Public key. */\n publicKey: PublicKey.PublicKey\n /** Key type. */\n keyType?: SignatureEnvelope.Type | undefined\n /** Sign function. */\n sign: NonNullable<LocalAccount['sign']>\n /** Source. */\n source?: string | undefined\n /** Access key version. Will be removed in a future release. @deprecated @internal */\n internal_version?: 'v1' | 'v2' | undefined\n }\n\n export type ReturnValue = Account_base\n}\n\n/** @internal */\n// biome-ignore lint/correctness/noUnusedVariables: _\nfunction fromRoot(parameters: fromRoot.Parameters): RootAccount {\n const account = fromBase(parameters)\n return {\n ...account,\n source: 'root',\n async signKeyAuthorization(key, parameters) {\n const { chainId, expiry, limits } = parameters\n const { accessKeyAddress, keyType: type } = key\n\n const signature = await account.sign({\n hash: KeyAuthorization.getSignPayload({\n address: accessKeyAddress,\n chainId,\n expiry,\n limits,\n type,\n }),\n })\n const keyAuthorization = KeyAuthorization.from({\n address: accessKeyAddress,\n chainId,\n expiry,\n limits,\n signature: SignatureEnvelope.from(signature),\n type,\n })\n return keyAuthorization\n },\n }\n}\n\ndeclare namespace fromRoot {\n export type Parameters = fromBase.Parameters\n\n export type ReturnValue = RootAccount\n}\n\n// biome-ignore lint/correctness/noUnusedVariables: _\nfunction fromAccessKey(parameters: fromAccessKey.Parameters): AccessKeyAccount {\n const { access } = parameters\n const { address: parentAddress } = parseAccount(access)\n const account = fromBase({ ...parameters, parentAddress })\n return {\n ...account,\n accessKeyAddress: Address.fromPublicKey(parameters.publicKey),\n source: 'accessKey',\n }\n}\n\ndeclare namespace fromAccessKey {\n export type Parameters = fromBase.Parameters & {\n /**\n * Parent account to access.\n * If defined, this account will act as an \"access key\", and use\n * the parent account's address as the keychain address.\n */\n access: viem_Account | Address.Address\n }\n\n export type ReturnValue = AccessKeyAccount\n}\n\n// Export types required for inference.\n// biome-ignore lint/performance/noBarrelFile: _\nexport {\n /** @deprecated */\n KeyAuthorization as z_KeyAuthorization,\n /** @deprecated */\n SignatureEnvelope as z_SignatureEnvelope,\n /** @deprecated */\n TxEnvelopeTempo as z_TxEnvelopeTempo,\n} from 'ox/tempo'\n","export const accountImplementation =\n '0x7702c00000000000000000000000000000000000'\nexport const accountKeychain = '0xaAAAaaAA00000000000000000000000000000000'\nexport const accountRegistrar = '0x7702ac0000000000000000000000000000000000'\nexport const feeManager = '0xfeec000000000000000000000000000000000000'\nexport const nonceManager = '0x4e4F4E4345000000000000000000000000000000'\nexport const pathUsd = '0x20c0000000000000000000000000000000000000'\nexport const stablecoinDex = '0xdec0000000000000000000000000000000000000'\nexport const tip20Factory = '0x20fc000000000000000000000000000000000000'\nexport const tip403Registry = '0x403c000000000000000000000000000000000000'\nexport const validator = '0xcccccccc00000000000000000000000000000000'\n","// biome-ignore lint/performance/noBarrelFile: _\nexport * as accessKey from './accessKey.js'\nexport * as amm from './amm.js'\nexport * as dex from './dex.js'\nexport * as faucet from './faucet.js'\nexport * as fee from './fee.js'\nexport * as nonce from './nonce.js'\nexport * as policy from './policy.js'\nexport * as reward from './reward.js'\nexport * as token from './token.js'\nexport * as validator from './validator.js'\n","import type { Address } from 'abitype'\nimport type { Account } from '../../accounts/types.js'\nimport { parseAccount } from '../../accounts/utils/parseAccount.js'\nimport type { ReadContractReturnType } from '../../actions/public/readContract.js'\nimport { readContract } from '../../actions/public/readContract.js'\nimport { sendTransaction } from '../../actions/wallet/sendTransaction.js'\nimport { sendTransactionSync } from '../../actions/wallet/sendTransactionSync.js'\nimport type { WriteContractReturnType } from '../../actions/wallet/writeContract.js'\nimport { writeContract } from '../../actions/wallet/writeContract.js'\nimport { writeContractSync } from '../../actions/wallet/writeContractSync.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseErrorType } from '../../errors/base.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { GetEventArgs } from '../../types/contract.js'\nimport type { Log } from '../../types/log.js'\nimport type { Compute } from '../../types/utils.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport * as Abis from '../Abis.js'\nimport type { AccessKeyAccount } from '../Account.js'\nimport { signKeyAuthorization } from '../Account.js'\nimport * as Addresses from '../Addresses.js'\nimport type {\n GetAccountParameter,\n ReadParameters,\n WriteParameters,\n} from '../internal/types.js'\nimport { defineCall } from '../internal/utils.js'\nimport type { TransactionReceipt } from '../Transaction.js'\n\n/** @internal */\nconst signatureTypes = {\n 0: 'secp256k1',\n 1: 'p256',\n 2: 'webAuthn',\n} as const satisfies Record<number, string>\n\n/** @internal */\nconst spendPolicies = {\n true: 'limited',\n false: 'unlimited',\n} as const\n\n/**\n * Authorizes an access key by signing a key authorization and sending a transaction.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions, Account } from 'viem/tempo'\n * import { generatePrivateKey } from 'viem/accounts'\n *\n * const account = Account.from({ privateKey: '0x...' })\n * const client = createClient({\n * account,\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const accessKey = Account.fromP256(generatePrivateKey(), {\n * access: account,\n * })\n *\n * const hash = await Actions.accessKey.authorize(client, {\n * accessKey,\n * expiry: Math.floor((Date.now() + 30_000) / 1000),\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function authorize<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: authorize.Parameters<chain, account>,\n): Promise<authorize.ReturnValue> {\n return authorize.inner(sendTransaction, client, parameters)\n}\n\nexport namespace authorize {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** The access key to authorize. */\n accessKey: Pick<AccessKeyAccount, 'accessKeyAddress' | 'keyType'>\n /** The chain ID. */\n chainId?: number | undefined\n /** Unix timestamp when the key expires. */\n expiry?: number | undefined\n /** Spending limits per token. */\n limits?: { token: Address; limit: bigint }[] | undefined\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof sendTransaction | typeof sendTransactionSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: authorize.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const {\n accessKey,\n chainId = client.chain?.id,\n expiry,\n limits,\n ...rest\n } = parameters\n const account_ = rest.account ?? client.account\n if (!account_) throw new Error('account is required.')\n if (!chainId) throw new Error('chainId is required.')\n const parsed = parseAccount(account_)\n const keyAuthorization = await signKeyAuthorization(parsed as never, {\n chainId: BigInt(chainId),\n key: accessKey,\n expiry,\n limits,\n })\n return (await action(client, {\n ...rest,\n keyAuthorization,\n } as never)) as never\n }\n\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.accountKeychain,\n logs,\n eventName: 'KeyAuthorized',\n strict: true,\n })\n if (!log) throw new Error('`KeyAuthorized` event not found.')\n return log\n }\n}\n\n/**\n * Authorizes an access key and waits for the transaction receipt.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions, Account } from 'viem/tempo'\n * import { generatePrivateKey } from 'viem/accounts'\n *\n * const account = Account.from({ privateKey: '0x...' })\n * const client = createClient({\n * account,\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const accessKey = Account.fromP256(generatePrivateKey(), {\n * access: account,\n * })\n *\n * const { receipt, ...result } = await Actions.accessKey.authorizeSync(client, {\n * accessKey,\n * expiry: Math.floor((Date.now() + 30_000) / 1000),\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function authorizeSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: authorizeSync.Parameters<chain, account>,\n): Promise<authorizeSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await authorize.inner(sendTransactionSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = authorize.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace authorizeSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = authorize.Parameters<chain, account>\n\n export type Args = authorize.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.accountKeychain,\n 'KeyAuthorized',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Revokes an authorized access key.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const hash = await Actions.accessKey.revoke(client, {\n * accessKey: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function revoke<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: revoke.Parameters<chain, account>,\n): Promise<revoke.ReturnValue> {\n return revoke.inner(writeContract, client, parameters)\n}\n\nexport namespace revoke {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** The access key to revoke. */\n accessKey: Address | AccessKeyAccount\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: revoke.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { accessKey, ...rest } = parameters\n const call = revoke.call({ accessKey })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `revokeKey` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * }).extend(walletActions)\n *\n * const hash = await client.sendTransaction({\n * calls: [\n * Actions.accessKey.revoke.call({ accessKey: '0x...' }),\n * ],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { accessKey } = args\n return defineCall({\n address: Addresses.accountKeychain,\n abi: Abis.accountKeychain,\n functionName: 'revokeKey',\n args: [resolveAccessKey(accessKey)],\n })\n }\n\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.accountKeychain,\n logs,\n eventName: 'KeyRevoked',\n strict: true,\n })\n if (!log) throw new Error('`KeyRevoked` event not found.')\n return log\n }\n}\n\n/**\n * Revokes an authorized access key and waits for the transaction receipt.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const result = await Actions.accessKey.revokeSync(client, {\n * accessKey: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function revokeSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: revokeSync.Parameters<chain, account>,\n): Promise<revokeSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await revoke.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = revoke.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace revokeSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = revoke.Parameters<chain, account>\n\n export type Args = revoke.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.accountKeychain,\n 'KeyRevoked',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Updates the spending limit for a specific token on an authorized access key.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const hash = await Actions.accessKey.updateLimit(client, {\n * accessKey: '0x...',\n * token: '0x...',\n * limit: 1000000000000000000n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function updateLimit<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: updateLimit.Parameters<chain, account>,\n): Promise<updateLimit.ReturnValue> {\n return updateLimit.inner(writeContract, client, parameters)\n}\n\nexport namespace updateLimit {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** The access key to update. */\n accessKey: Address | AccessKeyAccount\n /** The token address. */\n token: Address\n /** The new spending limit. */\n limit: bigint\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: updateLimit.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { accessKey, token, limit, ...rest } = parameters\n const call = updateLimit.call({ accessKey, token, limit })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `updateSpendingLimit` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * }).extend(walletActions)\n *\n * const hash = await client.sendTransaction({\n * calls: [\n * Actions.accessKey.updateLimit.call({\n * accessKey: '0x...',\n * token: '0x...',\n * limit: 1000000000000000000n,\n * }),\n * ],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { accessKey, token, limit } = args\n return defineCall({\n address: Addresses.accountKeychain,\n abi: Abis.accountKeychain,\n functionName: 'updateSpendingLimit',\n args: [resolveAccessKey(accessKey), token, limit],\n })\n }\n\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.accountKeychain,\n logs,\n eventName: 'SpendingLimitUpdated',\n strict: true,\n })\n if (!log) throw new Error('`SpendingLimitUpdated` event not found.')\n return log\n }\n}\n\n/**\n * Updates the spending limit and waits for the transaction receipt.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const result = await Actions.accessKey.updateLimitSync(client, {\n * accessKey: '0x...',\n * token: '0x...',\n * limit: 1000000000000000000n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function updateLimitSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: updateLimitSync.Parameters<chain, account>,\n): Promise<updateLimitSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await updateLimit.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = updateLimit.extractEvent(receipt.logs)\n return {\n account: args.account,\n publicKey: args.publicKey,\n token: args.token,\n limit: args.newLimit,\n receipt,\n }\n}\n\nexport namespace updateLimitSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = updateLimit.Parameters<chain, account>\n\n export type Args = updateLimit.Args\n\n export type ReturnValue = {\n /** The account that owns the key. */\n account: Address\n /** The access key address. */\n publicKey: Address\n /** The token address. */\n token: Address\n /** The new spending limit. */\n limit: bigint\n /** The transaction receipt. */\n receipt: TransactionReceipt\n }\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Gets access key information.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const key = await Actions.accessKey.getMetadata(client, {\n * account: '0x...',\n * accessKey: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The key information.\n */\nexport async function getMetadata<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: getMetadata.Parameters<account>,\n): Promise<getMetadata.ReturnValue> {\n const { account: account_ = client.account, accessKey, ...rest } = parameters\n if (!account_) throw new Error('account is required.')\n const account = parseAccount(account_)\n const result = await readContract(client, {\n ...rest,\n ...getMetadata.call({ account: account.address, accessKey }),\n })\n return {\n address: result.keyId,\n keyType:\n signatureTypes[result.signatureType as keyof typeof signatureTypes] ??\n 'secp256k1',\n expiry: result.expiry,\n spendPolicy: spendPolicies[`${result.enforceLimits}`],\n isRevoked: result.isRevoked,\n }\n}\n\nexport namespace getMetadata {\n export type Parameters<\n account extends Account | undefined = Account | undefined,\n > = ReadParameters & GetAccountParameter<account> & Pick<Args, 'accessKey'>\n\n export type Args = {\n /** Account address. */\n account: Address\n /** The access key. */\n accessKey: Address | AccessKeyAccount\n }\n\n export type ReturnValue = {\n /** The access key address. */\n address: Address\n /** The key type. */\n keyType: 'secp256k1' | 'p256' | 'webAuthn'\n /** The expiry timestamp. */\n expiry: bigint\n /** The spending policy. */\n spendPolicy: 'limited' | 'unlimited'\n /** Whether the key is revoked. */\n isRevoked: boolean\n }\n\n /**\n * Defines a call to the `getKey` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { account, accessKey } = args\n return defineCall({\n address: Addresses.accountKeychain,\n abi: Abis.accountKeychain,\n functionName: 'getKey',\n args: [account, resolveAccessKey(accessKey)],\n })\n }\n}\n\n/**\n * Gets the remaining spending limit for a key-token pair.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const remaining = await Actions.accessKey.getRemainingLimit(client, {\n * account: '0x...',\n * accessKey: '0x...',\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The remaining spending amount.\n */\nexport async function getRemainingLimit<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: getRemainingLimit.Parameters<account>,\n): Promise<getRemainingLimit.ReturnValue> {\n const {\n account: account_ = client.account,\n accessKey,\n token,\n ...rest\n } = parameters\n if (!account_) throw new Error('account is required.')\n const account = parseAccount(account_)\n return readContract(client, {\n ...rest,\n ...getRemainingLimit.call({ account: account.address, accessKey, token }),\n })\n}\n\nexport namespace getRemainingLimit {\n export type Parameters<\n account extends Account | undefined = Account | undefined,\n > = ReadParameters &\n GetAccountParameter<account> &\n Pick<Args, 'accessKey' | 'token'>\n\n export type Args = {\n /** Account address. */\n account: Address\n /** The access key. */\n accessKey: Address | AccessKeyAccount\n /** The token address. */\n token: Address\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.accountKeychain,\n 'getRemainingLimit',\n never\n >\n\n /**\n * Defines a call to the `getRemainingLimit` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { account, accessKey, token } = args\n return defineCall({\n address: Addresses.accountKeychain,\n abi: Abis.accountKeychain,\n functionName: 'getRemainingLimit',\n args: [account, resolveAccessKey(accessKey), token],\n })\n }\n}\n\n/**\n * Signs a key authorization for an access key.\n *\n * @example\n * ```ts\n * import { generatePrivateKey } from 'viem/accounts'\n * import { Account, Actions } from 'viem/tempo'\n *\n * const account = Account.from({ privateKey: '0x...' })\n * const accessKey = Account.fromP256(generatePrivateKey(), {\n * access: account,\n * })\n *\n * const keyAuthorization = await Actions.accessKey.signAuthorization(\n * client,\n * {\n * account,\n * accessKey,\n * expiry: Math.floor((Date.now() + 30_000) / 1000),\n * },\n * )\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The signed key authorization.\n */\nexport async function signAuthorization<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: signAuthorization.Parameters<account>,\n): Promise<signAuthorization.ReturnValue> {\n const { accessKey, chainId = client.chain?.id, ...rest } = parameters\n const account_ = rest.account ?? client.account\n if (!account_) throw new Error('account is required.')\n if (!chainId) throw new Error('chainId is required.')\n const parsed = parseAccount(account_)\n return signKeyAuthorization(parsed as never, {\n chainId: BigInt(chainId),\n key: accessKey,\n ...rest,\n })\n}\n\nexport namespace signAuthorization {\n export type Parameters<\n account extends Account | undefined = Account | undefined,\n > = GetAccountParameter<account> & {\n /** The access key to authorize. */\n accessKey: Pick<AccessKeyAccount, 'accessKeyAddress' | 'keyType'>\n /** The chain ID. */\n chainId?: number | undefined\n /** Unix timestamp when the key expires. */\n expiry?: number | undefined\n /** Spending limits per token. */\n limits?: { token: Address; limit: bigint }[] | undefined\n }\n\n export type ReturnValue = Awaited<ReturnType<typeof signKeyAuthorization>>\n}\n\n/** @internal */\nfunction resolveAccessKey(accessKey: Address | AccessKeyAccount): Address {\n if (typeof accessKey === 'string') return accessKey\n return accessKey.accessKeyAddress\n}\n","import type { Abi, AbiStateMutability, Address } from 'abitype'\nimport type {\n ContractFunctionName,\n ContractFunctionParameters,\n ExtractAbiItem,\n} from '../../types/contract.js'\nimport type { Hex } from '../../types/misc.js'\nimport { encodeFunctionData } from '../../utils/index.js'\n\nexport function defineCall<\n const abi extends Abi,\n const functionName extends ContractFunctionName<abi, AbiStateMutability>,\n call extends ContractFunctionParameters<\n abi,\n AbiStateMutability,\n functionName\n >,\n>(\n call:\n | call\n | ContractFunctionParameters<abi, AbiStateMutability, functionName>,\n): ContractFunctionParameters<\n [ExtractAbiItem<abi, functionName>],\n AbiStateMutability,\n functionName\n> & {\n data: Hex\n to: Address\n} {\n return {\n ...(call as any),\n data: encodeFunctionData(call as never),\n to: call.address,\n } as const\n}\n\n/**\n * Normalizes a value into a structured-clone compatible format.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Window/structuredClone\n * @internal\n */\nexport function normalizeValue<type>(value: type): type {\n if (Array.isArray(value)) return value.map(normalizeValue) as never\n if (typeof value === 'function') return undefined as never\n if (typeof value !== 'object' || value === null) return value\n if (Object.getPrototypeOf(value) !== Object.prototype)\n try {\n return structuredClone(value)\n } catch {\n return undefined as never\n }\n\n const normalized: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(value)) normalized[k] = normalizeValue(v)\n return normalized as never\n}\n","import type { Address } from 'abitype'\nimport { PoolId, TokenId } from 'ox/tempo'\nimport type { Account } from '../../accounts/types.js'\nimport type { MulticallParameters } from '../../actions/public/multicall.js'\nimport { multicall } from '../../actions/public/multicall.js'\nimport type { ReadContractReturnType } from '../../actions/public/readContract.js'\nimport { readContract } from '../../actions/public/readContract.js'\nimport type { WatchContractEventParameters } from '../../actions/public/watchContractEvent.js'\nimport { watchContractEvent } from '../../actions/public/watchContractEvent.js'\nimport type { WriteContractReturnType } from '../../actions/wallet/writeContract.js'\nimport { writeContract } from '../../actions/wallet/writeContract.js'\nimport { writeContractSync } from '../../actions/wallet/writeContractSync.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ExtractAbiItem, GetEventArgs } from '../../types/contract.js'\nimport type { Log, Log as viem_Log } from '../../types/log.js'\nimport type { Hex } from '../../types/misc.js'\nimport type { TransactionReceipt } from '../../types/transaction.js'\nimport type { Compute, OneOf, UnionOmit } from '../../types/utils.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport * as Abis from '../Abis.js'\nimport * as Addresses from '../Addresses.js'\nimport type { ReadParameters, WriteParameters } from '../internal/types.js'\nimport { defineCall } from '../internal/utils.js'\n\n/**\n * Gets the reserves for a liquidity pool.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const pool = await Actions.amm.getPool(client, {\n * userToken: '0x...',\n * validatorToken: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The pool reserves.\n */\nexport async function getPool<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getPool.Parameters,\n): Promise<getPool.ReturnValue> {\n const { userToken, validatorToken, ...rest } = parameters\n const [pool, totalSupply] = await multicall(client, {\n ...rest,\n contracts: getPool.calls({ userToken, validatorToken }),\n allowFailure: false,\n deployless: true,\n })\n return {\n reserveUserToken: pool.reserveUserToken,\n reserveValidatorToken: pool.reserveValidatorToken,\n totalSupply,\n }\n}\n\nexport namespace getPool {\n export type Parameters = UnionOmit<\n MulticallParameters,\n 'allowFailure' | 'contracts' | 'deployless'\n > &\n Args\n\n export type Args = {\n /** Address or ID of the user token. */\n userToken: TokenId.TokenIdOrAddress\n /** Address or ID of the validator token. */\n validatorToken: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = Compute<{\n /** Reserve of user token. */\n reserveUserToken: bigint\n /** Reserve of validator token. */\n reserveValidatorToken: bigint\n /** Total supply of LP tokens. */\n totalSupply: bigint\n }>\n\n /**\n * Defines calls to the `getPool` and `totalSupply` functions.\n *\n * @param args - Arguments.\n * @returns The calls.\n */\n export function calls(args: Args) {\n const { userToken, validatorToken } = args\n return [\n defineCall({\n address: Addresses.feeManager,\n abi: Abis.feeAmm,\n args: [TokenId.toAddress(userToken), TokenId.toAddress(validatorToken)],\n functionName: 'getPool',\n }),\n defineCall({\n address: Addresses.feeManager,\n abi: Abis.feeAmm,\n args: [PoolId.from({ userToken, validatorToken })],\n functionName: 'totalSupply',\n }),\n ] as const\n }\n}\n\n/**\n * Gets the LP token balance for an account in a specific pool.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const poolId = await Actions.amm.getPoolId(client, {\n * userToken: '0x...',\n * validatorToken: '0x...',\n * })\n *\n * const balance = await Actions.amm.getLiquidityBalance(client, {\n * poolId,\n * address: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The LP token balance.\n */\nexport async function getLiquidityBalance<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getLiquidityBalance.Parameters,\n): Promise<getLiquidityBalance.ReturnValue> {\n const { address, poolId, userToken, validatorToken, ...rest } = parameters\n return readContract(client, {\n ...rest,\n ...getLiquidityBalance.call({\n address,\n poolId,\n userToken,\n validatorToken,\n } as never),\n })\n}\n\nexport namespace getLiquidityBalance {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Address to check balance for. */\n address: Address\n } & OneOf<\n | {\n /** Pool ID. */\n poolId: Hex\n }\n | {\n /** User token. */\n userToken: TokenId.TokenIdOrAddress\n /** Validator token. */\n validatorToken: TokenId.TokenIdOrAddress\n }\n >\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.feeAmm,\n 'liquidityBalances',\n never\n >\n\n /**\n * Defines a call to the `liquidityBalances` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { address } = args\n const poolId = (() => {\n if ('poolId' in args && args.poolId) return args.poolId!\n if ('userToken' in args && 'validatorToken' in args)\n return PoolId.from({\n userToken: args.userToken,\n validatorToken: args.validatorToken,\n })\n throw new Error(\n '`poolId`, or `userToken` and `validatorToken` must be provided.',\n )\n })()\n return defineCall({\n address: Addresses.feeManager,\n abi: Abis.feeAmm,\n args: [poolId, address],\n functionName: 'liquidityBalances',\n })\n }\n}\n\n/**\n * Performs a rebalance swap from validator token to user token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.amm.rebalanceSwap(client, {\n * userToken: '0x...',\n * validatorToken: '0x...',\n * amountOut: 100n,\n * to: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function rebalanceSwap<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: rebalanceSwap.Parameters<chain, account>,\n): Promise<rebalanceSwap.ReturnValue> {\n return rebalanceSwap.inner(writeContract, client, parameters)\n}\n\nexport namespace rebalanceSwap {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Amount of user token to receive. */\n amountOut: bigint\n /** Address to send the user token to. */\n to: Address\n /** Address or ID of the user token. */\n userToken: TokenId.TokenIdOrAddress\n /** Address or ID of the validator token. */\n validatorToken: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: rebalanceSwap.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { userToken, validatorToken, amountOut, to, ...rest } = parameters\n const call = rebalanceSwap.call({\n userToken,\n validatorToken,\n amountOut,\n to,\n })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `rebalanceSwap` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.amm.rebalanceSwap.call({\n * userToken: '0x20c0...beef',\n * validatorToken: '0x20c0...babe',\n * amountOut: 100n,\n * to: '0xfeed...fede',\n * }),\n * actions.amm.rebalanceSwap.call({\n * userToken: '0x20c0...babe',\n * validatorToken: '0x20c0...babe',\n * amountOut: 100n,\n * to: '0xfeed...fede',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { userToken, validatorToken, amountOut, to } = args\n return defineCall({\n address: Addresses.feeManager,\n abi: Abis.feeAmm,\n functionName: 'rebalanceSwap',\n args: [\n TokenId.toAddress(userToken),\n TokenId.toAddress(validatorToken),\n amountOut,\n to,\n ],\n })\n }\n\n /**\n * Extracts the `RebalanceSwap` event from logs.\n *\n * @param logs - The logs.\n * @returns The `RebalanceSwap` event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.feeAmm,\n logs,\n eventName: 'RebalanceSwap',\n strict: true,\n })\n if (!log) throw new Error('`RebalanceSwap` event not found.')\n return log\n }\n}\n\n/**\n * Performs a rebalance swap from validator token to user token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.amm.rebalanceSwapSync(client, {\n * userToken: '0x...',\n * validatorToken: '0x...',\n * amountOut: 100n,\n * to: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function rebalanceSwapSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: rebalanceSwapSync.Parameters<chain, account>,\n): Promise<rebalanceSwapSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await rebalanceSwap.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = rebalanceSwap.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace rebalanceSwapSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = rebalanceSwap.Parameters<chain, account>\n\n export type Args = rebalanceSwap.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.feeAmm,\n 'RebalanceSwap',\n { IndexedOnly: false; Required: true }\n > & {\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }\n >\n}\n\n/**\n * Adds liquidity to a pool.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.amm.mint(client, {\n * userTokenAddress: '0x20c0...beef',\n * validatorTokenAddress: '0x20c0...babe',\n * validatorTokenAmount: 100n,\n * to: '0xfeed...fede',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function mint<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: mint.Parameters<chain, account>,\n): Promise<mint.ReturnValue> {\n return mint.inner(writeContract, client, parameters)\n}\n\nexport namespace mint {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Address to mint LP tokens to. */\n to: Address\n /** User token address. */\n userTokenAddress: TokenId.TokenIdOrAddress\n /** Validator token address. */\n validatorTokenAddress: TokenId.TokenIdOrAddress\n /** Amount of validator token to add. */\n validatorTokenAmount: bigint\n }\n\n export type ReturnValue = WriteContractReturnType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: mint.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const {\n to,\n userTokenAddress,\n validatorTokenAddress,\n validatorTokenAmount,\n ...rest\n } = parameters\n const call = mint.call({\n to,\n userTokenAddress,\n validatorTokenAddress,\n validatorTokenAmount,\n })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `mint` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.amm.mint.call({\n * userTokenAddress: '0x20c0...beef',\n * validatorTokenAddress: '0x20c0...babe',\n * validatorTokenAmount: 100n,\n * to: '0xfeed...fede',\n * }),\n * actions.amm.mint.call({\n * userTokenAddress: '0x20c0...babe',\n * validatorTokenAddress: '0x20c0...babe',\n * validatorTokenAmount: 100n,\n * to: '0xfeed...fede',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const {\n to,\n userTokenAddress,\n validatorTokenAddress,\n validatorTokenAmount,\n } = args\n return defineCall({\n address: Addresses.feeManager,\n abi: Abis.feeAmm,\n functionName: 'mint',\n args: [\n TokenId.toAddress(userTokenAddress),\n TokenId.toAddress(validatorTokenAddress),\n validatorTokenAmount,\n to,\n ],\n })\n }\n\n /**\n * Extracts the `Mint` event from logs.\n *\n * @param logs - The logs.\n * @returns The `Mint` event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.feeAmm,\n logs,\n eventName: 'Mint',\n strict: true,\n })\n if (!log) throw new Error('`Mint` event not found.')\n return log\n }\n}\n\n/**\n * Adds liquidity to a pool.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.amm.mint(client, {\n * userTokenAddress: '0x20c0...beef',\n * validatorTokenAddress: '0x20c0...babe',\n * validatorTokenAmount: 100n,\n * to: '0xfeed...fede',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function mintSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: mintSync.Parameters<chain, account>,\n): Promise<mintSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await mint.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = mint.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace mintSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = mint.Parameters<chain, account>\n\n export type Args = mint.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.feeAmm,\n 'Mint',\n { IndexedOnly: false; Required: true }\n > & {\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }\n >\n}\n\n/**\n * Removes liquidity from a pool.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.amm.burn(client, {\n * userToken: '0x20c0...beef',\n * validatorToken: '0x20c0...babe',\n * liquidity: 50n,\n * to: '0xfeed...fede',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function burn<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: burn.Parameters<chain, account>,\n): Promise<burn.ReturnValue> {\n return burn.inner(writeContract, client, parameters)\n}\n\nexport namespace burn {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Amount of LP tokens to burn. */\n liquidity: bigint\n /** Address to send tokens to. */\n to: Address\n /** Address or ID of the user token. */\n userToken: TokenId.TokenIdOrAddress\n /** Address or ID of the validator token. */\n validatorToken: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: burn.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { liquidity, to, userToken, validatorToken, ...rest } = parameters\n const call = burn.call({ liquidity, to, userToken, validatorToken })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `burn` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.amm.burn.call({\n * liquidity: 100n,\n * to: '0xfeed...fede',\n * userToken: '0x20c0...beef',\n * validatorToken: '0x20c0...babe',\n * }),\n * actions.amm.burn.call({\n * liquidity: 100n,\n * to: '0xfeed...fede',\n * userToken: '0x20c0...babe',\n * validatorToken: '0x20c0...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { liquidity, to, userToken, validatorToken } = args\n return defineCall({\n address: Addresses.feeManager,\n abi: Abis.feeAmm,\n functionName: 'burn',\n args: [\n TokenId.toAddress(userToken),\n TokenId.toAddress(validatorToken),\n liquidity,\n to,\n ],\n })\n }\n\n /**\n * Extracts the `Burn` event from logs.\n *\n * @param logs - The logs.\n * @returns The `Burn` event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.feeAmm,\n logs,\n eventName: 'Burn',\n strict: true,\n })\n if (!log) throw new Error('`Burn` event not found.')\n return log\n }\n}\n\n/**\n * Removes liquidity from a pool.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.amm.burnSync(client, {\n * userToken: '0x20c0...beef',\n * validatorToken: '0x20c0...babe',\n * liquidity: 50n,\n * to: '0xfeed...fede',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function burnSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: burnSync.Parameters<chain, account>,\n): Promise<burnSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await burn.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = burn.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace burnSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = burn.Parameters<chain, account>\n\n export type Args = burn.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.feeAmm,\n 'Burn',\n { IndexedOnly: false; Required: true }\n > & {\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }\n >\n}\n\n/**\n * Watches for rebalance swap events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.amm.watchRebalanceSwap(client, {\n * onRebalanceSwap: (args, log) => {\n * console.log('Rebalance swap:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchRebalanceSwap<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchRebalanceSwap.Parameters,\n) {\n const { onRebalanceSwap, userToken, validatorToken, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.feeManager,\n abi: Abis.feeAmm,\n eventName: 'RebalanceSwap',\n args:\n userToken !== undefined && validatorToken !== undefined\n ? {\n userToken: TokenId.toAddress(userToken),\n validatorToken: TokenId.toAddress(validatorToken),\n }\n : undefined,\n onLogs: (logs) => {\n for (const log of logs) onRebalanceSwap(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchRebalanceSwap {\n export type Args = GetEventArgs<\n typeof Abis.feeAmm,\n 'RebalanceSwap',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.feeAmm, 'RebalanceSwap'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.feeAmm, 'RebalanceSwap', true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a rebalance swap occurs. */\n onRebalanceSwap: (args: Args, log: Log) => void\n /** Address or ID of the user token to filter events. */\n userToken?: TokenId.TokenIdOrAddress | undefined\n /** Address or ID of the validator token to filter events. */\n validatorToken?: TokenId.TokenIdOrAddress | undefined\n }\n}\n\n/**\n * Watches for liquidity mint events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.amm.watchMint(client, {\n * onMint: (args, log) => {\n * console.log('Liquidity added:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchMint<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(client: Client<Transport, chain, account>, parameters: watchMint.Parameters) {\n const { onMint, to, userToken, validatorToken, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.feeManager,\n abi: Abis.feeAmm,\n eventName: 'Mint',\n args: {\n to,\n ...(userToken !== undefined && {\n userToken: TokenId.toAddress(userToken),\n }),\n ...(validatorToken !== undefined && {\n validatorToken: TokenId.toAddress(validatorToken),\n }),\n },\n onLogs: (logs) => {\n for (const log of logs) onMint(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchMint {\n export type Args = GetEventArgs<\n typeof Abis.feeAmm,\n 'Mint',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.feeAmm, 'Mint'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.feeAmm, 'Mint', true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when liquidity is added. */\n onMint: (args: Args, log: Log) => void\n /** Address of the sender to filter events. */\n sender?: Address | undefined\n /** Address of the recipient to filter events. */\n to?: Address | undefined\n /** Address or ID of the user token to filter events. */\n userToken?: TokenId.TokenIdOrAddress | undefined\n /** Address or ID of the validator token to filter events. */\n validatorToken?: TokenId.TokenIdOrAddress | undefined\n }\n}\n\n/**\n * Watches for liquidity burn events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.amm.watchBurn(client, {\n * onBurn: (args, log) => {\n * console.log('Liquidity removed:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchBurn<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(client: Client<Transport, chain, account>, parameters: watchBurn.Parameters) {\n const { onBurn, userToken, validatorToken, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.feeManager,\n abi: Abis.feeAmm,\n eventName: 'Burn',\n args:\n userToken !== undefined && validatorToken !== undefined\n ? {\n userToken: TokenId.toAddress(userToken),\n validatorToken: TokenId.toAddress(validatorToken),\n }\n : undefined,\n onLogs: (logs) => {\n for (const log of logs) onBurn(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchBurn {\n export type Args = GetEventArgs<\n typeof Abis.feeAmm,\n 'Burn',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.feeAmm, 'Burn'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.feeAmm, 'Burn', true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when liquidity is removed. */\n onBurn: (args: Args, log: Log) => void\n /** Address or ID of the user token to filter events. */\n userToken?: TokenId.TokenIdOrAddress | undefined\n /** Address or ID of the validator token to filter events. */\n validatorToken?: TokenId.TokenIdOrAddress | undefined\n }\n}\n","import type { Address } from 'abitype'\nimport * as Hash from 'ox/Hash'\nimport * as Hex from 'ox/Hex'\nimport { parseAccount } from '../../accounts/utils/parseAccount.js'\nimport {\n type ReadContractReturnType,\n readContract,\n} from '../../actions/public/readContract.js'\nimport {\n type WatchContractEventParameters,\n watchContractEvent,\n} from '../../actions/public/watchContractEvent.js'\nimport {\n type WriteContractReturnType,\n writeContract,\n} from '../../actions/wallet/writeContract.js'\nimport { writeContractSync } from '../../actions/wallet/writeContractSync.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseErrorType } from '../../errors/base.js'\nimport type { Account } from '../../types/account.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ExtractAbiItem, GetEventArgs } from '../../types/contract.js'\nimport type { Log as viem_Log } from '../../types/log.js'\nimport type { Compute, UnionOmit } from '../../types/utils.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport * as Abis from '../Abis.js'\nimport * as Addresses from '../Addresses.js'\nimport type {\n GetAccountParameter,\n ReadParameters,\n WriteParameters,\n} from '../internal/types.js'\nimport { defineCall } from '../internal/utils.js'\nimport type { TransactionReceipt } from '../Transaction.js'\n\n/**\n * Order type for limit orders.\n */\ntype OrderType = 'buy' | 'sell'\n\n/**\n * Buys a specific amount of tokens.\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.dex.buy(client, {\n * tokenIn: '0x20c...11',\n * tokenOut: '0x20c...20',\n * amountOut: parseUnits('100', 6),\n * maxAmountIn: parseUnits('105', 6),\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function buy<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: buy.Parameters<chain, account>,\n): Promise<buy.ReturnValue> {\n return buy.inner(writeContract, client, parameters)\n}\n\nexport namespace buy {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Amount of tokenOut to buy. */\n amountOut: bigint\n /** Maximum amount of tokenIn to spend. */\n maxAmountIn: bigint\n /** Address of the token to spend. */\n tokenIn: Address\n /** Address of the token to buy. */\n tokenOut: Address\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: buy.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { tokenIn, tokenOut, amountOut, maxAmountIn, ...rest } = parameters\n const call = buy.call({ tokenIn, tokenOut, amountOut, maxAmountIn })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `swapExactAmountOut` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.dex.buy.call({\n * tokenIn: '0x20c0...beef',\n * tokenOut: '0x20c0...babe',\n * amountOut: parseUnits('100', 6),\n * maxAmountIn: parseUnits('105', 6),\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { tokenIn, tokenOut, amountOut, maxAmountIn } = args\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n functionName: 'swapExactAmountOut',\n args: [tokenIn, tokenOut, amountOut, maxAmountIn],\n })\n }\n}\n\n/**\n * Buys a specific amount of tokens.\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.dex.buySync(client, {\n * tokenIn: '0x20c...11',\n * tokenOut: '0x20c...20',\n * amountOut: parseUnits('100', 6),\n * maxAmountIn: parseUnits('105', 6),\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt.\n */\nexport async function buySync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: buySync.Parameters<chain, account>,\n): Promise<buySync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await buy.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n return { receipt }\n}\n\nexport namespace buySync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = buy.Parameters<chain, account>\n\n export type Args = buy.Args\n\n export type ReturnValue = Compute<{\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }>\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Cancels an order from the orderbook.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.dex.cancel(client, {\n * orderId: 123n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function cancel<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: cancel.Parameters<chain, account>,\n): Promise<cancel.ReturnValue> {\n return cancel.inner(writeContract, client, parameters)\n}\n\nexport namespace cancel {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Order ID to cancel. */\n orderId: bigint\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: cancel.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { orderId, ...rest } = parameters\n const call = cancel.call({ orderId })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `cancel` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.dex.cancel.call({\n * orderId: 123n,\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { orderId } = args\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n functionName: 'cancel',\n args: [orderId],\n })\n }\n\n /**\n * Extracts the `OrderCancelled` event from logs.\n *\n * @param logs - The logs.\n * @returns The `OrderCancelled` event.\n */\n export function extractEvent(logs: viem_Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.stablecoinDex,\n logs,\n eventName: 'OrderCancelled',\n strict: true,\n })\n if (!log) throw new Error('`OrderCancelled` event not found.')\n return log\n }\n}\n\n/**\n * Cancels an order from the orderbook.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.dex.cancelSync(client, {\n * orderId: 123n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function cancelSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: cancelSync.Parameters<chain, account>,\n): Promise<cancelSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await cancel.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = cancel.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace cancelSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = cancel.Parameters<chain, account>\n\n export type Args = cancel.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.stablecoinDex,\n 'OrderCancelled',\n { IndexedOnly: false; Required: true }\n > & {\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Cancels a stale order from the orderbook.\n *\n * A stale order is one where the owner's balance or allowance has dropped\n * below the order amount.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.dex.cancelStale(client, {\n * orderId: 123n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function cancelStale<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: cancelStale.Parameters<chain, account>,\n): Promise<cancelStale.ReturnValue> {\n return cancelStale.inner(writeContract, client, parameters)\n}\n\nexport namespace cancelStale {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Order ID to cancel. */\n orderId: bigint\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: cancelStale.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { orderId, ...rest } = parameters\n const call = cancelStale.call({ orderId })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `cancelStaleOrder` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.dex.cancelStale.call({\n * orderId: 123n,\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { orderId } = args\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n functionName: 'cancelStaleOrder',\n args: [orderId],\n })\n }\n\n /**\n * Extracts the `OrderCancelled` event from logs.\n *\n * @param logs - The logs.\n * @returns The `OrderCancelled` event.\n */\n export function extractEvent(logs: viem_Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.stablecoinDex,\n logs,\n eventName: 'OrderCancelled',\n strict: true,\n })\n if (!log) throw new Error('`OrderCancelled` event not found.')\n return log\n }\n}\n\n/**\n * Cancels a stale order from the orderbook and waits for confirmation.\n *\n * A stale order is one where the owner's balance or allowance has dropped\n * below the order amount.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.dex.cancelStaleSync(client, {\n * orderId: 123n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function cancelStaleSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: cancelStaleSync.Parameters<chain, account>,\n): Promise<cancelStaleSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await cancelStale.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = cancelStale.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace cancelStaleSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = cancelStale.Parameters<chain, account>\n\n export type Args = cancelStale.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.stablecoinDex,\n 'OrderCancelled',\n { IndexedOnly: false; Required: true }\n > & {\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Creates a new trading pair on the DEX.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.dex.createPair(client, {\n * base: '0x20c...11',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function createPair<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: createPair.Parameters<chain, account>,\n): Promise<createPair.ReturnValue> {\n return createPair.inner(writeContract, client, parameters)\n}\n\nexport namespace createPair {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Address of the base token for the pair. */\n base: Address\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: createPair.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { base, ...rest } = parameters\n const call = createPair.call({ base })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `createPair` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.dex.createPair.call({\n * base: '0x20c0...beef',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { base } = args\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n functionName: 'createPair',\n args: [base],\n })\n }\n\n /**\n * Extracts the `PairCreated` event from logs.\n *\n * @param logs - The logs.\n * @returns The `PairCreated` event.\n */\n export function extractEvent(logs: viem_Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.stablecoinDex,\n logs,\n eventName: 'PairCreated',\n strict: true,\n })\n if (!log) throw new Error('`PairCreated` event not found.')\n return log\n }\n}\n\n/**\n * Creates a new trading pair on the DEX.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.dex.createPairSync(client, {\n * base: '0x20c...11',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function createPairSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: createPairSync.Parameters<chain, account>,\n): Promise<createPairSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await createPair.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = createPair.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace createPairSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = createPair.Parameters<chain, account>\n\n export type Args = createPair.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.stablecoinDex,\n 'PairCreated',\n { IndexedOnly: false; Required: true }\n > & {\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Gets a user's token balance on the DEX.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const balance = await Actions.dex.getBalance(client, {\n * account: '0x...',\n * token: '0x20c...11',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The user's token balance on the DEX.\n */\nexport async function getBalance<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: getBalance.Parameters<account>,\n): Promise<getBalance.ReturnValue> {\n const { account: acc = client.account, token, ...rest } = parameters\n const address = acc ? parseAccount(acc).address : undefined\n if (!address) throw new Error('account is required.')\n return readContract(client, {\n ...rest,\n ...getBalance.call({ account: address, token }),\n })\n}\n\nexport namespace getBalance {\n export type Parameters<\n account extends Account | undefined = Account | undefined,\n > = ReadParameters & GetAccountParameter<account> & Args\n\n export type Args = {\n /** Address of the account. */\n account: Address\n /** Address of the token. */\n token: Address\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.stablecoinDex,\n 'balanceOf',\n never\n >\n\n /**\n * Defines a call to the `balanceOf` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { account, token } = args\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n args: [account, token],\n functionName: 'balanceOf',\n })\n }\n}\n\n/**\n * Gets the quote for buying a specific amount of tokens.\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const amountIn = await Actions.dex.getBuyQuote(client, {\n * amountOut: parseUnits('100', 6),\n * tokenIn: '0x20c...11',\n * tokenOut: '0x20c...20',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The amount of tokenIn needed to buy the specified amountOut.\n */\nexport async function getBuyQuote<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getBuyQuote.Parameters,\n): Promise<getBuyQuote.ReturnValue> {\n const { tokenIn, tokenOut, amountOut, ...rest } = parameters\n return readContract(client, {\n ...rest,\n ...getBuyQuote.call({ tokenIn, tokenOut, amountOut }),\n })\n}\n\nexport namespace getBuyQuote {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Amount of tokenOut to buy. */\n amountOut: bigint\n /** Address of the token to spend. */\n tokenIn: Address\n /** Address of the token to buy. */\n tokenOut: Address\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.stablecoinDex,\n 'quoteSwapExactAmountOut',\n never\n >\n\n /**\n * Defines a call to the `quoteSwapExactAmountOut` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { tokenIn, tokenOut, amountOut } = args\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n args: [tokenIn, tokenOut, amountOut],\n functionName: 'quoteSwapExactAmountOut',\n })\n }\n}\n\n/**\n * Gets an order's details from the orderbook.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const order = await Actions.dex.getOrder(client, {\n * orderId: 123n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The order details.\n */\nexport async function getOrder<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getOrder.Parameters,\n): Promise<getOrder.ReturnValue> {\n const { orderId, ...rest } = parameters\n return readContract(client, {\n ...rest,\n ...getOrder.call({ orderId }),\n })\n}\n\nexport namespace getOrder {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Order ID to query. */\n orderId: bigint\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.stablecoinDex,\n 'getOrder',\n never\n >\n\n /**\n * Defines a call to the `getOrder` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { orderId } = args\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n args: [orderId],\n functionName: 'getOrder',\n })\n }\n}\n\n/**\n * Gets orderbook information for a trading pair.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const book = await Actions.dex.getOrderbook(client, {\n * base: '0x20c...11',\n * quote: '0x20c...20',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The orderbook information.\n */\nexport async function getOrderbook<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getOrderbook.Parameters,\n): Promise<getOrderbook.ReturnValue> {\n const { base, quote, ...rest } = parameters\n return readContract(client, {\n ...rest,\n ...getOrderbook.call({ base, quote }),\n })\n}\n\nexport namespace getOrderbook {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Address of the base token. */\n base: Address\n /** Address of the quote token. */\n quote: Address\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.stablecoinDex,\n 'books',\n never\n >\n\n /**\n * Defines a call to the `books` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { base, quote } = args\n const pairKey = getPairKey(base, quote)\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n args: [pairKey],\n functionName: 'books',\n })\n }\n}\n\n/**\n * Gets the price level information at a specific tick.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions, Tick } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const level = await Actions.dex.getTickLevel(client, {\n * base: '0x20c...11',\n * tick: Tick.fromPrice('1.001'),\n * isBid: true,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The price level information.\n */\nexport async function getTickLevel<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getTickLevel.Parameters,\n): Promise<getTickLevel.ReturnValue> {\n const { base, tick, isBid, ...rest } = parameters\n const [head, tail, totalLiquidity] = await readContract(client, {\n ...rest,\n ...getTickLevel.call({ base, tick, isBid }),\n })\n return { head, tail, totalLiquidity }\n}\n\nexport namespace getTickLevel {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Address of the base token. */\n base: Address\n /** Whether to query the bid side (true) or ask side (false). */\n isBid: boolean\n /** Price tick to query. */\n tick: number\n }\n\n export type ReturnValue = {\n /** Order ID of the first order at this tick (0 if empty) */\n head: bigint\n /** Order ID of the last order at this tick (0 if empty) */\n tail: bigint\n /** Total liquidity available at this tick level */\n totalLiquidity: bigint\n }\n\n /**\n * Defines a call to the `getTickLevel` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { base, tick, isBid } = args\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n args: [base, tick, isBid],\n functionName: 'getTickLevel',\n })\n }\n}\n\n/**\n * Gets the quote for selling a specific amount of tokens.\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const amountOut = await Actions.dex.getSellQuote(client, {\n * amountIn: parseUnits('100', 6),\n * tokenIn: '0x20c...11',\n * tokenOut: '0x20c...20',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The amount of tokenOut received for selling the specified amountIn.\n */\nexport async function getSellQuote<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getSellQuote.Parameters,\n): Promise<getSellQuote.ReturnValue> {\n const { tokenIn, tokenOut, amountIn, ...rest } = parameters\n return readContract(client, {\n ...rest,\n ...getSellQuote.call({ tokenIn, tokenOut, amountIn }),\n })\n}\n\nexport namespace getSellQuote {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Amount of tokenIn to sell. */\n amountIn: bigint\n /** Address of the token to sell. */\n tokenIn: Address\n /** Address of the token to receive. */\n tokenOut: Address\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.stablecoinDex,\n 'quoteSwapExactAmountIn',\n never\n >\n\n /**\n * Defines a call to the `quoteSwapExactAmountIn` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { tokenIn, tokenOut, amountIn } = args\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n args: [tokenIn, tokenOut, amountIn],\n functionName: 'quoteSwapExactAmountIn',\n })\n }\n}\n\n/**\n * Places a limit order on the orderbook.\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions, Tick } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.dex.place(client, {\n * amount: parseUnits('100', 6),\n * tick: Tick.fromPrice('0.99'),\n * token: '0x20c...11',\n * type: 'buy',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function place<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: place.Parameters<chain, account>,\n): Promise<place.ReturnValue> {\n return place.inner(writeContract, client, parameters)\n}\n\nexport namespace place {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Amount of tokens to place in the order. */\n amount: bigint\n /** Price tick for the order. */\n tick: number\n /** Address of the base token. */\n token: Address\n /** Order type - 'buy' to buy the token, 'sell' to sell it. */\n type: OrderType\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: place.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { amount, token, type, tick, ...rest } = parameters\n const call = place.call({ amount, token, type, tick })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `place` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions, Tick } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.dex.place.call({\n * amount: parseUnits('100', 6),\n * tick: Tick.fromPrice('0.99'),\n * token: '0x20c0...beef',\n * type: 'buy',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token, amount, type, tick } = args\n const isBid = type === 'buy'\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n functionName: 'place',\n args: [token, amount, isBid, tick],\n })\n }\n\n /**\n * Extracts the `OrderPlaced` event from logs.\n *\n * @param logs - The logs.\n * @returns The `OrderPlaced` event.\n */\n export function extractEvent(logs: viem_Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.stablecoinDex,\n logs,\n eventName: 'OrderPlaced',\n strict: true,\n })\n if (!log) throw new Error('`OrderPlaced` event not found.')\n return log\n }\n}\n\n/**\n * Places a flip order that automatically flips when filled.\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions, Tick } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.dex.placeFlip(client, {\n * amount: parseUnits('100', 6),\n * flipTick: Tick.fromPrice('1.01'),\n * tick: Tick.fromPrice('0.99'),\n * token: '0x20c...11',\n * type: 'buy',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function placeFlip<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: placeFlip.Parameters<chain, account>,\n): Promise<placeFlip.ReturnValue> {\n return placeFlip.inner(writeContract, client, parameters)\n}\n\nexport namespace placeFlip {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Amount of tokens to place in the order. */\n amount: bigint\n /** Target tick to flip to when order is filled. */\n flipTick: number\n /** Price tick for the order. */\n tick: number\n /** Address of the base token. */\n token: Address\n /** Order type - 'buy' to buy the token, 'sell' to sell it. */\n type: OrderType\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: placeFlip.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { amount, flipTick, tick, token, type, ...rest } = parameters\n const call = placeFlip.call({ amount, flipTick, tick, token, type })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `placeFlip` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions, Tick } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.dex.placeFlip.call({\n * amount: parseUnits('100', 6),\n * flipTick: Tick.fromPrice('1.01'),\n * tick: Tick.fromPrice('0.99'),\n * token: '0x20c0...beef',\n * type: 'buy',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token, amount, type, tick, flipTick } = args\n const isBid = type === 'buy'\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n functionName: 'placeFlip',\n args: [token, amount, isBid, tick, flipTick],\n })\n }\n\n /**\n * Extracts the `OrderPlaced` event (with `isFlipOrder: true`) from logs.\n *\n * @param logs - The logs.\n * @returns The `OrderPlaced` event for a flip order.\n */\n export function extractEvent(logs: viem_Log[]) {\n const parsedLogs = parseEventLogs({\n abi: Abis.stablecoinDex,\n logs,\n eventName: 'OrderPlaced',\n strict: true,\n })\n const log = parsedLogs.find((l) => l.args.isFlipOrder)\n if (!log) throw new Error('`OrderPlaced` event (flip order) not found.')\n return log\n }\n}\n\n/**\n * Places a flip order that automatically flips when filled.\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions, Tick } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.dex.placeFlipSync(client, {\n * amount: parseUnits('100', 6),\n * flipTick: Tick.fromPrice('1.01'),\n * tick: Tick.fromPrice('0.99'),\n * token: '0x20c...11',\n * type: 'buy',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function placeFlipSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: placeFlipSync.Parameters<chain, account>,\n): Promise<placeFlipSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await placeFlip.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = placeFlip.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace placeFlipSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = placeFlip.Parameters<chain, account>\n\n export type Args = placeFlip.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.stablecoinDex,\n 'OrderPlaced',\n { IndexedOnly: false; Required: true }\n > & {\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Places a limit order on the orderbook.\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions, Tick } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.dex.placeSync(client, {\n * amount: parseUnits('100', 6),\n * tick: Tick.fromPrice('0.99'),\n * token: '0x20c...11',\n * type: 'buy',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function placeSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: placeSync.Parameters<chain, account>,\n): Promise<placeSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await place.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = place.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace placeSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = place.Parameters<chain, account>\n\n export type Args = place.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.stablecoinDex,\n 'OrderPlaced',\n { IndexedOnly: false; Required: true }\n > & {\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Sells a specific amount of tokens.\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.dex.sell(client, {\n * amountIn: parseUnits('100', 6),\n * minAmountOut: parseUnits('95', 6),\n * tokenIn: '0x20c...11',\n * tokenOut: '0x20c...20',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function sell<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: sell.Parameters<chain, account>,\n): Promise<sell.ReturnValue> {\n return sell.inner(writeContract, client, parameters)\n}\n\nexport namespace sell {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Amount of tokenIn to sell. */\n amountIn: bigint\n /** Minimum amount of tokenOut to receive. */\n minAmountOut: bigint\n /** Address of the token to sell. */\n tokenIn: Address\n /** Address of the token to receive. */\n tokenOut: Address\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: sell.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { tokenIn, tokenOut, amountIn, minAmountOut, ...rest } = parameters\n const call = sell.call({ tokenIn, tokenOut, amountIn, minAmountOut })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `swapExactAmountIn` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.dex.sell.call({\n * amountIn: parseUnits('100', 6),\n * minAmountOut: parseUnits('95', 6),\n * tokenIn: '0x20c0...beef',\n * tokenOut: '0x20c0...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { tokenIn, tokenOut, amountIn, minAmountOut } = args\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n functionName: 'swapExactAmountIn',\n args: [tokenIn, tokenOut, amountIn, minAmountOut],\n })\n }\n}\n\n/**\n * Sells a specific amount of tokens.\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.dex.sellSync(client, {\n * amountIn: parseUnits('100', 6),\n * minAmountOut: parseUnits('95', 6),\n * tokenIn: '0x20c...11',\n * tokenOut: '0x20c...20',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt.\n */\nexport async function sellSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: sellSync.Parameters<chain, account>,\n): Promise<sellSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await sell.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n return { receipt }\n}\n\nexport namespace sellSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = sell.Parameters<chain, account>\n\n export type Args = sell.Args\n\n export type ReturnValue = Compute<{\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }>\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Watches for flip order placed events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = Actions.dex.watchFlipOrderPlaced(client, {\n * onFlipOrderPlaced: (args, log) => {\n * console.log('Flip order placed:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchFlipOrderPlaced<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchFlipOrderPlaced.Parameters,\n) {\n const { onFlipOrderPlaced, maker, token, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n eventName: 'OrderPlaced',\n args: {\n ...(maker !== undefined && { maker }),\n ...(token !== undefined && { token }),\n },\n onLogs: (logs) => {\n for (const log of logs) {\n if (log.args.isFlipOrder) onFlipOrderPlaced(log.args, log)\n }\n },\n strict: true,\n })\n}\n\nexport declare namespace watchFlipOrderPlaced {\n export type Args = GetEventArgs<\n typeof Abis.stablecoinDex,\n 'OrderPlaced',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.stablecoinDex, 'OrderPlaced'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<\n typeof Abis.stablecoinDex,\n 'OrderPlaced',\n true\n >,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Address of the maker to filter events. */\n maker?: Address | undefined\n /** Callback to invoke when a flip order is placed. */\n onFlipOrderPlaced: (args: Args, log: Log) => void\n /** Address of the token to filter events. */\n token?: Address | undefined\n }\n}\n\n/**\n * Watches for order cancelled events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = Actions.dex.watchOrderCancelled(client, {\n * onOrderCancelled: (args, log) => {\n * console.log('Order cancelled:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchOrderCancelled<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchOrderCancelled.Parameters,\n) {\n const { onOrderCancelled, orderId, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n eventName: 'OrderCancelled',\n args: orderId !== undefined ? { orderId } : undefined,\n onLogs: (logs) => {\n for (const log of logs) onOrderCancelled(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchOrderCancelled {\n export type Args = GetEventArgs<\n typeof Abis.stablecoinDex,\n 'OrderCancelled',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.stablecoinDex, 'OrderCancelled'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<\n typeof Abis.stablecoinDex,\n 'OrderCancelled',\n true\n >,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when an order is cancelled. */\n onOrderCancelled: (args: Args, log: Log) => void\n /** Order ID to filter events. */\n orderId?: bigint | undefined\n }\n}\n\n/**\n * Watches for order filled events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = Actions.dex.watchOrderFilled(client, {\n * onOrderFilled: (args, log) => {\n * console.log('Order filled:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchOrderFilled<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchOrderFilled.Parameters,\n) {\n const { onOrderFilled, maker, taker, orderId, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n eventName: 'OrderFilled',\n args: {\n ...(orderId !== undefined && { orderId }),\n ...(maker !== undefined && { maker }),\n ...(taker !== undefined && { taker }),\n },\n onLogs: (logs) => {\n for (const log of logs) onOrderFilled(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchOrderFilled {\n export type Args = GetEventArgs<\n typeof Abis.stablecoinDex,\n 'OrderFilled',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.stablecoinDex, 'OrderFilled'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<\n typeof Abis.stablecoinDex,\n 'OrderFilled',\n true\n >,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Address of the maker to filter events. */\n maker?: Address | undefined\n /** Callback to invoke when an order is filled. */\n onOrderFilled: (args: Args, log: Log) => void\n /** Order ID to filter events. */\n orderId?: bigint | undefined\n /** Address of the taker to filter events. */\n taker?: Address | undefined\n }\n}\n\n/**\n * Watches for order placed events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = Actions.dex.watchOrderPlaced(client, {\n * onOrderPlaced: (args, log) => {\n * console.log('Order placed:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchOrderPlaced<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchOrderPlaced.Parameters,\n) {\n const { onOrderPlaced, maker, token, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n eventName: 'OrderPlaced',\n args: {\n ...(maker !== undefined && { maker }),\n ...(token !== undefined && { token }),\n },\n onLogs: (logs) => {\n for (const log of logs) onOrderPlaced(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchOrderPlaced {\n export type Args = GetEventArgs<\n typeof Abis.stablecoinDex,\n 'OrderPlaced',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.stablecoinDex, 'OrderPlaced'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<\n typeof Abis.stablecoinDex,\n 'OrderPlaced',\n true\n >,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Address of the maker to filter events. */\n maker?: Address | undefined\n /** Callback to invoke when an order is placed. */\n onOrderPlaced: (args: Args, log: Log) => void\n /** Address of the token to filter events. */\n token?: Address | undefined\n }\n}\n\n/**\n * Withdraws tokens from the DEX to the caller's wallet.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.dex.withdraw(client, {\n * amount: 100n,\n * token: '0x20c...11',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function withdraw<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: withdraw.Parameters<chain, account>,\n): Promise<withdraw.ReturnValue> {\n return withdraw.inner(writeContract, client, parameters)\n}\n\nexport namespace withdraw {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Amount to withdraw. */\n amount: bigint\n /** Address of the token to withdraw. */\n token: Address\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: withdraw.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { token, amount, ...rest } = parameters\n const call = withdraw.call({ token, amount })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `withdraw` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, parseUnits, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.dex.withdraw.call({\n * amount: parseUnits('100', 6),\n * token: '0x20c0...beef',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token, amount } = args\n return defineCall({\n address: Addresses.stablecoinDex,\n abi: Abis.stablecoinDex,\n functionName: 'withdraw',\n args: [token, amount],\n })\n }\n}\n\n/**\n * Withdraws tokens from the DEX to the caller's wallet.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { privateKeyToAccount } from 'viem/accounts'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.dex.withdrawSync(client, {\n * amount: 100n,\n * token: '0x20c...11',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt.\n */\nexport async function withdrawSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: withdrawSync.Parameters<chain, account>,\n): Promise<withdrawSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await withdraw.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n return { receipt }\n}\n\nexport namespace withdrawSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = withdraw.Parameters<chain, account>\n\n export type Args = withdraw.Args\n\n export type ReturnValue = Compute<{\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }>\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\nfunction getPairKey(base: Address, quote: Address) {\n return Hash.keccak256(Hex.concat(base, quote))\n}\n","import type { Address } from 'abitype'\nimport type { Account } from '../../accounts/types.js'\nimport { parseAccount } from '../../accounts/utils/parseAccount.js'\nimport { waitForTransactionReceipt } from '../../actions/public/waitForTransactionReceipt.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { Hash } from '../../types/misc.js'\nimport type { TransactionReceipt } from '../Transaction.js'\n\n/**\n * Funds an account with an initial amount of set token(s)\n * on Tempo's testnet.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const hashes = await Actions.faucet.fund(client, {\n * account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function fund<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: fund.Parameters,\n): Promise<fund.ReturnValue> {\n const account = parseAccount(parameters.account)\n return client.request<{\n Method: 'tempo_fundAddress'\n Parameters: [address: Address]\n ReturnType: readonly Hash[]\n }>({\n method: 'tempo_fundAddress',\n params: [account.address],\n })\n}\n\nexport declare namespace fund {\n export type Parameters = {\n /** Account to fund. */\n account: Account | Address\n }\n\n export type ReturnValue = readonly Hash[]\n}\n\n/**\n * Funds an account with an initial amount of set token(s)\n * on Tempo's testnet. Waits for the transactions to be included\n * on a block before returning a response.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const hashes = await Actions.faucet.fundSync(client, {\n * account: '0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function fundSync<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: fundSync.Parameters,\n): Promise<fundSync.ReturnValue> {\n const { timeout = 10_000 } = parameters\n const account = parseAccount(parameters.account)\n const hashes = await client.request<{\n Method: 'tempo_fundAddress'\n Parameters: [address: Address]\n ReturnType: readonly Hash[]\n }>({\n method: 'tempo_fundAddress',\n params: [account.address],\n })\n const receipts = await Promise.all(\n hashes.map((hash) =>\n waitForTransactionReceipt(client, {\n hash,\n checkReplacement: false,\n timeout,\n }),\n ),\n )\n return receipts\n}\n\nexport declare namespace fundSync {\n export type Parameters = {\n /** Account to fund. */\n account: Account | Address\n /** Timeout. */\n timeout?: number | undefined\n }\n\n export type ReturnValue = readonly TransactionReceipt[]\n}\n","import type { Address } from 'abitype'\nimport { TokenId } from 'ox/tempo'\nimport type { Account } from '../../accounts/types.js'\nimport { parseAccount } from '../../accounts/utils/parseAccount.js'\nimport { readContract } from '../../actions/public/readContract.js'\nimport type { WatchContractEventParameters } from '../../actions/public/watchContractEvent.js'\nimport { watchContractEvent } from '../../actions/public/watchContractEvent.js'\nimport type { WriteContractReturnType } from '../../actions/wallet/writeContract.js'\nimport { writeContract } from '../../actions/wallet/writeContract.js'\nimport { writeContractSync } from '../../actions/wallet/writeContractSync.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport { zeroAddress } from '../../constants/address.js'\nimport type { BaseErrorType } from '../../errors/base.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ExtractAbiItem, GetEventArgs } from '../../types/contract.js'\nimport type { Log, Log as viem_Log } from '../../types/log.js'\nimport type { Compute, UnionOmit } from '../../types/utils.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport * as Abis from '../Abis.js'\nimport * as Addresses from '../Addresses.js'\nimport type {\n GetAccountParameter,\n ReadParameters,\n WriteParameters,\n} from '../internal/types.js'\nimport { defineCall } from '../internal/utils.js'\nimport type { TransactionReceipt } from '../Transaction.js'\n\n/**\n * Gets the user's default fee token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const { address, id } = await Actions.fee.getUserToken(client)\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function getUserToken<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n ...parameters: account extends Account\n ? [getUserToken.Parameters<account>] | []\n : [getUserToken.Parameters<account>]\n): Promise<getUserToken.ReturnValue> {\n const { account: account_ = client.account, ...rest } = parameters[0] ?? {}\n if (!account_) throw new Error('account is required.')\n const account = parseAccount(account_)\n const address = await readContract(client, {\n ...rest,\n ...getUserToken.call({ account: account.address }),\n })\n if (address === zeroAddress) return null\n return {\n address,\n id: TokenId.fromAddress(address),\n }\n}\n\nexport namespace getUserToken {\n export type Parameters<\n account extends Account | undefined = Account | undefined,\n > = ReadParameters & GetAccountParameter<account>\n\n export type Args = {\n /** Account address. */\n account: Address\n }\n\n export type ReturnValue = Compute<{\n address: Address\n id: bigint\n } | null>\n\n /**\n * Defines a call to the `userTokens` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { account } = args\n return defineCall({\n address: Addresses.feeManager,\n abi: Abis.feeManager,\n args: [account],\n functionName: 'userTokens',\n })\n }\n}\n\n/**\n * Sets the user's default fee token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.fee.setUserToken(client, {\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function setUserToken<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setUserToken.Parameters<chain, account>,\n): Promise<setUserToken.ReturnValue> {\n return setUserToken.inner(writeContract, client, parameters)\n}\n\nexport namespace setUserToken {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: setUserToken.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { token, ...rest } = parameters\n const call = setUserToken.call({ token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `setUserToken` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.fee.setUserToken.call({\n * token: '0x20c0...beef',\n * }),\n * actions.fee.setUserToken.call({\n * token: '0x20c0...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token } = args\n return defineCall({\n address: Addresses.feeManager,\n abi: Abis.feeManager,\n functionName: 'setUserToken',\n args: [TokenId.toAddress(token)],\n })\n }\n\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.feeManager,\n logs,\n eventName: 'UserTokenSet',\n strict: true,\n })\n if (!log) throw new Error('`UserTokenSet` event not found.')\n return log\n }\n}\n\n/**\n * Sets the user's default fee token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.fee.setUserTokenSync(client, {\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function setUserTokenSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setUserTokenSync.Parameters<chain, account>,\n): Promise<setUserTokenSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await setUserToken.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = setUserToken.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace setUserTokenSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = setUserToken.Parameters<chain, account>\n\n export type Args = setUserToken.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.feeManager,\n 'UserTokenSet',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Watches for user token set events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.fee.watchSetUserToken(client, {\n * onUserTokenSet: (args, log) => {\n * console.log('User token set:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchSetUserToken<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchSetUserToken.Parameters,\n) {\n const { onUserTokenSet, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.feeManager,\n abi: Abis.feeManager,\n eventName: 'UserTokenSet',\n onLogs: (logs) => {\n for (const log of logs) onUserTokenSet(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchSetUserToken {\n export type Args = GetEventArgs<\n typeof Abis.feeManager,\n 'UserTokenSet',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.feeManager, 'UserTokenSet'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.feeManager, 'UserTokenSet', true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a user token is set. */\n onUserTokenSet: (args: Args, log: Log) => void\n }\n}\n\n/**\n * Gets the validator's preferred fee token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const { address, id } = await Actions.fee.getValidatorToken(client, {\n * validator: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The validator's preferred fee token, or null if not set.\n */\nexport async function getValidatorToken<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: getValidatorToken.Parameters,\n): Promise<getValidatorToken.ReturnValue> {\n const { validator, ...rest } = parameters\n const address = await readContract(client, {\n ...rest,\n ...getValidatorToken.call({ validator }),\n })\n if (address === zeroAddress) return null\n return {\n address,\n id: TokenId.fromAddress(address),\n }\n}\n\nexport namespace getValidatorToken {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Validator address. */\n validator: Address\n }\n\n export type ReturnValue = Compute<{\n address: Address\n id: bigint\n } | null>\n\n /**\n * Defines a call to the `validatorTokens` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { validator } = args\n return defineCall({\n address: Addresses.feeManager,\n abi: Abis.feeManager,\n args: [validator],\n functionName: 'validatorTokens',\n })\n }\n}\n\n/**\n * Sets the validator's preferred fee token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.fee.setValidatorToken(client, {\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function setValidatorToken<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setValidatorToken.Parameters<chain, account>,\n): Promise<setValidatorToken.ReturnValue> {\n return setValidatorToken.inner(writeContract, client, parameters)\n}\n\nexport namespace setValidatorToken {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: setValidatorToken.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { token, ...rest } = parameters\n const call = setValidatorToken.call({ token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `setValidatorToken` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.fee.setValidatorToken.call({\n * token: '0x20c0...beef',\n * }),\n * actions.fee.setValidatorToken.call({\n * token: '0x20c0...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token } = args\n return defineCall({\n address: Addresses.feeManager,\n abi: Abis.feeManager,\n functionName: 'setValidatorToken',\n args: [TokenId.toAddress(token)],\n })\n }\n\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.feeManager,\n logs,\n eventName: 'ValidatorTokenSet',\n strict: true,\n })\n if (!log) throw new Error('`ValidatorTokenSet` event not found.')\n return log\n }\n}\n\n/**\n * Sets the validator's preferred fee token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.fee.setValidatorTokenSync(client, {\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function setValidatorTokenSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setValidatorTokenSync.Parameters<chain, account>,\n): Promise<setValidatorTokenSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await setValidatorToken.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = setValidatorToken.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace setValidatorTokenSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = setValidatorToken.Parameters<chain, account>\n\n export type Args = setValidatorToken.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.feeManager,\n 'ValidatorTokenSet',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Watches for validator token set events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.fee.watchSetValidatorToken(client, {\n * onValidatorTokenSet: (args, log) => {\n * console.log('Validator token set:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchSetValidatorToken<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchSetValidatorToken.Parameters,\n) {\n const { onValidatorTokenSet, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.feeManager,\n abi: Abis.feeManager,\n eventName: 'ValidatorTokenSet',\n onLogs: (logs) => {\n for (const log of logs) onValidatorTokenSet(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchSetValidatorToken {\n export type Args = GetEventArgs<\n typeof Abis.feeManager,\n 'ValidatorTokenSet',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.feeManager, 'ValidatorTokenSet'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<\n typeof Abis.feeManager,\n 'ValidatorTokenSet',\n true\n >,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a validator token is set. */\n onValidatorTokenSet: (args: Args, log: Log) => void\n }\n}\n","import type { Address } from 'abitype'\nimport type { Account } from '../../accounts/types.js'\nimport type { ReadContractReturnType } from '../../actions/public/readContract.js'\nimport { readContract } from '../../actions/public/readContract.js'\nimport type { WatchContractEventParameters } from '../../actions/public/watchContractEvent.js'\nimport { watchContractEvent } from '../../actions/public/watchContractEvent.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ExtractAbiItem, GetEventArgs } from '../../types/contract.js'\nimport type { Log as viem_Log } from '../../types/log.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport * as Abis from '../Abis.js'\nimport * as Addresses from '../Addresses.js'\nimport type { ReadParameters } from '../internal/types.js'\nimport { defineCall } from '../internal/utils.js'\n\n/**\n * Gets the nonce for an account and nonce key.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const nonce = await Actions.nonce.getNonce(client, {\n * account: '0x...',\n * nonceKey: 1n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The nonce value.\n */\nexport async function getNonce<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: getNonce.Parameters,\n): Promise<getNonce.ReturnValue> {\n const { account, nonceKey, ...rest } = parameters\n return readContract(client, {\n ...rest,\n ...getNonce.call({ account, nonceKey }),\n })\n}\n\nexport namespace getNonce {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Account address. */\n account: Address\n /** Nonce key (must be > 0, key 0 is reserved for protocol nonces). */\n nonceKey: bigint\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.nonce,\n 'getNonce',\n never\n >\n\n /**\n * Defines a call to the `getNonce` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`multicall`](https://viem.sh/docs/contract/multicall): execute multiple calls in parallel\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const result = await client.multicall({\n * contracts: [\n * Actions.nonce.getNonce.call({ account: '0x...', nonceKey: 1n }),\n * Actions.nonce.getNonce.call({ account: '0x...', nonceKey: 2n }),\n * ],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { account, nonceKey } = args\n return defineCall({\n address: Addresses.nonceManager,\n abi: Abis.nonce,\n args: [account, nonceKey],\n functionName: 'getNonce',\n })\n }\n}\n\nexport function watchNonceIncremented<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchNonceIncremented.Parameters,\n) {\n const { onNonceIncremented, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.nonceManager,\n abi: Abis.nonce,\n eventName: 'NonceIncremented',\n onLogs: (logs) => {\n for (const log of logs) onNonceIncremented(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchNonceIncremented {\n export type Args = GetEventArgs<\n typeof Abis.nonce,\n 'NonceIncremented',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.nonce, 'NonceIncremented'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.nonce, 'NonceIncremented', true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a nonce is incremented. */\n onNonceIncremented: (args: Args, log: Log) => void\n }\n}\n","import type { Address } from 'abitype'\nimport type { Account } from '../../accounts/types.js'\nimport { parseAccount } from '../../accounts/utils/parseAccount.js'\nimport type { ReadContractReturnType } from '../../actions/public/readContract.js'\nimport { readContract } from '../../actions/public/readContract.js'\nimport type { WatchContractEventParameters } from '../../actions/public/watchContractEvent.js'\nimport { watchContractEvent } from '../../actions/public/watchContractEvent.js'\nimport type { WriteContractReturnType } from '../../actions/wallet/writeContract.js'\nimport { writeContract } from '../../actions/wallet/writeContract.js'\nimport { writeContractSync } from '../../actions/wallet/writeContractSync.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseErrorType } from '../../errors/base.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ExtractAbiItem, GetEventArgs } from '../../types/contract.js'\nimport type { Log, Log as viem_Log } from '../../types/log.js'\nimport type { Compute, UnionOmit } from '../../types/utils.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport * as Abis from '../Abis.js'\nimport * as Addresses from '../Addresses.js'\nimport type { ReadParameters, WriteParameters } from '../internal/types.js'\nimport { defineCall } from '../internal/utils.js'\nimport type { TransactionReceipt } from '../Transaction.js'\n\nexport type PolicyType = 'whitelist' | 'blacklist'\n\nconst policyTypeMap = {\n whitelist: 0,\n blacklist: 1,\n} as const\n\n/**\n * Creates a new policy.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const { hash, policyId } = await Actions.policy.create(client, {\n * admin: '0x...',\n * type: 'whitelist',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash and policy ID.\n */\nexport async function create<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: create.Parameters<chain, account>,\n): Promise<create.ReturnValue> {\n return create.inner(writeContract, client, parameters)\n}\n\nexport namespace create {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> &\n Omit<Args, 'admin'> & {\n /** Address of the policy admin. */\n admin?: Address | undefined\n }\n\n export type Args = {\n /** Optional array of accounts to initialize the policy with. */\n addresses?: readonly Address[] | undefined\n /** Address of the policy admin. */\n admin: Address\n /** Type of policy to create. */\n type: PolicyType\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const {\n account = client.account,\n addresses,\n chain = client.chain,\n type,\n ...rest\n } = parameters\n\n if (!account) throw new Error('`account` is required')\n\n const admin = parseAccount(account).address!\n\n const call = create.call({ admin, type, addresses })\n return action(client, {\n ...rest,\n account,\n chain,\n ...call,\n } as never) as never\n }\n\n /**\n * Defines a call to the `createPolicy` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.policy.create.call({\n * admin: '0xfeed...fede',\n * type: 'whitelist',\n * }),\n * actions.policy.create.call({\n * admin: '0xfeed...fede',\n * type: 'blacklist',\n * addresses: ['0x20c0...beef', '0x20c0...babe'],\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { admin, type, addresses } = args\n const config = (() => {\n if (addresses)\n return {\n functionName: 'createPolicyWithAccounts',\n args: [admin, policyTypeMap[type], addresses],\n } as const\n return {\n functionName: 'createPolicy',\n args: [admin, policyTypeMap[type]],\n } as const\n })()\n return defineCall({\n address: Addresses.tip403Registry,\n abi: Abis.tip403Registry,\n ...config,\n })\n }\n\n /**\n * Extracts the `PolicyCreated` event from logs.\n *\n * @param logs - The logs.\n * @returns The `PolicyCreated` event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip403Registry,\n logs,\n eventName: 'PolicyCreated',\n strict: true,\n })\n if (!log) throw new Error('`PolicyCreated` event not found.')\n return log\n }\n}\n\n/**\n * Creates a new policy.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.policy.createSync(client, {\n * admin: '0x...',\n * type: 'whitelist',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function createSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: createSync.Parameters<chain, account>,\n): Promise<createSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await create.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = create.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace createSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = create.Parameters<chain, account>\n\n export type Args = create.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.tip403Registry,\n 'PolicyCreated',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Sets the admin for a policy.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.policy.setAdmin(client, {\n * policyId: 2n,\n * admin: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function setAdmin<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setAdmin.Parameters<chain, account>,\n): Promise<setAdmin.ReturnValue> {\n return setAdmin.inner(writeContract, client, parameters)\n}\n\nexport namespace setAdmin {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** New admin address. */\n admin: Address\n /** Policy ID. */\n policyId: bigint\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: setAdmin.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { policyId, admin, ...rest } = parameters\n const call = setAdmin.call({ policyId, admin })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `setPolicyAdmin` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.policy.setAdmin.call({\n * policyId: 2n,\n * admin: '0xfeed...fede',\n * }),\n * actions.policy.setAdmin.call({\n * policyId: 3n,\n * admin: '0xfeed...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { policyId, admin } = args\n return defineCall({\n address: Addresses.tip403Registry,\n abi: Abis.tip403Registry,\n functionName: 'setPolicyAdmin',\n args: [policyId, admin],\n })\n }\n\n /**\n * Extracts the `PolicyAdminUpdated` event from logs.\n *\n * @param logs - The logs.\n * @returns The `PolicyAdminUpdated` event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip403Registry,\n logs,\n eventName: 'PolicyAdminUpdated',\n strict: true,\n })\n if (!log) throw new Error('`PolicyAdminUpdated` event not found.')\n return log\n }\n}\n\n/**\n * Sets the admin for a policy.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.policy.setAdminSync(client, {\n * policyId: 2n,\n * admin: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function setAdminSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setAdminSync.Parameters<chain, account>,\n): Promise<setAdminSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await setAdmin.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = setAdmin.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace setAdminSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = setAdmin.Parameters<chain, account>\n\n export type Args = setAdmin.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.tip403Registry,\n 'PolicyAdminUpdated',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Modifies a policy whitelist.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.policy.modifyWhitelist(client, {\n * policyId: 2n,\n * account: '0x...',\n * allowed: true,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function modifyWhitelist<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: modifyWhitelist.Parameters<chain, account>,\n): Promise<modifyWhitelist.ReturnValue> {\n return modifyWhitelist.inner(writeContract, client, parameters)\n}\n\nexport namespace modifyWhitelist {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Target account address. */\n address: Address\n /** Whether the account is allowed. */\n allowed: boolean\n /** Policy ID. */\n policyId: bigint\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: modifyWhitelist.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { address: targetAccount, allowed, policyId, ...rest } = parameters\n const call = modifyWhitelist.call({\n address: targetAccount,\n allowed,\n policyId,\n })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `modifyPolicyWhitelist` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.policy.modifyWhitelist.call({\n * policyId: 2n,\n * address: '0x20c0...beef',\n * allowed: true,\n * }),\n * actions.policy.modifyWhitelist.call({\n * policyId: 2n,\n * address: '0x20c0...babe',\n * allowed: false,\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { policyId, address, allowed } = args\n return defineCall({\n address: Addresses.tip403Registry,\n abi: Abis.tip403Registry,\n functionName: 'modifyPolicyWhitelist',\n args: [policyId, address, allowed],\n })\n }\n\n /**\n * Extracts the `WhitelistUpdated` event from logs.\n *\n * @param logs - The logs.\n * @returns The `WhitelistUpdated` event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip403Registry,\n logs,\n eventName: 'WhitelistUpdated',\n strict: true,\n })\n if (!log) throw new Error('`WhitelistUpdated` event not found.')\n return log\n }\n}\n\n/**\n * Modifies a policy whitelist.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.policy.modifyWhitelistSync(client, {\n * policyId: 2n,\n * account: '0x...',\n * allowed: true,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function modifyWhitelistSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: modifyWhitelistSync.Parameters<chain, account>,\n): Promise<modifyWhitelistSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await modifyWhitelist.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = modifyWhitelist.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace modifyWhitelistSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = modifyWhitelist.Parameters<chain, account>\n\n export type Args = modifyWhitelist.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.tip403Registry,\n 'WhitelistUpdated',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Modifies a policy blacklist.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.policy.modifyBlacklist(client, {\n * policyId: 2n,\n * account: '0x...',\n * restricted: true,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function modifyBlacklist<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: modifyBlacklist.Parameters<chain, account>,\n): Promise<modifyBlacklist.ReturnValue> {\n return modifyBlacklist.inner(writeContract, client, parameters)\n}\n\nexport namespace modifyBlacklist {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Target account address. */\n address: Address\n /** Policy ID. */\n policyId: bigint\n /** Whether the account is restricted. */\n restricted: boolean\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: modifyBlacklist.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { address: targetAccount, policyId, restricted, ...rest } = parameters\n const call = modifyBlacklist.call({\n address: targetAccount,\n policyId,\n restricted,\n })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `modifyPolicyBlacklist` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.policy.modifyBlacklist.call({\n * policyId: 2n,\n * address: '0x20c0...beef',\n * restricted: true,\n * }),\n * actions.policy.modifyBlacklist.call({\n * policyId: 2n,\n * address: '0x20c0...babe',\n * restricted: false,\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { policyId, address, restricted } = args\n return defineCall({\n address: Addresses.tip403Registry,\n abi: Abis.tip403Registry,\n functionName: 'modifyPolicyBlacklist',\n args: [policyId, address, restricted],\n })\n }\n\n /**\n * Extracts the `BlacklistUpdated` event from logs.\n *\n * @param logs - The logs.\n * @returns The `BlacklistUpdated` event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip403Registry,\n logs,\n eventName: 'BlacklistUpdated',\n strict: true,\n })\n if (!log) throw new Error('`BlacklistUpdated` event not found.')\n return log\n }\n}\n\n/**\n * Modifies a policy blacklist.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.policy.modifyBlacklistSync(client, {\n * policyId: 2n,\n * account: '0x...',\n * restricted: true,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function modifyBlacklistSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: modifyBlacklistSync.Parameters<chain, account>,\n): Promise<modifyBlacklistSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await modifyBlacklist.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = modifyBlacklist.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace modifyBlacklistSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = modifyBlacklist.Parameters<chain, account>\n\n export type Args = modifyBlacklist.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.tip403Registry,\n 'BlacklistUpdated',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Gets policy data.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const data = await Actions.policy.getData(client, {\n * policyId: 2n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The policy data.\n */\nexport async function getData<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getData.Parameters,\n): Promise<getData.ReturnValue> {\n const { policyId, ...rest } = parameters\n const result = await readContract(client, {\n ...rest,\n ...getData.call({ policyId }),\n })\n return {\n admin: result[1],\n type: result[0] === 0 ? 'whitelist' : 'blacklist',\n }\n}\n\nexport namespace getData {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Policy ID. */\n policyId: bigint\n }\n\n export type ReturnValue = Compute<{\n /** Admin address. */\n admin: Address\n /** Policy type. */\n type: PolicyType\n }>\n\n /**\n * Defines a call to the `policyData` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { policyId } = args\n return defineCall({\n address: Addresses.tip403Registry,\n abi: Abis.tip403Registry,\n args: [policyId],\n functionName: 'policyData',\n })\n }\n}\n\n/**\n * Checks if a user is authorized by a policy.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const authorized = await Actions.policy.isAuthorized(client, {\n * policyId: 2n,\n * user: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns Whether the user is authorized.\n */\nexport async function isAuthorized<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: isAuthorized.Parameters,\n): Promise<isAuthorized.ReturnValue> {\n const { policyId, user, ...rest } = parameters\n return readContract(client, {\n ...rest,\n ...isAuthorized.call({ policyId, user }),\n })\n}\n\nexport namespace isAuthorized {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Policy ID. */\n policyId: bigint\n /** User address to check. */\n user: Address\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.tip403Registry,\n 'isAuthorized',\n never\n >\n\n /**\n * Defines a call to the `isAuthorized` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { policyId, user } = args\n return defineCall({\n address: Addresses.tip403Registry,\n abi: Abis.tip403Registry,\n args: [policyId, user],\n functionName: 'isAuthorized',\n })\n }\n}\n\n/**\n * Watches for policy creation events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.policy.watchCreate(client, {\n * onPolicyCreated: (args, log) => {\n * console.log('Policy created:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchCreate<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchCreate.Parameters,\n) {\n const { onPolicyCreated, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.tip403Registry,\n abi: Abis.tip403Registry,\n eventName: 'PolicyCreated',\n onLogs: (logs) => {\n for (const log of logs)\n onPolicyCreated(\n {\n ...log.args,\n type: log.args.policyType === 0 ? 'whitelist' : 'blacklist',\n },\n log,\n )\n },\n strict: true,\n })\n}\n\nexport declare namespace watchCreate {\n export type Args = Compute<{\n policyId: bigint\n updater: Address\n type: PolicyType\n }>\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip403Registry, 'PolicyCreated'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<\n typeof Abis.tip403Registry,\n 'PolicyCreated',\n true\n >,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a policy is created. */\n onPolicyCreated: (args: Args, log: Log) => void\n }\n}\n\n/**\n * Watches for policy admin update events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.policy.watchAdminUpdated(client, {\n * onAdminUpdated: (args, log) => {\n * console.log('Policy admin updated:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchAdminUpdated<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchAdminUpdated.Parameters,\n) {\n const { onAdminUpdated, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.tip403Registry,\n abi: Abis.tip403Registry,\n eventName: 'PolicyAdminUpdated',\n onLogs: (logs) => {\n for (const log of logs) onAdminUpdated(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchAdminUpdated {\n export type Args = GetEventArgs<\n typeof Abis.tip403Registry,\n 'PolicyAdminUpdated',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip403Registry, 'PolicyAdminUpdated'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<\n typeof Abis.tip403Registry,\n 'PolicyAdminUpdated',\n true\n >,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a policy admin is updated. */\n onAdminUpdated: (args: Args, log: Log) => void\n }\n}\n\n/**\n * Watches for whitelist update events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.policy.watchWhitelistUpdated(client, {\n * onWhitelistUpdated: (args, log) => {\n * console.log('Whitelist updated:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchWhitelistUpdated<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchWhitelistUpdated.Parameters,\n) {\n const { onWhitelistUpdated, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.tip403Registry,\n abi: Abis.tip403Registry,\n eventName: 'WhitelistUpdated',\n onLogs: (logs) => {\n for (const log of logs) onWhitelistUpdated(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchWhitelistUpdated {\n export type Args = GetEventArgs<\n typeof Abis.tip403Registry,\n 'WhitelistUpdated',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip403Registry, 'WhitelistUpdated'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<\n typeof Abis.tip403Registry,\n 'WhitelistUpdated',\n true\n >,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a whitelist is updated. */\n onWhitelistUpdated: (args: Args, log: Log) => void\n }\n}\n\n/**\n * Watches for blacklist update events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.policy.watchBlacklistUpdated(client, {\n * onBlacklistUpdated: (args, log) => {\n * console.log('Blacklist updated:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchBlacklistUpdated<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchBlacklistUpdated.Parameters,\n) {\n const { onBlacklistUpdated, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.tip403Registry,\n abi: Abis.tip403Registry,\n eventName: 'BlacklistUpdated',\n onLogs: (logs) => {\n for (const log of logs) onBlacklistUpdated(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchBlacklistUpdated {\n export type Args = GetEventArgs<\n typeof Abis.tip403Registry,\n 'BlacklistUpdated',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip403Registry, 'BlacklistUpdated'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<\n typeof Abis.tip403Registry,\n 'BlacklistUpdated',\n true\n >,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a blacklist is updated. */\n onBlacklistUpdated: (args: Args, log: Log) => void\n }\n}\n","import type { Address } from 'abitype'\nimport type { Account } from '../../accounts/types.js'\nimport type { ReadContractReturnType } from '../../actions/public/readContract.js'\nimport { readContract } from '../../actions/public/readContract.js'\nimport type {\n WatchContractEventParameters,\n WatchContractEventReturnType,\n} from '../../actions/public/watchContractEvent.js'\nimport { watchContractEvent } from '../../actions/public/watchContractEvent.js'\nimport type { WriteContractReturnType } from '../../actions/wallet/writeContract.js'\nimport { writeContract } from '../../actions/wallet/writeContract.js'\nimport { writeContractSync } from '../../actions/wallet/writeContractSync.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseErrorType } from '../../errors/base.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ExtractAbiItem, GetEventArgs } from '../../types/contract.js'\nimport type { Log, Log as viem_Log } from '../../types/log.js'\nimport type { UnionOmit } from '../../types/utils.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport * as Abis from '../Abis.js'\nimport type { ReadParameters, WriteParameters } from '../internal/types.js'\nimport { defineCall } from '../internal/utils.js'\n\n/**\n * Claims accumulated rewards for a recipient.\n *\n * This function allows a reward recipient to claim their accumulated rewards\n * and receive them as token transfers to their own balance.\n *\n * - Accrues all pending rewards up to the current block timestamp.\n * - Updates the caller's reward accounting.\n * - Transfers the caller's accumulated `rewardBalance` from the token contract to the caller.\n * - If the contract's balance is insufficient, claims up to the available amount.\n * - Returns the actual amount claimed.\n *\n * Notes:\n * - Reverts with `Paused` if the token is paused.\n * - Reverts with `PolicyForbids` if the caller is not authorized to receive tokens under TIP-403.\n * - If opted in, the claimed amount is added back to `optedInSupply` since it goes to the recipient's balance.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.reward.claim(client, {\n * token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function claim<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: claim.Parameters<chain, account>,\n): Promise<claim.ReturnValue> {\n return claim.inner(writeContract, client, parameters)\n}\n\nexport namespace claim {\n export type Args = {\n /** The TIP20 token address */\n token: Address\n }\n\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { token, ...rest } = parameters\n const call = claim.call({ token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `claimRewards` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const hash = await client.sendTransaction({\n * calls: [actions.reward.claim.call({\n * token: '0x20c0000000000000000000000000000000000001',\n * })],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token } = args\n return defineCall({\n address: token,\n abi: Abis.tip20,\n args: [],\n functionName: 'claimRewards',\n })\n }\n}\n\n/**\n * Claims accumulated rewards for a recipient and waits for confirmation.\n *\n * This function allows a reward recipient to claim their accumulated rewards\n * and receive them as token transfers to their own balance.\n *\n * Behavior:\n * - Accrues all pending rewards up to the current block timestamp.\n * - Updates the caller's reward accounting.\n * - Transfers the caller's accumulated `rewardBalance` from the token contract to the caller.\n * - If the contract's balance is insufficient, claims up to the available amount.\n *\n * Notes:\n * - Reverts with `Paused` if the token is paused.\n * - Reverts with `PolicyForbids` if the caller is not authorized to receive tokens under TIP-403.\n * - If opted in, the claimed amount is added back to `optedInSupply` since it goes to the recipient's balance.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const { receipt } = await Actions.reward.claimSync(client, {\n * token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The amount claimed and transaction receipt.\n */\nexport async function claimSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: claimSync.Parameters<chain, account>,\n): Promise<claimSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await claim.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n return {\n receipt,\n } as never\n}\n\nexport namespace claimSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & claim.Args\n\n export type ReturnValue = {\n /** The transaction receipt */\n receipt: Awaited<ReturnType<typeof writeContractSync>>\n }\n\n export type ErrorType = claim.ErrorType\n}\n\n/**\n * Distributes rewards to opted-in token holders.\n *\n * This function transfers `amount` of tokens from the caller into the token contract's\n * reward pool and immediately distributes them to current opted-in holders by increasing\n * `globalRewardPerToken`.\n *\n * Notes:\n * - Reverts with `InvalidAmount` if `amount == 0`.\n * - The transfer from caller to pool is subject to TIP-403 policy checks.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.reward.distribute(client, {\n * amount: 100000000000000000000n,\n * token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function distribute<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: distribute.Parameters<chain, account>,\n): Promise<distribute.ReturnValue> {\n return distribute.inner(writeContract, client, parameters)\n}\n\n/**\n * Distributes rewards to opted-in token holders and waits for confirmation.\n *\n * This function transfers `amount` of tokens from the caller into the token contract's\n * reward pool and immediately distributes them to current opted-in holders by increasing\n * `globalRewardPerToken`.\n *\n * Notes:\n * - Reverts with `InvalidAmount` if `amount == 0`.\n * - The transfer from caller to pool is subject to TIP-403 policy checks.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const { amount, funder, receipt } = await Actions.reward.distributeSync(client, {\n * amount: 100000000000000000000n,\n * token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The funder, amount, and transaction receipt.\n */\nexport async function distributeSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: distributeSync.Parameters<chain, account>,\n): Promise<distributeSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await distribute.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = distribute.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace distribute {\n export type Args = {\n /** The amount of tokens to distribute (must be > 0) */\n amount: bigint\n /** The TIP20 token address */\n token: Address\n }\n\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { amount, token, ...rest } = parameters\n const call = distribute.call({ amount, token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `distributeReward` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const hash = await client.sendTransaction({\n * calls: [actions.reward.distribute.call({\n * amount: 100000000000000000000n,\n * token: '0x20c0000000000000000000000000000000000001',\n * })],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { amount, token } = args\n return defineCall({\n address: token,\n abi: Abis.tip20,\n args: [amount],\n functionName: 'distributeReward',\n })\n }\n\n /**\n * Extracts the `RewardDistributed` event from logs.\n *\n * @param logs - The logs.\n * @returns The `RewardDistributed` event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'RewardDistributed',\n strict: true,\n })\n if (!log) throw new Error('`RewardDistributed` event not found.')\n return log\n }\n}\n\nexport declare namespace distributeSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & distribute.Args\n\n export type ReturnValue = {\n /** The amount distributed */\n amount: bigint\n /** The address that funded the distribution */\n funder: Address\n /** The transaction receipt */\n receipt: Awaited<ReturnType<typeof writeContractSync>>\n }\n\n export type ErrorType = distribute.ErrorType\n}\n\n/**\n * Gets the global reward per token value.\n *\n * Returns the current global reward per token value scaled by `ACC_PRECISION` (1e18).\n * This value increases each time rewards are distributed.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const rewardPerToken = await Actions.reward.getGlobalRewardPerToken(client, {\n * token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The global reward per token (scaled by 1e18).\n */\nexport async function getGlobalRewardPerToken<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getGlobalRewardPerToken.Parameters,\n): Promise<getGlobalRewardPerToken.ReturnValue> {\n return readContract(client, {\n ...parameters,\n ...getGlobalRewardPerToken.call(parameters),\n })\n}\n\nexport namespace getGlobalRewardPerToken {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** The TIP20 token address */\n token: Address\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.tip20,\n 'globalRewardPerToken',\n never\n >\n\n /**\n * Defines a call to the `globalRewardPerToken` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token } = args\n return defineCall({\n address: token,\n abi: Abis.tip20,\n args: [],\n functionName: 'globalRewardPerToken',\n })\n }\n}\n\n/**\n * Calculates the pending claimable rewards for an account without modifying state.\n *\n * Returns the total pending claimable reward amount, including stored balance and newly accrued rewards.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const pending = await Actions.reward.getPendingRewards(client, {\n * token: '0x20c0000000000000000000000000000000000001',\n * account: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The total pending claimable reward amount.\n */\nexport async function getPendingRewards<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getPendingRewards.Parameters,\n): Promise<getPendingRewards.ReturnValue> {\n return readContract(client, {\n ...parameters,\n ...getPendingRewards.call(parameters),\n })\n}\n\nexport namespace getPendingRewards {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** The account address to query pending rewards for */\n account: Address\n /** The TIP20 token address */\n token: Address\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.tip20,\n 'getPendingRewards',\n never\n >\n\n /**\n * Defines a call to the `getPendingRewards` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { account, token } = args\n return defineCall({\n address: token,\n abi: Abis.tip20,\n args: [account],\n functionName: 'getPendingRewards',\n })\n }\n}\n\n/**\n * Gets the reward information for a specific account.\n *\n * Returns the reward recipient address, reward per token value, and accumulated reward balance for the specified account.\n * This information includes:\n * - `rewardRecipient`: The address designated to receive rewards (zero address if opted out)\n * - `rewardPerToken`: The reward per token value for this account\n * - `rewardBalance`: The accumulated reward balance waiting to be claimed\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const info = await Actions.reward.getUserRewardInfo(client, {\n * token: '0x20c0000000000000000000000000000000000001',\n * account: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The user's reward information (recipient, rewardPerToken, rewardBalance).\n */\nexport async function getUserRewardInfo<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getUserRewardInfo.Parameters,\n): Promise<getUserRewardInfo.ReturnValue> {\n return readContract(client, {\n ...parameters,\n ...getUserRewardInfo.call(parameters),\n })\n}\n\nexport namespace getUserRewardInfo {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** The account address to query reward info for */\n account: Address\n /** The TIP20 token address */\n token: Address\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.tip20,\n 'userRewardInfo',\n never\n >\n\n /**\n * Defines a call to the `userRewardInfo` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { account, token } = args\n return defineCall({\n address: token,\n abi: Abis.tip20,\n args: [account],\n functionName: 'userRewardInfo',\n })\n }\n}\n\n/**\n * Sets or changes the reward recipient for a token holder.\n *\n * This function allows a token holder to designate who should receive their share of rewards:\n * - If `recipient` is the zero address, opts out from rewards distribution.\n * - Otherwise, opts in and sets `recipient` as the address that will receive accrued rewards.\n * - Can be called with `recipient == msg.sender` to receive rewards directly.\n * - Automatically distributes any accrued rewards to the current recipient before changing.\n *\n * TIP-403 Policy:\n * - Reverts with `PolicyForbids` if `recipient` is not the zero address and either the holder or recipient is not authorized to receive tokens under the token's transfer policy.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hash = await Actions.reward.setRecipient(client, {\n * recipient: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n * token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function setRecipient<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setRecipient.Parameters<chain, account>,\n): Promise<setRecipient.ReturnValue> {\n return setRecipient.inner(writeContract, client, parameters)\n}\n\n/**\n * Sets or changes the reward recipient for a token holder and waits for confirmation.\n *\n * This function allows a token holder to designate who should receive their share of rewards:\n * - If `recipient` is the zero address, opts out from rewards distribution.\n * - Otherwise, opts in and sets `recipient` as the address that will receive accrued rewards.\n * - Can be called with `recipient == msg.sender` to receive rewards directly.\n * - Automatically distributes any accrued rewards to the current recipient before changing.\n *\n * TIP-403 Policy:\n * - Reverts with `PolicyForbids` if `recipient` is not the zero address and either the holder or recipient is not authorized to receive tokens under the token's transfer policy.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const { holder, recipient, receipt } = await Actions.reward.setRecipientSync(client, {\n * recipient: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n * token: '0x20c0000000000000000000000000000000000001',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The holder, recipient, and transaction receipt.\n */\nexport async function setRecipientSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setRecipientSync.Parameters<chain, account>,\n): Promise<setRecipientSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await setRecipient.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = setRecipient.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace setRecipient {\n export type Args = {\n /** The reward recipient address (use zero address to opt out of rewards) */\n recipient: Address\n /** The TIP20 token address */\n token: Address\n }\n\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { recipient, token, ...rest } = parameters\n const call = setRecipient.call({ recipient, token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `setRewardRecipient` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const hash = await client.sendTransaction({\n * calls: [actions.reward.setRecipient.call({\n * recipient: '0xa5cc3c03994DB5b0d9A5eEdD10CabaB0813678AC',\n * token: '0x20c0000000000000000000000000000000000001',\n * })],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { recipient, token } = args\n return defineCall({\n address: token,\n abi: Abis.tip20,\n args: [recipient],\n functionName: 'setRewardRecipient',\n })\n }\n\n /**\n * Extracts the `RewardRecipientSet` event from logs.\n *\n * @param logs - The logs.\n * @returns The `RewardRecipientSet` event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'RewardRecipientSet',\n strict: true,\n })\n if (!log) throw new Error('`RewardRecipientSet` event not found.')\n return log\n }\n}\n\nexport declare namespace setRecipientSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & setRecipient.Args\n\n export type ReturnValue = {\n /** The token holder address who set their reward recipient */\n holder: Address\n /** The transaction receipt */\n receipt: Awaited<ReturnType<typeof writeContractSync>>\n /** The reward recipient address (zero address indicates opt-out) */\n recipient: Address\n }\n\n export type ErrorType = setRecipient.ErrorType\n}\n\n/**\n * Watches for reward distributed events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = Actions.reward.watchRewardDistributed(client, {\n * token: '0x20c0000000000000000000000000000000000001',\n * onRewardDistributed: (args, log) => {\n * console.log('Reward distributed:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchRewardDistributed<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchRewardDistributed.Parameters,\n) {\n const { onRewardDistributed, token, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: token,\n abi: Abis.tip20,\n eventName: 'RewardDistributed',\n onLogs: (logs) => {\n for (const log of logs) onRewardDistributed(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchRewardDistributed {\n export type Args = GetEventArgs<\n typeof Abis.tip20,\n 'RewardDistributed',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip20, 'RewardDistributed'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.tip20, 'RewardDistributed', true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when rewards are distributed. */\n onRewardDistributed: (args: Args, log: Log) => void\n /** The TIP20 token address */\n token: Address\n }\n\n export type ReturnValue = WatchContractEventReturnType\n}\n\n/**\n * Watches for reward recipient set events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = Actions.reward.watchRewardRecipientSet(client, {\n * token: '0x20c0000000000000000000000000000000000001',\n * onRewardRecipientSet: (args, log) => {\n * console.log('Reward recipient set:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchRewardRecipientSet<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchRewardRecipientSet.Parameters,\n) {\n const { onRewardRecipientSet, token, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: token,\n abi: Abis.tip20,\n eventName: 'RewardRecipientSet',\n onLogs: (logs) => {\n for (const log of logs) onRewardRecipientSet(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchRewardRecipientSet {\n export type Args = GetEventArgs<\n typeof Abis.tip20,\n 'RewardRecipientSet',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip20, 'RewardRecipientSet'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.tip20, 'RewardRecipientSet', true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a reward recipient is set. */\n onRewardRecipientSet: (args: Args, log: Log) => void\n /** The TIP20 token address */\n token: Address\n }\n\n export type ReturnValue = WatchContractEventReturnType\n}\n","import type { Address } from 'abitype'\nimport * as Hex from 'ox/Hex'\nimport { TokenId, TokenRole } from 'ox/tempo'\nimport type { Account } from '../../accounts/types.js'\nimport { parseAccount } from '../../accounts/utils/parseAccount.js'\nimport { multicall } from '../../actions/public/multicall.js'\nimport type { ReadContractReturnType } from '../../actions/public/readContract.js'\nimport { readContract } from '../../actions/public/readContract.js'\nimport type {\n WatchContractEventParameters,\n WatchContractEventReturnType,\n} from '../../actions/public/watchContractEvent.js'\nimport { watchContractEvent } from '../../actions/public/watchContractEvent.js'\nimport { sendTransaction } from '../../actions/wallet/sendTransaction.js'\nimport {\n type SendTransactionSyncParameters,\n sendTransactionSync,\n} from '../../actions/wallet/sendTransactionSync.js'\nimport type { WriteContractReturnType } from '../../actions/wallet/writeContract.js'\nimport { writeContract } from '../../actions/wallet/writeContract.js'\nimport { writeContractSync } from '../../actions/wallet/writeContractSync.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseErrorType } from '../../errors/base.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { ExtractAbiItem, GetEventArgs } from '../../types/contract.js'\nimport type { Log, Log as viem_Log } from '../../types/log.js'\nimport type { Compute, OneOf, UnionOmit } from '../../types/utils.js'\nimport { encodeFunctionData } from '../../utils/abi/encodeFunctionData.js'\nimport { parseEventLogs } from '../../utils/abi/parseEventLogs.js'\nimport * as Abis from '../Abis.js'\nimport * as Addresses from '../Addresses.js'\nimport type {\n GetAccountParameter,\n ReadParameters,\n WriteParameters,\n} from '../internal/types.js'\nimport { defineCall } from '../internal/utils.js'\nimport type { TransactionReceipt } from '../Transaction.js'\n\n/**\n * Approves a spender to transfer TIP20 tokens on behalf of the caller.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.approve(client, {\n * spender: '0x...',\n * amount: 100n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function approve<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: approve.Parameters<chain, account>,\n): Promise<approve.ReturnValue> {\n const { token, ...rest } = parameters\n return approve.inner(writeContract, client, parameters, { ...rest, token })\n}\n\nexport namespace approve {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Amount of tokens to approve. */\n amount: bigint\n /** Address of the spender. */\n spender: Address\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: approve.Parameters<chain, account>,\n args: Args,\n ): Promise<ReturnType<action>> {\n const call = approve.call(args)\n return (await action(client, {\n ...parameters,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `approve` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.approve.call({\n * spender: '0x20c0...beef',\n * amount: 100n,\n * token: '0x20c0...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { spender, amount, token } = args\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'approve',\n args: [spender, amount],\n })\n }\n\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'Approval',\n })\n if (!log) throw new Error('`Approval` event not found.')\n return log\n }\n}\n\n/**\n * Approves a spender to transfer TIP20 tokens on behalf of the caller.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.approveSync(client, {\n * spender: '0x...',\n * amount: 100n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function approveSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: approveSync.Parameters<chain, account>,\n): Promise<approveSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await approve.inner(\n writeContractSync,\n client,\n { ...parameters, throwOnReceiptRevert } as never,\n rest,\n )\n const { args } = approve.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace approveSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = approve.Parameters<chain, account>\n\n export type Args = approve.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.tip20,\n 'Approval',\n {\n IndexedOnly: false\n Required: true\n }\n > & {\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Burns TIP20 tokens from a blocked address.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.burnBlocked(client, {\n * from: '0x...',\n * amount: 100n,\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function burnBlocked<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: burnBlocked.Parameters<chain, account>,\n): Promise<burnBlocked.ReturnValue> {\n return burnBlocked.inner(writeContract, client, parameters)\n}\n\nexport namespace burnBlocked {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Amount of tokens to burn. */\n amount: bigint\n /** Address to burn tokens from. */\n from: Address\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: burnBlocked.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { amount, from, token, ...rest } = parameters\n const call = burnBlocked.call({ amount, from, token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `burnBlocked` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.burnBlocked.call({\n * from: '0x20c0...beef',\n * amount: 100n,\n * token: '0x20c0...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { from, amount, token } = args\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'burnBlocked',\n args: [from, amount],\n })\n }\n\n /**\n * Extracts the event from the logs.\n *\n * @param logs - Logs.\n * @returns The event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'BurnBlocked',\n })\n if (!log) throw new Error('`BurnBlocked` event not found.')\n return log\n }\n}\n\n/**\n * Burns TIP20 tokens from a blocked address.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.burnBlockedSync(client, {\n * from: '0x...',\n * amount: 100n,\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function burnBlockedSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: burnBlockedSync.Parameters<chain, account>,\n): Promise<burnBlockedSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await burnBlocked.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = burnBlocked.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace burnBlockedSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = burnBlocked.Parameters<chain, account>\n\n export type Args = burnBlocked.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.tip20,\n 'BurnBlocked',\n {\n IndexedOnly: false\n Required: true\n }\n > & {\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Burns TIP20 tokens from the caller's balance.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.burn(client, {\n * amount: 100n,\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function burn<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: burn.Parameters<chain, account>,\n): Promise<burn.ReturnValue> {\n return burn.inner(writeContract, client, parameters)\n}\n\nexport namespace burn {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Amount of tokens to burn. */\n amount: bigint\n /** Memo to include in the transfer. */\n memo?: Hex.Hex | undefined\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: burn.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { amount, memo, token, ...rest } = parameters\n const call = burn.call({ amount, memo, token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `burn` or `burnWithMemo` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.burn.call({\n * amount: 100n,\n * token: '0x20c0...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { amount, memo, token } = args\n const callArgs = memo\n ? ({\n functionName: 'burnWithMemo',\n args: [amount, Hex.padLeft(memo, 32)],\n } as const)\n : ({\n functionName: 'burn',\n args: [amount],\n } as const)\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n ...callArgs,\n })\n }\n\n /**\n * Extracts the event from the logs.\n *\n * @param logs - Logs.\n * @returns The event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'Burn',\n })\n if (!log) throw new Error('`Burn` event not found.')\n return log\n }\n}\n\n/**\n * Burns TIP20 tokens from the caller's balance.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.burnSync(client, {\n * amount: 100n,\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function burnSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: burnSync.Parameters<chain, account>,\n): Promise<burnSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await burn.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = burn.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace burnSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = burn.Parameters<chain, account>\n\n export type Args = burn.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.tip20,\n 'Burn',\n {\n IndexedOnly: false\n Required: true\n }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Changes the transfer policy ID for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.changeTransferPolicy(client, {\n * token: '0x...',\n * policyId: 1n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function changeTransferPolicy<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: changeTransferPolicy.Parameters<chain, account>,\n): Promise<changeTransferPolicy.ReturnValue> {\n return changeTransferPolicy.inner(writeContract, client, parameters)\n}\n\nexport namespace changeTransferPolicy {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** New transfer policy ID. */\n policyId: bigint\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: changeTransferPolicy.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { policyId, token, ...rest } = parameters\n const call = changeTransferPolicy.call({ policyId, token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `changeTransferPolicyId` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.changeTransferPolicy.call({\n * token: '0x20c0...babe',\n * policyId: 1n,\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token, policyId } = args\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'changeTransferPolicyId',\n args: [policyId],\n })\n }\n\n /**\n * Extracts the event from the logs.\n *\n * @param logs - Logs.\n * @returns The event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'TransferPolicyUpdate',\n })\n if (!log) throw new Error('`TransferPolicyUpdate` event not found.')\n return log\n }\n}\n\n/**\n * Changes the transfer policy ID for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.changeTransferPolicySync(client, {\n * token: '0x...',\n * policyId: 1n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function changeTransferPolicySync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: changeTransferPolicySync.Parameters<chain, account>,\n): Promise<changeTransferPolicySync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await changeTransferPolicy.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = changeTransferPolicy.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace changeTransferPolicySync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = changeTransferPolicy.Parameters<chain, account>\n\n export type Args = changeTransferPolicy.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.tip20,\n 'TransferPolicyUpdate',\n {\n IndexedOnly: false\n Required: true\n }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Creates a new TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.create(client, {\n * name: 'My Token',\n * symbol: 'MTK',\n * currency: 'USD',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function create<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: create.Parameters<chain, account>,\n): Promise<create.ReturnValue> {\n return create.inner(writeContract, client, parameters)\n}\n\nexport namespace create {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> &\n Omit<Args, 'admin'> &\n (account extends Account\n ? { admin?: Account | Address | undefined }\n : { admin: Account | Address })\n\n export type Args = {\n /** Admin address. */\n admin: Address\n /** Currency (e.g. \"USD\"). */\n currency: string\n /** Token name. */\n name: string\n /** Quote token. */\n quoteToken?: TokenId.TokenIdOrAddress | undefined\n /** Unique salt. @default Hex.random(32) */\n salt?: Hex.Hex | undefined\n /** Token symbol. */\n symbol: string\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: any,\n ): Promise<ReturnType<action>> {\n const {\n account = client.account,\n admin: admin_ = client.account,\n chain = client.chain,\n ...rest\n } = parameters\n const admin = admin_ ? parseAccount(admin_) : undefined\n if (!admin) throw new Error('admin is required.')\n\n const call = create.call({ ...rest, admin: admin.address })\n\n return (await action(\n client as never,\n {\n ...parameters,\n account,\n chain,\n ...call,\n } as never,\n )) as never\n }\n\n /**\n * Defines a call to the `createToken` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.create.call({\n * name: 'My Token',\n * symbol: 'MTK',\n * currency: 'USD',\n * admin: '0xfeed...fede',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const {\n name,\n symbol,\n currency,\n quoteToken = Addresses.pathUsd,\n admin,\n salt = Hex.random(32),\n } = args\n return defineCall({\n address: Addresses.tip20Factory,\n abi: Abis.tip20Factory,\n args: [\n name,\n symbol,\n currency,\n TokenId.toAddress(quoteToken),\n admin,\n salt,\n ],\n functionName: 'createToken',\n })\n }\n\n /**\n * Extracts the `TokenCreated` event from logs.\n *\n * @param logs - The logs.\n * @returns The `TokenCreated` event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20Factory,\n logs,\n eventName: 'TokenCreated',\n strict: true,\n })\n if (!log) throw new Error('`TokenCreated` event not found.')\n return log\n }\n}\n\n/**\n * Creates a new TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.createSync(client, {\n * name: 'My Token',\n * symbol: 'MTK',\n * currency: 'USD',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function createSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: createSync.Parameters<chain, account>,\n): Promise<createSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await create.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n\n const { args } = create.extractEvent(receipt.logs)\n const tokenId = TokenId.fromAddress(args.token)\n\n return {\n ...args,\n receipt,\n tokenId,\n } as never\n}\n\nexport namespace createSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = create.Parameters<chain, account>\n\n export type Args = create.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.tip20Factory,\n 'TokenCreated',\n { IndexedOnly: false; Required: true }\n > & {\n /** Token ID. */\n tokenId: TokenId.TokenId\n /** Transaction receipt. */\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Gets TIP20 token allowance.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const allowance = await Actions.token.getAllowance(client, {\n * spender: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The token allowance.\n */\nexport async function getAllowance<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: getAllowance.Parameters<account>,\n): Promise<getAllowance.ReturnValue> {\n const { account = client.account } = parameters\n const address = account ? parseAccount(account).address : undefined\n if (!address) throw new Error('account is required.')\n return readContract(client, {\n ...parameters,\n ...getAllowance.call({ ...parameters, account: address }),\n })\n}\n\nexport namespace getAllowance {\n export type Parameters<\n account extends Account | undefined = Account | undefined,\n > = ReadParameters & GetAccountParameter<account> & Omit<Args, 'account'> & {}\n\n export type Args = {\n /** Account address. */\n account: Address\n /** Address of the spender. */\n spender: Address\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.tip20,\n 'allowance',\n never\n >\n\n /**\n * Defines a call to the `allowance` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { account, spender, token } = args\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'allowance',\n args: [account, spender],\n })\n }\n}\n\n/**\n * Gets TIP20 token balance for an address.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const balance = await Actions.token.getBalance(client, {\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The token balance.\n */\nexport async function getBalance<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: getBalance.Parameters<account>,\n): Promise<getBalance.ReturnValue> {\n const { account = client.account, ...rest } = parameters\n const address = account ? parseAccount(account).address : undefined\n if (!address) throw new Error('account is required.')\n return readContract(client, {\n ...rest,\n ...getBalance.call({ account: address, ...rest }),\n })\n}\n\nexport namespace getBalance {\n export type Parameters<\n account extends Account | undefined = Account | undefined,\n > = ReadParameters & GetAccountParameter<account> & Omit<Args, 'account'>\n\n export type Args = {\n /** Account address. */\n account: Address\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.tip20,\n 'balanceOf',\n never\n >\n\n /**\n * Defines a call to the `balanceOf` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { account, token } = args\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'balanceOf',\n args: [account],\n })\n }\n}\n\n/**\n * Gets TIP20 token metadata including name, symbol, currency, decimals, and total supply.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const metadata = await Actions.token.getMetadata(client, {\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The token metadata.\n */\nexport async function getMetadata<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getMetadata.Parameters,\n): Promise<getMetadata.ReturnValue> {\n const { token, ...rest } = parameters\n const address = TokenId.toAddress(token)\n const abi = Abis.tip20\n\n if (TokenId.from(token) === TokenId.fromAddress(Addresses.pathUsd))\n return multicall(client, {\n ...rest,\n contracts: [\n {\n address,\n abi,\n functionName: 'currency',\n },\n {\n address,\n abi,\n functionName: 'decimals',\n },\n {\n address,\n abi,\n functionName: 'name',\n },\n {\n address,\n abi,\n functionName: 'symbol',\n },\n {\n address,\n abi,\n functionName: 'totalSupply',\n },\n ] as const,\n allowFailure: false,\n deployless: true,\n }).then(([currency, decimals, name, symbol, totalSupply]) => ({\n name,\n symbol,\n currency,\n decimals,\n totalSupply,\n }))\n\n return multicall(client, {\n ...rest,\n contracts: [\n {\n address,\n abi,\n functionName: 'currency',\n },\n {\n address,\n abi,\n functionName: 'decimals',\n },\n {\n address,\n abi,\n functionName: 'quoteToken',\n },\n {\n address,\n abi,\n functionName: 'name',\n },\n {\n address,\n abi,\n functionName: 'paused',\n },\n {\n address,\n abi,\n functionName: 'supplyCap',\n },\n {\n address,\n abi,\n functionName: 'symbol',\n },\n {\n address,\n abi,\n functionName: 'totalSupply',\n },\n {\n address,\n abi,\n functionName: 'transferPolicyId',\n },\n ] as const,\n allowFailure: false,\n deployless: true,\n }).then(\n ([\n currency,\n decimals,\n quoteToken,\n name,\n paused,\n supplyCap,\n symbol,\n totalSupply,\n transferPolicyId,\n ]) => ({\n name,\n symbol,\n currency,\n decimals,\n quoteToken,\n totalSupply,\n paused,\n supplyCap,\n transferPolicyId,\n }),\n )\n}\n\nexport declare namespace getMetadata {\n export type Parameters = {\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = Compute<{\n /**\n * Currency (e.g. \"USD\").\n */\n currency: string\n /**\n * Decimals of the token.\n */\n decimals: number\n /**\n * Quote token.\n *\n * Returns `undefined` for the default quote token (`0x20c...0000`).\n */\n quoteToken?: Address | undefined\n /**\n * Name of the token.\n */\n name: string\n /**\n * Whether the token is paused.\n *\n * Returns `undefined` for the default quote token (`0x20c...0000`).\n */\n paused?: boolean | undefined\n /**\n * Supply cap.\n *\n * Returns `undefined` for the default quote token (`0x20c...0000`).\n */\n supplyCap?: bigint | undefined\n /**\n * Symbol of the token.\n */\n symbol: string\n /**\n * Total supply of the token.\n */\n totalSupply: bigint\n /**\n * Transfer policy ID.\n * 0=\"always-reject\", 1=\"always-allow\", >2=custom policy\n *\n * Returns `undefined` for the default quote token (`0x20c...0000`).\n */\n transferPolicyId?: bigint | undefined\n }>\n}\n\n/**\n * Gets the admin role for a specific role in a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const adminRole = await Actions.token.getRoleAdmin(client, {\n * role: 'issuer',\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The admin role hash.\n */\nexport async function getRoleAdmin<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n parameters: getRoleAdmin.Parameters,\n): Promise<getRoleAdmin.ReturnValue> {\n return readContract(client, {\n ...parameters,\n ...getRoleAdmin.call(parameters),\n })\n}\n\nexport namespace getRoleAdmin {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Role to get admin for. */\n role: TokenRole.TokenRole\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.tip20,\n 'getRoleAdmin',\n never\n >\n\n /**\n * Defines a call to the `getRoleAdmin` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { role, token } = args\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'getRoleAdmin',\n args: [TokenRole.serialize(role)],\n })\n }\n}\n\n/**\n * Checks if an account has a specific role for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const hasRole = await Actions.token.hasRole(client, {\n * account: '0x...',\n * role: 'issuer',\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns Whether the account has the role.\n */\nexport async function hasRole<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: hasRole.Parameters<account>,\n): Promise<hasRole.ReturnValue> {\n const { account = client.account } = parameters\n const address = account ? parseAccount(account).address : undefined\n if (!address) throw new Error('account is required.')\n return readContract(client, {\n ...parameters,\n ...hasRole.call({ ...parameters, account: address }),\n })\n}\n\nexport namespace hasRole {\n export type Parameters<\n account extends Account | undefined = Account | undefined,\n > = ReadParameters & Omit<Args, 'account'> & GetAccountParameter<account>\n\n export type Args = {\n /** Account address to check. */\n account: Address\n /** Role to check. */\n role: TokenRole.TokenRole\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.tip20,\n 'hasRole',\n never\n >\n\n /**\n * Defines a call to the `hasRole` function.\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { account, role, token } = args\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'hasRole',\n args: [account, TokenRole.serialize(role)],\n })\n }\n}\n\n/**\n * Grants a role for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.grantRoles(client, {\n * token: '0x...',\n * to: '0x...',\n * roles: ['issuer'],\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function grantRoles<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: grantRoles.Parameters<chain, account>,\n): Promise<grantRoles.ReturnValue> {\n return grantRoles.inner(sendTransaction, client, parameters)\n}\n\nexport namespace grantRoles {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> &\n Omit<Args, 'role'> & {\n /** Role to grant. */\n roles: readonly TokenRole.TokenRole[]\n }\n\n export type Args = {\n /** Role to grant. */\n role: TokenRole.TokenRole\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n /** Address to grant the role to. */\n to: Address\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof sendTransaction | typeof sendTransactionSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: grantRoles.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n return (await action(client, {\n ...parameters,\n calls: parameters.roles.map((role) => {\n const call = grantRoles.call({ ...parameters, role })\n return {\n ...call,\n data: encodeFunctionData(call),\n }\n }),\n } as never)) as never\n }\n\n /**\n * Defines a call to the `grantRole` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.grantRoles.call({\n * token: '0x20c0...babe',\n * to: '0x20c0...beef',\n * role: 'issuer',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token, to, role } = args\n const roleHash = TokenRole.serialize(role)\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'grantRole',\n args: [roleHash, to],\n })\n }\n\n /**\n * Extracts the events from the logs.\n *\n * @param logs - Logs.\n * @returns The events.\n */\n export function extractEvents(logs: Log[]) {\n const events = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'RoleMembershipUpdated',\n })\n if (events.length === 0)\n throw new Error('`RoleMembershipUpdated` events not found.')\n return events\n }\n}\n\n/**\n * Grants a role for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.grantRolesSync(client, {\n * token: '0x...',\n * to: '0x...',\n * roles: ['issuer'],\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function grantRolesSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: grantRolesSync.Parameters<chain, account>,\n): Promise<grantRolesSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await grantRoles.inner(sendTransactionSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const events = grantRoles.extractEvents(receipt.logs)\n const value = events.map((event) => event.args)\n return {\n receipt,\n value,\n }\n}\n\nexport namespace grantRolesSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = grantRoles.Parameters<chain, account>\n\n export type Args = grantRoles.Args\n\n export type ReturnValue = {\n receipt: TransactionReceipt\n value: readonly GetEventArgs<\n typeof Abis.tip20,\n 'RoleMembershipUpdated',\n { IndexedOnly: false; Required: true }\n >[]\n }\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Mints TIP20 tokens to an address.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.mint(client, {\n * to: '0x...',\n * amount: 100n,\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function mint<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: mint.Parameters<chain, account>,\n): Promise<mint.ReturnValue> {\n return mint.inner(writeContract, client, parameters)\n}\n\nexport namespace mint {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Amount of tokens to mint. */\n amount: bigint\n /** Memo to include in the mint. */\n memo?: Hex.Hex | undefined\n /** Address to mint tokens to. */\n to: Address\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: any,\n ): Promise<ReturnType<action>> {\n const call = mint.call(parameters)\n return (await action(client, {\n ...parameters,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `mint` or `mintWithMemo` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.mint.call({\n * to: '0x20c0...beef',\n * amount: 100n,\n * token: '0x20c0...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { to, amount, memo, token } = args\n const callArgs = memo\n ? ({\n functionName: 'mintWithMemo',\n args: [to, amount, Hex.padLeft(memo, 32)],\n } as const)\n : ({\n functionName: 'mint',\n args: [to, amount],\n } as const)\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n ...callArgs,\n })\n }\n\n /**\n * Extracts the event from the logs.\n *\n * @param logs - Logs.\n * @returns The event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'Mint',\n })\n if (!log) throw new Error('`Mint` event not found.')\n return log\n }\n}\n\n/**\n * Mints TIP20 tokens to an address.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.mintSync(client, {\n * to: '0x...',\n * amount: 100n,\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function mintSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: mintSync.Parameters<chain, account>,\n): Promise<mintSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await mint.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = mint.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace mintSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = mint.Parameters<chain, account>\n\n export type Args = mint.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.tip20,\n 'Mint',\n {\n IndexedOnly: false\n Required: true\n }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Pauses a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.pause(client, {\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function pause<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: pause.Parameters<chain, account>,\n): Promise<pause.ReturnValue> {\n return pause.inner(writeContract, client, parameters)\n}\n\nexport namespace pause {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: pause.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { token, ...rest } = parameters\n const call = pause.call({ token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `pause` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.pause.call({\n * token: '0x20c0...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token } = args\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'pause',\n args: [],\n })\n }\n\n /**\n * Extracts the event from the logs.\n *\n * @param logs - Logs.\n * @returns The event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'PauseStateUpdate',\n })\n if (!log) throw new Error('`PauseStateUpdate` event not found.')\n return log\n }\n}\n\n/**\n * Pauses a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.pauseSync(client, {\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function pauseSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: pauseSync.Parameters<chain, account>,\n): Promise<pauseSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await pause.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = pause.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n }\n}\n\nexport namespace pauseSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = pause.Parameters<chain, account>\n\n export type Args = pause.Args\n\n export type ReturnValue = GetEventArgs<\n typeof Abis.tip20,\n 'PauseStateUpdate',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Renounces a role for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.renounceRoles(client, {\n * token: '0x...',\n * roles: ['issuer'],\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function renounceRoles<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: renounceRoles.Parameters<chain, account>,\n): Promise<renounceRoles.ReturnValue> {\n return renounceRoles.inner(sendTransaction, client, parameters)\n}\n\nexport namespace renounceRoles {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> &\n Omit<Args, 'role'> & {\n /** Roles to renounce. */\n roles: readonly TokenRole.TokenRole[]\n }\n\n export type Args = {\n /** Role to renounce. */\n role: TokenRole.TokenRole\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof sendTransaction | typeof sendTransactionSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: renounceRoles.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n return (await action(client, {\n ...parameters,\n calls: parameters.roles.map((role) => {\n const call = renounceRoles.call({ ...parameters, role })\n return {\n ...call,\n data: encodeFunctionData(call),\n }\n }),\n } as never)) as never\n }\n\n /**\n * Defines a call to the `renounceRole` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.renounceRoles.call({\n * token: '0x20c0...babe',\n * role: 'issuer',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token, role } = args\n const roleHash = TokenRole.serialize(role)\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'renounceRole',\n args: [roleHash],\n })\n }\n\n /**\n * Extracts the events from the logs.\n *\n * @param logs - Logs.\n * @returns The events.\n */\n export function extractEvents(logs: Log[]) {\n const events = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'RoleMembershipUpdated',\n })\n if (events.length === 0)\n throw new Error('`RoleMembershipUpdated` events not found.')\n return events\n }\n}\n\n/**\n * Renounces a role for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.renounceRolesSync(client, {\n * token: '0x...',\n * roles: ['issuer'],\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function renounceRolesSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: renounceRolesSync.Parameters<chain, account>,\n): Promise<renounceRolesSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await renounceRoles.inner(sendTransactionSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const events = renounceRoles.extractEvents(receipt.logs)\n const value = events.map((event) => event.args)\n return {\n receipt,\n value,\n }\n}\n\nexport namespace renounceRolesSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = renounceRoles.Parameters<chain, account>\n\n export type Args = renounceRoles.Args\n\n export type ReturnValue = {\n receipt: TransactionReceipt\n value: readonly GetEventArgs<\n typeof Abis.tip20,\n 'RoleMembershipUpdated',\n { IndexedOnly: false; Required: true }\n >[]\n }\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Revokes a role for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.revokeRoles(client, {\n * token: '0x...',\n * from: '0x...',\n * roles: ['issuer'],\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function revokeRoles<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: revokeRoles.Parameters<chain, account>,\n): Promise<revokeRoles.ReturnValue> {\n return revokeRoles.inner(sendTransaction, client, parameters)\n}\n\nexport namespace revokeRoles {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = SendTransactionSyncParameters<chain, account> &\n Omit<Args, 'role'> & {\n /** Role to revoke. */\n roles: readonly TokenRole.TokenRole[]\n }\n\n export type Args = {\n /** Address to revoke the role from. */\n from: Address\n /** Role to revoke. */\n role: TokenRole.TokenRole\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof sendTransaction | typeof sendTransactionSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: revokeRoles.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n return (await action(client, {\n ...parameters,\n calls: parameters.roles.map((role) => {\n const call = revokeRoles.call({ ...parameters, role })\n return {\n ...call,\n data: encodeFunctionData(call),\n }\n }),\n } as never)) as never\n }\n\n /**\n * Defines a call to the `revokeRole` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.revokeRoles.call({\n * token: '0x20c0...babe',\n * from: '0x20c0...beef',\n * role: 'issuer',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token, from, role } = args\n const roleHash = TokenRole.serialize(role)\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'revokeRole',\n args: [roleHash, from],\n })\n }\n\n /**\n * Extracts the events from the logs.\n *\n * @param logs - Logs.\n * @returns The events.\n */\n export function extractEvents(logs: Log[]) {\n const events = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'RoleMembershipUpdated',\n })\n if (events.length === 0)\n throw new Error('`RoleMembershipUpdated` events not found.')\n return events\n }\n}\n\n/**\n * Revokes a role for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.revokeRolesSync(client, {\n * token: '0x...',\n * from: '0x...',\n * roles: ['issuer'],\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function revokeRolesSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: revokeRolesSync.Parameters<chain, account>,\n): Promise<revokeRolesSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await revokeRoles.inner(sendTransactionSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const events = revokeRoles.extractEvents(receipt.logs)\n const value = events.map((event) => event.args)\n return {\n receipt,\n value,\n }\n}\n\nexport namespace revokeRolesSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = revokeRoles.Parameters<chain, account>\n\n export type Args = revokeRoles.Args\n\n export type ReturnValue = {\n receipt: TransactionReceipt\n value: readonly GetEventArgs<\n typeof Abis.tip20,\n 'RoleMembershipUpdated',\n { IndexedOnly: false; Required: true }\n >[]\n }\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Sets the supply cap for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.setSupplyCap(client, {\n * token: '0x...',\n * supplyCap: 1000000n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function setSupplyCap<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setSupplyCap.Parameters<chain, account>,\n): Promise<setSupplyCap.ReturnValue> {\n return setSupplyCap.inner(writeContract, client, parameters)\n}\n\nexport namespace setSupplyCap {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** New supply cap. */\n supplyCap: bigint\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: setSupplyCap.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { supplyCap, token, ...rest } = parameters\n const call = setSupplyCap.call({ supplyCap, token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `setSupplyCap` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.setSupplyCap.call({\n * token: '0x20c0...babe',\n * supplyCap: 1000000n,\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token, supplyCap } = args\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'setSupplyCap',\n args: [supplyCap],\n })\n }\n\n /**\n * Extracts the event from the logs.\n *\n * @param logs - Logs.\n * @returns The event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'SupplyCapUpdate',\n })\n if (!log) throw new Error('`SupplyCapUpdate` event not found.')\n return log\n }\n}\n\n/**\n * Sets the supply cap for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.setSupplyCapSync(client, {\n * token: '0x...',\n * supplyCap: 1000000n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function setSupplyCapSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setSupplyCapSync.Parameters<chain, account>,\n): Promise<setSupplyCapSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await setSupplyCap.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = setSupplyCap.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace setSupplyCapSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = setSupplyCap.Parameters<chain, account>\n\n export type Args = setSupplyCap.Args\n\n export type ReturnValue = GetEventArgs<\n typeof Abis.tip20,\n 'SupplyCapUpdate',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Sets the admin role for a specific role in a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.setRoleAdmin(client, {\n * token: '0x...',\n * role: 'issuer',\n * adminRole: 'admin',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function setRoleAdmin<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setRoleAdmin.Parameters<chain, account>,\n): Promise<setRoleAdmin.ReturnValue> {\n return setRoleAdmin.inner(writeContract, client, parameters)\n}\n\nexport namespace setRoleAdmin {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** New admin role. */\n adminRole: TokenRole.TokenRole\n /** Role to set admin for. */\n role: TokenRole.TokenRole\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: setRoleAdmin.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { adminRole, role, token, ...rest } = parameters\n const call = setRoleAdmin.call({ adminRole, role, token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `setRoleAdmin` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.setRoleAdmin.call({\n * token: '0x20c0...babe',\n * role: 'issuer',\n * adminRole: 'admin',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token, role, adminRole } = args\n const roleHash = TokenRole.serialize(role)\n const adminRoleHash = TokenRole.serialize(adminRole)\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'setRoleAdmin',\n args: [roleHash, adminRoleHash],\n })\n }\n\n /**\n * Extracts the event from the logs.\n *\n * @param logs - Logs.\n * @returns The event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'RoleAdminUpdated',\n })\n if (!log) throw new Error('`RoleAdminUpdated` event not found.')\n return log\n }\n}\n\n/**\n * Sets the admin role for a specific role in a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.setRoleAdminSync(client, {\n * token: '0x...',\n * role: 'issuer',\n * adminRole: 'admin',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function setRoleAdminSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setRoleAdminSync.Parameters<chain, account>,\n): Promise<setRoleAdminSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await setRoleAdmin.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = setRoleAdmin.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace setRoleAdminSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = setRoleAdmin.Parameters<chain, account>\n\n export type Args = setRoleAdmin.Args\n\n export type ReturnValue = GetEventArgs<\n typeof Abis.tip20,\n 'RoleAdminUpdated',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Transfers TIP20 tokens to another address.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.transfer(client, {\n * to: '0x...',\n * amount: 100n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function transfer<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: transfer.Parameters<chain, account>,\n): Promise<transfer.ReturnValue> {\n return transfer.inner(writeContract, client, parameters)\n}\n\nexport namespace transfer {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Amount of tokens to transfer. */\n amount: bigint\n /** Address to transfer tokens from. */\n from?: Address | undefined\n /** Memo to include in the transfer. */\n memo?: Hex.Hex | undefined\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n /** Address to transfer tokens to. */\n to: Address\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: transfer.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { amount, from, memo, token, to, ...rest } = parameters\n const call = transfer.call({ amount, from, memo, token, to })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `transfer`, `transferFrom`, `transferWithMemo`, or `transferFromWithMemo` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.transfer.call({\n * to: '0x20c0...beef',\n * amount: 100n,\n * token: '0x20c0...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { amount, from, memo, token, to } = args\n const callArgs = (() => {\n if (memo && from)\n return {\n functionName: 'transferFromWithMemo',\n args: [from, to, amount, Hex.padLeft(memo, 32)],\n } as const\n if (memo)\n return {\n functionName: 'transferWithMemo',\n args: [to, amount, Hex.padLeft(memo, 32)],\n } as const\n if (from)\n return {\n functionName: 'transferFrom',\n args: [from, to, amount],\n } as const\n return {\n functionName: 'transfer',\n args: [to, amount],\n } as const\n })()\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n ...callArgs,\n })\n }\n\n /**\n * Extracts the event from the logs.\n *\n * @param logs - Logs.\n * @returns The event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'Transfer',\n })\n if (!log) throw new Error('`Transfer` event not found.')\n return log\n }\n}\n\n/**\n * Transfers TIP20 tokens to another address.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.transferSync(client, {\n * to: '0x...',\n * amount: 100n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function transferSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: transferSync.Parameters<chain, account>,\n): Promise<transferSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await transfer.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = transfer.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace transferSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = transfer.Parameters<chain, account>\n\n export type Args = transfer.Args\n\n export type ReturnValue = GetEventArgs<\n typeof Abis.tip20,\n 'Transfer',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Unpauses a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.unpause(client, {\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function unpause<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: unpause.Parameters<chain, account>,\n): Promise<unpause.ReturnValue> {\n return unpause.inner(writeContract, client, parameters)\n}\n\nexport namespace unpause {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: unpause.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { token, ...rest } = parameters\n const call = unpause.call({ token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `unpause` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.unpause.call({\n * token: '0x20c0...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token } = args\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'unpause',\n args: [],\n })\n }\n\n /**\n * Extracts the event from the logs.\n *\n * @param logs - Logs.\n * @returns The event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'PauseStateUpdate',\n })\n if (!log) throw new Error('`PauseStateUpdate` event not found.')\n return log\n }\n}\n\n/**\n * Unpauses a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.unpauseSync(client, {\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function unpauseSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: unpauseSync.Parameters<chain, account>,\n): Promise<unpauseSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await unpause.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n const { args } = unpause.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace unpauseSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = unpause.Parameters<chain, account>\n\n export type Args = unpause.Args\n\n export type ReturnValue = GetEventArgs<\n typeof Abis.tip20,\n 'PauseStateUpdate',\n { IndexedOnly: false; Required: true }\n > & {\n receipt: TransactionReceipt\n }\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Updates the quote token for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.prepareUpdateQuoteToken(client, {\n * token: '0x...',\n * quoteToken: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function prepareUpdateQuoteToken<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: prepareUpdateQuoteToken.Parameters<chain, account>,\n): Promise<prepareUpdateQuoteToken.ReturnValue> {\n return prepareUpdateQuoteToken.inner(writeContract, client, parameters)\n}\n\nexport namespace prepareUpdateQuoteToken {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** New quote token address. */\n quoteToken: TokenId.TokenIdOrAddress\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: prepareUpdateQuoteToken.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { quoteToken, token, ...rest } = parameters\n const call = prepareUpdateQuoteToken.call({ quoteToken, token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `prepareUpdateQuoteToken` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.prepareUpdateQuoteToken.call({\n * token: '0x20c0...babe',\n * quoteToken: '0x20c0...cafe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token, quoteToken } = args\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'setNextQuoteToken',\n args: [TokenId.toAddress(quoteToken)],\n })\n }\n\n /**\n * Extracts the event from the logs.\n *\n * @param logs - Logs.\n * @returns The event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'NextQuoteTokenSet',\n })\n if (!log) throw new Error('`NextQuoteTokenSet` event not found.')\n return log\n }\n}\n\n/**\n * Updates the quote token for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.prepareUpdateQuoteTokenSync(client, {\n * token: '0x...',\n * quoteToken: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function prepareUpdateQuoteTokenSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: prepareUpdateQuoteTokenSync.Parameters<chain, account>,\n): Promise<prepareUpdateQuoteTokenSync.ReturnValue> {\n const receipt = await prepareUpdateQuoteToken.inner(\n writeContractSync,\n client,\n parameters,\n )\n const { args } = prepareUpdateQuoteToken.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace prepareUpdateQuoteTokenSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = prepareUpdateQuoteToken.Parameters<chain, account>\n\n export type Args = prepareUpdateQuoteToken.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.tip20,\n 'NextQuoteTokenSet',\n {\n IndexedOnly: false\n Required: true\n }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Updates the quote token for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.updateQuoteToken(client, {\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function updateQuoteToken<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: updateQuoteToken.Parameters<chain, account>,\n): Promise<updateQuoteToken.ReturnValue> {\n return updateQuoteToken.inner(writeContract, client, parameters)\n}\n\nexport namespace updateQuoteToken {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: updateQuoteToken.Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { token, ...rest } = parameters\n const call = updateQuoteToken.call({ token })\n return (await action(client, {\n ...rest,\n ...call,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `updateQuoteToken` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * actions.token.updateQuoteToken.call({\n * token: '0x20c0...babe',\n * }),\n * ]\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { token } = args\n return defineCall({\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n functionName: 'completeQuoteTokenUpdate',\n args: [],\n })\n }\n\n /**\n * Extracts the event from the logs.\n *\n * @param logs - Logs.\n * @returns The event.\n */\n export function extractEvent(logs: Log[]) {\n const [log] = parseEventLogs({\n abi: Abis.tip20,\n logs,\n eventName: 'QuoteTokenUpdate',\n })\n if (!log) throw new Error('`QuoteTokenUpdateCompleted` event not found.')\n return log\n }\n}\n\n/**\n * Updates the quote token for a TIP20 token.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const result = await Actions.token.updateQuoteTokenSync(client, {\n * token: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt and event data.\n */\nexport async function updateQuoteTokenSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: updateQuoteTokenSync.Parameters<chain, account>,\n): Promise<updateQuoteTokenSync.ReturnValue> {\n const receipt = await updateQuoteToken.inner(\n writeContractSync,\n client,\n parameters,\n )\n const { args } = updateQuoteToken.extractEvent(receipt.logs)\n return {\n ...args,\n receipt,\n } as never\n}\n\nexport namespace updateQuoteTokenSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = updateQuoteToken.Parameters<chain, account>\n\n export type Args = updateQuoteToken.Args\n\n export type ReturnValue = Compute<\n GetEventArgs<\n typeof Abis.tip20,\n 'QuoteTokenUpdate',\n {\n IndexedOnly: false\n Required: true\n }\n > & {\n receipt: TransactionReceipt\n }\n >\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n}\n\n/**\n * Watches for TIP20 token approval events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.token.watchApprove(client, {\n * onApproval: (args, log) => {\n * console.log('Approval:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchApprove<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchApprove.Parameters,\n) {\n const { onApproval, token, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n eventName: 'Approval',\n onLogs: (logs) => {\n for (const log of logs) onApproval(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchApprove {\n export type Args = GetEventArgs<\n typeof Abis.tip20,\n 'Approval',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip20, 'Approval'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.tip20, 'Approval', true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when tokens are approved. */\n onApproval: (args: Args, log: Log) => void\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n}\n\n/**\n * Watches for TIP20 token burn events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.token.watchBurn(client, {\n * onBurn: (args, log) => {\n * console.log('Burn:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchBurn<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(client: Client<Transport, chain, account>, parameters: watchBurn.Parameters) {\n const { onBurn, token, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n eventName: 'Burn',\n onLogs: (logs) => {\n for (const log of logs) onBurn(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchBurn {\n export type Args = GetEventArgs<\n typeof Abis.tip20,\n 'Burn',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip20, 'Burn'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.tip20, 'Burn', true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when tokens are burned. */\n onBurn: (args: Args, log: Log) => void\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n}\n\n/**\n * Watches for new TIP20 tokens created.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.token.watchCreate(client, {\n * onTokenCreated: (args, log) => {\n * console.log('Token created:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchCreate<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchCreate.Parameters,\n) {\n const { onTokenCreated, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: Addresses.tip20Factory,\n abi: Abis.tip20Factory,\n eventName: 'TokenCreated',\n onLogs: (logs) => {\n for (const log of logs) onTokenCreated(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchCreate {\n export type Args = GetEventArgs<\n typeof Abis.tip20Factory,\n 'TokenCreated',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip20Factory, 'TokenCreated'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<\n typeof Abis.tip20Factory,\n 'TokenCreated',\n true\n >,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a new TIP20 token is created. */\n onTokenCreated: (args: Args, log: Log) => void\n }\n}\n\n/**\n * Watches for TIP20 token mint events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.token.watchMint(client, {\n * onMint: (args, log) => {\n * console.log('Mint:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchMint<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(client: Client<Transport, chain, account>, parameters: watchMint.Parameters) {\n const { onMint, token, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n eventName: 'Mint',\n onLogs: (logs) => {\n for (const log of logs) onMint(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchMint {\n export type Args = GetEventArgs<\n typeof Abis.tip20,\n 'Mint',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip20, 'Mint'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.tip20, 'Mint', true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when tokens are minted. */\n onMint: (args: Args, log: Log) => void\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n\n export type ReturnValue = WatchContractEventReturnType\n}\n\n/**\n * Watches for TIP20 token role admin updates.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.token.watchAdminRole(client, {\n * onRoleAdminUpdated: (args, log) => {\n * console.log('Role admin updated:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchAdminRole<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchAdminRole.Parameters,\n) {\n const { onRoleAdminUpdated, token, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n eventName: 'RoleAdminUpdated',\n onLogs: (logs) => {\n for (const log of logs) onRoleAdminUpdated(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchAdminRole {\n export type Args = GetEventArgs<\n typeof Abis.tip20,\n 'RoleAdminUpdated',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip20, 'RoleAdminUpdated'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.tip20, 'RoleAdminUpdated', true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a role admin is updated. */\n onRoleAdminUpdated: (args: Args, log: Log) => void\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n}\n\n/**\n * Watches for TIP20 token role membership updates.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.token.watchRole(client, {\n * onRoleUpdated: (args, log) => {\n * console.log('Role updated:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchRole<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(client: Client<Transport, chain, account>, parameters: watchRole.Parameters) {\n const { onRoleUpdated, token, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n eventName: 'RoleMembershipUpdated',\n onLogs: (logs) => {\n for (const log of logs) {\n const type = log.args.hasRole ? 'granted' : 'revoked'\n onRoleUpdated({ ...log.args, type }, log)\n }\n },\n strict: true,\n })\n}\n\nexport declare namespace watchRole {\n export type Args = GetEventArgs<\n typeof Abis.tip20,\n 'RoleMembershipUpdated',\n { IndexedOnly: false; Required: true }\n > & {\n /** Type of role update. */\n type: 'granted' | 'revoked'\n }\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip20, 'RoleMembershipUpdated'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<\n typeof Abis.tip20,\n 'RoleMembershipUpdated',\n true\n >,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a role membership is updated. */\n onRoleUpdated: (args: Args, log: Log) => void\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n}\n\n/**\n * Watches for TIP20 token transfer events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.token.watchTransfer(client, {\n * onTransfer: (args, log) => {\n * console.log('Transfer:', args)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchTransfer<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchTransfer.Parameters,\n) {\n const { onTransfer, token, ...rest } = parameters\n return watchContractEvent(client, {\n ...rest,\n address: TokenId.toAddress(token),\n abi: Abis.tip20,\n eventName: 'Transfer',\n onLogs: (logs) => {\n for (const log of logs) onTransfer(log.args, log)\n },\n strict: true,\n })\n}\n\nexport declare namespace watchTransfer {\n export type Args = GetEventArgs<\n typeof Abis.tip20,\n 'Transfer',\n { IndexedOnly: false; Required: true }\n >\n\n export type Log = viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<typeof Abis.tip20, 'Transfer'>,\n true\n >\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.tip20, 'Transfer', true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when tokens are transferred. */\n onTransfer: (args: Args, log: Log) => void\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n}\n\n/**\n * Watches for TIP20 token quote token update events.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' })\n * transport: http(),\n * })\n *\n * const unwatch = actions.token.watchUpdateQuoteToken(client, {\n * onUpdateQuoteToken: (args, log) => {\n * if (args.completed)\n * console.log('quote token update completed:', args.newQuoteToken)\n * else\n * console.log('quote token update proposed:', args.newQuoteToken)\n * },\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns A function to unsubscribe from the event.\n */\nexport function watchUpdateQuoteToken<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: watchUpdateQuoteToken.Parameters,\n) {\n const { onUpdateQuoteToken, token, ...rest } = parameters\n const address = TokenId.toAddress(token)\n\n return watchContractEvent(client, {\n ...rest,\n address,\n abi: Abis.tip20,\n onLogs: (\n logs: viem_Log<\n bigint,\n number,\n false,\n ExtractAbiItem<\n typeof Abis.tip20,\n 'NextQuoteTokenSet' | 'QuoteTokenUpdate'\n >,\n true\n >[],\n ) => {\n for (const log of logs) {\n if (\n log.eventName !== 'NextQuoteTokenSet' &&\n log.eventName !== 'QuoteTokenUpdate'\n )\n continue\n\n onUpdateQuoteToken(\n {\n ...log.args,\n completed: log.eventName === 'QuoteTokenUpdate',\n },\n log,\n )\n }\n },\n strict: true,\n } as never)\n}\n\nexport declare namespace watchUpdateQuoteToken {\n export type Args = OneOf<\n | GetEventArgs<\n typeof Abis.tip20,\n 'NextQuoteTokenSet',\n { IndexedOnly: false; Required: true }\n >\n | GetEventArgs<\n typeof Abis.tip20,\n 'QuoteTokenUpdate',\n { IndexedOnly: false; Required: true }\n >\n > & {\n /** Whether the update has been completed. */\n completed: boolean\n }\n\n export type Log = viem_Log\n\n export type Parameters = UnionOmit<\n WatchContractEventParameters<typeof Abis.tip20, any, true>,\n 'abi' | 'address' | 'batch' | 'eventName' | 'onLogs' | 'strict'\n > & {\n /** Callback to invoke when a quote token update is proposed or completed. */\n onUpdateQuoteToken: (args: Args, log: Log) => void\n /** Address or ID of the TIP20 token. */\n token: TokenId.TokenIdOrAddress\n }\n}\n","import type { Address } from 'abitype'\nimport type { Hex } from 'ox/Hex'\nimport type { Account } from '../../accounts/types.js'\nimport type { ReadContractReturnType } from '../../actions/public/readContract.js'\nimport { readContract } from '../../actions/public/readContract.js'\nimport type { WriteContractReturnType } from '../../actions/wallet/writeContract.js'\nimport { writeContract } from '../../actions/wallet/writeContract.js'\nimport { writeContractSync } from '../../actions/wallet/writeContractSync.js'\nimport type { Client } from '../../clients/createClient.js'\nimport type { Transport } from '../../clients/transports/createTransport.js'\nimport type { BaseErrorType } from '../../errors/base.js'\nimport type { Chain } from '../../types/chain.js'\nimport type { TransactionReceipt } from '../../types/transaction.js'\nimport * as Abis from '../Abis.js'\nimport * as Addresses from '../Addresses.js'\nimport type { ReadParameters, WriteParameters } from '../internal/types.js'\nimport { defineCall } from '../internal/utils.js'\n\n/**\n * Adds a new validator (owner only).\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const hash = await Actions.validator.add(client, {\n * newValidatorAddress: '0x...',\n * publicKey: '0x...',\n * active: true,\n * inboundAddress: '192.168.1.1:8080',\n * outboundAddress: '192.168.1.1:8080',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function add<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: add.Parameters<chain, account>,\n): Promise<add.ReturnValue> {\n return add.inner(writeContract, client, parameters)\n}\n\nexport namespace add {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** The address of the new validator. */\n newValidatorAddress: Address\n /** The validator's communication public key. */\n publicKey: Hex\n /** Whether the validator should be active. */\n active: boolean\n /** The validator's inbound address `<hostname|ip>:<port>` for incoming connections. */\n inboundAddress: string\n /** The validator's outbound IP address `<ip>:<port>` for firewall whitelisting (IP only, no hostnames). */\n outboundAddress: string\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const {\n newValidatorAddress,\n publicKey,\n active,\n inboundAddress,\n outboundAddress,\n ...rest\n } = parameters\n const callData = add.call({\n newValidatorAddress,\n publicKey,\n active,\n inboundAddress,\n outboundAddress,\n })\n return (await action(client, {\n ...rest,\n ...callData,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `addValidator` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.validator.add.call({\n * newValidatorAddress: '0x...',\n * publicKey: '0x...',\n * active: true,\n * inboundAddress: '192.168.1.1:8080',\n * outboundAddress: '192.168.1.1:8080',\n * }),\n * ],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const {\n newValidatorAddress,\n publicKey,\n active,\n inboundAddress,\n outboundAddress,\n } = args\n return defineCall({\n address: Addresses.validator,\n abi: Abis.validator,\n args: [\n newValidatorAddress,\n publicKey,\n active,\n inboundAddress,\n outboundAddress,\n ],\n functionName: 'addValidator',\n })\n }\n}\n\n/**\n * Adds a new validator (owner only) and waits for the transaction receipt.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const { receipt } = await Actions.validator.addSync(client, {\n * newValidatorAddress: '0x...',\n * publicKey: '0x...',\n * active: true,\n * inboundAddress: '192.168.1.1:8080',\n * outboundAddress: '192.168.1.1:8080',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt.\n */\nexport async function addSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: addSync.Parameters<chain, account>,\n): Promise<addSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await add.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n return { receipt }\n}\n\nexport namespace addSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = add.Parameters<chain, account>\n\n export type Args = add.Args\n\n export type ReturnValue = {\n receipt: TransactionReceipt\n }\n}\n\n/**\n * Changes the owner of the validator config precompile.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const hash = await Actions.validator.changeOwner(client, {\n * newOwner: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function changeOwner<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: changeOwner.Parameters<chain, account>,\n): Promise<changeOwner.ReturnValue> {\n return changeOwner.inner(writeContract, client, parameters)\n}\n\nexport namespace changeOwner {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** The new owner address. */\n newOwner: Address\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { newOwner, ...rest } = parameters\n const callData = changeOwner.call({ newOwner })\n return (await action(client, {\n ...rest,\n ...callData,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `changeOwner` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.validator.changeOwner.call({\n * newOwner: '0x...',\n * }),\n * ],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { newOwner } = args\n return defineCall({\n address: Addresses.validator,\n abi: Abis.validator,\n args: [newOwner],\n functionName: 'changeOwner',\n })\n }\n}\n\n/**\n * Changes the owner and waits for the transaction receipt.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const { receipt } = await Actions.validator.changeOwnerSync(client, {\n * newOwner: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt.\n */\nexport async function changeOwnerSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: changeOwnerSync.Parameters<chain, account>,\n): Promise<changeOwnerSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await changeOwner.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n return { receipt }\n}\n\nexport namespace changeOwnerSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = changeOwner.Parameters<chain, account>\n\n export type Args = changeOwner.Args\n\n export type ReturnValue = {\n receipt: TransactionReceipt\n }\n}\n\n/**\n * Changes validator active status (owner only).\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const hash = await Actions.validator.changeStatus(client, {\n * validator: '0x...',\n * active: false,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function changeStatus<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: changeStatus.Parameters<chain, account>,\n): Promise<changeStatus.ReturnValue> {\n return changeStatus.inner(writeContract, client, parameters)\n}\n\nexport namespace changeStatus {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** The validator address. */\n validator: Address\n /** Whether the validator should be active. */\n active: boolean\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { validator, active, ...rest } = parameters\n const callData = changeStatus.call({ validator, active })\n return (await action(client, {\n ...rest,\n ...callData,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `changeValidatorStatus` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.validator.changeStatus.call({\n * validator: '0x...',\n * active: false,\n * }),\n * ],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { validator, active } = args\n return defineCall({\n address: Addresses.validator,\n abi: Abis.validator,\n args: [validator, active],\n functionName: 'changeValidatorStatus',\n })\n }\n}\n\n/**\n * Changes validator active status and waits for the transaction receipt.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const { receipt } = await Actions.validator.changeStatusSync(client, {\n * validator: '0x...',\n * active: false,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt.\n */\nexport async function changeStatusSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: changeStatusSync.Parameters<chain, account>,\n): Promise<changeStatusSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await changeStatus.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n return { receipt }\n}\n\nexport namespace changeStatusSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = changeStatus.Parameters<chain, account>\n\n export type Args = changeStatus.Args\n\n export type ReturnValue = {\n receipt: TransactionReceipt\n }\n}\n\n/**\n * Gets the next epoch for a full DKG ceremony.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const epoch = await Actions.validator.getNextFullDkgCeremony(client)\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The epoch number for the next full DKG ceremony.\n */\nexport async function getNextFullDkgCeremony<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: getNextFullDkgCeremony.Parameters = {},\n): Promise<getNextFullDkgCeremony.ReturnValue> {\n return readContract(client, {\n ...parameters,\n ...getNextFullDkgCeremony.call(),\n })\n}\n\nexport namespace getNextFullDkgCeremony {\n export type Parameters = ReadParameters\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.validator,\n 'getNextFullDkgCeremony',\n never\n >\n\n /**\n * Defines a call to the `getNextFullDkgCeremony` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`multicall`](https://viem.sh/docs/contract/multicall): execute multiple calls in parallel\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const result = await client.multicall({\n * contracts: [Actions.validator.getNextFullDkgCeremony.call()],\n * })\n * ```\n *\n * @returns The call.\n */\n export function call() {\n return defineCall({\n address: Addresses.validator,\n abi: Abis.validator,\n args: [],\n functionName: 'getNextFullDkgCeremony',\n })\n }\n}\n\n/**\n * Gets the contract owner.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const owner = await Actions.validator.getOwner(client)\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The owner address.\n */\nexport async function getOwner<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: getOwner.Parameters = {},\n): Promise<getOwner.ReturnValue> {\n return readContract(client, {\n ...parameters,\n ...getOwner.call(),\n })\n}\n\nexport namespace getOwner {\n export type Parameters = ReadParameters\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.validator,\n 'owner',\n never\n >\n\n /**\n * Defines a call to the `owner` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`multicall`](https://viem.sh/docs/contract/multicall): execute multiple calls in parallel\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const result = await client.multicall({\n * contracts: [Actions.validator.getOwner.call()],\n * })\n * ```\n *\n * @returns The call.\n */\n export function call() {\n return defineCall({\n address: Addresses.validator,\n abi: Abis.validator,\n args: [],\n functionName: 'owner',\n })\n }\n}\n\n/**\n * Gets validator information by address.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const validator = await Actions.validator.get(client, {\n * validator: '0x...',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The validator information.\n */\nexport async function get<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: get.Parameters,\n): Promise<get.ReturnValue> {\n const { validator, ...rest } = parameters\n return readContract(client, {\n ...rest,\n ...get.call({ validator }),\n })\n}\n\nexport namespace get {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Validator address. */\n validator: Address\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.validator,\n 'validators',\n never\n >\n\n /**\n * Defines a call to the `validators` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`multicall`](https://viem.sh/docs/contract/multicall): execute multiple calls in parallel\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const result = await client.multicall({\n * contracts: [\n * Actions.validator.get.call({ validator: '0x...' }),\n * ],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { validator } = args\n return defineCall({\n address: Addresses.validator,\n abi: Abis.validator,\n args: [validator],\n functionName: 'validators',\n })\n }\n}\n\n/**\n * Gets validator address by index.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const validatorAddress = await Actions.validator.getByIndex(client, {\n * index: 0n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The validator address at the given index.\n */\nexport async function getByIndex<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: getByIndex.Parameters,\n): Promise<getByIndex.ReturnValue> {\n const { index, ...rest } = parameters\n return readContract(client, {\n ...rest,\n ...getByIndex.call({ index }),\n })\n}\n\nexport namespace getByIndex {\n export type Parameters = ReadParameters & Args\n\n export type Args = {\n /** Validator index. */\n index: bigint\n }\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.validator,\n 'validatorsArray',\n never\n >\n\n /**\n * Defines a call to the `validatorsArray` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`multicall`](https://viem.sh/docs/contract/multicall): execute multiple calls in parallel\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const result = await client.multicall({\n * contracts: [\n * Actions.validator.getByIndex.call({ index: 0n }),\n * Actions.validator.getByIndex.call({ index: 1n }),\n * ],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { index } = args\n return defineCall({\n address: Addresses.validator,\n abi: Abis.validator,\n args: [index],\n functionName: 'validatorsArray',\n })\n }\n}\n\n/**\n * Gets the total number of validators.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const count = await Actions.validator.getCount(client)\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The total number of validators.\n */\nexport async function getCount<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: getCount.Parameters = {},\n): Promise<getCount.ReturnValue> {\n return readContract(client, {\n ...parameters,\n ...getCount.call(),\n })\n}\n\nexport namespace getCount {\n export type Parameters = ReadParameters\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.validator,\n 'validatorCount',\n never\n >\n\n /**\n * Defines a call to the `validatorCount` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`multicall`](https://viem.sh/docs/contract/multicall): execute multiple calls in parallel\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const result = await client.multicall({\n * contracts: [Actions.validator.getCount.call()],\n * })\n * ```\n *\n * @returns The call.\n */\n export function call() {\n return defineCall({\n address: Addresses.validator,\n abi: Abis.validator,\n args: [],\n functionName: 'validatorCount',\n })\n }\n}\n\n/**\n * Gets the complete set of validators.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const validators = await Actions.validator.list(client)\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns Array of all validators with their information.\n */\nexport async function list<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: list.Parameters = {},\n): Promise<list.ReturnValue> {\n return readContract(client, {\n ...parameters,\n ...list.call(),\n })\n}\n\nexport namespace list {\n export type Parameters = ReadParameters\n\n export type ReturnValue = ReadContractReturnType<\n typeof Abis.validator,\n 'getValidators',\n never\n >\n\n /**\n * Defines a call to the `getValidators` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`multicall`](https://viem.sh/docs/contract/multicall): execute multiple calls in parallel\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const result = await client.multicall({\n * contracts: [Actions.validator.list.call()],\n * })\n * ```\n *\n * @returns The call.\n */\n export function call() {\n return defineCall({\n address: Addresses.validator,\n abi: Abis.validator,\n args: [],\n functionName: 'getValidators',\n })\n }\n}\n\n/**\n * Sets the next epoch for a full DKG ceremony.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const hash = await Actions.validator.setNextFullDkgCeremony(client, {\n * epoch: 100n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function setNextFullDkgCeremony<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setNextFullDkgCeremony.Parameters<chain, account>,\n): Promise<setNextFullDkgCeremony.ReturnValue> {\n return setNextFullDkgCeremony.inner(writeContract, client, parameters)\n}\n\nexport namespace setNextFullDkgCeremony {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** The epoch number for the next full DKG ceremony. */\n epoch: bigint\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const { epoch, ...rest } = parameters\n const callData = setNextFullDkgCeremony.call({ epoch })\n return (await action(client, {\n ...rest,\n ...callData,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `setNextFullDkgCeremony` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.validator.setNextFullDkgCeremony.call({\n * epoch: 100n,\n * }),\n * ],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { epoch } = args\n return defineCall({\n address: Addresses.validator,\n abi: Abis.validator,\n args: [epoch],\n functionName: 'setNextFullDkgCeremony',\n })\n }\n}\n\n/**\n * Sets the next epoch for a full DKG ceremony and waits for the transaction receipt.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const { receipt } = await Actions.validator.setNextFullDkgCeremonySync(client, {\n * epoch: 100n,\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt.\n */\nexport async function setNextFullDkgCeremonySync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: setNextFullDkgCeremonySync.Parameters<chain, account>,\n): Promise<setNextFullDkgCeremonySync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await setNextFullDkgCeremony.inner(\n writeContractSync,\n client,\n {\n ...rest,\n throwOnReceiptRevert,\n } as never,\n )\n return { receipt }\n}\n\nexport namespace setNextFullDkgCeremonySync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = setNextFullDkgCeremony.Parameters<chain, account>\n\n export type Args = setNextFullDkgCeremony.Args\n\n export type ReturnValue = {\n receipt: TransactionReceipt\n }\n}\n\n/**\n * Updates validator information (only callable by the validator themselves).\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const hash = await Actions.validator.update(client, {\n * newValidatorAddress: '0x...',\n * publicKey: '0x...',\n * inboundAddress: '192.168.1.1:8080',\n * outboundAddress: '192.168.1.1:8080',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction hash.\n */\nexport async function update<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: update.Parameters<chain, account>,\n): Promise<update.ReturnValue> {\n return update.inner(writeContract, client, parameters)\n}\n\nexport namespace update {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = WriteParameters<chain, account> & Args\n\n export type Args = {\n /** The new address for this validator. */\n newValidatorAddress: Address\n /** The validator's new communication public key. */\n publicKey: Hex\n /** The validator's inbound address `<hostname|ip>:<port>` for incoming connections. */\n inboundAddress: string\n /** The validator's outbound IP address `<ip>:<port>` for firewall whitelisting (IP only, no hostnames). */\n outboundAddress: string\n }\n\n export type ReturnValue = WriteContractReturnType\n\n // TODO: exhaustive error type\n export type ErrorType = BaseErrorType\n\n /** @internal */\n export async function inner<\n action extends typeof writeContract | typeof writeContractSync,\n chain extends Chain | undefined,\n account extends Account | undefined,\n >(\n action: action,\n client: Client<Transport, chain, account>,\n parameters: Parameters<chain, account>,\n ): Promise<ReturnType<action>> {\n const {\n newValidatorAddress,\n publicKey,\n inboundAddress,\n outboundAddress,\n ...rest\n } = parameters\n const callData = update.call({\n newValidatorAddress,\n publicKey,\n inboundAddress,\n outboundAddress,\n })\n return (await action(client, {\n ...rest,\n ...callData,\n } as never)) as never\n }\n\n /**\n * Defines a call to the `updateValidator` function.\n *\n * Can be passed as a parameter to:\n * - [`estimateContractGas`](https://viem.sh/docs/contract/estimateContractGas): estimate the gas cost of the call\n * - [`simulateContract`](https://viem.sh/docs/contract/simulateContract): simulate the call\n * - [`sendCalls`](https://viem.sh/docs/actions/wallet/sendCalls): send multiple calls\n *\n * @example\n * ```ts\n * import { createClient, http, walletActions } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n *\n * const client = createClient({\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * }).extend(walletActions)\n *\n * const { result } = await client.sendCalls({\n * calls: [\n * Actions.validator.update.call({\n * newValidatorAddress: '0x...',\n * publicKey: '0x...',\n * inboundAddress: '192.168.1.1:8080',\n * outboundAddress: '192.168.1.1:8080',\n * }),\n * ],\n * })\n * ```\n *\n * @param args - Arguments.\n * @returns The call.\n */\n export function call(args: Args) {\n const { newValidatorAddress, publicKey, inboundAddress, outboundAddress } =\n args\n return defineCall({\n address: Addresses.validator,\n abi: Abis.validator,\n args: [newValidatorAddress, publicKey, inboundAddress, outboundAddress],\n functionName: 'updateValidator',\n })\n }\n}\n\n/**\n * Updates validator information and waits for the transaction receipt.\n *\n * @example\n * ```ts\n * import { createClient, http } from 'viem'\n * import { tempo } from 'viem/chains'\n * import { Actions } from 'viem/tempo'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const client = createClient({\n * account: privateKeyToAccount('0x...'),\n * chain: tempo({ feeToken: '0x20c0000000000000000000000000000000000001' }),\n * transport: http(),\n * })\n *\n * const { receipt } = await Actions.validator.updateSync(client, {\n * newValidatorAddress: '0x...',\n * publicKey: '0x...',\n * inboundAddress: '192.168.1.1:8080',\n * outboundAddress: '192.168.1.1:8080',\n * })\n * ```\n *\n * @param client - Client.\n * @param parameters - Parameters.\n * @returns The transaction receipt.\n */\nexport async function updateSync<\n chain extends Chain | undefined,\n account extends Account | undefined,\n>(\n client: Client<Transport, chain, account>,\n parameters: updateSync.Parameters<chain, account>,\n): Promise<updateSync.ReturnValue> {\n const { throwOnReceiptRevert = true, ...rest } = parameters\n const receipt = await update.inner(writeContractSync, client, {\n ...rest,\n throwOnReceiptRevert,\n } as never)\n return { receipt }\n}\n\nexport namespace updateSync {\n export type Parameters<\n chain extends Chain | undefined = Chain | undefined,\n account extends Account | undefined = Account | undefined,\n > = update.Parameters<chain, account>\n\n export type Args = update.Args\n\n export type ReturnValue = {\n receipt: TransactionReceipt\n }\n}\n","import * as Address from 'ox/Address'\nimport * as Hash from 'ox/Hash'\nimport * as Hex from 'ox/Hex'\nimport * as Provider from 'ox/Provider'\nimport * as RpcRequest from 'ox/RpcRequest'\nimport type { LocalAccount } from '../accounts/types.js'\nimport { getTransactionReceipt } from '../actions/public/getTransactionReceipt.js'\nimport { sendTransaction } from '../actions/wallet/sendTransaction.js'\nimport { sendTransactionSync } from '../actions/wallet/sendTransactionSync.js'\nimport { createClient } from '../clients/createClient.js'\nimport {\n createTransport,\n type Transport,\n} from '../clients/transports/createTransport.js'\nimport type { Chain } from '../types/chain.js'\nimport type { ChainConfig } from './chainConfig.js'\nimport * as Transaction from './Transaction.js'\n\nexport type FeePayer = Transport<typeof withFeePayer.type>\n\n/**\n * Creates a fee payer transport that routes requests between\n * the default transport or the fee payer transport.\n *\n * The policy parameter controls how the fee payer handles transactions:\n * - `'sign-only'`: Fee payer co-signs the transaction and returns it to the client transport, which then broadcasts it via the default transport\n * - `'sign-and-broadcast'`: Fee payer co-signs and broadcasts the transaction directly\n *\n * @param defaultTransport - The default transport to use.\n * @param feePayerTransport - The fee payer transport to use.\n * @param parameters - Configuration parameters.\n * @returns A relay transport.\n */\nexport function withFeePayer(\n defaultTransport: Transport,\n relayTransport: Transport,\n parameters?: withFeePayer.Parameters,\n): withFeePayer.ReturnValue {\n const { policy = 'sign-only' } = parameters ?? {}\n\n return (config) => {\n const transport_default = defaultTransport(config)\n const transport_relay = relayTransport(config)\n\n return createTransport({\n key: withFeePayer.type,\n name: 'Relay Proxy',\n async request({ method, params }, options) {\n if (\n method === 'eth_sendRawTransactionSync' ||\n method === 'eth_sendRawTransaction'\n ) {\n const serialized = (params as any)[0] as `0x76${string}`\n const transaction = Transaction.deserialize(serialized)\n\n // If the transaction is intended to be sponsored, forward it to the relay.\n if (transaction.feePayerSignature === null) {\n // For 'sign-and-broadcast', relay signs and broadcasts\n if (policy === 'sign-and-broadcast')\n return transport_relay.request(\n { method, params },\n options,\n ) as never\n\n // For 'sign-only', request signature from relay using eth_signRawTransaction\n {\n // Request signature from relay using eth_signRawTransaction\n const signedTransaction = await transport_relay.request(\n {\n method: 'eth_signRawTransaction',\n params: [serialized],\n },\n options,\n )\n\n // Broadcast the signed transaction via the default transport\n return transport_default.request(\n { method, params: [signedTransaction] },\n options,\n ) as never\n }\n }\n }\n return (await transport_default.request(\n { method, params },\n options,\n )) as never\n },\n type: withFeePayer.type,\n })\n }\n}\n\nexport declare namespace withFeePayer {\n export const type = 'feePayer'\n\n export type Parameters = {\n /** Policy for how the fee payer should handle transactions. Defaults to `'sign-only'`. */\n policy?: 'sign-only' | 'sign-and-broadcast' | undefined\n }\n\n export type ReturnValue = FeePayer\n}\n\n/**\n * Creates a transport that instruments a compatibility layer for\n * `wallet_` RPC actions (`sendCalls`, `getCallsStatus`, etc).\n *\n * @param transport - Transport to wrap.\n * @returns Transport.\n */\nexport function walletNamespaceCompat(\n transport: Transport,\n options: walletNamespaceCompat.Parameters,\n): Transport {\n const { account } = options\n\n const sendCallsMagic = Hash.keccak256(Hex.fromString('TEMPO_5792'))\n\n return (options) => {\n const t = transport(options)\n\n const chain = options.chain as Chain & ChainConfig\n\n return {\n ...t,\n async request(args: never) {\n const request = RpcRequest.from(args)\n\n const client = createClient({\n chain,\n transport,\n })\n\n if (request.method === 'wallet_sendCalls') {\n const params = request.params[0] ?? {}\n const { capabilities, chainId, from } = params\n const { sync, ...properties } = capabilities ?? {}\n\n if (!chainId) throw new Provider.UnsupportedChainIdError()\n if (Number(chainId) !== client.chain.id)\n throw new Provider.UnsupportedChainIdError()\n if (from && !Address.isEqual(from, account.address))\n throw new Provider.DisconnectedError()\n\n const calls = (params.calls ?? []).map((call) => ({\n to: call.to,\n value: call.value ? BigInt(call.value) : undefined,\n data: call.data,\n }))\n\n const hash = await (async () => {\n if (!sync)\n return sendTransaction(client, {\n account,\n ...(properties ? properties : {}),\n calls,\n })\n\n const { transactionHash } = await sendTransactionSync(client, {\n account,\n ...(properties ? properties : {}),\n calls,\n })\n return transactionHash\n })()\n\n const id = Hex.concat(hash, Hex.padLeft(chainId, 32), sendCallsMagic)\n\n return {\n capabilities: { sync },\n id,\n }\n }\n\n if (request.method === 'wallet_getCallsStatus') {\n const [id] = request.params ?? []\n if (!id) throw new Error('`id` not found')\n if (!id.endsWith(sendCallsMagic.slice(2)))\n throw new Error('`id` not supported')\n Hex.assert(id)\n\n const hash = Hex.slice(id, 0, 32)\n const chainId = Hex.slice(id, 32, 64)\n\n const receipt = await getTransactionReceipt(client, { hash })\n return {\n atomic: true,\n chainId: Number(chainId),\n id,\n receipts: [receipt],\n status: receipt.status === 'success' ? 200 : 500,\n version: '2.0.0',\n }\n }\n\n return t.request(args)\n },\n } as never\n }\n}\n\nexport declare namespace walletNamespaceCompat {\n export type Parameters = {\n account: LocalAccount\n }\n}\n","import type { Address, Client, Account as viem_Account } from 'viem'\nimport { parseAccount } from 'viem/accounts'\n\nexport type Account = viem_Account\n\nexport function getResolver(parameters: getResolver.Parameters = {}) {\n const { account: defaultAccount } = parameters\n\n return (\n client: Client,\n { account: override }: { account?: Account | Address | undefined } = {},\n ): Account => {\n const account = override ?? defaultAccount\n\n if (!account) {\n if (!client.account)\n throw new Error('No `account` provided. Pass `account` to parameters or context.')\n return client.account\n }\n\n return parseAccount(account)\n }\n}\n\nexport declare namespace getResolver {\n type Parameters = {\n /** Account to use for signing. If an Address is provided, it must match the client's account. */\n account?: Account | Address | undefined\n }\n}\n","import { type Chain, type Client, createClient, http } from 'viem'\nimport { withFeePayer } from 'viem/tempo'\nimport type { MaybePromise } from '../internal/types.js'\n\nexport function getResolver(\n parameters: getResolver.Parameters & {\n /** Default chain to use if not provided. */\n chain?: Chain | undefined\n /** Fee payer relay URL. When set, the transport is wrapped with `withFeePayer`. */\n feePayerUrl?: string | undefined\n /** RPC URLs keyed by chain ID. */\n rpcUrl?: ({ [chainId: number]: string } & object) | undefined\n },\n): (parameters: { chainId?: number | undefined }) => MaybePromise<Client> {\n const { chain, feePayerUrl, getClient, rpcUrl } = parameters\n\n if (getClient) {\n // When a default chain with serializers is provided (e.g. Tempo chain config),\n // ensure user-provided clients inherit those serializers. Without this, clients\n // created without the Tempo chain config will use the default viem serializer,\n // causing errors like \"maxFeePerGas is not a valid Legacy Transaction attribute\".\n if (!chain?.serializers && !feePayerUrl) return getClient\n return async (params) => {\n const client = await getClient(params)\n\n // Wrap the client's transport with `withFeePayer` when a fee payer URL is provided.\n if (feePayerUrl && client.transport.key !== 'feePayer') {\n const url = (client.transport as { url?: string }).url\n if (url) {\n const wrapped = createClient({\n chain: client.chain,\n transport: withFeePayer(http(url), http(feePayerUrl)),\n })\n Object.assign(client, { transport: wrapped.transport, request: wrapped.request })\n }\n }\n\n if (!chain?.serializers || client.chain?.serializers?.transaction) return client\n return Object.assign({}, client, {\n chain: {\n ...chain,\n ...client.chain,\n formatters: client.chain?.formatters ?? chain.formatters,\n prepareTransactionRequest:\n client.chain?.prepareTransactionRequest ?? chain.prepareTransactionRequest,\n serializers: client.chain?.serializers?.transaction\n ? client.chain.serializers\n : chain.serializers,\n } as typeof client.chain,\n })\n }\n }\n\n return ({ chainId }: { chainId?: number | undefined }) => {\n if (!rpcUrl) throw new Error('No `rpcUrl` provided.')\n const resolvedChainId = chainId || Number(Object.keys(rpcUrl)[0])!\n const url = rpcUrl[resolvedChainId as keyof typeof rpcUrl]\n if (!url) throw new Error(`No \\`rpcUrl\\` configured for \\`chainId\\` (${resolvedChainId}).`)\n const transport = feePayerUrl ? withFeePayer(http(url), http(feePayerUrl)) : http(url)\n return createClient({\n chain: { ...chain, id: resolvedChainId } as never,\n transport,\n })\n }\n}\n\nexport declare namespace getResolver {\n type Parameters = {\n /** Function that returns a client for the given chain ID. */\n getClient?: ((parameters: { chainId?: number | undefined }) => MaybePromise<Client>) | undefined\n }\n}\n","import { Bytes, Hash, Hex } from 'ox'\n\n/**\n * MPP attribution memo encoding for TIP-20 `transferWithMemo`.\n *\n * When no user-provided memo is present, the SDK auto-generates an\n * attribution memo so MPP transactions are identifiable on-chain.\n *\n * ## Byte Layout (32 bytes)\n *\n * | Offset | Size | Field |\n * |--------|------|-------------------------------------------|\n * | 0..3 | 4 | TAG = keccak256(\"mpp\")[0..3] |\n * | 4 | 1 | version (0x01) |\n * | 5..14 | 10 | serverId = keccak256(serverId)[0..9] |\n * | 15..24 | 10 | clientId = keccak256(clientId)[0..9] or 0s |\n * | 25..31 | 7 | nonce (random bytes) |\n *\n * The TAG prefix makes MPP transactions trivially distinguishable\n * from arbitrary memos via `TransferWithMemo` event topic filtering.\n *\n * @module\n */\n\n/** First 4 bytes of keccak256(\"mpp\") — the on-chain MPP tag. */\nexport const tag = Hex.slice(Hash.keccak256(Bytes.fromString('mpp'), { as: 'Hex' }), 0, 4)\n\n/** Current memo version. */\nconst version = 0x01\n\n/** 10 zero bytes representing an anonymous (no clientId) client. */\nexport const anonymous = '0x00000000000000000000' as const\n\n/**\n * Computes a 10-byte fingerprint from a string via keccak256.\n * @internal\n */\nfunction fingerprint(value: string): Uint8Array {\n const hash = Hash.keccak256(Bytes.fromString(value), { as: 'Hex' })\n return Hex.toBytes(Hex.slice(hash, 0, 10))\n}\n\n/**\n * Encodes an MPP attribution memo as a `bytes32` hex string.\n *\n * @param parameters - The serverId (server identity) and optional clientId.\n * @returns A `0x`-prefixed 64-char hex string (32 bytes).\n *\n * @example\n * ```ts\n * import * as Attribution from './Attribution.js'\n *\n * const memo = Attribution.encode({ serverId: 'api.example.com', clientId: 'my-app' })\n * ```\n */\nexport function encode(parameters: encode.Parameters) {\n const { serverId, clientId } = parameters\n const buf = new Uint8Array(32)\n\n buf.set(Hex.toBytes(tag), 0)\n buf[4] = version\n buf.set(fingerprint(serverId), 5)\n if (clientId) buf.set(fingerprint(clientId), 15)\n\n const nonce = crypto.getRandomValues(new Uint8Array(7))\n buf.set(nonce, 25)\n\n return Hex.fromBytes(buf)\n}\n\nexport declare namespace encode {\n type Parameters = {\n /** Server identity used to derive the server fingerprint. */\n serverId: string\n /** Optional client identity used to derive the client fingerprint. */\n clientId?: string | undefined\n }\n}\n\n/**\n * Checks whether a memo was generated by the MPP attribution system.\n *\n * @param memo - A `0x`-prefixed hex string (bytes32).\n * @returns `true` if the memo starts with the MPP tag and version byte.\n *\n * @example\n * ```ts\n * import * as Attribution from './Attribution.js'\n *\n * Attribution.isMppMemo(Attribution.encode({ serverId: 'api.example.com' })) // true\n * Attribution.isMppMemo('0x0000...0000') // false\n * ```\n */\nexport function isMppMemo(memo: `0x${string}`): boolean {\n if (memo.length !== 66) return false\n const memoTag = memo.slice(0, 10) as `0x${string}`\n const memoVersion = Number.parseInt(memo.slice(10, 12), 16)\n return memoTag.toLowerCase() === tag.toLowerCase() && memoVersion === version\n}\n\n/**\n * Verifies that a memo's server fingerprint matches the given serverId.\n *\n * Checks TAG, version byte, and that bytes 5–14 equal keccak256(serverId)[0..9].\n *\n * @param memo - A `0x`-prefixed hex string (bytes32).\n * @param serverId - The expected server identity.\n * @returns `true` if the memo has a valid MPP tag and matching server fingerprint.\n */\nexport function verifyServer(memo: `0x${string}`, serverId: string): boolean {\n if (!isMppMemo(memo)) return false\n const memoServerHex = `0x${memo.slice(12, 32)}` as `0x${string}`\n const expectedHex = Hex.fromBytes(fingerprint(serverId)) as `0x${string}`\n return memoServerHex.toLowerCase() === expectedHex.toLowerCase()\n}\n\n/**\n * Decodes an MPP attribution memo into its constituent parts.\n *\n * @param memo - A `0x`-prefixed hex string (bytes32).\n * @returns The decoded fields, or `null` if the memo is not an MPP memo.\n *\n * @example\n * ```ts\n * import * as Attribution from './Attribution.js'\n *\n * const memo = Attribution.encode({ serverId: 'api.example.com', clientId: 'my-app' })\n * const decoded = Attribution.decode(memo)\n * // { version: 1, serverFingerprint: '0x...', clientFingerprint: '0x...', nonce: '0x...' }\n * ```\n */\nexport function decode(memo: `0x${string}`): decode.Result | null {\n if (!isMppMemo(memo)) return null\n\n const memoVersion = Number.parseInt(memo.slice(10, 12), 16)\n const serverFingerprint = `0x${memo.slice(12, 32)}` as `0x${string}`\n const clientHex = `0x${memo.slice(32, 52)}` as `0x${string}`\n const nonce = `0x${memo.slice(52)}` as `0x${string}`\n\n const clientFingerprint = clientHex.toLowerCase() === anonymous.toLowerCase() ? null : clientHex\n\n return { version: memoVersion, serverFingerprint, clientFingerprint, nonce }\n}\n\nexport declare namespace decode {\n type Result = {\n /** Memo version (currently always 1). */\n version: number\n /** 10-byte server fingerprint hex (keccak256(serverId)[0..9]). */\n serverFingerprint: `0x${string}`\n /** 10-byte client fingerprint hex, or `null` if anonymous. */\n clientFingerprint: `0x${string}` | null\n /** 7-byte random nonce hex. */\n nonce: `0x${string}`\n }\n}\n","import type { ValueOf } from '../../internal/types.js'\n\nexport const chainId = {\n mainnet: 4217,\n testnet: 42431,\n} as const\nexport type ChainId = ValueOf<typeof chainId>\n\n/** Token addresses. */\nexport const tokens = {\n /** USDC (USDC.e) token address. */\n usdc: '0x20C000000000000000000000b9537d11c60E8b50',\n /** pathUSD token address. */\n pathUsd: '0x20c0000000000000000000000000000000000000',\n} as const\n\n/** Chain ID → default currency. */\nexport const currency = {\n [chainId.mainnet]: tokens.usdc,\n [chainId.testnet]: tokens.pathUsd,\n} as const satisfies Record<ChainId, string>\n\n/**\n * Default token decimals for TIP-20 stablecoins (e.g. pathUSD, USDC).\n *\n * All TIP-20 tokens on Tempo use 6 decimals, so there is no risk of\n * client/server mismatch within the Tempo ecosystem. Other chains and\n * runtimes should set `decimals` explicitly to match their token.\n */\nexport const decimals = 6\n\n/** Default payment-channel escrow contract addresses per chain. */\nexport const escrowContract = {\n [chainId.mainnet]: '0x33b901018174DDabE4841042ab76ba85D4e24f25',\n [chainId.testnet]: '0xe1c4d3dce17bc111181ddf716f75bae49e61a336',\n} as const satisfies Record<ChainId, string>\n\n/** Default RPC URLs for each Tempo chain. */\nexport const rpcUrl = {\n [chainId.mainnet]: 'https://rpc.tempo.xyz',\n [chainId.testnet]: 'https://rpc.moderato.tempo.xyz',\n} as const satisfies Record<ChainId, string>\n\n/** Resolves the default currency. */\nexport function resolveCurrency(parameters: {\n /** Chain ID. */\n chainId?: number | undefined\n /** Whether in testnet mode. */\n testnet?: boolean | undefined\n}): string {\n const id = parameters.chainId ?? (parameters.testnet ? chainId.testnet : chainId.mainnet)\n return currency[id as keyof typeof currency] ?? tokens.pathUsd\n}\n","import type { Address, Client } from 'viem'\nimport { isAddressEqual } from 'viem'\nimport { readContract } from 'viem/actions'\nimport { Actions, Addresses } from 'viem/tempo'\nimport * as defaults from './defaults.js'\n\n/** Basis-point denominator (100% = 10 000 bps). */\nconst bps = 10_000n\n\n/** Default fallback currencies for auto-swap, in priority order. */\nexport const defaultCurrencies: readonly Address[] = [\n defaults.tokens.pathUsd as Address,\n defaults.tokens.usdc as Address,\n]\n\n/**\n * Finds the optimal swap calls to acquire `amountOut` of `tokenOut`,\n * returning an approve + buy call sequence if a viable route is found.\n *\n * Returns `undefined` if the account already holds enough of `tokenOut`\n * or no viable swap route exists from the given input tokens.\n */\nexport async function findCalls(\n client: Client,\n parameters: findCalls.Parameters,\n): Promise<findCalls.ReturnType> {\n const { account, amountOut, tokenOut, tokenIn, slippage } = parameters\n\n const candidates = tokenIn.filter((t) => !isAddressEqual(t, tokenOut))\n\n const balanceResults = await Promise.allSettled([\n readContract(client, Actions.token.getBalance.call({ account, token: tokenOut }) as never),\n ...candidates.map((t) =>\n readContract(client, Actions.token.getBalance.call({ account, token: t }) as never),\n ),\n ])\n\n // If the account already has enough of the target token, no swap needed.\n const targetBalance = balanceResults[0]!\n if (targetBalance.status === 'fulfilled' && (targetBalance.value as bigint) >= amountOut)\n return undefined\n\n // Find first candidate with enough balance to cover a swap.\n for (let i = 0; i < candidates.length; i++) {\n const result = balanceResults[i + 1]!\n if (result.status !== 'fulfilled') continue\n\n const balance = result.value as bigint\n if (balance <= 0n) continue\n\n const tokenIn = candidates[i]!\n\n try {\n const quotedAmountIn = await Actions.dex.getBuyQuote(client as never, {\n tokenIn,\n tokenOut,\n amountOut,\n })\n\n if (balance >= quotedAmountIn) {\n const maxAmountIn =\n quotedAmountIn + (quotedAmountIn * BigInt(Math.round(slippage * 100))) / bps\n return [\n Actions.token.approve.call({\n token: tokenIn,\n spender: Addresses.stablecoinDex,\n amount: maxAmountIn,\n }),\n Actions.dex.buy.call({\n tokenIn,\n tokenOut,\n amountOut,\n maxAmountIn,\n }),\n ]\n }\n } catch {}\n }\n\n throw new InsufficientFundsError({ currency: tokenOut })\n}\n\nexport declare namespace findCalls {\n type Parameters = {\n /** Address of the account to check balances for. */\n account: Address\n /** Amount of the target token needed. */\n amountOut: bigint\n /** Candidate input tokens to swap from, in priority order. */\n tokenIn: readonly Address[]\n /** Max slippage tolerance as a percentage (e.g. `1` = 1%). */\n slippage: number\n /** Address of the target token to acquire. */\n tokenOut: Address\n }\n\n /** `undefined` when no swap is needed (account has sufficient balance). */\n type ReturnType = readonly object[] | undefined\n}\n\n/** Resolves an auto-swap configuration value into concrete currencies and slippage. */\nexport function resolve(\n value: resolve.Value | undefined,\n defaultCurrencies: readonly Address[],\n): resolve.Resolved | false {\n if (!value) return false\n if (value === true) return { tokenIn: defaultCurrencies, slippage: 1 }\n const tokenIn = value.tokenIn\n ? [\n ...value.tokenIn,\n ...defaultCurrencies.filter((d) => !value.tokenIn!.some((c) => isAddressEqual(c, d))),\n ]\n : defaultCurrencies\n return {\n tokenIn,\n slippage: value.slippage ?? 1,\n }\n}\n\nexport declare namespace resolve {\n type Options = {\n /** Fallback tokens to try swapping from, in priority order. */\n tokenIn?: Address[] | undefined\n /** Max slippage tolerance as a percentage (e.g. `1` = 1%). @default 1 */\n slippage?: number | undefined\n }\n\n type Value = boolean | Options\n\n type Resolved = { tokenIn: readonly Address[]; slippage: number }\n}\n\nexport class InsufficientFundsError extends Error {\n override readonly name = 'InsufficientFundsError'\n\n constructor({ currency }: { currency: Address }) {\n super(\n `Insufficient funds: no balance in ${currency} and no viable swap route from fallback currencies.`,\n )\n }\n}\n","import type { Account } from 'viem'\nimport { parseUnits } from 'viem'\nimport * as Method from '../Method.js'\nimport * as z from '../zod.js'\n\n/**\n * Tempo charge intent for one-time TIP-20 token transfers.\n *\n * @see https://github.com/tempoxyz/payment-auth-spec/blob/main/specs/methods/tempo/draft-tempo-charge-00.md\n */\nexport const charge = Method.from({\n name: 'tempo',\n intent: 'charge',\n schema: {\n credential: {\n payload: z.discriminatedUnion('type', [\n z.object({ hash: z.hash(), type: z.literal('hash') }),\n z.object({ signature: z.signature(), type: z.literal('transaction') }),\n ]),\n },\n request: z.pipe(\n z.object({\n amount: z.amount(),\n chainId: z.optional(z.number()),\n currency: z.string(),\n decimals: z.number(),\n description: z.optional(z.string()),\n externalId: z.optional(z.string()),\n feePayer: z.optional(\n z.pipe(\n z.union([z.boolean(), z.custom<Account>()]),\n z.transform((v): boolean => (typeof v === 'object' ? true : v)),\n ),\n ),\n memo: z.optional(z.hash()),\n recipient: z.optional(z.string()),\n }),\n z.transform(({ amount, chainId, decimals, feePayer, memo, ...rest }) => ({\n ...rest,\n amount: parseUnits(amount, decimals).toString(),\n ...(chainId !== undefined || feePayer !== undefined || memo !== undefined\n ? {\n methodDetails: {\n ...(chainId !== undefined && { chainId }),\n ...(feePayer !== undefined && { feePayer }),\n ...(memo !== undefined && { memo }),\n },\n }\n : {}),\n })),\n ),\n },\n})\n\n/**\n * Tempo session intent for pay-as-you-go streaming payments.\n *\n * Uses cumulative vouchers over a payment channel. Credential payloads\n * are a discriminated union on `action`: open, topUp, voucher, close.\n */\nexport const session = Method.from({\n name: 'tempo',\n intent: 'session',\n schema: {\n credential: {\n payload: z.discriminatedUnion('action', [\n z.object({\n action: z.literal('open'),\n authorizedSigner: z.optional(z.string()),\n channelId: z.hash(),\n cumulativeAmount: z.amount(),\n signature: z.signature(),\n transaction: z.signature(),\n type: z.literal('transaction'),\n }),\n z.object({\n action: z.literal('topUp'),\n additionalDeposit: z.amount(),\n channelId: z.hash(),\n transaction: z.signature(),\n type: z.literal('transaction'),\n }),\n z.object({\n action: z.literal('voucher'),\n channelId: z.hash(),\n cumulativeAmount: z.amount(),\n signature: z.signature(),\n }),\n z.object({\n action: z.literal('close'),\n channelId: z.hash(),\n cumulativeAmount: z.amount(),\n signature: z.signature(),\n }),\n ]),\n },\n request: z.pipe(\n z.object({\n amount: z.amount(),\n chainId: z.optional(z.number()),\n channelId: z.optional(z.hash()),\n currency: z.string(),\n decimals: z.number(),\n escrowContract: z.optional(z.string()),\n feePayer: z.optional(\n z.pipe(\n z.union([z.boolean(), z.custom<Account>()]),\n z.transform((v): boolean => (typeof v === 'object' ? true : v)),\n ),\n ),\n minVoucherDelta: z.optional(z.amount()),\n recipient: z.optional(z.string()),\n suggestedDeposit: z.optional(z.amount()),\n unitType: z.string(),\n }),\n z.transform(\n ({\n amount,\n chainId,\n channelId,\n decimals,\n escrowContract,\n feePayer,\n minVoucherDelta,\n suggestedDeposit,\n ...rest\n }) => ({\n ...rest,\n amount: parseUnits(amount, decimals).toString(),\n ...(suggestedDeposit\n ? {\n suggestedDeposit: parseUnits(suggestedDeposit, decimals).toString(),\n }\n : {}),\n methodDetails: {\n escrowContract,\n ...(channelId !== undefined && { channelId }),\n ...(minVoucherDelta !== undefined && {\n minVoucherDelta: parseUnits(minVoucherDelta, decimals).toString(),\n }),\n ...(chainId !== undefined && { chainId }),\n ...(feePayer !== undefined && { feePayer }),\n },\n }),\n ),\n ),\n },\n})\n","import type * as Hex from 'ox/Hex'\nimport type { Address } from 'viem'\nimport { prepareTransactionRequest, sendCallsSync, signTransaction } from 'viem/actions'\nimport { tempo as tempo_chain } from 'viem/chains'\nimport { Actions } from 'viem/tempo'\nimport * as Credential from '../../Credential.js'\nimport * as Method from '../../Method.js'\nimport * as Account from '../../viem/Account.js'\nimport * as Client from '../../viem/Client.js'\nimport * as z from '../../zod.js'\nimport * as Attribution from '../Attribution.js'\nimport * as AutoSwap from '../internal/auto-swap.js'\nimport * as defaults from '../internal/defaults.js'\nimport * as Methods from '../Methods.js'\n\n/**\n * Creates a Tempo charge method intent for usage on the client.\n *\n * @example\n * ```ts\n * import { tempo } from 'mppx/client'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const charge = tempo.charge({\n * account: privateKeyToAccount('0x...'),\n * })\n * ```\n */\nexport function charge(parameters: charge.Parameters = {}) {\n const { clientId } = parameters\n const getClient = Client.getResolver({\n chain: tempo_chain,\n getClient: parameters.getClient,\n rpcUrl: defaults.rpcUrl,\n })\n const getAccount = Account.getResolver({ account: parameters.account })\n\n return Method.toClient(Methods.charge, {\n context: z.object({\n account: z.optional(z.custom<Account.getResolver.Parameters['account']>()),\n autoSwap: z.optional(z.custom<charge.AutoSwap>()),\n mode: z.optional(z.enum(['push', 'pull'])),\n }),\n\n async createCredential({ challenge, context }) {\n const chainId = challenge.request.methodDetails?.chainId\n const client = await getClient({ chainId })\n const account = getAccount(client, context)\n\n const mode =\n context?.mode ?? parameters.mode ?? (account.type === 'json-rpc' ? 'push' : 'pull')\n\n const { request } = challenge\n const { amount, methodDetails } = request\n const currency = request.currency as Address\n const recipient = request.recipient as Address\n\n const memo = methodDetails?.memo\n ? (methodDetails.memo as Hex.Hex)\n : Attribution.encode({ serverId: challenge.realm, clientId })\n\n const transferCall = Actions.token.transfer.call({\n amount: BigInt(amount),\n memo,\n to: recipient,\n token: currency,\n })\n\n const autoSwap = AutoSwap.resolve(\n context?.autoSwap ?? parameters.autoSwap,\n AutoSwap.defaultCurrencies,\n )\n\n const swapCalls = autoSwap\n ? await AutoSwap.findCalls(client, {\n account: account.address,\n amountOut: BigInt(amount),\n tokenOut: currency,\n tokenIn: autoSwap.tokenIn,\n slippage: autoSwap.slippage,\n })\n : undefined\n\n const calls = [...(swapCalls ?? []), transferCall]\n\n if (mode === 'push') {\n const { receipts } = await sendCallsSync(client, {\n account,\n calls: calls as never,\n experimental_fallback: true,\n })\n const hash = receipts?.[0]?.transactionHash\n if (!hash) throw new Error('No transaction receipt returned.')\n return Credential.serialize({\n challenge,\n payload: { hash, type: 'hash' },\n source: `did:pkh:eip155:${chainId}:${account.address}`,\n })\n }\n\n const prepared = await prepareTransactionRequest(client, {\n account,\n calls,\n ...(methodDetails?.feePayer && { feePayer: true }),\n nonceKey: 'expiring',\n } as never)\n // FIXME: figure out gas estimation issue for fee payer tx\n prepared.gas = prepared.gas! + 5_000n\n const signature = await signTransaction(client, prepared as never)\n\n return Credential.serialize({\n challenge,\n payload: { signature, type: 'transaction' },\n source: `did:pkh:eip155:${chainId}:${account.address}`,\n })\n },\n })\n}\n\nexport declare namespace charge {\n type AutoSwap = AutoSwap.resolve.Value\n\n type Parameters = {\n /**\n * Automatically swap from a fallback currency (pathUsd, USDC.e) via the\n * Tempo DEX when the user lacks sufficient balance of the target currency.\n *\n * @default false\n */\n autoSwap?: AutoSwap | undefined\n /** Client identifier used to derive the client fingerprint in attribution memos. */\n clientId?: string | undefined\n /**\n * Controls how the charge transaction is submitted.\n *\n * - `'push'`: Client broadcasts the transaction and sends the tx hash to the server.\n * - `'pull'`: Client signs the transaction and sends the serialized tx to the server for broadcast.\n *\n * @default `'push'` for JSON-RPC accounts, `'pull'` for local accounts.\n */\n mode?: 'push' | 'pull' | undefined\n } & Account.getResolver.Parameters &\n Client.getResolver.Parameters\n}\n","import { type Address, Signature } from 'ox'\nimport { SignatureEnvelope } from 'ox/tempo'\nimport type { Account, Client, Hex } from 'viem'\nimport { isAddressEqual, recoverTypedDataAddress } from 'viem'\nimport { signTypedData } from 'viem/actions'\nimport type { SignedVoucher, Voucher } from './Types.js'\n\n/** Must match the on-chain TempoStreamChannel DOMAIN_SEPARATOR name. */\nconst DOMAIN_NAME = 'Tempo Stream Channel'\n/** Must match the on-chain TempoStreamChannel DOMAIN_SEPARATOR version. */\nconst DOMAIN_VERSION = '1'\n\n/**\n * EIP-712 domain for voucher signing.\n */\nfunction getVoucherDomain(escrowContract: Address.Address, chainId: number) {\n return {\n name: DOMAIN_NAME,\n version: DOMAIN_VERSION,\n chainId,\n verifyingContract: escrowContract,\n } as const\n}\n\n/**\n * EIP-712 types for voucher signing.\n * Matches @tempo/stream-channels/voucher and on-chain VOUCHER_TYPEHASH.\n */\nconst voucherTypes = {\n Voucher: [\n { name: 'channelId', type: 'bytes32' },\n { name: 'cumulativeAmount', type: 'uint128' },\n ],\n} as const\n\n/**\n * Sign a voucher with an account.\n */\nexport async function signVoucher(\n client: Client,\n account: Account,\n message: Voucher,\n escrowContract: Address.Address,\n chainId: number,\n authorizedSigner?: Address.Address | undefined,\n): Promise<Hex> {\n const signature = await signTypedData(client, {\n account,\n domain: getVoucherDomain(escrowContract, chainId),\n types: voucherTypes,\n primaryType: 'Voucher',\n message: {\n channelId: message.channelId,\n cumulativeAmount: message.cumulativeAmount,\n },\n })\n\n // When a separate authorizedSigner is used (e.g. access key), unwrap the\n // keychain envelope — the escrow contract verifies raw ECDSA signatures\n // against authorizedSigner, not keychain-wrapped ones.\n // TODO: when TIP-1020 is implemented, we can remove this.\n if (authorizedSigner) {\n try {\n const envelope = SignatureEnvelope.from(signature as SignatureEnvelope.Serialized)\n if (envelope.type === 'keychain' && envelope.inner.type === 'secp256k1')\n return Signature.toHex(envelope.inner.signature)\n } catch {}\n }\n\n return signature\n}\n\n/**\n * Verify a voucher signature matches the expected signer.\n *\n * Only accepts raw secp256k1 signatures — the escrow contract verifies\n * via ecrecover. Keychain, p256, and webAuthn signatures are rejected.\n */\nexport async function verifyVoucher(\n escrowContract: Address.Address,\n chainId: number,\n voucher: SignedVoucher,\n expectedSigner: Address.Address,\n): Promise<boolean> {\n try {\n const domain = getVoucherDomain(escrowContract, chainId)\n const message = {\n channelId: voucher.channelId,\n cumulativeAmount: voucher.cumulativeAmount,\n }\n\n const envelope = SignatureEnvelope.from(voucher.signature)\n\n // Reject keychain signatures — the escrow contract verifies raw ECDSA\n // signatures against authorizedSigner, not keychain-wrapped ones.\n if (envelope.type === 'keychain') return false\n\n // Reject non-secp256k1 signatures (p256, webAuthn) — the escrow contract\n // only supports ecrecover-based verification.\n // TODO: remove this once TIP-1020 is implemented\n if (envelope.type !== 'secp256k1') return false\n\n const signer = await recoverTypedDataAddress({\n domain,\n types: voucherTypes,\n primaryType: 'Voucher',\n message,\n signature: voucher.signature,\n })\n return isAddressEqual(signer, expectedSigner)\n } catch {\n return false\n }\n}\n\n/**\n * Parse a voucher from credential payload.\n */\nexport function parseVoucherFromPayload(\n channelId: Hex,\n cumulativeAmount: string,\n signature: Hex,\n): SignedVoucher {\n return {\n channelId,\n cumulativeAmount: BigInt(cumulativeAmount),\n signature,\n }\n}\n","export const escrowAbi = [\n {\n type: 'function',\n name: 'CLOSE_GRACE_PERIOD',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'uint64',\n internalType: 'uint64',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'VOUCHER_TYPEHASH',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'channels',\n inputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n outputs: [\n {\n name: 'finalized',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'closeRequestedAt',\n type: 'uint64',\n internalType: 'uint64',\n },\n {\n name: 'payer',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'payee',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'authorizedSigner',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'deposit',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'settled',\n type: 'uint128',\n internalType: 'uint128',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'close',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'cumulativeAmount',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'signature',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'computeChannelId',\n inputs: [\n {\n name: 'payer',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'payee',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'salt',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'authorizedSigner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'domainSeparator',\n inputs: [],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'eip712Domain',\n inputs: [],\n outputs: [\n {\n name: 'fields',\n type: 'bytes1',\n internalType: 'bytes1',\n },\n {\n name: 'name',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'version',\n type: 'string',\n internalType: 'string',\n },\n {\n name: 'chainId',\n type: 'uint256',\n internalType: 'uint256',\n },\n {\n name: 'verifyingContract',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'salt',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'extensions',\n type: 'uint256[]',\n internalType: 'uint256[]',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getChannel',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'tuple',\n internalType: 'struct TempoStreamChannel.Channel',\n components: [\n {\n name: 'finalized',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'closeRequestedAt',\n type: 'uint64',\n internalType: 'uint64',\n },\n {\n name: 'payer',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'payee',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'authorizedSigner',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'deposit',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'settled',\n type: 'uint128',\n internalType: 'uint128',\n },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getChannelsBatch',\n inputs: [\n {\n name: 'channelIds',\n type: 'bytes32[]',\n internalType: 'bytes32[]',\n },\n ],\n outputs: [\n {\n name: 'channelStates',\n type: 'tuple[]',\n internalType: 'struct TempoStreamChannel.Channel[]',\n components: [\n {\n name: 'finalized',\n type: 'bool',\n internalType: 'bool',\n },\n {\n name: 'closeRequestedAt',\n type: 'uint64',\n internalType: 'uint64',\n },\n {\n name: 'payer',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'payee',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'authorizedSigner',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'deposit',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'settled',\n type: 'uint128',\n internalType: 'uint128',\n },\n ],\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'getVoucherDigest',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'cumulativeAmount',\n type: 'uint128',\n internalType: 'uint128',\n },\n ],\n outputs: [\n {\n name: '',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'view',\n },\n {\n type: 'function',\n name: 'open',\n inputs: [\n {\n name: 'payee',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'token',\n type: 'address',\n internalType: 'address',\n },\n {\n name: 'deposit',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'salt',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'authorizedSigner',\n type: 'address',\n internalType: 'address',\n },\n ],\n outputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'requestClose',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'settle',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'cumulativeAmount',\n type: 'uint128',\n internalType: 'uint128',\n },\n {\n name: 'signature',\n type: 'bytes',\n internalType: 'bytes',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'topUp',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n {\n name: 'additionalDeposit',\n type: 'uint256',\n internalType: 'uint256',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'function',\n name: 'withdraw',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n internalType: 'bytes32',\n },\n ],\n outputs: [],\n stateMutability: 'nonpayable',\n },\n {\n type: 'event',\n name: 'ChannelClosed',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n indexed: true,\n internalType: 'bytes32',\n },\n {\n name: 'payer',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'payee',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'settledToPayee',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'refundedToPayer',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'ChannelExpired',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n indexed: true,\n internalType: 'bytes32',\n },\n {\n name: 'payer',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'payee',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'ChannelOpened',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n indexed: true,\n internalType: 'bytes32',\n },\n {\n name: 'payer',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'payee',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'token',\n type: 'address',\n indexed: false,\n internalType: 'address',\n },\n {\n name: 'authorizedSigner',\n type: 'address',\n indexed: false,\n internalType: 'address',\n },\n {\n name: 'salt',\n type: 'bytes32',\n indexed: false,\n internalType: 'bytes32',\n },\n {\n name: 'deposit',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'CloseRequestCancelled',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n indexed: true,\n internalType: 'bytes32',\n },\n {\n name: 'payer',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'payee',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'CloseRequested',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n indexed: true,\n internalType: 'bytes32',\n },\n {\n name: 'payer',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'payee',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'closeGraceEnd',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'Settled',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n indexed: true,\n internalType: 'bytes32',\n },\n {\n name: 'payer',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'payee',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'cumulativeAmount',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'deltaPaid',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'newSettled',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'event',\n name: 'TopUp',\n inputs: [\n {\n name: 'channelId',\n type: 'bytes32',\n indexed: true,\n internalType: 'bytes32',\n },\n {\n name: 'payer',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'payee',\n type: 'address',\n indexed: true,\n internalType: 'address',\n },\n {\n name: 'additionalDeposit',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n {\n name: 'newDeposit',\n type: 'uint256',\n indexed: false,\n internalType: 'uint256',\n },\n ],\n anonymous: false,\n },\n {\n type: 'error',\n name: 'AmountExceedsDeposit',\n inputs: [],\n },\n {\n type: 'error',\n name: 'AmountNotIncreasing',\n inputs: [],\n },\n {\n type: 'error',\n name: 'ChannelAlreadyExists',\n inputs: [],\n },\n {\n type: 'error',\n name: 'ChannelFinalized',\n inputs: [],\n },\n {\n type: 'error',\n name: 'ChannelNotFound',\n inputs: [],\n },\n {\n type: 'error',\n name: 'CloseNotReady',\n inputs: [],\n },\n {\n type: 'error',\n name: 'DepositOverflow',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidPayee',\n inputs: [],\n },\n {\n type: 'error',\n name: 'InvalidSignature',\n inputs: [],\n },\n {\n type: 'error',\n name: 'NotPayee',\n inputs: [],\n },\n {\n type: 'error',\n name: 'NotPayer',\n inputs: [],\n },\n {\n type: 'error',\n name: 'TransferFailed',\n inputs: [],\n },\n] as const\n","import {\n type Account,\n type Address,\n type Client,\n decodeFunctionData,\n encodeFunctionData,\n getAbiItem,\n type Hex,\n isAddressEqual,\n type ReadContractReturnType,\n toFunctionSelector,\n} from 'viem'\nimport {\n call,\n prepareTransactionRequest,\n readContract,\n sendRawTransaction,\n sendRawTransactionSync,\n signTransaction,\n writeContract,\n} from 'viem/actions'\nimport { Transaction } from 'viem/tempo'\nimport { BadRequestError, ChannelClosedError, VerificationFailedError } from '../../Errors.js'\nimport * as defaults from '../internal/defaults.js'\nimport { escrowAbi } from './escrow.abi.js'\nimport type { SignedVoucher } from './Types.js'\n\nexport { escrowAbi }\n\nconst UINT128_MAX = 2n ** 128n - 1n\n\n/**\n * On-chain channel state from the escrow contract.\n */\nexport type OnChainChannel = ReadContractReturnType<typeof escrowAbi, 'getChannel'>\n\n/**\n * Read channel state from the escrow contract.\n */\nexport async function getOnChainChannel(\n client: Client,\n escrowContract: Address,\n channelId: Hex,\n): Promise<OnChainChannel> {\n return readContract(client, {\n address: escrowContract,\n abi: escrowAbi,\n functionName: 'getChannel',\n args: [channelId],\n })\n}\n\n/**\n * Verify a topUp by re-reading on-chain channel state.\n */\nexport async function verifyTopUpTransaction(\n client: Client,\n escrowContract: Address,\n channelId: Hex,\n previousDeposit: bigint,\n): Promise<{ deposit: bigint }> {\n const channel = await getOnChainChannel(client, escrowContract, channelId)\n\n if (channel.finalized) {\n throw new ChannelClosedError({ reason: 'channel is finalized on-chain' })\n }\n\n if (channel.deposit <= previousDeposit) {\n throw new VerificationFailedError({ reason: 'channel deposit did not increase' })\n }\n\n return { deposit: channel.deposit }\n}\n\nfunction assertUint128(amount: bigint): void {\n if (amount < 0n || amount > UINT128_MAX) {\n throw new VerificationFailedError({ reason: 'cumulativeAmount exceeds uint128 range' })\n }\n}\n\n/**\n * Submit a settle transaction on-chain.\n */\nexport async function settleOnChain(\n client: Client,\n escrowContract: Address,\n voucher: SignedVoucher,\n feePayer?: Account | undefined,\n): Promise<Hex> {\n assertUint128(voucher.cumulativeAmount)\n const args = [voucher.channelId, voucher.cumulativeAmount, voucher.signature] as const\n if (feePayer) {\n const data = encodeFunctionData({ abi: escrowAbi, functionName: 'settle', args })\n return sendFeePayerTx(client, feePayer, escrowContract, data, 'settle')\n }\n return writeContract(client, {\n account: client.account!,\n chain: client.chain,\n address: escrowContract,\n abi: escrowAbi,\n functionName: 'settle',\n args,\n })\n}\n\n/**\n * Submit a close transaction on-chain.\n */\nexport async function closeOnChain(\n client: Client,\n escrowContract: Address,\n voucher: SignedVoucher,\n account?: Account,\n feePayer?: Account | undefined,\n): Promise<Hex> {\n assertUint128(voucher.cumulativeAmount)\n const resolved = account ?? client.account\n if (!resolved)\n throw new Error(\n 'Cannot close channel: no account available. Provide an `account` in the session config or a `getClient` that returns an account-bearing client.',\n )\n const args = [voucher.channelId, voucher.cumulativeAmount, voucher.signature] as const\n if (feePayer) {\n const data = encodeFunctionData({ abi: escrowAbi, functionName: 'close', args })\n return sendFeePayerTx(client, feePayer, escrowContract, data, 'close')\n }\n return writeContract(client, {\n account: resolved,\n chain: client.chain,\n address: escrowContract,\n abi: escrowAbi,\n functionName: 'close',\n args,\n })\n}\n\n/**\n * Build, sign, and broadcast a fee-sponsored type-0x76 transaction.\n *\n * Follows the same signTransaction + sendRawTransactionSync pattern used\n * by broadcastOpenTransaction / broadcastTopUpTransaction, but originates\n * the transaction server-side (estimating gas and fees first).\n */\nasync function sendFeePayerTx(\n client: Client,\n feePayer: Account,\n to: Address,\n data: Hex,\n label: string,\n): Promise<Hex> {\n // Resolve the fee token for this chain so the tx pays gas in the correct\n // token. `feePayer: true` tells the prepare hook to use expiring nonces but\n // does NOT set feeToken automatically, so we must provide it explicitly.\n const chainId = client.chain?.id\n const feeToken = chainId\n ? defaults.currency[chainId as keyof typeof defaults.currency]\n : undefined\n\n const prepared = await prepareTransactionRequest(client, {\n account: feePayer,\n calls: [{ to, data }],\n feePayer: true,\n ...(feeToken ? { feeToken } : {}),\n } as never)\n\n const serialized = (await signTransaction(client, {\n ...prepared,\n account: feePayer,\n feePayer,\n } as never)) as Hex\n\n const receipt = await sendRawTransactionSync(client, {\n serializedTransaction: serialized as Transaction.TransactionSerializedTempo,\n })\n\n if (receipt.status !== 'success') {\n throw new VerificationFailedError({\n reason: `${label} transaction reverted: ${receipt.transactionHash}`,\n })\n }\n\n return receipt.transactionHash\n}\n\nconst escrowOpenSelector = /*#__PURE__*/ toFunctionSelector(\n getAbiItem({ abi: escrowAbi, name: 'open' }),\n)\n\nconst escrowTopUpSelector = /*#__PURE__*/ toFunctionSelector(\n getAbiItem({ abi: escrowAbi, name: 'topUp' }),\n)\n\nconst erc20ApproveSelector = /*#__PURE__*/ toFunctionSelector(\n 'function approve(address spender, uint256 amount)',\n)\n\nexport type BroadcastResult = {\n txHash: Hex | undefined\n onChain: OnChainChannel\n}\n\nexport async function broadcastOpenTransaction(parameters: {\n client: Client\n serializedTransaction: Hex\n escrowContract: Address\n channelId: Hex\n recipient: Address\n currency: Address\n feePayer?: Account | undefined\n /** When false, simulates instead of waiting for confirmation and returns derived on-chain state. @default true */\n waitForConfirmation?: boolean | undefined\n}): Promise<BroadcastResult> {\n const {\n client,\n serializedTransaction,\n escrowContract,\n channelId,\n recipient,\n currency,\n feePayer,\n waitForConfirmation = true,\n } = parameters\n\n const transaction = Transaction.deserialize(\n serializedTransaction as Transaction.TransactionSerializedTempo,\n )\n const calls = transaction.calls ?? []\n\n const openCall = calls.find((call) => {\n if (!call.to || !isAddressEqual(call.to, escrowContract)) return false\n if (!call.data) return false\n return call.data.slice(0, 10) === escrowOpenSelector\n })\n\n if (!openCall)\n throw new BadRequestError({\n reason: 'transaction does not contain a valid escrow open call',\n })\n\n if (feePayer) {\n for (const call of calls) {\n if (!call.to || !call.data) {\n throw new BadRequestError({\n reason: 'fee-sponsored transactions must not contain calls without target or data',\n })\n }\n const selector = call.data.slice(0, 10)\n const isEscrowOpen =\n isAddressEqual(call.to, escrowContract) && selector === escrowOpenSelector\n const isTokenApprove = isAddressEqual(call.to, currency) && selector === erc20ApproveSelector\n if (!isEscrowOpen && !isTokenApprove) {\n throw new BadRequestError({\n reason: 'fee-sponsored open transaction contains an unauthorized call',\n })\n }\n }\n }\n\n const { args: openArgs } = decodeFunctionData({ abi: escrowAbi, data: openCall.data! })\n const [payee, token, deposit, , authorizedSigner] = openArgs as readonly [\n Address,\n Address,\n bigint,\n Hex,\n Address,\n ]\n\n if (!isAddressEqual(payee, recipient)) {\n throw new VerificationFailedError({\n reason: 'open transaction payee does not match server recipient',\n })\n }\n if (!isAddressEqual(token, currency)) {\n throw new VerificationFailedError({\n reason: 'open transaction token does not match server currency',\n })\n }\n\n const resolvedFeeToken =\n transaction.feeToken ?? defaults.currency[client.chain?.id as keyof typeof defaults.currency]\n\n const serializedTransaction_final = await (async () => {\n if (feePayer) {\n return signTransaction(client, {\n ...transaction,\n account: feePayer,\n feePayer,\n feeToken: resolvedFeeToken,\n } as never)\n }\n return serializedTransaction\n })()\n\n if (!waitForConfirmation) {\n await call(client, {\n ...transaction,\n account: transaction.from,\n feeToken: resolvedFeeToken,\n calls,\n } as never)\n const txHash = await sendRawTransaction(client, {\n serializedTransaction: serializedTransaction_final as Transaction.TransactionSerializedTempo,\n })\n\n return {\n txHash,\n onChain: {\n finalized: false,\n closeRequestedAt: 0n,\n payer: transaction.from,\n payee,\n token,\n authorizedSigner,\n deposit,\n settled: 0n,\n } as OnChainChannel,\n }\n }\n\n let txHash: Hex | undefined\n try {\n const receipt = await sendRawTransactionSync(client, {\n serializedTransaction: serializedTransaction_final as Transaction.TransactionSerializedTempo,\n })\n\n if (receipt.status !== 'success') {\n throw new VerificationFailedError({\n reason: `open transaction reverted: ${receipt.transactionHash}`,\n })\n }\n\n txHash = receipt.transactionHash\n } catch (error) {\n const onChain = await getOnChainChannel(client, escrowContract, channelId)\n if (onChain.deposit > 0n) {\n return { txHash: undefined, onChain }\n }\n throw error\n }\n\n const onChain = await getOnChainChannel(client, escrowContract, channelId)\n\n return { txHash, onChain }\n}\n\nexport async function broadcastTopUpTransaction(parameters: {\n client: Client\n serializedTransaction: Hex\n escrowContract: Address\n channelId: Hex\n currency: Address\n declaredDeposit: bigint\n previousDeposit: bigint\n feePayer?: Account | undefined\n}): Promise<{ txHash: Hex; newDeposit: bigint }> {\n const {\n client,\n serializedTransaction,\n escrowContract,\n channelId,\n currency,\n declaredDeposit,\n previousDeposit,\n feePayer,\n } = parameters\n\n const transaction = Transaction.deserialize(\n serializedTransaction as Transaction.TransactionSerializedTempo,\n )\n const calls = transaction.calls ?? []\n\n const topUpCall = calls.find((call) => {\n if (!call.to || !isAddressEqual(call.to, escrowContract)) return false\n if (!call.data) return false\n return call.data.slice(0, 10) === escrowTopUpSelector\n })\n\n if (!topUpCall)\n throw new BadRequestError({\n reason: 'transaction does not contain a valid escrow topUp call',\n })\n\n if (feePayer) {\n for (const call of calls) {\n if (!call.to || !call.data) {\n throw new BadRequestError({\n reason: 'fee-sponsored transactions must not contain calls without target or data',\n })\n }\n const selector = call.data.slice(0, 10)\n const isEscrowTopUp =\n isAddressEqual(call.to, escrowContract) && selector === escrowTopUpSelector\n const isTokenApprove = isAddressEqual(call.to, currency) && selector === erc20ApproveSelector\n if (!isEscrowTopUp && !isTokenApprove) {\n throw new BadRequestError({\n reason: 'fee-sponsored topUp transaction contains an unauthorized call',\n })\n }\n }\n }\n\n const { args: topUpArgs } = decodeFunctionData({ abi: escrowAbi, data: topUpCall.data! })\n const [txChannelId, txAmount] = topUpArgs as [Hex, bigint]\n\n if (txChannelId.toLowerCase() !== channelId.toLowerCase()) {\n throw new VerificationFailedError({\n reason: 'topUp transaction channelId does not match payload channelId',\n })\n }\n if (BigInt(txAmount) !== declaredDeposit) {\n throw new VerificationFailedError({\n reason: `topUp transaction amount (${txAmount}) does not match declared additionalDeposit (${declaredDeposit})`,\n })\n }\n\n const serializedTransaction_final = await (async () => {\n if (feePayer) {\n return signTransaction(client, {\n ...transaction,\n account: feePayer,\n feePayer,\n feeToken:\n transaction.feeToken ??\n defaults.currency[client.chain?.id as keyof typeof defaults.currency],\n } as never)\n }\n return serializedTransaction\n })()\n\n const receipt = await sendRawTransactionSync(client, {\n serializedTransaction: serializedTransaction_final as Transaction.TransactionSerializedTempo,\n })\n\n if (receipt.status !== 'success') {\n throw new VerificationFailedError({\n reason: `topUp transaction reverted: ${receipt.transactionHash}`,\n })\n }\n\n const onChain = await getOnChainChannel(client, escrowContract, channelId)\n\n if (onChain.deposit <= previousDeposit) {\n throw new VerificationFailedError({ reason: 'channel deposit did not increase after topUp' })\n }\n\n return { txHash: receipt.transactionHash, newDeposit: onChain.deposit }\n}\n","import { AbiParameters, Hash } from 'ox'\nimport type * as Hex from 'ox/Hex'\n\n/**\n * Computes a channel ID from its parameters.\n *\n * Mirrors the onchain `computeChannelId` function: `keccak256(abi.encode(payer, payee, token, salt, authorizedSigner, escrowContract, chainId))`.\n */\nexport function computeId(parameters: computeId.Parameters): Hex.Hex {\n const encoded = AbiParameters.encode(\n AbiParameters.from([\n 'address payer',\n 'address payee',\n 'address token',\n 'bytes32 salt',\n 'address authorizedSigner',\n 'address escrowContract',\n 'uint256 chainId',\n ]),\n [\n parameters.payer,\n parameters.payee,\n parameters.token,\n parameters.salt,\n parameters.authorizedSigner,\n parameters.escrowContract,\n BigInt(parameters.chainId),\n ],\n )\n return Hash.keccak256(encoded)\n}\n\nexport declare namespace computeId {\n type Parameters = {\n /** Address authorized to sign vouchers on behalf of the payer. */\n authorizedSigner: Hex.Hex\n /** Chain ID of the network the escrow contract is deployed on. */\n chainId: number\n /** Address of the escrow contract. */\n escrowContract: Hex.Hex\n /** Address of the payee (recipient). */\n payee: Hex.Hex\n /** Address of the payer (sender). */\n payer: Hex.Hex\n /** Unique salt to differentiate channels with the same parameters. */\n salt: Hex.Hex\n /** Address of the token used for payment. */\n token: Hex.Hex\n }\n}\n","/**\n * Shared client-side channel operations.\n *\n * Provides the low-level helpers that both `session()`\n * and `sessionManager()` (orchestrator) rely on: escrow resolution, channel\n * ID computation, on-chain open/voucher/close payload construction, channel\n * recovery from on-chain state, and credential serialization.\n */\nimport { Hex } from 'ox'\nimport {\n type Address,\n encodeFunctionData,\n type Account as viem_Account,\n type Client as viem_Client,\n} from 'viem'\nimport { prepareTransactionRequest, signTransaction } from 'viem/actions'\nimport { Abis } from 'viem/tempo'\nimport type { Challenge } from '../../Challenge.js'\nimport * as Credential from '../../Credential.js'\nimport * as defaults from '../internal/defaults.js'\nimport { escrowAbi, getOnChainChannel } from '../session/Chain.js'\nimport * as Channel from '../session/Channel.js'\nimport type { SessionCredentialPayload } from '../session/Types.js'\nimport { signVoucher } from '../session/Voucher.js'\n\nexport type ChannelEntry = {\n channelId: Hex.Hex\n salt: Hex.Hex\n cumulativeAmount: bigint\n escrowContract: Address\n chainId: number\n opened: boolean\n}\n\nexport function resolveChainId(challenge: Challenge): number {\n const md = challenge.request.methodDetails as { chainId?: number } | undefined\n return md?.chainId ?? 0\n}\n\nexport function resolveEscrow(\n challenge: { request: { methodDetails?: unknown } },\n chainId: number,\n escrowContractOverride?: Address,\n): Address {\n const challengeEscrow = (challenge.request.methodDetails as { escrowContract?: string })\n ?.escrowContract as Address | undefined\n const escrow =\n challengeEscrow ??\n escrowContractOverride ??\n defaults.escrowContract[chainId as keyof typeof defaults.escrowContract]\n if (!escrow)\n throw new Error(\n 'No `escrowContract` available. Provide it in parameters or ensure the server challenge includes it.',\n )\n return escrow\n}\n\nexport function serializeCredential(\n challenge: Challenge,\n payload: SessionCredentialPayload,\n chainId: number,\n account: viem_Account,\n): string {\n return Credential.serialize({\n challenge,\n payload,\n source: `did:pkh:eip155:${chainId}:${account.address}`,\n })\n}\n\nexport async function createVoucherPayload(\n client: viem_Client,\n account: viem_Account,\n channelId: Hex.Hex,\n cumulativeAmount: bigint,\n escrowContract: Address,\n chainId: number,\n authorizedSigner?: Address | undefined,\n): Promise<SessionCredentialPayload> {\n const signature = await signVoucher(\n client,\n account,\n { channelId, cumulativeAmount },\n escrowContract,\n chainId,\n authorizedSigner,\n )\n return {\n action: 'voucher',\n channelId,\n cumulativeAmount: cumulativeAmount.toString(),\n signature,\n }\n}\n\nexport async function createClosePayload(\n client: viem_Client,\n account: viem_Account,\n channelId: Hex.Hex,\n cumulativeAmount: bigint,\n escrowContract: Address,\n chainId: number,\n authorizedSigner?: Address | undefined,\n): Promise<SessionCredentialPayload> {\n const signature = await signVoucher(\n client,\n account,\n { channelId, cumulativeAmount },\n escrowContract,\n chainId,\n authorizedSigner,\n )\n return {\n action: 'close',\n channelId,\n cumulativeAmount: cumulativeAmount.toString(),\n signature,\n }\n}\n\nexport async function createOpenPayload(\n client: viem_Client,\n account: viem_Account,\n options: {\n authorizedSigner?: Address | undefined\n escrowContract: Address\n payee: Address\n currency: Address\n deposit: bigint\n initialAmount: bigint\n chainId: number\n feePayer?: boolean | undefined\n },\n): Promise<{ entry: ChannelEntry; payload: SessionCredentialPayload }> {\n const { escrowContract, payee, currency, deposit, initialAmount, chainId, feePayer } = options\n const authorizedSigner = options.authorizedSigner ?? account.address\n\n const salt = Hex.random(32)\n const channelId = Channel.computeId({\n authorizedSigner,\n chainId,\n escrowContract,\n payee,\n payer: account.address,\n salt,\n token: currency,\n })\n\n const approveData = encodeFunctionData({\n abi: Abis.tip20,\n functionName: 'approve',\n args: [escrowContract, deposit],\n })\n const openData = encodeFunctionData({\n abi: escrowAbi,\n functionName: 'open',\n args: [payee, currency, deposit, salt, authorizedSigner],\n })\n\n const prepared = await prepareTransactionRequest(client, {\n account,\n calls: [\n { to: currency, data: approveData },\n { to: escrowContract, data: openData },\n ],\n ...(feePayer && { feePayer: true }),\n feeToken: currency,\n } as never)\n prepared.gas = prepared.gas! + 5_000n\n const transaction = (await signTransaction(client, prepared as never)) as Hex.Hex\n\n const signature = await signVoucher(\n client,\n account,\n { channelId, cumulativeAmount: initialAmount },\n escrowContract,\n chainId,\n options.authorizedSigner,\n )\n\n return {\n entry: {\n channelId,\n salt,\n cumulativeAmount: initialAmount,\n escrowContract,\n chainId,\n opened: true,\n },\n payload: {\n action: 'open',\n type: 'transaction',\n channelId,\n transaction,\n authorizedSigner,\n cumulativeAmount: initialAmount.toString(),\n signature,\n },\n }\n}\n\n/**\n * Attempt to recover an existing on-chain channel by reading its state.\n *\n * If the channel has a positive deposit and is not finalized, returns a\n * {@link ChannelEntry} with `cumulativeAmount` set to the on-chain settled\n * amount (the safe starting point for new vouchers).\n *\n * Returns `undefined` if the channel doesn't exist, has zero deposit,\n * or is already finalized.\n */\nexport async function tryRecoverChannel(\n client: viem_Client,\n escrowContract: Address,\n channelId: Hex.Hex,\n chainId: number,\n): Promise<ChannelEntry | undefined> {\n try {\n const onChain = await getOnChainChannel(client, escrowContract, channelId)\n\n if (onChain.deposit > 0n && !onChain.finalized) {\n return {\n channelId,\n salt: '0x' as Hex.Hex,\n cumulativeAmount: onChain.settled,\n escrowContract,\n chainId,\n opened: true,\n }\n }\n } catch {}\n\n return undefined\n}\n","import type { Hex } from 'ox'\nimport { type Address, parseUnits, type Account as viem_Account } from 'viem'\nimport { tempo as tempo_chain } from 'viem/chains'\nimport type * as Challenge from '../../Challenge.js'\nimport * as Method from '../../Method.js'\nimport * as Account from '../../viem/Account.js'\nimport * as Client from '../../viem/Client.js'\nimport * as z from '../../zod.js'\nimport * as defaults from '../internal/defaults.js'\nimport * as Methods from '../Methods.js'\nimport type { SessionCredentialPayload } from '../session/Types.js'\nimport { signVoucher } from '../session/Voucher.js'\nimport {\n type ChannelEntry,\n createOpenPayload,\n createVoucherPayload,\n resolveEscrow,\n serializeCredential,\n tryRecoverChannel,\n} from './ChannelOps.js'\n\nexport const sessionContextSchema = z.object({\n account: z.optional(z.custom<Account.getResolver.Parameters['account']>()),\n action: z.optional(z.enum(['open', 'topUp', 'voucher', 'close'])),\n channelId: z.optional(z.string()),\n cumulativeAmount: z.optional(z.amount()),\n cumulativeAmountRaw: z.optional(z.string()),\n transaction: z.optional(z.string()),\n authorizedSigner: z.optional(z.string()),\n additionalDeposit: z.optional(z.amount()),\n additionalDepositRaw: z.optional(z.string()),\n depositRaw: z.optional(z.string()),\n})\n\nexport type SessionContext = z.infer<typeof sessionContextSchema>\n\n/**\n * Creates a session payment method for use with `Mppx.create()`.\n *\n * Supports both auto mode (set `deposit` to manage channels automatically)\n * and manual mode (pass `context.action` to control each step).\n *\n * @example\n * ```ts\n * // Auto mode\n * import { Mppx, tempo } from 'mppx/client'\n *\n * const mppx = Mppx.create({\n * methods: [tempo({\n * account: privateKeyToAccount('0x...'),\n * deposit: '10',\n * })],\n * })\n *\n * const res = await mppx.fetch('/api/chat?prompt=hello')\n * ```\n *\n * @example\n * ```ts\n * // Manual mode\n * const mppx = Mppx.create({\n * methods: [tempo({ account })],\n * })\n *\n * const credential = await mppx.createCredential(response, {\n * action: 'voucher',\n * channelId: '0x...',\n * cumulativeAmount: '1',\n * })\n * ```\n */\nexport function session(parameters: session.Parameters = {}) {\n const { decimals = defaults.decimals } = parameters\n\n const getClient = Client.getResolver({\n chain: tempo_chain,\n getClient: parameters.getClient,\n rpcUrl: defaults.rpcUrl,\n })\n const getAccount = Account.getResolver({ account: parameters.account })\n const getAuthorizedSigner = (account: viem_Account) =>\n parameters.authorizedSigner ??\n (account as unknown as { accessKeyAddress?: Address }).accessKeyAddress\n\n const maxDeposit =\n parameters.maxDeposit !== undefined ? parseUnits(parameters.maxDeposit, decimals) : undefined\n\n const escrowContractMap = new Map<string, Address>()\n const channels = new Map<string, ChannelEntry>()\n const channelIdToKey = new Map<string, string>()\n\n function notifyUpdate(entry: ChannelEntry) {\n parameters.onChannelUpdate?.(entry)\n }\n\n function channelKey(payee: Address, currency: Address, escrow: Address): string {\n return `${payee.toLowerCase()}:${currency.toLowerCase()}:${escrow.toLowerCase()}`\n }\n\n function resolveEscrowCached(\n challenge: { request: { methodDetails?: unknown } },\n chainId: number,\n channelId?: string,\n ): Address {\n if (channelId) {\n const cached = escrowContractMap.get(channelId)\n if (cached) return cached\n }\n return resolveEscrow(challenge, chainId, parameters.escrowContract)\n }\n\n async function autoManageCredential(\n challenge: Challenge.Challenge,\n account: viem_Account,\n context?: SessionContext,\n ): Promise<string> {\n const md = challenge.request.methodDetails as\n | { chainId?: number; escrowContract?: string; channelId?: string; feePayer?: boolean }\n | undefined\n const chainId = md?.chainId ?? 0\n const client = await getClient({ chainId })\n const escrowContract = resolveEscrowCached(challenge, chainId)\n const payee = challenge.request.recipient as Address\n const currency = challenge.request.currency as Address\n const amount = BigInt(challenge.request.amount as string)\n\n const suggestedDepositRaw = (challenge.request as { suggestedDeposit?: string })\n .suggestedDeposit\n const suggestedDeposit = suggestedDepositRaw ? BigInt(suggestedDepositRaw) : undefined\n\n const deposit = (() => {\n if (context?.depositRaw) return BigInt(context.depositRaw)\n if (suggestedDeposit !== undefined && maxDeposit !== undefined)\n return suggestedDeposit < maxDeposit ? suggestedDeposit : maxDeposit\n if (suggestedDeposit !== undefined) return suggestedDeposit\n if (maxDeposit !== undefined) return maxDeposit\n if (parameters.deposit !== undefined) return parseUnits(parameters.deposit, decimals)\n throw new Error(\n 'No deposit amount available. Set `deposit`, `maxDeposit`, or ensure the server challenge includes `suggestedDeposit`.',\n )\n })()\n\n const authorizedSigner = getAuthorizedSigner(account)\n\n const key = channelKey(payee, currency, escrowContract)\n let entry = channels.get(key)\n\n if (!entry) {\n const suggestedChannelId = (context?.channelId ?? md?.channelId) as Hex.Hex | undefined\n if (suggestedChannelId) {\n const recovered = await tryRecoverChannel(\n client,\n escrowContract,\n suggestedChannelId,\n chainId,\n )\n if (recovered) {\n const contextCumulative = context?.cumulativeAmountRaw\n ? BigInt(context.cumulativeAmountRaw)\n : context?.cumulativeAmount\n ? parseUnits(context.cumulativeAmount, decimals)\n : undefined\n if (contextCumulative !== undefined) recovered.cumulativeAmount = contextCumulative\n channels.set(key, recovered)\n channelIdToKey.set(recovered.channelId, key)\n escrowContractMap.set(recovered.channelId, escrowContract)\n entry = recovered\n notifyUpdate(entry)\n } else if (context?.channelId) {\n throw new Error(\n `Channel ${context.channelId} cannot be reused (closed or not found on-chain).`,\n )\n }\n }\n }\n\n let payload: SessionCredentialPayload\n\n if (entry?.opened) {\n entry.cumulativeAmount += amount\n payload = await createVoucherPayload(\n client,\n account,\n entry.channelId,\n entry.cumulativeAmount,\n escrowContract,\n chainId,\n authorizedSigner,\n )\n notifyUpdate(entry)\n } else {\n const result = await createOpenPayload(client, account, {\n authorizedSigner,\n escrowContract,\n payee,\n currency,\n deposit,\n initialAmount: amount,\n chainId,\n feePayer: md?.feePayer,\n })\n channels.set(key, result.entry)\n channelIdToKey.set(result.entry.channelId, key)\n escrowContractMap.set(result.entry.channelId, escrowContract)\n payload = result.payload\n notifyUpdate(result.entry)\n }\n\n return serializeCredential(challenge, payload, chainId, account)\n }\n\n async function manualCredential(\n challenge: Challenge.Challenge,\n account: viem_Account,\n context: SessionContext,\n ): Promise<string> {\n const md = challenge.request.methodDetails as\n | { chainId?: number; escrowContract?: string; channelId?: string }\n | undefined\n const chainId = md?.chainId ?? 0\n const client = await getClient({ chainId })\n\n const action = context.action!\n const {\n channelId: channelIdRaw,\n transaction,\n authorizedSigner: contextAuthorizedSigner,\n } = context\n const authorizedSigner = (contextAuthorizedSigner as Address) ?? getAuthorizedSigner(account)\n const channelId = channelIdRaw as Hex.Hex\n const cumulativeAmount = context.cumulativeAmountRaw\n ? BigInt(context.cumulativeAmountRaw)\n : context.cumulativeAmount\n ? parseUnits(context.cumulativeAmount, decimals)\n : undefined\n const resolvedAdditionalDeposit = context.additionalDepositRaw\n ? BigInt(context.additionalDepositRaw)\n : context.additionalDeposit\n ? parseUnits(context.additionalDeposit, decimals)\n : undefined\n\n const escrowContract = resolveEscrowCached(challenge, chainId, channelId)\n escrowContractMap.set(channelId, escrowContract)\n\n let payload: SessionCredentialPayload\n\n switch (action) {\n case 'open': {\n if (!transaction) throw new Error('transaction required for open action')\n if (cumulativeAmount === undefined)\n throw new Error('cumulativeAmount required for open action')\n const signature = await signVoucher(\n client,\n account,\n { channelId, cumulativeAmount },\n escrowContract,\n chainId,\n authorizedSigner,\n )\n payload = {\n action: 'open',\n type: 'transaction',\n channelId,\n transaction: transaction as Hex.Hex,\n authorizedSigner: authorizedSigner ?? account.address,\n cumulativeAmount: cumulativeAmount.toString(),\n signature,\n }\n break\n }\n\n case 'topUp':\n if (!transaction) throw new Error('transaction required for topUp action')\n if (resolvedAdditionalDeposit === undefined)\n throw new Error('additionalDeposit required for topUp action')\n payload = {\n action: 'topUp',\n type: 'transaction',\n channelId,\n transaction: transaction as Hex.Hex,\n additionalDeposit: resolvedAdditionalDeposit.toString(),\n }\n break\n\n case 'voucher': {\n if (cumulativeAmount === undefined)\n throw new Error('cumulativeAmount required for voucher action')\n payload = await createVoucherPayload(\n client,\n account,\n channelId,\n cumulativeAmount,\n escrowContract,\n chainId,\n authorizedSigner,\n )\n const key = channelIdToKey.get(channelId)\n if (key) {\n const entry = channels.get(key)\n if (entry) {\n entry.cumulativeAmount =\n entry.cumulativeAmount > cumulativeAmount ? entry.cumulativeAmount : cumulativeAmount\n notifyUpdate(entry)\n }\n }\n break\n }\n\n case 'close': {\n if (cumulativeAmount === undefined)\n throw new Error('cumulativeAmount required for close action')\n const signature = await signVoucher(\n client,\n account,\n { channelId, cumulativeAmount },\n escrowContract,\n chainId,\n authorizedSigner,\n )\n payload = {\n action: 'close',\n channelId,\n cumulativeAmount: cumulativeAmount.toString(),\n signature,\n }\n const closeKey = channelIdToKey.get(channelId)\n if (closeKey) {\n const entry = channels.get(closeKey)\n if (entry) {\n entry.opened = false\n entry.cumulativeAmount =\n entry.cumulativeAmount > cumulativeAmount ? entry.cumulativeAmount : cumulativeAmount\n notifyUpdate(entry)\n }\n }\n break\n }\n }\n\n return serializeCredential(challenge, payload, chainId, account)\n }\n\n return Method.toClient(Methods.session, {\n context: sessionContextSchema,\n\n async createCredential({ challenge, context }) {\n const chainId = challenge.request.methodDetails?.chainId ?? 0\n const client = await getClient({ chainId })\n const account = getAccount(client, context)\n\n if (!context?.action && (parameters.deposit !== undefined || maxDeposit !== undefined))\n return autoManageCredential(challenge, account, context)\n\n if (context?.action) return manualCredential(challenge, account, context)\n\n throw new Error(\n 'No `action` in context and no `deposit` or `maxDeposit` configured. Either provide context with action/channelId/cumulativeAmount, or configure `deposit`/`maxDeposit` for auto-management.',\n )\n },\n })\n}\n\nexport declare namespace session {\n type Parameters = Account.getResolver.Parameters &\n Client.getResolver.Parameters & {\n /** Address authorized to sign vouchers. Defaults to the account address. Use when a separate access key (e.g. secp256k1) signs vouchers while the root account funds the channel. */\n authorizedSigner?: Address | undefined\n /** Token decimals for parsing human-readable amounts (default: 6). */\n decimals?: number | undefined\n /** Initial deposit amount in human-readable units (e.g. \"10\" for 10 tokens). When set, the method handles the full channel lifecycle (open, voucher, cumulative tracking) automatically. */\n deposit?: string | undefined\n /** Escrow contract address override. Derived from challenge or defaults if not provided. */\n escrowContract?: Address | undefined\n /** Maximum deposit in human-readable units (e.g. \"10\"). Caps the server's `suggestedDeposit`. Enables auto-management like `deposit`. */\n maxDeposit?: string | undefined\n /** Called whenever channel state changes (open, voucher, close, recovery). */\n onChannelUpdate?: ((entry: ChannelEntry) => void) | undefined\n }\n}\n","import * as Challenge from '../../Challenge.js'\nimport type * as Method from '../../Method.js'\nimport type * as z from '../../zod.js'\n\n// We tag wrappers with a global symbol so we can recognize wrappers created by mppx,\n// even across multiple module instances/bundles. This lets restore() avoid clobbering\n// an unrelated fetch installed by user code or another library.\nconst MPPX_FETCH_WRAPPER = Symbol.for('mppx.fetch.wrapper')\n\ntype WrappedFetch = typeof globalThis.fetch & {\n [MPPX_FETCH_WRAPPER]?: typeof globalThis.fetch\n}\n\nlet originalFetch: typeof globalThis.fetch | undefined\n\n/**\n * Creates a fetch wrapper that automatically handles 402 Payment Required responses.\n *\n * @example\n * ```ts\n * import { Fetch, tempo } from 'mppx/client'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * const fetch = Fetch.from({\n * methods: [\n * tempo({\n * account: privateKeyToAccount('0x...'),\n * }),\n * ],\n * })\n *\n * // Use the wrapped fetch — handles 402 automatically\n * const res = await fetch('https://api.example.com/resource')\n * ```\n *\n */\nexport function from<const methods extends readonly Method.AnyClient[]>(\n config: from.Config<methods>,\n): from.Fetch<methods> {\n const { fetch = globalThis.fetch, methods, onChallenge } = config\n // Always operate on the true underlying fetch to avoid wrapper-on-wrapper stacking,\n // which can duplicate retries and make restore semantics fragile.\n const baseFetch = unwrapFetch(fetch)\n\n const wrappedFetch = async (input: RequestInfo | URL, init?: from.RequestInit<methods>) => {\n // Pass init through untouched to preserve object identity for non-402 responses.\n const response = await baseFetch(input, init)\n\n if (response.status !== 402) return response\n\n // Only extract context for payment handling after confirming 402.\n const context = (init as Record<string, unknown> | undefined)?.context\n const { context: _, ...fetchInit } = (init ?? {}) as Record<string, unknown>\n\n // Parse all challenges from the response (supports merged WWW-Authenticate headers).\n // Match in client preference order: iterate the client's methods array and pick the\n // first method that has a matching challenge, so the client controls priority.\n const challenges = Challenge.fromResponseList(response)\n\n let challenge: Challenge.Challenge | undefined\n let mi: (typeof methods)[number] | undefined\n for (const m of methods) {\n const match = challenges.find((c) => c.method === m.name && c.intent === m.intent)\n if (match) {\n challenge = match\n mi = m\n break\n }\n }\n if (!challenge || !mi)\n throw new Error(\n `No method found for challenges: ${challenges.map((c) => `${c.method}.${c.intent}`).join(', ')}. Available: ${methods.map((m) => `${m.name}.${m.intent}`).join(', ')}`,\n )\n\n const onChallengeCredential = onChallenge\n ? await onChallenge(challenge, {\n createCredential: async (overrideContext?: AnyContextFor<methods>) =>\n resolveCredential(challenge, mi!, overrideContext ?? context),\n })\n : undefined\n const credential = onChallengeCredential ?? (await resolveCredential(challenge, mi, context))\n validateCredentialHeaderValue(credential)\n\n return baseFetch(input, {\n ...fetchInit,\n headers: withAuthorizationHeader(fetchInit.headers, credential),\n })\n }\n\n // Record the wrapped target so future polyfill() / restore() calls can detect origin\n // and safely unwrap only mppx-installed wrappers.\n ;(wrappedFetch as WrappedFetch)[MPPX_FETCH_WRAPPER] = baseFetch\n return wrappedFetch as from.Fetch<methods>\n}\n\n/** Union of all context types from all methods that have context schemas. */\ntype AnyContextFor<methods extends readonly Method.AnyClient[]> = {\n [K in keyof methods]: NonNullable<methods[K]['context']> extends infer ctx\n ? ctx extends z.ZodMiniType\n ? z.input<ctx>\n : undefined\n : undefined\n}[number]\n\nexport declare namespace from {\n type Config<methods extends readonly Method.AnyClient[] = readonly Method.AnyClient[]> = {\n /** Custom fetch function to wrap. Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch\n /** Array of methods to use. */\n methods: methods\n /** Called when a 402 challenge is received, before credential creation. */\n onChallenge?:\n | ((\n challenge: Challenge.Challenge,\n helpers: {\n createCredential: (context?: AnyContextFor<methods>) => Promise<string>\n },\n ) => Promise<string | undefined>)\n | undefined\n }\n\n type Fetch<methods extends readonly Method.AnyClient[] = readonly Method.AnyClient[]> = (\n input: RequestInfo | URL,\n init?: RequestInit<methods>,\n ) => Promise<Response>\n\n type RequestInit<methods extends readonly Method.AnyClient[] = readonly Method.AnyClient[]> =\n globalThis.RequestInit & {\n /** Context to pass to the method intent's createCredential. */\n context?: AnyContextFor<methods>\n }\n}\n\n/**\n * Replaces the global `fetch` with a payment-aware wrapper.\n *\n * @example\n * ```ts\n * import { Fetch, tempo } from 'mppx/client'\n * import { privateKeyToAccount } from 'viem/accounts'\n *\n * Fetch.polyfill({\n * methods: [\n * tempo({\n * account: privateKeyToAccount('0x...'),\n * }),\n * ],\n * })\n *\n * // Global fetch now handles 402 automatically\n * const res = await fetch('https://api.example.com/resource')\n * ```\n */\nexport function polyfill<const methods extends readonly Method.AnyClient[]>(\n config: polyfill.Config<methods>,\n): void {\n // Defensive guard for runtimes/tests where fetch might be non-configurable.\n const descriptor = Object.getOwnPropertyDescriptor(globalThis, 'fetch')\n if (!descriptor || (!descriptor.writable && !descriptor.set)) {\n throw new Error('globalThis.fetch is not writable')\n }\n\n if (!originalFetch) originalFetch = globalThis.fetch\n globalThis.fetch = from({ ...config, fetch: globalThis.fetch }) as typeof globalThis.fetch\n}\n\nexport declare namespace polyfill {\n type Config<methods extends readonly Method.AnyClient[] = readonly Method.AnyClient[]> =\n from.Config<methods>\n}\n\n/**\n * Restores the original `fetch` after calling `polyfill`.\n *\n * @example\n * ```ts\n * import { Fetch } from 'mppx/client'\n *\n * Fetch.polyfill({ methods: [...] })\n *\n * // ... use payment-aware fetch ...\n *\n * Fetch.restore()\n * ```\n */\nexport function restore(): void {\n // Only restore if the current fetch is still an mppx wrapper.\n // If app code replaced fetch after polyfill(), we must not overwrite it.\n if (originalFetch && isWrappedFetch(globalThis.fetch)) {\n globalThis.fetch = originalFetch\n originalFetch = undefined\n }\n}\n\n/** @internal Normalizes headers to a plain object for spreading. */\nfunction normalizeHeaders(headers: unknown): Record<string, string> {\n if (!headers) return {}\n if (headers instanceof Headers) {\n const result: Record<string, string> = {}\n headers.forEach((value, key) => {\n result[key] = value\n })\n return result\n }\n if (Array.isArray(headers)) return Object.fromEntries(headers)\n return headers as Record<string, string>\n}\n\n/** @internal */\nfunction withAuthorizationHeader(headers: unknown, credential: string): Record<string, string> {\n const normalized = normalizeHeaders(headers)\n // Remove any existing Authorization header regardless of casing to avoid\n // duplicate/conflicting credentials on retry.\n for (const key of Object.keys(normalized)) {\n if (key.toLowerCase() === 'authorization') delete normalized[key]\n }\n normalized.Authorization = credential\n return normalized\n}\n\n/** @internal */\nfunction unwrapFetch(fetch: typeof globalThis.fetch): typeof globalThis.fetch {\n let current = fetch as WrappedFetch\n while (current[MPPX_FETCH_WRAPPER]) {\n current = current[MPPX_FETCH_WRAPPER] as WrappedFetch\n }\n return current as typeof globalThis.fetch\n}\n\n/** @internal */\nfunction isWrappedFetch(fetch: typeof globalThis.fetch): fetch is WrappedFetch {\n return Boolean((fetch as WrappedFetch)[MPPX_FETCH_WRAPPER])\n}\n\n/** @internal */\nfunction validateCredentialHeaderValue(credential: string): void {\n if (!credential.trim()) throw new Error('Credential header value must be non-empty')\n if (credential.includes('\\r') || credential.includes('\\n')) {\n throw new Error('Credential header value contains illegal newline characters')\n }\n}\n\n/** @internal */\nasync function resolveCredential(\n challenge: Challenge.Challenge,\n mi: Method.AnyClient,\n context: unknown,\n): Promise<string> {\n const parsedContext = mi.context && context !== undefined ? mi.context.parse(context) : undefined\n return mi.createCredential(\n parsedContext !== undefined ? { challenge, context: parsedContext } : ({ challenge } as never),\n )\n}\n","import { Base64 } from 'ox'\nimport type { Hex } from 'viem'\nimport type { SessionReceipt } from './Types.js'\n\n/**\n * Create a session receipt.\n */\nexport function createSessionReceipt(params: {\n challengeId: string\n channelId: Hex\n acceptedCumulative: bigint\n spent: bigint\n units?: number | undefined\n txHash?: Hex | undefined\n}): SessionReceipt {\n return {\n method: 'tempo',\n intent: 'session',\n status: 'success',\n timestamp: new Date().toISOString(),\n reference: params.channelId,\n challengeId: params.challengeId,\n channelId: params.channelId,\n acceptedCumulative: params.acceptedCumulative.toString(),\n spent: params.spent.toString(),\n ...(params.units !== undefined && { units: params.units }),\n ...(params.txHash !== undefined && { txHash: params.txHash }),\n }\n}\n\n/**\n * Serialize a session receipt to the Payment-Receipt header format.\n */\nexport function serializeSessionReceipt(receipt: SessionReceipt): string {\n const json = JSON.stringify(receipt)\n return Base64.fromString(json, { pad: false, url: true })\n}\n\n/**\n * Deserialize a Payment-Receipt header value to a session receipt.\n */\nexport function deserializeSessionReceipt(encoded: string): SessionReceipt {\n const json = Base64.toString(encoded)\n return JSON.parse(json) as SessionReceipt\n}\n","/**\n * SSE (Server-Sent Events) utilities for metered streaming payments.\n *\n * Provides event formatting/parsing, balance polling, the core\n * `serve()` loop that meters an async iterable into a ReadableStream\n * of SSE events, and helpers (`toResponse`, `fromRequest`) for\n * building HTTP responses from the stream.\n */\nimport type { Hex } from 'viem'\nimport * as Credential from '../../Credential.js'\nimport * as ChannelStore from './ChannelStore.js'\nimport { createSessionReceipt } from './Receipt.js'\nimport type { NeedVoucherEvent, SessionCredentialPayload, SessionReceipt } from './Types.js'\n\n/**\n * Format a session receipt as a Server-Sent Event.\n *\n * Produces a valid SSE event string with `event: payment-receipt`\n * and the receipt JSON as the `data` field.\n */\nexport function formatReceiptEvent(receipt: SessionReceipt): string {\n return `event: payment-receipt\\ndata: ${JSON.stringify(receipt)}\\n\\n`\n}\n\n/**\n * Format a need-voucher event as a Server-Sent Event.\n *\n * Emitted when the channel balance is exhausted mid-stream.\n * The client responds by sending a new voucher credential to\n * any mppx-protected endpoint.\n */\nexport function formatNeedVoucherEvent(params: NeedVoucherEvent): string {\n return `event: payment-need-voucher\\ndata: ${JSON.stringify(params)}\\n\\n`\n}\n\n/**\n * Parsed SSE event (discriminated union by `type`).\n */\nexport type SseEvent =\n | { type: 'message'; data: string }\n | { type: 'payment-need-voucher'; data: NeedVoucherEvent }\n | { type: 'payment-receipt'; data: SessionReceipt }\n\n/**\n * Parse a raw SSE event string into a typed event.\n *\n * Handles the three event types used by mppx streaming:\n * - `message` (default / no event field) — application data\n * - `payment-need-voucher` — balance exhausted, client should send voucher\n * - `payment-receipt` — final receipt\n */\nexport function parseEvent(raw: string): SseEvent | null {\n let eventType = 'message'\n const dataLines: string[] = []\n\n for (const line of raw.split('\\n')) {\n if (line.startsWith('event: ')) {\n eventType = line.slice(7).trim()\n } else if (line.startsWith('data: ')) {\n dataLines.push(line.slice(6))\n } else if (line === 'data:') {\n dataLines.push('')\n }\n }\n\n if (dataLines.length === 0) return null\n const data = dataLines.join('\\n')\n\n switch (eventType) {\n case 'message':\n return { type: 'message', data }\n case 'payment-need-voucher':\n return { type: 'payment-need-voucher', data: JSON.parse(data) as NeedVoucherEvent }\n case 'payment-receipt':\n return { type: 'payment-receipt', data: JSON.parse(data) as SessionReceipt }\n default:\n return { type: 'message', data }\n }\n}\n\nexport type SessionController = {\n charge(): Promise<void>\n}\n\n/**\n * Wrap an async iterable with payment metering, producing an SSE stream.\n *\n * `generate` may be either:\n * - An `AsyncIterable<string>` — each yielded value is automatically charged\n * (one `tickCost` per value).\n * - A callback `(stream: SessionController) => AsyncIterable<string>` — the\n * generator controls when charges happen by calling `stream.charge()`.\n *\n * For each emitted value the stream:\n * 1. Deducts `tickCost` from the channel balance atomically (auto or manual).\n * 2. If balance is sufficient, emits `event: message` with the value.\n * 3. If balance is exhausted, emits `event: payment-need-voucher`\n * and polls store until the client tops up the channel.\n * 4. On generator completion, emits a final `event: payment-receipt`.\n *\n * Returns a `ReadableStream<Uint8Array>` suitable for use as an HTTP response body.\n */\nexport function serve(options: serve.Options): ReadableStream<Uint8Array> {\n const {\n store,\n channelId,\n challengeId,\n tickCost,\n generate,\n pollIntervalMs = 100,\n signal,\n } = options\n\n const encoder = new TextEncoder()\n\n return new ReadableStream<Uint8Array>({\n async start(controller) {\n const aborted = () => signal?.aborted ?? false\n const emit = (event: string) => controller.enqueue(encoder.encode(event))\n\n const charge = () =>\n chargeOrWait({\n store,\n channelId,\n amount: tickCost,\n emit,\n pollIntervalMs,\n signal,\n })\n\n const iterable: AsyncIterable<string> =\n typeof generate === 'function' ? generate({ charge }) : generate\n\n try {\n for await (const value of iterable) {\n if (aborted()) break\n\n if (typeof generate !== 'function') await charge()\n\n controller.enqueue(encoder.encode(`event: message\\ndata: ${value}\\n\\n`))\n }\n\n if (!aborted()) {\n const channel = await store.getChannel(channelId)\n if (channel) {\n const receipt = createSessionReceipt({\n challengeId,\n channelId,\n acceptedCumulative: channel.highestVoucherAmount,\n spent: channel.spent,\n units: channel.units,\n })\n controller.enqueue(encoder.encode(formatReceiptEvent(receipt)))\n }\n }\n } catch (e) {\n if (!aborted()) controller.error(e)\n } finally {\n controller.close()\n }\n },\n })\n}\n\nexport declare namespace serve {\n type Options = {\n store: ChannelStore.ChannelStore\n channelId: Hex\n challengeId: string\n tickCost: bigint\n generate: AsyncIterable<string> | ((stream: SessionController) => AsyncIterable<string>)\n pollIntervalMs?: number | undefined\n signal?: AbortSignal | undefined\n }\n}\n\n/**\n * Wrap a `ReadableStream<Uint8Array>` (from {@link serve}) in an HTTP\n * `Response` with the correct SSE headers.\n */\nexport function toResponse(body: ReadableStream<Uint8Array>): Response {\n return new Response(body, {\n headers: {\n 'Cache-Control': 'no-cache, no-transform',\n Connection: 'keep-alive',\n 'Content-Type': 'text/event-stream; charset=utf-8',\n },\n })\n}\n\n/**\n * Extract `channelId`, `challengeId`, and `tickCost` from a `Request`'s\n * `Authorization: Payment …` header.\n *\n * This is a convenience for callers that receive a raw `Request` and need\n * the parameters required by {@link serve}.\n */\nexport function fromRequest(request: Request): fromRequest.Context {\n const header = request.headers.get('Authorization')\n if (!header) throw new Error('Missing Authorization header.')\n\n const payment = Credential.extractPaymentScheme(header)\n if (!payment) throw new Error('Missing Payment credential in Authorization header.')\n\n const credential = Credential.deserialize(payment)\n const payload = credential.payload as SessionCredentialPayload\n return {\n challengeId: credential.challenge.id,\n channelId: payload.channelId,\n tickCost: BigInt(credential.challenge.request.amount as string),\n }\n}\n\nexport declare namespace fromRequest {\n type Context = {\n challengeId: string\n channelId: Hex\n tickCost: bigint\n }\n}\n\n/**\n * Atomically deduct `amount` from a channel, retrying when balance is\n * insufficient. Uses `store.waitForUpdate()` when available for\n * event-driven wakeups, falling back to polling otherwise. Emits\n * `payment-need-voucher` events via `emit` while waiting.\n */\nasync function chargeOrWait(options: {\n store: ChannelStore.ChannelStore\n channelId: Hex\n amount: bigint\n emit: (event: string) => void\n pollIntervalMs: number\n signal?: AbortSignal | undefined\n}): Promise<void> {\n const { store, channelId, amount, emit, pollIntervalMs, signal } = options\n\n let result = await ChannelStore.deductFromChannel(store, channelId, amount)\n\n if (!result.ok) {\n // Emit a single need-voucher event, then poll/wait until the client\n // sends an updated voucher. The requiredCumulative is constant here:\n // `spent` only changes on successful deduction (which exits the loop),\n // so re-emitting on every poll cycle would just cause redundant\n // voucher POSTs from the client.\n emit(\n formatNeedVoucherEvent({\n channelId,\n requiredCumulative: (result.channel.spent + amount).toString(),\n acceptedCumulative: result.channel.highestVoucherAmount.toString(),\n deposit: result.channel.deposit.toString(),\n }),\n )\n\n while (!result.ok) {\n await waitForUpdate(store, channelId, pollIntervalMs, signal)\n result = await ChannelStore.deductFromChannel(store, channelId, amount)\n }\n }\n}\n\nasync function waitForUpdate(\n store: ChannelStore.ChannelStore,\n channelId: Hex,\n pollIntervalMs: number,\n signal?: AbortSignal,\n): Promise<void> {\n if (signal?.aborted) throw new Error('Aborted while waiting for voucher')\n if (store.waitForUpdate) {\n await Promise.race([store.waitForUpdate(channelId), ...(signal ? [abortPromise(signal)] : [])])\n } else {\n await sleep(pollIntervalMs)\n }\n if (signal?.aborted) throw new Error('Aborted while waiting for voucher')\n}\n\nfunction abortPromise(signal: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (signal.aborted) return resolve()\n signal.addEventListener('abort', () => resolve(), { once: true })\n })\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Check whether a `Response` carries an SSE event stream.\n *\n * Returns `true` when the `Content-Type` header starts with\n * `text/event-stream` (case-insensitive, ignoring charset params).\n */\nexport function isEventStream(response: Response): boolean {\n const ct = response.headers.get('content-type')\n return ct?.toLowerCase().startsWith('text/event-stream') ?? false\n}\n\n/**\n * Parse an SSE `Response` body into an async iterable of `data:` payloads.\n *\n * Yields the raw `data:` field content for each SSE event in the stream.\n * Events whose data matches the `skip` predicate are silently dropped\n * (e.g. `[DONE]` sentinels used by OpenAI-compatible APIs).\n *\n * Each yielded value typically becomes one charge tick when fed to\n * {@link serve} via the SSE transport's auto-charge mode.\n *\n * @example\n * ```ts\n * const upstream = await fetch('https://api.example.com/stream')\n * for await (const data of Sse.iterateData(upstream)) {\n * console.log(data)\n * }\n * ```\n */\nexport async function* iterateData(\n response: Response,\n options?: iterateData.Options,\n): AsyncGenerator<string> {\n const skip = options?.skip\n const body = response.body\n if (!body) return\n\n const reader = body.getReader()\n const decoder = new TextDecoder()\n let buffer = ''\n\n try {\n while (true) {\n const { value, done } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n\n // Split on double-newline SSE event boundaries.\n const events = buffer.split('\\n\\n')\n // Last element may be incomplete — keep in buffer.\n buffer = events.pop() ?? ''\n\n for (const event of events) {\n if (!event.trim()) continue\n const data = extractData(event)\n if (data === null) continue\n if (skip?.(data)) continue\n yield data\n }\n }\n\n // Flush remaining buffer.\n if (buffer.trim()) {\n const data = extractData(buffer)\n if (data !== null && !skip?.(data)) yield data\n }\n } finally {\n reader.releaseLock()\n }\n}\n\nexport declare namespace iterateData {\n type Options = {\n /** Predicate to skip specific data payloads (e.g. `d => d === '[DONE]'`). */\n skip?: ((data: string) => boolean) | undefined\n }\n}\n\n/** Extract the `data:` field value from a single SSE event block. */\nfunction extractData(event: string): string | null {\n const dataLines: string[] = []\n for (const line of event.split('\\n')) {\n if (line.startsWith('data: ')) dataLines.push(line.slice(6))\n else if (line === 'data:') dataLines.push('')\n }\n return dataLines.length > 0 ? dataLines.join('\\n') : null\n}\n","import type { Hex } from 'ox'\nimport type { Address } from 'viem'\nimport type * as Challenge from '../../Challenge.js'\nimport * as Fetch from '../../client/internal/Fetch.js'\nimport type * as Account from '../../viem/Account.js'\nimport type * as Client from '../../viem/Client.js'\nimport { deserializeSessionReceipt } from '../session/Receipt.js'\nimport { parseEvent } from '../session/Sse.js'\nimport type { SessionReceipt } from '../session/Types.js'\nimport type { ChannelEntry } from './ChannelOps.js'\nimport { session as sessionPlugin } from './Session.js'\n\nexport type SessionManager = {\n readonly channelId: Hex.Hex | undefined\n readonly cumulative: bigint\n readonly opened: boolean\n\n open(options?: { deposit?: bigint }): Promise<void>\n fetch(input: RequestInfo | URL, init?: RequestInit): Promise<PaymentResponse>\n sse(\n input: RequestInfo | URL,\n init?: RequestInit & {\n onReceipt?: ((receipt: SessionReceipt) => void) | undefined\n signal?: AbortSignal | undefined\n },\n ): Promise<AsyncIterable<string>>\n close(): Promise<SessionReceipt | undefined>\n}\n\nexport type PaymentResponse = Response & {\n receipt: SessionReceipt | null\n challenge: Challenge.Challenge | null\n channelId: Hex.Hex | null\n cumulative: bigint\n}\n\n/**\n * Creates a session manager that handles the full client payment lifecycle:\n * channel open, incremental vouchers, SSE streaming, and channel close.\n *\n * Internally delegates to the `session()` method for all\n * channel state management and credential creation, and to `Fetch.from`\n * for the 402 challenge/retry flow.\n *\n * ## Session resumption\n *\n * All channel state is held **in memory**. If the client process restarts,\n * the session is lost and a new on-chain channel will be opened on the next\n * request — the previous channel's deposit is orphaned until manually closed.\n *\n * When the server includes a `channelId` in the 402 challenge `methodDetails`,\n * the client will attempt to recover the channel by reading its on-chain state\n * via `getOnChainChannel()`. If the channel has a positive deposit and is not\n * finalized, it resumes from the on-chain settled amount.\n */\nexport function sessionManager(parameters: sessionManager.Parameters): SessionManager {\n const fetchFn = parameters.fetch ?? globalThis.fetch\n\n let channel: ChannelEntry | null = null\n let lastChallenge: Challenge.Challenge | null = null\n let lastUrl: RequestInfo | URL | null = null\n let spent = 0n\n\n const method = sessionPlugin({\n account: parameters.account,\n authorizedSigner: parameters.authorizedSigner,\n getClient: parameters.client ? () => parameters.client! : parameters.getClient,\n escrowContract: parameters.escrowContract,\n decimals: parameters.decimals,\n maxDeposit: parameters.maxDeposit,\n onChannelUpdate(entry) {\n if (entry.channelId !== channel?.channelId) spent = 0n\n channel = entry\n },\n })\n\n const wrappedFetch = Fetch.from({\n fetch: fetchFn,\n methods: [method],\n onChallenge: async (challenge, _helpers) => {\n lastChallenge = challenge\n return undefined\n },\n })\n\n function updateSpentFromReceipt(receipt: SessionReceipt | null | undefined) {\n if (!receipt || receipt.channelId !== channel?.channelId) return\n const next = BigInt(receipt.spent)\n spent = spent > next ? spent : next\n }\n\n function toPaymentResponse(response: Response): PaymentResponse {\n const receiptHeader = response.headers.get('Payment-Receipt')\n const receipt = receiptHeader ? deserializeSessionReceipt(receiptHeader) : null\n updateSpentFromReceipt(receipt)\n return Object.assign(response, {\n receipt,\n challenge: lastChallenge,\n channelId: channel?.channelId ?? null,\n cumulative: channel?.cumulativeAmount ?? 0n,\n })\n }\n\n async function doFetch(input: RequestInfo | URL, init?: RequestInit): Promise<PaymentResponse> {\n lastUrl = input\n const response = await wrappedFetch(input, init)\n return toPaymentResponse(response)\n }\n\n const self: SessionManager = {\n get channelId() {\n return channel?.channelId\n },\n get cumulative() {\n return channel?.cumulativeAmount ?? 0n\n },\n get opened() {\n return channel?.opened ?? false\n },\n\n async open(options) {\n if (channel?.opened) return\n\n if (!lastChallenge) {\n throw new Error(\n 'No challenge available. Make a request first to receive a 402 challenge, or pass a challenge via .fetch()/.sse().',\n )\n }\n\n const deposit = options?.deposit\n const credential = await method.createCredential({\n challenge: lastChallenge as never,\n context: {\n ...(deposit !== undefined && { depositRaw: deposit.toString() }),\n },\n })\n\n if (!lastUrl) throw new Error('No URL available — call fetch() or sse() before open().')\n const response = await fetchFn(lastUrl, {\n method: 'POST',\n headers: { Authorization: credential },\n })\n if (!response.ok) {\n const body = await response.text().catch(() => '')\n const wwwAuth = response.headers.get('WWW-Authenticate') ?? ''\n throw new Error(\n `Open request failed with status ${response.status}${body ? `: ${body}` : ''}${wwwAuth ? ` [WWW-Authenticate: ${wwwAuth}]` : ''}`,\n )\n }\n },\n\n fetch: doFetch,\n\n async sse(input, init) {\n const { onReceipt, signal, ...fetchInit } = init ?? {}\n\n const sseInit = {\n ...fetchInit,\n headers: {\n ...fetchInit.headers,\n Accept: 'text/event-stream',\n },\n ...(signal ? { signal } : {}),\n }\n\n const response = await doFetch(input, sseInit)\n\n // Snapshot the challenge at SSE open time so concurrent\n // calls don't overwrite it.\n const sseChallenge = lastChallenge\n\n if (!response.body) throw new Error('Response has no body.')\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n\n async function* iterate(): AsyncGenerator<string> {\n let buffer = ''\n\n try {\n while (true) {\n if (signal?.aborted) break\n\n const { done, value } = await reader.read()\n if (done) break\n\n buffer += decoder.decode(value, { stream: true })\n\n const parts = buffer.split('\\n\\n')\n buffer = parts.pop()!\n\n for (const part of parts) {\n if (!part.trim()) continue\n\n const event = parseEvent(part)\n if (!event) continue\n\n switch (event.type) {\n case 'message':\n yield event.data\n break\n\n case 'payment-need-voucher': {\n if (!channel || !sseChallenge) break\n const required = BigInt(event.data.requiredCumulative)\n channel.cumulativeAmount =\n channel.cumulativeAmount > required ? channel.cumulativeAmount : required\n\n const credential = await method.createCredential({\n challenge: sseChallenge as never,\n context: {\n action: 'voucher',\n channelId: channel.channelId,\n cumulativeAmountRaw: channel.cumulativeAmount.toString(),\n },\n })\n const voucherResponse = await fetchFn(input, {\n method: 'POST',\n headers: { Authorization: credential },\n })\n if (!voucherResponse.ok) {\n throw new Error(`Voucher POST failed with status ${voucherResponse.status}`)\n }\n break\n }\n\n case 'payment-receipt':\n updateSpentFromReceipt(event.data)\n onReceipt?.(event.data)\n break\n }\n }\n }\n } finally {\n reader.releaseLock()\n }\n }\n\n return iterate()\n },\n\n async close() {\n if (!channel?.opened || !lastChallenge) return undefined\n\n const credential = await method.createCredential({\n challenge: lastChallenge as never,\n context: {\n action: 'close',\n channelId: channel.channelId,\n cumulativeAmountRaw: spent.toString(),\n },\n })\n\n let receipt: SessionReceipt | undefined\n if (lastUrl) {\n const response = await fetchFn(lastUrl, {\n method: 'POST',\n headers: { Authorization: credential },\n })\n const receiptHeader = response.headers.get('Payment-Receipt')\n if (receiptHeader) receipt = deserializeSessionReceipt(receiptHeader)\n }\n\n return receipt\n },\n }\n\n return self\n}\n\nexport declare namespace sessionManager {\n type Parameters = Account.getResolver.Parameters &\n Client.getResolver.Parameters & {\n /** Address authorized to sign vouchers. Defaults to the account address. */\n authorizedSigner?: Address | undefined\n /** Viem client instance. Shorthand for `getClient: () => client`. */\n client?: import('viem').Client | undefined\n /** Token decimals used to convert `maxDeposit` to raw units. Defaults to `6`. */\n decimals?: number | undefined\n /** Escrow contract address. */\n escrowContract?: Address | undefined\n fetch?: typeof globalThis.fetch | undefined\n /** Maximum deposit in human-readable units (e.g. `'10'` for 10 tokens). Converted to raw units via `decimals`. */\n maxDeposit?: string | undefined\n }\n}\n","import { charge as charge_ } from './Charge.js'\nimport { session as sessionIntent_ } from './Session.js'\nimport { sessionManager as session_ } from './SessionManager.js'\n\n/**\n * Creates both Tempo `charge` and `session` client methods from shared parameters.\n *\n * @example\n * ```ts\n * import { Mppx, tempo } from 'mppx/client'\n *\n * const mppx = Mppx.create({\n * methods: [tempo({ account })],\n * })\n * ```\n */\nexport function tempo(parameters: tempo.Parameters = {}) {\n return [charge_(parameters), sessionIntent_(parameters)] as const\n}\n\nexport namespace tempo {\n export type Parameters = charge_.Parameters & sessionIntent_.Parameters\n\n /** Creates a Tempo `charge` client method for one-time TIP-20 token transfers. */\n export const charge = charge_\n /** Creates a client-side streaming session for managing payment channels. */\n export const session = session_\n}\n","import type * as Challenge from '../Challenge.js'\nimport type * as Method from '../Method.js'\nimport type * as z from '../zod.js'\nimport * as Fetch from './internal/Fetch.js'\nimport * as Transport from './Transport.js'\n\nexport type Methods = readonly (Method.AnyClient | readonly Method.AnyClient[])[]\n\n/**\n * Client-side payment handler.\n */\nexport type Mppx<\n methods extends Methods = Methods,\n transport extends Transport.Transport = Transport.Transport,\n> = {\n /** Payment-aware fetch function that automatically handles 402 responses. */\n fetch: Fetch.from.Fetch<FlattenMethods<methods>>\n /** The original, unwrapped fetch function (pre-polyfill). Useful when you need to make requests that should not be intercepted (e.g. 402 probes for websocket auth). */\n rawFetch: typeof globalThis.fetch\n /** Methods to configure. */\n methods: FlattenMethods<methods>\n /** The transport used. */\n transport: transport\n /** Creates a credential from a payment-required response by routing to the correct method. */\n createCredential: (\n response: Transport.ResponseOf<transport>,\n context?: AnyContextFor<FlattenMethods<methods>> | undefined,\n ) => Promise<string>\n}\n\n/**\n * Creates a client-side payment handler from an array of methods.\n *\n * Returns a payment handler with a `fetch` function that automatically handles\n * 402 Payment Required responses. By default, also polyfills `globalThis.fetch`.\n *\n * @example\n * ```ts\n * import { Mppx, tempo } from 'mppx/client'\n *\n * const mppx = Mppx.create({\n * methods: [tempo({ account })],\n * })\n *\n * // Use the returned fetch — handles 402 automatically\n * const res = await mppx.fetch('/resource')\n *\n * // Or use globalThis.fetch (polyfilled by default)\n * const res2 = await fetch('/resource')\n * ```\n */\nexport function create<\n const methods extends Methods,\n const transport extends Transport.Transport<any, any> = Transport.Transport<\n RequestInit,\n Response\n >,\n>(config: create.Config<methods, transport>): Mppx<methods, transport> {\n const { onChallenge, polyfill = true, transport = Transport.http() as transport } = config\n\n const rawFetch = config.fetch ?? globalThis.fetch\n\n const methods = config.methods.flat() as unknown as FlattenMethods<methods>\n\n const resolvedOnChallenge = onChallenge as Fetch.from.Config<\n FlattenMethods<methods>\n >['onChallenge']\n const config_fetch = {\n ...(config.fetch && { fetch: config.fetch }),\n ...(resolvedOnChallenge && { onChallenge: resolvedOnChallenge }),\n methods,\n } satisfies Fetch.from.Config<FlattenMethods<methods>>\n const fetch = Fetch.from<FlattenMethods<methods>>(config_fetch)\n\n if (polyfill) Fetch.polyfill(config_fetch)\n return {\n fetch,\n rawFetch,\n methods,\n transport,\n async createCredential(response: Transport.ResponseOf<transport>, context?: unknown) {\n const challenge = transport.getChallenge(response as never) as Challenge.Challenge\n\n const mi = methods.find((m) => m.name === challenge.method && m.intent === challenge.intent)\n if (!mi)\n throw new Error(\n `No method found for \"${challenge.method}.${challenge.intent}\". Available: ${methods.map((m) => `${m.name}.${m.intent}`).join(', ')}`,\n )\n\n const parsedContext =\n mi.context && context !== undefined ? mi.context.parse(context) : undefined\n\n return mi.createCredential(\n parsedContext !== undefined\n ? { challenge, context: parsedContext }\n : ({ challenge } as never),\n )\n },\n }\n}\n\n/**\n * Restores the original `fetch` after `create()` polyfilled it.\n *\n * @example\n * ```ts\n * import { Mppx, tempo } from 'mppx/client'\n *\n * Mppx.create({ methods: [tempo({ account })] })\n *\n * // ... use payment-aware fetch ...\n *\n * Mppx.restore()\n * ```\n */\nexport function restore(): void {\n Fetch.restore()\n}\n\nexport declare namespace create {\n type Config<\n methods extends Methods = Methods,\n transport extends Transport.Transport = Transport.Transport,\n > = {\n /** Custom fetch function to wrap. Defaults to `globalThis.fetch`. */\n fetch?: typeof globalThis.fetch\n /** Called when a 402 challenge is received, before credential creation. */\n onChallenge?:\n | ((\n challenge: Challenge.Challenge,\n helpers: {\n createCredential: (context?: AnyContextFor<FlattenMethods<methods>>) => Promise<string>\n },\n ) => Promise<string | undefined>)\n | undefined\n /** Array of methods to use. Accepts individual clients or tuples (e.g. from `tempo()`). */\n methods: methods\n /** Whether to polyfill `globalThis.fetch` with the payment-aware wrapper. @default true */\n polyfill?: boolean | undefined\n /** Transport to use (defaults to HTTP). */\n transport?: transport | undefined\n }\n}\n\n/**\n * Union of all context types from all methods that have context schemas.\n * @internal\n */\ntype AnyContextFor<methods extends readonly Method.AnyClient[]> = {\n [method in keyof methods]: NonNullable<methods[method]['context']> extends infer ctx\n ? ctx extends z.ZodMiniType\n ? z.input<ctx>\n : undefined\n : undefined\n}[number]\n\n/**\n * Flattens a methods config tuple, preserving positional types.\n * @internal\n */\ntype FlattenMethods<methods extends Methods> = methods extends readonly [\n infer head,\n ...infer tail extends Methods,\n]\n ? head extends readonly Method.AnyClient[]\n ? readonly [...head, ...FlattenMethods<tail>]\n : head extends Method.AnyClient\n ? readonly [head, ...FlattenMethods<tail>]\n : never\n : readonly []\n","import * as Challenge from '../Challenge.js'\nimport * as Credential from '../Credential.js'\nimport * as Mcp from '../Mcp.js'\n\n/**\n * Client-side transport adapter.\n *\n * Abstracts how challenges are received and credentials are sent\n * across different transport protocols (HTTP, MCP, etc.).\n */\nexport type Transport<in out request = unknown, in out response = unknown> = {\n /** Transport name for identification. */\n name: string\n /** Checks if a response indicates payment is required. */\n isPaymentRequired: (response: response) => boolean\n /** Extracts the challenge from a payment-required response. */\n getChallenge: (response: response) => Challenge.Challenge\n /** Attaches a credential to a request. */\n setCredential: (request: request, credential: string) => request\n}\nexport type AnyTransport = Transport<any, any>\n\n/** Extracts the response type from a transport. */\nexport type ResponseOf<transport extends Transport> =\n transport extends Transport<any, infer response> ? response : never\n\n/** Extracts the request type from a transport. */\nexport type RequestOf<transport extends Transport> =\n transport extends Transport<infer request, any> ? request : never\n\n/**\n * Creates a custom client-side transport.\n *\n * @example\n * ```ts\n * import { Transport } from 'mppx/client'\n *\n * const custom = Transport.from({\n * name: 'custom',\n * isPaymentRequired(response) { ... },\n * getChallenge(response) { ... },\n * setCredential(request, credential) { ... },\n * })\n * ```\n */\nexport function from<request, response>(\n transport: Transport<request, response>,\n): Transport<request, response> {\n return transport\n}\n\n/**\n * HTTP transport for client-side payment handling.\n *\n * - Detects payment required via 402 status\n * - Extracts challenges from `WWW-Authenticate` header\n * - Sends credentials via `Authorization` header\n */\nexport function http() {\n return from<RequestInit, Response>({\n name: 'http',\n\n isPaymentRequired(response) {\n return response.status === 402\n },\n\n getChallenge(response) {\n return Challenge.fromResponse(response)\n },\n\n setCredential(request, credential) {\n const headers = new Headers(request.headers)\n headers.set('Authorization', credential)\n return { ...request, headers }\n },\n })\n}\n\n/**\n * MCP transport for client-side payment handling.\n *\n * - Detects payment required via error code -32042\n * - Extracts challenges from `error.data.challenges[0]`\n * - Sends credentials via `_meta[\"org.paymentauth/credential\"]`\n */\nexport function mcp() {\n return from<Mcp.Request, Mcp.Response>({\n name: 'mcp',\n\n isPaymentRequired(response) {\n return 'error' in response && response.error?.code === Mcp.paymentRequiredCode\n },\n\n getChallenge(response) {\n if (!('error' in response) || !response.error) throw new Error('Response is not an error.')\n const challenge = response.error.data?.challenges[0]\n if (!challenge) throw new Error('No challenge in error response.')\n return challenge\n },\n\n setCredential(request, credential) {\n const parsed = Credential.deserialize(credential)\n return {\n ...request,\n params: {\n ...request.params,\n _meta: {\n ...request.params?._meta,\n [Mcp.credentialMetaKey]: parsed,\n },\n },\n }\n },\n })\n}\n"],"mappings":"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","names":["BaseError","type","signature","keccak256","docsPath","BaseError","err","keccak256","recoverPublicKey","hash","signature","toHex","secp256k1","yParityOrV","recoveryBit","size","recoverAddress","hash","signature","recoverPublicKey","list","encode","BaseError","chainId","nonce","hash","keccak256","signature","recoverAddress","BaseError","docsPath","nonce","docsPath","cause","BaseError","BaseError","type","decimals","sha256","toHex","version","sha256","version","BaseError","size","hash","version","size","docsPath","cause","nonceManager","type","nonce","chainId","format","decimals","nonceManager","prepareTransactionRequest","chainId","getChainId","nonce","from","gas","type","e","error","getBlock","block","BaseError","nonce","docsPath","signature","size","isEqual","keccak256","index","value","input","event","listeners","cleanup","poll","cacheKey","stringify","transport","eventName","args","BaseError","docsPath","type","nonce","type","BaseError","chainId","concat","hash","e","writeContract","BaseError","shouldRetry","resolve","version","call","concat","BaseError","resolve","chainId","receipts","hash","status","version","statusCode","stringify","resolve","result","BaseError","size","type","key","chainId","InvalidChainIdError","hash","size","version","slice","FeeCapTooHighError","TipAboveFeeCapError","BaseError","signature","type","chainId","nonce","blobs","commitments","proofs","v","chainId","nonce","signature","toHex","signature","promiseCache","uid","stringify","BaseError","length","BaseError","hash","size","resolve","stringify","body","response","BaseError","stringify","types","type","types","type","stringify","size","struct","type","assert","from","validate","from","assert","signature","validate","serializedType","type","chainId","nonce","signature","BaseError","decimals","hash","index","nonce","hash","result","BaseError","InvalidWrappedSignatureError","assert","from","magicBytes","unwrap","validate","wrap","magicBytes","assert","InvalidWrappedSignatureError","from","unwrap","signature","wrap","validate","signature","hash","signature","recoverAddress","stringify","transport","hash","stringify","resolve","from","nonce","supportsWalletNamespace","nonce","type","BaseError","chainId","concat","hash","e","chainId","types","type","uid","BaseError","wait","body","from","amount","decimals","charge","amount","currency","charge","stripe","InvalidSerializedError","VerificationError","assert","deserialize","from","fromRpc","magicBytes","serialize","toRpc","validate","verify","magicBytes","assert","type","secp256k1","signature","deserialize","size","fromHex","InvalidSerializedError","from","fromRpc","serialize","toHex","toRpc","validate","verify","VerificationError","from","fromRpc","chainId","nonce","signature","fromTuple","deserialize","fromTupleList","list","toRpc","chainId","nonce","signature","toTuple","serialize","toTupleList","list","deserialize","from","fromRpc","fromTuple","getSignPayload","hash","serialize","toRpc","toTuple","from","fromRpc","chainId","signature","fromTuple","hexToNumber","deserialize","getSignPayload","hash","toTuple","serialize","toRpc","type","numberToHex","from","from","from","assert","hash","from","serialize","serialize","fromRpc","fromRpcType","toRpc","toRpcType","toRpcType","fromRpcType","fromRpc","call","toRpc","toRpc","toRpc","call","toRpcType","assert","deserialize","from","getSignPayload","hash","serialize","validate","assert","chainId","call","deserialize","nonce","signature","fromTupleList","validate","fromTuple","getSignPayload","from","serialize","toTupleList","toTuple","hash","getType","type","deserialize","serialize","signature","nonce","chainId","hash","feePayerSignature","from","formatTransaction","nonce","formatTransactionReceipt","formatTransactionRequest","type","formatTransaction","formatTransactionReceipt","formatTransactionRequest","signature","serialize","hash","chainId","type","signature","accountKeychain","feeManager","stablecoinDex","tip20Factory","tip403Registry","validator","call","authorize","chainId","revoke","call","accountKeychain","updateLimit","getMetadata","getRemainingLimit","getPool","feeManager","getLiquidityBalance","call","rebalanceSwap","mint","burn","buy","call","stablecoinDex","cancel","cancelStale","createPair","getBalance","getBuyQuote","getOrder","getOrderbook","getTickLevel","getSellQuote","place","amount","type","placeFlip","sell","withdraw","hash","getUserToken","call","feeManager","setUserToken","validator","getValidatorToken","setValidatorToken","getNonce","call","create","type","call","tip403Registry","setAdmin","modifyWhitelist","modifyBlacklist","getData","isAuthorized","claim","call","distribute","amount","getGlobalRewardPerToken","getPendingRewards","getUserRewardInfo","setRecipient","burn","burnSync","create","createSync","getBalance","getMetadata","mint","mintSync","watchBurn","watchCreate","watchMint","approve","call","amount","burnBlocked","from","burn","burnSync","changeTransferPolicy","create","currency","tip20Factory","createSync","getAllowance","getBalance","getMetadata","decimals","getRoleAdmin","hasRole","grantRoles","mint","mintSync","pause","renounceRoles","revokeRoles","setSupplyCap","setRoleAdmin","transfer","unpause","prepareUpdateQuoteToken","updateQuoteToken","watchBurn","watchCreate","watchMint","type","add","call","validator","changeOwner","changeStatus","getNextFullDkgCeremony","getOwner","get","index","getByIndex","getCount","list","setNextFullDkgCeremony","update","deserialize","getResolver","rpcUrl","chainId","hash","encode","nonce","tokenIn","resolve","defaultCurrencies","currency","charge","from","amount","chainId","decimals","escrowContract","charge","getResolver","chainId","amount","currency","encode","resolve","hash","signature","escrowContract","chainId","signature","escrowContract","chainId","escrowContract","signature","escrowContract","currency","chainId","signature","session","decimals","getResolver","currency","chainId","escrowContract","amount","signature","from","fetch","session","from","buffer","tempo","charge","session","create","restore","Transport_exports","from","http","from","http","create","polyfill","http","fetch","from","restore"]}