Skip to content

feat: enhance APY calculation with dynamic chain mapping#2353

Open
pawell24 wants to merge 3 commits intoDefiLlama:masterfrom
pawell24:feat/accountable-dynamic-chain-resolution
Open

feat: enhance APY calculation with dynamic chain mapping#2353
pawell24 wants to merge 3 commits intoDefiLlama:masterfrom
pawell24:feat/accountable-dynamic-chain-resolution

Conversation

@pawell24
Copy link
Contributor

@pawell24 pawell24 commented Feb 12, 2026

Summary by CodeRabbit

  • Refactor
    • Reworked chain metadata resolution and per-chain statistics gathering so APY and TVL calculations use up-to-date, per-chain data.
    • Parallelized external lookups and per-chain processing for more consistent and reliable results.
  • Bug Fixes
    • Prevented incorrect aggregation from missing chain entries by skipping unavailable mappings, improving accuracy of loan breakdowns.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 12, 2026

Warning

Rate limit exceeded

@pawell24 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 6 minutes and 23 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📝 Walkthrough

Walkthrough

The accountable adaptor adds a per-call chain ID→name resolver and refactors apy() to fetch chain metadata and accountable data in parallel, group vaults by resolved chain names, compute per-chain vault stats concurrently, and merge those stats for loan APY/TVL calculations. (50 words)

Changes

Cohort / File(s) Summary
Chain-aware Vault Statistics
src/adaptors/accountable/index.js
Added async getChainIdToNameMap() to fetch chain metadata. Refactored apy() to perform parallel fetches, group vaults by resolved chain name (skipping missing mappings), compute per-chain vault stats in parallel via getVaultStats, and merge per-chain results for per-loan APY/TVL lookups. Public API unchanged.

Sequence Diagram

sequenceDiagram
    participant Client
    participant apy as apy()
    participant ChainAPI as Chain Metadata API
    participant AccountAPI as Accountable API
    participant StatsEngine as Statistics Engine

    Client->>apy: call apy()
    
    par Parallel Fetches
        apy->>ChainAPI: request chain ID→name map
        apy->>AccountAPI: request vaults & loans
    and
        ChainAPI-->>apy: chain ID→name map
        AccountAPI-->>apy: vaults & loans (with chain_ids)
    end

    apy->>apy: group vaults by resolved chain name (skip unresolved)

    par Per-Chain Stats
        apy->>StatsEngine: compute stats for Chain A vaults
        apy->>StatsEngine: compute stats for Chain B vaults
        apy->>StatsEngine: compute stats for Chain N vaults
    and
        StatsEngine-->>apy: per-chain vault stats
    end

    apy->>apy: merge per-chain stats into single map
    apy-->>Client: aggregated loans with APY and TVL
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 I hopped through maps of chain and name,

fetched in parallel, no two calls the same.
Vaults grouped tidy, stats sprung to meet,
Merged and returned — a tidy feat! ✨

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'enhance APY calculation with dynamic chain mapping' directly summarizes the main change—introducing dynamic chain mapping to the APY calculation logic instead of using static mappings.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@llamatester
Copy link

The accountable adapter exports pools:

Test Suites: 1 passed, 1 total
Tests: 58 passed, 58 total
Snapshots: 0 total
Time: 0.251 s
Ran all test suites.

Nb of pools: 6
 

Sample pools:
┌─────────┬─────────────────────────────────────────────────────┬──────────┬───────────────┬─────────┬───────────────┬───────────────────┬───────────┬─────────────────────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────┬─────────────────┬─────────────────┬──────────────────────────────────────────────────┐
│ (index) │ pool                                                │ chain    │ project       │ symbol  │ tvlUsd        │ apyBase           │ apyReward │ rewardTokens                                                            │ url                                                                                   │ totalSupplyUsd  │ totalBorrowUsd  │ underlyingTokens                                 │
├─────────┼─────────────────────────────────────────────────────┼──────────┼───────────────┼─────────┼───────────────┼───────────────────┼───────────┼─────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼─────────────────┼─────────────────┼──────────────────────────────────────────────────┤
│ 0       │ '0xcb9c1fbf1b8fcd71a70a1a6551dcaaf9f7029c19-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 1011182.16049 │ 6.79              │ 3         │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC' ]                 │ 'https://yield.accountable.capital/vaults/0xCb9c1Fbf1b8Fcd71a70A1A6551dcaaF9f7029c19' │ 16656603.946311 │ 15877045.273697 │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 1       │ '0xd0943c76ee287793559c1df82e5b2b858dd01ef3-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 74318.230392  │ 9.600000000000001 │ 3         │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC' ]                 │ 'https://yield.accountable.capital/vaults/0xD0943c76ee287793559c1dF82E5B2B858Dd01Ef3' │ 27320361.673105 │ 27416234.492209 │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 2       │ '0x78f9486c71371bb5af50cbcdf4bacdc298ec8a97-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 7038.378086   │ 4.25              │ 5         │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'MU' ]                  │ 'https://yield.accountable.capital/vaults/0x78f9486C71371bB5af50cBCdf4BACDC298eC8A97' │ 1101687.622027  │ 1104383.070271  │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 3       │ '0xd43f8443bd91829b36153e33d3e631bdd3b93844-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 3784.183822   │ 9.59344           │ 3         │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC' ]                 │ 'https://yield.accountable.capital/vaults/0xd43F8443Bd91829b36153e33d3e631Bdd3b93844' │ 3983702.371118  │ 4042979.552143  │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 4       │ '0x276446dd5836867ee90ac5d7582ae330beddc3e1-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 457.729328    │ 4.25              │ 17        │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC', 'Aegis Points' ] │ 'https://yield.accountable.capital/vaults/0x276446dd5836867EE90Ac5d7582ae330bedDc3e1' │ 499087.610521   │ 500643.407158   │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 5       │ '0x2667461530168502a94bc6588b6af68b69602846-citrea' │ 'Citrea' │ 'accountable' │ 'WCBTC' │ 0             │ 3.98              │ null      │ []                                                                      │ 'https://yield.accountable.capital/vaults/0x2667461530168502a94bC6588B6AF68b69602846' │ 0               │ 0               │ [ '0x3100000000000000000000000000000000000006' ] │
└─────────┴─────────────────────────────────────────────────────┴──────────┴───────────────┴─────────┴───────────────┴───────────────────┴───────────┴─────────────────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴─────────────────┴──────────────────────────────────────────────────┘
This adapter contains some pools with <10k TVL, these pools won't be shown in DefiLlama

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: 3

🤖 Fix all issues with AI agents
In `@src/adaptors/accountable/index.js`:
- Around line 131-138: The loop currently assigns vaults to an 'unknown' chain
when chainIdToName lacks item.chain_id, which causes downstream SDK multiCall
failures; update the loop in the block that builds vaultsByChain (referencing
activeLoans, loanVaultMap, chainIdToName, vaultsByChain) to skip any item whose
chainIdToName[item.chain_id] is falsy (do not default to 'unknown'), so only
resolved chain names are lowercased and used as keys; ensure you still guard for
missing vault (if (!vault) continue) and only push unique vaults as before, so
getVaultStats(vaults, chainName) will never be called with an invalid chainName.
- Around line 140-151: The current Promise.all over
Object.entries(vaultsByChain) will reject if any getVaultStats throws, so change
the stats aggregation to use Promise.allSettled on the mapped promises from
Object.entries(vaultsByChain) (the block that produces statsEntries and
vaultStatsByChain); after allSettled, keep only results with status ===
"fulfilled" (extract value [chain, stats]) and log or surface any rejected
reasons, then build vaultStatsByChain via Object.fromEntries of the fulfilled
values and merge into vaultStats as before. Ensure you reference the existing
symbols getVaultStats, statsEntries/vaultStatsByChain, and vaultStats so the
replacement preserves the downstream merging logic.
- Around line 7-20: getChainIdToNameMap currently swallows errors and returns an
empty map which causes downstream grouping to 'unknown' and triggers
sdk.api.abi.multiCall with an invalid chain; update getChainIdToNameMap to log
the caught error (include the error object) and rethrow it (or return null)
instead of returning an empty object so callers can fail fast; also update
callers (e.g., getVaultStats and apy) to check the map result and avoid calling
sdk.api.abi.multiCall with a non-existent chain by early-returning or wrapping
the multiCall in a try/catch that logs the failure and skips that vault/chain.
Ensure you reference getChainIdToNameMap, getVaultStats, apy, and
sdk.api.abi.multiCall when making these changes so the error is both surfaced
and handled safely.
🧹 Nitpick comments (2)
src/adaptors/accountable/index.js (2)

155-155: Inconsistent chain name casing between line 135 and 155.

Line 135 lowercases the chain name (chainIdToName[item.chain_id] || 'unknown').toLowerCase()), but line 155 does not. While it works here because line 200 calls .toLowerCase() on the pool string and line 201 passes through utils.formatChain, it would be clearer and less error-prone to extract a consistent chain-name resolution once per loan rather than computing it twice with different transforms.


44-51: Remove the unused getVaultAddressesFromApi function.

This function is no longer called anywhere in the codebase. Vault discovery is now handled through fetchVaultsByLoanIds combined with the per-chain grouping logic.

@llamatester
Copy link

The accountable adapter exports pools:

Test Suites: 1 passed, 1 total
Tests: 58 passed, 58 total
Snapshots: 0 total
Time: 0.258 s
Ran all test suites.

Nb of pools: 6
 

Sample pools:
┌─────────┬─────────────────────────────────────────────────────┬──────────┬───────────────┬─────────┬───────────────┬───────────────────┬───────────┬─────────────────────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────┬─────────────────┬─────────────────┬──────────────────────────────────────────────────┐
│ (index) │ pool                                                │ chain    │ project       │ symbol  │ tvlUsd        │ apyBase           │ apyReward │ rewardTokens                                                            │ url                                                                                   │ totalSupplyUsd  │ totalBorrowUsd  │ underlyingTokens                                 │
├─────────┼─────────────────────────────────────────────────────┼──────────┼───────────────┼─────────┼───────────────┼───────────────────┼───────────┼─────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼─────────────────┼─────────────────┼──────────────────────────────────────────────────┤
│ 0       │ '0xcb9c1fbf1b8fcd71a70a1a6551dcaaf9f7029c19-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 1011182.16049 │ 6.79              │ 3         │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC' ]                 │ 'https://yield.accountable.capital/vaults/0xCb9c1Fbf1b8Fcd71a70A1A6551dcaaF9f7029c19' │ 16656603.946311 │ 15877045.273697 │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 1       │ '0xd0943c76ee287793559c1df82e5b2b858dd01ef3-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 74318.230392  │ 9.600000000000001 │ 3         │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC' ]                 │ 'https://yield.accountable.capital/vaults/0xD0943c76ee287793559c1dF82E5B2B858Dd01Ef3' │ 27320361.673105 │ 27416234.492209 │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 2       │ '0x78f9486c71371bb5af50cbcdf4bacdc298ec8a97-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 7038.378086   │ 4.25              │ 5         │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'MU' ]                  │ 'https://yield.accountable.capital/vaults/0x78f9486C71371bB5af50cBCdf4BACDC298eC8A97' │ 1101687.622027  │ 1104383.070271  │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 3       │ '0xd43f8443bd91829b36153e33d3e631bdd3b93844-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 3784.183822   │ 9.59344           │ 3         │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC' ]                 │ 'https://yield.accountable.capital/vaults/0xd43F8443Bd91829b36153e33d3e631Bdd3b93844' │ 3983702.371118  │ 4042979.552143  │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 4       │ '0x276446dd5836867ee90ac5d7582ae330beddc3e1-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 457.729328    │ 4.25              │ 17        │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC', 'Aegis Points' ] │ 'https://yield.accountable.capital/vaults/0x276446dd5836867EE90Ac5d7582ae330bedDc3e1' │ 499087.610521   │ 500643.407158   │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 5       │ '0x2667461530168502a94bc6588b6af68b69602846-citrea' │ 'Citrea' │ 'accountable' │ 'WCBTC' │ 0             │ 3.98              │ null      │ []                                                                      │ 'https://yield.accountable.capital/vaults/0x2667461530168502a94bC6588B6AF68b69602846' │ 0               │ 0               │ [ '0x3100000000000000000000000000000000000006' ] │
└─────────┴─────────────────────────────────────────────────────┴──────────┴───────────────┴─────────┴───────────────┴───────────────────┴───────────┴─────────────────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴─────────────────┴──────────────────────────────────────────────────┘
This adapter contains some pools with <10k TVL, these pools won't be shown in DefiLlama

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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/adaptors/accountable/index.js (1)

160-219: ⚠️ Potential issue | 🟠 Major

Loans with unmapped chain_id produce broken pool entries.

Lines 133–141 correctly skip vaults whose chain_id isn't in chainIdToName, but the final Promise.all on line 160 still iterates over all activeLoans. When chainIdToName[item.chain_id] is undefined (line 162), the resulting pool entry has:

  • pool: "0x…-undefined" (line 207)
  • chain: utils.formatChain(undefined) (line 208) — likely "undefined" or a crash

Filter out unresolvable loans before mapping, consistent with the earlier grouping logic.

Proposed fix
     return Promise.all(
-        activeLoans.map(async(item) => {
-            const chainName = chainIdToName[item.chain_id];
+        activeLoans.filter((item) => {
+            const vault = loanVaultMap[item.id];
+            const chainName = chainIdToName[item.chain_id];
+            return vault && chainName;
+        }).map(async(item) => {
+            const chainName = chainIdToName[item.chain_id];
             const vaultAddress = loanVaultMap[item.id];
🧹 Nitpick comments (1)
src/adaptors/accountable/index.js (1)

88-91: Inconsistent params format for balanceOf call.

Line 81 wraps the param in an array ([supplies[i]]), but line 90 passes vault as a bare value. While the SDK may coerce this, it's inconsistent and fragile.

Suggested consistency fix
             calls: vaults.map((vault, i) => ({
                 target: underlyings[i],
-                params: vault,
+                params: [vault],
             })),

@llamatester
Copy link

The accountable adapter exports pools:

Test Suites: 1 passed, 1 total
Tests: 58 passed, 58 total
Snapshots: 0 total
Time: 0.257 s
Ran all test suites.

Nb of pools: 6
 

Sample pools:
┌─────────┬─────────────────────────────────────────────────────┬──────────┬───────────────┬─────────┬───────────────┬───────────────────┬───────────┬─────────────────────────────────────────────────────────────────────────┬───────────────────────────────────────────────────────────────────────────────────────┬─────────────────┬─────────────────┬──────────────────────────────────────────────────┐
│ (index) │ pool                                                │ chain    │ project       │ symbol  │ tvlUsd        │ apyBase           │ apyReward │ rewardTokens                                                            │ url                                                                                   │ totalSupplyUsd  │ totalBorrowUsd  │ underlyingTokens                                 │
├─────────┼─────────────────────────────────────────────────────┼──────────┼───────────────┼─────────┼───────────────┼───────────────────┼───────────┼─────────────────────────────────────────────────────────────────────────┼───────────────────────────────────────────────────────────────────────────────────────┼─────────────────┼─────────────────┼──────────────────────────────────────────────────┤
│ 0       │ '0xcb9c1fbf1b8fcd71a70a1a6551dcaaf9f7029c19-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 1011182.16049 │ 6.79              │ 3         │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC' ]                 │ 'https://yield.accountable.capital/vaults/0xCb9c1Fbf1b8Fcd71a70A1A6551dcaaF9f7029c19' │ 16656603.946311 │ 15877496.325774 │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 1       │ '0xd0943c76ee287793559c1df82e5b2b858dd01ef3-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 74318.230392  │ 9.600000000000001 │ 3         │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC' ]                 │ 'https://yield.accountable.capital/vaults/0xD0943c76ee287793559c1dF82E5B2B858Dd01Ef3' │ 27320361.673105 │ 27417700.3107   │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 2       │ '0x78f9486c71371bb5af50cbcdf4bacdc298ec8a97-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 7038.378086   │ 4.25              │ 5         │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'MU' ]                  │ 'https://yield.accountable.capital/vaults/0x78f9486C71371bB5af50cBCdf4BACDC298eC8A97' │ 1101687.622027  │ 1104415.139945  │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 3       │ '0xd43f8443bd91829b36153e33d3e631bdd3b93844-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 3784.183822   │ 9.59344           │ 3         │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC' ]                 │ 'https://yield.accountable.capital/vaults/0xd43F8443Bd91829b36153e33d3e631Bdd3b93844' │ 3983702.371118  │ 4043241.314132  │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 4       │ '0x276446dd5836867ee90ac5d7582ae330beddc3e1-monad'  │ 'Monad'  │ 'accountable' │ 'USDC'  │ 457.729328    │ 4.25              │ 17        │ [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC', 'Aegis Points' ] │ 'https://yield.accountable.capital/vaults/0x276446dd5836867EE90Ac5d7582ae330bedDc3e1' │ 499087.610521   │ 500652.372962   │ [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ] │
│ 5       │ '0x2667461530168502a94bc6588b6af68b69602846-citrea' │ 'Citrea' │ 'accountable' │ 'WCBTC' │ 0             │ 3.98              │ null      │ []                                                                      │ 'https://yield.accountable.capital/vaults/0x2667461530168502a94bC6588B6AF68b69602846' │ 0               │ 0               │ [ '0x3100000000000000000000000000000000000006' ] │
└─────────┴─────────────────────────────────────────────────────┴──────────┴───────────────┴─────────┴───────────────┴───────────────────┴───────────┴─────────────────────────────────────────────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────┴─────────────────┴─────────────────┴──────────────────────────────────────────────────┘
This adapter contains some pools with <10k TVL, these pools won't be shown in DefiLlama

@0xkr3p
Copy link
Contributor

0xkr3p commented Feb 15, 2026

hi @pawell24, thanks for the PR, these changes look fine. However, I've noticed something which may need looking at, can you check how totalSupplyUsd has been calculated is accurate pls?

I got total borrowed > total supplied on a test run:

  {
    pool: '0xd0943c76ee287793559c1df82e5b2b858dd01ef3-monad',
    chain: 'Monad',
    project: 'accountable',
    symbol: 'USDC',
    tvlUsd: 90607.67913,
    apyBase: 9.600000000000001,
    apyReward: 3,
    rewardTokens: [ '0x3bd359c1119da7da1d913d1c4d2b7c461115433a', 'ACC' ],
    url: 'https://yield.accountable.capital/vaults/0xD0943c76ee287793559c1dF82E5B2B858Dd01Ef3',
    totalSupplyUsd: 27336539.752056,
    totalBorrowUsd: 27437462.688542,
    underlyingTokens: [ '0x754704Bc059F8C67012fEd69BC8A327a5aafb603' ]
  },

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.

3 participants