Skip to content

Conversation

@louisinger
Copy link
Collaborator

@louisinger louisinger commented Jul 1, 2025

This PR is renaming fields to new terminology #69

@Kukks please review

Summary by CodeRabbit

  • New Features

    • Introduced comprehensive TypeDoc documentation generation with new scripts and GitHub Actions workflow for automated deployment to GitHub Pages.
    • Expanded and improved type exports for wallet, provider, transaction tree, and script utilities.
  • Refactor

    • Renamed InMemoryKey to SingleKey throughout the codebase and documentation.
    • Replaced TxGraph/TxGraphChunk with TxTree/TxTreeNode for transaction structure representation.
    • Updated virtual coin state from "pending" to "preconfirmed".
    • Renamed transaction key property redeemTxid to arkTxid.
    • Modified subscription data handling and query parameter formatting in indexer provider.
    • Updated coin selection logic with new internal implementations.
    • Adjusted wallet and service worker initialization to use SingleKey.
    • Renamed variables and parameters for clarity and consistency.
  • Documentation

    • Added detailed JSDoc comments to major classes, interfaces, and utility functions for enhanced developer guidance.
    • Updated README and example code to reflect new naming and usage patterns.
    • Enhanced inline documentation for key protocol components and utilities.
  • Chores

    • Removed ESLint and lint-staged configuration and dependencies.
    • Added .gitignore entry for documentation output.
    • Updated default Docker build branch to master.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jul 1, 2025

## Walkthrough

This update introduces broad refactoring and documentation improvements across the codebase. Key changes include renaming the `InMemoryKey` class to `SingleKey`, replacing all references accordingly, and updating transaction graph types from `TxGraph`/`TxGraphChunk` to `TxTree`/`TxTreeNode`. Several type and interface names are updated for clarity, and detailed JSDoc comments are added throughout. Coin selection logic is now implemented locally in wallet modules. The documentation build and deployment process is enhanced with new scripts and a GitHub Actions workflow.

## Changes

| Files/Groups                                                  | Change Summary |
|--------------------------------------------------------------|---------------|
| `src/identity/singleKey.ts`, `README.md`, `examples/`, `test/`, `src/wallet/serviceWorker/`, `src/index.ts` | Renamed `InMemoryKey` class to `SingleKey` and updated all references, imports, and usage examples. |
| `src/tree/txTree.ts`, `src/tree/signingSession.ts`, `src/tree/validation.ts`, `src/providers/ark.ts`, `src/index.ts`, `test/e2e/indexer.test.ts` | Renamed transaction graph types from `TxGraph`/`TxGraphChunk` to `TxTree`/`TxTreeNode` throughout code, tests, and exports. |
| `src/wallet/onchain.ts`, `src/wallet/wallet.ts`, `src/utils/coinselect.ts` | Removed external coin selection utility; implemented local `selectCoins` and `selectVirtualCoins` functions in wallet modules. |
| `src/wallet/index.ts`, `src/wallet/wallet.ts`, `src/utils/transactionHistory.ts`, `test/e2e/ark.test.ts` | Changed virtual coin state `"pending"` to `"preconfirmed"` and renamed `redeemTxid` to `arkTxid` in types, logic, and tests. |
| `src/providers/indexer.ts`, `src/index.ts` | Updated and exported new types/interfaces (`PaginationOptions`, `SubscriptionResponse`), removed deprecated methods, and adjusted provider method signatures. |
| `src/arknote/index.ts`, `src/script/tapscript.ts`, `src/script/vhtlc.ts`, `src/bip322/index.ts`, `src/utils/arkTransaction.ts`, `src/wallet/onchain.ts`, `src/wallet/wallet.ts`, `src/providers/ark.ts`, `src/wallet/index.ts`, `src/wallet/serviceWorker/wallet.ts` | Added or expanded JSDoc comments for classes, interfaces, functions, and usage examples. |
| `src/wallet/serviceWorker/worker.ts`, `src/wallet/serviceWorker/wallet.ts` | Updated to use `SingleKey` for identity management and adjusted destructuring variable names. |
| `src/utils/coinselect.ts` | Deleted file; coin selection is now implemented locally in wallet modules. |
| `.github/workflows/tsdoc.yml`, `typedoc.json`, `package.json`, `.gitignore` | Added documentation build scripts, TypeDoc config, GitHub Actions workflow for docs deployment, and ignored `docs/` in git. |
| `server.Dockerfile` | Changed default Docker build branch from `next-version` to `master`. |

## Sequence Diagram(s)

```mermaid
sequenceDiagram
    participant User
    participant Wallet
    participant SingleKey
    participant IndexerProvider
    participant ArkProvider

    User->>Wallet: Initialize (with SingleKey)
    Wallet->>SingleKey: Generate or load key
    User->>Wallet: Request transaction
    Wallet->>IndexerProvider: Fetch VTXOs, scripts, etc.
    Wallet->>ArkProvider: Submit Ark transaction
    ArkProvider-->>Wallet: Return transaction notification
    Wallet-->>User: Return transaction result

Possibly related PRs

  • TxGraph, new address and pub/sub #100: The main PR and this PR both modify transaction graph abstractions and related types, updating from TxGraph to TxTree and adjusting validation and event handling accordingly.
  • Remove onchain wallet from Wallet, add OnchainWallet class #102: Refactored wallet code to separate onchain wallet functionality from the main Wallet class, introducing a dedicated OnchainWallet class. This PR shares direct modifications to wallet structure and related interfaces.
  • Unilateral exit v7 #115: Both PRs involve changes to virtual coin state management and wallet exit/unroll functionality, with this PR removing deprecated exit methods and the other adding new unroll session management.

Suggested reviewers

  • Kukks

<!-- walkthrough_end -->
<!-- internal state start -->


<!-- DwQgtGAEAqAWCWBnSTIEMB26CuAXA9mAOYCmGJATmriQCaQDG+Ats2bgFyQAOFk+AIwBWJBrngA3EsgEBPRvlqU0AgfFwA6NPEgQAfACgjoCEYDEZyAAUASpETZWaCrKNwSPbABsvkCiQBHbGlcSHFcLzpIACIAVW5aag8CSC8kxFDnAGtaABo/MjRmeAwidAx6aABlABF8BmjIAHc0ZAcBYtwaejkw2A9sREpU/GwkEtI+Vus7DEcBYYBGAAYADhQsXH6C7nxEdXwXdAostCUwPYB6XEQwRFosjRht5m0sbmwKXaH+ADM+1C2FDIFL+DBFDy/eAkLy0EH4SDkJphSjFDD4Lz4Ijyab+X6UMgMKIlYEODxmABsAE4nu5IEpEAwKPBuOJ8FgSgwvNgGegCkEQpBfocChJocjfhQWH0BkM+ABpbBZLKIJ4AOQRZ1o6ng7LQviUuG0XhkJFk7PoWw8YKKEz+QuhsOQzg8vHwYqUtFp2yBDEwkAWkDFJCaUWokFgXW4iA4l0uRHUsGwAg0TGYl2yZxIF0Q11u9yylw+PkuK1WGiM+mM4CgZHo+H+aDwhFI5Co3QUrHYXF4/GEonEUhk8iYSioqnUWh0VZMUDgqFQ/qbBGIZGUHbTbAwnD8aGRDicR16o+UE802l0YEM1dMBkQFAYRalHsouZKSgAHpQNDcOAZogBBgWJAACCACSq5tkk9AHq8RwNowsCYKQiBuNsAAGVhoAm4JshgADyrK6hgiDoWEsjcB4qDosiJAfrsFDdE8IGIiGGw0BQvxoESkDoVUyaMsyRHsjY0i7CRJBkQu25SrQ2BEpaCJKFC5D2AJTIsnh9LUGgGxcjydr4MJ4K+OhuAfvAtDofkZkftZ5T0OhDD9AwWS7CUuDQB+pEOjCcLoJipT7EovGCZppE2UiABq5l7PZmCOYglHbjFH5xd6HjoWBFR0ZQVjPpZlBSdulBcTx/jMO60gyrxpC4AAwiwnRbp5H4ADIkGgQ5kWwWyKA5kDYAk6Q1ehdX8QIYXGT1JB9YpBS4J8WD+uhIGILIGAMGBHEqJE23rocwATVNeGiUl7JDHoxUZJ19aNhyGBeCUHiCCIYjkZRTyNRQ/jnRUExeLI+RWrxZ24Nln55QVY5kVyrTIBVVUghhdWNaw6gtV5HVddIM1zSgzDcJELXUMRA3qMgEj6pZpPsk82W1bNx0adNwPbLIjqen2b2hDRencrytmWfZtnxRUvHOaIbn4B5Xk+W6lGMdCyB0bgVBiFEkrSiD7QnWTiRGhljO4KlcWQL1sD9c5yHVZbyICkc3DOBCHHIMKfDoSdPkJbxoy4O527e/46DcMlnpcCUN1nPaQgyxgdrOFQsjIB5CKbmgdwkE77ZRBkzJBfk6gh2HKvcbAkAwiQLUbNqHrYPqgNhAiDih4coTMN44hgEwPgDmT7uvJokAM057JSIxpv2SD6Fiox9deFURqLaqGRJGRVPch41ulNVWvMLx0RhxM0RkSk6GH/4TAYFCFBsLQJ/NP0WAz7FGhIPlojsjfd9SSCFDBEbXAFEPBEHrhQRySA0bNXYFjTqQ4zriSGL/AolUpD0D3qNBBF1JKIghElbiJAMo/G3ihc2ih4C/HkEAyiFd6Jt0QPkXWLMtIG10khCoT1Sj5AdvIbOLthgD2oOILhA1EZSD5EoXgohoLm1mpbegPsKZBmpgbYiFYjBAUsCBLwO08LwhqkoOG7ZiLIAQnRBiHYRQfAEE9BgFdtw6mkJWXiWEcK0wIsZHy1Ct7sNIOgqU+9dKYj9L4bxAV4DTBSP6cxbcohhOpq0LgZlgHWGwiUdxhE9FkUAEmEvEYmMQ+h4Vx6S8KZJMcVUKD4nzukKhQN8OUvwUB/KRAwUAQK0C5vkjsHlSoEN4szISp0xLYLIk0RM/BjL6l4uZYWNlzIi0lq5AOrVvbi38EEeA/hErMIirxaKsVdme2SibA5FTPZVLdC+Oplx3y5SaTcdCrTICiVQVEC2/UxqzSgRjGB7U4HSAABQzNoFwPOEx8hGRuAAfi4MU3CxEykXQAJSwoCUgEgwAADeqR/kxkgPhPAyyADaABdAA3DwbCJAYWpNIFgiSkAAC+V0hQBN4hDO5+Uakw3Yr0niJJzmPkubU+pkN7ktKgPEA2UQsoNKhtyoqvLOJ9PeTBeARBcKfBIEk8a6lBnEQBUw/V7IwIgvsGrcF6ABBtyqOqkyXAQLWsYrajV+oUWgXWptfa449q6MOtir2oKLWlFJRS/ZaU8VRU2YtfUjUSihvsMc02kbo3zzjRgUlTKWW5M+bgAZmkDVGoLSas1YKREqBtXa/UDqnV5qrV4d1a0NpbR2jYkg3rqCHXzcZell0zn3iFdDV8Ny5XiseVAF5VV6CquNt83AmM/k40QECiypbg1EAhayRANK4UZM8e6rlxQhhYpxUurgBL/Zx1wAmp2pAd1Ut7R4ZlZEMHoTBhyxpXKrmwzSIgFOz8B3VKuaKu5zTHkAWiJWW8gG8DwBNNcKgJFuJ4QABJIAIC4Zpf4IOaNAhBVs65c6ODgvIBCJCnEGDpORhGMJ6hJBqv0LwishTYE2no3iKlaDJqqMc7KVRZoRCruwEWnHuO8YwFhWQLURPvmTWdTudAABiASvKzN4ls+SJBk0gUqqx3AYtHJ1Unqy7W2wCDcHtCDKEkQm41WtV0Fg+RXhZDtFafevBJD0ZSCDSqclIhPAAOqJhJFaH4jHFbOnFj5t4vEJAHOgPgOWL7WNiGIvkBuiEpaRfoFfbU7GtjhikWKUYiBG5pmzjKuLaUNCzxjQvJegwNCrxoKfBE58j6lAfi6Qaw0Oxnwvp/a+my74nyNnw3qwxwRsA2LF+LiXvLIPI/46U6FrXOG1KUGwowKheLa2t8BEwABC1BnKqbhAZgKvg8QEk2tVbzCBkDjdmsMbrQ1pUKIYEwA7pRAZG3Ql5eUZoyIK0oEA9TdASBVzO8gm0d9bPoWyNDvoUpsBEEtngGqJ5C6bQFnaJRJQdTUwAF7uIGvDO1LVVTPC3uyNWGIhSYmRD7azHE7SYgTHYiqMWUu+KiHRIkrIhQilC9aQoaIiDZfNfRstZRdbhFgxdI2vwUtaX2K6xav1LPbHCwIlXJiUExZ1hCfIAgMdWk2UGcYagnpg9QBphSAZ5CoNc/0feCxGc1VeCSLp6oET4CtHwdn8A7EikoFKPg7DaCcLKNR44VEZKKE016cwWidHrn1/djwhi0jGIuvaLpUQrHJlsfY8IytnGKb1+yewVaNcDF63QJJXSWNsbJlVvYCW5aGrDrtbVkAo1z1jXHUljDjlcAH3V9NI+Az4HWxMLbrG4RcH47gYAMu9BIpyXkuhBTlet+r+3xAnfvLd7rL38fqah/xpJaP7s/fL9eCnzfmfc/SjHdwKd1deKV9r/XRv/tVSsG8GasmAiAyGxEaGGQhwsgYG/4gErS0GVSLQvcuAI6n4WGcBkGwE4EkEhGMExGzgpG/w1GRg7SXMukAAUrUPUJ2NXJnrxAFg3F8l/OqsVBxGVFntIBpGoKUCgDcH4BiPHs0EwaEATuIMTu4tjvpBtmUIVA4kAowpQOPJALEDYG1AwgNJCsRFMuIGwMElkJSlQBNnUs0OMlxD4AINxAYQsEhMVk0pAAALLkJQhxIYQT7zyLzUCDBsF8oeC9D+BEzcQu6ZSHx1jHxkTNYeBjJbAHxSJXzfx0CjbPJi6uGZRbKQ7MBI4g6MTyAhYYQA5A5KocHw6I6rroRfS86WgYRGjcDYzdSFLw7QBoC1G4pkQ+wF70CTigQdJhiQBUF1B2KbjsC2bTxgSMEoE+HKo8QMjcF46ZDIw07BzIGRCiElRTGQgiiHbqBMAhaIZgGpZ57RHlwgQnA8BSgEA9xqStyMSMIEHMhE5zHIAzq/SILwDW6OKqgaK4baK6IZ4IggzZ7OzsZmI76WJ8DWIl7sAfHOJkFRD9E0FDHbjw7jErGNRDZECTEcEVhQDoTuH6ieHLyYkEJcBLahRLw4LZFg5hKvqhH/SdaQAAA+MQQwXQkQ98jJzJoYrIjQTJ0QSU7AD8/WcRLBt8iRHJfJAmbJPJnJWcuA0pfJxyo2Ty/2H4gOsgRJRIXAsOUQlJ8g6E6RUOq6Qa+cGJJRJwZ2xpEw5RTyokU2YY4sHRDRZkzRdRuMkAOaTRLRS61pbSPR9A8JgxTUwxZ8YxIhGphCmBUGYARggGyxs0lwcoYoRIAWhwWQlAlwTQqZ34v4kZ2B+Ga4Oc+Bh4RBiENsqElG2w8AhMbcWuVESg8h8gaZI4v6yALQyApJr62UDhVc0BaprW/SAMJAfZX0hwLxFoAMQMNUcZqxhOT0JOWkfMgw1UfEg5apGge8KGdE10NA0cCEsq3ZlULga5G5W5tmTInUNANUch4Q8gGCIMHmVMl5TZ9Mmw2wlhaQt2jA+oDA3gpORxAqkekQAA4rNMdh+USFPNsLljqNXosi5rwe7LNtVrVh4Q1ivOSZAAALzYUxAdZEAPxtk9bvZnkuQGGIXtaXwikjbbm3Qvm8SAUkAgWeR7HgHsiQEYbqlsycF5zyR170C6kSxNQ/KBwJZgQaqHA4KvpbBIAaDTkaB1SHaz7fZEBd6b7AiIj4BM5PStBhjID6nbZwiiXiX+A0W7n/DaiXwRDyAMhqy8WfB2j6WL5H74BiXogmVEI+JllkLaiUJXn1k3mQBNmMAtmDRDDoIijTmMD+CSHoC0BCCDChAgwNi/DWwkjvmYA8SRGZauTpZrIpESIhD/xiBar8VSiKxg5HF+wBSs68FJXjwZZXx06+C/Ae6h4/QiiAUTDqIp6gRp654kQjHbCAn9WmL/COlF42LB6l7QlPIailk7z6IAmiA57uKmJ8Bq6aqa4gkWKF7gnF5TVQniDVShjByvBKAVg4YIHRl3hIEiEZkiEYE4Z5m4GFlqTFn2gkEVlUTVkFJ7lDCRBiB4mP5xw+QYLRIfgcQmSDTiA265E0avIKJ5WBEO69C6RIhKpQ1VlExCbbik5/WVyA0P7prex+noCJXbB1i1kOj+bPDURsR74HFYCID0KW6D6+A7EDWo2MhhG8GWEf7lzmKbLyAAoiivAfi8qTAoD/DojkBIoDRWhYC9AzE81lAbzBCKEA3CIx4g2DQOKhJmbOB1ToC6ZImoC9T8B8BbBShjK8HRLtV8AUIt7+TdaRzYC/BQgMDQjbj5D+Aa7xy1XbD/UDhRAc2S7kbG3bahD+79AUBjJDBGxY01l7mm5wa0D4Tu2pUYBeSLaVEmb7znwaAaCXBAG5jRgCByn9kF1F0l0ZjmksWM1JF0jeKS5UzMi940ZpB9b/H11aREBUDcCwDOjBzanLb51eRAX92wDoSXAqkT3NGwD1RJgYBZCV1eTQD+CSQz1r0b0ahKCnywAo5o5VU6ySk42hAtWaVSG468Gt0RJtr0jLVAn64+wzohImhGy3297qYGXOWuUSUw4pHzSjzozzrsC/3GU4JXz7A3TbiNwCp1Tr2gGsUYDsXQFtHiy5qKWv4qULZ0WYNKUyFJZcWs11YKAkhZWIWsb8lIl+wfD8Gx40l4WCltYSmsmJHlHU5hA91kxBUuGwjg5KCGnCzqUj1mlZDQ7MQP1GhwZwnUGBldhIkzHMg8FlDTwomzQ/rwxk5YB0RFDY2hVUr2DxyhyzTqVah0AeXzWkJoDu0Di4Li4KAYBSAOIXT5As6UBs5YjB65WdFrFQ0c32AE1aRB52KVUY76g1Xa0J7NWtV8Bh4dUJTR7qLYF9WrWDWcFGJpPbWxL1h7WTV2KHXl5PL1QhXoTqP6YzaCr3UoHVMrFgYOqk2GjGiyMDG0HDFHG0J6M2aDBUrYmQCV777LSk0AodHuroQM2q5BNA3E0Aqh0X5s1P7AyG2zQ6aR1cBzDMALAUDurYolB0MpoLPD7kpWMkCrN6ZcBqA4S4AUqMoAGPjTm1OzRgZ9NzWx70EbVeFbVjUWQZB2jjV5OQnyHKzNAEjmxZjMQ+DeUULB5pMu1+M6EIgzpY3EzsCrX5Cf332w6Wo+zmO+OQ1TJAHqC3lV4YAXXwEQDXU0AZCXAkAABMJAtdjwVLmgOZT1Wi+ZUEHYsEhBH1vO5ZTdgo8MoO+u48FCHMAdHgWVCEKFUyod6AvwHETtdoJ19exFKQ5idjOsGFA28Rw2YpkcO5d0uFKtGgjQZBMFJkgM2ONUIBSGjNEY6G0B2VKoxDAldpQult3D1eTZrZ0wX2llmsbK+pEOQjVkYjSOiF9m5cQwSJPsl8JAkgcSXrJEljseZw8VGQNUGrGs9AMr7NccUuy88tybgVZoKA/l0Lr4M2IMJxBhPSfdpOzLX5QwrZiYVVvmYrwR/A9VkLTbITFtjjTVDOml3V3xqT+W/xQ1j9I1+eoJu1ng+T01R15ZGo5AZLkGV1MZVStyH4j1gEz1BGr13L8ExBfLaE31FihbZ9rZoLb2MioIWcaQPE+5PZR5hRHTK5P2Q5hRd5lZFbYOvm3ghCnDuJsUVQzCUkP1oQhF5iCUcSCInIAsmUAAoptIoHQKbOB4Mug45J6djL8Fh5pBw+U2AP4J3cSFB8gHzBZQOHAzjjyJlExcmopnBhxDh7xHh60XnbxEXdOaZUa+UY86gTuxw03SWw2wPUu8C7PZPexzJ/PYvaxivSC8PYA6Io+wQj0HqdvZDnJzpyQLvZJUG0XWrJDtcB+Ovbp/kB01qBa1MonYxKNQORqpQPxn+sRCLJZwZ+yESLsj7P9hvVhErPieqqDcZwhmZxtRMG5/sOyBw1+rUgTBYm7OF8KmOLmD50hCUHJ0XWl8OtkKMqC6rHWPB/zAx2CxgPIOjc3WpM5OgHpfhJtFlxJkOhQCLMh/RJiP4BQIg3a3hCLLWwlzDDZCvoJi1Mh84/piN6feN5N9AMAgNycNlMKCLNlDQNuCLBenQ55x+BqOIB7e4hdrfSVgGCduXD7KZx4CQJN4UlTk3c0SdElyzXzIh+V6tOaQ9xBwNG+jCKTFINAFWbRq5Bw+nSlc11w0g/a4S8u3Hk94xIGyttXTDbmIjsm/x/aIJzXWXfpuqLNJmacQ5/weYrYuoHR9IZlGqHj6mXJ5T7gPj1kGqBCBwx+sMHlw7ZR7FY5LuqUp4hw5T8iB3GrrS7d7xKu753J0F+IQvKwbD4TxY5w83kMPa4Rf4IcEQJgPAETvafQLBzlPNHiJrTKD8OjYTxoa9zIaxMiJFc3fkGz7d/kOQHT6mfb/YMwi75dy7y/YMOqsL83UbIifwXkVd6CYE8r7ew3vr/lfJwPavRZxvXpx+HPQPYp8vbH154Z3z2nHy7ZhM2TCKHDH+jXurlqje6dVmBCo9DiB0ha5Lli0FDNqbwNF0p8Roik78XnvQcNVk98ztbkwu4C2XhRlAB1730u/ICPUkuPbJ+6Rx3H7p5U4Bju7AcP3Ozrw2QUHaWatHwvUvcpx6XP953vQv9uw0sv5ACPzk2PzsE+43uyhgAeb2YUTmral+32cf4+Evw8rNWxI6TV7i0kqhxPBcYwOEHGyJxxsaEdWQdzNAnRDP789aEo/P/n6SSRMcDkLHPqp5xdJccBUi/U/l/ygDwDf+wCZ0MgOc5tgYuHnMATvR864wqBkOSXhEml4S5oBn/CVJAEIGr8Re//XiI10zpDcioNkQbq1xFijcUW24CbsJmm5sNZuMCBboIKW7Xx8Aq3EqBtxshbc8AO3PbtCz9D9cbII/LrpQF677FdBvEd/M5BY4mRNe7iCQaoNMFncLBxOOgDYKm52D+aimZprQGcGecN6Lqf2kQE8Lw9PBk3bwZDjF7SAQIRAPuiQHV7dAvBNkMwbAACGxDghdAkgF5DiEccfBteLVBkPQgOFsgs0FDKMDa7v8YBu7fAewJ/6cCkB4cXiLW09InQRYokTuomwB56F6gynHASf3QIVCOBiA4gZz1v6YQ0k8KdkIihIgsC8BbAvoZfxqFDDae9PEWAsNTKM82AkwnodMKqH9DKIJA2oehDCGHIGBIXU0l0I/5TDwM5LRAoOgVTXJsge7LAuyxeoyJj2JZT6nSEJ5U1bWxgsmM5CU4NFCKHZINlPwU678yIAKGkoXQi4MtzISfWACfDlpnx9OGfSAOCKDbRBIRl3czl53hE+NRovw1PmcSMig4qEKSAVF53SHBDhCyAO9h2G4hfYZCv2ThkVl1CDBG4w1GVMZh6TrFTC0lV8qgGsxRFcQPZNBLiINa3QbInIqjppTh4dgIRZQygEkRYgBk2mijLgsoy7Y/cMgQgm4Zo0L4+w0uCcAxqQE6aEwbMhFXFnRWnhgxtR36YKvDGIadVeCe5IoJHQWTRVugIEFwf50Fq/RPRL6TmP+l4jGZXoA4VtryNGjZwhgRg5BloIO79dZE+MAEbnRSBLkaoataqDRzECNwwmoQK+OPC1oyh94Z8LYkQDW6Z9+AAeE5vohCb5B4mEeRJpanz604pQMTaUSqzBbnUvibfdPB30nYZMVqwJHvpfwmoD8Zqc4FJB8zrxEVoIk/DehSOEwAByPSviOU4CUwkgIlbMCOT6gjGiB/ZEacKAwipGWZ/Nbr4SDGxQyIXfLSGIgR751AMbPFHicDAwojmRJWRuMEgbjWVp2dAJFE8nm40IPh3A0DmlEg6j9X0RdHdoqgPEPjjxFQ5UQH0GHhVLaGEa0ScH4ElCC+gYqpjBLuFf9LqFLLdo+BOjXBPugye4d8Q5Z4E3qJGXlmWVIKk1KCcjFUZkGtTiJp49Q0iURyKJ9IlGbxOYvVzsw6UK4YgqOv8Hbyu9BkGhJckhPsSjgE44sQxOQl4I+V8QYIRKgMOlaxQJJ4UX3C3kZpTIRQPFYqlQHZrZ92xZ1ZIH2O4k8QRQmAUjJWJPCjtuxM7TvtO274IDhxALA6kCyH7dEuY8EoMkiXoJ0R0MfzTgVyOKLvdxGnE1kMAGgC0J1u/kBocwn/EkB8gQXIoIgBZQHjiJNRE6M+N4kqM+Cj2T4N8A8CRI3yQkyuNXE0lpRtJW6D1rJKUllAfYikmQuuyjKESoRCZO1NF2kCxdSWrLfdo8MPbPC7irws9l9SrHX8+kGWa7GCF87pNZ+sI0+Ckg/b6cKk08KLqUAoF0wHk1NYDvOH/Tk8U4UHK9pTmBgpJMA6IJePriD5kDXO/UjztZLSmjQvOvgx6e5zi52i/0uIsjjIlz554HAdXaYDPBURJB3poXOTnVA/gSB1BOPThv2x9iNUWxw7ZEFzhJA84bYtAClOyEbggwwkARX6FCQlYQ8+uZMD3kZKnGoAaRt45adP0REH9yxHbOMX8QTHyIi+m1aqAsHNBRYzME4gSPLi0jC4rJXIqGv2wQiqoh6HgCyU5NTzt8BqrkzJoOI8mBCB2EJbyYP3LJQBuy+MScVqmnHdAkkYhIFBvS4BbjYAjCZhFtn9xcBYgHkVYCcSTg+18A/ubKHQzObbgLm6qDyO6gkAyww2JICKX0hXIucKAu0jAFvnQgmzLu5sg/lbMGQ2ydw9s7cI7J+hoBJyUoN2RgA9km0dwlzX2VwH9nCMg5axSKR9PDlPS4uTyXWRzP1nBxaZW/GOWbJgCJ9J6CczSEnLtkOynZGcl2dnNzlrMAwPs7cH7IDkVJMJmQyHBXIjlRzm5kOOOV5w7msgu5KhHuenMzmuzwYOcvAJ7PzkjzcAY8kuVgEnkBdp5dqT6QNPHSOE5E/UeuaqxnG8QHy0uO1EcK8AAoiAcc2Ee6kF4+8NAb8l1BPNKaQyw5s8mfuhGfmXkNqb8j+YvI3o/zveRAWlv/OcBS9AFM2U+SAvIFVzI5TyAZva3vmGyhhG8GmDQBAXLoVI+oCIVEJiF0A1S3c1Ob3MnKIAkIWyeGXvO9lXN0WsULzl/MnoHo0Ux6YubQGzSxZwZZCrIRLnBHpIvA1C/wLQtoD0K15jCjeYwlYV0B2FeczhR5G4VpReFrcrzgIpYDopgAwiq6HgpJaczPmD8o2cbFhnwzpFJkJRSnNwBpznZkACTrAD4Xz01FLoNOoSl3laLh5XCsIB+HNnJsBF13eGVHJhn+A4ZAS3AI4v1DOL157izxXAshy+K2FCSjhcEp0WhLwlkPPCJEviX+wNBkZTdjdUfCYjzIXnciQewLJjT3qZGSaXSBUkb88ENrK6eLEnnXlK2JhDBNEAtmNAUgQyg/o0CgboZ2A+Mg+qMCPpm5tgAo70NJBOlWMu2RAmhK+gtkp9lOjM9Puh0grx58WoSFJK+hqCfxPQOyyuucqAEZ9cRIMSee6y2Vtz56afePhC18Azp75GhX2ktE97iwMWNmGrvNMJDBEfgf/BuRH3QCfZDgDImApw2axTVzypOGdHzDpGyk9KSI9DqSnR57ltlu/HFUbEvifB9g4iTxWABTqwg7QgMjkDRk37cdVsYwWECtIWhLQHKFs/sr8ooB+DZ+XnUTpWT9R8AZ0HMPyJiqZkbBV4t2f9FHAE4cqjYbU6lZYrtxqdX0bUkgFcvhxqrkRiifgk9kVZxtZofyiFTYvl7vD4WvgGsYO1RkX0mguIusRGAbG8EMZWALGTvBxn8BK+NUKbIZH+B/8elLZaqIuD6oWMux8snsYrKslXj9c2TNWSOM1ljiYAKSCfvTJBFKco5WKo/iM2qHAJfx44mhMmvQg3L0OtADVTmiLWehkRAKMWToRzXFMQqBajleAo2kojHSmE3NZAAJJTUvl2QyFe9iSSIrBi7okgLM1354p8VSnUlO6kbU5oB1UVC8sOpXFjq9x2KklFOvFUkhMFTMmubfLVTF9e1j88Zu+BXSWRLSpQNdbCI5JzAfAUczjMerXQmk11XnS9d4C8BAKtGKpPlU8g7QYYrFU4xuUkgABURKKoFJmtReA34gqklACndQdo2036w6BbNEXoQgNIGzZhiAg0HQKAUGmDa2l9SYa4pB/bKSfOAVbqoA+C1XD2pNVb9KVtAWEQCizmtQT15qE0vkEXWHZZAFpRws0V/wsbIA5augDso3zeLJOTJK9a+vAU0a6NDGzjTLlY2jr2NnG/IdwB42Wp+NtAQzkJoMUb1n116ixYM1/UGz/1vENVTspHVKdhNO/JTu6jU2lrjNFyw/gut34ZKHN1m+zepoOUVKCJVS7qSQtUR7SYwuZEaY0q5bjTaJC1c9jKPOnDFEKIMTxcxrsoNywqM2XzaThpW+t2yudZ5SyqrVQc6Z6I8zrCOiAIi2szanLWBLZT5balG9IrSOR+jDI6SRAK1jVD1XDAauMWxZSSz0opaaAaJcgGIEOBH4XlMfb7t1q0w8KhtU9FTlRoZWNq9l7y9gX7krESy+AKM+nDaumnmSswPIhAK+WkCQhOtcs3qgrMWpTtlZ0aocbGq8kFMfJ2s1JEYWeyW0UkRmsGU9GlS9aBwA2i2Yahm6/JDsFIAACynqN0jjPrRhkQCwiLNalHNKNve39a6kX2lkmN1+0A6gdrG9kKDoG0Q6tNkOTfE8gynGEGiz20babC+3pLW5sIl2YvmjGM1Cl5M9kIwlDBZxPSXnVeS4rcUZyodYi17UkBJ0TaP5k9ZzZToqDU68ItO74fTvsCM7uAzOjeqztSUc6LhG7LzTBmR6XBQ6QTepUFs5ZEZmlp7OiVNKUArFNYMjSpI+Brrq7Naz4xqm8DiSZk9J7GRCkHVSy8E5WKQNgKY10hGgKARtF0XphmxgECALCmSpwxviZsaVNkJ3Q1BBpTxXZBhIJOhntDyLfyK2nWjizCDLNMgecxhLMKgo60laXBFWsok3iijfiUgRuJHpDo609McGG1hnojp+6VenUSWH335yQ5PQ9MX1WZn9xTIK9ubfUMECpESq3aHtL2rgELihAuV5AegGJo2D7MBoWvKUCcyeD4QA8cdV6UXEn2pFAmmtSvZHHlpQVec9e2NgsXpAUJVJhIPwnj0hy7bt9wdIsvvuSAZ71EdIJXhaHt1pZQoUzImtHs3RUT9gxQHPI3FNxR0sAebMhim2HihBmaaskXOAcezMg4IcGeQFzSJANbTu/NBAULRRGmdSYvBI9PsF4I+icQTxNABZA7jMAkUuI1/RUGcBIHHcD9bmmgfTH0xyaZAW/TmzgPVsHsFtMcLrRhq17vdHuvOYPvNqh4PwRICHF6EgOsruVUQGfXszwCS4F9WfG2FLSdql948Dgd2sHlH0QpkJkrIJrvoGrIzD9vumhqvvRTqJFKMRNLaFVzggF1UkYd2C0HAQeKN6tAeQJHrJiWroDBYkGAodzF57PDlET2h7SirqAPGaAdLJ9kcC/kCx6Y6kXrQENG1G9ZcOgH9MNXcqu2ve2fYoYGjh0RQ8h/4K7W0Oe1otTlQ7T8XDUnb+xT9PPDGrBL9941y7ZxJOjQSqzZRliz2EExmZzNIAizdPYIdwC5KNmWzHZrkd/D9GjmOmrwBSnIwjH5glAG5i+iDYq64MuYC3QODP5tG+cnAmlZ/s1rTMQaszEGvM0nxHMlmQxhY5s0oDjGAjBzc49fhmNzHec1xrZssYZVrH4MmxsQLAXwlXChOlwTLm8E114YnhIW3XVWIi3FduV9nM6QhC2k9Ho97+6vI3oRrqdkaUQVGpbxGAhIkuIkv8sFhv1gFpsSyzhujW6Oa1iayWfTaNpP1e6fdwhxCozzVADRyAMQyQESx9qZGeVVcVkLkR3n8EfYyhk5moYJl17UAyhlg/YBZogwuoxoL+nKxJDK00DsK4YL0HTHkxS9MITw0E3bJV6kj4poY0ftEJPFTGYhiQ+3sgABYn4HGQ4ESEXo2xkEtldfRPsCBjBNcJ9HfQomEMpAwUWY+QK3q30MnTG6rEiAbN0gFGEluMiw0MHH3QqBcRPIINTCAQd6bW3e3wDkbMOmmcUhfArDfpDNj6+CyOTSpFhiDZQtDI+8oztkaB1i0zXpu/SaYrjJmTQyR2aPGcn3IART5GGMzHTX0dmeTJ+nI3Kwu5QVvycRkOqYeEPTBdIBc7cMxGr54RPx6WKRh4L6JMSEJ5o0mvQXQi8Dmu5TXUcgEKmPFPAXwPYK9J6akAqDQ0S9ohSsC0toAdgLUL9BbbpZAoZQGzjow/BdNZQhjRAMY0ohDw6QH40yJHupMonloJoBDvR15CMTWmCE4nm8BPMtaTCBqv2kXuCAt9nJaTJWQOPO0dH52Gs67VrOcQlN31e5t4AedKEPNgTJQZ8eaNRwtQogNnVczI39IbnApoQY87wSUQ0qUzOIcWJeeD4/m+m5GsmJSYHC9HTjUx6/JcbqhvHKAbje0+qt5w0prUghTAHccFN4on8Lxm2LkrnPXMmUoyGcwxOdA4nHS+xg8TRaa4gmHkHUypcyxpb0t5R9yEIKCZwKjSITNElpfroFaZsTwlTJy3SwZaQS3LGQei9MEbm2YAiN/S7EaOqh4qJtCfWERqvWnir/OGanBC8T7hl74VR0srryA+GRELpyiNuvfSjWuMBor9BuFTiYXwHruLI0rCSMogKIxVqVglSSjaLBw+YH66gUoEJXDwSIRoKVRjwtmpgh10GuTjCMno1ZxFw6tSt1liuad6DfVyHBNfnVTXvuVW9a6NqmtfRar8OGa/PQ0CRAl0W1paxpxRp6kdrhCM60OH2t+S7OPgSck7xRABWdKDV4rKyM8MuYTG9AD9pOEQB/XurHgPmIUDbQA3xk0chGSxDRC2S/0wrWCofsIoWTH4oLdCNm0SX3XpASKH8PgBQw4wOopQLYACmWBqVG9mJrTtvhCPY3cUp13FHjYICE2pAxNogKTfJscMWINiDofaCFZKw88/0rurOiEqgNtwsCb0oPpvFSG6QVUEyaEkFBIyelzYtbR7mdWONoG63Isx02izkMq4mAcQHYhUk3YeICwLtqmIRP5EMrk0EAvazFFmUU1MfZJmGpcmRq3JKs/5k0eIsJqwIZ0kq2AyIW+NpkIQZy6FdHQ/h3LDyP8JAF0DJF0THwpKyysysTarlBgGO76S5gJ3/ga1nBMnf2V71PNt4J2K5F6ZCBmaGAbDMNLBNeWddPlvXeFqmlpsOkYQO3ejRzn7xA0xm+oDGBo39kaNiayiJAPUk7CBoNd+kPUEcCostI3vXgqlNoD1BcR6EeewwBjBEjI5tmNezVBrv0Bl7k93GlpBQzQAHCbUA6X9mFIgMIibvEoP7PgplB0InCXAHcCNB+IAGCNP7A/aftUow2xd04MaJ9jIcqgbUDyKR1+4dgf7VKZAACnQgAABaQA/cuBl2RY0D5uswjABwOPINLUrMA6Jio5suNkZB8QNQfoPtwRYZwHKAuyY2sHG3OWpdfROqrru5ysOKCtxh/ZvEy94HFYUMaLhtzbWJQBIEYcldNoysDhg4JevEMmy+PegE9Ezb3TwHxo3qGcB0jqVorqNavrwXPiZglAXWd88FGSAU0fmBY8+AWAfgSPYVzto7dUaWmVWBqDRwi/tW9stGDAq7CMv8euryUdQEDSuw8OrvBba7PLXyw3bpDlEEw4gCBv6LNFRWoVKQc3no8yjL3cwl4zZB9qOD3TpHoklABA34rUBB6yy3YRa1kSgE+g4YOyQdLWpqQBAmYjDMC3/I36l73dmekLlhDDAxkkLPmIGH5xIdR6QYV8D8JVuhJ1Yt9+g0BXUBvn2QEuQqM1riVNW4GmTvZOhwAD6gHSIAk5sjahqWFDjQGiAiBiswAv6CpuwGZDSBKj47NmUtTO31GLtjRoi1JwozOPC711QDNkBulh2NhXjiieCb8cnsoTjdw/ctcWmznDnxBTiwwdmK8Fa2e3cqeZeiBcQ0y/eaAAAA18I4BxoCxaaZsX1z8F4FzzdchFPQgiFvfeC/9zVRpg/JT2lMjANKmb9tbQkRcXQ3km2ICEoxJW2RjhhCXVLL8orS3hDrEaMEY5NtuPrJsNC3WLZ1iaoSB0lCilpvmh3IIyAdKAAVnWAy4wx53CMI4EwAgPFH99KRFCF3bSH9QzNcez+Upy4vygoEE4BC8HZvBzLUiKsoYzT3MGnrS5sR5jmBcxPzLQlk0foyUCVRhrxiXgnbDPJDrTXbL16YSHQ7FmokzG7FgpPs3FnLCOLsGlG9KC6S+L+bEKLHk22djW+LtnC27fOc2PLndjxdoU18mvNs+7zSjWU+sdOdPb1zkt4gFxmeqHlLZXZ9dxhDMTGpUUiFyZd2F0AaW9EODsnlcddS1A3AAAMy0taWZQjy5RKPahaAnKECLU3Z3uzQ1zAUhRvwR3OHYwIVgCd7SzIh2l8EPEHVSCDt2WXOtSSZFS1m+73z+VNODd0ebVFvFYnp5sqVTUPfF3IX+Js+naG3dWAwAe7xqVsQ/wFs2Af6P871NtrixNKbYIPRZjdANgflJAc/UI9JnJUdDUyP9wB8neJpRA2g9xH9iveSUSWS4jt/i8VlIRRCoQGjeZdJeMDdaG1JNkUrJgApoXL6xoAh9+By1OQhwBiLgZamyJwPf98WPcaBMJL9ElyF6E0Fg8IBuAf2W9xBdI+Muc8zLk10XEoVzliXnMnUlnN9UltU4fISwkMAB1oPpXUQLD4B/vmbonXjcGewJ5/JQF94GnzXgIkMkhH6P1DC3tBT0QpuSWsrcNxm9BYWTG3bIieyTC0hbn29oaix67YMTu38Ltb+xzc9u2wl2LmLjd7Zg/chy/3e7y8U+6KlKIPgZ5uMwldxGcJBn9BCzzh7o+sy6YTyVLxi4RLAuUg+x9CDl8ncbWkgAKMD2AVICo6JjY65Nu7LwDT5aGihmlCLoRQJLJ1XASvD4C5QNg8vYUAr/wRsJdRdQFAW3s7GMJCu8q6F5g/V9Jrru6CCIVr+1+QX3zDUF82gAt9+CzeX1t3txjIpc8UAaUK6e7/N909y1MKegIMAHPdS+DrFS30F7IVW8kBbCG3rb/dtdgZH9v/elx5cIedVJiJEgSMF4AYAzuPnRZOu986oy/OrrWngQIC+xycJ731cbi6o22BRRD7bUeqCiKBqQBCbLCqIG0KB4GE0Sttw+d+/C9kxUXq79FwGSfuyAbM2LgwgH1yc4mELaQJ1CNGrz3lSp55qmtT+gC0+rVyGW/KEfFaU/wwRcCG8s7JrGK7EiAFoNGHyPjknXlKKTAHZqc1RqXboWl+BukNkBJ7OcE/R3B0QsgbMnnu0E7C2DOgqYcGL+vdJRnIZAAKARwwqy3JvfHkAKDR+gsfUPAKJCJCJtNvutQPztEfxpBI/af8jiZNEjR/cRrGdP8oC8D5/F88f9HLgCT8Jtx4ofpveXBYtXxPaPwXicZCprX2MQ7R7ODD2Rnm+TEC5vLNoWdfg0fzCVoxiyEAszZUpQ9sxn6XyDeuLoIBAsQG+ifDWDbESS8iDGV+0+NAM/yeR0zI7XcDbhhfhCYWBnnc2gJXVP/GxT+KEKAyha5z61t7+BbXxopCCwqj+L5cTWQXQq9J9jHdBgHPySATJB+jSBdTLoAmAqcOalTcB2KmU+B/PdN2z5hXLMBC8xXLPDC8p7Xpwy9UAXXnIJxYQRE09k8bNxi9c3OL3zca3TgTjUHHIpmccHLZXUAJVdVHmY9/NN5waVtdbH38d67Rdx+dVDP50J9AXFu0IBSfDtwp9RoGjVB5M6bOggtttPkEPJOCaRjZJGvBgCF8bMBCVF8jYdGil8K0V3xNcrMSxRo9TXZKkzoyZcXUVoRwd0UMhVIOCmWQTA5Bh4BhgAIzJwSGeeFsD7WArEyBIheRRGgGqUimWR9EGNnmgkqcT2lN9XNOBU8XCFl3Jp+RJVXbIDnBFjnV+PM1wMIvhZBklwavYFnvJtvB7Vr4eTDCyEJdIOAK2QPWQeGOdjtKx3i8LnAiz7463G7SMBaAkPUsVCFZOiZU06DOma4pA51USMlsOgIBMHmRMmDwSAFMhOB0yOSiGlvHTy18cOAr5zeED9XgIJ8T9LOzv4H+N9nVIZAz9ka1v2VYN/Y6yQ6idxE8Gmm+gxyBrSa17pPiCUIBgoYLTIKAKi0wlSPaOXjgKmVVGIY/QZvUgAPwRrkBgrAexzVJ1Kajg8Z2jOzwHJX+M0HXIAkfKE8waAN/ntsBOLslfZZAY8jBDmQR8k2CubRcyH8mtHWEHJdnZ6BED8vDUX4x7/C4KzJrgsMh+kU4GjCpt6DcGidg9eJQI7dRfE13I8T9aclI8LbRsECZCQniHp51TKwkppHdUQANkgqKAioBhPS0BLZtpWQiwBQwAQGLhbENFkKtDRafzd5dGU0U4IfXPOESDIqK9w/0xCRgSsE8IQv169DpGOnKkerRbRjooWWrwjURgDnFrF7aB1Q4RGxFPWiY0ZUoMsdcLOowLcqg9WSS963ZxGccw0FQwWpbMb5QHZq3WdlH4qA5Lx6DKWYBGXsNAMu3ZBWArXT/153LgIowWICkzYd6gBMPLtYYFglAR+qA6QdVTQNg1xZbMZSBxDEdSAMakvLO0FSlWmXex59q8drVdApQHmGlN0gu7ApoZIXhCvQBJQTlwENhdjjG9N3bYG3tDXGox45LgeJ0SdLKaAn94Cw+AK0gOnBjhBBBQAUQ0IVQ/Rk3DcRdECUBFnfYN3g2UJsMwC6YaQwQBeQSBXKlxYe30bM2AG4xMJgDQq2qgYTKGnZAjnThlPD97XnzgxfAGJ0md8AHmG6c6kMmGRkkgIgEOAXPewFA0MQYcDcNRgU3xYsuwnLAginWNU1T9lIJsA99eCFLDQj7iYkBoBmAfRGiAV9GOlNZOGGwGQ4QIGoAcJkOYsNQAWSASV1ssAb8Nulq8W9D/8+ZNsKAi7Gd1kYjQzBEGiBoHTR2zArgAsD40MAn8LphGgNpWQ9sI1g2mwaZMKmIYvLEUBKBhQdShYUYPXEQD5pZQJmcBrYNtCeAoocRTJgcA8EEhszyM7g2BfNVIBKAVQNk3ZA0HTgXWg0Nd+gW0eAbkBwh9I3VkLD0jB/RtCcIMoEiAy9LSMEiQI61HjpovKo1i8znPC0qDEvYt1qDZqBECSjRxGHnbFyw0WmcJoQd1WkoMtVQzxkq+Z2kl8lwosIFFGpNiNJw6wur2HcDAdxy2BkwDMlTIbVXMBuB4wqTC8Bkwnx3YDqJTgNx9uDdGmGdcAFDGTBQIRmlbJWoj3HpUhlJiRAhJoxoGXAWAEaCWoiYfACt8aGcyikj2IrAAnCMEZmk+AeIQKxSARosaJlDXET8O2guGdVEmBTEd4EGB+gKcNeAboKYHFhyACGjABx4AaQDBEMSWCFcb2SFmmBXgOYCmR6edbTWdfff6KNhwYtWyoYPVU11iBTcbcGwA/AVjDbABoFkkexUQJAAGl9EaKnoAAiPYAOAjgRqjAZrOZkE38EQM6PGjLo3bwBtKYusibg0yFNgi0CDDYMgBY4GUOiBJETEFkAJlUilMQFlUXG+ASYkcHQ5FCfgiGgFtc6jLsQIn6NpZlgbHFXgfAR7Hbt5YsmFWBdItIxP1uAdWOFCs8JJzh0qEP3CIhigLXgfomHTaAFMVYloXPDrohWglUjQVWMtjBHMo1r54YkGB5ju7DgBo1GgR7jFBdIPWO4AixBEDHtqorSAM9p4IulnDT9ecMwxSCBVnVMWgrtgjiP9EGFhjpRIaExAzgE/UE5Y4ypydYZzWlGJclYMqCLM/IkvkgAaYi6IgdcRXmI2iT9MmKClqY9QHOiS4u7inZ1ozaKgMaACzFHCT9GuI7iVCNQms4EAOrhwC6EJLQqkruJxk2R2QauFUIT7VsMti+Y6uDIBZ4BePYBn9bg0zjkQPLlo8cDZgFJ9SqeoH6lGpGjXkkV3buLtBZ1NOLl9W40aNpiIHBGJQjfojKnLgPgZn0lwQYlwItRIhV8DdC4o07QSivQ9KOaMimAgSDDSEdVkoCrtZLwpQCosxhxMh4haPYw944sOCdEwZqL3j2o+4BzCuo60nqjEyb8AGIrggUR6iJgvqJeEwtbgLkiuITuDyCqafu0No97UIDa8bAECDVB6oFDE2ltgMhNKgTdJMWxkGVD6Mftvo56TPgXotjgl8WZap3Hjy4EaPfimudSjgpC8DHDkgTSOzBaCpcY0SaBbTLkHZAu2ImP2AOKdLFsZndSn0lZihY6PDcJE6vGkkL4lONJkeCWg0/C5qaOmGA3mKyX7sRQf+AcQlI3114p9cTNwjJiA2KNID4oz0IoDIw+BL9DUo6aVgTYkr22S8FxB+nICYwowCoiaIuiM2cQUQLV6jUwyExmCPAbJNoj6I++KlDInNVgRA+A+KxBVRrHc1hDDyeEMKJ9/aGxf4Ng4clppjpJDlOlL2f20Dhaxb81VCFAEKH/MJ/WaDdh8+CwKg9y2XYO44g4pEPowgqfoHFpZNQKNb9hZTvU4IGEnRG58zwrAEttMoU1F2Dwyf3hCpCFbcP18soqC0DsEzWFQnI5NZCAcpmkx/lWCz4TpMiA3+HFjioEqbI1uk7EZ4lyCauB9hapNWbg3IxdJTxL4AYAwyVspjJWVjMkgvcFhiiTnXsTIDQEmJM8kUk+JPqC8fLymKj5WfEHehKkpvhGT9GQK3ukykuiIOlrOcZHRBLQmFgnZvQqMIWTq3TJIMBrk6QATJuAP8JBjcwyhNncmlHHxKSxkkWJv4T9NkNGg3klYMPMZA6eC+SUQskNrDgtLtiConYTZCc5tEAYIGhFKFMA7V3PA7mdd/DNfwcQ8af4B1SiQUjx9h9U0jx9ZppTsnv44QhEJYBNyD8ABRC6DQDUpPk1chBCTyD1K9TN8MeJN0QYX6HScQYftg78vAMUAlYfgB1M6DdaboJ6TiU0MRqggqEGKpRq4ZojdAy4Owxkl/Df9mBZ7pblIDANE/AGqgbpaqhexKuCsQtDVtVsVtUK4e0MdFgdYXBLYQmIBMiSQE6JIjCcUmoJIsnHD8M5TuU3MFR8IgDHzLshUrH36jpg1pVz0QoPgKlSjQqmhfYWkt/naSYiRVL9TVgyeUQo6w0mQ1TtAEwgQgrUm8PoB9Up4B4w8PY1IxCoKCwOrxT02xBIAbU8WDtTkAB1IwREMee3cxlkp8jLY5AdlzDdM7LADWSNKZECXI9KJVNdTmAd1NxVs7WVNaSYCANP5VUAcOhsYSUscI8AgqA1nX9ScZ8PntK0/3GrT9DcpyGABQJEmW00ZKmnykeqCJJZSokmdlsdqg30JSjaA+5y6k+lIBB6lgQmAjGD3nCcJoSF3CjCowQqV8R+t7GGVEQyoQ1UJagNRU5IbJwyEsIDBr9DpThxfU3jK5tWLRQOO9hiBkPf8VMssJ4dMcFsnn88Qni3mJTXEoDAAHwp1nZibMHDNkzDkoD22IC2FIIIVIPFqVvDoYO0A9dR0xqW1CeLM1MWkMEMDKVcB2KgH3i/07DIAzZAdlx9gJQ1wJ89OGKBgRSf1RNOvDyYB4L1CteE/V4Y2UJZIVR6ANnSYUB2Gu3Mtv06UEyycM6Wg/D1KPLhltA6QFKFBkMJ1ilkOMREIhDlU/zhQyHVcRAWA2DaKwfZ0LXDNGs9yaDMKJoQjHmkygcI2G7U91Yl3wC/PWGlrIfgdrPVtXVPxHq4JnbYJVT3WWmXMd6M05x7SmMwtxYzkowdKgAyLQvgLUZs1YOf4d0lgX/ZZAHjK6SQQioU7UgUndQM191WxU9hmsveHBDkQtUgBRrwlJRUUk4GDWdT10p/jJJSYOxEBzoskHLByzQBhVcUmFAH0eyMFUpgmzVgg8S4yXs+zM2Cz+T7PZk75SjUDt+1AHICR3U0HKRyzQd1KB0oc5YKQyo5WdQDS6crrLVJGcpNyIBMczTOxz31XHKezdg17O+T3slpHqjgrFyxLpMfQTLTDBoi9hZoLubpRuk0mIW1K5IqAnL6zL9Ngw3F86O7Mrphcq9KNSYWE1IwhDcyLUpsb+am3WDxczijJxIWBpMWkQyaHPeS+EzKGgAQgWtiotMrEIAosSgKi2DlFpdsWis6RR5J+x8rDrX00nIIdS9yMgBTJvID3aUU7M+QO3OVTRs/lGGtboPm2fhLczPNekdbSsiczpIoZgzZhbN+iBC3s5DJpzTydsAtD8zJYJdT/U2vLshoUpbS8YQ8Z0KHZ1tc0WDUiAujPRTrQxjPclwE6gN8lTxbkX+xvck4APMewMqmJFeIAnNWkaEfXKbyYcj5Laxjcr9TLkQ5ePNwAA8jADnzCRcqj1Jl8hojXy1093Phxt8sjS6MiPffMTyiWKay1IQUlJEvzLcjTOryiExHyMAnLUYMjsAtNlkKS53YpPnTkgDcJN10IAAoit9pQiiGzakgn3qTkPE2zuwrJK/LlSVUj9mNzDUm9LNy70pXIKRBk6Dj9ZkxBDjOl08qEOzyHbDAtZz7lSsjNTxCbZM9xebbXKCp4CqFSdSWcmDNpzKoVyCBzucuiB9St8ndNBC3UuiG68OhAQoZyhC8sRhTEk/4kVtO8tHRdCbVPQ2bTw8B0KjxlWFFKzdB8soI9DTs1lLiS2M4dMLtrwWcHsQjWZaJnSA+LUj3BZ05A3FixwFQDUBzwacCvADASws3B1AeZ0shEAeZymcQwOgHmdV4ApCrAvCmsEgB/tX4FpYAAdjiKBABV1+BlgOIqpAKQRYDldaWfEFSK0ABV1WA4imIuWAVAGIsncqQBgF+AqQAQCpBLwQwEsLaWRYDSKSAOIrlcGAKkEKLFgWlgYA4i1YG4gBAWlgWBVgf7TldaAOVypASARYAYACiuVzldfgTIuWAPAGcCiL/tKkFSKBsuIopA0AMdwkNRAKkCpAx3CkAEBCisd1oBKiikEhxaWCkGWABAf7RaL/tE4tqLIiiAEgBJ3DpCyLlgX4DiKSAOV1uKx3E4oqLTitAC6KSAbYpIB/tD4roB/tAQAWKGAOV2WBlgR4ssLfgVYAmKfi/7WaKKQd2ksIPihov+0ViqkFoBPsH4rWBDizErlcJ3K4pCgli54v+KBAT7ESBti+EvhKri8EpmKKQMdypBfgf7RUBVgCkApABi2llWAx3AQFWBoSuV0RKoi+EqmLFgfYomKwShgGWAYi24rQBlgRWLHd8Qf7XOLoSzouWAlAAooqL0iiUueK4i2ljGKCS4UvZKKisd3+1aAa4uyK6AbopIAki9EqpBFgNAFWBaAf7TaKx3HopqLqSqADQBJikgAyKvSlIvxBaAVYpSLGSzYuDLaATorHcCirkt+AkixYAEBfgQ4qNKoAOEt+AsihUuWB0i/7UWB/tellWB4SvEqqKVgZorlc4isdxmKYi1MtaLUi/7UzKAwZ0uuKiyhgG2KpivUrldMihgE6L3aNYBaK2ikgF6LaAOIsWBVgborHcWy1MvaLlgBgGyK5i5YHJLoSloqpA0ADYoVdgy0st+ADi84tmKQrWlloB1gf0orhJi5YHOLiyjcraKVSlUsnLciyov2LuIMdzdKKQE8pXKcyzIuF4zyzcs2Lqy2gGtLUygQDHcSAeErAqOi9MqFKji3UojLaWKkFpZQKzsomKWyrovSKJyxYGpATS2lnuK4S64r2KGAWgFUBaWTctGKti6Es+xhygQEWBHip4qgAfC3AD8K4QQIsatgi2gHmdKafQCAA= -->

<!-- internal state end -->
<!-- finishing_touch_checkbox_start -->

<details open="true">
<summary>✨ Finishing Touches</summary>

- [ ] <!-- {"checkboxId": "7962f53c-55bc-4827-bfbf-6a18da830691"} --> 📝 Generate Docstrings

</details>

<!-- finishing_touch_checkbox_end -->
<!-- tips_start -->

---



<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=arkade-os/ts-sdk&utm_content=108):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Explain this complex logic.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai explain this code block.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and explain its main purpose.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

### Support

Need help? Create a ticket on our [support page](https://www.coderabbit.ai/contact-us/support) for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai generate sequence diagram` to generate a sequence diagram of the changes in this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0e17d64 and 4f277b5.

📒 Files selected for processing (6)
  • src/providers/indexer.ts (2 hunks)
  • src/utils/transactionHistory.ts (6 hunks)
  • src/wallet/index.ts (2 hunks)
  • src/wallet/serviceWorker/worker.ts (2 hunks)
  • src/wallet/wallet.ts (9 hunks)
  • test/e2e/ark.test.ts (3 hunks)
🧰 Additional context used
🧠 Learnings (2)
test/e2e/ark.test.ts (1)
Learnt from: louisinger
PR: arkade-os/ts-sdk#115
File: src/wallet/wallet.ts:821-822
Timestamp: 2025-07-07T17:02:26.667Z
Learning: In the Ark SDK, the Transaction.addOutputAddress() method from @scure/btc-signer already validates the output address format internally, so explicit validation before calling this method is redundant.
src/wallet/serviceWorker/worker.ts (1)
Learnt from: louisinger
PR: arkade-os/ts-sdk#115
File: src/wallet/wallet.ts:821-822
Timestamp: 2025-07-07T17:02:26.667Z
Learning: In the Ark SDK, the Transaction.addOutputAddress() method from @scure/btc-signer already validates the output address format internally, so explicit validation before calling this method is redundant.
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: test
🔇 Additional comments (20)
test/e2e/ark.test.ts (2)

194-199: LGTM! Terminology update properly reflected in test assertions.

The test correctly validates the new "preconfirmed" virtual coin state instead of the old "pending" state.


304-305: LGTM! Transaction key property name updated consistently.

The test assertions correctly reference the renamed "arkTxid" property instead of "redeemTxid", maintaining consistency with the interface changes.

Also applies to: 317-317

src/providers/indexer.ts (2)

565-565: LGTM! Virtual coin state mapping updated correctly.

The convertVtxo function properly maps preconfirmed vtxos to the new "preconfirmed" state instead of "pending".


595-595: LGTM! Transaction key property renamed consistently.

The convertTransaction function correctly assigns the virtualTxid to the renamed "arkTxid" property, maintaining consistency with the interface changes.

src/wallet/serviceWorker/worker.ts (2)

371-371: LGTM! Balance calculation updated for new state terminology.

The condition correctly checks for "preconfirmed" state instead of "pending" in the balance calculation, maintaining the same logic with updated terminology.


513-513: LGTM! Property destructuring handles terminology change with backward compatibility.

The destructuring correctly handles the property rename from "roundsToIgnore" to "commitmentsToIgnore" while maintaining backward compatibility through aliasing.

src/wallet/index.ts (2)

54-54: LGTM! VirtualStatus interface updated for new state terminology.

The interface correctly defines "preconfirmed" as a valid state instead of "pending", providing the foundation for consistent terminology across the codebase.


85-85: LGTM! TxKey interface property renamed consistently.

The interface correctly defines "arkTxid" instead of "redeemTxid", ensuring type safety for the renamed property across all implementations.

src/wallet/wallet.ts (5)

188-188: Terminology update correctly applied.

The state check has been properly updated from "pending" to "preconfirmed" as part of the renaming effort.


259-260: Variable renaming consistently applied.

The parameter and variable names have been properly updated from roundsToIgnore to commitmentsToIgnore throughout the method chain.

Also applies to: 277-277


297-297: Consistent variable renaming in getBoardingTxs method.

All references to the variable have been properly updated from roundsToIgnore to commitmentsToIgnore, maintaining consistency across declaration, usage, and return.

Also applies to: 302-302, 313-313, 365-365


325-325: State assignment logic updated.

The virtual status state assignment has been updated to use "settled" instead of "pending", which aligns with the new terminology.


346-346: Property name updated in transaction key.

The property has been correctly renamed from redeemTxid to arkTxid as part of the terminology update.

src/utils/transactionHistory.ts (7)

10-10: State check correctly updated.

The early return condition has been properly updated to check for "preconfirmed" instead of "pending".


44-44: Filter condition updated with new terminology.

The state comparison in the filter has been correctly changed from "pending" to "preconfirmed".


76-76: Parameter name consistently updated.

The parameter has been properly renamed from boardingRounds to boardingBatchTxids, maintaining consistency with the rest of the codebase changes.


87-87: State checks and variable usage updated consistently.

Both the state comparison and the set membership check have been correctly updated to use the new terminology ("preconfirmed" and boardingBatchTxids).

Also applies to: 90-90


113-113: Transaction key property names updated.

The TxKey object properties have been correctly renamed from redeemTxid to arkTxid in both the initialization and assignment.

Also applies to: 117-117


115-116: State logic correctly updated.

Both the settled calculation and the conditional check have been properly updated to use "preconfirmed" instead of "pending", maintaining the original logic.


171-171: Consistent terminology in second transaction loop.

The property naming and state checks in the second loop have been correctly updated to match the changes in the first loop, ensuring consistency throughout the function.

Also applies to: 173-174

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (1)
src/wallet/onchain.ts (1)

116-121: Fix misleading comment.

The comment mentions "prioritizing those closer to expiry" but the implementation actually prioritizes larger coins first (line 130). The current implementation follows a standard "largest first" coin selection strategy.

-/**
- * Select coins to reach a target amount, prioritizing those closer to expiry
- * @param coins List of coins to select from
- * @param targetAmount Target amount to reach in satoshis
- * @returns Selected coins and change amount, or null if insufficient funds
- */
+/**
+ * Select coins to reach a target amount, prioritizing larger coins first
+ * @param coins List of coins to select from
+ * @param targetAmount Target amount to reach in satoshis
+ * @returns Selected coins and change amount, or null if insufficient funds
+ */
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4f277b5 and 2179e75.

📒 Files selected for processing (11)
  • src/index.ts (4 hunks)
  • src/providers/ark.ts (2 hunks)
  • src/script/tapscript.ts (1 hunks)
  • src/tree/signingSession.ts (7 hunks)
  • src/tree/txTree.ts (6 hunks)
  • src/tree/validation.ts (3 hunks)
  • src/utils/coinselect.ts (0 hunks)
  • src/utils/transactionHistory.ts (5 hunks)
  • src/wallet/onchain.ts (1 hunks)
  • src/wallet/wallet.ts (16 hunks)
  • test/e2e/indexer.test.ts (6 hunks)
💤 Files with no reviewable changes (1)
  • src/utils/coinselect.ts
✅ Files skipped from review due to trivial changes (5)
  • src/script/tapscript.ts
  • src/providers/ark.ts
  • src/tree/validation.ts
  • src/tree/signingSession.ts
  • src/tree/txTree.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/utils/transactionHistory.ts
  • src/wallet/wallet.ts
🧰 Additional context used
🧠 Learnings (1)
src/wallet/onchain.ts (1)
Learnt from: louisinger
PR: arkade-os/ts-sdk#115
File: src/wallet/onchain.ts:180-187
Timestamp: 2025-07-07T17:02:12.075Z
Learning: In the OnchainWallet.bumpP2A method in src/wallet/onchain.ts, the return statement in the finally block is intentional. The method is designed to always return the transaction hex strings even if broadcasting fails, allowing callers to handle the transactions as needed.
🧬 Code Graph Analysis (2)
src/wallet/onchain.ts (1)
src/wallet/index.ts (1)
  • Coin (64-67)
test/e2e/indexer.test.ts (1)
src/tree/txTree.ts (3)
  • TxTreeChunk (6-12)
  • TxTree (19-225)
  • leaves (169-179)
🔇 Additional comments (9)
src/wallet/onchain.ts (1)

122-157: LGTM! Clean coin selection implementation.

The implementation follows a standard "largest first" coin selection strategy, which is efficient and commonly used. The logic correctly handles insufficient funds and calculates change.

src/index.ts (4)

26-26: LGTM! Consistent import renaming.

The import change from TxGraph/TxGraphChunk to TxTree/TxTreeChunk aligns with the PR objective of renaming terminology.


43-47: LGTM! Updated import source.

The import source change from ./utils/psbt to ./utils/arkTransaction is consistent with the refactoring mentioned in the AI summary.


141-143: LGTM! Consistent export renaming.

The export changes from TxGraph to TxTree maintain consistency with the import changes and align with the PR objective.


183-185: LGTM! Consistent type export renaming.

The type export changes from TxGraphChunk to TxTreeChunk complete the consistent renaming throughout the module.

test/e2e/indexer.test.ts (4)

7-8: LGTM! Consistent test import updates.

The import changes from TxGraph/TxGraphChunk to TxTree/TxTreeChunk align with the main codebase renaming.


354-354: LGTM! Updated variable type.

The type change from TxGraphChunk[] to TxTreeChunk[] is consistent with the interface changes.


370-374: LGTM! Updated class instantiation and method calls.

The changes from TxGraph.create() to TxTree.create() and the subsequent method calls maintain the same test logic while using the new class interface.


412-434: LGTM! Consistent test updates in second test case.

The variable type changes and method calls in the second test case are consistent with the first test case and maintain the same test logic.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
.github/workflows/tsdoc.yml (1)

33-48: Strip trailing whitespace and add terminal newline

Trailing spaces (lines 37, 43, 48, 79) and the missing newline at EOF trip YAML-lint and clutter diffs.
A quick sweep with your editor’s “trim trailing whitespace on save” plus adding a final empty line fixes it.

Also applies to: 79-79, 107-107

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3dcbccd and 00c8193.

📒 Files selected for processing (1)
  • .github/workflows/tsdoc.yml (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: louisinger
PR: arkade-os/ts-sdk#115
File: src/wallet/onchain.ts:180-187
Timestamp: 2025-07-07T17:02:12.316Z
Learning: In the OnchainWallet.bumpP2A method in src/wallet/onchain.ts, the return statement in the finally block is intentional. The method is designed to always return the transaction hex strings even if broadcasting fails, allowing callers to handle the transactions as needed.
🪛 actionlint (1.7.7)
.github/workflows/tsdoc.yml

50-50: the runner of "actions/cache@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)


97-97: the runner of "actions/configure-pages@v3" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)


107-107: the runner of "actions/deploy-pages@v2" action is too old to run on GitHub Actions. update the action's version to fix this issue

(action)

🪛 YAMLlint (1.37.1)
.github/workflows/tsdoc.yml

[error] 37-37: trailing spaces

(trailing-spaces)


[error] 43-43: trailing spaces

(trailing-spaces)


[error] 48-48: trailing spaces

(trailing-spaces)


[error] 79-79: trailing spaces

(trailing-spaces)


[error] 107-107: no new line character at the end of file

(new-line-at-end-of-file)


[error] 107-107: trailing spaces

(trailing-spaces)

🔇 Additional comments (1)
.github/workflows/tsdoc.yml (1)

68-74: Wildcard in source_dir may be mis-interpreted by the TSDoc Action

erikyo/tsdoc-action expects a directory, not a shell-expanded pattern.
Unless the action explicitly handles globs, use the directory root:

-          source_dir: ./src/*
+          source_dir: ./src

Verify locally or in a dry-run to ensure all entry points are picked up.

@louisinger louisinger changed the title Renaming Renaming and TSDoc Jul 8, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
.github/workflows/tsdoc.yml (1)

50-56: Cache action bumped to v4 – nice catch
The previous compatibility warning is resolved.

🧹 Nitpick comments (1)
.github/workflows/tsdoc.yml (1)

37-48: Trim trailing whitespace & add newline at EOF

YAML linters flag these lines for trailing spaces (37, 43, 48, 78) and a missing newline at EOF (100).
While harmless, CI jobs that enforce yamllint will fail.

-          node-version: '20'␠
+          node-version: '20'
@@
-          version: 8␠
+          version: 8
@@
-          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV␠
+          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
@@
-          cp -r ./docs-temp/* ${{ steps.version.outputs.path }}/␠
+          cp -r ./docs-temp/* ${{ steps.version.outputs.path }}/
@@
-        uses: actions/deploy-pages@v4 ␠
+        uses: actions/deploy-pages@v4
+

Also applies to: 78-80, 100-100

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 00c8193 and 72599d3.

📒 Files selected for processing (2)
  • .github/workflows/tsdoc.yml (1 hunks)
  • test/e2e/ark.test.ts (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • test/e2e/ark.test.ts
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: louisinger
PR: arkade-os/ts-sdk#115
File: src/wallet/onchain.ts:180-187
Timestamp: 2025-07-07T17:02:12.316Z
Learning: In the OnchainWallet.bumpP2A method in src/wallet/onchain.ts, the return statement in the finally block is intentional. The method is designed to always return the transaction hex strings even if broadcasting fails, allowing callers to handle the transactions as needed.
🪛 YAMLlint (1.37.1)
.github/workflows/tsdoc.yml

[error] 37-37: trailing spaces

(trailing-spaces)


[error] 43-43: trailing spaces

(trailing-spaces)


[error] 48-48: trailing spaces

(trailing-spaces)


[error] 78-78: trailing spaces

(trailing-spaces)


[error] 100-100: no new line character at the end of file

(new-line-at-end-of-file)


[error] 100-100: trailing spaces

(trailing-spaces)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: test

louisinger and others added 2 commits July 9, 2025 10:36
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: louisinger <41042567+louisinger@users.noreply.github.com>
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (3)
.github/workflows/tsdoc.yml (3)

37-37: Strip trailing whitespace & add missing newline

YAMLlint is already flagging these lines for trailing spaces and a missing
newline at EOF. They are harmless at runtime but still fail linting and make
future diffs noisy.

-          node-version: '20'␠
+          node-version: '20'
@@
-        with:␠
+        with:
@@
-          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV␠
+          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
@@
-          cp -r ./docs-temp/* ${{ steps.version.outputs.path }}/␠
+          cp -r ./docs-temp/* ${{ steps.version.outputs.path }}/
@@
-        uses: actions/deploy-pages@v4 ␠
+        uses: actions/deploy-pages@v4
+

Also applies to: 43-43, 48-48, 78-78, 105-105


74-78: Remove the temporary docs-temp directory after copy

docs-temp is left behind in the workspace; it’s not part of the artifact, but
it doubles the disk usage for large docs and slows the upload step (runner
needs to scan the entire workspace for .git). A one-liner keeps things
tidy:

-          cp -r ./docs-temp/* ${{ steps.version.outputs.path }}/
+          cp -r ./docs-temp/* ${{ steps.version.outputs.path }}/
+          rm -rf ./docs-temp

49-56: Consider using setup-node’s built-in pnpm cache

Since you’re already on actions/setup-node@v4, you can drop the two
extra steps (Get pnpm store directory + Setup pnpm cache) and let the
action handle caching transparently:

-      - name: Setup Node.js
-        uses: actions/setup-node@v4
-        with:
-          node-version: '20'
+      - name: Setup Node.js
+        uses: actions/setup-node@v4
+        with:
+          node-version: '20'
+          cache: 'pnpm'
+          cache-dependency-path: '**/pnpm-lock.yaml'

Fewer steps, same cache hit rate.
(If you have a reason to keep the manual cache, feel free to ignore.)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 72599d3 and a1ce614.

📒 Files selected for processing (1)
  • .github/workflows/tsdoc.yml (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: louisinger
PR: arkade-os/ts-sdk#115
File: src/wallet/onchain.ts:180-187
Timestamp: 2025-07-07T17:02:12.316Z
Learning: In the OnchainWallet.bumpP2A method in src/wallet/onchain.ts, the return statement in the finally block is intentional. The method is designed to always return the transaction hex strings even if broadcasting fails, allowing callers to handle the transactions as needed.
🪛 YAMLlint (1.37.1)
.github/workflows/tsdoc.yml

[error] 37-37: trailing spaces

(trailing-spaces)


[error] 43-43: trailing spaces

(trailing-spaces)


[error] 48-48: trailing spaces

(trailing-spaces)


[error] 78-78: trailing spaces

(trailing-spaces)


[error] 105-105: no new line character at the end of file

(new-line-at-end-of-file)


[error] 105-105: trailing spaces

(trailing-spaces)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: test

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (2)
.github/workflows/tsdoc.yml (1)

44-56: Leverage setup-node’s built-in pnpm cache instead of custom steps

actions/setup-node@v4 supports native pnpm caching via cache: "pnpm".
Using it removes three explicit steps (store-dir discovery, env export, explicit cache) and shortens the YAML.

-      - name: Install pnpm
-        uses: pnpm/action-setup@v2
-        with:
-          version: 8
-
-      - name: Get pnpm store directory
-        shell: bash
-        run: |
-          echo "STORE_PATH=$(pnpm store path --silent)" >> $GITHUB_ENV
-
-      - name: Setup pnpm cache
-        uses: actions/cache@v4
-        with:
-          path: ${{ env.STORE_PATH }}
-          key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }}
-          restore-keys: |
-            ${{ runner.os }}-pnpm-store-
+      - name: Setup Node.js
+        uses: actions/setup-node@v4
+        with:
+          node-version: '20'
+          cache: 'pnpm'
+
+      - name: Install pnpm
+        run: corepack enable && corepack prepare pnpm@8 --activate

This keeps caching coverage while simplifying maintenance.
(Feel free to keep the existing approach if you prefer explicit control.)

src/providers/indexer.ts (1)

88-96: Consider adding TSDoc comments for the new interface.

The SubscriptionResponse interface structure looks good. Since this PR includes TSDoc improvements, consider documenting the purpose of each field, especially the optional ones.

+/**
+ * Response structure for subscription updates
+ */
 export interface SubscriptionResponse {
+    /** Transaction ID associated with the subscription update */
     txid?: string;
+    /** Scripts being monitored in this subscription */
     scripts: string[];
+    /** New virtual coins created in this update */
     newVtxos: VirtualCoin[];
+    /** Virtual coins that were spent in this update */
     spentVtxos: VirtualCoin[];
+    /** Raw transaction data */
     tx?: string;
+    /** Checkpoint transactions mapping */
     checkpointTxs?: Record<string, { txid: string; tx: string }>;
 }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a1ce614 and 50f52c0.

📒 Files selected for processing (4)
  • .github/workflows/tsdoc.yml (1 hunks)
  • server.Dockerfile (1 hunks)
  • src/providers/indexer.ts (7 hunks)
  • test/e2e/indexer.test.ts (7 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • test/e2e/indexer.test.ts
🧰 Additional context used
🧬 Code Graph Analysis (1)
src/providers/indexer.ts (2)
src/index.ts (2)
  • PaginationOptions (234-234)
  • VirtualCoin (197-197)
src/wallet/index.ts (1)
  • VirtualCoin (77-83)
🪛 YAMLlint (1.37.1)
.github/workflows/tsdoc.yml

[error] 37-37: trailing spaces

(trailing-spaces)


[error] 43-43: trailing spaces

(trailing-spaces)


[error] 48-48: trailing spaces

(trailing-spaces)


[error] 73-73: no new line character at the end of file

(new-line-at-end-of-file)


[error] 73-73: trailing spaces

(trailing-spaces)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: test
🔇 Additional comments (7)
server.Dockerfile (1)

7-7: LGTM!

The default branch change from next-version to master aligns with the PR's broader renaming objectives.

src/providers/indexer.ts (6)

3-6: LGTM!

Exporting PaginationOptions is appropriate since it's part of the public API and also exported from src/index.ts.


118-121: LGTM!

The updated return type using AsyncIterableIterator<SubscriptionResponse> provides better type safety and clarity for API consumers.


351-362: LGTM!

The yielded object correctly implements the SubscriptionResponse interface with all required and optional fields properly mapped from the server response.


449-461: Good improvement to query parameter handling!

Using multi-collection format (multiple parameters with the same name) is more robust than comma-separated values, especially if the values could potentially contain commas.


544-548: LGTM!

The state terminology update from "pending" to "preconfirmed" correctly aligns with the PR's renaming objectives and matches the isPreconfirmed boolean flag.


574-578: LGTM!

The property rename from redeemTxid to arkTxid is consistent with the PR's terminology updates throughout the codebase.

@louisinger louisinger changed the title Renaming and TSDoc Update to latest arkd, renaming and TSDoc Jul 9, 2025
@louisinger louisinger requested review from bordalix and tiero July 9, 2025 11:03
@louisinger louisinger requested a review from altafan July 9, 2025 14:36
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
README.md (2)

15-19: Align example wording with the new class name

The inline comment still says “Create a new in-memory key” which comes from the old InMemoryKey wording. While technically correct (it is still an in-memory key), calling it out explicitly as SingleKey avoids any chance of readers thinking the old type still exists.

-// Create a new in-memory key (or use an external signer)
+// Create a new SingleKey instance (in-memory) – or use an external signer

363-363: Minor grammar tweak for smoother reading

Insert a comma after the back-ticked class to separate the apposition.

-The SDK provides a default implementation of the `Identity` interface: `SingleKey` for managing private keys in memory:
+The SDK provides a default implementation of the `Identity` interface: `SingleKey`, for managing private keys in memory:
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a76a57d and 2c96711.

📒 Files selected for processing (3)
  • README.md (2 hunks)
  • src/index.ts (9 hunks)
  • test/e2e/ark.test.ts (3 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • test/e2e/ark.test.ts
  • src/index.ts
🧰 Additional context used
🪛 LanguageTool
README.md

[grammar] ~363-~363: There might be a mistake here.
Context: ...SingleKey` for managing private keys in memory: typescript class SingleKey { static fromPrivateKey(privateKey: Uint8Array): SingleKey; static fromHex(privateKeyHex: string): SingleKey; } ## Development ### Requirements -...

(QB_NEW_EN_OTHER)

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: test
🔇 Additional comments (1)
README.md (1)

366-368: Snippet looks correct

The updated static factory signatures match the new SingleKey class and are consistent with previous behaviour.

@louisinger louisinger merged commit f9097d4 into arkade-os:next-version Jul 9, 2025
2 checks passed
@coderabbitai coderabbitai bot mentioned this pull request Jul 10, 2025
louisinger added a commit that referenced this pull request Jul 11, 2025
* add arknote tests

* refactor arknote to v7

* make hrp a optional constructor variable

* refactor tests to test hrp

* update ci to work next-version branch

* add arknote integration test (#75)

* BIP322 Intents (#77)

* BIP322 intent

* also return message in the intents methods

* new round flow (#78)

setup test to target next-version branch

hotfix note in registerInputsForNextRound

fix signingSession.ts

* nit: better test instructions (#82)

* nit: better test instructions

* fix ci

* Intent registration (#80)

* new round flow

setup test to target next-version branch

hotfix note in registerInputsForNextRound

fix signingSession.ts

* use BIP0322 to register intent

* ArkNote implements ExtendedCoin

* allow all sighash types

* remove registerOutputsForNextRound API

* offchain transaction w/ checkpoints (#84)

* new round flow

setup test to target next-version branch

hotfix note in registerInputsForNextRound

fix signingSession.ts

* use BIP0322 to register intent

* implement checkpoints

* update examples

* fix register message

* fix tx history (#89)

* Support recoverable vtxos (#88)

* support recoverable vtxos

* update ci.yml

* fixes

* update e2e test

* Drop explorer for indexer (#83)

* drop explorer for indexer

* remove console.log

* fix on returned vtxos

* Update src/providers/ark.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Signed-off-by: João Bordalo <bordalix@users.noreply.github.com>

* separates indexer to own provider

* private method createSubscription

* implements all methods on indexer provider

* remove console.logs

* fix build error

* add opts to indexer methods

* remove not needed export

* remove getRound() from ark provider

* cleanup ProtoTypes in ark provider

* fix export of RestIndexerProvider

* refactor indexer to use namespace

* adds type guards

* fixes

* new test

* Merge branch 'next-version' into drop_explorer_for_indexer

* remove console.log

* use paginationOptions

* more tests

* bug fix

* activate tx history test

* forfeit address

* make methods name lowercase

* update endpoints

* move indexer tests to indexer.test.ts

* update to latest APIs

* freeze test on commit deca5ef4699037dcc38a320e50478fc3eae957ec

* lint

* new util functions to create vtxos

* fixes with content-type

* new subscribeForScripts test

* fix tests

---------

Signed-off-by: João Bordalo <bordalix@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: louisinger <louis@vulpem.com>

* support for subdust vtxo in ark tx (#98)

* add checkpointTapLeafScript in VirtualTxInput (#101)

* Rework ark psbt fields (#105)

* rework ark psbt fields

* use constant as key.type

* fix decode

* TxGraph, new address and pub/sub (#100)

* add tx graph, remove tx tree class

* fix signingSession.ts and txGraph.ts

* new address encoding

* compatibilty with arkd next-version

* rename and move unilateral exit e2e test

* update examples

* update README.md

* update README.md

* add e2e test case

* update index.ts

* fixes indexer.go

* cleaning validation.go

* renaming tests

* Remove onchain wallet from `Wallet`, add `OnchainWallet` class (#102)

* add OnchainWallet class

* "send" --> "sendBitcoin"

* update WalletBalance

* fix src/index.ts

* fix ark.test.ts

* update README

* remove network from WalletConfig

* test on 783ba19512f0ddf87962a558576acc9389d0bd7e arkd

* fix serviceWorker/wallet.ts

* cleaning

* update WalletBalance

* get dust amount from server

* remove getAddressInfo

* getAddress & getBoardingAddress

* update README

* update tests

* update test/e2e/utils.ts

* Update to latest next-version arkd (#112)

* update to latest next-version arkd

* add more e2e indexer tests

* server.Dockerfile: test on next-version

* skip failing tests

* ServiceWorkerWallet implements Identity (#114)

* ServiceWorkerWallet implements Identity

* fix error message

* fix tests after arkd v0.7 (#118)

* Unilateral exit v7 (#115)

* add AnchorBumper interface and rework exit (renamed "unroll")

* unilareral exit v7

* update README

* Update src/wallet/wallet.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: louisinger <41042567+louisinger@users.noreply.github.com>

* Update src/wallet/wallet.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: louisinger <41042567+louisinger@users.noreply.github.com>

* fix selectcoins

* Revert "fix selectcoins"

This reverts commit 9a52311.

* cleaning coinselect.ts

* clean

* remove hardcoded 600 sats, add "forceChange" boolean in selectCoins

* handle undefined getFeeRate

* use blocks/tip endpoint

* Unroll namespace

* Update src/wallet/unroll.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: louisinger <41042567+louisinger@users.noreply.github.com>

* Update src/wallet/unroll.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: louisinger <41042567+louisinger@users.noreply.github.com>

* ark.test.ts: switch case

* add compleUnroll function, remove it from Wallet interface

---------

Signed-off-by: louisinger <41042567+louisinger@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* add Ramps class (#119)

* Update README.md

Signed-off-by: Marco Argentieri <3596602+tiero@users.noreply.github.com>

* Update to latest arkd,  renaming and TSDoc (#108)

* renaming

* remove unused imports

* update names, JSDocs

* update index.ts

* remove unused dev deps

* remove "lint-staged"

* add "arkade" keyword to pkg.json

* TSDoc

* add TSDoc generation

* add tsdoc.yml workflow

* remove upload

* use pnpm docs:build

* fix

* trigger TSDoc deploy on next-version and master push

* Update .github/workflows/tsdoc.yml

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: louisinger <41042567+louisinger@users.noreply.github.com>

* update to master (v0.7.0-rc2)

* update tsdoc.yml

* rename "chunk" to "node"

* rename InMemoryKey -> SingleKey

---------

Signed-off-by: louisinger <41042567+louisinger@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* tsdoc.yml: trigger on version tag

* update README.md

* add Wallet.NotifyIncomingFunds method (#95)

* new notifyIncomingFunds method on onchain provider

* track multi addresses

* ignore error

* new util function faucetOnchain()

* new wallet method notifyIncomingFunds()

* tests: make sure there was a notification

* Uses built in WebSocket instead of isomorphic-ws
Adds new stopFunc() in callback for notifyIncomingFunds
New tests on the WebSocket

* remove console.log

* polyfill WebSocket for github tests

* Update src/providers/onchain.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: João Bordalo <bordalix@users.noreply.github.com>

* new waitForIncomingFunds() func

* fix readme

* Update src/wallet/wallet.ts

Co-authored-by: louisinger <41042567+louisinger@users.noreply.github.com>
Signed-off-by: João Bordalo <bordalix@users.noreply.github.com>

* Update src/wallet/wallet.ts

Co-authored-by: louisinger <41042567+louisinger@users.noreply.github.com>
Signed-off-by: João Bordalo <bordalix@users.noreply.github.com>

* make waitForIncomingFunds a utils function

* Update src/providers/onchain.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: João Bordalo <bordalix@users.noreply.github.com>

* Update test/e2e/ark.test.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: João Bordalo <bordalix@users.noreply.github.com>

* update src/utils/waitForIncomingFunds.ts

* lint

* update readme

* Handle missing outputs gracefully instead of throwing errors

* Fix variable naming and incorrect property access.

* Improve WebSocket URL construction robustness

* fix test

* fix test

* refactor notifyIncomingFunds to return stopFunc

* refactor esplora tests

* Update README.md

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: João Bordalo <bordalix@users.noreply.github.com>

* Update src/utils/waitForIncomingFunds.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: João Bordalo <bordalix@users.noreply.github.com>

* Fix the infinite loop that prevents the method from returning

* fix docker files

* fix docker-compose.yml

* add VERSION to dockerfile

* skip "should redeem a note" test

* fix note test

* remove watchAddresses test

* remove "ws" devDeps

* remove testing purpose only interface parameter

* do not export unused types

* Update src/providers/onchain.ts

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: louisinger <41042567+louisinger@users.noreply.github.com>

* remove setup-polyfill

* fix

* fallback to polling if WebSocket not available

* fix test

* fix test

* update README

* add SubscriptionResponse to index.ts exports

* remove MockWebSocket

* remove extra blanck line

* revert vitest.config.ts

---------

Signed-off-by: João Bordalo <bordalix@users.noreply.github.com>
Signed-off-by: louisinger <41042567+louisinger@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: louisinger <41042567+louisinger@users.noreply.github.com>
Co-authored-by: louisinger <louis@vulpem.com>

* add tsdoc comments (#120)

* handle FetchTimeout in new streaming functions

* remove duplicated code

* CI: run down to delete dev env

* freeze test on v0.7.0 tag

* update examples

* Dockerfiles: use tag to checkout v0.7.0

* remove useless docker env vars

* rename virtualTx -> arkTx

* fix capture ark logs in CI

* add sleep to indexer.test.ts

* arkade wallet  hotfix

---------

Signed-off-by: João Bordalo <bordalix@users.noreply.github.com>
Signed-off-by: louisinger <41042567+louisinger@users.noreply.github.com>
Signed-off-by: Marco Argentieri <3596602+tiero@users.noreply.github.com>
Co-authored-by: João Bordalo <bordalix@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Marco Argentieri <3596602+tiero@users.noreply.github.com>
This was referenced Sep 11, 2025
@coderabbitai coderabbitai bot mentioned this pull request Oct 1, 2025
@coderabbitai coderabbitai bot mentioned this pull request Dec 4, 2025
@coderabbitai coderabbitai bot mentioned this pull request Jan 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants