@prb/effect-evm 1.0.0-beta.1 → 1.0.0-beta.3
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/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.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.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.js.map +1 -1
- package/dist/contract/pipeline/live.js.map +1 -1
- package/dist/contract/pipeline/service.js.map +1 -1
- package/dist/contract/pipeline/types.js.map +1 -1
- package/dist/contract/pipeline/write-and-track.js.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.js.map +1 -1
- package/dist/core/errors/viem-mapper.d.ts.map +1 -1
- package/dist/core/errors/viem-mapper.js +11 -2
- 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.js.map +1 -1
- package/dist/eip7702/erc7579.js.map +1 -1
- package/dist/eip7702/errors.js.map +1 -1
- package/dist/eip7702/index.js.map +1 -1
- package/dist/eip7702/service.js.map +1 -1
- 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.js.map +1 -1
- package/dist/gas/index.js.map +1 -1
- 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 +128 -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.js.map +1 -1
- package/dist/react-hooks/use-is-safe-multisig.js.map +1 -1
- package/dist/react-hooks/use-safe-context.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/safe/adapter.js.map +1 -1
- package/dist/safe/detection.js.map +1 -1
- package/dist/safe/detection.test.integration.d.ts +2 -0
- package/dist/safe/detection.test.integration.d.ts.map +1 -0
- package/dist/safe/detection.test.integration.js +92 -0
- package/dist/safe/detection.test.integration.js.map +1 -0
- package/dist/safe/errors.js.map +1 -1
- package/dist/safe/index.js.map +1 -1
- package/dist/safe/live.js.map +1 -1
- package/dist/safe/service.js.map +1 -1
- package/dist/safe/service.test.integration.d.ts +2 -0
- package/dist/safe/service.test.integration.d.ts.map +1 -0
- package/dist/safe/service.test.integration.js +173 -0
- package/dist/safe/service.test.integration.js.map +1 -0
- package/dist/safe/simulation/abis.js.map +1 -1
- package/dist/safe/simulation/addresses.js.map +1 -1
- package/dist/safe/simulation/encoding.js.map +1 -1
- package/dist/safe/simulation/errors.d.ts +3 -3
- package/dist/safe/simulation/errors.js +1 -1
- package/dist/safe/simulation/errors.js.map +1 -1
- package/dist/safe/simulation/index.d.ts +1 -1
- package/dist/safe/simulation/index.js +1 -1
- package/dist/safe/simulation/index.js.map +1 -1
- package/dist/safe/simulation/service.d.ts +2 -2
- package/dist/safe/simulation/service.js +2 -2
- package/dist/safe/simulation/service.js.map +1 -1
- package/dist/safe/simulation/types.js.map +1 -1
- package/dist/safe/types.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.js.map +1 -1
- 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.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.js.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.js.map +1 -1
- package/dist/tx/fees.js.map +1 -1
- package/dist/tx/index.js.map +1 -1
- 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 +157 -0
- package/dist/tx/manager.test.integration.js.map +1 -0
- package/dist/tx/policy.js.map +1 -1
- package/dist/tx/replacement.js.map +1 -1
- 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.js.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.js.map +1 -1
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/lifecycle.js.map +1 -1
- package/dist/wallet/operations.js.map +1 -1
- package/dist/wallet/provider-ref.js.map +1 -1
- package/dist/wallet/service.js.map +1 -1
- package/dist/wallet/types.js.map +1 -1
- package/package.json +25 -9
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { describe, expect, it } from "@effect/vitest";
|
|
2
|
+
import { Cause, Effect, Exit, Fiber, TestClock } from "effect";
|
|
3
|
+
import { mainnet } from "viem/chains";
|
|
4
|
+
import { BlockNotFoundError, BlockService, BlockTimeoutError } from "../block/index.js";
|
|
5
|
+
import { ClientNotFoundError, TransportError } from "../core/index.js";
|
|
6
|
+
import { makeEffectEvmTestLayer } from "../testing-kit/index.js";
|
|
7
|
+
const DEFAULT_HASH = "0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
|
|
8
|
+
const DEFAULT_BLOCK = {
|
|
9
|
+
baseFeePerGas: 30000000000n,
|
|
10
|
+
blobGasUsed: 0n,
|
|
11
|
+
difficulty: 0n,
|
|
12
|
+
excessBlobGas: 0n,
|
|
13
|
+
extraData: "0x",
|
|
14
|
+
gasLimit: 30000000n,
|
|
15
|
+
gasUsed: 12000000n,
|
|
16
|
+
hash: DEFAULT_HASH,
|
|
17
|
+
logsBloom: "0x00",
|
|
18
|
+
miner: "0x0000000000000000000000000000000000000000",
|
|
19
|
+
mixHash: DEFAULT_HASH,
|
|
20
|
+
nonce: "0x0000000000000000",
|
|
21
|
+
number: 1000n,
|
|
22
|
+
parentHash: DEFAULT_HASH,
|
|
23
|
+
receiptsRoot: DEFAULT_HASH,
|
|
24
|
+
sealFields: [],
|
|
25
|
+
sha3Uncles: DEFAULT_HASH,
|
|
26
|
+
size: 1024n,
|
|
27
|
+
stateRoot: DEFAULT_HASH,
|
|
28
|
+
timestamp: 1700000000n,
|
|
29
|
+
totalDifficulty: 0n,
|
|
30
|
+
transactions: [],
|
|
31
|
+
transactionsRoot: DEFAULT_HASH,
|
|
32
|
+
uncles: [],
|
|
33
|
+
};
|
|
34
|
+
describe("BlockService (Live)", () => {
|
|
35
|
+
const testLayer = makeEffectEvmTestLayer({
|
|
36
|
+
publicClient: {
|
|
37
|
+
getBlock: (params) => {
|
|
38
|
+
const p = params;
|
|
39
|
+
return Promise.resolve({
|
|
40
|
+
...DEFAULT_BLOCK,
|
|
41
|
+
hash: p.blockHash ?? DEFAULT_BLOCK.hash,
|
|
42
|
+
number: p.blockNumber ?? DEFAULT_BLOCK.number,
|
|
43
|
+
});
|
|
44
|
+
},
|
|
45
|
+
getBlockNumber: () => Promise.resolve(1000n),
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
describe("getBlockNumber", () => {
|
|
49
|
+
it.effect("returns current block number", () => Effect.gen(function* () {
|
|
50
|
+
const service = yield* BlockService;
|
|
51
|
+
const result = yield* service.getBlockNumber({ chainId: mainnet.id });
|
|
52
|
+
expect(result).toBe(1000n);
|
|
53
|
+
}).pipe(Effect.provide(testLayer)));
|
|
54
|
+
it.effect("fails with ClientNotFoundError for unsupported chainId", () => Effect.gen(function* () {
|
|
55
|
+
const service = yield* BlockService;
|
|
56
|
+
const exit = yield* Effect.exit(service.getBlockNumber({ chainId: 999 }));
|
|
57
|
+
expect(Exit.isFailure(exit)).toBe(true);
|
|
58
|
+
if (Exit.isFailure(exit)) {
|
|
59
|
+
const error = Cause.failureOption(exit.cause);
|
|
60
|
+
if (error._tag === "Some") {
|
|
61
|
+
expect(error.value).toBeInstanceOf(ClientNotFoundError);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}).pipe(Effect.provide(testLayer)));
|
|
65
|
+
it.effect("fails with TransportError (not timeout) on RPC error", () => {
|
|
66
|
+
const failingLayer = makeEffectEvmTestLayer({
|
|
67
|
+
publicClient: {
|
|
68
|
+
getBlockNumber: () => Promise.reject(new Error("boom")),
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
return Effect.gen(function* () {
|
|
72
|
+
const service = yield* BlockService;
|
|
73
|
+
const exit = yield* service.getBlockNumber({ chainId: mainnet.id }).pipe(Effect.exit);
|
|
74
|
+
expect(Exit.isFailure(exit)).toBe(true);
|
|
75
|
+
if (Exit.isFailure(exit)) {
|
|
76
|
+
const error = Cause.failureOption(exit.cause);
|
|
77
|
+
expect(error._tag).toBe("Some");
|
|
78
|
+
if (error._tag === "Some") {
|
|
79
|
+
expect(error.value).toBeInstanceOf(TransportError);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}).pipe(Effect.provide(failingLayer));
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe("getBlock / getBlockByHash / getBlocks", () => {
|
|
86
|
+
it.effect("returns block by number", () => Effect.gen(function* () {
|
|
87
|
+
const service = yield* BlockService;
|
|
88
|
+
const result = yield* service.getBlock({
|
|
89
|
+
blockNumber: 123n,
|
|
90
|
+
chainId: mainnet.id,
|
|
91
|
+
});
|
|
92
|
+
expect(result.number).toBe(123n);
|
|
93
|
+
}).pipe(Effect.provide(testLayer)));
|
|
94
|
+
it.effect("returns block by tag", () => Effect.gen(function* () {
|
|
95
|
+
const service = yield* BlockService;
|
|
96
|
+
const result = yield* service.getBlock({
|
|
97
|
+
blockTag: "latest",
|
|
98
|
+
chainId: mainnet.id,
|
|
99
|
+
});
|
|
100
|
+
expect(result.hash).toBeDefined();
|
|
101
|
+
}).pipe(Effect.provide(testLayer)));
|
|
102
|
+
it.effect("returns block by hash", () => Effect.gen(function* () {
|
|
103
|
+
const service = yield* BlockService;
|
|
104
|
+
const result = yield* service.getBlockByHash({
|
|
105
|
+
chainId: mainnet.id,
|
|
106
|
+
hash: DEFAULT_HASH,
|
|
107
|
+
});
|
|
108
|
+
expect(result.hash).toBe(DEFAULT_HASH);
|
|
109
|
+
}).pipe(Effect.provide(testLayer)));
|
|
110
|
+
it.effect("returns range of blocks", () => Effect.gen(function* () {
|
|
111
|
+
const service = yield* BlockService;
|
|
112
|
+
const result = yield* service.getBlocks({
|
|
113
|
+
chainId: mainnet.id,
|
|
114
|
+
fromBlock: 10n,
|
|
115
|
+
toBlock: 12n,
|
|
116
|
+
});
|
|
117
|
+
expect(result.map((b) => b.number)).toEqual([10n, 11n, 12n]);
|
|
118
|
+
}).pipe(Effect.provide(testLayer)));
|
|
119
|
+
});
|
|
120
|
+
describe("waitForBlock", () => {
|
|
121
|
+
it.effect("times out with BlockTimeoutError (not misclassified)", () => {
|
|
122
|
+
const current = 0n;
|
|
123
|
+
const layer = makeEffectEvmTestLayer({
|
|
124
|
+
publicClient: {
|
|
125
|
+
getBlockNumber: () => Promise.resolve(current),
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
return Effect.gen(function* () {
|
|
129
|
+
const service = yield* BlockService;
|
|
130
|
+
const fiber = yield* Effect.fork(service.waitForBlock({
|
|
131
|
+
blockNumber: 10n,
|
|
132
|
+
chainId: mainnet.id,
|
|
133
|
+
timeout: 2500,
|
|
134
|
+
}));
|
|
135
|
+
yield* TestClock.adjust("3 seconds");
|
|
136
|
+
const exit = yield* Fiber.await(fiber);
|
|
137
|
+
expect(Exit.isFailure(exit)).toBe(true);
|
|
138
|
+
if (Exit.isFailure(exit)) {
|
|
139
|
+
const error = Cause.failureOption(exit.cause);
|
|
140
|
+
expect(error._tag).toBe("Some");
|
|
141
|
+
if (error._tag === "Some") {
|
|
142
|
+
expect(error.value).toBeInstanceOf(BlockTimeoutError);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}).pipe(Effect.provide(layer));
|
|
146
|
+
});
|
|
147
|
+
it.effect("is interruptible", () => {
|
|
148
|
+
const current = 0n;
|
|
149
|
+
const layer = makeEffectEvmTestLayer({
|
|
150
|
+
publicClient: {
|
|
151
|
+
getBlockNumber: () => Promise.resolve(current),
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
return Effect.gen(function* () {
|
|
155
|
+
const service = yield* BlockService;
|
|
156
|
+
const fiber = yield* Effect.fork(service.waitForBlock({
|
|
157
|
+
blockNumber: 10n,
|
|
158
|
+
chainId: mainnet.id,
|
|
159
|
+
timeout: 60_000,
|
|
160
|
+
}));
|
|
161
|
+
yield* Fiber.interrupt(fiber);
|
|
162
|
+
const exit = yield* Fiber.await(fiber);
|
|
163
|
+
expect(Exit.isInterrupted(exit)).toBe(true);
|
|
164
|
+
}).pipe(Effect.provide(layer));
|
|
165
|
+
});
|
|
166
|
+
it.effect("returns BlockNotFoundError when block fetch fails", () => {
|
|
167
|
+
const layer = makeEffectEvmTestLayer({
|
|
168
|
+
publicClient: {
|
|
169
|
+
getBlock: () => Promise.reject(new Error("missing")),
|
|
170
|
+
getBlockNumber: () => Promise.resolve(10n),
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
return Effect.gen(function* () {
|
|
174
|
+
const service = yield* BlockService;
|
|
175
|
+
const exit = yield* service
|
|
176
|
+
.waitForBlock({ blockNumber: 10n, chainId: mainnet.id })
|
|
177
|
+
.pipe(Effect.exit);
|
|
178
|
+
expect(Exit.isFailure(exit)).toBe(true);
|
|
179
|
+
if (Exit.isFailure(exit)) {
|
|
180
|
+
const error = Cause.failureOption(exit.cause);
|
|
181
|
+
expect(error._tag).toBe("Some");
|
|
182
|
+
if (error._tag === "Some") {
|
|
183
|
+
expect(error.value).toBeInstanceOf(BlockNotFoundError);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}).pipe(Effect.provide(layer));
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
//# sourceMappingURL=service.test.integration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.test.integration.js","sourceRoot":"","sources":["../../src/block/service.test.integration.ts"],"names":[],"mappings":"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","sourcesContent":["import { describe, expect, it } from \"@effect/vitest\";\nimport { Cause, Effect, Exit, Fiber, TestClock } from \"effect\";\nimport type { Block, Hash } from \"viem\";\nimport { mainnet } from \"viem/chains\";\nimport { BlockNotFoundError, BlockService, BlockTimeoutError } from \"@/src/block/index.js\";\nimport { ClientNotFoundError, TransportError } from \"@/src/core/index.js\";\nimport { makeEffectEvmTestLayer } from \"@/src/testing-kit/index.js\";\n\nconst DEFAULT_HASH = \"0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef\" as Hash;\n\nconst DEFAULT_BLOCK: Block = {\n baseFeePerGas: 30000000000n,\n blobGasUsed: 0n,\n difficulty: 0n,\n excessBlobGas: 0n,\n extraData: \"0x\",\n gasLimit: 30000000n,\n gasUsed: 12000000n,\n hash: DEFAULT_HASH,\n logsBloom: \"0x00\",\n miner: \"0x0000000000000000000000000000000000000000\",\n mixHash: DEFAULT_HASH,\n nonce: \"0x0000000000000000\",\n number: 1000n,\n parentHash: DEFAULT_HASH,\n receiptsRoot: DEFAULT_HASH,\n sealFields: [],\n sha3Uncles: DEFAULT_HASH,\n size: 1024n,\n stateRoot: DEFAULT_HASH,\n timestamp: 1700000000n,\n totalDifficulty: 0n,\n transactions: [],\n transactionsRoot: DEFAULT_HASH,\n uncles: [],\n};\n\ndescribe(\"BlockService (Live)\", () => {\n const testLayer = makeEffectEvmTestLayer({\n publicClient: {\n getBlock: (params: unknown) => {\n const p = params as { blockNumber?: bigint; blockHash?: Hash };\n return Promise.resolve({\n ...DEFAULT_BLOCK,\n hash: p.blockHash ?? DEFAULT_BLOCK.hash,\n number: p.blockNumber ?? DEFAULT_BLOCK.number,\n });\n },\n getBlockNumber: () => Promise.resolve(1000n),\n },\n });\n\n describe(\"getBlockNumber\", () => {\n it.effect(\"returns current block number\", () =>\n Effect.gen(function* () {\n const service = yield* BlockService;\n const result = yield* service.getBlockNumber({ chainId: mainnet.id });\n\n expect(result).toBe(1000n);\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"fails with ClientNotFoundError for unsupported chainId\", () =>\n Effect.gen(function* () {\n const service = yield* BlockService;\n const exit = yield* Effect.exit(service.getBlockNumber({ chainId: 999 }));\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 it.effect(\"fails with TransportError (not timeout) on RPC error\", () => {\n const failingLayer = makeEffectEvmTestLayer({\n publicClient: {\n getBlockNumber: () => Promise.reject(new Error(\"boom\")),\n },\n });\n\n return Effect.gen(function* () {\n const service = yield* BlockService;\n const exit = yield* service.getBlockNumber({ chainId: mainnet.id }).pipe(Effect.exit);\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\n describe(\"getBlock / getBlockByHash / getBlocks\", () => {\n it.effect(\"returns block by number\", () =>\n Effect.gen(function* () {\n const service = yield* BlockService;\n const result = yield* service.getBlock({\n blockNumber: 123n,\n chainId: mainnet.id,\n });\n\n expect(result.number).toBe(123n);\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"returns block by tag\", () =>\n Effect.gen(function* () {\n const service = yield* BlockService;\n const result = yield* service.getBlock({\n blockTag: \"latest\",\n chainId: mainnet.id,\n });\n\n expect(result.hash).toBeDefined();\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"returns block by hash\", () =>\n Effect.gen(function* () {\n const service = yield* BlockService;\n const result = yield* service.getBlockByHash({\n chainId: mainnet.id,\n hash: DEFAULT_HASH,\n });\n\n expect(result.hash).toBe(DEFAULT_HASH);\n }).pipe(Effect.provide(testLayer))\n );\n\n it.effect(\"returns range of blocks\", () =>\n Effect.gen(function* () {\n const service = yield* BlockService;\n const result = yield* service.getBlocks({\n chainId: mainnet.id,\n fromBlock: 10n,\n toBlock: 12n,\n });\n\n expect(result.map((b) => b.number)).toEqual([10n, 11n, 12n]);\n }).pipe(Effect.provide(testLayer))\n );\n });\n\n describe(\"waitForBlock\", () => {\n it.effect(\"times out with BlockTimeoutError (not misclassified)\", () => {\n const current = 0n;\n const layer = makeEffectEvmTestLayer({\n publicClient: {\n getBlockNumber: () => Promise.resolve(current),\n },\n });\n\n return Effect.gen(function* () {\n const service = yield* BlockService;\n const fiber = yield* Effect.fork(\n service.waitForBlock({\n blockNumber: 10n,\n chainId: mainnet.id,\n timeout: 2500,\n })\n );\n\n yield* TestClock.adjust(\"3 seconds\");\n\n const exit = yield* Fiber.await(fiber);\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(BlockTimeoutError);\n }\n }\n }).pipe(Effect.provide(layer));\n });\n\n it.effect(\"is interruptible\", () => {\n const current = 0n;\n const layer = makeEffectEvmTestLayer({\n publicClient: {\n getBlockNumber: () => Promise.resolve(current),\n },\n });\n\n return Effect.gen(function* () {\n const service = yield* BlockService;\n const fiber = yield* Effect.fork(\n service.waitForBlock({\n blockNumber: 10n,\n chainId: mainnet.id,\n timeout: 60_000,\n })\n );\n\n yield* Fiber.interrupt(fiber);\n const exit = yield* Fiber.await(fiber);\n expect(Exit.isInterrupted(exit)).toBe(true);\n }).pipe(Effect.provide(layer));\n });\n\n it.effect(\"returns BlockNotFoundError when block fetch fails\", () => {\n const layer = makeEffectEvmTestLayer({\n publicClient: {\n getBlock: () => Promise.reject(new Error(\"missing\")),\n getBlockNumber: () => Promise.resolve(10n),\n },\n });\n\n return Effect.gen(function* () {\n const service = yield* BlockService;\n const exit = yield* service\n .waitForBlock({ blockNumber: 10n, chainId: mainnet.id })\n .pipe(Effect.exit);\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(BlockNotFoundError);\n }\n }\n }).pipe(Effect.provide(layer));\n });\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAOlC,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAMhD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAOjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAGjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAGtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAGvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAGnE,MAAM,CAAC,MAAM,0BAA0B,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAG1E,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAGvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAGnE,MAAM,CAAC,MAAM,+BAA+B,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAG/E,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CAAC;AAOvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAGjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAGrE,MAAM,CAAC,MAAM,4BAA4B,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAG3E,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/constants/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAOlC,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAMhD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AAOjC,MAAM,CAAC,MAAM,iBAAiB,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAGjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAGtE,MAAM,CAAC,MAAM,uBAAuB,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAGvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAGnE,MAAM,CAAC,MAAM,0BAA0B,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAG1E,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAGvE,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAGnE,MAAM,CAAC,MAAM,+BAA+B,GAAG,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;AAG/E,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CAAC;AAOvD,MAAM,CAAC,MAAM,kBAAkB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAGjE,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAGrE,MAAM,CAAC,MAAM,4BAA4B,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AAG3E,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC","sourcesContent":["/**\n * Shared constants used across the codebase.\n */\n\nimport { Duration } from \"effect\";\n\n// =============================================================================\n// Gas Constants\n// =============================================================================\n\n/** Default multiplier for estimated gas limits (10% safety margin). */\nexport const DEFAULT_GAS_LIMIT_MULTIPLIER = 1.1;\n\n/**\n * Minimum gas required for a basic Ethereum transaction (21,000 gas units).\n * @see https://ethereum.stackexchange.com/q/34674/24693\n */\nexport const MIN_TX_GAS = 21000n;\n\n// =============================================================================\n// Timing Constants (milliseconds)\n// =============================================================================\n\n/** Default maximum delay for circuit breakers and subscriptions. */\nexport const DEFAULT_MAX_DELAY = Duration.toMillis(\"30 seconds\");\n\n/** Default timeout for waiting on a transaction receipt. */\nexport const DEFAULT_RECEIPT_TIMEOUT = Duration.toMillis(\"2 minutes\");\n\n/** Default timeout for RPC requests. */\nexport const DEFAULT_REQUEST_TIMEOUT = Duration.toMillis(\"10 seconds\");\n\n/** Default time before a transaction is considered stuck. */\nexport const DEFAULT_STUCK_TX_MS = Duration.toMillis(\"45 seconds\");\n\n/** Default timeout for waiting on a specific block. */\nexport const DEFAULT_BLOCK_WAIT_TIMEOUT = Duration.toMillis(\"60 seconds\");\n\n/** Default polling interval for transaction receipt and confirmation checks. */\nexport const DEFAULT_POLLING_INTERVAL = Duration.toMillis(\"4 seconds\");\n\n/** Default delay between RPC retries. */\nexport const DEFAULT_RETRY_DELAY = Duration.toMillis(\"150 millis\");\n\n/** Default base delay for subscription exponential backoff. */\nexport const DEFAULT_SUBSCRIPTION_BASE_DELAY = Duration.toMillis(\"500 millis\");\n\n/** Default debounce delay for cursor store flush operations. */\nexport const DEFAULT_CURSOR_FLUSH_DELAY = \"250 millis\";\n\n// =============================================================================\n// Safe Apps Constants\n// =============================================================================\n\n/** Default poll interval for Safe gateway status checks. */\nexport const SAFE_POLL_INTERVAL = Duration.toMillis(\"3 seconds\");\n\n/** Default timeout for Safe transaction execution. */\nexport const SAFE_EXECUTION_TIMEOUT = Duration.toMillis(\"5 minutes\");\n\n/** Default poll interval for off-chain signature checks. */\nexport const SAFE_SIGNATURE_POLL_INTERVAL = Duration.toMillis(\"2 seconds\");\n\n/** Default timeout for off-chain signature availability. */\nexport const SAFE_SIGNATURE_TIMEOUT = Duration.toMillis(\"2 minutes\");\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cross-chain-reader.js","sourceRoot":"","sources":["../../src/contract/cross-chain-reader.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cross-chain-reader.js","sourceRoot":"","sources":["../../src/contract/cross-chain-reader.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Effect, Layer } from \"effect\";\nimport type { Abi, Address, ContractFunctionArgs } from \"viem\";\nimport type { ClientNotFoundError, ContractReadError, MulticallError } from \"@/src/core/index.js\";\nimport { SpanNames } from \"@/src/telemetry/index.js\";\nimport type {\n ContractFunctionName,\n ContractFunctionReturnType,\n MulticallCall,\n MulticallResult,\n ReadParams,\n} from \"@/src/types/index.js\";\nimport { ContractReader } from \"./reader.js\";\n\ntype ArgsField<TArgs> = {\n readonly args?: TArgs | undefined;\n} & (readonly [] extends TArgs ? unknown : { readonly args: TArgs });\n\nexport type CrossChainCall<\n TAbi extends Abi = Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\"> = ContractFunctionName<\n TAbi,\n \"pure\" | \"view\"\n >,\n> = {\n readonly abi: TAbi;\n readonly address: Address;\n readonly chainId: number;\n readonly functionName: TFunctionName;\n} & ArgsField<ContractFunctionArgs<TAbi, \"pure\" | \"view\", TFunctionName>>;\n\nexport type ReadSameParams<\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n> = {\n readonly abi: TAbi;\n readonly address: Address;\n readonly chainIds: readonly number[];\n readonly functionName: TFunctionName;\n} & ArgsField<ContractFunctionArgs<TAbi, \"pure\" | \"view\", TFunctionName>>;\n\nexport type ChainMulticallBatch = {\n readonly chainId: number;\n readonly calls: readonly MulticallCall[];\n};\n\nexport type CrossChainReaderShape = {\n /**\n * Execute reads across multiple chains in parallel.\n * Groups calls by chainId internally for efficiency.\n */\n readonly readAll: <const TCalls extends readonly CrossChainCall[]>(\n calls: TCalls\n ) => Effect.Effect<Map<number, unknown[]>, ContractReadError | ClientNotFoundError>;\n\n /**\n * Execute the same read on multiple chains (e.g., check balance on all chains)\n */\n readonly readSame: <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n >(\n params: ReadSameParams<TAbi, TFunctionName>\n ) => Effect.Effect<\n Map<number, ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName>>,\n ContractReadError | ClientNotFoundError\n >;\n\n /**\n * Execute multicall on each chain in parallel, then merge results\n */\n readonly multicallAll: <const TBatches extends readonly ChainMulticallBatch[]>(\n batches: TBatches\n ) => Effect.Effect<\n Map<number, readonly MulticallResult<unknown>[]>,\n MulticallError | ClientNotFoundError\n >;\n};\n\nexport class CrossChainReader extends Context.Tag(\"ew3/CrossChainReader\")<\n CrossChainReader,\n CrossChainReaderShape\n>() {}\n\n/**\n * Helper function to group items by a key\n */\nconst groupBy = <T, K extends string | number>(\n arr: readonly T[],\n keyFn: (item: T) => K\n): Map<K, T[]> => {\n const result = new Map<K, T[]>();\n for (const item of arr) {\n const key = keyFn(item);\n const group = result.get(key) ?? [];\n group.push(item);\n result.set(key, group);\n }\n return result;\n};\n\n/**\n * Live implementation of CrossChainReader service\n */\nexport const CrossChainReaderLive = Layer.effect(\n CrossChainReader,\n Effect.gen(function* () {\n const reader = yield* ContractReader;\n\n return CrossChainReader.of({\n multicallAll: <const TBatches extends readonly ChainMulticallBatch[]>(batches: TBatches) =>\n Effect.gen(function* () {\n // Execute multicalls for each chain in parallel\n const results = yield* Effect.all(\n batches.map((batch) =>\n reader.multicall(batch.chainId, batch.calls).pipe(\n Effect.map((result) => ({\n chainId: batch.chainId,\n result,\n }))\n )\n ),\n { concurrency: \"unbounded\" }\n );\n\n // Collect results into a Map by chainId\n const resultMap = new Map<number, readonly MulticallResult<unknown>[]>();\n for (const { chainId, result } of results) {\n resultMap.set(chainId, result);\n }\n\n return resultMap;\n }).pipe(\n Effect.withSpan(SpanNames.CROSS_CHAIN_MULTICALL_ALL, {\n attributes: {\n batchCount: batches.length,\n chainIds: batches.map((b) => b.chainId),\n },\n })\n ),\n\n readAll: <const TCalls extends readonly CrossChainCall[]>(calls: TCalls) =>\n Effect.gen(function* () {\n // Group calls by chainId\n const groupedCalls = groupBy(calls, (call) => call.chainId);\n\n // Execute reads for each chain in parallel\n const results = yield* Effect.all(\n Array.from(groupedCalls.entries()).map(([chainId, chainCalls]) =>\n Effect.all(\n chainCalls.map((call) => reader.read(call)),\n { concurrency: \"unbounded\" }\n ).pipe(\n Effect.map((chainResults) => ({\n chainId,\n results: chainResults,\n }))\n )\n ),\n { concurrency: \"unbounded\" }\n );\n\n // Collect results into a Map by chainId\n const resultMap = new Map<number, unknown[]>();\n for (const { chainId, results: chainResults } of results) {\n resultMap.set(chainId, chainResults);\n }\n\n return resultMap;\n }).pipe(\n Effect.withSpan(SpanNames.CROSS_CHAIN_READ_ALL, {\n attributes: {\n callCount: calls.length,\n chainIds: Array.from(new Set(calls.map((c) => c.chainId))),\n },\n })\n ),\n\n readSame: <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n >(\n params: ReadSameParams<TAbi, TFunctionName>\n ) =>\n Effect.gen(function* () {\n // Execute the same read on each chain in parallel\n const results = yield* Effect.all(\n params.chainIds.map((chainId) =>\n reader\n .read({\n abi: params.abi,\n address: params.address,\n args: params.args,\n chainId,\n functionName: params.functionName,\n } as ReadParams<TAbi, TFunctionName>)\n .pipe(\n Effect.map((result) => ({\n chainId,\n result: result as ContractFunctionReturnType<\n TAbi,\n \"pure\" | \"view\",\n TFunctionName\n >,\n }))\n )\n ),\n { concurrency: \"unbounded\" }\n );\n\n // Collect results into a Map by chainId\n const resultMap = new Map<\n number,\n ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName>\n >();\n for (const { chainId, result } of results) {\n resultMap.set(chainId, result);\n }\n\n return resultMap;\n }).pipe(\n Effect.withSpan(SpanNames.CROSS_CHAIN_READ_SAME, {\n attributes: {\n address: params.address,\n chainCount: params.chainIds.length,\n chainIds: params.chainIds,\n functionName: params.functionName,\n },\n })\n ),\n });\n })\n);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,qBAAqB,CAAC;AACpC,cAAc,aAAa,CAAC","sourcesContent":["export * from \"./cross-chain-reader.js\";\nexport * from \"./pipeline.js\";\nexport * from \"./reader.js\";\nexport * from \"./typed-contract.js\";\nexport * from \"./writer.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/contract/pipeline/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/contract/pipeline/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC","sourcesContent":["export * from \"./live.js\";\nexport * from \"./service.js\";\nexport * from \"./types.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../src/contract/pipeline/internal/core.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../../../../src/contract/pipeline/internal/core.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAsBhC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,mCAAmC,EAAE,MAAM,cAAc,CAAC;AAyCnE,MAAM,CAAC,MAAM,eAAe,GAAG,CAI7B,IAAsB,EACtB,MAAwC,EACxC,MAAgB,EAChB,QAAuB,EAAE,EACiD,EAAE,CAC5E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAC1E,MAAM,YAAY,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,MAAM,EAAE,CAAC;IAGrD,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC,UAAU,EAAE;QAC3D,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,YAAY;QACpB,aAAa,EAAE,MAAM,CAAC,SAAS;KAChC,CAAC,CAAC;IAGH,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;QACvB,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAC/D,MAAM,EACN,MAAM,EACN,aAAa,EACb,YAAY,CACb,CAAC;IAGF,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;IAC9C,MAAM,gBAAgB,GAAG,KAAK,CAAC,CAAC,oBAAoB,CAAC,YAAY,EAAE;QACjE,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,aAAa;KACd,CAAC,CAAC;IAEH,MAAM,cAAc,GAAG;QACrB,GAAG,gBAAgB;QACnB,KAAK,EAAE,gBAAgB,CAAC,KAAK;KAC9B,CAAC;IAEF,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC;IAGD,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpB,KAAK,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC,CAAC;IAC3E,KAAK,CAAC,CAAC,gBAAgB,CAAC,aAAa,CAAC;IAEtC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QACtB,KAAK,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAGD,MAAM,cAAc,GAAG,KAAK,CAAC,UAAU,CAAC;IACxC,MAAM,OAAO,GAAuB,KAAK,CAAC,CAAC,mCAAmC,CAAC,SAAS,EAAE;QACxF,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,IAAI;QACJ,UAAU,EAAE,cAAc;YACxB,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC;YACxE,CAAC,CAAC,SAAS;QACb,MAAM,EAAE,YAAY;KACrB,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,KAAK,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAGD,KAAK,CAAC,CAAC,YAAY,CAAC,YAAY,EAAE;QAChC,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,gBAAgB,CAAC,KAAK;QAC7B,QAAQ,EAAE,gBAAgB,CAAC,QAAQ;KACpC,CAAC,CAAC;IAGH,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,aAAa,CAC9C,OAAO,EACP,MAAM,CAAC,GAAG,CACX,CAAwC,CAAC;IAE1C,OAAO;QACL,MAAM;QACN,IAAI,EAAE,OAAO,CAAC,eAAuB;QACrC,OAAO;KACqB,CAAC;AACjC,CAAC,CAAC,CAAC","sourcesContent":["import type { Scope } from \"effect\";\nimport { Effect } from \"effect\";\nimport type { Abi, Hash, TransactionReceipt } from \"viem\";\nimport type { ContractWriterShape } from \"@/src/contract/index.js\";\nimport type {\n ClientNotFoundError,\n ContractReadError,\n ContractWriteError,\n EventDecodeError,\n GasEstimationError,\n InsufficientFundsError,\n ReceiptTimeoutError,\n SimulationFailedError,\n TransactionFailedError,\n TransportError,\n UserRejectedError,\n WalletNotConnectedError,\n WrongNetworkError,\n} from \"@/src/core/index.js\";\nimport type { EventStreamShape } from \"@/src/events/index.js\";\nimport type { GasPriceUnavailableError, GasServiceShape } from \"@/src/gas/index.js\";\nimport type { NonceServiceShape } from \"@/src/nonce/index.js\";\nimport type { TxManagerShape, TxPolicy } from \"@/src/tx/index.js\";\nimport { defaultPolicy } from \"@/src/tx/index.js\";\nimport type { ContractFunctionName, WriteParams } from \"@/src/types/index.js\";\nimport type { PipelineHooks, WriteAndTrackResult } from \"../types.js\";\nimport { confirmNonce, withNonceReservation } from \"./nonce.js\";\nimport { deriveBaseOverrides, simulateAndEstimate } from \"./prepare.js\";\nimport { waitForReceiptFollowingReplacements } from \"./receipt.js\";\n\n/**\n * Dependencies required by the core pipeline\n */\nexport type CorePipelineDeps = {\n readonly writer: ContractWriterShape;\n readonly txManager: TxManagerShape;\n readonly eventStream: EventStreamShape;\n readonly nonceService: NonceServiceShape;\n readonly gasService: GasServiceShape;\n};\n\ntype CorePipelineError =\n | SimulationFailedError\n | ContractReadError\n | GasEstimationError\n | ContractWriteError\n | InsufficientFundsError\n | UserRejectedError\n | GasPriceUnavailableError\n | TransactionFailedError\n | ReceiptTimeoutError\n | ClientNotFoundError\n | TransportError\n | WalletNotConnectedError\n | WrongNetworkError\n | EventDecodeError;\n\n/**\n * Run the core write pipeline with hooks for tracking.\n *\n * Steps:\n * 1. Derive base overrides (tx type + fees)\n * 2. Simulate transaction\n * 3. Estimate gas\n * 4. Reserve nonce\n * 5. Write transaction\n * 6. Wait for receipt (following replacements)\n * 7. Decode events\n */\nexport const runCorePipeline = <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n>(\n deps: CorePipelineDeps,\n params: WriteParams<TAbi, TFunctionName>,\n policy: TxPolicy,\n hooks: PipelineHooks = {}\n): Effect.Effect<WriteAndTrackResult<TAbi>, CorePipelineError, Scope.Scope> =>\n Effect.gen(function* () {\n const { writer, txManager, eventStream, nonceService, gasService } = deps;\n const mergedPolicy = { ...defaultPolicy, ...policy };\n\n // Step 1: Derive base overrides\n const baseOverrides = yield* deriveBaseOverrides(gasService, {\n chainId: params.chainId,\n policy: mergedPolicy,\n userOverrides: params.overrides,\n });\n\n // Step 2 & 3: Simulate and estimate gas\n if (hooks.onSimulating) {\n yield* hooks.onSimulating();\n }\n\n const { finalGas, overridesWithGas } = yield* simulateAndEstimate(\n writer,\n params,\n baseOverrides,\n mergedPolicy\n );\n\n // Step 4: Reserve nonce\n const explicitNonce = params.overrides?.nonce;\n const nonceReservation = yield* withNonceReservation(nonceService, {\n account: params.account,\n chainId: params.chainId,\n explicitNonce,\n });\n\n const finalOverrides = {\n ...overridesWithGas,\n nonce: nonceReservation.nonce,\n };\n\n if (hooks.onEstimated) {\n yield* hooks.onEstimated(finalGas, nonceReservation.nonce);\n }\n\n // Step 5: Sign and write transaction\n if (hooks.onSigning) {\n yield* hooks.onSigning();\n }\n\n const hash = yield* writer.write({ ...params, overrides: finalOverrides });\n yield* nonceReservation.markSubmitted;\n\n if (hooks.onSubmitted) {\n yield* hooks.onSubmitted(hash);\n }\n\n // Step 6: Wait for receipt\n const onReplacedHook = hooks.onReplaced;\n const receipt: TransactionReceipt = yield* waitForReceiptFollowingReplacements(txManager, {\n chainId: params.chainId,\n hash,\n onReplaced: onReplacedHook\n ? (oldHash, newHash, reason) => onReplacedHook(oldHash, newHash, reason)\n : undefined,\n policy: mergedPolicy,\n });\n\n if (hooks.onMined) {\n yield* hooks.onMined(receipt);\n }\n\n // Confirm nonce after successful mining\n yield* confirmNonce(nonceService, {\n account: params.account,\n chainId: params.chainId,\n nonce: nonceReservation.nonce,\n reserved: nonceReservation.reserved,\n });\n\n // Step 7: Decode events\n const events = (yield* eventStream.decodeReceipt(\n receipt,\n params.abi\n )) as WriteAndTrackResult<TAbi>[\"events\"];\n\n return {\n events,\n hash: receipt.transactionHash as Hash,\n receipt,\n } as WriteAndTrackResult<TAbi>;\n });\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/contract/pipeline/internal/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAKlE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAsB,EAAU,EAAE,CAC9D,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAMpD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAW,EAAE,UAA8B,EAAU,EAAE;IAC7F,MAAM,CAAC,GAAG,UAAU,IAAI,4BAA4B,CAAC;IACrD,OAAO,MAAM,CAAC,SAAS,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;AACtE,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../src/contract/pipeline/internal/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAKlE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAsB,EAAU,EAAE,CAC9D,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAMpD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAW,EAAE,UAA8B,EAAU,EAAE;IAC7F,MAAM,CAAC,GAAG,UAAU,IAAI,4BAA4B,CAAC;IACrD,OAAO,MAAM,CAAC,SAAS,CAAC,uBAAuB,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;AACtE,CAAC,CAAC","sourcesContent":["import { Option } from \"effect\";\nimport { DEFAULT_GAS_LIMIT_MULTIPLIER } from \"@/src/constants/index.js\";\nimport { multiplyBigintByDecimal } from \"@/src/internal/index.js\";\n\n/**\n * Convert nonce to bigint regardless of input type\n */\nexport const nonceToBigInt = (nonce: number | bigint): bigint =>\n typeof nonce === \"bigint\" ? nonce : BigInt(nonce);\n\n/**\n * Apply gas limit multiplier with safety bounds\n * Returns original gas if multiplier is invalid or would overflow\n */\nexport const applyGasLimitMultiplier = (gas: bigint, multiplier: number | undefined): bigint => {\n const m = multiplier ?? DEFAULT_GAS_LIMIT_MULTIPLIER;\n return Option.getOrElse(multiplyBigintByDecimal(gas, m), () => gas);\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nonce.js","sourceRoot":"","sources":["../../../../src/contract/pipeline/internal/nonce.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAIrC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAa7C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,YAA+B,EAC/B,MAIC,EACyF,EAAE,CAC5F,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,iBAAiB,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEjD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAC9C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAW,CAAC;QACnE,CAAC;QAED,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;YAChD,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QAEH,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAW,CAAC;IAC3D,CAAC,CAAC,EACF,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CACtB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACpD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;YAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CACL,CAAC;IAEF,OAAO;QACL,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC;QAC/C,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,QAAQ,EAAE,WAAW,CAAC,QAAQ;KAC/B,CAAC;AACJ,CAAC,CAAC,CAAC;AAKL,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,YAA+B,EAC/B,MAKC,EACoB,EAAE,CACvB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"nonce.js","sourceRoot":"","sources":["../../../../src/contract/pipeline/internal/nonce.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAC;AAIrC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAa7C,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,YAA+B,EAC/B,MAIC,EACyF,EAAE,CAC5F,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,iBAAiB,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEjD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAC9C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAW,CAAC;QACnE,CAAC;QAED,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;YAChD,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QAEH,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAW,CAAC;IAC3D,CAAC,CAAC,EACF,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CACtB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACpD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO;QACT,CAAC;QAED,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;YAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC,CACL,CAAC;IAEF,OAAO;QACL,aAAa,EAAE,GAAG,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC;QAC/C,KAAK,EAAE,WAAW,CAAC,KAAK;QACxB,QAAQ,EAAE,WAAW,CAAC,QAAQ;KAC/B,CAAC;AACJ,CAAC,CAAC,CAAC;AAKL,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,YAA+B,EAC/B,MAKC,EACoB,EAAE,CACvB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,KAAK,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC;QAC1B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import type { Scope } from \"effect\";\nimport { Effect, Ref } from \"effect\";\nimport type { Address } from \"viem\";\nimport type { ClientNotFoundError, TransportError } from \"@/src/core/index.js\";\nimport type { NonceServiceShape } from \"@/src/nonce/index.js\";\nimport { nonceToBigInt } from \"./helpers.js\";\n\nexport type NonceReservationResult = {\n readonly nonce: number | bigint;\n readonly reserved: boolean;\n readonly markSubmitted: Effect.Effect<void>;\n};\n\n/**\n * Reserve a nonce with proper cleanup semantics.\n * If explicitNonce is provided, no reservation is made.\n * Otherwise, reserves from NonceService and releases on scope exit if not submitted.\n */\nexport const withNonceReservation = (\n nonceService: NonceServiceShape,\n params: {\n account: Address;\n chainId: number;\n explicitNonce: number | bigint | undefined;\n }\n): Effect.Effect<NonceReservationResult, ClientNotFoundError | TransportError, Scope.Scope> =>\n Effect.gen(function* () {\n const nonceSubmittedRef = yield* Ref.make(false);\n\n const reservation = yield* Effect.acquireRelease(\n Effect.gen(function* () {\n if (params.explicitNonce !== undefined) {\n return { nonce: params.explicitNonce, reserved: false } as const;\n }\n\n const reservedNonce = yield* nonceService.reserve({\n address: params.account,\n chainId: params.chainId,\n });\n\n return { nonce: reservedNonce, reserved: true } as const;\n }),\n ({ nonce, reserved }) =>\n Effect.gen(function* () {\n if (!reserved) {\n return;\n }\n const submitted = yield* Ref.get(nonceSubmittedRef);\n if (submitted) {\n return;\n }\n\n yield* nonceService.release({\n address: params.account,\n chainId: params.chainId,\n nonce: nonceToBigInt(nonce),\n });\n })\n );\n\n return {\n markSubmitted: Ref.set(nonceSubmittedRef, true),\n nonce: reservation.nonce,\n reserved: reservation.reserved,\n };\n });\n\n/**\n * Confirm a nonce after successful transaction\n */\nexport const confirmNonce = (\n nonceService: NonceServiceShape,\n params: {\n account: Address;\n chainId: number;\n nonce: number | bigint;\n reserved: boolean;\n }\n): Effect.Effect<void> =>\n Effect.gen(function* () {\n if (!params.reserved) {\n return;\n }\n\n yield* nonceService.confirm({\n address: params.account,\n chainId: params.chainId,\n nonce: nonceToBigInt(params.nonce),\n });\n });\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../../../src/contract/pipeline/internal/prepare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAYhC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAOrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAOvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,UAA2B,EAC3B,MAIC,EACoF,EAAE,CACvF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACnD;QACE,YAAY,CAAC;YACX,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAEtD,kBAAkB,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;KACvD,EACD,EAAE,WAAW,EAAE,CAAC,EAAE,CACnB,CAAC;IAEF,OAAO;QACL,GAAG,MAAM,CAAC,aAAa;QACvB,GAAG,YAAY;QACf,IAAI,EAAE,MAAM,CAAC,aAAa,EAAE,IAAI,IAAI,WAAW;KAC/B,CAAC;AACrB,CAAC,CAAC,CAAC;AASL,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAIjC,MAA2B,EAC3B,MAAwC,EACxC,aAA4B,EAC5B,MAAgB,EAShB,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAElB,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;QAC7C,GAAG,MAAM;QACT,SAAS,EAAE,aAAa;KACzB,CAAC,CAAC;IAGH,MAAM,UAAU,GAAG,uBAAuB,CAAC,YAAY,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAGpF,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC;IACxD,MAAM,QAAQ,GAAG,WAAW,IAAI,UAAU,CAAC;IAG3C,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEtF,OAAO;QACL,QAAQ;QACR,gBAAgB,EAAE;YAChB,GAAG,aAAa;YAChB,GAAG,EAAE,QAAQ;SACd;KACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"prepare.js","sourceRoot":"","sources":["../../../../src/contract/pipeline/internal/prepare.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAYhC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAOrE,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAOvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,UAA2B,EAC3B,MAIC,EACoF,EAAE,CACvF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CACnD;QACE,YAAY,CAAC;YACX,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAEtD,kBAAkB,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,aAAa,EAAE,MAAM,CAAC,aAAa;SACpC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;KACvD,EACD,EAAE,WAAW,EAAE,CAAC,EAAE,CACnB,CAAC;IAEF,OAAO;QACL,GAAG,MAAM,CAAC,aAAa;QACvB,GAAG,YAAY;QACf,IAAI,EAAE,MAAM,CAAC,aAAa,EAAE,IAAI,IAAI,WAAW;KAC/B,CAAC;AACrB,CAAC,CAAC,CAAC;AASL,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAIjC,MAA2B,EAC3B,MAAwC,EACxC,aAA4B,EAC5B,MAAgB,EAShB,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAElB,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;QAC7C,GAAG,MAAM;QACT,SAAS,EAAE,aAAa;KACzB,CAAC,CAAC;IAGH,MAAM,UAAU,GAAG,uBAAuB,CAAC,YAAY,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAGpF,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC;IACxD,MAAM,QAAQ,GAAG,WAAW,IAAI,UAAU,CAAC;IAG3C,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,EAAE,GAAG,aAAa,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEtF,OAAO;QACL,QAAQ;QACR,gBAAgB,EAAE;YAChB,GAAG,aAAa;YAChB,GAAG,EAAE,QAAQ;SACd;KACF,CAAC;AACJ,CAAC,CAAC,CAAC","sourcesContent":["import { Effect } from \"effect\";\nimport type { Abi } from \"viem\";\nimport type { ContractWriterShape } from \"@/src/contract/index.js\";\nimport type {\n ClientNotFoundError,\n ContractReadError,\n GasEstimationError,\n InsufficientFundsError,\n SimulationFailedError,\n UserRejectedError,\n} from \"@/src/core/index.js\";\nimport type { GasPriceUnavailableError, GasServiceShape } from \"@/src/gas/index.js\";\nimport { GasService } from \"@/src/gas/index.js\";\nimport type { TxPolicy } from \"@/src/tx/index.js\";\nimport { deriveFeeOverrides, deriveTxType } from \"@/src/tx/index.js\";\nimport type {\n ContractFunctionName,\n FeeOverrides,\n TxOverrides,\n WriteParams,\n} from \"@/src/types/index.js\";\nimport { applyGasLimitMultiplier } from \"./helpers.js\";\n\nexport type BaseOverrides = TxOverrides & FeeOverrides;\n\n/**\n * Derive transaction type and fee overrides in parallel\n */\nexport const deriveBaseOverrides = (\n gasService: GasServiceShape,\n params: {\n chainId: number;\n policy: TxPolicy;\n userOverrides?: TxOverrides;\n }\n): Effect.Effect<BaseOverrides, GasPriceUnavailableError | ClientNotFoundError, never> =>\n Effect.gen(function* () {\n const [derivedType, feeOverrides] = yield* Effect.all(\n [\n deriveTxType({\n chainId: params.chainId,\n policy: params.policy,\n userOverrides: params.userOverrides,\n }).pipe(Effect.provideService(GasService, gasService)),\n\n deriveFeeOverrides({\n chainId: params.chainId,\n policy: params.policy,\n userOverrides: params.userOverrides,\n }).pipe(Effect.provideService(GasService, gasService)),\n ],\n { concurrency: 2 }\n );\n\n return {\n ...params.userOverrides,\n ...feeOverrides,\n type: params.userOverrides?.type ?? derivedType,\n } as BaseOverrides;\n });\n\n/**\n * Estimate gas and simulate transaction.\n *\n * Gas estimation is done BEFORE simulation to provide a reasonable gas limit.\n * Some RPC nodes default to max uint64 when no gas limit is provided, which\n * causes \"insufficient funds\" errors during the balance check.\n */\nexport const simulateAndEstimate = <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n>(\n writer: ContractWriterShape,\n params: WriteParams<TAbi, TFunctionName>,\n baseOverrides: BaseOverrides,\n policy: TxPolicy\n): Effect.Effect<\n { finalGas: bigint; overridesWithGas: BaseOverrides & { gas: bigint } },\n | SimulationFailedError\n | ContractReadError\n | GasEstimationError\n | ClientNotFoundError\n | InsufficientFundsError\n | UserRejectedError\n> =>\n Effect.gen(function* () {\n // Estimate gas first to get a reasonable limit for simulation\n const estimatedGas = yield* writer.estimateGas({\n ...params,\n overrides: baseOverrides,\n });\n // Apply multiplier to add safety margin; this buffered value is used for\n // both simulation (balance check) and the final transaction.\n const derivedGas = applyGasLimitMultiplier(estimatedGas, policy.gasLimitMultiplier);\n\n // Use explicit gas if provided, otherwise use derived\n const explicitGas = params.overrides?.gas ?? params.gas;\n const finalGas = explicitGas ?? derivedGas;\n\n // Simulate with the gas limit to ensure proper balance checks\n yield* writer.simulate({ ...params, overrides: { ...baseOverrides, gas: finalGas } });\n\n return {\n finalGas,\n overridesWithGas: {\n ...baseOverrides,\n gas: finalGas,\n },\n };\n });\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../../../src/contract/pipeline/internal/receipt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAmBhC,MAAM,CAAC,MAAM,mCAAmC,GAAG,CACjD,SAAyB,EACzB,MAKC,EAID,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,IAAI,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;IAE3B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,SAAS;aAC1B,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;aACvD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEvB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;QACxB,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAe,CAAC;YACtC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAe,CAAC;YAEtC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3D,CAAC;YAED,QAAQ,GAAG,OAAO,CAAC;YACnB,SAAS;QACX,CAAC;QAED,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"receipt.js","sourceRoot":"","sources":["../../../../src/contract/pipeline/internal/receipt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAmBhC,MAAM,CAAC,MAAM,mCAAmC,GAAG,CACjD,SAAyB,EACzB,MAKC,EAID,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,IAAI,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;IAE3B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,SAAS;aAC1B,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;aACvD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAEvB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC;QACxB,IAAI,KAAK,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,OAAe,CAAC;YACtC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAe,CAAC;YAEtC,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3D,CAAC;YAED,QAAQ,GAAG,OAAO,CAAC;YACnB,SAAS;QACX,CAAC;QAED,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;AACH,CAAC,CAAC,CAAC","sourcesContent":["import { Effect } from \"effect\";\nimport type { Hash, TransactionReceipt } from \"viem\";\nimport type {\n ClientNotFoundError,\n ReceiptTimeoutError,\n TransactionFailedError,\n} from \"@/src/core/index.js\";\nimport type { TxManagerShape, TxPolicy } from \"@/src/tx/index.js\";\n\nexport type OnReplacedCallback = (\n oldHash: Hash,\n newHash: Hash,\n reason: string\n) => Effect.Effect<void>;\n\n/**\n * Wait for receipt, following any transaction replacements.\n * The onReplaced callback is invoked each time a replacement is detected.\n */\nexport const waitForReceiptFollowingReplacements = (\n txManager: TxManagerShape,\n params: {\n chainId: number;\n hash: Hash;\n policy: TxPolicy;\n onReplaced?: OnReplacedCallback;\n }\n): Effect.Effect<\n TransactionReceipt,\n TransactionFailedError | ReceiptTimeoutError | ClientNotFoundError\n> =>\n Effect.gen(function* () {\n let waitHash = params.hash;\n\n while (true) {\n const exit = yield* txManager\n .waitForReceipt(params.chainId, waitHash, params.policy)\n .pipe(Effect.either);\n\n if (exit._tag === \"Right\") {\n return exit.right;\n }\n\n const error = exit.left;\n if (error._tag === \"TransactionReplacedError\") {\n const oldHash = error.oldHash as Hash;\n const newHash = error.newHash as Hash;\n\n if (params.onReplaced) {\n yield* params.onReplaced(oldHash, newHash, error.reason);\n }\n\n waitHash = newHash;\n continue;\n }\n\n return yield* Effect.fail(error);\n }\n });\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"live.js","sourceRoot":"","sources":["../../../src/contract/pipeline/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,MAAM,CAC9C,gBAAgB,EAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC;IACnC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;IACvC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC;IACzC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC;IAC3C,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC;IACvD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IAErC,MAAM,iBAAiB,GAAG;QACxB,WAAW;QACX,UAAU;QACV,YAAY;QACZ,mBAAmB;QACnB,SAAS;QACT,aAAa;QACb,MAAM;KACP,CAAC;IAEF,MAAM,gBAAgB,GAAG;QACvB,WAAW;QACX,UAAU;QACV,YAAY;QACZ,SAAS;QACT,MAAM;KACP,CAAC;IAEF,OAAO,gBAAgB,CAAC,EAAE,CAAC;QACzB,aAAa,EAAE,iBAAiB,CAAC,iBAAiB,CAAC;QACnD,YAAY,EAAE,gBAAgB,CAAC,gBAAgB,CAAC;KACjD,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"live.js","sourceRoot":"","sources":["../../../src/contract/pipeline/live.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,MAAM,CAC9C,gBAAgB,EAChB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACrC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC;IACnC,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;IACvC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC;IACzC,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC;IAC3C,MAAM,mBAAmB,GAAG,KAAK,CAAC,CAAC,mBAAmB,CAAC;IACvD,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IAErC,MAAM,iBAAiB,GAAG;QACxB,WAAW;QACX,UAAU;QACV,YAAY;QACZ,mBAAmB;QACnB,SAAS;QACT,aAAa;QACb,MAAM;KACP,CAAC;IAEF,MAAM,gBAAgB,GAAG;QACvB,WAAW;QACX,UAAU;QACV,YAAY;QACZ,SAAS;QACT,MAAM;KACP,CAAC;IAEF,OAAO,gBAAgB,CAAC,EAAE,CAAC;QACzB,aAAa,EAAE,iBAAiB,CAAC,iBAAiB,CAAC;QACnD,YAAY,EAAE,gBAAgB,CAAC,gBAAgB,CAAC;KACjD,CAAC,CAAC;AACL,CAAC,CAAC,CACH,CAAC","sourcesContent":["import { Effect, Layer } from \"effect\";\nimport { ContractWriter } from \"@/src/contract/index.js\";\nimport { PublicClientService } from \"@/src/core/index.js\";\nimport { EventStream } from \"@/src/events/index.js\";\nimport { GasService } from \"@/src/gas/index.js\";\nimport { NonceService } from \"@/src/nonce/index.js\";\nimport { TxManager, TxReplacement } from \"@/src/tx/index.js\";\nimport { ContractPipeline } from \"./service.js\";\nimport { makeWriteAndTrack } from \"./write-and-track.js\";\nimport { makeWriteAndWait } from \"./write-and-wait.js\";\n\nexport const ContractPipelineLive = Layer.effect(\n ContractPipeline,\n Effect.gen(function* () {\n const writer = yield* ContractWriter;\n const txManager = yield* TxManager;\n const eventStream = yield* EventStream;\n const nonceService = yield* NonceService;\n const txReplacement = yield* TxReplacement;\n const publicClientService = yield* PublicClientService;\n const gasService = yield* GasService;\n\n const writeAndTrackDeps = {\n eventStream,\n gasService,\n nonceService,\n publicClientService,\n txManager,\n txReplacement,\n writer,\n };\n\n const writeAndWaitDeps = {\n eventStream,\n gasService,\n nonceService,\n txManager,\n writer,\n };\n\n return ContractPipeline.of({\n writeAndTrack: makeWriteAndTrack(writeAndTrackDeps),\n writeAndWait: makeWriteAndWait(writeAndWaitDeps),\n });\n })\n);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/contract/pipeline/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAiEjC,MAAM,OAAO,gBAAiB,SAAQ,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAGtE;CAAG"}
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/contract/pipeline/service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAiEjC,MAAM,OAAO,gBAAiB,SAAQ,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAGtE;CAAG","sourcesContent":["import type { Effect, Scope, SubscriptionRef } from \"effect\";\nimport { Context } from \"effect\";\nimport type { Abi, Hash } from \"viem\";\nimport type {\n ClientNotFoundError,\n TransactionFailedError,\n WalletNotConnectedError,\n} from \"@/src/core/index.js\";\nimport type { GasPriceUnavailableError } from \"@/src/gas/index.js\";\nimport type { TxPolicy, TxState } from \"@/src/tx/index.js\";\nimport type { ContractFunctionName } from \"@/src/types/index.js\";\nimport type { WriteAndTrackError, WriteAndTrackParams, WriteAndTrackResult } from \"./types.js\";\n\nexport type ContractPipelineShape = {\n /**\n * Full write pipeline: simulate -> estimate -> write -> track -> decode events\n * Returns reactive state ref for UI updates\n */\n readonly writeAndTrack: <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n >(\n params: WriteAndTrackParams<TAbi, TFunctionName>\n ) => Effect.Effect<\n {\n stateRef: SubscriptionRef.SubscriptionRef<TxState>;\n actions: {\n readonly speedup: (\n policy?: TxPolicy\n ) => Effect.Effect<\n Hash,\n | TransactionFailedError\n | WalletNotConnectedError\n | ClientNotFoundError\n | GasPriceUnavailableError\n | Error\n >;\n readonly cancel: (\n policy?: TxPolicy\n ) => Effect.Effect<\n Hash,\n | TransactionFailedError\n | WalletNotConnectedError\n | ClientNotFoundError\n | GasPriceUnavailableError\n | Error\n >;\n };\n result: Effect.Effect<WriteAndTrackResult<TAbi>, WriteAndTrackError>;\n },\n never,\n Scope.Scope\n >;\n\n /**\n * Simplified version that just waits for receipt\n * No reactive state, just returns final result\n */\n readonly writeAndWait: <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n >(\n params: WriteAndTrackParams<TAbi, TFunctionName>\n ) => Effect.Effect<WriteAndTrackResult<TAbi>, WriteAndTrackError>;\n};\n\nexport class ContractPipeline extends Context.Tag(\"ew3/ContractPipeline\")<\n ContractPipeline,\n ContractPipelineShape\n>() {}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/contract/pipeline/types.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/contract/pipeline/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Effect } from \"effect\";\nimport type { Abi, Address, Hash, Hex, TransactionReceipt } from \"viem\";\nimport type {\n ClientNotFoundError,\n ContractReadError,\n ContractWriteError,\n EventDecodeError,\n GasEstimationError,\n InsufficientFundsError,\n ReceiptTimeoutError,\n SimulationFailedError,\n TransactionFailedError,\n TransactionReplacedError,\n TransportError,\n UserRejectedError,\n WalletNotConnectedError,\n WrongNetworkError,\n} from \"@/src/core/index.js\";\nimport type { DecodedEvent } from \"@/src/events/index.js\";\nimport type { GasPriceUnavailableError } from \"@/src/gas/index.js\";\nimport type { TxPolicy, TxState } from \"@/src/tx/index.js\";\nimport type { ContractEventName, ContractFunctionName, WriteParams } from \"@/src/types/index.js\";\n\nexport type WriteAndTrackParams<\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n> = WriteParams<TAbi, TFunctionName> & {\n policy?: TxPolicy;\n};\n\nexport type WriteAndTrackResult<TAbi extends Abi> = {\n hash: Hash;\n receipt: TransactionReceipt;\n events: DecodedEvent<TAbi, ContractEventName<TAbi>>[];\n};\n\nexport type WriteAndTrackError =\n | SimulationFailedError\n | ContractReadError\n | GasEstimationError\n | ContractWriteError\n | InsufficientFundsError\n | UserRejectedError\n | GasPriceUnavailableError\n | TransactionFailedError\n | TransactionReplacedError\n | ReceiptTimeoutError\n | ClientNotFoundError\n | TransportError\n | WalletNotConnectedError\n | WrongNetworkError\n | EventDecodeError;\n\n/**\n * Hooks for core pipeline stages.\n * All hooks are optional and default to no-ops.\n */\nexport type PipelineHooks = {\n /** Called when simulation begins */\n readonly onSimulating?: () => Effect.Effect<void>;\n /** Called after gas estimation with the estimated values */\n readonly onEstimated?: (gas: bigint, nonce: number | bigint) => Effect.Effect<void>;\n /** Called when transaction signing begins */\n readonly onSigning?: () => Effect.Effect<void>;\n /** Called after transaction is submitted with the hash */\n readonly onSubmitted?: (hash: Hash) => Effect.Effect<void>;\n /** Called when a replacement transaction is detected */\n readonly onReplaced?: (oldHash: Hash, newHash: Hash, reason: string) => Effect.Effect<void>;\n /** Called when transaction is mined */\n readonly onMined?: (receipt: TransactionReceipt) => Effect.Effect<void>;\n};\n\n/**\n * Internal type for nonce reservation result\n */\nexport type NonceReservation = {\n readonly nonce: number | bigint;\n readonly reserved: boolean;\n readonly markSubmitted: () => Effect.Effect<void>;\n};\n\n/**\n * Internal type for prepared transaction overrides\n */\nexport type PreparedOverrides = {\n readonly type?: \"legacy\" | \"eip1559\" | \"eip2930\" | \"eip4844\" | \"eip7702\";\n readonly gas: bigint;\n readonly nonce: number | bigint;\n readonly gasPrice?: bigint;\n readonly maxFeePerGas?: bigint;\n readonly maxPriorityFeePerGas?: bigint;\n readonly accessList?: readonly {\n address: Address;\n storageKeys: readonly Hex[];\n }[];\n};\n\n/**\n * Result from the prepare phase\n */\nexport type PrepareResult = {\n readonly baseOverrides: PreparedOverrides;\n readonly finalGas: bigint;\n readonly txPreview: TxState[\"tx\"];\n};\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-and-track.js","sourceRoot":"","sources":["../../../src/contract/pipeline/write-and-track.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"write-and-track.js","sourceRoot":"","sources":["../../../src/contract/pipeline/write-and-track.ts"],"names":[],"mappings":"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","sourcesContent":["import { Clock, Deferred, Effect, Fiber, Ref, Stream } from \"effect\";\nimport type { Abi, Hash, PublicClient } from \"viem\";\nimport { DEFAULT_STUCK_TX_MS } from \"@/src/constants/index.js\";\nimport type { ContractWriterShape } from \"@/src/contract/index.js\";\nimport type { PublicClientServiceShape } from \"@/src/core/index.js\";\nimport type { EventStreamShape } from \"@/src/events/index.js\";\nimport type { GasServiceShape } from \"@/src/gas/index.js\";\nimport type { NonceServiceShape } from \"@/src/nonce/index.js\";\nimport type { TxManagerShape, TxPolicy, TxReplacementShape, TxState } from \"@/src/tx/index.js\";\nimport { defaultPolicy, makeTxTracker } from \"@/src/tx/index.js\";\nimport type { ContractFunctionName } from \"@/src/types/index.js\";\nimport { applyGasLimitMultiplier, nonceToBigInt } from \"./internal/helpers.js\";\nimport { withNonceReservation } from \"./internal/nonce.js\";\nimport { deriveBaseOverrides } from \"./internal/prepare.js\";\nimport type { WriteAndTrackError, WriteAndTrackParams, WriteAndTrackResult } from \"./types.js\";\n\n/**\n * Dependencies required by writeAndTrack\n */\nexport type WriteAndTrackDeps = {\n readonly writer: ContractWriterShape;\n readonly txManager: TxManagerShape;\n readonly eventStream: EventStreamShape;\n readonly nonceService: NonceServiceShape;\n readonly txReplacement: TxReplacementShape;\n readonly publicClientService: PublicClientServiceShape;\n readonly gasService: GasServiceShape;\n};\n\n/**\n * Create the writeAndTrack implementation with full tracking orchestration\n */\nexport const makeWriteAndTrack = (deps: WriteAndTrackDeps) =>\n Effect.fn(\"ContractPipeline.writeAndTrack\")(function* <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n >(params: WriteAndTrackParams<TAbi, TFunctionName>) {\n const {\n writer,\n txManager,\n eventStream,\n nonceService,\n txReplacement,\n publicClientService,\n gasService,\n } = deps;\n\n const tracker = yield* makeTxTracker;\n const policy = params.policy ?? defaultPolicy;\n const currentHashRef = yield* Ref.make<Hash | null>(null);\n const blocksElapsedRef = yield* Ref.make(0);\n const startedAtMsRef = yield* Ref.make(0);\n const autoAttemptsRef = yield* Ref.make(0);\n const autoReplacingRef = yield* Ref.make(false);\n\n const resultDeferred = yield* Deferred.make<WriteAndTrackResult<TAbi>, WriteAndTrackError>();\n\n const run = Effect.gen(function* () {\n // Step 1: Derive base overrides\n const baseOverrides = yield* deriveBaseOverrides(gasService, {\n chainId: params.chainId,\n policy,\n userOverrides: params.overrides,\n });\n\n // Step 2: Estimate gas first to provide a reasonable limit for simulation.\n // Some RPC nodes default to max uint64 when no gas limit is provided,\n // causing \"insufficient funds\" errors during the balance check.\n const estimatedGas = yield* writer.estimateGas({\n ...params,\n overrides: baseOverrides,\n });\n // Apply multiplier to add safety margin; this buffered value is used for\n // both simulation (balance check) and the final transaction.\n const derivedGas = applyGasLimitMultiplier(estimatedGas, policy.gasLimitMultiplier);\n\n const explicitGas = params.overrides?.gas ?? params.gas;\n const finalGas = explicitGas ?? derivedGas;\n\n // Step 3: Simulate with the gas limit to ensure proper balance checks\n yield* tracker.set({ status: \"simulating\" });\n yield* writer.simulate({ ...params, overrides: { ...baseOverrides, gas: finalGas } });\n const explicitNonce = params.overrides?.nonce;\n\n // Step 4: Reserve nonce\n const nonceReservation = yield* withNonceReservation(nonceService, {\n account: params.account,\n chainId: params.chainId,\n explicitNonce,\n });\n\n const nonce = nonceReservation.nonce;\n\n const overridesWithGasAndNonce = {\n ...baseOverrides,\n gas: finalGas,\n nonce,\n };\n\n yield* tracker.set({\n gas: finalGas,\n status: \"estimated\",\n tx: {\n accessList: overridesWithGasAndNonce.accessList,\n gas: finalGas,\n gasPrice: overridesWithGasAndNonce.gasPrice,\n maxFeePerGas: overridesWithGasAndNonce.maxFeePerGas,\n maxPriorityFeePerGas: overridesWithGasAndNonce.maxPriorityFeePerGas,\n nonce,\n type: overridesWithGasAndNonce.type,\n },\n });\n\n // Step 5: Signing\n yield* tracker.update((prev) => ({ status: \"signing\", tx: prev.tx }) as TxState);\n\n // Step 6: Write transaction\n const hash = yield* writer.write({\n ...params,\n overrides: overridesWithGasAndNonce,\n });\n yield* nonceReservation.markSubmitted;\n yield* Ref.set(currentHashRef, hash);\n yield* Ref.set(blocksElapsedRef, 0);\n yield* Ref.set(autoAttemptsRef, 0);\n yield* Ref.set(autoReplacingRef, false);\n yield* Ref.set(startedAtMsRef, yield* Clock.currentTimeMillis);\n yield* tracker.update((prev) => ({ hash, status: \"submitted\", tx: prev.tx }) as TxState);\n\n // Set up block watcher for pending state updates\n const publicClient: PublicClient = yield* publicClientService.get(params.chainId);\n const replacementStrategy =\n policy.replacement?.strategy ?? policy.replacementStrategy ?? \"none\";\n const stuckBlocks = policy.replacement?.stuckBlocks ?? 3;\n const stuckMs = policy.replacement?.stuckMs ?? DEFAULT_STUCK_TX_MS;\n const maxAttempts = policy.replacement?.maxAttempts ?? 1;\n\n const updatePendingState = (currentHash: Hash) =>\n Effect.gen(function* () {\n const blocksElapsed = yield* Ref.modify(blocksElapsedRef, (n) => [n + 1, n + 1] as const);\n\n yield* tracker.update((prev) => {\n if (prev.status === \"mined\" || prev.status === \"failed\") {\n return prev;\n }\n return {\n confirmations: blocksElapsed,\n hash: currentHash,\n status: \"pending\",\n tx: prev.tx,\n } as TxState;\n });\n\n return blocksElapsed;\n });\n\n const performAutoReplacement = (currentHash: Hash, now: number) =>\n Ref.set(autoReplacingRef, true).pipe(\n Effect.zipRight(\n (replacementStrategy === \"cancel\"\n ? txReplacement.cancel(params.chainId, currentHash, policy)\n : txReplacement.speedup(params.chainId, currentHash, policy)\n ).pipe(\n Effect.either,\n Effect.ensuring(Ref.set(autoReplacingRef, false)),\n Effect.flatMap((replaced) => {\n if (replaced._tag === \"Left\") {\n return Effect.void;\n }\n\n const newHash = replaced.right;\n return Effect.all([\n Ref.set(currentHashRef, newHash),\n Ref.set(blocksElapsedRef, 0),\n Ref.set(startedAtMsRef, now),\n Ref.update(autoAttemptsRef, (n) => n + 1),\n tracker.update(\n (prev) =>\n ({\n newHash,\n oldHash: currentHash,\n reason: replacementStrategy === \"cancel\" ? \"cancelled\" : \"repriced\",\n status: \"replaced\",\n tx: prev.tx,\n }) as TxState\n ),\n tracker.update(\n (prev) =>\n ({\n hash: newHash,\n status: \"submitted\",\n tx: prev.tx,\n }) as TxState\n ),\n ]).pipe(Effect.asVoid);\n })\n )\n )\n );\n\n const autoReplaceIfStuck = (currentHash: Hash, blocksElapsed: number) => {\n if (replacementStrategy === \"none\") {\n return Effect.void;\n }\n\n return Effect.all({\n alreadyReplacing: Ref.get(autoReplacingRef),\n attempts: Ref.get(autoAttemptsRef),\n now: Clock.currentTimeMillis,\n startedAt: Ref.get(startedAtMsRef),\n }).pipe(\n Effect.flatMap(({ alreadyReplacing, attempts, now, startedAt }) => {\n const elapsed = startedAt > 0 ? now - startedAt : 0;\n const stuck = blocksElapsed >= stuckBlocks || elapsed >= stuckMs;\n const allowed = attempts < maxAttempts && !alreadyReplacing;\n return stuck && allowed ? performAutoReplacement(currentHash, now) : Effect.void;\n })\n );\n };\n\n const onPendingBlock = Effect.gen(function* () {\n const currentHash = yield* Ref.get(currentHashRef);\n if (!currentHash) {\n return;\n }\n\n const blocksElapsed = yield* updatePendingState(currentHash);\n yield* autoReplaceIfStuck(currentHash, blocksElapsed);\n });\n\n const pendingFiber = yield* Stream.runForEach(\n Stream.async<bigint, unknown>((emit) => {\n const unwatch = publicClient.watchBlockNumber({\n onBlockNumber: (blockNumber: bigint) => emit.single(blockNumber),\n onError: (error) => emit.fail(error as unknown),\n pollingInterval: policy.pollingInterval,\n });\n\n return Effect.sync(() => {\n unwatch();\n });\n }),\n () => onPendingBlock\n ).pipe(Effect.forkScoped);\n\n // Step 7: Wait for receipt (follow replacements)\n const receipt = yield* Effect.gen(function* () {\n let waitHash = hash;\n\n while (true) {\n const exit = yield* txManager\n .waitForReceipt(params.chainId, waitHash, policy)\n .pipe(Effect.either);\n\n if (exit._tag === \"Right\") {\n return exit.right;\n }\n\n const error = exit.left;\n if (error._tag === \"TransactionReplacedError\") {\n const newHash = error.newHash as Hash;\n const now = yield* Clock.currentTimeMillis;\n\n yield* Ref.set(currentHashRef, newHash);\n yield* Ref.set(blocksElapsedRef, 0);\n yield* Ref.set(startedAtMsRef, now);\n yield* tracker.update(\n (prev) =>\n ({\n newHash,\n oldHash: error.oldHash as Hash,\n reason: error.reason,\n status: \"replaced\",\n tx: prev.tx,\n }) as TxState\n );\n yield* tracker.update(\n (prev) =>\n ({\n hash: newHash,\n status: \"submitted\",\n tx: prev.tx,\n }) as TxState\n );\n\n waitHash = newHash;\n continue;\n }\n\n return yield* Effect.fail(error);\n }\n }).pipe(Effect.ensuring(Fiber.interrupt(pendingFiber)));\n\n // Step 8: Update to mined state\n yield* tracker.update(\n (prev) =>\n ({\n effectiveGasPrice: receipt.effectiveGasPrice,\n hash: receipt.transactionHash as Hash,\n receipt,\n status: \"mined\",\n tx: prev.tx,\n }) as TxState\n );\n\n if (nonceReservation.reserved) {\n yield* nonceService.confirm({\n address: params.account,\n chainId: params.chainId,\n nonce: nonceToBigInt(nonceReservation.nonce),\n });\n }\n\n // Step 9: Decode events\n const events = (yield* eventStream.decodeReceipt(\n receipt,\n params.abi\n )) as WriteAndTrackResult<TAbi>[\"events\"];\n\n return {\n events,\n hash: receipt.transactionHash as Hash,\n receipt,\n } as WriteAndTrackResult<TAbi>;\n });\n\n yield* run.pipe(\n Effect.either,\n Effect.flatMap((either) =>\n either._tag === \"Right\"\n ? Deferred.succeed(resultDeferred, either.right)\n : Deferred.fail(resultDeferred, either.left)\n ),\n Effect.forkScoped\n );\n\n return {\n actions: {\n cancel: (overridePolicy?: TxPolicy) =>\n Effect.gen(function* () {\n const currentHash = yield* Ref.get(currentHashRef);\n if (!currentHash) {\n return yield* Effect.fail(new Error(\"Transaction not yet submitted\"));\n }\n\n const nextPolicy = overridePolicy ?? policy;\n const newHash = yield* txReplacement.cancel(params.chainId, currentHash, nextPolicy);\n const now = yield* Clock.currentTimeMillis;\n\n yield* Ref.set(currentHashRef, newHash);\n yield* Ref.set(blocksElapsedRef, 0);\n yield* Ref.set(startedAtMsRef, now);\n yield* tracker.update(\n (prev) =>\n ({\n newHash,\n oldHash: currentHash,\n reason: \"cancelled\",\n status: \"replaced\",\n tx: prev.tx,\n }) as TxState\n );\n yield* tracker.update(\n (prev) =>\n ({\n hash: newHash,\n status: \"submitted\",\n tx: prev.tx,\n }) as TxState\n );\n\n return newHash;\n }),\n\n speedup: (overridePolicy?: TxPolicy) =>\n Effect.gen(function* () {\n const currentHash = yield* Ref.get(currentHashRef);\n if (!currentHash) {\n return yield* Effect.fail(new Error(\"Transaction not yet submitted\"));\n }\n\n const nextPolicy = overridePolicy ?? policy;\n const newHash = yield* txReplacement.speedup(params.chainId, currentHash, nextPolicy);\n const now = yield* Clock.currentTimeMillis;\n\n yield* Ref.set(currentHashRef, newHash);\n yield* Ref.set(blocksElapsedRef, 0);\n yield* Ref.set(startedAtMsRef, now);\n yield* tracker.update(\n (prev) =>\n ({\n newHash,\n oldHash: currentHash,\n reason: \"repriced\",\n status: \"replaced\",\n tx: prev.tx,\n }) as TxState\n );\n yield* tracker.update(\n (prev) =>\n ({\n hash: newHash,\n status: \"submitted\",\n tx: prev.tx,\n }) as TxState\n );\n\n return newHash;\n }),\n },\n result: Deferred.await(resultDeferred),\n stateRef: tracker.ref,\n };\n });\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-and-wait.js","sourceRoot":"","sources":["../../../src/contract/pipeline/write-and-wait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAMrD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAsB,EAAE,EAAE,CACzD,MAAM,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC,QAAQ,CAAC,EAGlD,MAAgD;IAChD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC;AAC7F,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"write-and-wait.js","sourceRoot":"","sources":["../../../src/contract/pipeline/write-and-wait.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAMrD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAsB,EAAE,EAAE,CACzD,MAAM,CAAC,EAAE,CAAC,+BAA+B,CAAC,CAAC,QAAQ,CAAC,EAGlD,MAAgD;IAChD,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,aAAa,CAAC,CAAC,CAAC;AAC7F,CAAC,CAAC,CAAC","sourcesContent":["import { Effect } from \"effect\";\nimport type { Abi } from \"viem\";\nimport { defaultPolicy } from \"@/src/tx/index.js\";\nimport type { ContractFunctionName } from \"@/src/types/index.js\";\nimport type { CorePipelineDeps } from \"./internal/core.js\";\nimport { runCorePipeline } from \"./internal/core.js\";\nimport type { WriteAndTrackParams } from \"./types.js\";\n\n/**\n * Create the writeAndWait implementation\n */\nexport const makeWriteAndWait = (deps: CorePipelineDeps) =>\n Effect.fn(\"ContractPipeline.writeAndWait\")(function* <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n >(params: WriteAndTrackParams<TAbi, TFunctionName>) {\n return yield* Effect.scoped(runCorePipeline(deps, params, params.policy ?? defaultPolicy));\n });\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/contract/pipeline.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC"}
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/contract/pipeline.ts"],"names":[],"mappings":"AAAA,cAAc,kCAAkC,CAAC","sourcesContent":["export * from \"@/src/contract/pipeline/index.js\";\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/contract/reader.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/contract/reader.ts"],"names":[],"mappings":"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","sourcesContent":["import { Context, Effect, Layer } from \"effect\";\nimport type { Abi } from \"viem\";\nimport type { ClientNotFoundError } from \"@/src/core/index.js\";\nimport {\n ContractReadError,\n classifyContractError,\n MulticallError,\n PublicClientService,\n} from \"@/src/core/index.js\";\nimport type {\n ContractFunctionName,\n ContractFunctionReturnType,\n ExtractMulticallReturnType,\n MulticallCall,\n MulticallResult,\n ReadParams,\n} from \"@/src/types/index.js\";\n\n/**\n * Service for reading from smart contracts\n */\nexport type ContractReaderShape = {\n /**\n * Read from a contract function\n */\n readonly read: <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n >(\n params: ReadParams<TAbi, TFunctionName>\n ) => Effect.Effect<\n ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName>,\n ContractReadError | ClientNotFoundError\n >;\n\n /**\n * Execute multiple contract reads in a single call with type-safe results.\n * Each call in the array preserves its ABI and function type information,\n * and the result is a tuple where each element is typed based on its corresponding call.\n *\n * @example\n * ```typescript\n * const results = yield* contractReader.multicall(1, [\n * { address: tokenAddr, abi: ERC20_ABI, functionName: \"balanceOf\", args: [addr] },\n * { address: tokenAddr, abi: ERC20_ABI, functionName: \"totalSupply\" }\n * ]);\n * // results[0].result is typed as bigint (balanceOf return type)\n * // results[1].result is typed as bigint (totalSupply return type)\n * ```\n */\n readonly multicall: <const TCalls extends readonly MulticallCall[]>(\n chainId: number,\n calls: TCalls,\n options?: {\n readonly blockNumber?: bigint | undefined;\n readonly blockTag?: import(\"viem\").BlockTag | undefined;\n }\n ) => Effect.Effect<\n {\n readonly [K in keyof TCalls]: MulticallResult<ExtractMulticallReturnType<TCalls[K]>>;\n },\n MulticallError | ClientNotFoundError\n >;\n};\n\nexport class ContractReader extends Context.Tag(\"ew3/ContractReader\")<\n ContractReader,\n ContractReaderShape\n>() {}\n\n/**\n * Live implementation of ContractReader service\n */\nexport const ContractReaderLive = Layer.effect(\n ContractReader,\n Effect.gen(function* () {\n const publicClientService = yield* PublicClientService;\n\n return ContractReader.of({\n multicall: Effect.fn(\"ContractReader.multicall\")(function* <\n const TCalls extends readonly MulticallCall[],\n >(\n chainId: number,\n calls: TCalls,\n options?: {\n readonly blockNumber?: bigint | undefined;\n readonly blockTag?: import(\"viem\").BlockTag | undefined;\n }\n ) {\n const client = yield* publicClientService.get(chainId);\n\n const results = yield* Effect.tryPromise({\n catch: (cause) =>\n new MulticallError({\n cause,\n failedCalls: 0,\n message: \"Multicall failed\",\n }),\n try: () =>\n client.multicall({\n blockNumber: options?.blockNumber,\n blockTag: options?.blockTag,\n contracts: calls.map((c) => ({\n abi: c.abi,\n address: c.address,\n args: c.args,\n functionName: c.functionName,\n })),\n }),\n });\n\n return results.map((r) =>\n r.status === \"success\"\n ? { result: r.result, status: \"success\" as const }\n : {\n error: new Error(String(r.error)),\n status: \"failure\" as const,\n }\n ) as {\n readonly [K in keyof TCalls]: MulticallResult<ExtractMulticallReturnType<TCalls[K]>>;\n };\n }),\n read: Effect.fn(\"ContractReader.read\")(function* <\n TAbi extends Abi,\n TFunctionName extends ContractFunctionName<TAbi, \"pure\" | \"view\">,\n >(params: ReadParams<TAbi, TFunctionName>) {\n const client = yield* publicClientService.get(params.chainId);\n\n return yield* Effect.tryPromise({\n catch: (cause) => {\n const classified = classifyContractError(cause, {\n address: params.address,\n functionName: params.functionName as string,\n });\n\n return classified instanceof ContractReadError\n ? classified\n : new ContractReadError({\n address: params.address,\n cause: classified,\n functionName: params.functionName as string,\n message: classified.message,\n });\n },\n try: () =>\n client.readContract({\n abi: params.abi,\n account: params.account,\n address: params.address,\n args: params.args,\n blockNumber: params.blockNumber,\n blockTag: params.blockTag,\n functionName: params.functionName,\n }),\n });\n }),\n });\n })\n);\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typed-contract.js","sourceRoot":"","sources":["../../src/contract/typed-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AA0HzE,MAAM,UAAU,aAAa,CAAmB,GAAS,EAAE,OAAgB;IACzE,OAAO;QACL,GAAG;QACH,OAAO;QAEP,WAAW,EAAE,CACX,OAAe,EACf,YAA2B,EAC3B,MAA2C,EAC3C,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;YACrC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC/B,GAAG;gBACH,OAAO;gBACP,OAAO;gBACP,YAAY;gBACZ,GAAG,MAAM;aAC0B,CAAC,CAAC;QACzC,CAAC,CAAC;QAEJ,IAAI,EAAE,CACJ,OAAe,EACf,YAA2B,EAC3B,GAAG,IAAmD,EACtD,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBACxB,GAAG;gBACH,OAAO,EAAE,OAAO,EAAE,OAAO;gBACzB,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;gBACb,WAAW,EAAE,OAAO,EAAE,WAAW;gBACjC,QAAQ,EAAE,OAAO,EAAE,QAAQ;gBAC3B,OAAO;gBACP,YAAY;aACsB,CAAC,CAAC;QACxC,CAAC,CAAC;QAEJ,QAAQ,EAAE,CACR,OAAe,EACf,YAA2B,EAC3B,MAA2C,EAC3C,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;YACrC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAC5B,GAAG;gBACH,OAAO;gBACP,OAAO;gBACP,YAAY;gBACZ,GAAG,MAAM;aAC0B,CAAC,CAAC;QACzC,CAAC,CAAC;QAEJ,KAAK,EAAE,CACL,OAAe,EACf,YAA2B,EAC3B,MAA2C,EAC3C,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;YACrC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBACzB,GAAG;gBACH,OAAO;gBACP,OAAO;gBACP,YAAY;gBACZ,GAAG,MAAM;aAC0B,CAAC,CAAC;QACzC,CAAC,CAAC;KACL,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"typed-contract.js","sourceRoot":"","sources":["../../src/contract/typed-contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AA0HzE,MAAM,UAAU,aAAa,CAAmB,GAAS,EAAE,OAAgB;IACzE,OAAO;QACL,GAAG;QACH,OAAO;QAEP,WAAW,EAAE,CACX,OAAe,EACf,YAA2B,EAC3B,MAA2C,EAC3C,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;YACrC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC/B,GAAG;gBACH,OAAO;gBACP,OAAO;gBACP,YAAY;gBACZ,GAAG,MAAM;aAC0B,CAAC,CAAC;QACzC,CAAC,CAAC;QAEJ,IAAI,EAAE,CACJ,OAAe,EACf,YAA2B,EAC3B,GAAG,IAAmD,EACtD,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;gBACxB,GAAG;gBACH,OAAO,EAAE,OAAO,EAAE,OAAO;gBACzB,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;gBACb,WAAW,EAAE,OAAO,EAAE,WAAW;gBACjC,QAAQ,EAAE,OAAO,EAAE,QAAQ;gBAC3B,OAAO;gBACP,YAAY;aACsB,CAAC,CAAC;QACxC,CAAC,CAAC;QAEJ,QAAQ,EAAE,CACR,OAAe,EACf,YAA2B,EAC3B,MAA2C,EAC3C,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;YACrC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;gBAC5B,GAAG;gBACH,OAAO;gBACP,OAAO;gBACP,YAAY;gBACZ,GAAG,MAAM;aAC0B,CAAC,CAAC;QACzC,CAAC,CAAC;QAEJ,KAAK,EAAE,CACL,OAAe,EACf,YAA2B,EAC3B,MAA2C,EAC3C,EAAE,CACF,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;YAClB,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;YACrC,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBACzB,GAAG;gBACH,OAAO;gBACP,OAAO;gBACP,YAAY;gBACZ,GAAG,MAAM;aAC0B,CAAC,CAAC;QACzC,CAAC,CAAC;KACL,CAAC;AACJ,CAAC","sourcesContent":["import { Effect } from \"effect\";\nimport type { Address, BlockTag, GetValue, Hash } from \"viem\";\nimport { ContractReader, ContractWriter } from \"@/src/contract/index.js\";\nimport type {\n Abi,\n ContractFunctionArgs,\n ContractFunctionReturnType,\n ReadFunctionName,\n ReadParams,\n SimulateResult,\n TxOverrides,\n WriteFunctionName,\n WriteParams,\n} from \"@/src/types/index.js\";\n\ntype ReadArgs<\n TAbi extends Abi,\n TFunctionName extends ReadFunctionName<TAbi>,\n> = ContractFunctionArgs<TAbi, \"pure\" | \"view\", TFunctionName>;\n\ntype ReadCallOptions = {\n readonly account?: Address | undefined;\n readonly blockNumber?: bigint | undefined;\n readonly blockTag?: BlockTag | undefined;\n};\n\ntype ReadArgsWithOptionsParam<\n TAbi extends Abi,\n TFunctionName extends ReadFunctionName<TAbi>,\n> = readonly [] extends ReadArgs<TAbi, TFunctionName>\n ? [args?: ReadArgs<TAbi, TFunctionName>, options?: ReadCallOptions | undefined]\n : [args: ReadArgs<TAbi, TFunctionName>, options?: ReadCallOptions | undefined];\n\ntype WriteArgs<\n TAbi extends Abi,\n TFunctionName extends WriteFunctionName<TAbi>,\n> = ContractFunctionArgs<TAbi, \"nonpayable\" | \"payable\", TFunctionName>;\n\ntype WriteArgsField<\n TAbi extends Abi,\n TFunctionName extends WriteFunctionName<TAbi>,\n> = readonly [] extends WriteArgs<TAbi, TFunctionName>\n ? { readonly args?: WriteArgs<TAbi, TFunctionName> | undefined }\n : { readonly args: WriteArgs<TAbi, TFunctionName> };\n\ntype WriteOverrides<TAbi extends Abi, TFunctionName extends WriteFunctionName<TAbi>> = {\n readonly account: Address;\n readonly overrides?: TxOverrides | undefined;\n readonly gas?: bigint | undefined;\n} & WriteArgsField<TAbi, TFunctionName> &\n GetValue<TAbi, TFunctionName, bigint>;\n\n/**\n * A typed contract instance with the ABI baked in\n */\nexport type TypedContract<TAbi extends Abi> = {\n /**\n * The contract address\n */\n readonly address: Address;\n\n /**\n * The contract ABI\n */\n readonly abi: TAbi;\n\n /**\n * Read from a contract function\n */\n readonly read: <TFunctionName extends ReadFunctionName<TAbi>>(\n chainId: number,\n functionName: TFunctionName,\n ...args: ReadArgsWithOptionsParam<TAbi, TFunctionName>\n ) => Effect.Effect<\n ContractFunctionReturnType<TAbi, \"pure\" | \"view\", TFunctionName>,\n Error,\n ContractReader\n >;\n\n /**\n * Simulate a contract write\n */\n readonly simulate: <TFunctionName extends WriteFunctionName<TAbi>>(\n chainId: number,\n functionName: TFunctionName,\n args: WriteOverrides<TAbi, TFunctionName>\n ) => Effect.Effect<SimulateResult, Error, ContractWriter>;\n\n /**\n * Estimate gas for a contract write\n */\n readonly estimateGas: <TFunctionName extends WriteFunctionName<TAbi>>(\n chainId: number,\n functionName: TFunctionName,\n args: WriteOverrides<TAbi, TFunctionName>\n ) => Effect.Effect<bigint, Error, ContractWriter>;\n\n /**\n * Write to a contract function\n */\n readonly write: <TFunctionName extends WriteFunctionName<TAbi>>(\n chainId: number,\n functionName: TFunctionName,\n args: WriteOverrides<TAbi, TFunctionName>\n ) => Effect.Effect<Hash, Error, ContractWriter>;\n};\n\n/**\n * Creates a typed contract instance with ABI baked in\n *\n * @example\n * ```typescript\n * const erc20 = typedContract(erc20Abi, \"0x...\")\n *\n * // Type-safe reads\n * const balance = await erc20.read(1, \"balanceOf\", [\"0x...\"])\n *\n * // Type-safe writes\n * const hash = await erc20.write(1, \"transfer\", {\n * args: [\"0x...\", 100n],\n * account: \"0x...\",\n * })\n * ```\n */\nexport function typedContract<TAbi extends Abi>(abi: TAbi, address: Address): TypedContract<TAbi> {\n return {\n abi,\n address,\n\n estimateGas: <TFunctionName extends WriteFunctionName<TAbi>>(\n chainId: number,\n functionName: TFunctionName,\n params: WriteOverrides<TAbi, TFunctionName>\n ) =>\n Effect.gen(function* () {\n const writer = yield* ContractWriter;\n return yield* writer.estimateGas({\n abi,\n address,\n chainId,\n functionName,\n ...params,\n } as WriteParams<TAbi, TFunctionName>);\n }),\n\n read: <TFunctionName extends ReadFunctionName<TAbi>>(\n chainId: number,\n functionName: TFunctionName,\n ...args: ReadArgsWithOptionsParam<TAbi, TFunctionName>\n ) =>\n Effect.gen(function* () {\n const reader = yield* ContractReader;\n const options = args[1];\n return yield* reader.read({\n abi,\n account: options?.account,\n address,\n args: args[0],\n blockNumber: options?.blockNumber,\n blockTag: options?.blockTag,\n chainId,\n functionName,\n } as ReadParams<TAbi, TFunctionName>);\n }),\n\n simulate: <TFunctionName extends WriteFunctionName<TAbi>>(\n chainId: number,\n functionName: TFunctionName,\n params: WriteOverrides<TAbi, TFunctionName>\n ) =>\n Effect.gen(function* () {\n const writer = yield* ContractWriter;\n return yield* writer.simulate({\n abi,\n address,\n chainId,\n functionName,\n ...params,\n } as WriteParams<TAbi, TFunctionName>);\n }),\n\n write: <TFunctionName extends WriteFunctionName<TAbi>>(\n chainId: number,\n functionName: TFunctionName,\n params: WriteOverrides<TAbi, TFunctionName>\n ) =>\n Effect.gen(function* () {\n const writer = yield* ContractWriter;\n return yield* writer.write({\n abi,\n address,\n chainId,\n functionName,\n ...params,\n } as WriteParams<TAbi, TFunctionName>);\n }),\n };\n}\n"]}
|