From b1cac5e934906efbc9039c96535ae1fd3bd75ff2 Mon Sep 17 00:00:00 2001 From: Gheorghe Pinzaru Date: Thu, 21 Nov 2024 20:55:57 +0700 Subject: [PATCH 1/4] In case we can't create tables with sql stores call die instead of fail --- .changeset/sharp-rockets-fly.md | 5 ++++ apps/web/src/lib/decode.ts | 28 +++---------------- .../transaction-decoder/src/sql/abi-store.ts | 21 +++++++------- .../src/sql/contract-meta-store.ts | 20 ++++++------- 4 files changed, 30 insertions(+), 44 deletions(-) create mode 100644 .changeset/sharp-rockets-fly.md diff --git a/.changeset/sharp-rockets-fly.md b/.changeset/sharp-rockets-fly.md new file mode 100644 index 00000000..06d1a2ff --- /dev/null +++ b/.changeset/sharp-rockets-fly.md @@ -0,0 +1,5 @@ +--- +'@3loop/transaction-decoder': patch +--- + +SQL stores will now die instead of failure if tables can't be created diff --git a/apps/web/src/lib/decode.ts b/apps/web/src/lib/decode.ts index 4941ddd1..5f6b55ce 100644 --- a/apps/web/src/lib/decode.ts +++ b/apps/web/src/lib/decode.ts @@ -46,18 +46,8 @@ export async function decodeTransaction({ hash: string }): Promise { // NOTE: For unknonw reason the context of main layer is still missing the SqlClient in the type - const runnable = Effect.provide(decodeTransactionByHash(hash as Hex, chainID), MainLayer) as Effect.Effect< - DecodedTransaction, - | SqlError - | UnknownNetwork - | ConfigError - | SqlError - | RPCFetchError - | ParseError - | UnsupportedEvent - | FetchTransactionError, - never - > + const runnable = Effect.provide(decodeTransactionByHash(hash as Hex, chainID), MainLayer) + return Effect.runPromise(runnable).catch((error: unknown) => { console.error('Decode error', JSON.stringify(error, null, 2)) return undefined @@ -80,18 +70,8 @@ export async function decodeCalldata({ contractAddress, }), MainLayer, - ) as Effect.Effect< - DecodeResult, - | SqlError - | UnknownNetwork - | ConfigError - | SqlError - | RPCFetchError - | ParseError - | UnsupportedEvent - | FetchTransactionError, - never - > + ) + return Effect.runPromise(runnable).catch((error: unknown) => { console.error('Decode error', JSON.stringify(error, null, 2)) return undefined diff --git a/packages/transaction-decoder/src/sql/abi-store.ts b/packages/transaction-decoder/src/sql/abi-store.ts index ff9efb34..64cf76ee 100644 --- a/packages/transaction-decoder/src/sql/abi-store.ts +++ b/packages/transaction-decoder/src/sql/abi-store.ts @@ -9,16 +9,17 @@ export const make = (strategies: AbiStore['strategies']) => const sql = yield* SqlClient.SqlClient yield* sql` - CREATE TABLE IF NOT EXISTS contractAbi ( - type TEXT NOT NULL, - address TEXT, - event TEXT, - signature TEXT, - chain INTEGER, - abi TEXT, - status TEXT NOT NULL - ) - ` + CREATE TABLE IF NOT EXISTS contractAbi ( + type TEXT NOT NULL, + address TEXT, + event TEXT, + signature TEXT, + chain INTEGER, + abi TEXT, + status TEXT NOT NULL + ) + `.pipe(Effect.catchAll(() => Effect.dieMessage('Failed to create contractAbi table'))) + return AbiStore.of({ strategies, set: (key, value) => diff --git a/packages/transaction-decoder/src/sql/contract-meta-store.ts b/packages/transaction-decoder/src/sql/contract-meta-store.ts index 64569089..5078f12f 100644 --- a/packages/transaction-decoder/src/sql/contract-meta-store.ts +++ b/packages/transaction-decoder/src/sql/contract-meta-store.ts @@ -17,16 +17,16 @@ export const make = () => const publicClient = yield* PublicClient yield* sql` - CREATE TABLE IF NOT EXISTS contractMeta ( - address TEXT NOT NULL, - chain INTEGER NOT NULL, - contractName TEXT, - tokenSymbol TEXT, - decimals INTEGER, - type TEXT, - status TEXT NOT NULL - ) - ` + CREATE TABLE IF NOT EXISTS contractMeta ( + address TEXT NOT NULL, + chain INTEGER NOT NULL, + contractName TEXT, + tokenSymbol TEXT, + decimals INTEGER, + type TEXT, + status TEXT NOT NULL + ) + `.pipe(Effect.catchAll(() => Effect.dieMessage('Failed to create contractMeta table'))) return ContractMetaStore.of({ strategies: { From 7a02b3d4bf6ba257a239218bd84731ce73869d7e Mon Sep 17 00:00:00 2001 From: Gheorghe Pinzaru Date: Thu, 28 Nov 2024 14:30:54 +0700 Subject: [PATCH 2/4] Fetch abi and contract meta in parallel --- .changeset/popular-points-suffer.md | 5 ++ .../src/decoding/log-decode.ts | 47 +++++++++---------- 2 files changed, 27 insertions(+), 25 deletions(-) create mode 100644 .changeset/popular-points-suffer.md diff --git a/.changeset/popular-points-suffer.md b/.changeset/popular-points-suffer.md new file mode 100644 index 00000000..093e87aa --- /dev/null +++ b/.changeset/popular-points-suffer.md @@ -0,0 +1,5 @@ +--- +'@3loop/transaction-decoder': patch +--- + +Fetch contract meta and contract abi in parallel when decoding a log diff --git a/packages/transaction-decoder/src/decoding/log-decode.ts b/packages/transaction-decoder/src/decoding/log-decode.ts index dec43091..cfe94ded 100644 --- a/packages/transaction-decoder/src/decoding/log-decode.ts +++ b/packages/transaction-decoder/src/decoding/log-decode.ts @@ -21,7 +21,7 @@ const decodedLog = (transaction: GetTransactionReturnType, logItem: Log) => Effect.gen(function* () { const chainID = Number(transaction.chainId) - const address = logItem.address + const address = getAddress(logItem.address) let abiAddress = address const implementation = yield* getProxyStorageSlot({ address: getAddress(abiAddress), chainID }) @@ -31,11 +31,22 @@ const decodedLog = (transaction: GetTransactionReturnType, logItem: Log) => abiAddress = implementation.address } - const abiItem = yield* getAndCacheAbi({ - address: abiAddress, - event: logItem.topics[0], - chainID, - }) + const [abiItem, contractData] = yield* Effect.all( + [ + getAndCacheAbi({ + address: abiAddress, + event: logItem.topics[0], + chainID, + }), + getAndCacheContractMeta({ + address, + chainID: Number(transaction.chainId), + }), + ], + { + concurrency: 'unbounded', + }, + ) const { eventName, args: args_ } = yield* Effect.try({ try: () => @@ -98,21 +109,7 @@ const decodedLog = (transaction: GetTransactionReturnType, logItem: Log) => decoded: true, } - return yield* transformLog(transaction, rawLog) - }) - -const transformLog = (transaction: GetTransactionReturnType, log: RawDecodedLog) => - Effect.gen(function* () { - const events = Object.fromEntries(log.events.map((param) => [param.name, param.value])) - - // NOTE: Can use a common parser with branded type evrywhere - const address = getAddress(log.address) - - const contractData = yield* getAndCacheContractMeta({ - address, - chainID: Number(transaction.chainId), - }) - + const events = Object.fromEntries(rawLog.events.map((param) => [param.name, param.value])) return { contractName: contractData?.contractName || null, contractSymbol: contractData?.tokenSymbol || null, @@ -120,12 +117,12 @@ const transformLog = (transaction: GetTransactionReturnType, log: RawDecodedLog) decimals: contractData?.decimals || null, chainID: Number(transaction.chainId), contractType: contractData?.type ?? 'OTHER', - signature: log.signature, + signature: rawLog.signature, event: { - eventName: log.name, - logIndex: log.logIndex, + eventName: rawLog.name, + logIndex: rawLog.logIndex, params: events, - ...(!log.decoded && { decoded: log.decoded }), + ...(!rawLog.decoded && { decoded: rawLog.decoded }), }, } as Interaction }) From 031949fb8b0281aed4eb265462a25a2affd67215 Mon Sep 17 00:00:00 2001 From: Gheorghe Pinzaru Date: Thu, 28 Nov 2024 14:32:35 +0700 Subject: [PATCH 3/4] Update effect to latest version --- .changeset/new-ties-brush.md | 6 ++ apps/web/package.json | 2 +- apps/web/src/lib/decode.ts | 22 ++++- apps/web/src/lib/rpc-provider.ts | 11 +-- packages/transaction-decoder/package.json | 6 +- .../transaction-decoder/src/schema/trace.ts | 3 +- .../src/transaction-loader.ts | 5 +- packages/transaction-interpreter/package.json | 4 +- pnpm-lock.yaml | 88 ++++++++----------- sandbox/quick-start/package.json | 2 +- 10 files changed, 72 insertions(+), 77 deletions(-) create mode 100644 .changeset/new-ties-brush.md diff --git a/.changeset/new-ties-brush.md b/.changeset/new-ties-brush.md new file mode 100644 index 00000000..a706b67a --- /dev/null +++ b/.changeset/new-ties-brush.md @@ -0,0 +1,6 @@ +--- +'@3loop/transaction-interpreter': patch +'@3loop/transaction-decoder': patch +--- + +Bump effect version to latest, and remove the separate schema package diff --git a/apps/web/package.json b/apps/web/package.json index 5c913ec1..36aeb814 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -28,7 +28,7 @@ "autoprefixer": "10.4.15", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", - "effect": "^3.10.9", + "effect": "^3.10.18", "eslint": "^8.57.0", "eslint-config-next": "13.4.19", "jsonata": "^2.0.5", diff --git a/apps/web/src/lib/decode.ts b/apps/web/src/lib/decode.ts index 5f6b55ce..3afbae4e 100644 --- a/apps/web/src/lib/decode.ts +++ b/apps/web/src/lib/decode.ts @@ -13,13 +13,21 @@ import { SourcifyStrategyResolver, UnknownNetwork, UnsupportedEvent, + AbiStore, + AbiParams, + ContractAbiResult, + ContractMetaStore, + ContractMetaParams, + ContractMetaResult, + PublicClient, } from '@3loop/transaction-decoder' import { SqlAbiStore, SqlContractMetaStore } from '@3loop/transaction-decoder/sql' import { Hex } from 'viem' import { DatabaseLive } from './database' -import { SqlError } from '@effect/sql/SqlError' +import { PgClient } from '@effect/sql-pg/PgClient' +import { SqlClient } from '@effect/sql/SqlClient' import { ConfigError } from 'effect/ConfigError' -import { ParseError } from 'effect/ParseResult' +import { SqlError } from '@effect/sql/SqlError' const AbiStoreLive = SqlAbiStore.make({ default: [ @@ -36,7 +44,15 @@ const MetaStoreLive = SqlContractMetaStore.make() const DataLayer = Layer.mergeAll(RPCProviderLive, DatabaseLive) const LoadersLayer = Layer.mergeAll(AbiStoreLive, MetaStoreLive) -const MainLayer = Layer.provideMerge(LoadersLayer, DataLayer) +const MainLayer = Layer.provideMerge(LoadersLayer, DataLayer) as Layer.Layer< + | AbiStore + | ContractMetaStore + | PublicClient + | PgClient + | SqlClient, + ConfigError | SqlError, + never +> export async function decodeTransaction({ chainID, diff --git a/apps/web/src/lib/rpc-provider.ts b/apps/web/src/lib/rpc-provider.ts index 139fc95d..b72c60a0 100644 --- a/apps/web/src/lib/rpc-provider.ts +++ b/apps/web/src/lib/rpc-provider.ts @@ -10,17 +10,11 @@ const providerConfigs: Record = suppor } }, {}) -const providers: Record = {} - export function getProvider(chainID: number): PublicClientObject | null { - let provider = providers[chainID] - if (provider != null) { - return provider - } const url = providerConfigs[chainID]?.rpcUrl if (url != null) { - provider = { + return { client: createPublicClient({ transport: http(url), }), @@ -28,9 +22,6 @@ export function getProvider(chainID: number): PublicClientObject | null { traceAPI: providerConfigs[chainID]?.traceAPI, }, } - - providers[chainID] = provider - return provider } return null diff --git a/packages/transaction-decoder/package.json b/packages/transaction-decoder/package.json index 9051930c..21a6f247 100644 --- a/packages/transaction-decoder/package.json +++ b/packages/transaction-decoder/package.json @@ -55,9 +55,8 @@ "README.md" ], "peerDependencies": { - "@effect/schema": "^0.66.8", "@effect/sql": "^0.18.16", - "effect": "^3.10.9", + "effect": "^3.10.18", "quickjs-emscripten": "^0.29.1", "viem": "^2.7.22" }, @@ -67,13 +66,12 @@ } }, "devDependencies": { - "@effect/schema": "^0.66.16", "@total-typescript/ts-reset": "^0.5.1", "@types/node": "^20.16.3", "@typescript-eslint/eslint-plugin": "^5.62.0", "@typescript-eslint/parser": "^5.62.0", "@vitest/coverage-v8": "0.34.2", - "effect": "^3.10.9", + "effect": "^3.10.18", "eslint": "^8.57.0", "eslint-config-custom": "workspace:*", "eslint-config-prettier": "^8.10.0", diff --git a/packages/transaction-decoder/src/schema/trace.ts b/packages/transaction-decoder/src/schema/trace.ts index 5fea8cb9..3e4e79de 100644 --- a/packages/transaction-decoder/src/schema/trace.ts +++ b/packages/transaction-decoder/src/schema/trace.ts @@ -1,5 +1,4 @@ -import * as Schema from '@effect/schema/Schema' - +import { Schema } from 'effect' const CallType = Schema.Literal('call', 'delegatecall', 'callcode', 'staticcall') const Address = Schema.String // NOTE: Probably we can use a branded type diff --git a/packages/transaction-decoder/src/transaction-loader.ts b/packages/transaction-decoder/src/transaction-loader.ts index dcbca1e5..2cb5b9dd 100644 --- a/packages/transaction-decoder/src/transaction-loader.ts +++ b/packages/transaction-decoder/src/transaction-loader.ts @@ -1,11 +1,10 @@ -import { Effect } from 'effect' -import * as Schema from '@effect/schema/Schema' +import { Effect, Schema } from 'effect' import { RPCFetchError, PublicClient } from './public-client.js' import type { TraceLog, TraceLogTree } from './schema/trace.js' import { EthTrace } from './schema/trace.js' import { transformTraceTree } from './helpers/trace.js' import { GetTransactionReturnType, type Hash } from 'viem' -import { ParseError } from '@effect/schema/ParseResult' +import { ParseError } from 'effect/ParseResult' export const getTransaction = (hash: Hash, chainID: number) => Effect.gen(function* () { diff --git a/packages/transaction-interpreter/package.json b/packages/transaction-interpreter/package.json index e7d2e429..718c822d 100644 --- a/packages/transaction-interpreter/package.json +++ b/packages/transaction-interpreter/package.json @@ -41,7 +41,7 @@ "quickjs-emscripten": "^0.29.2" }, "peerDependencies": { - "effect": "^3.10.9" + "effect": "^3.10.18" }, "devDependencies": { "@babel/core": "^7.25.2", @@ -58,7 +58,7 @@ "chalk": "^5.3.0", "chokidar": "^3.6.0", "commander": "^12.1.0", - "effect": "^3.10.9", + "effect": "^3.10.18", "esbuild": "^0.21.5", "eslint": "^8.57.0", "eslint-config-custom": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75d122a2..7aa9c632 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -71,16 +71,16 @@ importers: version: link:../../packages/transaction-interpreter '@effect/experimental': specifier: ^0.30.16 - version: 0.30.16(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + version: 0.30.16(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)) '@effect/platform': specifier: ^0.69.15 - version: 0.69.15(effect@3.10.9) + version: 0.69.15(effect@3.10.18) '@effect/sql': specifier: ^0.18.16 - version: 0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9) + version: 0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18) '@effect/sql-pg': specifier: ^0.19.5 - version: 0.19.5(@effect/platform@0.69.15(effect@3.10.9))(@effect/sql@0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9))(effect@3.10.9) + version: 0.19.5(@effect/platform@0.69.15(effect@3.10.18))(@effect/sql@0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18))(effect@3.10.18) '@jitl/quickjs-singlefile-browser-release-sync': specifier: ^0.29.2 version: 0.29.2 @@ -133,8 +133,8 @@ importers: specifier: ^2.1.1 version: 2.1.1 effect: - specifier: ^3.10.9 - version: 3.10.9 + specifier: ^3.10.18 + version: 3.10.18 eslint: specifier: ^8.57.0 version: 8.57.0 @@ -213,11 +213,8 @@ importers: dependencies: '@effect/sql': specifier: ^0.18.16 - version: 0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9) + version: 0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18) devDependencies: - '@effect/schema': - specifier: ^0.66.16 - version: 0.66.16(effect@3.10.9)(fast-check@3.22.0) '@total-typescript/ts-reset': specifier: ^0.5.1 version: 0.5.1 @@ -234,8 +231,8 @@ importers: specifier: 0.34.2 version: 0.34.2(vitest@0.34.2) effect: - specifier: ^3.10.9 - version: 3.10.9 + specifier: ^3.10.18 + version: 3.10.18 eslint: specifier: ^8.57.0 version: 8.57.0 @@ -331,8 +328,8 @@ importers: specifier: ^12.1.0 version: 12.1.0 effect: - specifier: ^3.10.9 - version: 3.10.9 + specifier: ^3.10.18 + version: 3.10.18 esbuild: specifier: ^0.21.5 version: 0.21.5 @@ -664,12 +661,6 @@ packages: peerDependencies: effect: ^3.10.9 - '@effect/schema@0.66.16': - resolution: {integrity: sha512-sT/k5NOgKslGPzs3DUaCFuM6g2JQoIIT8jpwEorAZooplPIMK2xIspr7ECz6pp6Dc7Wz/ppXGk7HVyGZQsIYEQ==} - peerDependencies: - effect: ^3.1.3 - fast-check: ^3.13.2 - '@effect/sql-pg@0.19.5': resolution: {integrity: sha512-DWNNvyM+yC8+glr2XKWtQn+gTms2S6SOrN/SOW6E7qQ7rbKX6n3JSxoIkhy3eUuN514onOmiPzcVMyH8foWZMg==} peerDependencies: @@ -3122,8 +3113,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - effect@3.10.9: - resolution: {integrity: sha512-nNRknWPKCBDvAfsoJ/XsxTvIsN9mRdnM02AD6SMPGmHE3dIpnG1lTC/3ywjSYtU7YtBhFV64s2KKaDzdIU8p4Q==} + effect@3.10.18: + resolution: {integrity: sha512-e1FzuPGidu81zD75MecPHFAI3TPd9Gf6ysMnG8zcdU4EyL9W74bKa6/6wbM+OrEElA4ulSDSEDdU4KIgrNIUbw==} electron-to-chromium@1.5.14: resolution: {integrity: sha512-bEfPECb3fJ15eaDnu9LEJ2vPGD6W1vt7vZleSVyFhYuMIKm3vz/g9lt7IvEzgdwj58RjbPKUF2rXTCN/UW47tQ==} @@ -7188,54 +7179,49 @@ snapshots: '@ctrl/tinycolor@3.6.1': {} - '@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))': + '@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4))': dependencies: - '@effect/platform': 0.69.15(effect@3.10.9) - effect: 3.10.9 + '@effect/platform': 0.69.15(effect@3.10.18) + effect: 3.10.18 msgpackr: 1.11.0 optionalDependencies: ws: 8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4) - '@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))': + '@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4))': dependencies: - '@effect/platform': 0.69.15(effect@3.10.9) - effect: 3.10.9 + '@effect/platform': 0.69.15(effect@3.10.18) + effect: 3.10.18 msgpackr: 1.11.0 optionalDependencies: ws: 8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4) - '@effect/platform@0.69.15(effect@3.10.9)': + '@effect/platform@0.69.15(effect@3.10.18)': dependencies: - effect: 3.10.9 + effect: 3.10.18 find-my-way-ts: 0.1.5 multipasta: 0.2.5 - '@effect/schema@0.66.16(effect@3.10.9)(fast-check@3.22.0)': - dependencies: - effect: 3.10.9 - fast-check: 3.22.0 - - '@effect/sql-pg@0.19.5(@effect/platform@0.69.15(effect@3.10.9))(@effect/sql@0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9))(effect@3.10.9)': + '@effect/sql-pg@0.19.5(@effect/platform@0.69.15(effect@3.10.18))(@effect/sql@0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18))(effect@3.10.18)': dependencies: - '@effect/platform': 0.69.15(effect@3.10.9) - '@effect/sql': 0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9) + '@effect/platform': 0.69.15(effect@3.10.18) + '@effect/sql': 0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18) '@opentelemetry/semantic-conventions': 1.27.0 - effect: 3.10.9 + effect: 3.10.18 postgres: 3.4.5 - '@effect/sql@0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)': + '@effect/sql@0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)': dependencies: - '@effect/experimental': 0.30.16(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - '@effect/platform': 0.69.15(effect@3.10.9) + '@effect/experimental': 0.30.16(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)(ws@8.17.1(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + '@effect/platform': 0.69.15(effect@3.10.18) '@opentelemetry/semantic-conventions': 1.27.0 - effect: 3.10.9 + effect: 3.10.18 - '@effect/sql@0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)': + '@effect/sql@0.18.16(@effect/experimental@0.30.16(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)))(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)': dependencies: - '@effect/experimental': 0.30.16(@effect/platform@0.69.15(effect@3.10.9))(effect@3.10.9)(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) - '@effect/platform': 0.69.15(effect@3.10.9) + '@effect/experimental': 0.30.16(@effect/platform@0.69.15(effect@3.10.18))(effect@3.10.18)(ws@8.18.0(bufferutil@4.0.8)(utf-8-validate@6.0.4)) + '@effect/platform': 0.69.15(effect@3.10.18) '@opentelemetry/semantic-conventions': 1.27.0 - effect: 3.10.9 + effect: 3.10.18 '@emmetio/abbreviation@2.3.3': dependencies: @@ -9563,7 +9549,7 @@ snapshots: eastasianwidth@0.2.0: {} - effect@3.10.9: + effect@3.10.18: dependencies: fast-check: 3.22.0 @@ -9827,7 +9813,7 @@ snapshots: eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.1.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.1.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.1.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.1.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.9.0(eslint@8.57.0) eslint-plugin-react: 7.35.0(eslint@8.57.0) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.0) @@ -9875,7 +9861,7 @@ snapshots: is-bun-module: 1.1.0 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.1.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.1.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.1.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node @@ -9962,7 +9948,7 @@ snapshots: eslint: 8.57.0 ignore: 5.2.4 - eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.1.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0): + eslint-plugin-import@2.29.1(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.1.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@5.62.0(eslint@8.57.0)(typescript@5.1.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 diff --git a/sandbox/quick-start/package.json b/sandbox/quick-start/package.json index 8c5be8c1..57e6884b 100644 --- a/sandbox/quick-start/package.json +++ b/sandbox/quick-start/package.json @@ -13,7 +13,7 @@ }, "dependencies": { "@3loop/transaction-decoder": "0.19.4", - "effect": "^3.10.4", + "effect": "^3.10.18", "viem": "^2.21.35" } } From 68278013fecb937cc78249f708f43b1228ba10c4 Mon Sep 17 00:00:00 2001 From: Gheorghe Pinzaru Date: Thu, 28 Nov 2024 14:57:33 +0700 Subject: [PATCH 4/4] Use runtime in playground decoding --- apps/web/src/lib/decode.ts | 23 +++++++++---------- .../src/transformers/tokens.ts | 2 +- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/apps/web/src/lib/decode.ts b/apps/web/src/lib/decode.ts index 3afbae4e..809f0e7d 100644 --- a/apps/web/src/lib/decode.ts +++ b/apps/web/src/lib/decode.ts @@ -1,5 +1,5 @@ import { getProvider, RPCProviderLive } from './rpc-provider' -import { Effect, Layer } from 'effect' +import { Effect, Layer, ManagedRuntime } from 'effect' import { DecodedTransaction, DecodeResult, @@ -54,6 +54,8 @@ const MainLayer = Layer.provideMerge(LoadersLayer, DataLayer) as Layer.Layer< never > +const runtime = ManagedRuntime.make(MainLayer) + export async function decodeTransaction({ chainID, hash, @@ -62,9 +64,9 @@ export async function decodeTransaction({ hash: string }): Promise { // NOTE: For unknonw reason the context of main layer is still missing the SqlClient in the type - const runnable = Effect.provide(decodeTransactionByHash(hash as Hex, chainID), MainLayer) + const runnable = decodeTransactionByHash(hash as Hex, chainID) - return Effect.runPromise(runnable).catch((error: unknown) => { + return runtime.runPromise(runnable).catch((error: unknown) => { console.error('Decode error', JSON.stringify(error, null, 2)) return undefined }) @@ -79,16 +81,13 @@ export async function decodeCalldata({ data: string contractAddress?: string }): Promise { - const runnable = Effect.provide( - calldataDecoder({ - data: data as Hex, - chainID, - contractAddress, - }), - MainLayer, - ) + const runnable = calldataDecoder({ + data: data as Hex, + chainID, + contractAddress, + }) - return Effect.runPromise(runnable).catch((error: unknown) => { + return runtime.runPromise(runnable).catch((error: unknown) => { console.error('Decode error', JSON.stringify(error, null, 2)) return undefined }) diff --git a/packages/transaction-decoder/src/transformers/tokens.ts b/packages/transaction-decoder/src/transformers/tokens.ts index 58ff3fa6..4bf87d46 100644 --- a/packages/transaction-decoder/src/transformers/tokens.ts +++ b/packages/transaction-decoder/src/transformers/tokens.ts @@ -102,7 +102,7 @@ function getTokens(interactions: Interaction[]): Asset[] { ] } - console.error('Unsupported type:', interaction) + console.warn('Unsupported type:', interaction) // TODO: Batch transfers are not supported yet return [] })