]> git.codecow.com Git - libnemo.git/commitdiff
Validate frontier block for Ledger cache.
authorChris Duncan <chris@codecow.com>
Mon, 3 Aug 2026 19:02:36 +0000 (12:02 -0700)
committerChris Duncan <chris@codecow.com>
Mon, 3 Aug 2026 19:02:36 +0000 (12:02 -0700)
src/lib/ledger/index.ts

index c7f80a3bb4fa3372fa4237de8ccf9d6522bccee6..9c175cfa26e9a76f8cce24b7f42672c60678479a 100644 (file)
@@ -9,6 +9,7 @@ import { Block } from '../block'
 import { BIP44_COIN_NANO, BIP44_PURPOSE, HARDENED_OFFSET } from '../constants'
 import { dec } from '../convert'
 import { Rpc } from '../rpc'
+import { SCHEMA } from '../rpc/schema'
 import { _account } from './account'
 import { _cache } from './cache'
 import { _close } from './close'
@@ -234,10 +235,20 @@ export class Ledger {
                                'hash': input
                        }
                        const res = await node.post('block_info', data)
-                       if (!res || !res.ok || res.error) {
-                               throw new Error(`Unable to fetch block info`, res)
+                       if (!res || typeof res !== 'object' || !('ok' in res) || 'error' in res) {
+                               throw new Error('Unable to fetch block info', { cause: res })
                        }
-                       const { contents: { account, balance, link, previous, representative, signature } } = res
+                       const blockInfo = res as Record<string, unknown> & Record<'ok', unknown>
+                       if (!(blockInfo.contents != null && typeof blockInfo.contents === 'object')) {
+                               throw new Error('Block info missing contents', { cause: blockInfo })
+                       }
+                       const contents = {} as Record<string, string>
+                       for (const [k, v] of Object.entries(blockInfo.contents)) {
+                               if (SCHEMA.block_info.fields.includes(k)) {
+                                       contents[k] = v
+                               }
+                       }
+                       const { account, balance, link, previous, representative, signature } = contents
                        const block = new Block(account, balance, previous, representative).receive(link, 0)
                        block.signature = signature
                        input = block