@prb/effect-evm 1.0.0-beta.1 → 1.0.0-beta.10
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/DOCS.md +13 -0
- package/README.md +4 -0
- package/dist/abi/erc165.js.map +1 -1
- package/dist/abi/erc20-no-output.js.map +1 -1
- package/dist/abi/erc20.js.map +1 -1
- package/dist/abi/erc721.js.map +1 -1
- package/dist/abi/index.js.map +1 -1
- package/dist/balance/index.js.map +1 -1
- package/dist/balance/service.js.map +1 -1
- package/dist/balance/service.test.integration.d.ts +2 -0
- package/dist/balance/service.test.integration.d.ts.map +1 -0
- package/dist/balance/service.test.integration.js +289 -0
- package/dist/balance/service.test.integration.js.map +1 -0
- package/dist/balance/utils.js.map +1 -1
- package/dist/block/errors.js.map +1 -1
- package/dist/block/index.js.map +1 -1
- package/dist/block/service.js.map +1 -1
- package/dist/block/service.test.integration.d.ts +2 -0
- package/dist/block/service.test.integration.d.ts.map +1 -0
- package/dist/block/service.test.integration.js +190 -0
- package/dist/block/service.test.integration.js.map +1 -0
- package/dist/constants/index.d.ts +0 -4
- package/dist/constants/index.d.ts.map +1 -1
- package/dist/constants/index.js +1 -5
- package/dist/constants/index.js.map +1 -1
- package/dist/contract/cross-chain-reader.js.map +1 -1
- package/dist/contract/index.js.map +1 -1
- package/dist/contract/pipeline/index.js.map +1 -1
- package/dist/contract/pipeline/internal/core.d.ts +2 -2
- package/dist/contract/pipeline/internal/core.d.ts.map +1 -1
- package/dist/contract/pipeline/internal/core.js.map +1 -1
- package/dist/contract/pipeline/internal/helpers.js.map +1 -1
- package/dist/contract/pipeline/internal/nonce.js.map +1 -1
- package/dist/contract/pipeline/internal/prepare.js.map +1 -1
- package/dist/contract/pipeline/internal/receipt.d.ts +2 -2
- package/dist/contract/pipeline/internal/receipt.d.ts.map +1 -1
- package/dist/contract/pipeline/internal/receipt.js +1 -1
- package/dist/contract/pipeline/internal/receipt.js.map +1 -1
- package/dist/contract/pipeline/live.js.map +1 -1
- package/dist/contract/pipeline/service.d.ts +3 -3
- package/dist/contract/pipeline/service.d.ts.map +1 -1
- package/dist/contract/pipeline/service.js.map +1 -1
- package/dist/contract/pipeline/types.d.ts +2 -2
- package/dist/contract/pipeline/types.d.ts.map +1 -1
- package/dist/contract/pipeline/types.js.map +1 -1
- package/dist/contract/pipeline/write-and-track.d.ts.map +1 -1
- package/dist/contract/pipeline/write-and-track.js +5 -6
- package/dist/contract/pipeline/write-and-track.js.map +1 -1
- package/dist/contract/pipeline/write-and-wait.d.ts +1 -1
- package/dist/contract/pipeline/write-and-wait.d.ts.map +1 -1
- package/dist/contract/pipeline/write-and-wait.js.map +1 -1
- package/dist/contract/pipeline.js.map +1 -1
- package/dist/contract/reader.js.map +1 -1
- package/dist/contract/typed-contract.js.map +1 -1
- package/dist/contract/writer.js.map +1 -1
- package/dist/core/clients/index.js.map +1 -1
- package/dist/core/clients/public-client.js.map +1 -1
- package/dist/core/clients/wallet-client.js.map +1 -1
- package/dist/core/errors/client.js.map +1 -1
- package/dist/core/errors/contract.js.map +1 -1
- package/dist/core/errors/erc20.js.map +1 -1
- package/dist/core/errors/event.js.map +1 -1
- package/dist/core/errors/index.js.map +1 -1
- package/dist/core/errors/predicates.js.map +1 -1
- package/dist/core/errors/transaction.d.ts +7 -7
- package/dist/core/errors/transaction.d.ts.map +1 -1
- package/dist/core/errors/transaction.js +2 -2
- package/dist/core/errors/transaction.js.map +1 -1
- package/dist/core/errors/viem-mapper.d.ts +3 -3
- package/dist/core/errors/viem-mapper.d.ts.map +1 -1
- package/dist/core/errors/viem-mapper.js +14 -5
- package/dist/core/errors/viem-mapper.js.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/deploy/errors.js.map +1 -1
- package/dist/deploy/index.js.map +1 -1
- package/dist/deploy/service.d.ts +3 -3
- package/dist/deploy/service.d.ts.map +1 -1
- package/dist/deploy/service.js.map +1 -1
- package/dist/eip7702/erc7579.js.map +1 -1
- package/dist/eip7702/errors.d.ts +3 -3
- package/dist/eip7702/errors.d.ts.map +1 -1
- package/dist/eip7702/errors.js +1 -1
- package/dist/eip7702/errors.js.map +1 -1
- package/dist/eip7702/index.js.map +1 -1
- package/dist/eip7702/service.d.ts +8 -8
- package/dist/eip7702/service.d.ts.map +1 -1
- package/dist/eip7702/service.js +2 -2
- package/dist/eip7702/service.js.map +1 -1
- package/dist/ens/ens.d.ts.map +1 -1
- package/dist/ens/ens.js +6 -6
- package/dist/ens/ens.js.map +1 -1
- package/dist/ens/errors.js.map +1 -1
- package/dist/ens/index.js.map +1 -1
- package/dist/erc20/allowance/core.js.map +1 -1
- package/dist/erc20/allowance/index.js.map +1 -1
- package/dist/erc20/allowance/no-output.js.map +1 -1
- package/dist/erc20/allowance/types.js.map +1 -1
- package/dist/erc20/index.d.ts +1 -0
- package/dist/erc20/index.d.ts.map +1 -1
- package/dist/erc20/index.js +1 -0
- package/dist/erc20/index.js.map +1 -1
- package/dist/erc20/metadata.d.ts +16 -0
- package/dist/erc20/metadata.d.ts.map +1 -0
- package/dist/erc20/metadata.js +67 -0
- package/dist/erc20/metadata.js.map +1 -0
- package/dist/erc721/errors.js.map +1 -1
- package/dist/erc721/helpers.js.map +1 -1
- package/dist/erc721/index.js.map +1 -1
- package/dist/erc721/metadata.js.map +1 -1
- package/dist/erc721/service.js.map +1 -1
- package/dist/events/backfill.js.map +1 -1
- package/dist/events/backfill.test.integration.d.ts +2 -0
- package/dist/events/backfill.test.integration.d.ts.map +1 -0
- package/dist/events/backfill.test.integration.js +112 -0
- package/dist/events/backfill.test.integration.js.map +1 -0
- package/dist/events/cursor.js.map +1 -1
- package/dist/events/decoder.js.map +1 -1
- package/dist/events/index.js.map +1 -1
- package/dist/events/reliable-stream-simple.test.integration.d.ts +2 -0
- package/dist/events/reliable-stream-simple.test.integration.d.ts.map +1 -0
- package/dist/events/reliable-stream-simple.test.integration.js +22 -0
- package/dist/events/reliable-stream-simple.test.integration.js.map +1 -0
- package/dist/events/reliable-stream.js.map +1 -1
- package/dist/events/reliable-stream.test.integration.d.ts +2 -0
- package/dist/events/reliable-stream.test.integration.d.ts.map +1 -0
- package/dist/events/reliable-stream.test.integration.js +327 -0
- package/dist/events/reliable-stream.test.integration.js.map +1 -0
- package/dist/events/stream.js.map +1 -1
- package/dist/events/stream.test.integration.d.ts +2 -0
- package/dist/events/stream.test.integration.d.ts.map +1 -0
- package/dist/events/stream.test.integration.js +120 -0
- package/dist/events/stream.test.integration.js.map +1 -0
- package/dist/gas/errors.js.map +1 -1
- package/dist/gas/estimator.d.ts.map +1 -1
- package/dist/gas/estimator.js +75 -58
- package/dist/gas/estimator.js.map +1 -1
- package/dist/gas/index.js.map +1 -1
- package/dist/gas/service.d.ts.map +1 -1
- package/dist/gas/service.js +14 -2
- package/dist/gas/service.js.map +1 -1
- package/dist/gas/service.test.integration.d.ts +2 -0
- package/dist/gas/service.test.integration.d.ts.map +1 -0
- package/dist/gas/service.test.integration.js +152 -0
- package/dist/gas/service.test.integration.js.map +1 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/react-hooks/convenience/index.js.map +1 -1
- package/dist/integrations/react-hooks/internal/error.js.map +1 -1
- package/dist/integrations/react-hooks/internal/is-dev.js.map +1 -1
- package/dist/integrations/react-hooks/internal/runtime.js.map +1 -1
- package/dist/integrations/react-hooks/internal/scoped-run.js.map +1 -1
- package/dist/integrations/react-hooks/internal/stable.js.map +1 -1
- package/dist/integrations/react-hooks/primitives/use-effect-memo-factory.js.map +1 -1
- package/dist/integrations/react-hooks/primitives/use-effect.js.map +1 -1
- package/dist/integrations/react-hooks/primitives/use-fork-effect.js.map +1 -1
- package/dist/integrations/react-hooks/primitives/use-stream.js.map +1 -1
- package/dist/integrations/react-hooks/primitives.js.map +1 -1
- package/dist/integrations/react-hooks/provider.js.map +1 -1
- package/dist/integrations/react-hooks/wagmi/index.js.map +1 -1
- package/dist/integrations/react-hooks/wallet-provider-ref.js.map +1 -1
- package/dist/integrations/wagmi/index.js.map +1 -1
- package/dist/integrations/wagmi/layers.js.map +1 -1
- package/dist/internal/index.js.map +1 -1
- package/dist/internal/numbers.js.map +1 -1
- package/dist/internal/schedule.js.map +1 -1
- package/dist/internal/stream-adapters.js.map +1 -1
- package/dist/internal/viem-effect.js.map +1 -1
- package/dist/nonce/index.js.map +1 -1
- package/dist/nonce/manager.js.map +1 -1
- package/dist/nonce/service.js.map +1 -1
- package/dist/nonce/service.test.integration.d.ts +2 -0
- package/dist/nonce/service.test.integration.d.ts.map +1 -0
- package/dist/nonce/service.test.integration.js +141 -0
- package/dist/nonce/service.test.integration.js.map +1 -0
- package/dist/platform/browser/cursor-store/index.js.map +1 -1
- package/dist/platform/browser/cursor-store/local-storage.js.map +1 -1
- package/dist/platform/browser/index.js.map +1 -1
- package/dist/platform/browser/layers.js.map +1 -1
- package/dist/platform/browser/storage/errors.js.map +1 -1
- package/dist/platform/browser/storage/index.js.map +1 -1
- package/dist/platform/browser/storage/local-storage.js.map +1 -1
- package/dist/platform/browser/tx-persistence/index.js.map +1 -1
- package/dist/platform/browser/tx-persistence/persistence.js.map +1 -1
- package/dist/platform/browser/tx-store/errors.js.map +1 -1
- package/dist/platform/browser/tx-store/index.js.map +1 -1
- package/dist/platform/browser/tx-store/local-storage.js.map +1 -1
- package/dist/platform/browser/tx-store/store.js.map +1 -1
- package/dist/platform/browser/tx-store/types.js.map +1 -1
- package/dist/presets/index.js.map +1 -1
- package/dist/presets/layers.js.map +1 -1
- package/dist/presets/transports.js.map +1 -1
- package/dist/query/chain-head.js.map +1 -1
- package/dist/query/client.js.map +1 -1
- package/dist/query/client.test.integration.d.ts +2 -0
- package/dist/query/client.test.integration.d.ts.map +1 -0
- package/dist/query/client.test.integration.js +94 -0
- package/dist/query/client.test.integration.js.map +1 -0
- package/dist/query/contract-query.js.map +1 -1
- package/dist/query/contract-query.test.integration.d.ts +2 -0
- package/dist/query/contract-query.test.integration.d.ts.map +1 -0
- package/dist/query/contract-query.test.integration.js +133 -0
- package/dist/query/contract-query.test.integration.js.map +1 -0
- package/dist/query/index.js.map +1 -1
- package/dist/query/multicall-batcher.js.map +1 -1
- package/dist/react-hooks/index.d.ts +0 -2
- package/dist/react-hooks/index.d.ts.map +1 -1
- package/dist/react-hooks/index.js +0 -2
- package/dist/react-hooks/index.js.map +1 -1
- package/dist/react-hooks/wagmi/index.js.map +1 -1
- package/dist/rpc/cache.js.map +1 -1
- package/dist/rpc/circuit-breaker.js.map +1 -1
- package/dist/rpc/dedup.js.map +1 -1
- package/dist/rpc/index.js.map +1 -1
- package/dist/rpc/retry.js.map +1 -1
- package/dist/rpc/routemesh.js.map +1 -1
- package/dist/signature/errors.js.map +1 -1
- package/dist/signature/index.js.map +1 -1
- package/dist/signature/service.js.map +1 -1
- package/dist/signature/service.test.integration.d.ts +2 -0
- package/dist/signature/service.test.integration.d.ts.map +1 -0
- package/dist/signature/service.test.integration.js +179 -0
- package/dist/signature/service.test.integration.js.map +1 -0
- package/dist/signature/utils.js.map +1 -1
- package/dist/simulation/errors.js.map +1 -1
- package/dist/simulation/index.js.map +1 -1
- package/dist/simulation/service.js.map +1 -1
- package/dist/simulation/tenderly.js.map +1 -1
- package/dist/simulation/tenderly.test.integration.d.ts +2 -0
- package/dist/simulation/tenderly.test.integration.d.ts.map +1 -0
- package/dist/simulation/tenderly.test.integration.js +104 -0
- package/dist/simulation/tenderly.test.integration.js.map +1 -0
- package/dist/simulation/types.js.map +1 -1
- package/dist/subscriptions/block-subscription.js.map +1 -1
- package/dist/subscriptions/errors.js.map +1 -1
- package/dist/subscriptions/index.js.map +1 -1
- package/dist/subscriptions/log-subscription.js.map +1 -1
- package/dist/subscriptions/pending-tx.d.ts +1 -1
- package/dist/subscriptions/pending-tx.d.ts.map +1 -1
- package/dist/subscriptions/pending-tx.js +1 -1
- package/dist/subscriptions/pending-tx.js.map +1 -1
- package/dist/subscriptions/service.d.ts +2 -2
- package/dist/subscriptions/service.d.ts.map +1 -1
- package/dist/subscriptions/service.js +4 -4
- package/dist/subscriptions/service.js.map +1 -1
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/logger.js.map +1 -1
- package/dist/telemetry/tracer.d.ts +2 -2
- package/dist/telemetry/tracer.js +2 -2
- package/dist/telemetry/tracer.js.map +1 -1
- package/dist/testing-kit/_fixtures/addresses.js.map +1 -1
- package/dist/testing-kit/_fixtures/receipts.js.map +1 -1
- package/dist/testing-kit/helpers.js.map +1 -1
- package/dist/testing-kit/index.js.map +1 -1
- package/dist/testing-kit/mock-balance-service.js.map +1 -1
- package/dist/testing-kit/mock-block-service.js.map +1 -1
- package/dist/testing-kit/mock-cross-chain-reader.js.map +1 -1
- package/dist/testing-kit/mock-deploy-service.js.map +1 -1
- package/dist/testing-kit/mock-erc721-service.js.map +1 -1
- package/dist/testing-kit/mock-gas-service.js.map +1 -1
- package/dist/testing-kit/mock-nonce-service.js.map +1 -1
- package/dist/testing-kit/mock-public-client.js.map +1 -1
- package/dist/testing-kit/mock-signature-service.js.map +1 -1
- package/dist/testing-kit/mock-simulation-service.js.map +1 -1
- package/dist/testing-kit/mock-subscription-service.d.ts +2 -2
- package/dist/testing-kit/mock-subscription-service.d.ts.map +1 -1
- package/dist/testing-kit/mock-subscription-service.js +5 -5
- package/dist/testing-kit/mock-subscription-service.js.map +1 -1
- package/dist/testing-kit/mock-transfer-service.d.ts +3 -3
- package/dist/testing-kit/mock-transfer-service.d.ts.map +1 -1
- package/dist/testing-kit/mock-transfer-service.js.map +1 -1
- package/dist/testing-kit/mock-wallet-client.js.map +1 -1
- package/dist/testing-kit/mock-wallet-provider.js.map +1 -1
- package/dist/testing-kit/test-layer.js.map +1 -1
- package/dist/transfer/index.js.map +1 -1
- package/dist/transfer/service.d.ts +8 -11
- package/dist/transfer/service.d.ts.map +1 -1
- package/dist/transfer/service.js +32 -13
- package/dist/transfer/service.js.map +1 -1
- package/dist/tx/fees.d.ts.map +1 -1
- package/dist/tx/fees.js +3 -0
- package/dist/tx/fees.js.map +1 -1
- package/dist/tx/index.js.map +1 -1
- package/dist/tx/manager.d.ts +3 -2
- package/dist/tx/manager.d.ts.map +1 -1
- package/dist/tx/manager.js +232 -216
- package/dist/tx/manager.js.map +1 -1
- package/dist/tx/manager.test.integration.d.ts +2 -0
- package/dist/tx/manager.test.integration.d.ts.map +1 -0
- package/dist/tx/manager.test.integration.js +177 -0
- package/dist/tx/manager.test.integration.js.map +1 -0
- package/dist/tx/policy.d.ts +1 -1
- package/dist/tx/policy.d.ts.map +1 -1
- package/dist/tx/policy.js.map +1 -1
- package/dist/tx/replacement.d.ts +3 -3
- package/dist/tx/replacement.d.ts.map +1 -1
- package/dist/tx/replacement.js +3 -3
- package/dist/tx/replacement.js.map +1 -1
- package/dist/tx/tracker.d.ts +6 -6
- package/dist/tx/tracker.d.ts.map +1 -1
- package/dist/tx/tracker.js +9 -9
- package/dist/tx/tracker.js.map +1 -1
- package/dist/types/abi.js.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/params.d.ts +1 -1
- package/dist/types/params.d.ts.map +1 -1
- package/dist/types/params.js.map +1 -1
- package/dist/types/tx-overrides.d.ts +1 -1
- package/dist/types/tx-overrides.d.ts.map +1 -1
- package/dist/types/tx-overrides.js.map +1 -1
- package/dist/wagmi/index.js.map +1 -1
- package/dist/wagmi/layers.js.map +1 -1
- package/dist/wallet/errors.d.ts +3 -3
- package/dist/wallet/errors.d.ts.map +1 -1
- package/dist/wallet/errors.js +1 -1
- package/dist/wallet/errors.js.map +1 -1
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/lifecycle.js.map +1 -1
- package/dist/wallet/operations.d.ts +2 -2
- package/dist/wallet/operations.d.ts.map +1 -1
- package/dist/wallet/operations.js +2 -2
- package/dist/wallet/operations.js.map +1 -1
- package/dist/wallet/provider-ref.js.map +1 -1
- package/dist/wallet/service.d.ts +2 -2
- package/dist/wallet/service.d.ts.map +1 -1
- package/dist/wallet/service.js.map +1 -1
- package/dist/wallet/types.js.map +1 -1
- package/package.json +25 -14
- package/dist/react-hooks/use-is-safe-multisig.d.ts +0 -2
- package/dist/react-hooks/use-is-safe-multisig.d.ts.map +0 -1
- package/dist/react-hooks/use-is-safe-multisig.js +0 -44
- package/dist/react-hooks/use-is-safe-multisig.js.map +0 -1
- package/dist/react-hooks/use-safe-context.d.ts +0 -2
- package/dist/react-hooks/use-safe-context.d.ts.map +0 -1
- package/dist/react-hooks/use-safe-context.js +0 -41
- package/dist/react-hooks/use-safe-context.js.map +0 -1
- package/dist/safe/adapter.d.ts +0 -9
- package/dist/safe/adapter.d.ts.map +0 -1
- package/dist/safe/adapter.js +0 -13
- package/dist/safe/adapter.js.map +0 -1
- package/dist/safe/detection.d.ts +0 -26
- package/dist/safe/detection.d.ts.map +0 -1
- package/dist/safe/detection.js +0 -102
- package/dist/safe/detection.js.map +0 -1
- package/dist/safe/errors.d.ts +0 -79
- package/dist/safe/errors.d.ts.map +0 -1
- package/dist/safe/errors.js +0 -34
- package/dist/safe/errors.js.map +0 -1
- package/dist/safe/index.d.ts +0 -8
- package/dist/safe/index.d.ts.map +0 -1
- package/dist/safe/index.js +0 -6
- package/dist/safe/index.js.map +0 -1
- package/dist/safe/live.d.ts +0 -8
- package/dist/safe/live.d.ts.map +0 -1
- package/dist/safe/live.js +0 -250
- package/dist/safe/live.js.map +0 -1
- package/dist/safe/service.d.ts +0 -26
- package/dist/safe/service.d.ts.map +0 -1
- package/dist/safe/service.js +0 -4
- package/dist/safe/service.js.map +0 -1
- package/dist/safe/simulation/abis.d.ts +0 -73
- package/dist/safe/simulation/abis.d.ts.map +0 -1
- package/dist/safe/simulation/abis.js +0 -61
- package/dist/safe/simulation/abis.js.map +0 -1
- package/dist/safe/simulation/addresses.d.ts +0 -4
- package/dist/safe/simulation/addresses.d.ts.map +0 -1
- package/dist/safe/simulation/addresses.js +0 -40
- package/dist/safe/simulation/addresses.js.map +0 -1
- package/dist/safe/simulation/encoding.d.ts +0 -16
- package/dist/safe/simulation/encoding.d.ts.map +0 -1
- package/dist/safe/simulation/encoding.js +0 -36
- package/dist/safe/simulation/encoding.js.map +0 -1
- package/dist/safe/simulation/errors.d.ts +0 -56
- package/dist/safe/simulation/errors.d.ts.map +0 -1
- package/dist/safe/simulation/errors.js +0 -37
- package/dist/safe/simulation/errors.js.map +0 -1
- package/dist/safe/simulation/index.d.ts +0 -7
- package/dist/safe/simulation/index.d.ts.map +0 -1
- package/dist/safe/simulation/index.js +0 -6
- package/dist/safe/simulation/index.js.map +0 -1
- package/dist/safe/simulation/service.d.ts +0 -14
- package/dist/safe/simulation/service.d.ts.map +0 -1
- package/dist/safe/simulation/service.js +0 -140
- package/dist/safe/simulation/service.js.map +0 -1
- package/dist/safe/simulation/types.d.ts +0 -20
- package/dist/safe/simulation/types.d.ts.map +0 -1
- package/dist/safe/simulation/types.js +0 -2
- package/dist/safe/simulation/types.js.map +0 -1
- package/dist/safe/types.d.ts +0 -61
- package/dist/safe/types.d.ts.map +0 -1
- package/dist/safe/types.js +0 -2
- package/dist/safe/types.js.map +0 -1
package/DOCS.md
CHANGED
|
@@ -229,6 +229,19 @@ function App() {
|
|
|
229
229
|
}
|
|
230
230
|
```
|
|
231
231
|
|
|
232
|
+
### Safe App vs Safe multisig
|
|
233
|
+
|
|
234
|
+
Use Safe App hooks to detect the host iframe context, and Safe multisig hooks to detect the connected wallet.
|
|
235
|
+
|
|
236
|
+
- Safe App context (SDK): `useIsSafeAppContext`
|
|
237
|
+
- Safe App host (SDK + origin): `useIsHostSafeApp`
|
|
238
|
+
- Safe multisig wallet (SDK + connector + host): `useIsSafeMultisigWallet`
|
|
239
|
+
|
|
240
|
+
Safe App origin utilities let you control the allowed host list:
|
|
241
|
+
|
|
242
|
+
- `DEFAULT_SAFE_APP_ORIGINS`
|
|
243
|
+
- `getSafeAppOrigins`, `setSafeAppOrigins`, `extendSafeAppOrigins`, `subscribeSafeAppOrigins`
|
|
244
|
+
|
|
232
245
|
### Primitive hooks
|
|
233
246
|
|
|
234
247
|
Low-level hooks for running Effects and Streams in React:
|
package/README.md
CHANGED
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
[](https://effect.website)
|
|
5
5
|
[](https://viem.sh)
|
|
6
6
|
|
|
7
|
+
> [!WARNING] This is experimental, beta software. It is provided "as is" without warranty of any kind, express or
|
|
8
|
+
> implied.
|
|
9
|
+
|
|
7
10
|
Type-safe, composable EVM abstractions for [Effect](https://effect.website), built on [viem](https://viem.sh).
|
|
8
11
|
|
|
9
12
|
## 📦 Installation
|
|
@@ -60,6 +63,7 @@ Effect.runPromise(program.pipe(Effect.provide(EvmLayer)));
|
|
|
60
63
|
- **Subscriptions** — `SubscriptionService` (blocks/logs/pending tx)
|
|
61
64
|
- **EIP-7702** — Delegation and atomic batching for EOAs
|
|
62
65
|
- **React hooks** — `effect-evm/react-hooks` (primitives + convenience hooks)
|
|
66
|
+
- **Safe App + Safe multisig** — `useIsSafeAppContext`, `useIsHostSafeApp`, `useIsSafeMultisigWallet`
|
|
63
67
|
- **Wagmi integration** — `effect-evm/wagmi` (build layers from wagmi config)
|
|
64
68
|
- **Browser persistence** — `browser` namespace (localStorage-backed stores)
|
|
65
69
|
- **Testing** — `effect-evm/testing-kit` (mocks + `makeEffectEvmTestLayer`)
|
package/dist/abi/erc165.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erc165.js","sourceRoot":"","sources":["../../src/abi/erc165.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAIzD,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;QACE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACjD,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACrC,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;CACO,CAAC;AAGX,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAqB,CAAC;AAKzD,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,OAAe,EACf,OAAgB,EACiE,EAAE,CACnF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAChC,GAAG,EAAE,SAAS;QACd,OAAO;QACP,IAAI,EAAE,CAAC,mBAAmB,CAAC;QAC3B,OAAO;QACP,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;IACH,OAAO,MAAiB,CAAC;AAC3B,CAAC,CAAC,CAAC;AAKL,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAe,EACf,OAAgB,EAChB,WAAgB,EACiE,EAAE,CACnF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAChC,GAAG,EAAE,SAAS;QACd,OAAO;QACP,IAAI,EAAE,CAAC,WAAW,CAAC;QACnB,OAAO;QACP,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;IACH,OAAO,MAAiB,CAAC;AAC3B,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"erc165.js","sourceRoot":"","sources":["../../src/abi/erc165.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAIzD,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB;QACE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACjD,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACrC,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;CACO,CAAC;AAGX,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAqB,CAAC;AAKzD,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,OAAe,EACf,OAAgB,EACiE,EAAE,CACnF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAChC,GAAG,EAAE,SAAS;QACd,OAAO;QACP,IAAI,EAAE,CAAC,mBAAmB,CAAC;QAC3B,OAAO;QACP,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;IACH,OAAO,MAAiB,CAAC;AAC3B,CAAC,CAAC,CAAC;AAKL,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,OAAe,EACf,OAAgB,EAChB,WAAgB,EACiE,EAAE,CACnF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;QAChC,GAAG,EAAE,SAAS;QACd,OAAO;QACP,IAAI,EAAE,CAAC,WAAW,CAAC;QACnB,OAAO;QACP,YAAY,EAAE,mBAAmB;KAClC,CAAC,CAAC;IACH,OAAO,MAAiB,CAAC;AAC3B,CAAC,CAAC,CAAC","sourcesContent":["import { Effect } from \"effect\";\nimport type { Address, Hex } from \"viem\";\nimport { ERC721_INTERFACE_ID } from \"@/src/abi/index.js\";\nimport { ContractReader } from \"@/src/contract/index.js\";\nimport type { ClientNotFoundError, ContractReadError } from \"@/src/core/index.js\";\n\n/** ERC-165 ABI for supportsInterface check */\nexport const erc165Abi = [\n {\n inputs: [{ name: \"interfaceId\", type: \"bytes4\" }],\n name: \"supportsInterface\",\n outputs: [{ name: \"\", type: \"bool\" }],\n stateMutability: \"view\",\n type: \"function\",\n },\n] as const;\n\n/** ERC-165 interface ID for ERC-721 */\nexport const ERC165_INTERFACE_ID = \"0x01ffc9a7\" as const;\n\n/**\n * Check if a contract supports ERC-721 via ERC-165 supportsInterface\n */\nexport const isErc721 = (\n chainId: number,\n address: Address\n): Effect.Effect<boolean, ContractReadError | ClientNotFoundError, ContractReader> =>\n Effect.gen(function* () {\n const reader = yield* ContractReader;\n const result = yield* reader.read({\n abi: erc165Abi,\n address,\n args: [ERC721_INTERFACE_ID],\n chainId,\n functionName: \"supportsInterface\",\n });\n return result as boolean;\n });\n\n/**\n * Check if a contract supports a given interface via ERC-165\n */\nexport const supportsInterface = (\n chainId: number,\n address: Address,\n interfaceId: Hex\n): Effect.Effect<boolean, ContractReadError | ClientNotFoundError, ContractReader> =>\n Effect.gen(function* () {\n const reader = yield* ContractReader;\n const result = yield* reader.read({\n abi: erc165Abi,\n address,\n args: [interfaceId],\n chainId,\n functionName: \"supportsInterface\",\n });\n return result as boolean;\n });\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erc20-no-output.js","sourceRoot":"","sources":["../../src/abi/erc20-no-output.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B;QACE,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;SACnC;QACD,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,YAAY;QAC7B,IAAI,EAAE,UAAU;KACjB;CACqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"erc20-no-output.js","sourceRoot":"","sources":["../../src/abi/erc20-no-output.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B;QACE,MAAM,EAAE;YACN,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;YACpC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;SACnC;QACD,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,EAAE;QACX,eAAe,EAAE,YAAY;QAC7B,IAAI,EAAE,UAAU;KACjB;CACqB,CAAC","sourcesContent":["import type { Abi } from \"viem\";\n\n/**\n * Minimal ERC-20 ABI variant where `approve` has no return value.\n *\n * Some tokens (notably USDT on mainnet) do not return a boolean from `approve`,\n * which makes standard ERC-20 ABIs fail when decoding the response.\n */\nexport const erc20NoOutputAbi = [\n {\n inputs: [\n { name: \"spender\", type: \"address\" },\n { name: \"value\", type: \"uint256\" },\n ],\n name: \"approve\",\n outputs: [],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const satisfies Abi;\n"]}
|
package/dist/abi/erc20.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../src/abi/erc20.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC"}
|
|
1
|
+
{"version":3,"file":"erc20.js","sourceRoot":"","sources":["../../src/abi/erc20.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,MAAM,CAAC","sourcesContent":["export { erc20Abi, erc20Abi_bytes32 } from \"viem\";\n"]}
|
package/dist/abi/erc721.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erc721.js","sourceRoot":"","sources":["../../src/abi/erc721.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAMjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"erc721.js","sourceRoot":"","sources":["../../src/abi/erc721.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAMjC,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAqB,CAAC","sourcesContent":["export { erc721Abi } from \"viem\";\n\n/**\n * ERC-165 interface ID for ERC-721\n * @see https://github.com/binodnp/openzeppelin-solidity/blob/ffc4bcbba398b61d19ede03e4fdf673ddbce1083/contracts/token/ERC721/ERC721.sol#L34-L46\n */\nexport const ERC721_INTERFACE_ID = \"0x80ac58cd\" as const;\n"]}
|
package/dist/abi/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/abi/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/abi/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC","sourcesContent":["export * from \"./erc20.js\";\nexport * from \"./erc20-no-output.js\";\nexport * from \"./erc165.js\";\nexport * from \"./erc721.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/balance/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/balance/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC","sourcesContent":["export * from \"./service.js\";\nexport { decodeBytes32String } from \"./utils.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/balance/service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/balance/service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Effect, Layer, Stream } from \"effect\";\nimport type { Address, Hex } from \"viem\";\nimport { erc20Abi, erc20Abi_bytes32 } from \"@/src/abi/index.js\";\nimport type { ContractReaderShape } from \"@/src/contract/index.js\";\nimport { ContractReader } from \"@/src/contract/index.js\";\nimport type { ClientNotFoundError, ContractReadError, MulticallError } from \"@/src/core/index.js\";\nimport { PublicClientService, TransportError } from \"@/src/core/index.js\";\nimport { SpanNames } from \"@/src/telemetry/index.js\";\nimport type { MulticallResult } from \"@/src/types/index.js\";\nimport { decodeBytes32String } from \"./utils.js\";\n\nexport type TokenBalance = {\n address: Address;\n balance: bigint;\n decimals: number;\n symbol?: string;\n name?: string;\n};\n\nexport type BalanceServiceShape = {\n readonly getBalance: (params: {\n chainId: number;\n address: Address;\n blockTag?: \"latest\" | \"pending\";\n }) => Effect.Effect<bigint, ClientNotFoundError | TransportError>;\n\n readonly getTokenBalance: (params: {\n chainId: number;\n address: Address;\n tokenAddress: Address;\n }) => Effect.Effect<bigint, ContractReadError | ClientNotFoundError>;\n\n readonly getTokenBalances: (params: {\n chainId: number;\n address: Address;\n tokenAddresses: Address[];\n }) => Effect.Effect<TokenBalance[], ClientNotFoundError | MulticallError>;\n\n readonly watchBalance: (params: {\n chainId: number;\n address: Address;\n pollingInterval?: number;\n }) => Effect.Effect<Stream.Stream<bigint, unknown>, ClientNotFoundError>;\n\n readonly watchTokenBalance: (params: {\n chainId: number;\n address: Address;\n tokenAddress: Address;\n pollingInterval?: number;\n }) => Effect.Effect<Stream.Stream<bigint, unknown>, ClientNotFoundError>;\n\n readonly hasSufficientBalance: (params: {\n chainId: number;\n address: Address;\n required: bigint;\n }) => Effect.Effect<boolean, ClientNotFoundError | TransportError>;\n\n readonly hasSufficientTokenBalance: (params: {\n chainId: number;\n address: Address;\n tokenAddress: Address;\n required: bigint;\n }) => Effect.Effect<boolean, ContractReadError | ClientNotFoundError>;\n};\n\nexport class BalanceService extends Context.Tag(\"ew3/BalanceService\")<\n BalanceService,\n BalanceServiceShape\n>() {}\n\n/**\n * Build multicall requests for token balances including bytes32 fallbacks\n */\nfunction buildMulticallRequests(\n params: { chainId: number; address: Address; tokenAddresses: Address[] },\n contractReader: ContractReaderShape\n) {\n // Use multicall for efficient batch queries\n const balanceCalls = params.tokenAddresses.map((tokenAddress) => ({\n abi: erc20Abi,\n address: tokenAddress,\n args: [params.address] as const,\n functionName: \"balanceOf\" as const,\n }));\n\n const decimalsCalls = params.tokenAddresses.map((tokenAddress) => ({\n abi: erc20Abi,\n address: tokenAddress,\n args: [] as const,\n functionName: \"decimals\" as const,\n }));\n\n const symbolCalls = params.tokenAddresses.map((tokenAddress) => ({\n abi: erc20Abi,\n address: tokenAddress,\n args: [] as const,\n functionName: \"symbol\" as const,\n }));\n\n const nameCalls = params.tokenAddresses.map((tokenAddress) => ({\n abi: erc20Abi,\n address: tokenAddress,\n args: [] as const,\n functionName: \"name\" as const,\n }));\n\n const symbolBytes32Calls = params.tokenAddresses.map((tokenAddress) => ({\n abi: erc20Abi_bytes32,\n address: tokenAddress,\n args: [] as const,\n functionName: \"symbol\" as const,\n }));\n\n const nameBytes32Calls = params.tokenAddresses.map((tokenAddress) => ({\n abi: erc20Abi_bytes32,\n address: tokenAddress,\n args: [] as const,\n functionName: \"name\" as const,\n }));\n\n // Combine all calls\n const allCalls = [\n ...balanceCalls,\n ...decimalsCalls,\n ...symbolCalls,\n ...nameCalls,\n ...symbolBytes32Calls,\n ...nameBytes32Calls,\n ];\n\n return contractReader.multicall(params.chainId, allCalls);\n}\n\n/**\n * Process multicall results and extract token balance data\n */\nfunction processTokenBalanceResults(\n tokenAddresses: Address[],\n results: readonly MulticallResult[]\n): TokenBalance[] {\n const tokenCount = tokenAddresses.length;\n const tokenBalances: TokenBalance[] = [];\n\n for (let i = 0; i < tokenCount; i++) {\n const balanceResult = results[i];\n const decimalsResult = results[tokenCount + i];\n const symbolResult = results[tokenCount * 2 + i];\n const nameResult = results[tokenCount * 3 + i];\n const symbolBytes32Result = results[tokenCount * 4 + i];\n const nameBytes32Result = results[tokenCount * 5 + i];\n\n // Prefer string results, fall back to bytes32\n const symbol = extractStringOrBytes32(symbolResult, symbolBytes32Result);\n const name = extractStringOrBytes32(nameResult, nameBytes32Result);\n\n tokenBalances.push({\n address: tokenAddresses[i],\n balance: balanceResult.status === \"success\" ? (balanceResult.result as bigint) : 0n,\n decimals: decimalsResult.status === \"success\" ? (decimalsResult.result as number) : 18,\n name,\n symbol,\n });\n }\n\n return tokenBalances;\n}\n\n/**\n * Extract string value, preferring string result over bytes32 fallback\n */\nfunction extractStringOrBytes32(\n stringResult: MulticallResult,\n bytes32Result: MulticallResult\n): string | undefined {\n if (stringResult.status === \"success\") {\n return stringResult.result as string;\n }\n if (bytes32Result.status === \"success\") {\n return decodeBytes32String(bytes32Result.result as Hex);\n }\n return undefined;\n}\n\nexport const BalanceServiceLive = Layer.effect(\n BalanceService,\n Effect.gen(function* () {\n const publicClientService = yield* PublicClientService;\n const contractReader = yield* ContractReader;\n\n return BalanceService.of({\n getBalance: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n return yield* Effect.tryPromise({\n catch: (cause) =>\n new TransportError({\n cause,\n message: `Failed to get balance (chainId=${params.chainId}, address=${params.address})`,\n url: client.transport.url ?? \"unknown\",\n }),\n try: () =>\n client.getBalance({\n address: params.address,\n blockTag: params.blockTag ?? \"latest\",\n }),\n });\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_GET, {\n attributes: {\n address: params.address,\n blockTag: params.blockTag,\n chainId: params.chainId,\n },\n })\n ),\n\n getTokenBalance: (params) =>\n Effect.gen(function* () {\n return (yield* contractReader.read({\n abi: erc20Abi,\n address: params.tokenAddress,\n args: [params.address],\n chainId: params.chainId,\n functionName: \"balanceOf\",\n })) as bigint;\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_GET_TOKEN, {\n attributes: {\n address: params.address,\n chainId: params.chainId,\n tokenAddress: params.tokenAddress,\n },\n })\n ),\n\n getTokenBalances: (params) =>\n Effect.gen(function* () {\n const results = yield* buildMulticallRequests(params, contractReader);\n return processTokenBalanceResults(params.tokenAddresses, results);\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_GET_TOKEN_BATCH, {\n attributes: {\n address: params.address,\n chainId: params.chainId,\n tokenCount: params.tokenAddresses.length,\n },\n })\n ),\n\n hasSufficientBalance: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n const balance = yield* Effect.tryPromise({\n catch: (cause) =>\n new TransportError({\n cause,\n message: `Failed to get balance (chainId=${params.chainId}, address=${params.address})`,\n url: client.transport.url ?? \"unknown\",\n }),\n try: () =>\n client.getBalance({\n address: params.address,\n }),\n });\n\n return balance >= params.required;\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_CHECK, {\n attributes: {\n address: params.address,\n chainId: params.chainId,\n required: params.required.toString(),\n },\n })\n ),\n\n hasSufficientTokenBalance: (params) =>\n Effect.gen(function* () {\n const balance = (yield* contractReader.read({\n abi: erc20Abi,\n address: params.tokenAddress,\n args: [params.address],\n chainId: params.chainId,\n functionName: \"balanceOf\",\n })) as bigint;\n\n return balance >= params.required;\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_CHECK_TOKEN, {\n attributes: {\n address: params.address,\n chainId: params.chainId,\n required: params.required.toString(),\n tokenAddress: params.tokenAddress,\n },\n })\n ),\n\n watchBalance: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n return Stream.async<bigint, unknown>((emit) => {\n const unwatch = client.watchBlockNumber({\n onBlockNumber: async (blockNumber) => {\n try {\n const balance = await client.getBalance({\n address: params.address,\n blockNumber,\n });\n emit.single(balance);\n } catch (error) {\n emit.fail(error as unknown);\n }\n },\n onError: (error) => {\n emit.fail(error as unknown);\n },\n pollingInterval: params.pollingInterval,\n });\n\n return Effect.sync(() => {\n unwatch();\n });\n });\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_WATCH, {\n attributes: {\n address: params.address,\n chainId: params.chainId,\n pollingInterval: params.pollingInterval,\n },\n })\n ),\n\n watchTokenBalance: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n return Stream.async<bigint, unknown>((emit) => {\n const unwatch = client.watchBlockNumber({\n onBlockNumber: async () => {\n try {\n const balanceEffect = contractReader.read({\n abi: erc20Abi,\n address: params.tokenAddress,\n args: [params.address],\n chainId: params.chainId,\n functionName: \"balanceOf\",\n });\n\n const balance = (await Effect.runPromise(balanceEffect)) as bigint;\n emit.single(balance);\n } catch (error) {\n emit.fail(error as unknown);\n }\n },\n onError: (error) => {\n emit.fail(error as unknown);\n },\n pollingInterval: params.pollingInterval,\n });\n\n return Effect.sync(() => {\n unwatch();\n });\n });\n }).pipe(\n Effect.withSpan(SpanNames.BALANCE_WATCH_TOKEN, {\n attributes: {\n address: params.address,\n chainId: params.chainId,\n pollingInterval: params.pollingInterval,\n tokenAddress: params.tokenAddress,\n },\n })\n ),\n });\n })\n);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.test.integration.d.ts","sourceRoot":"","sources":["../../src/balance/service.test.integration.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import { describe, expect, it } from "@effect/vitest";
|
|
2
|
+
import { Cause, Effect, Exit } from "effect";
|
|
3
|
+
import { mainnet } from "viem/chains";
|
|
4
|
+
import { BalanceService, decodeBytes32String } from "../balance/index.js";
|
|
5
|
+
import { ClientNotFoundError, TransportError } from "../core/index.js";
|
|
6
|
+
import { makeEffectEvmTestLayer } from "../testing-kit/index.js";
|
|
7
|
+
describe("BalanceService (Live)", () => {
|
|
8
|
+
const testAddress = "0x1234567890123456789012345678901234567890";
|
|
9
|
+
const tokenAddress = "0xabcdefabcdefabcdefabcdefabcdefabcdefabcd";
|
|
10
|
+
const testLayer = makeEffectEvmTestLayer({
|
|
11
|
+
publicClient: {
|
|
12
|
+
getBalance: () => Promise.resolve(1000000000000000000n),
|
|
13
|
+
multicall: (params) => {
|
|
14
|
+
const contracts = params.contracts ?? [];
|
|
15
|
+
return Promise.resolve(contracts.map((c) => {
|
|
16
|
+
switch (c.functionName) {
|
|
17
|
+
case "balanceOf":
|
|
18
|
+
return { result: 1000000000n, status: "success" };
|
|
19
|
+
case "decimals":
|
|
20
|
+
return { result: 18, status: "success" };
|
|
21
|
+
case "symbol":
|
|
22
|
+
return { result: "MOCK", status: "success" };
|
|
23
|
+
case "name":
|
|
24
|
+
return { result: "Mock Token", status: "success" };
|
|
25
|
+
default:
|
|
26
|
+
return { result: 0n, status: "success" };
|
|
27
|
+
}
|
|
28
|
+
}));
|
|
29
|
+
},
|
|
30
|
+
readContract: (params) => {
|
|
31
|
+
const functionName = params.functionName;
|
|
32
|
+
if (functionName === "balanceOf") {
|
|
33
|
+
return Promise.resolve(1000000000n);
|
|
34
|
+
}
|
|
35
|
+
return Promise.resolve(0n);
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
describe("getBalance", () => {
|
|
40
|
+
it.effect("returns native balance", () => Effect.gen(function* () {
|
|
41
|
+
const service = yield* BalanceService;
|
|
42
|
+
const result = yield* service.getBalance({
|
|
43
|
+
address: testAddress,
|
|
44
|
+
chainId: mainnet.id,
|
|
45
|
+
});
|
|
46
|
+
expect(result).toBe(1000000000000000000n);
|
|
47
|
+
}).pipe(Effect.provide(testLayer)));
|
|
48
|
+
it.effect("supports blockTag parameter", () => Effect.gen(function* () {
|
|
49
|
+
const service = yield* BalanceService;
|
|
50
|
+
const result = yield* service.getBalance({
|
|
51
|
+
address: testAddress,
|
|
52
|
+
blockTag: "latest",
|
|
53
|
+
chainId: mainnet.id,
|
|
54
|
+
});
|
|
55
|
+
expect(result).toBe(1000000000000000000n);
|
|
56
|
+
}).pipe(Effect.provide(testLayer)));
|
|
57
|
+
it.effect("fails with TransportError (not defect) when RPC rejects", () => {
|
|
58
|
+
const failingLayer = makeEffectEvmTestLayer({
|
|
59
|
+
publicClient: {
|
|
60
|
+
getBalance: () => Promise.reject(new Error("boom")),
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
return Effect.gen(function* () {
|
|
64
|
+
const service = yield* BalanceService;
|
|
65
|
+
const exit = yield* Effect.exit(service.getBalance({
|
|
66
|
+
address: testAddress,
|
|
67
|
+
chainId: mainnet.id,
|
|
68
|
+
}));
|
|
69
|
+
expect(Exit.isFailure(exit)).toBe(true);
|
|
70
|
+
if (Exit.isFailure(exit)) {
|
|
71
|
+
const error = Cause.failureOption(exit.cause);
|
|
72
|
+
expect(error._tag).toBe("Some");
|
|
73
|
+
if (error._tag === "Some") {
|
|
74
|
+
expect(error.value).toBeInstanceOf(TransportError);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}).pipe(Effect.provide(failingLayer));
|
|
78
|
+
});
|
|
79
|
+
it.effect("fails with ClientNotFoundError for unsupported chainId", () => Effect.gen(function* () {
|
|
80
|
+
const service = yield* BalanceService;
|
|
81
|
+
const exit = yield* Effect.exit(service.getBalance({
|
|
82
|
+
address: testAddress,
|
|
83
|
+
chainId: 123_456_789,
|
|
84
|
+
}));
|
|
85
|
+
expect(Exit.isFailure(exit)).toBe(true);
|
|
86
|
+
if (Exit.isFailure(exit)) {
|
|
87
|
+
const error = Cause.failureOption(exit.cause);
|
|
88
|
+
if (error._tag === "Some") {
|
|
89
|
+
expect(error.value).toBeInstanceOf(ClientNotFoundError);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}).pipe(Effect.provide(testLayer)));
|
|
93
|
+
});
|
|
94
|
+
describe("getTokenBalance", () => {
|
|
95
|
+
it.effect("returns token balance", () => Effect.gen(function* () {
|
|
96
|
+
const service = yield* BalanceService;
|
|
97
|
+
const result = yield* service.getTokenBalance({
|
|
98
|
+
address: testAddress,
|
|
99
|
+
chainId: mainnet.id,
|
|
100
|
+
tokenAddress,
|
|
101
|
+
});
|
|
102
|
+
expect(result).toBe(1000000000n);
|
|
103
|
+
}).pipe(Effect.provide(testLayer)));
|
|
104
|
+
});
|
|
105
|
+
describe("getTokenBalances", () => {
|
|
106
|
+
it.effect("returns multiple token balances with metadata", () => Effect.gen(function* () {
|
|
107
|
+
const service = yield* BalanceService;
|
|
108
|
+
const tokenAddresses = [
|
|
109
|
+
"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd",
|
|
110
|
+
"0x1111111111111111111111111111111111111111",
|
|
111
|
+
];
|
|
112
|
+
const result = yield* service.getTokenBalances({
|
|
113
|
+
address: testAddress,
|
|
114
|
+
chainId: mainnet.id,
|
|
115
|
+
tokenAddresses,
|
|
116
|
+
});
|
|
117
|
+
expect(result).toHaveLength(2);
|
|
118
|
+
expect(result[0]?.balance).toBe(1000000000n);
|
|
119
|
+
expect(result[0]?.decimals).toBe(18);
|
|
120
|
+
expect(result[0]?.symbol).toBe("MOCK");
|
|
121
|
+
expect(result[0]?.name).toBe("Mock Token");
|
|
122
|
+
}).pipe(Effect.provide(testLayer)));
|
|
123
|
+
it.effect("falls back to bytes32 when string calls fail", () => {
|
|
124
|
+
const bytes32Layer = makeEffectEvmTestLayer({
|
|
125
|
+
publicClient: {
|
|
126
|
+
multicall: (params) => {
|
|
127
|
+
const contracts = params.contracts ?? [];
|
|
128
|
+
return Promise.resolve(contracts.map((c) => {
|
|
129
|
+
const isBytes32Abi = Array.isArray(c.abi) &&
|
|
130
|
+
c.abi.some((item) => item.name === c.functionName && item.outputs?.[0]?.type === "bytes32");
|
|
131
|
+
switch (c.functionName) {
|
|
132
|
+
case "balanceOf":
|
|
133
|
+
return { result: 1000000000n, status: "success" };
|
|
134
|
+
case "decimals":
|
|
135
|
+
return { result: 18, status: "success" };
|
|
136
|
+
case "symbol":
|
|
137
|
+
if (isBytes32Abi) {
|
|
138
|
+
return {
|
|
139
|
+
result: "0x5553445400000000000000000000000000000000000000000000000000000000",
|
|
140
|
+
status: "success",
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
error: new Error("not supported"),
|
|
145
|
+
status: "failure",
|
|
146
|
+
};
|
|
147
|
+
case "name":
|
|
148
|
+
if (isBytes32Abi) {
|
|
149
|
+
return {
|
|
150
|
+
result: "0x5465746865722055534400000000000000000000000000000000000000000000",
|
|
151
|
+
status: "success",
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
return {
|
|
155
|
+
error: new Error("not supported"),
|
|
156
|
+
status: "failure",
|
|
157
|
+
};
|
|
158
|
+
default:
|
|
159
|
+
return { result: 0n, status: "success" };
|
|
160
|
+
}
|
|
161
|
+
}));
|
|
162
|
+
},
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
return Effect.gen(function* () {
|
|
166
|
+
const service = yield* BalanceService;
|
|
167
|
+
const result = yield* service.getTokenBalances({
|
|
168
|
+
address: testAddress,
|
|
169
|
+
chainId: mainnet.id,
|
|
170
|
+
tokenAddresses: [tokenAddress],
|
|
171
|
+
});
|
|
172
|
+
expect(result).toHaveLength(1);
|
|
173
|
+
expect(result[0]?.symbol).toBe("USDT");
|
|
174
|
+
expect(result[0]?.name).toBe("Tether USD");
|
|
175
|
+
}).pipe(Effect.provide(bytes32Layer));
|
|
176
|
+
});
|
|
177
|
+
it.effect("prefers string results over bytes32 when both succeed", () => {
|
|
178
|
+
const hybridLayer = makeEffectEvmTestLayer({
|
|
179
|
+
publicClient: {
|
|
180
|
+
multicall: (params) => {
|
|
181
|
+
const contracts = params.contracts ?? [];
|
|
182
|
+
return Promise.resolve(contracts.map((c) => {
|
|
183
|
+
const isBytes32Abi = Array.isArray(c.abi) &&
|
|
184
|
+
c.abi.some((item) => item.name === c.functionName && item.outputs?.[0]?.type === "bytes32");
|
|
185
|
+
switch (c.functionName) {
|
|
186
|
+
case "balanceOf":
|
|
187
|
+
return { result: 1000000000n, status: "success" };
|
|
188
|
+
case "decimals":
|
|
189
|
+
return { result: 18, status: "success" };
|
|
190
|
+
case "symbol":
|
|
191
|
+
if (isBytes32Abi) {
|
|
192
|
+
return {
|
|
193
|
+
result: "0x4d4f434b00000000000000000000000000000000000000000000000000000000",
|
|
194
|
+
status: "success",
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
return {
|
|
198
|
+
result: "MOCK_STRING",
|
|
199
|
+
status: "success",
|
|
200
|
+
};
|
|
201
|
+
case "name":
|
|
202
|
+
if (isBytes32Abi) {
|
|
203
|
+
return {
|
|
204
|
+
result: "0x4d6f636b20546f6b656e0000000000000000000000000000000000000000000000",
|
|
205
|
+
status: "success",
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
result: "Mock Token String",
|
|
210
|
+
status: "success",
|
|
211
|
+
};
|
|
212
|
+
default:
|
|
213
|
+
return { result: 0n, status: "success" };
|
|
214
|
+
}
|
|
215
|
+
}));
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
return Effect.gen(function* () {
|
|
220
|
+
const service = yield* BalanceService;
|
|
221
|
+
const result = yield* service.getTokenBalances({
|
|
222
|
+
address: testAddress,
|
|
223
|
+
chainId: mainnet.id,
|
|
224
|
+
tokenAddresses: [tokenAddress],
|
|
225
|
+
});
|
|
226
|
+
expect(result).toHaveLength(1);
|
|
227
|
+
expect(result[0]?.symbol).toBe("MOCK_STRING");
|
|
228
|
+
expect(result[0]?.name).toBe("Mock Token String");
|
|
229
|
+
}).pipe(Effect.provide(hybridLayer));
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
describe("hasSufficientBalance", () => {
|
|
233
|
+
it.effect("returns true/false based on native balance", () => Effect.gen(function* () {
|
|
234
|
+
const service = yield* BalanceService;
|
|
235
|
+
const ok = yield* service.hasSufficientBalance({
|
|
236
|
+
address: testAddress,
|
|
237
|
+
chainId: mainnet.id,
|
|
238
|
+
required: 500000000000000000n,
|
|
239
|
+
});
|
|
240
|
+
const notOk = yield* service.hasSufficientBalance({
|
|
241
|
+
address: testAddress,
|
|
242
|
+
chainId: mainnet.id,
|
|
243
|
+
required: 2000000000000000000n,
|
|
244
|
+
});
|
|
245
|
+
expect(ok).toBe(true);
|
|
246
|
+
expect(notOk).toBe(false);
|
|
247
|
+
}).pipe(Effect.provide(testLayer)));
|
|
248
|
+
});
|
|
249
|
+
describe("hasSufficientTokenBalance", () => {
|
|
250
|
+
it.effect("returns true/false based on token balance", () => Effect.gen(function* () {
|
|
251
|
+
const service = yield* BalanceService;
|
|
252
|
+
const ok = yield* service.hasSufficientTokenBalance({
|
|
253
|
+
address: testAddress,
|
|
254
|
+
chainId: mainnet.id,
|
|
255
|
+
required: 500000000n,
|
|
256
|
+
tokenAddress,
|
|
257
|
+
});
|
|
258
|
+
const notOk = yield* service.hasSufficientTokenBalance({
|
|
259
|
+
address: testAddress,
|
|
260
|
+
chainId: mainnet.id,
|
|
261
|
+
required: 2000000000n,
|
|
262
|
+
tokenAddress,
|
|
263
|
+
});
|
|
264
|
+
expect(ok).toBe(true);
|
|
265
|
+
expect(notOk).toBe(false);
|
|
266
|
+
}).pipe(Effect.provide(testLayer)));
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
describe("decodeBytes32String", () => {
|
|
270
|
+
it("decodes bytes32 string correctly", () => {
|
|
271
|
+
const usdt = "0x5553445400000000000000000000000000000000000000000000000000000000";
|
|
272
|
+
expect(decodeBytes32String(usdt)).toBe("USDT");
|
|
273
|
+
const tetherUsd = "0x5465746865722055534400000000000000000000000000000000000000000000";
|
|
274
|
+
expect(decodeBytes32String(tetherUsd)).toBe("Tether USD");
|
|
275
|
+
});
|
|
276
|
+
it("returns undefined for empty or invalid input", () => {
|
|
277
|
+
expect(decodeBytes32String("0x")).toBeUndefined();
|
|
278
|
+
expect(decodeBytes32String("0x0000000000000000000000000000000000000000000000000000000000000000")).toBeUndefined();
|
|
279
|
+
});
|
|
280
|
+
it("handles trailing null bytes", () => {
|
|
281
|
+
const dai = "0x4441490000000000000000000000000000000000000000000000000000000000";
|
|
282
|
+
expect(decodeBytes32String(dai)).toBe("DAI");
|
|
283
|
+
});
|
|
284
|
+
it("strips whitespace", () => {
|
|
285
|
+
const testWithSpace = "0x5445535420000000000000000000000000000000000000000000000000000000";
|
|
286
|
+
expect(decodeBytes32String(testWithSpace)).toBe("TEST");
|
|
287
|
+
});
|
|
288
|
+
});
|
|
289
|
+
//# sourceMappingURL=service.test.integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.test.integration.js","sourceRoot":"","sources":["../../src/balance/service.test.integration.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from \"@effect/vitest\";\nimport { Cause, Effect, Exit } from \"effect\";\nimport type { Address, Hex } from \"viem\";\nimport { mainnet } from \"viem/chains\";\nimport { BalanceService, decodeBytes32String } from \"@/src/balance/index.js\";\nimport { ClientNotFoundError, TransportError } from \"@/src/core/index.js\";\nimport { makeEffectEvmTestLayer } from \"@/src/testing-kit/index.js\";\n\ndescribe(\"BalanceService (Live)\", () => {\n const testAddress = \"0x1234567890123456789012345678901234567890\" as Address;\n const tokenAddress = \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\" as Address;\n\n const testLayer = makeEffectEvmTestLayer({\n publicClient: {\n getBalance: () => Promise.resolve(1000000000000000000n),\n multicall: (params: unknown) => {\n const contracts =\n (params as { contracts?: Array<{ functionName?: string }> }).contracts ?? [];\n return Promise.resolve(\n contracts.map((c) => {\n switch (c.functionName) {\n case \"balanceOf\":\n return { result: 1000000000n, status: \"success\" as const };\n case \"decimals\":\n return { result: 18, status: \"success\" as const };\n case \"symbol\":\n return { result: \"MOCK\", status: \"success\" as const };\n case \"name\":\n return { result: \"Mock Token\", status: \"success\" as const };\n default:\n return { result: 0n, status: \"success\" as const };\n }\n })\n );\n },\n readContract: (params: unknown) => {\n const functionName = (params as { functionName?: string }).functionName;\n if (functionName === \"balanceOf\") {\n return Promise.resolve(1000000000n);\n }\n return Promise.resolve(0n);\n },\n },\n });\n\n describe(\"getBalance\", () => {\n it.effect(\"returns native balance\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const result = yield* service.getBalance({\n address: testAddress,\n chainId: mainnet.id,\n });\n\n expect(result).toBe(1000000000000000000n);\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"supports blockTag parameter\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const result = yield* service.getBalance({\n address: testAddress,\n blockTag: \"latest\",\n chainId: mainnet.id,\n });\n\n expect(result).toBe(1000000000000000000n);\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"fails with TransportError (not defect) when RPC rejects\", () => {\n const failingLayer = makeEffectEvmTestLayer({\n publicClient: {\n getBalance: () => Promise.reject(new Error(\"boom\")),\n },\n });\n\n return Effect.gen(function* () {\n const service = yield* BalanceService;\n const exit = yield* Effect.exit(\n service.getBalance({\n address: testAddress,\n chainId: mainnet.id,\n })\n );\n\n expect(Exit.isFailure(exit)).toBe(true);\n if (Exit.isFailure(exit)) {\n const error = Cause.failureOption(exit.cause);\n expect(error._tag).toBe(\"Some\");\n if (error._tag === \"Some\") {\n expect(error.value).toBeInstanceOf(TransportError);\n }\n }\n }).pipe(Effect.provide(failingLayer));\n });\n\n it.effect(\"fails with ClientNotFoundError for unsupported chainId\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const exit = yield* Effect.exit(\n service.getBalance({\n address: testAddress,\n chainId: 123_456_789,\n })\n );\n\n expect(Exit.isFailure(exit)).toBe(true);\n if (Exit.isFailure(exit)) {\n const error = Cause.failureOption(exit.cause);\n if (error._tag === \"Some\") {\n expect(error.value).toBeInstanceOf(ClientNotFoundError);\n }\n }\n }).pipe(Effect.provide(testLayer))\n );\n });\n\n describe(\"getTokenBalance\", () => {\n it.effect(\"returns token balance\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const result = yield* service.getTokenBalance({\n address: testAddress,\n chainId: mainnet.id,\n tokenAddress,\n });\n\n expect(result).toBe(1000000000n);\n }).pipe(Effect.provide(testLayer))\n );\n });\n\n describe(\"getTokenBalances\", () => {\n it.effect(\"returns multiple token balances with metadata\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const tokenAddresses = [\n \"0xabcdefabcdefabcdefabcdefabcdefabcdefabcd\" as Address,\n \"0x1111111111111111111111111111111111111111\" as Address,\n ];\n\n const result = yield* service.getTokenBalances({\n address: testAddress,\n chainId: mainnet.id,\n tokenAddresses,\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]?.balance).toBe(1000000000n);\n expect(result[0]?.decimals).toBe(18);\n expect(result[0]?.symbol).toBe(\"MOCK\");\n expect(result[0]?.name).toBe(\"Mock Token\");\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"falls back to bytes32 when string calls fail\", () => {\n type AbiItem = { name?: string; outputs?: Array<{ type?: string }> };\n type ContractCall = { functionName?: string; abi?: AbiItem[] };\n type MulticallParams = { contracts?: ContractCall[] };\n\n // Simulate token that uses bytes32 for symbol/name\n const bytes32Layer = makeEffectEvmTestLayer({\n publicClient: {\n multicall: (params: unknown) => {\n const contracts = (params as MulticallParams).contracts ?? [];\n return Promise.resolve(\n contracts.map((c) => {\n // Detect bytes32 ABI by checking if it returns bytes32\n const isBytes32Abi =\n Array.isArray(c.abi) &&\n c.abi.some(\n (item) => item.name === c.functionName && item.outputs?.[0]?.type === \"bytes32\"\n );\n\n switch (c.functionName) {\n case \"balanceOf\":\n return { result: 1000000000n, status: \"success\" as const };\n case \"decimals\":\n return { result: 18, status: \"success\" as const };\n case \"symbol\":\n if (isBytes32Abi) {\n // Return USDT in bytes32 format\n return {\n result:\n \"0x5553445400000000000000000000000000000000000000000000000000000000\" as Hex,\n status: \"success\" as const,\n };\n }\n // String version fails\n return {\n error: new Error(\"not supported\"),\n status: \"failure\" as const,\n };\n case \"name\":\n if (isBytes32Abi) {\n // Return \"Tether USD\" in bytes32 format\n return {\n result:\n \"0x5465746865722055534400000000000000000000000000000000000000000000\" as Hex,\n status: \"success\" as const,\n };\n }\n // String version fails\n return {\n error: new Error(\"not supported\"),\n status: \"failure\" as const,\n };\n default:\n return { result: 0n, status: \"success\" as const };\n }\n })\n );\n },\n },\n });\n\n return Effect.gen(function* () {\n const service = yield* BalanceService;\n const result = yield* service.getTokenBalances({\n address: testAddress,\n chainId: mainnet.id,\n tokenAddresses: [tokenAddress],\n });\n\n expect(result).toHaveLength(1);\n expect(result[0]?.symbol).toBe(\"USDT\");\n expect(result[0]?.name).toBe(\"Tether USD\");\n }).pipe(Effect.provide(bytes32Layer));\n });\n\n it.effect(\"prefers string results over bytes32 when both succeed\", () => {\n type AbiItem = { name?: string; outputs?: Array<{ type?: string }> };\n type ContractCall = { functionName?: string; abi?: AbiItem[] };\n type MulticallParams = { contracts?: ContractCall[] };\n\n // Simulate token that supports both string and bytes32\n const hybridLayer = makeEffectEvmTestLayer({\n publicClient: {\n multicall: (params: unknown) => {\n const contracts = (params as MulticallParams).contracts ?? [];\n return Promise.resolve(\n contracts.map((c) => {\n const isBytes32Abi =\n Array.isArray(c.abi) &&\n c.abi.some(\n (item) => item.name === c.functionName && item.outputs?.[0]?.type === \"bytes32\"\n );\n\n switch (c.functionName) {\n case \"balanceOf\":\n return { result: 1000000000n, status: \"success\" as const };\n case \"decimals\":\n return { result: 18, status: \"success\" as const };\n case \"symbol\":\n if (isBytes32Abi) {\n return {\n result:\n \"0x4d4f434b00000000000000000000000000000000000000000000000000000000\" as Hex,\n status: \"success\" as const,\n };\n }\n return {\n result: \"MOCK_STRING\",\n status: \"success\" as const,\n };\n case \"name\":\n if (isBytes32Abi) {\n return {\n result:\n \"0x4d6f636b20546f6b656e0000000000000000000000000000000000000000000000\" as Hex,\n status: \"success\" as const,\n };\n }\n return {\n result: \"Mock Token String\",\n status: \"success\" as const,\n };\n default:\n return { result: 0n, status: \"success\" as const };\n }\n })\n );\n },\n },\n });\n\n return Effect.gen(function* () {\n const service = yield* BalanceService;\n const result = yield* service.getTokenBalances({\n address: testAddress,\n chainId: mainnet.id,\n tokenAddresses: [tokenAddress],\n });\n\n expect(result).toHaveLength(1);\n // Should prefer string results\n expect(result[0]?.symbol).toBe(\"MOCK_STRING\");\n expect(result[0]?.name).toBe(\"Mock Token String\");\n }).pipe(Effect.provide(hybridLayer));\n });\n });\n\n describe(\"hasSufficientBalance\", () => {\n it.effect(\"returns true/false based on native balance\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const ok = yield* service.hasSufficientBalance({\n address: testAddress,\n chainId: mainnet.id,\n required: 500000000000000000n,\n });\n const notOk = yield* service.hasSufficientBalance({\n address: testAddress,\n chainId: mainnet.id,\n required: 2000000000000000000n,\n });\n\n expect(ok).toBe(true);\n expect(notOk).toBe(false);\n }).pipe(Effect.provide(testLayer))\n );\n });\n\n describe(\"hasSufficientTokenBalance\", () => {\n it.effect(\"returns true/false based on token balance\", () =>\n Effect.gen(function* () {\n const service = yield* BalanceService;\n const ok = yield* service.hasSufficientTokenBalance({\n address: testAddress,\n chainId: mainnet.id,\n required: 500000000n,\n tokenAddress,\n });\n const notOk = yield* service.hasSufficientTokenBalance({\n address: testAddress,\n chainId: mainnet.id,\n required: 2000000000n,\n tokenAddress,\n });\n\n expect(ok).toBe(true);\n expect(notOk).toBe(false);\n }).pipe(Effect.provide(testLayer))\n );\n });\n});\n\ndescribe(\"decodeBytes32String\", () => {\n it(\"decodes bytes32 string correctly\", () => {\n // \"USDT\" encoded as bytes32\n const usdt = \"0x5553445400000000000000000000000000000000000000000000000000000000\" as Hex;\n expect(decodeBytes32String(usdt)).toBe(\"USDT\");\n\n // \"Tether USD\" encoded as bytes32\n const tetherUsd = \"0x5465746865722055534400000000000000000000000000000000000000000000\" as Hex;\n expect(decodeBytes32String(tetherUsd)).toBe(\"Tether USD\");\n });\n\n it(\"returns undefined for empty or invalid input\", () => {\n expect(decodeBytes32String(\"0x\" as Hex)).toBeUndefined();\n expect(\n decodeBytes32String(\n \"0x0000000000000000000000000000000000000000000000000000000000000000\" as Hex\n )\n ).toBeUndefined();\n });\n\n it(\"handles trailing null bytes\", () => {\n // \"DAI\" with trailing nulls\n const dai = \"0x4441490000000000000000000000000000000000000000000000000000000000\" as Hex;\n expect(decodeBytes32String(dai)).toBe(\"DAI\");\n });\n\n it(\"strips whitespace\", () => {\n // \"TEST \" with space and nulls\n const testWithSpace =\n \"0x5445535420000000000000000000000000000000000000000000000000000000\" as Hex;\n expect(decodeBytes32String(testWithSpace)).toBe(\"TEST\");\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/balance/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAOvD,MAAM,UAAU,mBAAmB,CAAC,GAAQ;IAC1C,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAGD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAG3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAE9B,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC;QAC9B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,MAAM;QACR,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC"}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/balance/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAOvD,MAAM,UAAU,mBAAmB,CAAC,GAAQ;IAC1C,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,OAAO,SAAS,CAAC;IACnB,CAAC;IAGD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAG3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;YAE9B,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC;QAC9B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,MAAM;QACR,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AAChD,CAAC","sourcesContent":["import { Option } from \"effect\";\nimport type { Hex } from \"viem\";\nimport { parseHexByte } from \"@/src/internal/index.js\";\n\n/**\n * Decode a bytes32 string (used by some ERC-20 tokens for name/symbol).\n * Strips trailing null bytes and decodes as UTF-8.\n * Returns undefined if the result is empty or invalid.\n */\nexport function decodeBytes32String(hex: Hex): string | undefined {\n if (!hex || hex === \"0x\" || hex.length < 4) {\n return undefined;\n }\n\n // Remove 0x prefix\n const bytes = hex.slice(2);\n\n // Convert hex to bytes, stopping at first null byte\n const chars: string[] = [];\n for (let i = 0; i < bytes.length; i += 2) {\n const byteOption = parseHexByte(bytes.slice(i, i + 2));\n if (Option.isNone(byteOption)) {\n // Invalid hex byte, skip\n continue;\n }\n const byte = byteOption.value;\n if (byte === 0) {\n break;\n }\n chars.push(String.fromCharCode(byte));\n }\n\n const result = chars.join(\"\").trim();\n return result.length > 0 ? result : undefined;\n}\n"]}
|
package/dist/block/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/block/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,WAAW,EAAsB,CAC9E,oBAAoB,EACpB;IACE,eAAe,EAAE,MAAM,CAAC,MAAM;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAEJ,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,WAAW,EAAqB,CAC5E,mBAAmB,EACnB;IACE,WAAW,EAAE,MAAM,CAAC,cAAc;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG"}
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/block/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,WAAW,EAAsB,CAC9E,oBAAoB,EACpB;IACE,eAAe,EAAE,MAAM,CAAC,MAAM;IAC9B,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG;AAEJ,MAAM,OAAO,iBAAkB,SAAQ,MAAM,CAAC,WAAW,EAAqB,CAC5E,mBAAmB,EACnB;IACE,WAAW,EAAE,MAAM,CAAC,cAAc;IAClC,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;IACtB,OAAO,EAAE,MAAM,CAAC,MAAM;CACvB,CACF;CAAG","sourcesContent":["import { Schema } from \"effect\";\n\nexport class BlockNotFoundError extends Schema.TaggedError<BlockNotFoundError>()(\n \"BlockNotFoundError\",\n {\n blockIdentifier: Schema.String,\n chainId: Schema.Number,\n message: Schema.String,\n }\n) {}\n\nexport class BlockTimeoutError extends Schema.TaggedError<BlockTimeoutError>()(\n \"BlockTimeoutError\",\n {\n blockNumber: Schema.BigIntFromSelf,\n chainId: Schema.Number,\n message: Schema.String,\n timeout: Schema.Number,\n }\n) {}\n"]}
|
package/dist/block/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/block/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/block/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC","sourcesContent":["export * from \"./errors.js\";\nexport * from \"./service.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/block/service.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/block/service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Stream } from \"effect\";\nimport { Context, Effect, Layer } from \"effect\";\nimport type { Block, Hash } from \"viem\";\nimport { DEFAULT_BLOCK_WAIT_TIMEOUT } from \"@/src/constants/index.js\";\nimport type { ClientNotFoundError } from \"@/src/core/index.js\";\nimport { PublicClientService, TransportError } from \"@/src/core/index.js\";\nimport { fromWatchCallback } from \"@/src/internal/index.js\";\nimport { SpanNames } from \"@/src/telemetry/index.js\";\nimport { BlockNotFoundError, BlockTimeoutError } from \"./errors.js\";\n\nexport type BlockServiceShape = {\n readonly getBlock: (params: {\n chainId: number;\n blockNumber?: bigint;\n blockTag?: \"latest\" | \"pending\" | \"earliest\" | \"safe\" | \"finalized\";\n includeTransactions?: boolean;\n }) => Effect.Effect<Block, BlockNotFoundError | ClientNotFoundError>;\n\n readonly getBlockByHash: (params: {\n chainId: number;\n hash: Hash;\n includeTransactions?: boolean;\n }) => Effect.Effect<Block, BlockNotFoundError | ClientNotFoundError>;\n\n readonly getBlockNumber: (params: {\n chainId: number;\n }) => Effect.Effect<bigint, ClientNotFoundError | TransportError>;\n\n readonly watchBlocks: (params: {\n chainId: number;\n pollingInterval?: number;\n includeTransactions?: boolean;\n }) => Effect.Effect<Stream.Stream<Block, unknown>, ClientNotFoundError>;\n\n readonly waitForBlock: (params: {\n chainId: number;\n blockNumber: bigint;\n timeout?: number;\n }) => Effect.Effect<\n Block,\n BlockNotFoundError | BlockTimeoutError | ClientNotFoundError | TransportError\n >;\n\n readonly getBlocks: (params: {\n chainId: number;\n fromBlock: bigint;\n toBlock: bigint;\n includeTransactions?: boolean;\n }) => Effect.Effect<Block[], ClientNotFoundError | BlockNotFoundError>;\n\n readonly getBlockTimestamp: (params: {\n chainId: number;\n blockNumber?: bigint;\n }) => Effect.Effect<bigint, ClientNotFoundError | BlockNotFoundError>;\n};\n\nexport class BlockService extends Context.Tag(\"ew3/BlockService\")<\n BlockService,\n BlockServiceShape\n>() {}\n\nexport const BlockServiceLive = Layer.effect(\n BlockService,\n Effect.gen(function* () {\n const publicClientService = yield* PublicClientService;\n\n return BlockService.of({\n getBlock: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n const block = yield* Effect.tryPromise({\n catch: (cause) =>\n new BlockNotFoundError({\n blockIdentifier: params.blockNumber?.toString() ?? params.blockTag ?? \"latest\",\n chainId: params.chainId,\n message: `Block not found: ${cause}`,\n }),\n try: () => {\n if (params.blockNumber !== undefined) {\n return client.getBlock({\n blockNumber: params.blockNumber,\n includeTransactions: params.includeTransactions ?? false,\n });\n }\n return client.getBlock({\n blockTag: params.blockTag ?? \"latest\",\n includeTransactions: params.includeTransactions ?? false,\n });\n },\n });\n\n return block;\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_GET, {\n attributes: {\n blockNumber: params.blockNumber?.toString(),\n blockTag: params.blockTag,\n chainId: params.chainId,\n includeTransactions: params.includeTransactions,\n },\n })\n ),\n\n getBlockByHash: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n const block = yield* Effect.tryPromise({\n catch: (cause) =>\n new BlockNotFoundError({\n blockIdentifier: params.hash,\n chainId: params.chainId,\n message: `Block not found by hash: ${cause}`,\n }),\n try: () =>\n client.getBlock({\n blockHash: params.hash,\n includeTransactions: params.includeTransactions ?? false,\n }),\n });\n\n return block;\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_GET_BY_HASH, {\n attributes: {\n chainId: params.chainId,\n hash: params.hash,\n includeTransactions: params.includeTransactions,\n },\n })\n ),\n\n getBlockNumber: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n return yield* Effect.tryPromise({\n catch: (cause) =>\n new TransportError({\n cause,\n message: `Failed to get current block number (chainId=${params.chainId})`,\n url: client.transport.url ?? \"unknown\",\n }),\n try: () => client.getBlockNumber(),\n });\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_GET_NUMBER, {\n attributes: {\n chainId: params.chainId,\n },\n })\n ),\n\n getBlocks: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n const blocks: Block[] = [];\n\n for (let i = params.fromBlock; i <= params.toBlock; i++) {\n const block = yield* Effect.tryPromise({\n catch: (cause) =>\n new BlockNotFoundError({\n blockIdentifier: i.toString(),\n chainId: params.chainId,\n message: `Block ${i} not found: ${cause}`,\n }),\n try: () =>\n client.getBlock({\n blockNumber: i,\n includeTransactions: params.includeTransactions ?? false,\n }),\n });\n\n blocks.push(block);\n }\n\n return blocks;\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_GET_RANGE, {\n attributes: {\n chainId: params.chainId,\n fromBlock: params.fromBlock.toString(),\n includeTransactions: params.includeTransactions,\n toBlock: params.toBlock.toString(),\n },\n })\n ),\n\n getBlockTimestamp: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n const block = yield* Effect.tryPromise({\n catch: (cause) =>\n new BlockNotFoundError({\n blockIdentifier: params.blockNumber?.toString() ?? \"latest\",\n chainId: params.chainId,\n message: `Block not found: ${cause}`,\n }),\n try: () => {\n if (params.blockNumber !== undefined) {\n return client.getBlock({\n blockNumber: params.blockNumber,\n });\n }\n return client.getBlock({\n blockTag: \"latest\",\n });\n },\n });\n\n return block.timestamp;\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_GET_TIMESTAMP, {\n attributes: {\n blockNumber: params.blockNumber?.toString(),\n chainId: params.chainId,\n },\n })\n ),\n\n waitForBlock: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n const timeout = params.timeout ?? DEFAULT_BLOCK_WAIT_TIMEOUT;\n\n const poll = Effect.gen(function* () {\n while (true) {\n const currentBlock = yield* Effect.tryPromise({\n catch: (cause) =>\n new TransportError({\n cause,\n message: `Failed to get current block number (chainId=${params.chainId})`,\n url: client.transport.url ?? \"unknown\",\n }),\n try: () => client.getBlockNumber(),\n });\n\n if (currentBlock >= params.blockNumber) {\n return yield* Effect.tryPromise({\n catch: (cause) =>\n new BlockNotFoundError({\n blockIdentifier: params.blockNumber.toString(),\n chainId: params.chainId,\n message: `Failed to fetch block ${params.blockNumber}: ${String(cause)}`,\n }),\n try: () =>\n client.getBlock({\n blockNumber: params.blockNumber,\n }),\n });\n }\n\n yield* Effect.sleep(1000);\n }\n });\n\n return yield* poll.pipe(\n Effect.timeoutFail({\n duration: timeout,\n onTimeout: () =>\n new BlockTimeoutError({\n blockNumber: params.blockNumber,\n chainId: params.chainId,\n message: `Timeout waiting for block ${params.blockNumber}`,\n timeout,\n }),\n })\n );\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_WAIT, {\n attributes: {\n blockNumber: params.blockNumber.toString(),\n chainId: params.chainId,\n timeout: params.timeout,\n },\n })\n ),\n\n watchBlocks: (params) =>\n Effect.gen(function* () {\n const client = yield* publicClientService.get(params.chainId);\n\n return fromWatchCallback<Block, unknown>({\n mapError: (error) => error as unknown,\n watch: (cb) =>\n client.watchBlocks({\n includeTransactions: params.includeTransactions ?? false,\n onBlock: cb.onData,\n onError: cb.onError,\n pollingInterval: params.pollingInterval,\n }),\n });\n }).pipe(\n Effect.withSpan(SpanNames.BLOCK_WATCH, {\n attributes: {\n chainId: params.chainId,\n includeTransactions: params.includeTransactions,\n pollingInterval: params.pollingInterval,\n },\n })\n ),\n });\n })\n);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.test.integration.d.ts","sourceRoot":"","sources":["../../src/block/service.test.integration.ts"],"names":[],"mappings":""}
|