{"_id":"@arguslog/sdk-web3","_rev":"2-39eeb393747bed5c39f6b7e7a0200214","name":"@arguslog/sdk-web3","dist-tags":{"latest":"2.0.0"},"versions":{"0.3.0":{"name":"@arguslog/sdk-web3","version":"0.3.0","keywords":["arguslog","error-tracking","web3","ethereum","evm","viem","ethers","solana","monitoring","observability"],"license":"MIT","_id":"@arguslog/sdk-web3@0.3.0","maintainers":[{"name":"petar.nenov","email":"petarnenovpetrov@gmail.com"}],"dist":{"shasum":"02c0bfc3e84d3322ce83f709ae96ffbed33b24b7","tarball":"https://registry.npmjs.org/@arguslog/sdk-web3/-/sdk-web3-0.3.0.tgz","fileCount":67,"integrity":"sha512-ZNkMWCX99oCSctIPfLbK7ctVRfLcMLsU1Sl008u32UttjL6rMxpxJn7W2MmP3aYYmQKvmkb+lqncAjPdcI5TPQ==","signatures":[{"sig":"MEUCIAyExZrMUxerDPVa+6wWoSKRjDjrr0QnutgsvwYEX351AiEAwVbX8bU5Xk4VkiaAbm7VIiM+CHa4IKXp4rQS+O7hbsA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":179755},"main":"./dist/index.js","type":"module","_from":"file:arguslog-sdk-web3-0.3.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"scripts":{"dev":"tsc -p tsconfig.build.json --watch","lint":"eslint src","test":"vitest run","build":"tsc -p tsconfig.build.json","clean":"rm -rf dist .turbo","typecheck":"tsc --noEmit","test:coverage":"vitest run --coverage"},"_npmUser":{"name":"petar.nenov","email":"petarnenovpetrov@gmail.com"},"_resolved":"/tmp/0707b721cef8723a3482515698fc34d7/arguslog-sdk-web3-0.3.0.tgz","_integrity":"sha512-ZNkMWCX99oCSctIPfLbK7ctVRfLcMLsU1Sl008u32UttjL6rMxpxJn7W2MmP3aYYmQKvmkb+lqncAjPdcI5TPQ==","_npmVersion":"10.9.7","description":"Arguslog Web3 SDK — rich error decoding for viem, ethers v6, @solana/web3.js + Anchor, wagmi, WalletConnect (chain, wallet, contract, decoded revert / Anchor / program error)","directories":{},"sideEffects":false,"_nodeVersion":"22.22.2","dependencies":{"@arguslog/sdk-core":"1.0.2","@arguslog/sdk-browser":"1.1.3"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"viem":"^2.21.0","ethers":"^6.13.0","vitest":"^3.2.4","typescript":"^5.6.0","@arguslog/tsconfig":"0.0.0","@vitest/coverage-v8":"^3.2.4","@arguslog/eslint-config":"0.0.0"},"peerDependencies":{"viem":"^2.0.0","ethers":"^6.0.0"},"peerDependenciesMeta":{"viem":{"optional":true},"ethers":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/sdk-web3_0.3.0_1778369933827_0.0623643185893934","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@arguslog/sdk-web3","version":"2.0.0","description":"Arguslog Web3 SDK — rich error decoding for viem, ethers v6, @solana/web3.js + Anchor, wagmi, WalletConnect (chain, wallet, contract, decoded revert / Anchor / program error)","license":"MIT","type":"module","main":"./dist/index.js","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"sideEffects":false,"dependencies":{"@arguslog/sdk-browser":"2.0.0","@arguslog/sdk-core":"2.0.0"},"peerDependencies":{"ethers":"^6.0.0","viem":"^2.0.0"},"peerDependenciesMeta":{"ethers":{"optional":true},"viem":{"optional":true}},"devDependencies":{"@vitest/coverage-v8":"^3.2.4","ethers":"^6.13.0","typescript":"^5.6.0","viem":"^2.21.0","vitest":"^3.2.4","@arguslog/eslint-config":"0.0.0","@arguslog/tsconfig":"0.0.0"},"publishConfig":{"access":"public"},"keywords":["arguslog","error-tracking","web3","ethereum","evm","viem","ethers","solana","monitoring","observability"],"repository":{"type":"git","url":"git+https://github.com/petarnenov/arguslog-sdks.git","directory":"packages/sdk-web3"},"homepage":"https://arguslog.org","bugs":{"url":"https://github.com/petarnenov/arguslog-sdks/issues"},"scripts":{"build":"tsc -p tsconfig.build.json","dev":"tsc -p tsconfig.build.json --watch","lint":"eslint src","typecheck":"tsc --noEmit","test":"vitest run","test:coverage":"vitest run --coverage","clean":"rm -rf dist .turbo"},"_id":"@arguslog/sdk-web3@2.0.0","_integrity":"sha512-a+n5iTty5WpmmRsj/KmasZbgSTF8EPd71e/E+M+NRNbJ1hUQ2RrQAvsnKuC66OAczhQkuogh2k1fIreKLF6/Lg==","_resolved":"/tmp/a6ef53cd754c5a4b984c5a6a902ca010/arguslog-sdk-web3-2.0.0.tgz","_from":"file:arguslog-sdk-web3-2.0.0.tgz","_nodeVersion":"22.22.2","_npmVersion":"10.9.7","dist":{"integrity":"sha512-a+n5iTty5WpmmRsj/KmasZbgSTF8EPd71e/E+M+NRNbJ1hUQ2RrQAvsnKuC66OAczhQkuogh2k1fIreKLF6/Lg==","shasum":"4c2e2dbbd30d66f9a5ca2e7c979c80cf94f76566","tarball":"https://registry.npmjs.org/@arguslog/sdk-web3/-/sdk-web3-2.0.0.tgz","fileCount":68,"unpackedSize":183731,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQCGRLaFw2VAC3nHouti9d/CdOYI1eLGxDL2CQUwemOSlgIhAL4dP0Y5qU2/A202WG6Hkxf0Sx1AfSSgFQYIhHW30tvB"}]},"_npmUser":{"name":"petar.nenov","email":"petarnenovpetrov@gmail.com"},"directories":{},"maintainers":[{"name":"petar.nenov","email":"petarnenovpetrov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk-web3_2.0.0_1778619542780_0.1616140255772538"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-09T23:38:53.705Z","modified":"2026-05-12T20:59:03.092Z","0.3.0":"2026-05-09T23:38:53.965Z","2.0.0":"2026-05-12T20:59:02.954Z"},"license":"MIT","keywords":["arguslog","error-tracking","web3","ethereum","evm","viem","ethers","solana","monitoring","observability"],"description":"Arguslog Web3 SDK — rich error decoding for viem, ethers v6, @solana/web3.js + Anchor, wagmi, WalletConnect (chain, wallet, contract, decoded revert / Anchor / program error)","maintainers":[{"name":"petar.nenov","email":"petarnenovpetrov@gmail.com"}],"readme":"# @arguslog/sdk-web3\n\n[![npm version](https://img.shields.io/npm/v/@arguslog/sdk-web3.svg)](https://www.npmjs.com/package/@arguslog/sdk-web3)\n[![license](https://img.shields.io/npm/l/@arguslog/sdk-web3.svg)](https://github.com/petarnenov/arguslog/blob/main/LICENSE)\n\n> Sentry sees `Error: transaction failed`. Arguslog tells you **why**: the chain, the wallet,\n> the contract / program, the function / instruction, the args, and the **decoded** revert\n> reason. Built on top of `@arguslog/sdk-browser`. Native support for\n> [viem](https://viem.sh), [ethers v6](https://docs.ethers.org/v6/),\n> [@solana/web3.js](https://solana-labs.github.io/solana-web3.js/) and\n> [Anchor](https://www.anchor-lang.com/).\n\n```text\nContractFunctionRevertedError: ERC20InsufficientBalance\n\n  Chain:    1 (Ethereum mainnet)\n  Wallet:   MetaMask via window.ethereum\n  Contract: 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 (USDC)\n  Function: transfer(address, uint256)\n  Args:     [0xRecipient…, 100000000]   // 100 USDC\n\n  Revert decoded:\n    errorName:  ERC20InsufficientBalance\n    sender:     0xUser…\n    balance:    50000000     // 50 USDC\n    needed:     100000000    // 100 USDC\n\n  Breadcrumbs leading up:\n    [12:30:01] web3.wallet  connected MetaMask, chainId=1\n    [12:30:05] ui.click     button \"Send 100 USDC\"\n    [12:30:06] web3.error   Reverted: ERC20InsufficientBalance\n```\n\n## Install\n\n```bash\npnpm add @arguslog/sdk-browser @arguslog/sdk-web3\n# plus whichever client(s) you use:\npnpm add viem                # EVM, modern\npnpm add ethers              # EVM, legacy\npnpm add @solana/web3.js     # Solana\npnpm add @coral-xyz/anchor   # Solana, Anchor framework (optional)\n```\n\nAll four are **optional peer dependencies** — install only what you actually use. The\ndecoder operates on duck-typed objects, so it never imports any of them at runtime; you\ncan mix EVM and Solana in the same app and both error sources will round-trip through\n`captureWeb3Error`. The auto-wrap helper currently targets viem's `WalletClient` API\n(EVM); Solana support today is via `captureWeb3Error()` in your own `try/catch`.\n\n## Quick start\n\n```ts\nimport { init } from '@arguslog/sdk-browser';\nimport { initWeb3 } from '@arguslog/sdk-web3';\nimport { createWalletClient, custom } from 'viem';\nimport { mainnet } from 'viem/chains';\n\n// 1. Standard browser SDK init.\ninit({\n  dsn: 'arguslog://<publicKey>@<host>/api/<projectId>',\n  integrations: ['globalHandlers', 'autoBreadcrumbs'],\n});\n\n// 2. Wrap your wallet client + listen to provider events.\nconst rawClient = createWalletClient({\n  chain: mainnet,\n  transport: custom(window.ethereum),\n});\n\nconst { walletClient } = initWeb3({\n  provider: window.ethereum,\n  walletClient: rawClient,\n});\n\n// 3. Use walletClient as usual — every error is auto-captured with full context.\nawait walletClient!.writeContract({\n  address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n  abi: usdcAbi,\n  functionName: 'transfer',\n  args: ['0xRecipient', 100_000000n],\n});\n```\n\n### Wire EVERYTHING in one call\n\n`initWeb3` accepts every Phase 1–4 input and returns each one wrapped. Pass whatever you\nhave — anything you omit is skipped, so the same call works for an EVM-only app, a\nSolana-only app, or a hybrid:\n\n```ts\nconst {\n  walletClient, // viem WalletClient — write methods auto-captured\n  publicClient, // viem PublicClient — read failures auto-captured\n  ethersContracts, // [Contract, ...] — every method auto-captured\n  solanaConnection, // @solana/web3.js Connection — sendTx/sim/confirm auto-captured\n  anchorPrograms, // [Program, ...] — every methods.X.rpc/.simulate auto-captured\n  uninstall,\n} = initWeb3({\n  provider: window.ethereum,\n  walletClient: rawWalletClient,\n  publicClient: rawPublicClient,\n  ethersContracts: [erc20Contract, ammContract],\n  solanaConnection: rawSolanaConnection,\n  solanaWallet: phantomAdapter,\n  anchorPrograms: [swapProgram],\n  queryClient, // wagmi mutation reporter\n  wrapOptions: { chain: { id: 1, name: 'Ethereum' } },\n});\n```\n\n`uninstall()` tears down every listener installed in this call — call it on hot-reload or\non user logout.\n\n## Manual capture (ethers, Solana, raw provider, …)\n\nWhen you can't / don't want to wrap a client, capture errors yourself in a `try/catch`:\n\n```ts\nimport { captureWeb3Error } from '@arguslog/sdk-web3';\n\n// EVM example with ethers v6\ntry {\n  await contract.transfer(recipient, amount);\n} catch (err) {\n  captureWeb3Error(err, {\n    chain: { id: 1, name: 'Ethereum mainnet' },\n    wallet: 'metamask',\n    contract: contract.target as string,\n    functionName: 'transfer',\n    args: [recipient, amount],\n  });\n  throw err;\n}\n\n// Solana example with @solana/web3.js + Anchor\ntry {\n  await program.methods.swapTokens(amountIn, minOut).rpc();\n} catch (err) {\n  captureWeb3Error(err, {\n    chain: { id: 'mainnet-beta', name: 'Solana mainnet' },\n    wallet: 'phantom',\n    contract: program.programId.toBase58(),\n    functionName: 'swapTokens',\n    args: [amountIn, minOut],\n  });\n  throw err;\n}\n```\n\nThe decoder runs in this order: **viem** (richest typed errors) → **ethers v6** (`.code`\nfield) → **Solana** (Anchor / wallet adapter / log parser) → generic `Error.message`.\nWhatever it extracts goes onto the captured event as **tags** (searchable: `web3.kind`,\n`web3.chain`, `web3.wallet`, `web3.contract`) and as a rich **breadcrumb** (the full\nstructured data).\n\n## What `initWeb3` actually wires\n\n| Wired thing                           | Effect                                                                                                                                                                                                                                            |\n| ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| EIP-1193 `accountsChanged`            | Breadcrumb with the (truncated) new address. Empty array → \"wallet disconnected\" at warning level.                                                                                                                                                |\n| EIP-1193 `chainChanged`               | Breadcrumb with hex + decoded decimal chain id. Sentry-style \"you switched mid-flow\" detection.                                                                                                                                                   |\n| EIP-1193 `connect`/`disconnect`       | Breadcrumbs for session boundaries.                                                                                                                                                                                                               |\n| WalletConnect v2 session events       | `display_uri`, `session_update`, `session_event`, `session_delete` (warning), `session_expire` (warning), `session_request*`, `session_authenticate`.                                                                                             |\n| viem `WalletClient` writes            | `writeContract` / `sendTransaction` / `deployContract` / `signMessage` / `signTypedData` / `signTransaction` / `prepareTransactionRequest` — try/catch each, on throw → `captureWeb3Error`; on success → `web3.tx` / `web3.sign` breadcrumb.      |\n| viem `PublicClient` reads             | `readContract` / `simulateContract` / `estimateGas` / `estimateContractGas` / `call` / `waitForTransactionReceipt` / `getTransactionReceipt` / `getTransaction` — failures captured (successes silent — read calls fire too often to breadcrumb). |\n| ethers v6 `Contract` methods          | Every callable on the contract is wrapped; ERC20 reads (`balanceOf`, `totalSupply`, `allowance`, `decimals`, `symbol`, `name`) skipped by default.                                                                                                |\n| `@coral-xyz/anchor` `Program.methods` | Builder-chain interception: `methods.X.rpc()` / `.simulate()` / `.transaction()` are instrumented with the program ID as the contract field.                                                                                                      |\n| `@solana/web3.js Connection`          | `sendTransaction` / `sendRawTransaction` / `simulateTransaction` / `confirmTransaction` — errors captured + success breadcrumbs.                                                                                                                  |\n| `@solana/wallet-adapter-base`         | `connect`, `disconnect`, `error`, `readyStateChange` adapter events.                                                                                                                                                                              |\n| wagmi v2 mutation cache               | Subscribes to `useWriteContract` / `useSendTransaction` / `useSignMessage` / `useSwitchChain` / `useConnect` / `useDisconnect` mutations; routes errors and successes through Arguslog without per-component try/catch.                           |\n\nRead methods on the wallet client (`getBalance`, `getBlock`, etc.) pass through unchanged\n— RPC calls are already breadcrumbed by the `fetch` integration in\n`@arguslog/sdk-browser`.\n\n## Decoded error kinds\n\n`captureWeb3Error` emits a stable `web3.kind` tag the dashboard can group on:\n\n| Kind                           | Source mapping                                                                                                                                                                                                                                               |\n| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `user.rejected`                | viem `UserRejectedRequestError`, ethers `ACTION_REJECTED`, viem `TransactionRejectedRpcError`                                                                                                                                                                |\n| `wallet.notConnected`          | (reserved — emitted by Phase 3 wagmi adapter)                                                                                                                                                                                                                |\n| `chain.mismatch`               | viem `ChainMismatchError`                                                                                                                                                                                                                                    |\n| `contract.reverted`            | viem `ContractFunctionRevertedError` (with `errorName` + `args`), ethers `CALL_EXCEPTION`                                                                                                                                                                    |\n| `tx.executionFailed`           | viem `TransactionExecutionError`                                                                                                                                                                                                                             |\n| `tx.replacementUnderpriced`    | ethers `REPLACEMENT_UNDERPRICED`                                                                                                                                                                                                                             |\n| `tx.nonceExpired`              | viem `NonceTooLowError` / `NonceTooHighError`, ethers `NONCE_EXPIRED`                                                                                                                                                                                        |\n| `tx.insufficientFunds`         | viem `InsufficientFundsError`, ethers `INSUFFICIENT_FUNDS`                                                                                                                                                                                                   |\n| `gas.estimateFailed`           | viem `EstimateGasExecutionError`, ethers `UNPREDICTABLE_GAS_LIMIT`                                                                                                                                                                                           |\n| `rpc.rateLimit`                | viem `RpcRequestError` / `HttpRequestError` with status 429                                                                                                                                                                                                  |\n| `rpc.timeout`                  | viem `RpcRequestError` / `HttpRequestError`, ethers `NETWORK_ERROR` / `TIMEOUT` / `SERVER_ERROR`                                                                                                                                                             |\n| `rpc.invalidParams`            | viem `InvalidParamsRpcError`                                                                                                                                                                                                                                 |\n| `solana.programError`          | Solana custom program errors decoded from logs (`Program X failed: custom program error: 0xN`), `InstructionError` JSON-RPC variants, generic non-Anchor program failures.                                                                                   |\n| `solana.anchorError`           | `@coral-xyz/anchor` `AnchorError` — both the typed object (`_isAnchorError: true`) AND the parsed log line (`Program log: AnchorError caused by account: X. Error Code: …`). Carries `errorCode`, `errorNumber`, `origin`, `errorMessage`, `comparedValues`. |\n| `solana.simulationFailed`      | `Connection.simulateTransaction` preflight rejected the tx.                                                                                                                                                                                                  |\n| `solana.blockhashExpired`      | `TransactionExpiredBlockheightExceededError` — tx not landed in time, retryable.                                                                                                                                                                             |\n| `solana.computeBudgetExceeded` | Compute units exceeded the per-tx budget.                                                                                                                                                                                                                    |\n| `solana.insufficientLamports`  | `InsufficientFundsForRent` or \"insufficient lamports\" message — account doesn't have enough SOL for rent or transfer.                                                                                                                                        |\n| `unknown`                      | Anything we couldn't map — original error name / code preserved on the payload.                                                                                                                                                                              |\n\n## Phase 3 — wagmi, Solana auto-wrap, WalletConnect\n\n### wagmi v2 reporter\n\nSubscribe once at app boot and every wagmi mutation error — `useWriteContract`,\n`useSendTransaction`, `useSignMessage`, `useSwitchChain`, etc. — flows into Arguslog with\nthe right context extracted from the mutation variables. No per-component try/catch.\n\n```ts\nimport { QueryClient } from '@tanstack/react-query';\nimport { installWagmiReporter } from '@arguslog/sdk-web3';\n\nconst queryClient = new QueryClient();\ninstallWagmiReporter(queryClient, { wallet: 'metamask', chain: { id: 1, name: 'Ethereum' } });\n```\n\nTracked mutation keys: `writeContract`, `sendTransaction`, `signMessage`, `signTypedData`,\n`switchChain`, `connect`, `disconnect`. Untracked queries / user mutations pass through\nsilently.\n\n### `wrapSolanaConnection`\n\nCounterpart to `wrapWalletClient`, for `@solana/web3.js`:\n\n```ts\nimport { Connection, clusterApiUrl } from '@solana/web3.js';\nimport { wrapSolanaConnection } from '@arguslog/sdk-web3';\n\nconst connection = wrapSolanaConnection(new Connection(clusterApiUrl('mainnet-beta')), {\n  wallet: 'phantom',\n  chain: { id: 'mainnet-beta', name: 'Solana mainnet' },\n});\n\n// sendTransaction / sendRawTransaction / simulateTransaction / confirmTransaction errors\n// are auto-captured with chain + wallet + decoded program logs.\n```\n\n### `wrapEthersContract`\n\nFor ethers v6 contract instances — auto-instruments every callable on the contract so\nboth writes and reads that fail land in Arguslog with the contract address and method name\nattached:\n\n```ts\nimport { Contract } from 'ethers';\nimport { wrapEthersContract } from '@arguslog/sdk-web3';\n\nconst erc20 = wrapEthersContract(new Contract(addr, abi, signer), {\n  wallet: 'metamask',\n  chain: { id: 1, name: 'Ethereum' },\n});\n\nawait erc20.transfer(recipient, amount); // auto-captures revert / user rejection / RPC error\n```\n\nStandard ERC20 reads (`balanceOf`, `totalSupply`, `allowance`, `decimals`, `symbol`,\n`name`) are skipped by default to avoid breadcrumb noise — pass `skip: new Set()` to wrap\nthem too.\n\n### `wrapAnchorProgram`\n\nFor `@coral-xyz/anchor` programs — wraps `program.methods` so every instruction call's\nterminal `.rpc()` / `.simulate()` / `.transaction()` is auto-instrumented with the program\nID as the contract field:\n\n```ts\nimport { Program } from '@coral-xyz/anchor';\nimport { wrapAnchorProgram } from '@arguslog/sdk-web3';\n\nconst program = wrapAnchorProgram(new Program(idl, programId, provider), {\n  wallet: 'phantom',\n  chain: { id: 'mainnet-beta', name: 'Solana mainnet' },\n});\n\nawait program.methods.swap(amountIn, minOut).accounts({...}).rpc();\n// AnchorError logs are decoded via the Solana decoder; success leaves a `web3.tx` breadcrumb.\n```\n\n### `wrapPublicClient`\n\nFor viem `PublicClient` — captures READ-side failures (revert reasons surfaced by\n`simulateContract`, gas-estimation reverts, RPC timeouts on `waitForTransactionReceipt`).\nSuccessful reads are not breadcrumbed (read calls happen constantly):\n\n```ts\nimport { createPublicClient, http } from 'viem';\nimport { mainnet } from 'viem/chains';\nimport { wrapPublicClient } from '@arguslog/sdk-web3';\n\nconst publicClient = wrapPublicClient(createPublicClient({ chain: mainnet, transport: http() }), {\n  chain: { id: 1, name: 'Ethereum' },\n});\n```\n\n### `installSolanaWalletBreadcrumbs`\n\nListen to `@solana/wallet-adapter-base` adapter events:\n\n```ts\nimport { useWallet } from '@solana/wallet-adapter-react';\nimport { installSolanaWalletBreadcrumbs } from '@arguslog/sdk-web3';\n\nconst { wallet } = useWallet();\nuseEffect(() => {\n  if (!wallet?.adapter) return;\n  return installSolanaWalletBreadcrumbs(wallet.adapter);\n}, [wallet]);\n```\n\n`connect`, `disconnect`, `error`, `readyStateChange` events become `web3.wallet`\nbreadcrumbs.\n\n### `installWalletConnectBreadcrumbs`\n\nWalletConnect v2 providers fire session-lifecycle events that EIP-1193 doesn't define.\nLayer this on top of `installProviderBreadcrumbs` for the WC-specific signals\n(`display_uri`, `session_event`, `session_update`, `session_delete`, `session_expire`).\n\n```ts\nimport { installProviderBreadcrumbs, installWalletConnectBreadcrumbs } from '@arguslog/sdk-web3';\n\ninstallProviderBreadcrumbs(wcProvider); // standard EIP-1193 events\ninstallWalletConnectBreadcrumbs(wcProvider); // + WC session lifecycle\n```\n\n`initWeb3` auto-detects WC providers and installs both, so the typical app only ever calls\n`initWeb3` once.\n\n## Roadmap\n\n- **Phase 1** ✅ — viem + ethers v6 decoders, EIP-1193 provider events, `wrapWalletClient`.\n- **Phase 2** ✅ — Solana support via `@solana/web3.js` + Anchor; wallet adapter errors;\n  program-log parsing (Anchor + custom-error hex codes).\n- **Phase 3** ✅ — wagmi v2 mutation cache reporter, `wrapSolanaConnection`,\n  `installSolanaWalletBreadcrumbs`, WalletConnect lifecycle breadcrumbs.\n- **Phase 4** ✅ — full auto-breadcrumb coverage: success-path breadcrumbs across every\n  wrapper, plus `wrapEthersContract`, `wrapAnchorProgram`, `wrapPublicClient` so reads,\n  writes, simulations, confirmations, signs and chain switches all flow into the\n  breadcrumb timeline as a coherent narrative leading up to any failure.\n- **Phase 5** — server-side ABI / Anchor IDL upload → richer decoding of custom errors the\n  client-side bundle didn't include; first-class wagmi `connector` event listening.\n\n## License\n\nMIT — see [LICENSE](https://github.com/petarnenov/arguslog/blob/main/LICENSE).\n","readmeFilename":"README.md","homepage":"https://arguslog.org","repository":{"type":"git","url":"git+https://github.com/petarnenov/arguslog-sdks.git","directory":"packages/sdk-web3"},"bugs":{"url":"https://github.com/petarnenov/arguslog-sdks/issues"}}