{"_id":"@consensys/linea-sdk-viem","_rev":"4-e68f3f565adab4509a47a09c19fac49b","name":"@consensys/linea-sdk-viem","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@consensys/linea-sdk-viem","version":"1.0.0","keywords":["linea","bridge","sdk","viem","ethereum","layer2","zk-rollup","deposit","withdrawal","messaging"],"author":{"name":"Consensys Software Inc."},"license":"(MIT OR Apache-2.0)","_id":"@consensys/linea-sdk-viem@1.0.0","maintainers":[{"name":"gustavorssilva","email":"gustavorssilva09@gmail.com"},{"name":"stanleyyuen","email":"stanley.yuen@consensys.net"},{"name":"jones.ho","email":"jones.ho@consensys.net"},{"name":"rizedr","email":"it@consensys.net"},{"name":"pmkowalski","email":"patrick.kowalski@consensys.net"},{"name":"klejeune-consensys","email":"kevin.le-jeune@consensys.net"},{"name":"victorien-gauch","email":"victorien.gauch@consensys.net"},{"name":"wantedsystem","email":"amine.harty@consensys.net"},{"name":"leo.wang","email":"leo.wang@consensys.net"},{"name":"becali12","email":"nicula.cristi14@gmail.com"},{"name":"andreolf","email":"francesco.andreoli@consensys.net"},{"name":"jluque-npm","email":"jose.luque@consensys.net"},{"name":"consensys-npm","email":"codefi-infra@consensys.net"},{"name":"consensys_jb","email":"belelieu.jonathan@consensys.net"},{"name":"cxalem1","email":"alejandro.gonzalez-ext@consensys.net"}],"homepage":"https://github.com/Consensys/linea-monorepo/tree/main/sdk/sdk-viem#readme","bugs":{"url":"https://github.com/Consensys/linea-monorepo/issues"},"dist":{"shasum":"6704e45b50cde2f056271ecd1281ec9c71bca260","tarball":"https://registry.npmjs.org/@consensys/linea-sdk-viem/-/linea-sdk-viem-1.0.0.tgz","fileCount":10,"integrity":"sha512-E8syM/aWZZvJlyqI2c0AUmK0qZMJJXe0i3ed9AT5nidfveid1TjunxZZrU5Io9M8HqvnOODIJDiCFLkqCxVRbQ==","signatures":[{"sig":"MEQCIGF9ji9tYboqRe2MXRslWWvXwx5T628I3PY+ehTsqDrWAiBqqr3M4+ERqY3/RcGYe3e0o4RdaVuwav+D/SQY/78npA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":435758},"main":"./dist/index.js","_from":"file:consensys-linea-sdk-viem-1.0.0.tgz","types":"./dist/index.d.ts","module":"./dist/index.mjs","exports":{".":{"import":"./dist/index.mjs","require":"./dist/index.js"}},"scripts":{"lint":"eslint .","test":"npx jest --bail --detectOpenHandles","build":"tsup --tsconfig tsconfig.build.json","clean":"rimraf dist node_modules coverage","lint:fix":"eslint --fix ."},"_npmUser":{"name":"victorien-gauch","email":"victorien.gauch@consensys.net"},"_resolved":"/tmp/1b4ee40651e0f547420a27f1c616e0f2/consensys-linea-sdk-viem-1.0.0.tgz","_integrity":"sha512-E8syM/aWZZvJlyqI2c0AUmK0qZMJJXe0i3ed9AT5nidfveid1TjunxZZrU5Io9M8HqvnOODIJDiCFLkqCxVRbQ==","deprecated":"This package is deprecated. Please use @lfdt-lineth/sdk-viem instead: https://www.npmjs.com/package/@lfdt-lineth/sdk-viem","repository":{"url":"git+https://github.com/Consensys/linea-monorepo.git","type":"git","directory":"sdk/sdk-viem"},"_npmVersion":"11.11.0","description":"Viem-based SDK for Linea bridge deposits, withdrawals, claims, and message queries","directories":{},"_nodeVersion":"24.14.1","dependencies":{"@consensys/linea-sdk-core":"1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"30.3.0","tsup":"8.5.1","viem":"2.47.5","ts-jest":"29.4.6","@types/jest":"30.0.0","@consensys/eslint-config":"1.0.0"},"peerDependencies":{"viem":">=2.22.0"},"_npmOperationalInternal":{"tmp":"tmp/linea-sdk-viem_1.0.0_1775832298157_0.33999808883469607","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2026-04-10T14:44:58.050Z","modified":"2026-10-02T21:12:45.651Z","1.0.0":"2026-04-10T14:44:58.313Z"},"bugs":{"url":"https://github.com/Consensys/linea-monorepo/issues"},"author":{"name":"Consensys Software Inc."},"license":"(MIT OR Apache-2.0)","homepage":"https://github.com/Consensys/linea-monorepo/tree/main/sdk/sdk-viem#readme","keywords":["linea","bridge","sdk","viem","ethereum","layer2","zk-rollup","deposit","withdrawal","messaging"],"repository":{"url":"git+https://github.com/Consensys/linea-monorepo.git","type":"git","directory":"sdk/sdk-viem"},"description":"Viem-based SDK for Linea bridge deposits, withdrawals, claims, and message queries","maintainers":[{"email":"gustavorssilva09@gmail.com","name":"gustavorssilva"},{"email":"stanley.yuen@consensys.net","name":"stanleyyuen"},{"email":"jones.ho@consensys.net","name":"jones.ho"},{"email":"it@consensys.net","name":"rizedr"},{"email":"kevin.le-jeune@consensys.net","name":"klejeune-consensys"},{"email":"victorien.gauch@consensys.com","name":"victorien-gauch"},{"email":"amine.harty@consensys.net","name":"wantedsystem"},{"email":"leo.wang@consensys.net","name":"leo.wang"},{"email":"nicula.cristi14@gmail.com","name":"becali12"},{"email":"francesco.andreoli@consensys.net","name":"andreolf"},{"email":"jose.luque@consensys.net","name":"jluque-npm"},{"email":"codefi-infra@consensys.net","name":"consensys-npm"},{"email":"erik.marks@consensys.com","name":"rekmarks-consensys"},{"email":"belelieu.jonathan@consensys.net","name":"consensys_jb"},{"email":"alejandro.gonzalez-ext@consensys.net","name":"cxalem1"}],"readme":"# @consensys/linea-sdk-viem\n\nA TypeScript SDK for interacting with the Linea bridge and messaging system, built on top of [Viem](https://viem.sh/). This package provides high-level actions and decorators for bridging tokens, sending/claiming messages, and querying message status between L1 and L2 on Linea.\n\n> **Note:** This SDK supports both mainnet and testnet environments, including Ethereum Mainnet, Linea Mainnet, Sepolia, and Linea Sepolia. Simply use the appropriate chain from `viem/chains` (e.g., `mainnet`, `linea`, `sepolia`, `lineaSepolia`).\n\n## Installation\n\n```bash\nnpm install @consensys/linea-sdk-viem viem\n# or\nyarn add @consensys/linea-sdk-viem viem\n# or\npnpm add @consensys/linea-sdk-viem viem\n```\n\n> **Note:** `viem@>=2.22.0` is a required peer dependency.\n\n## Usage\n\nImport the functions or decorators you need, and use the appropriate chain for your network (mainnet or testnet):\n\n```ts\nimport { deposit, withdraw, getBlockExtraData, publicActionsL1, walletActionsL2 } from '@consensys/linea-sdk-viem';\nimport { mainnet, linea, sepolia, lineaSepolia } from 'viem/chains';\n\n// Example: Use sepolia and lineaSepolia for testnet\nconst l1Client = createPublicClient({ chain: sepolia, transport: http() });\nconst l2Client = createPublicClient({ chain: lineaSepolia, transport: http() });\n```\n\n---\n\n## Wallet Actions\n\nThese functions require a Viem wallet client (e.g., `createWalletClient`). They are used for sending transactions that modify state, such as deposits, withdrawals, and claiming messages.\n\n### deposit\nDeposits tokens from L1 to L2 or ETH if `token` is set to `zeroAddress`.\n\n```ts\nimport { createWalletClient, http, zeroAddress } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { mainnet, linea, sepolia, lineaSepolia } from 'viem/chains'\nimport { deposit } from '@consensys/linea-sdk-viem'\n\n// Use mainnet/linea for mainnet, sepolia/lineaSepolia for testnet\nconst client = createWalletClient({\n  chain: sepolia,\n  transport: http(),\n});\nconst l2Client = createPublicClient({\n  chain: lineaSepolia,\n  transport: http(),\n});\nconst hash = await deposit(client, {\n  l2Client,\n  account: privateKeyToAccount('0x…'),\n  amount: 1_000_000_000_000n,\n  token: zeroAddress, // Use zeroAddress for ETH\n  to: '0xRecipientAddress',\n  data: '0x', // Optional data\n  fee: 100_000_000n, // Optional fee\n});\n```\n\n### withdraw\nWithdraws tokens from L2 to L1 or ETH if `token` is set to `zeroAddress`.\n\n```ts\nimport { createWalletClient, http, zeroAddress } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { linea, lineaSepolia } from 'viem/chains'\nimport { withdraw } from '@consensys/linea-sdk-viem'\n\n// Use linea for mainnet, lineaSepolia for testnet\nconst client = createWalletClient({\n  chain: lineaSepolia,\n  transport: http(),\n});\nconst hash = await withdraw(client, {\n  account: privateKeyToAccount('0x…'),\n  amount: 1_000_000_000_000n,\n  token: zeroAddress, // Use zeroAddress for ETH\n  to: '0xRecipientAddress',\n  data: '0x', // Optional data\n});\n```\n\n### claimOnL1\nClaim a message on L1.\n\n```ts\nimport { createWalletClient, http, zeroAddress } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { mainnet, sepolia } from 'viem/chains'\nimport { claimOnL1 } from '@consensys/linea-sdk-viem'\n\n// Use mainnet for mainnet, sepolia for testnet\nconst client = createWalletClient({\n  chain: sepolia,\n  transport: http(),\n});\nconst hash = await claimOnL1(client, {\n  account: privateKeyToAccount('0x…'),\n  from: '0xSenderAddress',\n  to: '0xRecipientAddress',\n  fee: 100_000_000n,\n  value: 1_000_000_000_000n,\n  messageNonce: 1n,\n  calldata: '0x',\n  feeRecipient: zeroAddress,\n  messageProof: {\n    root: '0x…',\n    proof: ['0x…'],\n    leafIndex: 0,\n  },\n});\n```\n\n### claimOnL2\nClaim a message on L2.\n\n```ts\nimport { createWalletClient, http, zeroAddress } from 'viem'\nimport { privateKeyToAccount } from 'viem/accounts'\nimport { linea, lineaSepolia } from 'viem/chains'\nimport { claimOnL2 } from '@consensys/linea-sdk-viem'\n\n// Use linea for mainnet, lineaSepolia for testnet\nconst client = createWalletClient({\n  chain: lineaSepolia,\n  transport: http(),\n});\nconst hash = await claimOnL2(client, {\n  account: privateKeyToAccount('0x…'),\n  from: '0xSenderAddress',\n  to: '0xRecipientAddress',\n  fee: 100_000_000n,\n  value: 1_000_000_000_000n,\n  messageNonce: 1n,\n  calldata: '0x',\n  feeRecipient: zeroAddress,\n  // Optional transaction parameters\n  gas: 21000n, // Gas limit\n  maxFeePerGas: 100_000_000n, // Max fee per gas\n  maxPriorityFeePerGas: 1_000_000n, // Max priority fee per gas\n});\n```\n\n---\n\n## Public Actions\n\nThese functions can be called on a Viem public client (e.g., `createPublicClient`). They are used for reading data from the blockchain, such as querying message status, proofs, and events. All actions support both mainnet and testnet chains (mainnet/linea, sepolia/lineaSepolia).\n\n### getBlockExtraData\nReturns formatted Linea block extra data.\n\n```ts\nimport { createPublicClient, http } from 'viem'\nimport { linea, lineaSepolia } from 'viem/chains'\nimport { getBlockExtraData } from '@consensys/linea-sdk-viem'\n\n// Use linea for mainnet, lineaSepolia for testnet\nconst client = createPublicClient({\n  chain: lineaSepolia,\n  transport: http(),\n});\nconst blockExtraData = await getBlockExtraData(client, {\n  blockTag: 'latest',\n});\n```\n\n### getL1ToL2MessageStatus\nReturns the status of an L1 to L2 message on Linea.\n\n```ts\nimport { createPublicClient, http } from 'viem'\nimport { linea, lineaSepolia } from 'viem/chains'\nimport { getL1ToL2MessageStatus } from '@consensys/linea-sdk-viem'\n\nconst client = createPublicClient({\n  chain: lineaSepolia,\n  transport: http(),\n});\nconst messageStatus = await getL1ToL2MessageStatus(client, {\n  messageHash: '0x1234…',\n});\n```\n\n### getL2ToL1MessageStatus\nReturns the status of an L2 to L1 message on Linea.\n\n```ts\nimport { createPublicClient, http } from 'viem'\nimport { mainnet, linea, sepolia, lineaSepolia } from 'viem/chains'\nimport { getL2ToL1MessageStatus } from '@consensys/linea-sdk-viem'\n\nconst client = createPublicClient({\n  chain: sepolia,\n  transport: http(),\n});\nconst l2Client = createPublicClient({\n  chain: lineaSepolia,\n  transport: http(),\n});\nconst messageStatus = await getL2ToL1MessageStatus(client, {\n  l2Client,\n  messageHash: '0x1234…',\n});\n```\n\n### getMessageByMessageHash\nReturns the details of a message by its hash.\n\n```ts\nimport { createPublicClient, http } from 'viem'\nimport { linea, lineaSepolia } from 'viem/chains'\nimport { getMessageByMessageHash } from '@consensys/linea-sdk-viem'\n\nconst client = createPublicClient({\n  chain: lineaSepolia,\n  transport: http(),\n});\nconst message = await getMessageByMessageHash(client, {\n  messageHash: '0x1234…',\n});\n```\n\n### getMessageProof\nReturns the proof of a message sent from L2 to L1.\n\n```ts\nimport { createPublicClient, http } from 'viem'\nimport { mainnet, linea, sepolia, lineaSepolia } from 'viem/chains'\nimport { getMessageProof } from '@consensys/linea-sdk-viem'\n\nconst client = createPublicClient({\n  chain: sepolia,\n  transport: http(),\n});\nconst l2Client = createPublicClient({\n  chain: lineaSepolia,\n  transport: http(),\n});\nconst messageProof = await getMessageProof(client, {\n  l2Client,\n  messageHash: '0x1234…',\n});\n```\n\n### getMessagesByTransactionHash\nReturns the details of messages sent in a transaction by its hash.\n\n```ts\nimport { createPublicClient, http } from 'viem'\nimport { linea, lineaSepolia } from 'viem/chains'\nimport { getMessagesByTransactionHash } from '@consensys/linea-sdk-viem'\n\nconst client = createPublicClient({\n  chain: lineaSepolia,\n  transport: http(),\n});\nconst messages = await getMessagesByTransactionHash(client, {\n  transactionHash: '0x1234…',\n});\n```\n\n### getTransactionReceiptByMessageHash\nReturns the transaction receipt for a message sent by its message hash.\n\n```ts\nimport { createPublicClient, http } from 'viem'\nimport { linea, lineaSepolia } from 'viem/chains'\nimport { getTransactionReceiptByMessageHash } from '@consensys/linea-sdk-viem'\n\nconst client = createPublicClient({\n  chain: lineaSepolia,\n  transport: http(),\n});\nconst receipt = await getTransactionReceiptByMessageHash(client, {\n  messageHash: '0x1234…',\n});\n```\n\n---\n\n## Decorators\n\nDecorators allow you to extend a Viem client (public or wallet) with additional Linea-specific actions. Each decorator can take optional parameters to specify custom contract addresses, which is useful for advanced or non-standard deployments. Decorators and all actions support both mainnet and testnet (Linea Mainnet, Ethereum Mainnet, Sepolia, and Linea Sepolia).\n\n### publicActionsL1 / publicActionsL2\n\nExtend a Viem public client with Linea public actions for L1 or L2. You can optionally pass an object with custom contract addresses:\n\n- **publicActionsL1 parameters:**\n  - `lineaRollupAddress` (Address): Custom Linea rollup contract address on L1\n  - `l2MessageServiceAddress` (Address): Custom L2 message service contract address\n- **publicActionsL2 parameters:**\n  - `lineaRollupAddress` (Address): Custom Linea rollup contract address on L2\n  - `l2MessageServiceAddress` (Address): Custom L2 message service contract address\n\n**Default usage:**\n```ts\nimport { createPublicClient, http } from 'viem';\nimport { mainnet, linea, sepolia, lineaSepolia } from 'viem/chains';\nimport { publicActionsL1, publicActionsL2 } from '@consensys/linea-sdk-viem';\n\nconst l1Client = createPublicClient({ chain: sepolia, transport: http() }).extend(publicActionsL1());\nconst l2Client = createPublicClient({ chain: lineaSepolia, transport: http() }).extend(publicActionsL2());\n```\n\n**With custom contract addresses:**\n```ts\nconst l1Client = createPublicClient({ chain: sepolia, transport: http() }).extend(\n  publicActionsL1({\n    lineaRollupAddress: '0xYourCustomL1Rollup',\n    l2MessageServiceAddress: '0xYourCustomL2MessageService',\n  })\n);\n```\n\n### walletActionsL1 / walletActionsL2\n\nExtend a Viem wallet client with Linea wallet actions for L1 or L2. You can optionally pass an object with custom contract addresses:\n\n- **walletActionsL1 parameters:**\n  - `lineaRollupAddress` (Address): Custom Linea rollup contract address on L1\n  - `l2MessageServiceAddress` (Address): Custom L2 message service contract address\n  - `l1TokenBridgeAddress` (Address): Custom L1 token bridge contract address\n  - `l2TokenBridgeAddress` (Address): Custom L2 token bridge contract address\n- **walletActionsL2 parameters:**\n  - `l2MessageServiceAddress` (Address): Custom L2 message service contract address\n  - `l2TokenBridgeAddress` (Address): Custom L2 token bridge contract address\n\n**Default usage:**\n```ts\nimport { createWalletClient, http } from 'viem';\nimport { mainnet, linea, sepolia, lineaSepolia } from 'viem/chains';\nimport { walletActionsL1, walletActionsL2 } from '@consensys/linea-sdk-viem';\n\nconst l1Wallet = createWalletClient({ chain: sepolia, transport: http() }).extend(walletActionsL1());\nconst l2Wallet = createWalletClient({ chain: lineaSepolia, transport: http() }).extend(walletActionsL2());\n```\n\n**With custom contract addresses:**\n```ts\nconst l1Wallet = createWalletClient({ chain: sepolia, transport: http() }).extend(\n  walletActionsL1({\n    lineaRollupAddress: '0xYourCustomL1Rollup',\n    l2MessageServiceAddress: '0xYourCustomL2MessageService',\n    l1TokenBridgeAddress: '0xYourCustomL1TokenBridge',\n    l2TokenBridgeAddress: '0xYourCustomL2TokenBridge',\n  })\n);\n```\n\n---\n\n## Contributing\n\n1. **Install dependencies:**\n   ```bash\n   pnpm install\n   ```\n2. **Build:**\n   ```bash\n   pnpm run build\n   ```\n3. **Lint:**\n   ```bash\n   pnpm run lint:fix\n   ```\n4. **Test:**\n   ```bash\n   pnpm run test\n   ```\n","readmeFilename":"README.md"}