Skip to content

Add Bankcoin kUSD (Base + Arbitrum) pegged asset adapter#846

Open
bankcoincapital wants to merge 1 commit into
DefiLlama:masterfrom
bankcoincapital:add-bankcoin-kusd
Open

Add Bankcoin kUSD (Base + Arbitrum) pegged asset adapter#846
bankcoincapital wants to merge 1 commit into
DefiLlama:masterfrom
bankcoincapital:add-bankcoin-kusd

Conversation

@bankcoincapital

@bankcoincapital bankcoincapital commented Jul 7, 2026

Copy link
Copy Markdown

NOTE

"Allow edits by maintainers" is enabled on this PR.


(new listing form)

Name (to be shown on DefiLlama):

Bankcoin kUSD

Website Link:

https://bankcoin.capital

Logo (High resolution, will be shown with rounded borders):

https://assets.bankcoin.capital/icons/kstables/kUSD.png

Chain:

Base, Arbitrum One (natively issued on both — no bridged double counting)

Coingecko ID (leave empty if not listed):

(not yet listed — adapter folder kusd is a placeholder; will backfill the geckoId once assigned)

Coinmarketcap ID (leave empty if not listed):

(not yet listed)

Short Description:

kUSD is a fiat-referenced USD stablecoin issued by Bankcoin Capital, part of a 38-currency kStable family natively issued on Base and Arbitrum One. Every on-chain mint declares the collateral backing it, and the issuer publishes a machine-readable circulating-supply API and exclusion registry.

mintRedeemDescription:

kUSD is minted by the issuer against declared collateral (each on-chain mint carries its fiat/crypto backing declaration) and burned on redemption, releasing backing at the oracle FX rate. The issuer publishes a public solvency/redemption-waterfall view.

Token address and ticker:
  • Base: 0x6FB09847417e33A1CE75d3B324015D4C0AeF4D61 (kUSD, 6 decimals)
  • Arbitrum One: 0x4653092872bE819CdFf244db8a474BBaeAA2B024 (kUSD, 6 decimals)
pegType:

peggedUSD

pegMechanism:

fiat-backed

priceSource:

(none yet — will follow up once a USD-anchor DEX pool is indexed / CoinGecko listing lands)

wiki:

(none)

Twitter Link:

https://x.com/bankcoincapital

List of audit links if any:

(none yet)


Add Bankcoin kUSD (Base + Arbitrum) pegged asset adapter

kUSD is a fiat-referenced USD stablecoin issued by Bankcoin Capital (https://bankcoin.capital),
live on Base (0x6FB09847417e33A1CE75d3B324015D4C0AeF4D61) and Arbitrum One
(0x4653092872bE819CdFf244db8a474BBaeAA2B024), 6 decimals, natively issued on both chains
(no bridged double counting).

This is the first of a 38-currency family (kEUR, kJPY, kGBP, …) — we will extend with per-coin
adapters (peggedEUR/peggedJPY/… and peggedVAR for currencies without a dedicated pegType) once
this entry is established, per maintainer guidance.

Contact: admin@bankcoin.capital

Summary by CodeRabbit

  • New Features
    • Added support for Bankcoin kUSD as a new pegged USD asset.
    • Enabled chain-specific supply tracking for Base and Arbitrum, including issued and unreleased balances.
    • Added asset metadata and configuration (6-decimal pegged USD) so kUSD appears in pegged-asset listings.

@coderabbitai

coderabbitai Bot commented Jul 7, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 01c955e0-ca7f-417b-adb7-71787ea51423

📥 Commits

Reviewing files that changed from the base of the PR and between c2fd8bb and b62248a.

📒 Files selected for processing (2)
  • src/adapters/peggedAssets/kusd/index.ts
  • src/peggedData/peggedData.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/adapters/peggedAssets/kusd/index.ts

📝 Walkthrough

Walkthrough

This PR adds a DeFiLlama pegged-assets adapter for Bankcoin kUSD, defining issued and unreleased address mappings for Base and Arbitrum, and registers the asset metadata with the kusd adapter module.

Changes

Bankcoin kUSD Adapter

Layer / File(s) Summary
kUSD adapter definition and chain wiring
src/adapters/peggedAssets/kusd/index.ts
Defines the market-maker wallet, Base and Arbitrum auto-convert vaults, and chain-specific issued/unreleased mappings. Exports the adapter with six decimals and peggedUSD classification.
Pegged asset registry entry
src/peggedData/peggedData.ts
Adds Bankcoin kUSD metadata with asset ID 427, Base token address, fiat-backed peggedUSD configuration, disabled CoinGecko integration, and module: "kusd".

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

Suggested reviewers: realdealshaman, uwezukwechibuzor, define101

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly names the new kUSD pegged asset adapter and the affected chains.
Description check ✅ Passed The PR description fills the required new-listing form with the requested metadata and links.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

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.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
src/adapters/peggedAssets/kusd/index.ts (1)

1-11: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Placeholder folder name may cause a breaking rename later.

The header notes the folder should eventually be renamed to the actual CoinGecko asset id once assigned, but peggedData.ts references this module via module: "kusd". If the folder is renamed without a synchronized update to peggedData.ts, importAdapter will fail to resolve the module path.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/adapters/peggedAssets/kusd/index.ts` around lines 1 - 11, The adapter
module is currently referenced by a placeholder folder name, so a future rename
could break resolution in peggedData.ts. Update the kUSD adapter and any module
references together by making sure the value used in peggedData.ts for
importAdapter matches the final CoinGecko asset-id folder name, and keep the
module identifier in sync with the adapter entry point (such as the kusd
index.ts export) whenever the rename happens.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@src/adapters/peggedAssets/kusd/index.ts`:
- Around line 1-11: The adapter module is currently referenced by a placeholder
folder name, so a future rename could break resolution in peggedData.ts. Update
the kUSD adapter and any module references together by making sure the value
used in peggedData.ts for importAdapter matches the final CoinGecko asset-id
folder name, and keep the module identifier in sync with the adapter entry point
(such as the kusd index.ts export) whenever the rename happens.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 21b1abfa-7087-44de-8898-34e0b84013f9

📥 Commits

Reviewing files that changed from the base of the PR and between 3803bad and c2fd8bb.

📒 Files selected for processing (2)
  • src/adapters/peggedAssets/kusd/index.ts
  • src/peggedData/peggedData.ts

@bankcoincapital

Copy link
Copy Markdown
Author

Acknowledged — "kusd" is expected to be the final CoinGecko slug for this asset. If CoinGecko assigns a different id, we will rename the adapter folder and update the module reference in peggedData.ts in the same commit, as documented in the file header.

@bankcoincapital

Copy link
Copy Markdown
Author

Thanks very much for the review, and thanks to CodeRabbit for the walkthrough and the maintainability catch.

On the CodeRabbit nitpick (placeholder folder name vs. the module: "kusd" reference in peggedData.ts): acknowledged and addressed. The folder name and the module value in peggedData.ts are kept in lockstep — if CoinGecko assigns a slug other than kusd, we will rename the adapter folder and update the module reference in peggedData.ts in the same commit, so importAdapter never resolves a stale path. That intent is also noted in the adapter file header.

For confidence on the numbers: the adapter's per-chain reads (issued supply minus the market-maker wallet and the auto-convert vaults, on Base 8453 and Arbitrum One 42161) are validated against our live circulating-supply API, which is reproducible from public RPC reads alone — e.g. https://assets.bankcoin.capital/supply/circulating?symbol=kUSD&chainId=8453 (and chainId=42161 for Arbitrum). The exclusion set the adapter uses is the same one published at https://assets.bankcoin.capital/supply/exclusions.json.

Is there anything else you'd like us to adjust for merge? Happy to tweak naming, split per-chain, or add detail wherever it helps. No rush on our end.

@realdealshaman

Copy link
Copy Markdown
Contributor

hey @bankcoincapital thanks for the PR, will you have adapters for each of the coins in the vaults? Also are there any attestations that can help prove the fiat backing?

@bankcoincapital

Copy link
Copy Markdown
Author

Thanks for the questions — answering both directly, and flagging what we don't yet have rather than overstating it.

1. Rebase / housekeeping just pushed: this branch was 85 commits behind master and had a genuine conflict — our id: "407" had since been claimed by another merged PR ("Unity USD"). Rebased onto current master, reassigned to the next free id ("427"), and fixed gecko_id to null (was a placeholder string "kusd"; sampled several other onCoinGecko: "false" entries in peggedData.ts and they all use null, so matched that convention rather than guessing a slug). PR is now clean/mergeable with 0 conflicts. Re-ran the test harness on the rebased branch — real-time, no extrapolation:

arbitrum: minted 2.53B, unreleased 1.80B, circulating 731.21M
base:     minted 2.27B, unreleased 1.00B, circulating 1.27B

Cross-checked against independent eth_call totalSupply() reads on both chains outside this repo — exact match to the minted figures above.

2. Will there be adapters for each coin in the vaults? Yes, intent is to cover the full 38-currency kStable family (kEUR, kJPY, kGBP, kAUD, kCAD, kCHF, kSGD, and 31 more), same Base+Arbitrum deployment, same addChainExports pattern, same exclusion set (MM wallet + per-kStable convert vaults). kUSD went in alone first to establish the pattern and get review feedback before generating the rest. One thing we'd like your input on before submitting the others: about 19 of the 38 currencies (HKD, KRW, NOK, NZD, INR, THB, IDR, AED, SAR, EGP, MYR, VND, TWD, PLN, ILS, PKR, BDT, XAF) don't have a dedicated pegType in peggedAsset.type.ts yet — happy to propose new pegType values for those, or fall back to peggedVAR, whichever you'd prefer. Let us know and we'll follow up with a small number of grouped PRs for the rest of the family.

3. Attestations for the fiat backing: being direct — we do not yet have an independent third-party audited attestation report (no signed accounting-firm letter, Circle/Tether-style). What exists today:

  • On-chain, every mint calls mintWithBacking(recipient, amount, Crypto[], Fiat[]), which reverts (EmptyBacking()) if the collateral vectors are empty — so it is structurally impossible to mint without declaring the backing (crypto reserves and/or fiat reserves) at the contract level.
  • The backing registry is public and on-chain-queryable per kStable.
  • We publish a redemption-waterfall simulator (given any redemption-demand %, shows tier-by-tier where liquidity would come from) plus a machine-readable exclusion registry and circulating-supply API — all linked from the adapter and asset description.

No independent audit yet is a real gap, not a hidden one — flagging it plainly rather than working around the question.

1 similar comment
@bankcoincapital

Copy link
Copy Markdown
Author

Thanks for the questions — answering both directly, and flagging what we don't yet have rather than overstating it.

1. Rebase / housekeeping just pushed: this branch was 85 commits behind master and had a genuine conflict — our id: "407" had since been claimed by another merged PR ("Unity USD"). Rebased onto current master, reassigned to the next free id ("427"), and fixed gecko_id to null (was a placeholder string "kusd"; sampled several other onCoinGecko: "false" entries in peggedData.ts and they all use null, so matched that convention rather than guessing a slug). PR is now clean/mergeable with 0 conflicts. Re-ran the test harness on the rebased branch — real-time, no extrapolation:

arbitrum: minted 2.53B, unreleased 1.80B, circulating 731.21M
base:     minted 2.27B, unreleased 1.00B, circulating 1.27B

Cross-checked against independent eth_call totalSupply() reads on both chains outside this repo — exact match to the minted figures above.

2. Will there be adapters for each coin in the vaults? Yes, intent is to cover the full 38-currency kStable family (kEUR, kJPY, kGBP, kAUD, kCAD, kCHF, kSGD, and 31 more), same Base+Arbitrum deployment, same addChainExports pattern, same exclusion set (MM wallet + per-kStable convert vaults). kUSD went in alone first to establish the pattern and get review feedback before generating the rest. One thing we'd like your input on before submitting the others: about 19 of the 38 currencies (HKD, KRW, NOK, NZD, INR, THB, IDR, AED, SAR, EGP, MYR, VND, TWD, PLN, ILS, PKR, BDT, XAF) don't have a dedicated pegType in peggedAsset.type.ts yet — happy to propose new pegType values for those, or fall back to peggedVAR, whichever you'd prefer. Let us know and we'll follow up with a small number of grouped PRs for the rest of the family.

3. Attestations for the fiat backing: being direct — we do not yet have an independent third-party audited attestation report (no signed accounting-firm letter, Circle/Tether-style). What exists today:

  • On-chain, every mint calls mintWithBacking(recipient, amount, Crypto[], Fiat[]), which reverts (EmptyBacking()) if the collateral vectors are empty — so it is structurally impossible to mint without declaring the backing (crypto reserves and/or fiat reserves) at the contract level.
  • The backing registry is public and on-chain-queryable per kStable.
  • We publish a redemption-waterfall simulator (given any redemption-demand %, shows tier-by-tier where liquidity would come from) plus a machine-readable exclusion registry and circulating-supply API — all linked from the adapter and asset description.

No independent audit yet is a real gap, not a hidden one — flagging it plainly rather than working around the question.

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