{"version":3,"file":"transaction-logger.mjs","sources":["../../src/testing/transaction-logger.ts"],"sourcesContent":["import algosdk from 'algosdk'\nimport { Config } from '../config'\nimport { runWhenIndexerCaughtUp } from './indexer'\nimport Algodv2 = algosdk.Algodv2\nimport decodeSignedTransaction = algosdk.decodeSignedTransaction\nimport Indexer = algosdk.Indexer\n\n/**\n * Allows you to keep track of Algorand transaction IDs by wrapping an `Algodv2` in a proxy.\n * Useful for automated tests.\n */\nexport class TransactionLogger {\n  private _sentTransactionIds: string[] = []\n  private _latestLastValidRound?: bigint\n\n  private _pushTxn(stxn: Uint8Array) {\n    const decoded = decodeSignedTransaction(stxn)\n    if (decoded.txn.lastValid > (this._latestLastValidRound ?? BigInt(0))) {\n      this._latestLastValidRound = BigInt(decoded.txn.lastValid)\n    }\n    this._sentTransactionIds.push(decoded.txn.txID())\n  }\n\n  /**\n   * The list of transaction IDs that has been logged thus far.\n   */\n  get sentTransactionIds(): Readonly<string[]> {\n    return this._sentTransactionIds\n  }\n\n  /**\n   * Clear all logged IDs.\n   */\n  clear() {\n    this._sentTransactionIds = []\n  }\n\n  /**\n   * The method that captures raw transactions and stores the transaction IDs.\n   */\n  logRawTransaction(signedTransactions: Uint8Array | Uint8Array[]) {\n    if (Array.isArray(signedTransactions)) {\n      signedTransactions.forEach((stxn) => this._pushTxn(stxn))\n    } else {\n      this._pushTxn(signedTransactions)\n    }\n  }\n\n  /** Return a proxy that wraps the given Algodv2 with this transaction logger.\n   *\n   * @param algod The `Algodv2` to wrap\n   * @returns The wrapped `Algodv2`, any transactions sent using this algod instance will be logged by this transaction logger\n   */\n  capture(algod: Algodv2): Algodv2 {\n    return new Proxy<Algodv2>(algod, new TransactionLoggingAlgodv2ProxyHandler(this))\n  }\n\n  /** Wait until all logged transactions IDs appear in the given `Indexer`. */\n  async waitForIndexer(indexer: Indexer) {\n    if (this._sentTransactionIds.length === 0) return\n    const lastTxId = this._sentTransactionIds[this._sentTransactionIds.length - 1]\n    await runWhenIndexerCaughtUp(async () => {\n      try {\n        await indexer.lookupTransactionByID(lastTxId).do()\n      } catch (e) {\n        // If the txid lookup failed, then try to look up the last valid round\n        // If that round exists, then we know indexer is caught up\n        if (this._latestLastValidRound) {\n          await indexer.lookupBlock(this._latestLastValidRound).do()\n          Config.getLogger().debug(\n            `waitForIndexer has waited until the last valid round ${this._latestLastValidRound} was indexed, but did not find transaction ${lastTxId} in the indexer.`,\n          )\n        } else {\n          throw e\n        }\n      }\n    })\n  }\n}\n\nclass TransactionLoggingAlgodv2ProxyHandler implements ProxyHandler<Algodv2> {\n  private transactionLogger: TransactionLogger\n\n  constructor(transactionLogger: TransactionLogger) {\n    this.transactionLogger = transactionLogger\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  get(target: Algodv2, property: string | symbol, receiver: any) {\n    if (property === 'sendRawTransaction') {\n      return (stxOrStxs: Uint8Array | Uint8Array[]) => {\n        this.transactionLogger.logRawTransaction(stxOrStxs)\n        return target[property].call(receiver, stxOrStxs)\n      }\n    }\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return (target as any)[property]\n  }\n}\n"],"names":[],"mappings":";;;;AAIA,IAAO,uBAAuB,GAAG,OAAO,CAAC,uBAAuB;AAGhE;;;AAGG;MACU,iBAAiB,CAAA;AAA9B,IAAA,WAAA,GAAA;QACU,IAAmB,CAAA,mBAAA,GAAa,EAAE;;AAGlC,IAAA,QAAQ,CAAC,IAAgB,EAAA;AAC/B,QAAA,MAAM,OAAO,GAAG,uBAAuB,CAAC,IAAI,CAAC;AAC7C,QAAA,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,IAAI,CAAC,qBAAqB,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE;YACrE,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;;AAE5D,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;;AAGnD;;AAEG;AACH,IAAA,IAAI,kBAAkB,GAAA;QACpB,OAAO,IAAI,CAAC,mBAAmB;;AAGjC;;AAEG;IACH,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE;;AAG/B;;AAEG;AACH,IAAA,iBAAiB,CAAC,kBAA6C,EAAA;AAC7D,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;AACrC,YAAA,kBAAkB,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;;aACpD;AACL,YAAA,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC;;;AAIrC;;;;AAIG;AACH,IAAA,OAAO,CAAC,KAAc,EAAA;QACpB,OAAO,IAAI,KAAK,CAAU,KAAK,EAAE,IAAI,qCAAqC,CAAC,IAAI,CAAC,CAAC;;;IAInF,MAAM,cAAc,CAAC,OAAgB,EAAA;AACnC,QAAA,IAAI,IAAI,CAAC,mBAAmB,CAAC,MAAM,KAAK,CAAC;YAAE;AAC3C,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,GAAG,CAAC,CAAC;AAC9E,QAAA,MAAM,sBAAsB,CAAC,YAAW;AACtC,YAAA,IAAI;gBACF,MAAM,OAAO,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE;;YAClD,OAAO,CAAC,EAAE;;;AAGV,gBAAA,IAAI,IAAI,CAAC,qBAAqB,EAAE;oBAC9B,MAAM,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,EAAE;AAC1D,oBAAA,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,CACtB,CAAA,qDAAA,EAAwD,IAAI,CAAC,qBAAqB,CAAA,2CAAA,EAA8C,QAAQ,CAAA,gBAAA,CAAkB,CAC3J;;qBACI;AACL,oBAAA,MAAM,CAAC;;;AAGb,SAAC,CAAC;;AAEL;AAED,MAAM,qCAAqC,CAAA;AAGzC,IAAA,WAAA,CAAY,iBAAoC,EAAA;AAC9C,QAAA,IAAI,CAAC,iBAAiB,GAAG,iBAAiB;;;AAI5C,IAAA,GAAG,CAAC,MAAe,EAAE,QAAyB,EAAE,QAAa,EAAA;AAC3D,QAAA,IAAI,QAAQ,KAAK,oBAAoB,EAAE;YACrC,OAAO,CAAC,SAAoC,KAAI;AAC9C,gBAAA,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,CAAC;gBACnD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC;AACnD,aAAC;;;AAGH,QAAA,OAAQ,MAAc,CAAC,QAAQ,CAAC;;AAEnC;;;;"}