Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/silver-gifts-chew.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@3loop/transaction-decoder': patch
---

Update ABI strategy errors and log levels
4 changes: 2 additions & 2 deletions packages/transaction-decoder/src/abi-loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ export const AbiLoaderRequestResolver = RequestResolver.makeBatched((requests: A
strategyId: 'address-batch',
})
.pipe(
Effect.tapError(Effect.logWarning),
Effect.tapError(Effect.logDebug),
Effect.orElseSucceed(() => null),
Effect.map((result) => (result ? Either.left(result) : Either.right(req))),
)
Expand Down Expand Up @@ -234,7 +234,7 @@ export const AbiLoaderRequestResolver = RequestResolver.makeBatched((requests: A
strategyId: 'fragment-batch',
})
.pipe(
Effect.tapError(Effect.logWarning),
Effect.tapError(Effect.logDebug),
Effect.orElseSucceed(() => null),
) // If no strategies found, return null
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,9 @@ export const BlockscoutStrategyResolver = (config: {
),
)
} else {
return yield* Effect.fail(new RequestModel.ResolveStrategyABIError('Blockscout', req.address, req.chainId))
return yield* Effect.fail(
new RequestModel.ResolveStrategyABIError('Blockscout', req.address, req.chainId, String(result.cause)),
)
}
}),
'AbiStrategy.BlockscoutStrategyResolver',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,9 @@ export const EtherscanStrategyResolver = (config?: {
),
)
} else {
return yield* Effect.fail(new RequestModel.ResolveStrategyABIError('etherscan', req.address, req.chainId))
return yield* Effect.fail(
new RequestModel.ResolveStrategyABIError('etherscan', req.address, req.chainId, String(result.cause)),
)
}
}),
'AbiStrategy.EtherscanStrategyResolver',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,9 @@ export const EtherscanV2StrategyResolver = (config?: {
),
)
} else {
return yield* Effect.fail(new RequestModel.ResolveStrategyABIError('etherscanV2', req.address, req.chainId))
return yield* Effect.fail(
new RequestModel.ResolveStrategyABIError('etherscanV2', req.address, req.chainId, String(result.cause)),
)
}
}),
'AbiStrategy.EtherscanV2StrategyResolver',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,15 @@ import { erc20Abi, getAddress, getContract } from 'viem'
const getLocalFragments = (service: PublicClient, { address, chainId }: RequestModel.GetContractABIStrategyParams) =>
Effect.gen(function* () {
if (!address)
return yield* Effect.fail(new RequestModel.ResolveStrategyABIError('local-strategy', address, chainId))
return yield* Effect.fail(
new RequestModel.ResolveStrategyABIError('local-strategy', address, chainId, 'Address is required'),
)

const client = yield* service
.getPublicClient(chainId)
.pipe(
Effect.catchAll(() =>
Effect.fail(new RequestModel.ResolveStrategyABIError('local-strategy', address, chainId)),
Effect.catchAll((e) =>
Effect.fail(new RequestModel.ResolveStrategyABIError('local-strategy', address, chainId, String(e))),
),
)

Expand All @@ -23,14 +25,12 @@ const getLocalFragments = (service: PublicClient, { address, chainId }: RequestM
address: getAddress(address),
client: client.client,
}),
catch: () => {
throw new RequestModel.ResolveStrategyABIError('local-strategy', address, chainId)
},
catch: (e) => new RequestModel.ResolveStrategyABIError('local-strategy', address, chainId, String(e)),
})

const decimals = yield* Effect.tryPromise({
try: () => inst.read.decimals(),
catch: () => new RequestModel.ResolveStrategyABIError('local-strategy', address, chainId),
catch: (e) => new RequestModel.ResolveStrategyABIError('local-strategy', address, chainId, String(e)),
})

if (decimals != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,12 @@ export const FourByteStrategyResolver = (): RequestModel.ContractAbiResolverStra
)
} else {
return yield* Effect.fail(
new RequestModel.ResolveStrategyABIError('4byte.directory', req.address, req.chainId),
new RequestModel.ResolveStrategyABIError(
'4byte.directory',
req.address,
req.chainId,
String(result.cause),
),
)
}
}),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,9 @@ export const OpenchainStrategyResolver = (): RequestModel.ContractAbiResolverStr
),
)
} else {
return yield* Effect.fail(new RequestModel.ResolveStrategyABIError('openchain', req.address, req.chainId))
return yield* Effect.fail(
new RequestModel.ResolveStrategyABIError('openchain', req.address, req.chainId, String(result.cause)),
)
}
}),
'AbiStrategy.OpenchainStrategyResolver',
Expand Down
44 changes: 27 additions & 17 deletions packages/transaction-decoder/src/abi-strategy/request-model.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Effect, RateLimiter } from 'effect'
import { Data, Effect, RateLimiter } from 'effect'

export interface FetchABIParams {
readonly chainID: number
Expand All @@ -7,25 +7,35 @@ export interface FetchABIParams {
readonly signature?: string | undefined
}

export class ResolveStrategyABIError {
readonly _tag = 'ResolveStrategyABIError'
constructor(
readonly resolverName: string,
readonly address: string,
readonly chain: number,
) {}
export class ResolveStrategyABIError extends Data.TaggedError('ResolveStrategyABIError')<{
resolver: string
address: string
chainID: number
message: string
}> {
constructor(resolver: string, address: string, chainID: number, message: string) {
super({ resolver, address, chainID, message })
}
}

export class MissingABIStrategyError {
readonly _tag = 'MissingABIStrategyError'
export class MissingABIStrategyError extends Data.TaggedError('MissingABIStrategyError')<{
address: string
chainId: number
strategyId: string
event?: string
signature?: string
message: string
}> {
constructor(
readonly address: string,
readonly chainId: number,
readonly strategyId: string,
readonly event?: string,
readonly signature?: string,
readonly message: string = 'Missing contract ABI',
) {}
address: string,
chainId: number,
strategyId: string,
event?: string,
signature?: string,
message = 'Missing contract ABI',
) {
super({ address, chainId, strategyId, event, signature, message })
}
}

interface FunctionFragmentABI {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,9 @@ export const SourcifyStrategyResolver = (): RequestModel.ContractAbiResolverStra
),
)
} else {
return yield* Effect.fail(new RequestModel.ResolveStrategyABIError('sourcify', req.address, req.chainId))
return yield* Effect.fail(
new RequestModel.ResolveStrategyABIError('sourcify', req.address, req.chainId, String(result.cause)),
)
}
}),
'AbiStrategy.SourcifyStrategyResolver',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export const make = (circuitBreaker: CircuitBreaker, requestPool: RequestPool) =
Effect.catchTag('MissingABIStrategyError', (error) => {
// Log error but don't fail the entire operation
return Effect.gen(function* () {
yield* Effect.logWarning(`Strategy ${strategy.id} found no ABI: ${error.message}`)
yield* Effect.logDebug(`Strategy ${strategy.id} found no ABI: ${error.message}`)
return yield* Effect.succeed(error)
})
}),
Expand Down
2 changes: 1 addition & 1 deletion packages/transaction-decoder/src/contract-meta-loader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ const ContractMetaLoaderRequestResolver = RequestResolver.makeBatched((requests:
strategyId: 'meta-batch',
})
.pipe(
Effect.tapError(Effect.logWarning),
Effect.tapError(Effect.logDebug),
Effect.orElseSucceed(() => null),
)
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export const make = (circuitBreaker: CircuitBreaker, requestPool: RequestPool) =
// Treate MissingMetaError as a success for circuit breaker
Effect.catchTag('MissingMetaError', (error) => {
return Effect.gen(function* () {
yield* Effect.logWarning(`Meta strategy ${strategy.id} found no metadata: ${error.message}`)
yield* Effect.logDebug(`Meta strategy ${strategy.id} found no metadata: ${error.message}`)
return yield* Effect.succeed(error)
})
}),
Expand Down
Loading