{"id":51654706,"url":"https://github.com/fireblocks/seismic-sdk","last_synced_at":"2026-07-14T08:04:00.095Z","repository":{"id":361799506,"uuid":"1225771778","full_name":"fireblocks/seismic-sdk","owner":"fireblocks","description":"Fireblocks SDK to integrate with Seismic network","archived":false,"fork":false,"pushed_at":"2026-06-01T09:09:14.000Z","size":788,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-01T11:10:48.608Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fireblocks.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-30T16:12:18.000Z","updated_at":"2026-05-18T13:13:04.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fireblocks/seismic-sdk","commit_stats":null,"previous_names":["fireblocks/seismic-sdk"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/fireblocks/seismic-sdk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fireblocks%2Fseismic-sdk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fireblocks%2Fseismic-sdk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fireblocks%2Fseismic-sdk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fireblocks%2Fseismic-sdk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fireblocks","download_url":"https://codeload.github.com/fireblocks/seismic-sdk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fireblocks%2Fseismic-sdk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35451879,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-14T02:00:06.603Z","response_time":114,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-07-14T08:03:59.477Z","updated_at":"2026-07-14T08:04:00.089Z","avatar_url":"https://github.com/fireblocks.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Fireblocks × Seismic SDK\n\nA Node.js SDK for integrating [Fireblocks](https://www.fireblocks.com/) MPC wallets with [Seismic](https://seismic.systems/) - a privacy-preserving, EVM-compatible blockchain that encrypts transaction calldata inside a TEE.\n\n---\n\n## Overview\n\nSeismic is fully EVM-compatible (chain ID 5124, native ETH, secp256k1) with one key difference: shielded transactions use type `0x4A` with AES-256-GCM encrypted calldata. Balances of `suint256` tokens (SRC-20) are stored as ciphertext on-chain and require authenticated reads to decrypt.\n\nFireblocks vaults never expose raw private keys. This SDK bridges the gap:\n\n- **Encryption key derivation**: signs a fixed seed message via Fireblocks RAW signing → SHA-256(signature) → stable `encryptionSk`. Reproducible across sessions thanks to [Fireblocks signature caching](https://developers.fireblocks.com/reference/caching-signatures#caching-signatures) (backend-cached, no TTL); never written to disk.\n- **SRC-20 balance reads**: Fireblocks signs an EIP-191 message off-chain (no transaction nonce); the SRC-20 contract verifies via `ecrecover` before decrypting the shielded balance.\n- **Shielded transfers**: [`seismic-viem`](https://www.npmjs.com/package/seismic-viem) uses `encryptionSk` for ECDH with the Seismic TEE and emits type-0x4A transactions with encrypted calldata.\n- **SRC-20 viewing key**: register a stable AES key in the Seismic Directory precompile so all incoming Transfer events are encrypted to it - enables zero-N+1 transaction history with decrypted amounts for both sent and received transfers.\n\n---\n\n## Quick Start\n\n### Local (Node.js)\n\n```bash\nnpm install\ncp .env.example .env   # fill in your Fireblocks credentials\nnpm run dev            # watch build + auto-restart server\n```\n\n### Docker\n\n```bash\ncp .env.example .env   # fill in your Fireblocks credentials\ndocker build -t seismic-sdk .\ndocker run -d \\\n  --name seismic-sdk \\\n  -p 8000:8000 \\\n  --env-file .env \\\n  -v $(pwd)/fireblocks_secret.key:/usr/src/app/fireblocks_secret.key:ro \\\n  seismic-sdk\n```\n\nThe server starts on `http://localhost:8000` (configurable via `PORT`).  \nSwagger UI: `http://localhost:8000/api-docs` (REST API endpoints)  \nTypeDoc: `http://localhost:8000/docs` (SDK library API docs - run `npm run docs` first)\n\n---\n\n## Environment Variables\n\n| Variable                              | Required | Description                                                                                                                                                                                                                                               |\n| ------------------------------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `FIREBLOCKS_API_USER_KEY`             | ✓        | Fireblocks API key                                                                                                                                                                                                                                        |\n| `FIREBLOCKS_API_USER_SECRET_KEY_PATH` | ✓        | Path to Fireblocks RSA private key file                                                                                                                                                                                                                   |\n| `BASE_PATH`                           |          | `US` \\| `EU` \\| `SANDBOX` (default: `US`)                                                                                                                                                                                                                 |\n| `NETWORK`                             |          | `testnet` (default — opt-out) \\| `mainnet` (not yet live, will throw at startup). Omitting `NETWORK` selects testnet. Set `NETWORK=mainnet` only once Seismic mainnet is live.                                                                            |\n| `RPC_URL`                             |          | Seismic RPC endpoint (defaults: testnet=`https://testnet-1.seismictest.net/rpc`, mainnet=pending)                                                                                                                                                         |\n| `PORT`                                |          | HTTP server port (default: `8000`)                                                                                                                                                                                                                        |\n| `LOG_LEVEL`                           |          | `DEBUG` \\| `INFO` \\| `WARN` \\| `ERROR` \\| `NONE` (case-insensitive, default: `INFO`)                                                                                                                                                                      |\n| `SKIP_DETERMINISM_CHECK`              |          | Skip signature-caching verification at startup (default: `false`). Only set to `true` if you have confirmed your Fireblocks workspace has [signature caching](https://developers.fireblocks.com/reference/caching-signatures#caching-signatures) enabled. |\n| `SOCIALSCAN_API_KEY`                  |          | SocialScan Explorer API key - required for ERC-20 transaction history. Get one at [developer.socialscan.io](https://developer.socialscan.io)                                                                                                              |\n| `TX_LOG_DIR`                          |          | Directory where `tx-log.ndjson` is written on every broadcast (default: `.`). Each line: `{ timestamp, vault, type, to, amount, contract?, nonce?, txHash }`                                                                                              |\n| `HTTP_TIMEOUT`                        |          | HTTP client timeout in milliseconds (default: `30000`)                                                                                                                                                                                                    |\n| `HTTP_USER_AGENT`                     |          | HTTP `User-Agent` header (default: `@fireblocks/seismic-sdk/\u003cversion\u003e`)                                                                                                                                                                                   |\n\n---\n\n## REST API\n\nAll routes are mounted at `/api`. Full interactive docs at `GET /api-docs` (Swagger UI).\n\n### Vault\n\n| Method | Route                      | Description                                               |\n| ------ | -------------------------- | --------------------------------------------------------- |\n| `GET`  | `/api/:vaultId/address`    | Vault's Seismic/ETH address (derived from MPC public key) |\n| `GET`  | `/api/:vaultId/public-key` | Vault's compressed secp256k1 MPC public key               |\n\n### Balances\n\n| Method | Route                          | Description                                         |\n| ------ | ------------------------------ | --------------------------------------------------- |\n| `GET`  | `/api/:vaultId/token-balances` | sUSDC + ERC-20 + SRC-20 balances (see params below) |\n\n**Query parameters for `/token-balances`:**\n\n| Param       | Default | Description                                                                                                                    |\n| ----------- | ------- | ------------------------------------------------------------------------------------------------------------------------------ |\n| `type`      | `all`   | `erc20` \\| `src20` \\| `all`                                                                                                    |\n| `contracts` |         | Optional comma-separated contract addresses. If omitted, auto-discovers: ERC-20 via SocialScan, SRC-20 via `eth_getLogs` scan. |\n\n**Response shape:**\n\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"sUSDC\": {\n      \"contractAddress\": \"0x790701048922e265105fd6a4467a2901c2201c43\",\n      \"name\": \"Shielded USD Coin\",\n      \"symbol\": \"SUSDC\",\n      \"decimals\": 6,\n      \"balance\": \"250\"\n    },\n    \"erc20\": [\n      {\n        \"contractAddress\": \"0x...\",\n        \"name\": \"USDC\",\n        \"symbol\": \"USDC\",\n        \"decimals\": 6,\n        \"balance\": \"100\"\n      }\n    ],\n    \"src20\": [\n      {\n        \"contractAddress\": \"0x...\",\n        \"name\": \"TSRC\",\n        \"symbol\": \"TSRC\",\n        \"decimals\": 18,\n        \"balance\": \"9139\"\n      }\n    ]\n  }\n}\n```\n\n`sUSDC` is always fetched separately (it's the gas token; balance uses `balanceOfSigned` - no gas required). When `type=all`, each type is fetched in parallel and fails independently - partial results returned with `erc20Error`/`src20Error` on failure.\n\n### SRC-20 Viewing Key\n\n| Method | Route                              | Description                                                      |\n| ------ | ---------------------------------- | ---------------------------------------------------------------- |\n| `POST` | `/api/:vaultId/src20/register-key` | Register vault's AES viewing key in the Seismic Directory (once) |\n| `GET`  | `/api/:vaultId/src20/key-status`   | Check if viewing key is registered                               |\n\n### Transaction History\n\n| Method | Route                                | Description                            |\n| ------ | ------------------------------------ | -------------------------------------- |\n| `GET`  | `/api/:vaultId/transactions`         | Transaction history (see params below) |\n| `GET`  | `/api/:vaultId/transactions/:txHash` | Single transaction by hash             |\n\n**Query parameters for `/transactions`:**\n\n| Param       | Default | Description                                                                                                                                                                            |\n| ----------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `type`      | `erc20` | `erc20` \\| `src20` \\| `all`. `erc20` and `all` require `SOCIALSCAN_API_KEY` for full history. For sUSDC history use `type=src20\u0026contracts=0x790701048922e265105fd6a4467a2901c2201c43`. |\n| `contracts` |         | Comma-separated contract addresses to filter by. Required for `type=src20`.                                                                                                            |\n| `limit`     | `50`    | Max results per page.                                                                                                                                                                  |\n| `offset`    | `0`     | Results to skip (for pagination).                                                                                                                                                      |\n| `before`    |         | Return transactions on or before this date (`YYYY-MM-DD`). Converts to an approximate block using ~120ms block time.                                                                   |\n| `after`     |         | Return transactions on or after this date (`YYYY-MM-DD`). Converts to an approximate block using ~120ms block time.                                                                    |\n| `fromBlock` |         | Hex start block. Only used for explicit `eth_getLogs` range; overridden by `after` if both are provided.                                                                               |\n| `toBlock`   |         | Hex end block. Only used for explicit `eth_getLogs` range; overridden by `before` if both are provided.                                                                                |\n\n\u003e **Date range notes**: dates are converted to block numbers via `currentBlock - (now - date) / 120ms`. History depth is ~41 days (300 windows × 99k blocks × 120ms). Requests for older data include a `warning` in the response meta.\n\n**Response shape:**\n\n```json\n{\n  \"success\": true,\n  \"data\": [\n    /* Transaction[] */\n  ],\n  \"meta\": {\n    \"source\": \"eth_getLogs-viewing-key\",\n    \"scannedFromBlock\": \"0x301baf9\",\n    \"scannedToBlock\": \"0x315adf2\",\n    \"count\": 10,\n    \"total\": 42,\n    \"limit\": 10,\n    \"offset\": 0,\n    \"hasMore\": true,\n    \"warning\": \"optional - present when date is out of history range\"\n  }\n}\n```\n\n### Transfers\n\n| Method | Route                    | Description                             |\n| ------ | ------------------------ | --------------------------------------- |\n| `POST` | `/api/:vaultId/transfer` | Submit SUSDC / ERC-20 / SRC-20 transfer |\n\n**Transfer body:**\n\n```json\n{\n  \"type\": \"SUSDC\",\n  \"recipient\": \"0x...\",\n  \"amount\": \"1.5\",\n  \"note\": \"optional label\"\n}\n```\n\n`type` must be `\"SUSDC\"`, `\"ERC20\"`, or `\"SRC20\"`.\n\n- `SUSDC` - sUSDC shielded transfer; contract address is baked in, no need to supply it.\n- `ERC20` / `SRC20` - `contractAddress` required.\n\nUse `recipient` (direct address) or `destinationVaultId` (Fireblocks vault ID, resolved automatically).\n\n### Contracts\n\n| Method | Route                             | Description                                    |\n| ------ | --------------------------------- | ---------------------------------------------- |\n| `GET`  | `/api/contracts/:contractAddress` | ERC-20 token metadata (name, symbol, decimals) |\n\n### Observability\n\n| Method | Route          | Description                                      |\n| ------ | -------------- | ------------------------------------------------ |\n| `GET`  | `/api/metrics` | Prometheus metrics (CPU, memory, event loop lag) |\n| `GET`  | `/health`      | Health check                                     |\n\n---\n\n## Library Usage\n\n```typescript\nimport { MainSDK, createHttpClient } from \"@fireblocks/seismic-sdk\";\nimport { BasePath } from \"@fireblocks/ts-sdk\";\n\n// Create and initialize the SDK with deterministic signing verification\nconst sdk = await MainSDK.create({\n  apiKey: process.env.FIREBLOCKS_API_USER_KEY!,\n  apiSecret: process.env.FIREBLOCKS_API_USER_SECRET_KEY_PATH!,\n  basePath: BasePath.US,\n  testnet: true,\n  // Optional: customize the HTTP client (timeout, User-Agent, interceptors, etc.)\n  httpClient: createHttpClient({ timeout: 10_000, userAgent: \"MyApp/1.0\" }),\n});\n\n// Vault identity (lazy - runs on first use)\nconst address = await sdk.getSeismicAddress(\"0\");\n\n// Token balances - sUSDC is always returned separately (it's the gas token)\nconst balances = await sdk.getTokenBalances(\"0\", \"all\");\n// balances.sUSDC.balance  → \"250\"\n// balances.src20          → [...other SRC-20 tokens]\n\n// SRC-20 shielded balance (any SRC-20 contract, including sUSDC)\nconst src20 = await sdk.getSrc20Balance(\"0\", \"0xContractAddress\");\n\n// Register viewing key (one-time per vault address)\nawait sdk.registerViewingKey(\"0\");\n\n// Check registration status\nconst registered = await sdk.checkViewingKeyRegistered(\"0\");\n\n// Transaction history with decrypted SRC-20 amounts\nconst history = await sdk.getTransactionHistory({\n  vaultId: \"0\",\n  type: \"src20\",\n  contracts: [\"0xContractAddress\"],\n  limit: 20,\n  offset: 0,\n});\n\n// sUSDC transfer - contract address baked in, no need to supply it\nconst susdcTx = await sdk.createSUsdcTransaction(\"0\", \"0xRecipient\", \"1.5\");\n\n// Any other SRC-20 shielded transfer\nconst tx = await sdk.createShieldedTransaction(\n  \"0\", // vaultId\n  \"0xRecipient\",\n  \"1.5\", // amount in whole units\n  \"0xContract\"\n);\n\nawait sdk.shutdown();\n```\n\n---\n\n## How It Works\n\n### Session lifecycle\n\n1. **SDK initialization** - `MainSDK.create()` constructs the SDK instance then verifies your Fireblocks workspace has [signature caching](https://developers.fireblocks.com/reference/caching-signatures#caching-signatures) enabled by signing `SEED_MESSAGE_HEX` twice and comparing the results. MPC ECDSA is not inherently deterministic - Fireblocks achieves reproducibility via backend signature caching (no TTL): identical payloads always return the same cached signature. If the two signatures differ, the SDK fails to initialize with a `DETERMINISTIC_SIGNING_REQUIRED` error, since stable encryption key derivation requires this feature. This check can be skipped with `skipDeterminismCheck: true` if you have already confirmed caching is active for your workspace.\n\n2. **Vault init (lazy)** - on first use, `getPublicKeyByVaultID` fetches the vault's compressed secp256k1 public key from Fireblocks. The Seismic/ETH address is derived via `keccak256(uncompressed_pubkey)[last 20 bytes]` and cached in memory.\n\n3. **Encryption key derivation** - `deriveEncryptionKey(vaultId)` signs a fixed 32-byte seed (`keccak256(\"Seismic Fireblocks Encryption Key Derivation\")`) via Fireblocks RAW signing, then computes `SHA-256(fullSig)` → 32-byte `encryptionSk`. The same key is re-derived on every session restart without re-approval because Fireblocks' signature caching returns the same cached signature for the same payload - not because MPC ECDSA is cryptographically deterministic. Stored in process memory only.\n\n4. **TEE session** - `seismic-viem`'s `createShieldedWalletClient` fetches the Seismic TEE public key once per client instance. `encryptionSk` is used for ECDH with the TEE to derive the AES-256-GCM calldata encryption key.\n\n5. **Shutdown** - `sdk.shutdown()` zeroes all `encryptionSk` and `viewingKey` values before clearing the vault cache.\n\n### SRC-20 balance reads\n\nStandard `eth_call` returns zero for shielded `suint256` storage. The `balanceOfSigned(owner, expiry, signature)` function solves this:\n\n1. Build `keccak256(abi.encodePacked(\"SRC20_BALANCE_READ\", owner, expiry))` → EIP-191 wrap\n2. Fireblocks RAW-signs the 32-byte hash (proves vault identity without raw key exposure)\n3. Pack `r || s || v` into 65-byte Ethereum signature\n4. The contract calls `ecrecover` and decrypts the balance if the signature is valid\n\nOne Fireblocks sign authorizes balance reads on any SRC-20 contract until the expiry (default: 1 hour).\n\n### SRC-20 viewing key\n\nA vault can register a deterministic AES-256 key in the Seismic Directory precompile (`0x1000000000000000000000000000000000000004`). After registration:\n\n- All incoming SRC-20 `Transfer` events have `encryptedAmount` encrypted to this key\n- Transaction history decrypts amounts directly from event data - no per-tx `eth_getTransactionByHash` calls\n- Both sent and received transfers are decryptable (ECDH-only decryption only works for sent txs)\n\nThe viewing key is derived as `keccak256(encryptionSk)` - no extra Fireblocks round-trip after the first derivation.\n\n### Transaction nonce strategy\n\nOn-chain transactions (sUSDC, ERC-20, SRC-20 transfers) use `eth_getTransactionCount` with the `\"pending\"` tag to fetch the current account nonce from the blockchain. This ensures:\n\n- Nonces are correct across session restarts (no in-memory state drift)\n- Multiple concurrent processes using the same vault don't create nonce conflicts\n- Nonces increment predictably with each on-chain transaction\n\nOff-chain signed reads (like `getSrc20Balance`) use EIP-191 message signing and **do not use transaction nonces**. This prevents nonce collision between off-chain reads and on-chain transactions.\n\n### Transaction history sources\n\n| Type    | Source                                        | Notes                                                                                                                                                          |\n| ------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `erc20` | SocialScan `tokentx` → fallback `eth_getLogs` | Requires `SOCIALSCAN_API_KEY` for full history.                                                                                                                |\n| `src20` | `eth_getLogs` + viewing key decryption        | Always uses RPC directly. Pass `contracts=\u003csUSDC addr\u003e` to filter sUSDC-only. Viewing key path: zero N+1, both sent \u0026 received. Fallback ECDH path: sent only. |\n| `all`   | ERC-20 + SRC-20 merged                        | Requires `SOCIALSCAN_API_KEY` for ERC-20.                                                                                                                      |\n\n`eth_getLogs` paths scan backwards in 99,000-block windows (≈3.3 hours on Seismic testnet's 120ms blocks), stopping when enough results are collected or 10 consecutive empty windows are seen. `before`/`after` date params set the window bounds.\n\n### Shielded transfers\n\n`createShieldedTransaction` uses `encryptionSk` as both the wallet signing key and the seismic-viem encryption key. `seismic-viem` automatically:\n\n1. ABI-encodes `transfer(address, suint256)` calldata\n2. Encrypts it via ECDH(encryptionSk, TEE pubkey) + HKDF → AES-256-GCM\n3. Constructs a type-0x4A transaction with SeismicElements metadata\n4. Signs and broadcasts\n\nThe transfer amount is never visible in public transaction data.\n\n---\n\n## Project Structure\n\n```\nsrc/\n  MainSDK.ts                    Primary entry point - vault lifecycle, all SDK operations\n  services/\n    seismic.service.ts          Seismic RPC + seismic-viem operations + transaction history\n    explorer.service.ts         SocialScan Explorer API client (native/ERC-20 history)\n    fireblocks.service.ts       Fireblocks SDK wrapper\n    fireblocksSigner.ts         RAW signing, signature packing, vault address derivation\n  crypto/\n    key-derivation.ts           SHA-256(Fireblocks fullSig) → encryptionSk\n  seismic/\n    abi.ts                      SRC-20 ABI (balance, balanceOfSigned, transfer)\n    signature.ts                EIP-191 message builder for balanceOfSigned\n  api/\n    router.ts                   Express routes\n    controllers/controller.ts   Route handlers\n    validation/schemas.ts       Zod schemas (params, query, body)\n  utils/\n    constants.ts                Chain ID, RPC URLs, SEED_MESSAGE_HEX, SocialScan URLs\n  types/\n    custom.ts                   VaultData, Transaction, TransferType, etc.\n```\n\n---\n\n## Commands\n\n```bash\nnpm install          # Install dependencies\nnpm run build        # Compile TypeScript → dist/\nnpm run dev          # Watch build + auto-restart server\nnpm start            # Run compiled server\nnpm run typecheck    # Type-check without emitting\nnpm run lint         # ESLint\nnpm run format       # Prettier\nnpm run docs         # Generate TypeDoc API docs → served at http://localhost:8000/docs\n```\n\n---\n\n## Seismic Testnet\n\n- **Chain ID**: 5124\n- **RPC**: `https://testnet-1.seismictest.net/rpc`\n- **WSS**: `wss://testnet-1.seismictest.net/ws`\n- **Faucet**: `https://faucet.seismictest.net/` (drips sUSDC; whitelist via Seismic team for unlimited requests)\n- **Explorer**: `https://seismic-testnet.socialscan.io/`\n- **Native asset**: SIZE (18 decimals) - not user-facing; sUSDC (`0x790701048922e265105fd6a4467a2901c2201c43`, 6 decimals) is the gas and value token in practice\n- **Block time**: ~120ms (~720k blocks/day)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffireblocks%2Fseismic-sdk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffireblocks%2Fseismic-sdk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffireblocks%2Fseismic-sdk/lists"}