viem 0.0.0-main.20230611T031808 → 0.0.0-main.20230611T032431
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/chains.js.map +1 -1
- package/dist/cjs/errors/version.js +1 -1
- package/dist/cjs/utils/encoding/toBytes.js.map +1 -1
- package/dist/cjs/utils/encoding/toHex.js.map +1 -1
- package/dist/cjs/utils/formatters/block.js +3 -1
- package/dist/cjs/utils/formatters/block.js.map +1 -1
- package/dist/cjs/utils/formatters/transaction.js +3 -1
- package/dist/cjs/utils/formatters/transaction.js.map +1 -1
- package/dist/cjs/utils/formatters/transactionReceipt.js.map +1 -1
- package/dist/cjs/utils/formatters/transactionRequest.js.map +1 -1
- package/dist/cjs/utils/observe.js.map +1 -1
- package/dist/cjs/utils/promise/createBatchScheduler.js.map +1 -1
- package/dist/cjs/utils/promise/withCache.js.map +1 -1
- package/dist/cjs/utils/rpc.js.map +1 -1
- package/dist/esm/accounts/generateMnemonic.js +7 -0
- package/dist/esm/accounts/generateMnemonic.js.map +1 -1
- package/dist/esm/accounts/generatePrivateKey.js +5 -0
- package/dist/esm/accounts/generatePrivateKey.js.map +1 -1
- package/dist/esm/accounts/hdKeyToAccount.js +5 -0
- package/dist/esm/accounts/hdKeyToAccount.js.map +1 -1
- package/dist/esm/accounts/mnemonicToAccount.js +5 -0
- package/dist/esm/accounts/mnemonicToAccount.js.map +1 -1
- package/dist/esm/accounts/privateKeyToAccount.js +5 -0
- package/dist/esm/accounts/privateKeyToAccount.js.map +1 -1
- package/dist/esm/accounts/toAccount.js +5 -0
- package/dist/esm/accounts/toAccount.js.map +1 -1
- package/dist/esm/accounts/utils/publicKeyToAddress.js +7 -0
- package/dist/esm/accounts/utils/publicKeyToAddress.js.map +1 -1
- package/dist/esm/accounts/utils/sign.js +8 -0
- package/dist/esm/accounts/utils/sign.js.map +1 -1
- package/dist/esm/accounts/utils/signMessage.js +6 -0
- package/dist/esm/accounts/utils/signMessage.js.map +1 -1
- package/dist/esm/accounts/utils/signTypedData.js +6 -0
- package/dist/esm/accounts/utils/signTypedData.js.map +1 -1
- package/dist/esm/actions/ens/getEnsAddress.js +28 -0
- package/dist/esm/actions/ens/getEnsAddress.js.map +1 -1
- package/dist/esm/actions/ens/getEnsAvatar.js +28 -0
- package/dist/esm/actions/ens/getEnsAvatar.js.map +1 -1
- package/dist/esm/actions/ens/getEnsName.js +27 -0
- package/dist/esm/actions/ens/getEnsName.js.map +1 -1
- package/dist/esm/actions/ens/getEnsResolver.js +28 -0
- package/dist/esm/actions/ens/getEnsResolver.js.map +1 -1
- package/dist/esm/actions/ens/getEnsText.js +29 -0
- package/dist/esm/actions/ens/getEnsText.js.map +1 -1
- package/dist/esm/actions/getContract.js +36 -0
- package/dist/esm/actions/getContract.js.map +1 -1
- package/dist/esm/actions/public/call.js +31 -0
- package/dist/esm/actions/public/call.js.map +1 -1
- package/dist/esm/actions/public/createBlockFilter.js +21 -0
- package/dist/esm/actions/public/createBlockFilter.js.map +1 -1
- package/dist/esm/actions/public/createContractEventFilter.js +22 -0
- package/dist/esm/actions/public/createContractEventFilter.js.map +1 -1
- package/dist/esm/actions/public/createEventFilter.js +23 -0
- package/dist/esm/actions/public/createEventFilter.js.map +1 -1
- package/dist/esm/actions/public/createPendingTransactionFilter.js +21 -0
- package/dist/esm/actions/public/createPendingTransactionFilter.js.map +1 -1
- package/dist/esm/actions/public/estimateContractGas.js +27 -0
- package/dist/esm/actions/public/estimateContractGas.js.map +1 -1
- package/dist/esm/actions/public/estimateGas.js +26 -0
- package/dist/esm/actions/public/estimateGas.js.map +1 -1
- package/dist/esm/actions/public/getBalance.js +35 -0
- package/dist/esm/actions/public/getBalance.js.map +1 -1
- package/dist/esm/actions/public/getBlock.js +24 -0
- package/dist/esm/actions/public/getBlock.js.map +1 -1
- package/dist/esm/actions/public/getBlockNumber.js +23 -0
- package/dist/esm/actions/public/getBlockNumber.js.map +1 -1
- package/dist/esm/actions/public/getBlockTransactionCount.js +23 -0
- package/dist/esm/actions/public/getBlockTransactionCount.js.map +1 -1
- package/dist/esm/actions/public/getBytecode.js +23 -0
- package/dist/esm/actions/public/getBytecode.js.map +1 -1
- package/dist/esm/actions/public/getChainId.js +21 -0
- package/dist/esm/actions/public/getChainId.js.map +1 -1
- package/dist/esm/actions/public/getFeeHistory.js +24 -0
- package/dist/esm/actions/public/getFeeHistory.js.map +1 -1
- package/dist/esm/actions/public/getFilterChanges.js +84 -0
- package/dist/esm/actions/public/getFilterChanges.js.map +1 -1
- package/dist/esm/actions/public/getFilterLogs.js +29 -0
- package/dist/esm/actions/public/getFilterLogs.js.map +1 -1
- package/dist/esm/actions/public/getGasPrice.js +20 -0
- package/dist/esm/actions/public/getGasPrice.js.map +1 -1
- package/dist/esm/actions/public/getLogs.js +24 -0
- package/dist/esm/actions/public/getLogs.js.map +1 -1
- package/dist/esm/actions/public/getStorageAt.js +24 -0
- package/dist/esm/actions/public/getStorageAt.js.map +1 -1
- package/dist/esm/actions/public/getTransaction.js +24 -0
- package/dist/esm/actions/public/getTransaction.js.map +1 -1
- package/dist/esm/actions/public/getTransactionConfirmations.js +24 -0
- package/dist/esm/actions/public/getTransactionConfirmations.js.map +1 -1
- package/dist/esm/actions/public/getTransactionCount.js +23 -0
- package/dist/esm/actions/public/getTransactionCount.js.map +1 -1
- package/dist/esm/actions/public/getTransactionReceipt.js +24 -0
- package/dist/esm/actions/public/getTransactionReceipt.js.map +1 -1
- package/dist/esm/actions/public/multicall.js +40 -0
- package/dist/esm/actions/public/multicall.js.map +1 -1
- package/dist/esm/actions/public/readContract.js +31 -0
- package/dist/esm/actions/public/readContract.js.map +1 -1
- package/dist/esm/actions/public/simulateContract.js +31 -0
- package/dist/esm/actions/public/simulateContract.js.map +1 -1
- package/dist/esm/actions/public/uninstallFilter.js +24 -0
- package/dist/esm/actions/public/uninstallFilter.js.map +1 -1
- package/dist/esm/actions/public/verifyHash.js +10 -0
- package/dist/esm/actions/public/verifyHash.js.map +1 -1
- package/dist/esm/actions/public/verifyMessage.js +11 -0
- package/dist/esm/actions/public/verifyMessage.js.map +1 -1
- package/dist/esm/actions/public/verifyTypedData.js +9 -0
- package/dist/esm/actions/public/verifyTypedData.js.map +1 -1
- package/dist/esm/actions/public/waitForTransactionReceipt.js +52 -0
- package/dist/esm/actions/public/waitForTransactionReceipt.js.map +1 -1
- package/dist/esm/actions/public/watchBlockNumber.js +31 -0
- package/dist/esm/actions/public/watchBlockNumber.js.map +1 -1
- package/dist/esm/actions/public/watchBlocks.js +35 -1
- package/dist/esm/actions/public/watchBlocks.js.map +1 -1
- package/dist/esm/actions/public/watchContractEvent.js +36 -0
- package/dist/esm/actions/public/watchContractEvent.js.map +1 -1
- package/dist/esm/actions/public/watchEvent.js +38 -0
- package/dist/esm/actions/public/watchEvent.js.map +1 -1
- package/dist/esm/actions/public/watchPendingTransactions.js +29 -0
- package/dist/esm/actions/public/watchPendingTransactions.js.map +1 -1
- package/dist/esm/actions/test/dropTransaction.js +22 -0
- package/dist/esm/actions/test/dropTransaction.js.map +1 -1
- package/dist/esm/actions/test/getAutomine.js +20 -0
- package/dist/esm/actions/test/getAutomine.js.map +1 -1
- package/dist/esm/actions/test/getTxpoolContent.js +20 -0
- package/dist/esm/actions/test/getTxpoolContent.js.map +1 -1
- package/dist/esm/actions/test/getTxpoolStatus.js +20 -0
- package/dist/esm/actions/test/getTxpoolStatus.js.map +1 -1
- package/dist/esm/actions/test/impersonateAccount.js +22 -0
- package/dist/esm/actions/test/impersonateAccount.js.map +1 -1
- package/dist/esm/actions/test/increaseTime.js +22 -0
- package/dist/esm/actions/test/increaseTime.js.map +1 -1
- package/dist/esm/actions/test/inspectTxpool.js +20 -0
- package/dist/esm/actions/test/inspectTxpool.js.map +1 -1
- package/dist/esm/actions/test/mine.js +20 -0
- package/dist/esm/actions/test/mine.js.map +1 -1
- package/dist/esm/actions/test/removeBlockTimestampInterval.js +19 -0
- package/dist/esm/actions/test/removeBlockTimestampInterval.js.map +1 -1
- package/dist/esm/actions/test/reset.js +20 -0
- package/dist/esm/actions/test/reset.js.map +1 -1
- package/dist/esm/actions/test/revert.js +20 -0
- package/dist/esm/actions/test/revert.js.map +1 -1
- package/dist/esm/actions/test/sendUnsignedTransaction.js +25 -0
- package/dist/esm/actions/test/sendUnsignedTransaction.js.map +1 -1
- package/dist/esm/actions/test/setAutomine.js +19 -0
- package/dist/esm/actions/test/setAutomine.js.map +1 -1
- package/dist/esm/actions/test/setBalance.js +23 -0
- package/dist/esm/actions/test/setBalance.js.map +1 -1
- package/dist/esm/actions/test/setBlockGasLimit.js +20 -0
- package/dist/esm/actions/test/setBlockGasLimit.js.map +1 -1
- package/dist/esm/actions/test/setBlockTimestampInterval.js +20 -0
- package/dist/esm/actions/test/setBlockTimestampInterval.js.map +1 -1
- package/dist/esm/actions/test/setCode.js +23 -0
- package/dist/esm/actions/test/setCode.js.map +1 -1
- package/dist/esm/actions/test/setCoinbase.js +22 -0
- package/dist/esm/actions/test/setCoinbase.js.map +1 -1
- package/dist/esm/actions/test/setIntervalMining.js +20 -0
- package/dist/esm/actions/test/setIntervalMining.js.map +1 -1
- package/dist/esm/actions/test/setLoggingEnabled.js +19 -0
- package/dist/esm/actions/test/setLoggingEnabled.js.map +1 -1
- package/dist/esm/actions/test/setMinGasPrice.js +24 -0
- package/dist/esm/actions/test/setMinGasPrice.js.map +1 -1
- package/dist/esm/actions/test/setNextBlockBaseFeePerGas.js +22 -0
- package/dist/esm/actions/test/setNextBlockBaseFeePerGas.js.map +1 -1
- package/dist/esm/actions/test/setNextBlockTimestamp.js +20 -0
- package/dist/esm/actions/test/setNextBlockTimestamp.js.map +1 -1
- package/dist/esm/actions/test/setNonce.js +23 -0
- package/dist/esm/actions/test/setNonce.js.map +1 -1
- package/dist/esm/actions/test/setRpcUrl.js +20 -0
- package/dist/esm/actions/test/setRpcUrl.js.map +1 -1
- package/dist/esm/actions/test/setStorageAt.js +24 -0
- package/dist/esm/actions/test/setStorageAt.js.map +1 -1
- package/dist/esm/actions/test/snapshot.js +19 -0
- package/dist/esm/actions/test/snapshot.js.map +1 -1
- package/dist/esm/actions/test/stopImpersonatingAccount.js +22 -0
- package/dist/esm/actions/test/stopImpersonatingAccount.js.map +1 -1
- package/dist/esm/actions/wallet/addChain.js +19 -0
- package/dist/esm/actions/wallet/addChain.js.map +1 -1
- package/dist/esm/actions/wallet/deployContract.js +27 -0
- package/dist/esm/actions/wallet/deployContract.js.map +1 -1
- package/dist/esm/actions/wallet/getAddresses.js +20 -0
- package/dist/esm/actions/wallet/getAddresses.js.map +1 -1
- package/dist/esm/actions/wallet/getPermissions.js +20 -0
- package/dist/esm/actions/wallet/getPermissions.js.map +1 -1
- package/dist/esm/actions/wallet/requestAddresses.js +24 -0
- package/dist/esm/actions/wallet/requestAddresses.js.map +1 -1
- package/dist/esm/actions/wallet/requestPermissions.js +23 -0
- package/dist/esm/actions/wallet/requestPermissions.js.map +1 -1
- package/dist/esm/actions/wallet/sendTransaction.js +47 -0
- package/dist/esm/actions/wallet/sendTransaction.js.map +1 -1
- package/dist/esm/actions/wallet/signMessage.js +46 -0
- package/dist/esm/actions/wallet/signMessage.js.map +1 -1
- package/dist/esm/actions/wallet/signTypedData.js +100 -0
- package/dist/esm/actions/wallet/signTypedData.js.map +1 -1
- package/dist/esm/actions/wallet/switchChain.js +20 -0
- package/dist/esm/actions/wallet/switchChain.js.map +1 -1
- package/dist/esm/actions/wallet/watchAsset.js +28 -0
- package/dist/esm/actions/wallet/watchAsset.js.map +1 -1
- package/dist/esm/actions/wallet/writeContract.js +50 -0
- package/dist/esm/actions/wallet/writeContract.js.map +1 -1
- package/dist/esm/chains.js +96 -96
- package/dist/esm/chains.js.map +1 -1
- package/dist/esm/clients/createClient.js +3 -0
- package/dist/esm/clients/createClient.js.map +1 -1
- package/dist/esm/clients/createPublicClient.js +19 -0
- package/dist/esm/clients/createPublicClient.js.map +1 -1
- package/dist/esm/clients/createTestClient.js +23 -0
- package/dist/esm/clients/createTestClient.js.map +1 -1
- package/dist/esm/clients/createWalletClient.js +36 -0
- package/dist/esm/clients/createWalletClient.js.map +1 -1
- package/dist/esm/clients/transports/createTransport.js +3 -0
- package/dist/esm/clients/transports/createTransport.js.map +1 -1
- package/dist/esm/clients/transports/custom.js +3 -0
- package/dist/esm/clients/transports/custom.js.map +1 -1
- package/dist/esm/clients/transports/fallback.js +11 -0
- package/dist/esm/clients/transports/fallback.js.map +1 -1
- package/dist/esm/clients/transports/http.js +6 -1
- package/dist/esm/clients/transports/http.js.map +1 -1
- package/dist/esm/clients/transports/webSocket.js +6 -1
- package/dist/esm/clients/transports/webSocket.js.map +1 -1
- package/dist/esm/constants/abis.js +6 -0
- package/dist/esm/constants/abis.js.map +1 -1
- package/dist/esm/constants/solidity.js +1 -0
- package/dist/esm/constants/solidity.js.map +1 -1
- package/dist/esm/errors/node.js +9 -0
- package/dist/esm/errors/node.js.map +1 -1
- package/dist/esm/errors/rpc.js +103 -0
- package/dist/esm/errors/rpc.js.map +1 -1
- package/dist/esm/errors/version.js +1 -1
- package/dist/esm/types/eip1193.js +2 -0
- package/dist/esm/types/eip1193.js.map +1 -1
- package/dist/esm/utils/abi/decodeAbiParameters.js +29 -0
- package/dist/esm/utils/abi/decodeAbiParameters.js.map +1 -1
- package/dist/esm/utils/abi/decodeEventLog.js +2 -0
- package/dist/esm/utils/abi/decodeEventLog.js.map +1 -1
- package/dist/esm/utils/abi/encodeAbiParameters.js +10 -1
- package/dist/esm/utils/abi/encodeAbiParameters.js.map +1 -1
- package/dist/esm/utils/abi/getAbiItem.js +7 -0
- package/dist/esm/utils/abi/getAbiItem.js.map +1 -1
- package/dist/esm/utils/accounts.js +3 -0
- package/dist/esm/utils/accounts.js.map +1 -1
- package/dist/esm/utils/buildRequest.js +2 -0
- package/dist/esm/utils/buildRequest.js.map +1 -1
- package/dist/esm/utils/data/size.js +6 -0
- package/dist/esm/utils/data/size.js.map +1 -1
- package/dist/esm/utils/data/slice.js +21 -0
- package/dist/esm/utils/data/slice.js.map +1 -1
- package/dist/esm/utils/encoding/fromBytes.js +79 -0
- package/dist/esm/utils/encoding/fromBytes.js.map +1 -1
- package/dist/esm/utils/encoding/fromHex.js +106 -0
- package/dist/esm/utils/encoding/fromHex.js.map +1 -1
- package/dist/esm/utils/encoding/toBytes.js +102 -1
- package/dist/esm/utils/encoding/toBytes.js.map +1 -1
- package/dist/esm/utils/encoding/toHex.js +108 -2
- package/dist/esm/utils/encoding/toHex.js.map +1 -1
- package/dist/esm/utils/ens/avatar/parseAvatarRecord.js +6 -2
- package/dist/esm/utils/ens/avatar/parseAvatarRecord.js.map +1 -1
- package/dist/esm/utils/ens/avatar/utils.js +10 -0
- package/dist/esm/utils/ens/avatar/utils.js.map +1 -1
- package/dist/esm/utils/ens/labelhash.js +9 -0
- package/dist/esm/utils/ens/labelhash.js.map +1 -1
- package/dist/esm/utils/ens/namehash.js +12 -0
- package/dist/esm/utils/ens/namehash.js.map +1 -1
- package/dist/esm/utils/ens/normalize.js +10 -0
- package/dist/esm/utils/ens/normalize.js.map +1 -1
- package/dist/esm/utils/ens/packetToBytes.js +6 -0
- package/dist/esm/utils/ens/packetToBytes.js.map +1 -1
- package/dist/esm/utils/filters/createFilterRequestScope.js +5 -0
- package/dist/esm/utils/filters/createFilterRequestScope.js.map +1 -1
- package/dist/esm/utils/formatters/block.js +4 -1
- package/dist/esm/utils/formatters/block.js.map +1 -1
- package/dist/esm/utils/formatters/extract.js +3 -0
- package/dist/esm/utils/formatters/extract.js.map +1 -1
- package/dist/esm/utils/formatters/format.js +3 -0
- package/dist/esm/utils/formatters/format.js.map +1 -1
- package/dist/esm/utils/formatters/transaction.js +3 -1
- package/dist/esm/utils/formatters/transaction.js.map +1 -1
- package/dist/esm/utils/formatters/transactionReceipt.js +1 -1
- package/dist/esm/utils/formatters/transactionReceipt.js.map +1 -1
- package/dist/esm/utils/formatters/transactionRequest.js +1 -1
- package/dist/esm/utils/formatters/transactionRequest.js.map +1 -1
- package/dist/esm/utils/observe.js +7 -2
- package/dist/esm/utils/observe.js.map +1 -1
- package/dist/esm/utils/poll.js +3 -0
- package/dist/esm/utils/poll.js.map +1 -1
- package/dist/esm/utils/promise/createBatchScheduler.js +1 -1
- package/dist/esm/utils/promise/createBatchScheduler.js.map +1 -1
- package/dist/esm/utils/promise/withCache.js +15 -2
- package/dist/esm/utils/promise/withCache.js.map +1 -1
- package/dist/esm/utils/regex.js +4 -0
- package/dist/esm/utils/regex.js.map +1 -1
- package/dist/esm/utils/rpc.js +14 -1
- package/dist/esm/utils/rpc.js.map +1 -1
- package/dist/esm/utils/signature/hashTypedData.js +3 -0
- package/dist/esm/utils/signature/hashTypedData.js.map +1 -1
- package/dist/esm/utils/signature/recoverPublicKey.js +2 -0
- package/dist/esm/utils/signature/recoverPublicKey.js.map +1 -1
- package/dist/esm/utils/signature/verifyMessage.js +12 -0
- package/dist/esm/utils/signature/verifyMessage.js.map +1 -1
- package/dist/esm/utils/signature/verifyTypedData.js +12 -0
- package/dist/esm/utils/signature/verifyTypedData.js.map +1 -1
- package/dist/esm/utils/transaction/prepareRequest.js +5 -1
- package/dist/esm/utils/transaction/prepareRequest.js.map +1 -1
- package/dist/esm/utils/transaction/serializeTransaction.js +4 -2
- package/dist/esm/utils/transaction/serializeTransaction.js.map +1 -1
- package/dist/esm/utils/typedData.js +4 -0
- package/dist/esm/utils/typedData.js.map +1 -1
- package/dist/esm/utils/unit/parseUnits.js +2 -0
- package/dist/esm/utils/unit/parseUnits.js.map +1 -1
- package/dist/types/actions/public/getBlockNumber.d.ts +2 -2
- package/dist/types/actions/public/getBlockNumber.d.ts.map +1 -1
- package/dist/types/chains.d.ts.map +1 -1
- package/dist/types/errors/version.d.ts +1 -1
- package/dist/types/utils/formatters/block.d.ts.map +1 -1
- package/dist/types/utils/formatters/transaction.d.ts.map +1 -1
- package/dist/types/utils/observe.d.ts.map +1 -1
- package/dist/types/utils/promise/withCache.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/chains.ts +120 -97
- package/src/errors/version.ts +1 -1
- package/src/utils/encoding/toBytes.ts +1 -1
- package/src/utils/encoding/toHex.ts +2 -2
- package/src/utils/formatters/block.ts +3 -1
- package/src/utils/formatters/transaction.ts +3 -1
- package/src/utils/formatters/transactionReceipt.ts +1 -1
- package/src/utils/formatters/transactionRequest.ts +1 -1
- package/src/utils/observe.ts +2 -2
- package/src/utils/promise/createBatchScheduler.ts +1 -1
- package/src/utils/promise/withCache.ts +2 -2
- package/src/utils/rpc.ts +1 -1
@@ -2,6 +2,37 @@ import { decodeFunctionResult, } from '../../utils/abi/decodeFunctionResult.js';
|
|
2
2
|
import { encodeFunctionData, } from '../../utils/abi/encodeFunctionData.js';
|
3
3
|
import { getContractError } from '../../utils/errors/getContractError.js';
|
4
4
|
import { call } from './call.js';
|
5
|
+
/**
|
6
|
+
* Calls a read-only function on a contract, and returns the response.
|
7
|
+
*
|
8
|
+
* - Docs: https://viem.sh/docs/contract/readContract.html
|
9
|
+
* - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/reading-contracts
|
10
|
+
*
|
11
|
+
* 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.
|
12
|
+
*
|
13
|
+
* Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`call` action](https://viem.sh/docs/actions/public/call.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html).
|
14
|
+
*
|
15
|
+
* @param client - Client to use
|
16
|
+
* @param parameters - {@link ReadContractParameters}
|
17
|
+
* @returns The response from the contract. Type is inferred. {@link ReadContractReturnType}
|
18
|
+
*
|
19
|
+
* @example
|
20
|
+
* import { createPublicClient, http, parseAbi } from 'viem'
|
21
|
+
* import { mainnet } from 'viem/chains'
|
22
|
+
* import { readContract } from 'viem/contract'
|
23
|
+
*
|
24
|
+
* const client = createPublicClient({
|
25
|
+
* chain: mainnet,
|
26
|
+
* transport: http(),
|
27
|
+
* })
|
28
|
+
* const result = await readContract(client, {
|
29
|
+
* address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
|
30
|
+
* abi: parseAbi(['function balanceOf(address) view returns (uint256)']),
|
31
|
+
* functionName: 'balanceOf',
|
32
|
+
* args: ['0xA0Cf798816D4b9b9866b5330EEa46a18382f251e'],
|
33
|
+
* })
|
34
|
+
* // 424122n
|
35
|
+
*/
|
5
36
|
export async function readContract(client, { abi, address, args, functionName, ...callRequest }) {
|
6
37
|
const calldata = encodeFunctionData({
|
7
38
|
abi,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"readContract.js","sourceRoot":"","sources":["../../../../src/actions/public/readContract.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,oBAAoB,GACrB,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAEL,kBAAkB,GACnB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAEzE,OAAO,EAAuB,IAAI,EAAE,MAAM,WAAW,CAAA;
|
1
|
+
{"version":3,"file":"readContract.js","sourceRoot":"","sources":["../../../../src/actions/public/readContract.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,oBAAoB,GACrB,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAEL,kBAAkB,GACnB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAEzE,OAAO,EAAuB,IAAI,EAAE,MAAM,WAAW,CAAA;AAarD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAKhC,MAAuC,EACvC,EACE,GAAG,EACH,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,GAAG,WAAW,EAC8B;IAE9C,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAClC,GAAG;QACH,IAAI;QACJ,YAAY;KACmD,CAAC,CAAA;IAClE,IAAI;QACF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;YAClC,IAAI,EAAE,QAAQ;YACd,EAAE,EAAE,OAAO;YACX,GAAG,WAAW;SACc,CAAC,CAAA;QAC/B,OAAO,oBAAoB,CAAC;YAC1B,GAAG;YACH,IAAI;YACJ,YAAY;YACZ,IAAI,EAAE,IAAI,IAAI,IAAI;SAInB,CAAgD,CAAA;KAClD;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,gBAAgB,CAAC,GAAgB,EAAE;YACvC,GAAG,EAAE,GAAU;YACf,OAAO;YACP,IAAI;YACJ,QAAQ,EAAE,6BAA6B;YACvC,YAAY;SACb,CAAC,CAAA;KACH;AACH,CAAC"}
|
@@ -3,6 +3,37 @@ import { decodeFunctionResult, } from '../../utils/abi/decodeFunctionResult.js';
|
|
3
3
|
import { encodeFunctionData, } from '../../utils/abi/encodeFunctionData.js';
|
4
4
|
import { getContractError } from '../../utils/errors/getContractError.js';
|
5
5
|
import { call } from './call.js';
|
6
|
+
/**
|
7
|
+
* Simulates/validates a contract interaction. This is useful for retrieving **return data** and **revert reasons** of contract write functions.
|
8
|
+
*
|
9
|
+
* - Docs: https://viem.sh/docs/contract/simulateContract.html
|
10
|
+
* - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/contracts/writing-to-contracts
|
11
|
+
*
|
12
|
+
* This function does not require gas to execute and _**does not**_ change the state of the blockchain. It is almost identical to [`readContract`](https://viem.sh/docs/contract/readContract.html), but also supports contract write functions.
|
13
|
+
*
|
14
|
+
* Internally, uses a [Public Client](https://viem.sh/docs/clients/public.html) to call the [`call` action](https://viem.sh/docs/actions/public/call.html) with [ABI-encoded `data`](https://viem.sh/docs/contract/encodeFunctionData.html).
|
15
|
+
*
|
16
|
+
* @param client - Client to use
|
17
|
+
* @param parameters - {@link SimulateContractParameters}
|
18
|
+
* @returns The simulation result and write request. {@link SimulateContractReturnType}
|
19
|
+
*
|
20
|
+
* @example
|
21
|
+
* import { createPublicClient, http } from 'viem'
|
22
|
+
* import { mainnet } from 'viem/chains'
|
23
|
+
* import { simulateContract } from 'viem/contract'
|
24
|
+
*
|
25
|
+
* const client = createPublicClient({
|
26
|
+
* chain: mainnet,
|
27
|
+
* transport: http(),
|
28
|
+
* })
|
29
|
+
* const result = await simulateContract(client, {
|
30
|
+
* address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
|
31
|
+
* abi: parseAbi(['function mint(uint32) view returns (uint32)']),
|
32
|
+
* functionName: 'mint',
|
33
|
+
* args: ['69420'],
|
34
|
+
* account: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
|
35
|
+
* })
|
36
|
+
*/
|
6
37
|
export async function simulateContract(client, { abi, address, args, dataSuffix, functionName, ...callRequest }) {
|
7
38
|
const account = callRequest.account
|
8
39
|
? parseAccount(callRequest.account)
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"simulateContract.js","sourceRoot":"","sources":["../../../../src/actions/public/simulateContract.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AAWnE,OAAO,EAEL,oBAAoB,GACrB,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAEL,kBAAkB,GACnB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAGzE,OAAO,EAAuB,IAAI,EAAE,MAAM,WAAW,CAAA;
|
1
|
+
{"version":3,"file":"simulateContract.js","sourceRoot":"","sources":["../../../../src/actions/public/simulateContract.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAA;AAWnE,OAAO,EAEL,oBAAoB,GACrB,MAAM,yCAAyC,CAAA;AAChD,OAAO,EAEL,kBAAkB,GACnB,MAAM,uCAAuC,CAAA;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wCAAwC,CAAA;AAGzE,OAAO,EAAuB,IAAI,EAAE,MAAM,WAAW,CAAA;AAwCrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAMpC,MAAuC,EACvC,EACE,GAAG,EACH,OAAO,EACP,IAAI,EACJ,UAAU,EACV,YAAY,EACZ,GAAG,WAAW,EAC0D;IAI1E,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO;QACjC,CAAC,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC;QACnC,CAAC,CAAC,SAAS,CAAA;IACb,MAAM,QAAQ,GAAG,kBAAkB,CAAC;QAClC,GAAG;QACH,IAAI;QACJ,YAAY;KACmD,CAAC,CAAA;IAClE,IAAI;QACF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;YAClC,KAAK,EAAE,KAAK;YACZ,IAAI,EAAE,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE;YACpE,EAAE,EAAE,OAAO;YACX,GAAG,WAAW;SACsB,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,oBAAoB,CAAC;YAClC,GAAG;YACH,IAAI;YACJ,YAAY;YACZ,IAAI,EAAE,IAAI,IAAI,IAAI;SACe,CAAC,CAAA;QACpC,OAAO;YACL,MAAM;YACN,OAAO,EAAE;gBACP,GAAG;gBACH,OAAO;gBACP,IAAI;gBACJ,YAAY;gBACZ,GAAG,WAAW;aACf;SAMF,CAAA;KACF;IAAC,OAAO,GAAG,EAAE;QACZ,MAAM,gBAAgB,CAAC,GAAgB,EAAE;YACvC,GAAG,EAAE,GAAU;YACf,OAAO;YACP,IAAI;YACJ,QAAQ,EAAE,iCAAiC;YAC3C,YAAY;YACZ,MAAM,EAAE,OAAO,EAAE,OAAO;SACzB,CAAC,CAAA;KACH;AACH,CAAC"}
|
@@ -1,3 +1,27 @@
|
|
1
|
+
/**
|
2
|
+
* Destroys a [`Filter`](https://viem.sh/docs/glossary/types.html#filter).
|
3
|
+
*
|
4
|
+
* - Docs: https://viem.sh/docs/actions/public/uninstallFilter.html
|
5
|
+
* - JSON-RPC Methods: [`eth_uninstallFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_uninstallFilter)
|
6
|
+
*
|
7
|
+
* Destroys a Filter that was created from one of the following Actions:
|
8
|
+
* - [`createBlockFilter`](https://viem.sh/docs/actions/public/createBlockFilter.html)
|
9
|
+
* - [`createEventFilter`](https://viem.sh/docs/actions/public/createEventFilter.html)
|
10
|
+
* - [`createPendingTransactionFilter`](https://viem.sh/docs/actions/public/createPendingTransactionFilter.html)
|
11
|
+
*
|
12
|
+
* @param client - Client to use
|
13
|
+
* @param parameters - {@link UninstallFilterParameters}
|
14
|
+
* @returns A boolean indicating if the Filter was successfully uninstalled. {@link UninstallFilterReturnType}
|
15
|
+
*
|
16
|
+
* @example
|
17
|
+
* import { createPublicClient, http } from 'viem'
|
18
|
+
* import { mainnet } from 'viem/chains'
|
19
|
+
* import { createPendingTransactionFilter, uninstallFilter } from 'viem/public'
|
20
|
+
*
|
21
|
+
* const filter = await createPendingTransactionFilter(client)
|
22
|
+
* const uninstalled = await uninstallFilter(client, { filter })
|
23
|
+
* // true
|
24
|
+
*/
|
1
25
|
export async function uninstallFilter(_client, { filter }) {
|
2
26
|
return filter.request({
|
3
27
|
method: 'eth_uninstallFilter',
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"uninstallFilter.js","sourceRoot":"","sources":["../../../../src/actions/public/uninstallFilter.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"uninstallFilter.js","sourceRoot":"","sources":["../../../../src/actions/public/uninstallFilter.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAInC,OAAyC,EACzC,EAAE,MAAM,EAA6B;IAErC,OAAO,MAAM,CAAC,OAAO,CAAC;QACpB,MAAM,EAAE,qBAAqB;QAC7B,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;KACpB,CAAC,CAAA;AACJ,CAAC"}
|
@@ -4,6 +4,13 @@ import { CallExecutionError } from '../../errors/contract.js';
|
|
4
4
|
import { isBytesEqual } from '../../utils/data/isBytesEqual.js';
|
5
5
|
import { encodeDeployData, isHex, toHex } from '../../utils/index.js';
|
6
6
|
import { call } from './call.js';
|
7
|
+
/**
|
8
|
+
* Verifies a message hash on chain using ERC-6492.
|
9
|
+
*
|
10
|
+
* @param client - Client to use.
|
11
|
+
* @param parameters - {@link VerifyHashParameters}
|
12
|
+
* @returns Whether or not the signature is valid. {@link VerifyHashReturnType}
|
13
|
+
*/
|
7
14
|
export async function verifyHash(client, { address, hash, signature, ...callRequest }) {
|
8
15
|
const signatureHex = isHex(signature) ? signature : toHex(signature);
|
9
16
|
try {
|
@@ -19,6 +26,9 @@ export async function verifyHash(client, { address, hash, signature, ...callRequ
|
|
19
26
|
}
|
20
27
|
catch (error) {
|
21
28
|
if (error instanceof CallExecutionError) {
|
29
|
+
// if the execution fails, the signature was not valid and an internal method inside of the validator reverted
|
30
|
+
// this can happen for many reasons, for example if signer can not be recovered from the signature
|
31
|
+
// or if the signature has no valid format
|
22
32
|
return false;
|
23
33
|
}
|
24
34
|
throw error;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"verifyHash.js","sourceRoot":"","sources":["../../../../src/actions/public/verifyHash.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAAE,mCAAmC,EAAE,MAAM,8BAA8B,CAAA;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,EAAuB,IAAI,EAAE,MAAM,WAAW,CAAA;
|
1
|
+
{"version":3,"file":"verifyHash.js","sourceRoot":"","sources":["../../../../src/actions/public/verifyHash.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAAE,mCAAmC,EAAE,MAAM,8BAA8B,CAAA;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAE7D,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAC/D,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,EAAuB,IAAI,EAAE,MAAM,WAAW,CAAA;AAgBrD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAuC,EACvC,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,WAAW,EAAwB;IAElE,MAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAEpE,IAAI;QACF,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE;YAClC,IAAI,EAAE,gBAAgB,CAAC;gBACrB,GAAG,EAAE,8BAA8B;gBACnC,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC;gBACnC,QAAQ,EAAE,mCAAmC;aAC9C,CAAC;YACF,GAAG,WAAW;SACc,CAAC,CAAA;QAE/B,OAAO,YAAY,CAAC,IAAI,IAAI,KAAK,EAAE,KAAK,CAAC,CAAA;KAC1C;IAAC,OAAO,KAAK,EAAE;QACd,IAAI,KAAK,YAAY,kBAAkB,EAAE;YACvC,8GAA8G;YAC9G,kGAAkG;YAClG,0CAA0C;YAC1C,OAAO,KAAK,CAAA;SACb;QAED,MAAM,KAAK,CAAA;KACZ;AACH,CAAC"}
|
@@ -1,5 +1,16 @@
|
|
1
1
|
import { hashMessage } from '../../utils/index.js';
|
2
2
|
import { verifyHash } from './verifyHash.js';
|
3
|
+
/**
|
4
|
+
* Verify that a message was signed by the provided address.
|
5
|
+
*
|
6
|
+
* Compatible with Smart Contract Accounts & Externally Owned Accounts via [ERC-6492](https://eips.ethereum.org/EIPS/eip-6492).
|
7
|
+
*
|
8
|
+
* - Docs {@link https://viem.sh/docs/actions/public/verifyMessage.html}
|
9
|
+
*
|
10
|
+
* @param client - Client to use.
|
11
|
+
* @param parameters - {@link VerifyMessageParameters}
|
12
|
+
* @returns Whether or not the signature is valid. {@link VerifyMessageReturnType}
|
13
|
+
*/
|
3
14
|
export async function verifyMessage(client, { address, message, signature, ...callRequest }) {
|
4
15
|
const hash = hashMessage(message);
|
5
16
|
return verifyHash(client, {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"verifyMessage.js","sourceRoot":"","sources":["../../../../src/actions/public/verifyMessage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAA6B,UAAU,EAAE,MAAM,iBAAiB,CAAA;
|
1
|
+
{"version":3,"file":"verifyMessage.js","sourceRoot":"","sources":["../../../../src/actions/public/verifyMessage.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAA6B,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAcvE;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAuC,EACvC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,WAAW,EAA2B;IAExE,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;IACjC,OAAO,UAAU,CAAC,MAAM,EAAE;QACxB,OAAO;QACP,IAAI;QACJ,SAAS;QACT,GAAG,WAAW;KACf,CAAC,CAAA;AACJ,CAAC"}
|
@@ -1,5 +1,14 @@
|
|
1
1
|
import { hashTypedData } from '../../utils/index.js';
|
2
2
|
import { verifyHash } from './verifyHash.js';
|
3
|
+
/**
|
4
|
+
* Verify that typed data was signed by the provided address.
|
5
|
+
*
|
6
|
+
* - Docs {@link https://viem.sh/docs/actions/public/verifyTypedData.html}
|
7
|
+
*
|
8
|
+
* @param client - Client to use.
|
9
|
+
* @param parameters - {@link VerifyTypedDataParameters}
|
10
|
+
* @returns Whether or not the signature is valid. {@link VerifyTypedDataReturnType}
|
11
|
+
*/
|
3
12
|
export async function verifyTypedData(client, { address, signature, message, primaryType, types, domain, ...callRequest }) {
|
4
13
|
const hash = hashTypedData({ message, primaryType, types, domain });
|
5
14
|
return verifyHash(client, {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"verifyTypedData.js","sourceRoot":"","sources":["../../../../src/actions/public/verifyTypedData.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAA6B,UAAU,EAAE,MAAM,iBAAiB,CAAA;
|
1
|
+
{"version":3,"file":"verifyTypedData.js","sourceRoot":"","sources":["../../../../src/actions/public/verifyTypedData.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACpD,OAAO,EAA6B,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAgBvE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAuC,EACvC,EACE,OAAO,EACP,SAAS,EACT,OAAO,EACP,WAAW,EACX,KAAK,EACL,MAAM,EACN,GAAG,WAAW,EACY;IAE5B,MAAM,IAAI,GAAG,aAAa,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;IACnE,OAAO,UAAU,CAAC,MAAM,EAAE;QACxB,OAAO;QACP,IAAI;QACJ,SAAS;QACT,GAAG,WAAW;KACf,CAAC,CAAA;AACJ,CAAC"}
|
@@ -6,6 +6,44 @@ import { getBlock } from './getBlock.js';
|
|
6
6
|
import { getTransaction, } from './getTransaction.js';
|
7
7
|
import { getTransactionReceipt, } from './getTransactionReceipt.js';
|
8
8
|
import { watchBlockNumber } from './watchBlockNumber.js';
|
9
|
+
/**
|
10
|
+
* Waits for the [Transaction](https://viem.sh/docs/glossary/terms.html#transaction) to be included on a [Block](https://viem.sh/docs/glossary/terms.html#block) (one confirmation), and then returns the [Transaction Receipt](https://viem.sh/docs/glossary/terms.html#transaction-receipt). If the Transaction reverts, then the action will throw an error.
|
11
|
+
*
|
12
|
+
* - Docs: https://viem.sh/docs/actions/public/waitForTransactionReceipt.html
|
13
|
+
* - Example: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/transactions/sending-transactions
|
14
|
+
* - JSON-RPC Methods:
|
15
|
+
* - Polls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt) on each block until it has been processed.
|
16
|
+
* - If a Transaction has been replaced:
|
17
|
+
* - Calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getblockbynumber) and extracts the transactions
|
18
|
+
* - Checks if one of the Transactions is a replacement
|
19
|
+
* - If so, calls [`eth_getTransactionReceipt`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getTransactionReceipt).
|
20
|
+
*
|
21
|
+
* The `waitForTransactionReceipt` action additionally supports Replacement detection (e.g. sped up Transactions).
|
22
|
+
*
|
23
|
+
* 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.
|
24
|
+
*
|
25
|
+
* There are 3 types of Transaction Replacement reasons:
|
26
|
+
*
|
27
|
+
* - `repriced`: The gas price has been modified (e.g. different `maxFeePerGas`)
|
28
|
+
* - `cancelled`: The Transaction has been cancelled (e.g. `value === 0n`)
|
29
|
+
* - `replaced`: The Transaction has been replaced (e.g. different `value` or `data`)
|
30
|
+
*
|
31
|
+
* @param client - Client to use
|
32
|
+
* @param parameters - {@link WaitForTransactionReceiptParameters}
|
33
|
+
* @returns The transaction receipt. {@link WaitForTransactionReceiptReturnType}
|
34
|
+
*
|
35
|
+
* @example
|
36
|
+
* import { createPublicClient, waitForTransactionReceipt, http } from 'viem'
|
37
|
+
* import { mainnet } from 'viem/chains'
|
38
|
+
*
|
39
|
+
* const client = createPublicClient({
|
40
|
+
* chain: mainnet,
|
41
|
+
* transport: http(),
|
42
|
+
* })
|
43
|
+
* const transactionReceipt = await waitForTransactionReceipt(client, {
|
44
|
+
* hash: '0x4ca7ee652d57678f26e887c149ab0735f41de37bcad58c9f6d3ed5824f15b74d',
|
45
|
+
* })
|
46
|
+
*/
|
9
47
|
export async function waitForTransactionReceipt(client, { confirmations = 1, hash, onReplaced, pollingInterval = client.pollingInterval, timeout, }) {
|
10
48
|
const observerId = stringify(['waitForTransactionReceipt', client.uid, hash]);
|
11
49
|
let transaction;
|
@@ -31,12 +69,17 @@ export async function waitForTransactionReceipt(client, { confirmations = 1, has
|
|
31
69
|
_unobserve();
|
32
70
|
};
|
33
71
|
try {
|
72
|
+
// If we already have a valid receipt, let's check if we have enough
|
73
|
+
// confirmations. If we do, then we can resolve.
|
34
74
|
if (receipt) {
|
35
75
|
if (blockNumber - receipt.blockNumber + 1n < confirmations)
|
36
76
|
return;
|
37
77
|
done(() => emit.resolve(receipt));
|
38
78
|
return;
|
39
79
|
}
|
80
|
+
// Get the transaction to check if it's been replaced.
|
81
|
+
// We need to retry as some RPC Providers may be slow to sync
|
82
|
+
// up mined transactions.
|
40
83
|
if (!transaction) {
|
41
84
|
retrying = true;
|
42
85
|
await withRetry(async () => {
|
@@ -44,33 +87,42 @@ export async function waitForTransactionReceipt(client, { confirmations = 1, has
|
|
44
87
|
if (transaction.blockNumber)
|
45
88
|
blockNumber = transaction.blockNumber;
|
46
89
|
}, {
|
90
|
+
// exponential backoff
|
47
91
|
delay: ({ count }) => ~~(1 << count) * 200,
|
48
92
|
retryCount: 6,
|
49
93
|
});
|
50
94
|
retrying = false;
|
51
95
|
}
|
96
|
+
// Get the receipt to check if it's been processed.
|
52
97
|
receipt = await getTransactionReceipt(client, { hash });
|
98
|
+
// Check if we have enough confirmations. If not, continue polling.
|
53
99
|
if (confirmations > 0 &&
|
54
100
|
blockNumber - receipt.blockNumber + 1n < confirmations)
|
55
101
|
return;
|
56
102
|
done(() => emit.resolve(receipt));
|
57
103
|
}
|
58
104
|
catch (err) {
|
105
|
+
// If the receipt is not found, the transaction will be pending.
|
106
|
+
// We need to check if it has potentially been replaced.
|
59
107
|
if (transaction &&
|
60
108
|
(err instanceof TransactionNotFoundError ||
|
61
109
|
err instanceof TransactionReceiptNotFoundError)) {
|
62
110
|
replacedTransaction = transaction;
|
111
|
+
// Let's retrieve the transactions from the current block.
|
63
112
|
const block = await getBlock(client, {
|
64
113
|
blockNumber,
|
65
114
|
includeTransactions: true,
|
66
115
|
});
|
67
116
|
const replacementTransaction = block.transactions.find(({ from, nonce }) => from === replacedTransaction.from &&
|
68
117
|
nonce === replacedTransaction.nonce);
|
118
|
+
// If we couldn't find a replacement transaction, continue polling.
|
69
119
|
if (!replacementTransaction)
|
70
120
|
return;
|
121
|
+
// If we found a replacement transaction, return it's receipt.
|
71
122
|
receipt = await getTransactionReceipt(client, {
|
72
123
|
hash: replacementTransaction.hash,
|
73
124
|
});
|
125
|
+
// Check if we have enough confirmations. If not, continue polling.
|
74
126
|
if (blockNumber - receipt.blockNumber + 1n < confirmations)
|
75
127
|
return;
|
76
128
|
let reason = 'replaced';
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"waitForTransactionReceipt.js","sourceRoot":"","sources":["../../../../src/actions/public/waitForTransactionReceipt.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,wBAAwB,EACxB,+BAA+B,EAC/B,qCAAqC,GACtC,MAAM,6BAA6B,CAAA;AAIpC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAEL,cAAc,GACf,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAEL,qBAAqB,GACtB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;
|
1
|
+
{"version":3,"file":"waitForTransactionReceipt.js","sourceRoot":"","sources":["../../../../src/actions/public/waitForTransactionReceipt.ts"],"names":[],"mappings":"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"}
|
@@ -3,6 +3,31 @@ import { observe } from '../../utils/observe.js';
|
|
3
3
|
import { poll } from '../../utils/poll.js';
|
4
4
|
import { stringify } from '../../utils/stringify.js';
|
5
5
|
import { getBlockNumber, } from './getBlockNumber.js';
|
6
|
+
/**
|
7
|
+
* Watches and returns incoming block numbers.
|
8
|
+
*
|
9
|
+
* - Docs: https://viem.sh/docs/actions/public/watchBlockNumber.html
|
10
|
+
* - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/watching-blocks
|
11
|
+
* - JSON-RPC Methods:
|
12
|
+
* - When `poll: true`, calls [`eth_blockNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_blocknumber) on a polling interval.
|
13
|
+
* - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newHeads"` event.
|
14
|
+
*
|
15
|
+
* @param client - Client to use
|
16
|
+
* @param parameters - {@link WatchBlockNumberParameters}
|
17
|
+
* @returns A function that can be invoked to stop watching for new block numbers. {@link WatchBlockNumberReturnType}
|
18
|
+
*
|
19
|
+
* @example
|
20
|
+
* import { createPublicClient, watchBlockNumber, http } from 'viem'
|
21
|
+
* import { mainnet } from 'viem/chains'
|
22
|
+
*
|
23
|
+
* const client = createPublicClient({
|
24
|
+
* chain: mainnet,
|
25
|
+
* transport: http(),
|
26
|
+
* })
|
27
|
+
* const unwatch = await watchBlockNumber(client, {
|
28
|
+
* onBlockNumber: (blockNumber) => console.log(blockNumber),
|
29
|
+
* })
|
30
|
+
*/
|
6
31
|
export function watchBlockNumber(client, { emitOnBegin = false, emitMissed = false, onBlockNumber, onError, poll: poll_, pollingInterval = client.pollingInterval, }) {
|
7
32
|
const enablePolling = typeof poll_ !== 'undefined' ? poll_ : client.transport.type !== 'webSocket';
|
8
33
|
let prevBlockNumber;
|
@@ -18,8 +43,12 @@ export function watchBlockNumber(client, { emitOnBegin = false, emitMissed = fal
|
|
18
43
|
try {
|
19
44
|
const blockNumber = await getBlockNumber(client, { maxAge: 0 });
|
20
45
|
if (prevBlockNumber) {
|
46
|
+
// If the current block number is the same as the previous,
|
47
|
+
// we can skip.
|
21
48
|
if (blockNumber === prevBlockNumber)
|
22
49
|
return;
|
50
|
+
// If we have missed out on some previous blocks, and the
|
51
|
+
// `emitMissed` flag is truthy, let's emit those blocks.
|
23
52
|
if (blockNumber - prevBlockNumber > 1 && emitMissed) {
|
24
53
|
for (let i = prevBlockNumber + 1n; i < blockNumber; i++) {
|
25
54
|
emit.onBlockNumber(i, prevBlockNumber);
|
@@ -27,6 +56,8 @@ export function watchBlockNumber(client, { emitOnBegin = false, emitMissed = fal
|
|
27
56
|
}
|
28
57
|
}
|
29
58
|
}
|
59
|
+
// If the next block number is greater than the previous,
|
60
|
+
// it is not in the past, and we can emit the new block number.
|
30
61
|
if (!prevBlockNumber || blockNumber > prevBlockNumber) {
|
31
62
|
emit.onBlockNumber(blockNumber, prevBlockNumber);
|
32
63
|
prevBlockNumber = blockNumber;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"watchBlockNumber.js","sourceRoot":"","sources":["../../../../src/actions/public/watchBlockNumber.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAA;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,OAAO,EAEL,cAAc,GACf,MAAM,qBAAqB,CAAA;
|
1
|
+
{"version":3,"file":"watchBlockNumber.js","sourceRoot":"","sources":["../../../../src/actions/public/watchBlockNumber.ts"],"names":[],"mappings":"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"}
|
@@ -2,6 +2,31 @@ import { observe } from '../../utils/observe.js';
|
|
2
2
|
import { poll } from '../../utils/poll.js';
|
3
3
|
import { stringify } from '../../utils/stringify.js';
|
4
4
|
import { getBlock } from './getBlock.js';
|
5
|
+
/**
|
6
|
+
* Watches and returns information for incoming blocks.
|
7
|
+
*
|
8
|
+
* - Docs: https://viem.sh/docs/actions/public/watchBlocks.html
|
9
|
+
* - Examples: https://stackblitz.com/github/wagmi-dev/viem/tree/main/examples/blocks/watching-blocks
|
10
|
+
* - JSON-RPC Methods:
|
11
|
+
* - When `poll: true`, calls [`eth_getBlockByNumber`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getBlockByNumber) on a polling interval.
|
12
|
+
* - When `poll: false` & WebSocket Transport, uses a WebSocket subscription via [`eth_subscribe`](https://docs.alchemy.com/reference/eth-subscribe-polygon) and the `"newHeads"` event.
|
13
|
+
*
|
14
|
+
* @param client - Client to use
|
15
|
+
* @param parameters - {@link WatchBlocksParameters}
|
16
|
+
* @returns A function that can be invoked to stop watching for new block numbers. {@link WatchBlocksReturnType}
|
17
|
+
*
|
18
|
+
* @example
|
19
|
+
* import { createPublicClient, watchBlocks, http } from 'viem'
|
20
|
+
* import { mainnet } from 'viem/chains'
|
21
|
+
*
|
22
|
+
* const client = createPublicClient({
|
23
|
+
* chain: mainnet,
|
24
|
+
* transport: http(),
|
25
|
+
* })
|
26
|
+
* const unwatch = await watchBlocks(client, {
|
27
|
+
* onBlock: (block) => console.log(block),
|
28
|
+
* })
|
29
|
+
*/
|
5
30
|
export function watchBlocks(client, { blockTag = 'latest', emitMissed = false, emitOnBegin = false, onBlock, onError, includeTransactions = false, poll: poll_, pollingInterval = client.pollingInterval, }) {
|
6
31
|
const enablePolling = typeof poll_ !== 'undefined' ? poll_ : client.transport.type !== 'webSocket';
|
7
32
|
let prevBlock;
|
@@ -21,8 +46,12 @@ export function watchBlocks(client, { blockTag = 'latest', emitMissed = false, e
|
|
21
46
|
includeTransactions,
|
22
47
|
});
|
23
48
|
if (block.number && prevBlock?.number) {
|
49
|
+
// If the current block number is the same as the previous,
|
50
|
+
// we can skip.
|
24
51
|
if (block.number === prevBlock.number)
|
25
52
|
return;
|
53
|
+
// If we have missed out on some previous blocks, and the
|
54
|
+
// `emitMissed` flag is truthy, let's emit those blocks.
|
26
55
|
if (block.number - prevBlock.number > 1 && emitMissed) {
|
27
56
|
for (let i = prevBlock?.number + 1n; i < block.number; i++) {
|
28
57
|
const block = await getBlock(client, {
|
@@ -34,8 +63,13 @@ export function watchBlocks(client, { blockTag = 'latest', emitMissed = false, e
|
|
34
63
|
}
|
35
64
|
}
|
36
65
|
}
|
37
|
-
if (
|
66
|
+
if (
|
67
|
+
// If no previous block exists, emit.
|
68
|
+
!prevBlock?.number ||
|
69
|
+
// If the block tag is "pending" with no block number, emit.
|
38
70
|
(blockTag === 'pending' && !block?.number) ||
|
71
|
+
// If the next block number is greater than the previous block number, emit.
|
72
|
+
// We don't want to emit blocks in the past.
|
39
73
|
(block.number && block.number > prevBlock.number)) {
|
40
74
|
emit.onBlock(block, prevBlock);
|
41
75
|
prevBlock = block;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"watchBlocks.js","sourceRoot":"","sources":["../../../../src/actions/public/watchBlocks.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,OAAO,EAA2B,QAAQ,EAAE,MAAM,eAAe,CAAA;
|
1
|
+
{"version":3,"file":"watchBlocks.js","sourceRoot":"","sources":["../../../../src/actions/public/watchBlocks.ts"],"names":[],"mappings":"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"}
|
@@ -7,6 +7,36 @@ import { getBlockNumber } from './getBlockNumber.js';
|
|
7
7
|
import { getFilterChanges } from './getFilterChanges.js';
|
8
8
|
import { getLogs } from './getLogs.js';
|
9
9
|
import { uninstallFilter } from './uninstallFilter.js';
|
10
|
+
/**
|
11
|
+
* Watches and returns emitted contract event logs.
|
12
|
+
*
|
13
|
+
* - Docs: https://viem.sh/docs/contract/watchContractEvent.html
|
14
|
+
*
|
15
|
+
* This Action will batch up all the event logs found within the [`pollingInterval`](https://viem.sh/docs/contract/watchContractEvent.html#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/contract/watchContractEvent.html#onLogs).
|
16
|
+
*
|
17
|
+
* `watchContractEvent` will attempt to create an [Event Filter](https://viem.sh/docs/contract/createContractEventFilter.html) 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.
|
18
|
+
*
|
19
|
+
* @param client - Client to use
|
20
|
+
* @param parameters - {@link WatchContractEventParameters}
|
21
|
+
* @returns A function that can be invoked to stop watching for new event logs. {@link WatchContractEventReturnType}
|
22
|
+
*
|
23
|
+
* @example
|
24
|
+
* import { createPublicClient, http, parseAbi } from 'viem'
|
25
|
+
* import { mainnet } from 'viem/chains'
|
26
|
+
* import { watchContractEvent } from 'viem/contract'
|
27
|
+
*
|
28
|
+
* const client = createPublicClient({
|
29
|
+
* chain: mainnet,
|
30
|
+
* transport: http(),
|
31
|
+
* })
|
32
|
+
* const unwatch = watchContractEvent(client, {
|
33
|
+
* address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
|
34
|
+
* abi: parseAbi(['event Transfer(address indexed from, address indexed to, uint256 value)']),
|
35
|
+
* eventName: 'Transfer',
|
36
|
+
* args: { from: '0xc961145a54C96E3aE9bAA048c4F4D6b04C13916b' },
|
37
|
+
* onLogs: (logs) => console.log(logs),
|
38
|
+
* })
|
39
|
+
*/
|
10
40
|
export function watchContractEvent(client, { abi, address, args, batch = true, eventName, onError, onLogs, pollingInterval = client.pollingInterval, strict: strict_, }) {
|
11
41
|
const observerId = stringify([
|
12
42
|
'watchContractEvent',
|
@@ -43,7 +73,13 @@ export function watchContractEvent(client, { abi, address, args, batch = true, e
|
|
43
73
|
logs = await getFilterChanges(client, { filter });
|
44
74
|
}
|
45
75
|
else {
|
76
|
+
// If the filter doesn't exist, we will fall back to use `getLogs`.
|
77
|
+
// The fall back exists because some RPC Providers do not support filters.
|
78
|
+
// Fetch the block number to use for `getLogs`.
|
46
79
|
const blockNumber = await getBlockNumber(client);
|
80
|
+
// If the block number has changed, we will need to fetch the logs.
|
81
|
+
// If the block number doesn't exist, we are yet to reach the first poll interval,
|
82
|
+
// so do not emit any logs.
|
47
83
|
if (previousBlockNumber && previousBlockNumber !== blockNumber) {
|
48
84
|
logs = await getLogs(client, {
|
49
85
|
address,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"watchContractEvent.js","sourceRoot":"","sources":["../../../../src/actions/public/watchContractEvent.ts"],"names":[],"mappings":"AAQA,OAAO,EAEL,UAAU,GACX,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,OAAO,EAEL,yBAAyB,GAC1B,MAAM,gCAAgC,CAAA;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAA0B,OAAO,EAAE,MAAM,cAAc,CAAA;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;
|
1
|
+
{"version":3,"file":"watchContractEvent.js","sourceRoot":"","sources":["../../../../src/actions/public/watchContractEvent.ts"],"names":[],"mappings":"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"}
|
@@ -6,6 +6,38 @@ import { getBlockNumber } from './getBlockNumber.js';
|
|
6
6
|
import { getFilterChanges } from './getFilterChanges.js';
|
7
7
|
import { getLogs } from './getLogs.js';
|
8
8
|
import { uninstallFilter } from './uninstallFilter.js';
|
9
|
+
/**
|
10
|
+
* Watches and returns emitted [Event Logs](https://viem.sh/docs/glossary/terms.html#event-log).
|
11
|
+
*
|
12
|
+
* - Docs: https://viem.sh/docs/actions/public/watchEvent.html
|
13
|
+
* - JSON-RPC Methods:
|
14
|
+
* - **RPC Provider supports `eth_newFilter`:**
|
15
|
+
* - Calls [`eth_newFilter`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_newfilter) to create a filter (called on initialize).
|
16
|
+
* - On a polling interval, it will call [`eth_getFilterChanges`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getfilterchanges).
|
17
|
+
* - **RPC Provider does not support `eth_newFilter`:**
|
18
|
+
* - Calls [`eth_getLogs`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_getlogs) for each block between the polling interval.
|
19
|
+
*
|
20
|
+
* This Action will batch up all the Event Logs found within the [`pollingInterval`](https://viem.sh/docs/actions/public/watchEvent.html#pollinginterval-optional), and invoke them via [`onLogs`](https://viem.sh/docs/actions/public/watchEvent.html#onLogs).
|
21
|
+
*
|
22
|
+
* `watchEvent` will attempt to create an [Event Filter](https://viem.sh/docs/actions/public/createEventFilter.html) and listen to changes to the Filter per polling interval, however, if the RPC Provider does not support Filters (e.g. `eth_newFilter`), then `watchEvent` will fall back to using [`getLogs`](https://viem.sh/docs/actions/public/getLogs.html) instead.
|
23
|
+
*
|
24
|
+
* @param client - Client to use
|
25
|
+
* @param parameters - {@link WatchEventParameters}
|
26
|
+
* @returns A function that can be invoked to stop watching for new Event Logs. {@link WatchEventReturnType}
|
27
|
+
*
|
28
|
+
* @example
|
29
|
+
* import { createPublicClient, http } from 'viem'
|
30
|
+
* import { mainnet } from 'viem/chains'
|
31
|
+
* import { watchEvent } from 'viem/public'
|
32
|
+
*
|
33
|
+
* const client = createPublicClient({
|
34
|
+
* chain: mainnet,
|
35
|
+
* transport: http(),
|
36
|
+
* })
|
37
|
+
* const unwatch = watchEvent(client, {
|
38
|
+
* onLogs: (logs) => console.log(logs),
|
39
|
+
* })
|
40
|
+
*/
|
9
41
|
export function watchEvent(client, { address, args, batch = true, event, onError, onLogs, pollingInterval = client.pollingInterval, strict: strict_, }) {
|
10
42
|
const observerId = stringify([
|
11
43
|
'watchEvent',
|
@@ -41,7 +73,13 @@ export function watchEvent(client, { address, args, batch = true, event, onError
|
|
41
73
|
logs = await getFilterChanges(client, { filter });
|
42
74
|
}
|
43
75
|
else {
|
76
|
+
// If the filter doesn't exist, we will fall back to use `getLogs`.
|
77
|
+
// The fall back exists because some RPC Providers do not support filters.
|
78
|
+
// Fetch the block number to use for `getLogs`.
|
44
79
|
const blockNumber = await getBlockNumber(client);
|
80
|
+
// If the block number has changed, we will need to fetch the logs.
|
81
|
+
// If the block number doesn't exist, we are yet to reach the first poll interval,
|
82
|
+
// so do not emit any logs.
|
45
83
|
if (previousBlockNumber && previousBlockNumber !== blockNumber) {
|
46
84
|
logs = await getLogs(client, {
|
47
85
|
address,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"watchEvent.js","sourceRoot":"","sources":["../../../../src/actions/public/watchEvent.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,OAAO,EAEL,iBAAiB,GAClB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;
|
1
|
+
{"version":3,"file":"watchEvent.js","sourceRoot":"","sources":["../../../../src/actions/public/watchEvent.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAEpD,OAAO,EAEL,iBAAiB,GAClB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAkDtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,UAAU,CAMxB,MAAuC,EACvC,EACE,OAAO,EACP,IAAI,EACJ,KAAK,GAAG,IAAI,EACZ,KAAK,EACL,OAAO,EACP,MAAM,EACN,eAAe,GAAG,MAAM,CAAC,eAAe,EACxC,MAAM,EAAE,OAAO,GAC0B;IAE3C,MAAM,UAAU,GAAG,SAAS,CAAC;QAC3B,YAAY;QACZ,OAAO;QACP,IAAI;QACJ,KAAK;QACL,MAAM,CAAC,GAAG;QACV,KAAK;QACL,eAAe;KAChB,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,OAAO,IAAI,KAAK,CAAA;IAE/B,OAAO,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;QACvD,IAAI,mBAA2B,CAAA;QAC/B,IAAI,MAAqD,CAAA;QACzD,IAAI,WAAW,GAAG,KAAK,CAAA;QAEvB,MAAM,OAAO,GAAG,IAAI,CAClB,KAAK,IAAI,EAAE;YACT,IAAI,CAAC,WAAW,EAAE;gBAChB,IAAI;oBACF,MAAM,GAAG,CAAC,MAAM,iBAAiB,CAAC,MAAM,EAAE;wBACxC,OAAO;wBACP,IAAI;wBACJ,KAAK,EAAE,KAAM;wBACb,MAAM;qBACmC,CAAC,CAI3C,CAAA;iBACF;gBAAC,MAAM,GAAE;gBACV,WAAW,GAAG,IAAI,CAAA;gBAClB,OAAM;aACP;YAED,IAAI;gBACF,IAAI,IAAW,CAAA;gBACf,IAAI,MAAM,EAAE;oBACV,IAAI,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;iBAClD;qBAAM;oBACL,mEAAmE;oBACnE,0EAA0E;oBAE1E,+CAA+C;oBAC/C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,CAAA;oBAEhD,mEAAmE;oBACnE,kFAAkF;oBAClF,2BAA2B;oBAC3B,IAAI,mBAAmB,IAAI,mBAAmB,KAAK,WAAW,EAAE;wBAC9D,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE;4BAC3B,OAAO;4BACP,IAAI;4BACJ,SAAS,EAAE,mBAAmB,GAAG,EAAE;4BACnC,OAAO,EAAE,WAAW;4BACpB,KAAK,EAAE,KAAM;yBACd,CAAC,CAAA;qBACH;yBAAM;wBACL,IAAI,GAAG,EAAE,CAAA;qBACV;oBACD,mBAAmB,GAAG,WAAW,CAAA;iBAClC;gBAED,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;oBAAE,OAAM;gBAC7B,IAAI,KAAK;oBAAE,IAAI,CAAC,MAAM,CAAC,IAAW,CAAC,CAAA;;oBAC9B,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAQ,CAAC,CAAC,CAAA;aACtD;YAAC,OAAO,GAAG,EAAE;gBACZ,IAAI,CAAC,OAAO,EAAE,CAAC,GAAY,CAAC,CAAA;aAC7B;QACH,CAAC,EACD;YACE,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,eAAe;SAC1B,CACF,CAAA;QAED,OAAO,KAAK,IAAI,EAAE;YAChB,IAAI,MAAM;gBAAE,MAAM,eAAe,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;YACrD,OAAO,EAAE,CAAA;QACX,CAAC,CAAA;IACH,CAAC,CAAC,CAAA;AACJ,CAAC"}
|