{"version":3,"file":"block-tracker-inspector.cjs","sourceRoot":"","sources":["../src/block-tracker-inspector.ts"],"names":[],"mappings":";;;AAEA,2CAA8C;AAG9C,uDAAoE;AAEpE,MAAM,GAAG,GAAG,IAAA,kCAAkB,EAAC,6BAAa,EAAE,yBAAyB,CAAC,CAAC;AACzE,MAAM,sBAAsB,GAAsB;IAChD,0BAA0B;IAC1B,2BAA2B;CAC5B,CAAC;AAEF;;;;;;;GAOG;AACH,SAAgB,qCAAqC,CAAC,EACpD,YAAY,GAGb;IACC,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;QACjC,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,EAAE,CAAC;QAE5B,MAAM,mBAAmB,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,mBAAmB,EAAE,CAAC;YACxB,GAAG,CAAC,qDAAqD,EAAE,MAAM,CAAC,CAAC;YAEnE,mEAAmE;YACnE,MAAM,WAAW,GAAW,MAAM,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,CAAC,CAAC;YACrE,MAAM,kBAAkB,GAAW,MAAM,CAAC,QAAQ;YAChD,4FAA4F;YAC5F,YAAY,CAAC,eAAe,EAAY,EACxC,EAAE,CACH,CAAC;YAEF,IAAI,WAAW,GAAG,kBAAkB,EAAE,CAAC;gBACrC,GAAG,CACD,iGAAiG,CAClG,CAAC;gBACF,MAAM,YAAY,CAAC,mBAAmB,EAAE,CAAC;YAC3C,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC;AAhCD,sFAgCC;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAC3B,MAAkC;IAElC,IACE,CAAC,MAAM;QACP,OAAO,MAAM,KAAK,QAAQ;QAC1B,CAAC,IAAA,mBAAW,EAAC,MAAM,EAAE,aAAa,CAAC,EACnC,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;QAC3C,CAAC,CAAC,MAAM,CAAC,WAAW;QACpB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC","sourcesContent":["import type { PollingBlockTracker } from '@metamask/eth-block-tracker';\nimport type { JsonRpcMiddleware } from '@metamask/json-rpc-engine/v2';\nimport { hasProperty } from '@metamask/utils';\nimport type { Json, JsonRpcRequest } from '@metamask/utils';\n\nimport { projectLogger, createModuleLogger } from './logging-utils';\n\nconst log = createModuleLogger(projectLogger, 'block-tracker-inspector');\nconst futureBlockRefRequests: readonly string[] = [\n  'eth_getTransactionByHash',\n  'eth_getTransactionReceipt',\n];\n\n/**\n * Creates a middleware that checks whether response block references are higher than the current block.\n * If the block reference is higher, the middleware will make the block tracker check for a new block.\n *\n * @param options - The options for the middleware.\n * @param options.blockTracker - The block tracker to use.\n * @returns The middleware.\n */\nexport function createBlockTrackerInspectorMiddleware({\n  blockTracker,\n}: {\n  blockTracker: PollingBlockTracker;\n}): JsonRpcMiddleware<JsonRpcRequest, Json> {\n  return async ({ request, next }) => {\n    if (!futureBlockRefRequests.includes(request.method)) {\n      return next();\n    }\n    const result = await next();\n\n    const responseBlockNumber = getResultBlockNumber(result);\n    if (responseBlockNumber) {\n      log('res.result.blockNumber exists, proceeding. res = %o', result);\n\n      // If number is higher, suggest block-tracker check for a new block\n      const blockNumber: number = Number.parseInt(responseBlockNumber, 16);\n      const currentBlockNumber: number = Number.parseInt(\n        // Typecast: If getCurrentBlock returns null, currentBlockNumber will be NaN, which is fine.\n        blockTracker.getCurrentBlock() as string,\n        16,\n      );\n\n      if (blockNumber > currentBlockNumber) {\n        log(\n          'blockNumber from response is greater than current block number, refreshing current block number',\n        );\n        await blockTracker.checkForLatestBlock();\n      }\n    }\n    return result;\n  };\n}\n\n/**\n * Extracts the block number from the result.\n *\n * @param result - The result to extract the block number from.\n * @returns The block number, or undefined if the result is not an object with a\n * `blockNumber` property.\n */\nfunction getResultBlockNumber(\n  result: Readonly<Json> | undefined,\n): string | undefined {\n  if (\n    !result ||\n    typeof result !== 'object' ||\n    !hasProperty(result, 'blockNumber')\n  ) {\n    return undefined;\n  }\n\n  return typeof result.blockNumber === 'string'\n    ? result.blockNumber\n    : undefined;\n}\n"]}