Skip to content

Add bootnode-canton-dappbooster-dev-stack proposal#390

Open
pablofullana wants to merge 1 commit into
canton-foundation:mainfrom
BootNodeDev:bootnode-canton-dappbooster-dev-stack
Open

Add bootnode-canton-dappbooster-dev-stack proposal#390
pablofullana wants to merge 1 commit into
canton-foundation:mainfrom
BootNodeDev:bootnode-canton-dappbooster-dev-stack

Conversation

@pablofullana

@pablofullana pablofullana commented May 28, 2026

Copy link
Copy Markdown

Development Fund Proposal Submission

Proposal file:
/proposals/bootnode-canton-dappbooster-dev-stack.md


Summary

dAppBooster for Canton v0.1 is an open-source local development stack (live today at github.com/BootNodeDev/cn-dappbooster) that takes a Canton dApp developer from Daml contracts to a working dApp UI on a laptop, including a self-custodial CIP-0103 browser wallet (Carpincho), and one-command local Canton infrastructure. This proposal funds the evolution of v0.1 toward its core thesis: Canton users installs one self-custodial wallet, creates their external parties within it, and uses those same parties to connect to any dApp on any validator. The keys never leave the wallet, the same identities work everywhere, and no dApp or validator can lock the user in.


Checklist

  • Proposal file added under /proposals/
  • Milestones and funding amounts defined
  • Acceptance criteria included
  • Alignment with Canton priorities described

Notes for Reviewers

@github-actions

Copy link
Copy Markdown

SIG labels auto-detected and applied: dapp-integration, wallet-apps

If this is incorrect, you can ask the reviewers to update the labels.

@github-actions

Copy link
Copy Markdown

@pablofullana, thank you for your interest in the Canton Development Fund!

Your proposal does not include a Champion/Endorser field.

Per CIP-0100, all external proposals require a Tech & Ops Committee champion.

Next steps:

  1. Add a "Champion" field to your proposal
  2. Identify a Tech & Ops Committee member organization willing to champion it
  3. Reopen this PR

If you need help finding a champion, reach out to SIGs or any Tech & Ops Committee member.

This PR is being closed automatically. You are welcome to reopen it once a champion is confirmed.

@github-actions github-actions Bot closed this May 28, 2026
@github-project-automation github-project-automation Bot moved this from Incoming to Declined in Dev Fund Incoming May 28, 2026
@hythloda hythloda self-assigned this Jun 9, 2026
@hythloda hythloda moved this from Declined to In Review (Champion Assigned) in Dev Fund Incoming Jun 9, 2026
@hythloda hythloda reopened this Jun 9, 2026
@hythloda hythloda moved this from In Review (Champion Assigned) to Ready for Vote in Dev Fund Incoming Jun 12, 2026
@hythloda hythloda moved this from Ready for Vote to Voting Live in Dev Fund Incoming Jun 12, 2026

@daravep daravep 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.

Thank you very much for your proposal. There is significant overlap with the Self-Signed OIDC work that is currently being completed by DA, which provides the native ability to authenticate to the user validator as well as to the provider app using self-signed JWTs.

At the same time, Send has already published, their browser variant of a CIP-103 wallet.

Would you be open to connect with the developers of CIP-103, Wallet Gateway and JWT auth to discuss how to structure your proposal in a way that incorporates these changes?


Canton's Q2 "App Building and Developer Experience" priority area lists reduced developer friction, interoperability across wallets and dApps, wallet gateway and dApp standards, documentation and examples, and lower total cost of ownership. dAppBooster for Canton **v0.1, shipping today**, already collapses local environment setup into a one-command install and demonstrates CIP-0103 end-to-end.

**This proposal funds the evolution of v0.1 around a single thesis:** in Canton's external party model, a user's identities and signing keys belong to the user, not to any one validator or any one dApp. The reference workflow this stack must demonstrate is therefore **a single self-custodial wallet that holds keys for the user's external parties and interacts with multiple dApps across multiple validators.** The v0.1 establishes the local loop; this proposal delivers the components needed to make that cross-validator, cross-dApp workflow production-shaped: wallet-based identity at the validator boundary (SIWC), per-account scoped sessions via the upstream wallet-gateway, a composable scaffold that can stand up production-like contexts, and a developer-grade wallet that holds up across real apps and real validators.

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.

What do you mean with "interacts with multiple dApps across multiple validators"? Where is my party hosted, where do I submit my commands to? How do I authenticate to the dApp and how to my validator? How do I authorize my commands? This is all captured in CIP-103. But you are saying here that you are building something new but you also refer to CIP-103. Can you elaborate?

@pablofullana pablofullana Jun 16, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

We mean, where the party is hosted, where commands are submitted, how the wallet authenticates to the dApp, and how authorization happens. These are all CIP-103, and Carpincho follows the spec. We are not aiming to reinvent any of that; it's not in scope here.

Carpincho (intended for external parties) is discovered by dApps over window.canton.carpincho, signs prepared transactions locally, and submits via wallet-service → participant.

What CIP-103 doesn't yet cover, and what we meant by "multiple validators", is being able to use the same identity across many validators.

Our proposal was to implement a SIWC IdP and extend the wallet-gateway with an external signing provider. SIOPv2 makes that go away: the wallet mints the JWT itself, the validator verifies the signature, no IDP in the loop. That's what we'll integrate once it lands in the wallet-gateway.


**canton-barebones** is the minimal Canton infrastructure layer: a Canton participant, a local synchronizer, Postgres, the JSON Ledger API, local dev token generation, DAR deployment scripts, and health checks. It intentionally excludes Keycloak/OIDC, PQS, the Splice layer, the business backend, and the frontend app, so the base stays small and predictable. A developer starts from a working Canton runtime and adds only the pieces they need.

**Carpincho** is a self-custodial browser wallet that implements the Synchronous variant of the CIP-0103 dApp API. Keys are created and stored locally in the browser, and a single Carpincho instance can hold keys for any number of the user's external parties. Carpincho signs prepared Canton hashes locally only after the user approves in the wallet. Private keys never leave Carpincho.

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.

Can you elaborate what you mean with synchronous variant of CIP-0103? Is it the CIP-103 API or is it something different?

Also, please note that Send seems to have already built the CIP-103 browser wallet using passkeys: https://info.send.it/docs/send-safe/send-connect

@pablofullana pablofullana Jun 16, 2026

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

re: "synchronous variant". That's our coinage, not CIP-103 spec language, and we can do better. We mean the CIP-103 dApp API served over the sync transport, the browser provider injected at window.canton.carpincho. The "async variant" we use for wallet-service is the same CIP-103 API, served over HTTP. Same protocol, different transports. We'll fix the proposal wording.

re: Send Connect. Indeed, they've shipped a real CIP-103 browser wallet, and the WebAuthn PRF passkey UX is genuinely good for the consumer use case.

Carpincho is CIP-0103 compatible, but it is designed as a development wallet. To provide richer tooling than a standard wallet, Carpincho relies on an extended version of the wallet-gateway, which we call wallet-service.

The differences that matter for that use case:

  • Protocol-native Ed25519 keys, not derived via WebAuthn PRF. Easier to inject test keys, easier to reason about in CI, no passkey enrollment step.
  • Headless / Playwright mode for CI testability. Passkey-based wallets are structurally hard to drive in headless CI. Virtual authenticators help, but PRF in particular has thin test tooling.
  • Open development: both the wallet binary and the SDK live in the same canonical public repo, with all commits public. That makes the codebase forkable for teams building on top, not just installable.
  • Stack integration: Carpincho ships as one of the components inside dAppBooster, alongside the dev environment and example dApp. Send Connect is a standalone consumer product.

A dApp built with dAppBooster targets any CIP-103 wallet at ship, Send Connect included. Different artifacts for different audiences, no overlap to resolve.

At the time of writing this comment, current POC/alpha version of Carpincho already ships with:

  • CIP-56 and Amulet asset listing
  • Balances and UTXO inspection
  • Token send and transfer acceptance flows
  • Amulet preapproval management
  • dApp transaction preparation
  • Execution of prepared transactions
  • prepareExecuteAndWait
  • Controlled ledgerApi proxying
  • DAR deployments
  • Contracts creation
  • Choices exercise
  • Party activity listing
  • Active contract listing for parties

Screenshots of these features here: Carpincho features for developers

And many others in the projected roadmap.


**Carpincho** is a self-custodial browser wallet that implements the Synchronous variant of the CIP-0103 dApp API. Keys are created and stored locally in the browser, and a single Carpincho instance can hold keys for any number of the user's external parties. Carpincho signs prepared Canton hashes locally only after the user approves in the wallet. Private keys never leave Carpincho.

**wallet-service** is the bridge between Carpincho and Canton, implementing the Asynchronous variant of CIP-0103. It exposes the operations Carpincho needs while wallet-gateway migration is not yet done: external party creation, transaction preparation, user-approval handoff, local signing, and execution of signed, prepared transactions. It does not store private keys and contains no example-specific business logic.

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.

What do you mean with "while wallet-gateway migration is not yet done"?

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

wallet-service is our temporary solution while wallet-gateway is under development. It gives Carpincho the async CIP-103 operations it needs today (external party creation, transaction prep, …), because upstream wallet-gateway can't yet serve browser-resident wallets.

wallet-service keeps the base wallet-gateway capabilities, but adds internal RPC methods that Carpincho uses to interact with Canton. It also makes it possible for Carpincho to feature all the developer tools, features, and capabilities it ships with.


![bootnode-canton-dappbooster-dev-stack-architecture](https://www.dappbooster.cc/share/components-flow.jpeg)

**canton-barebones** is the minimal Canton infrastructure layer: a Canton participant, a local synchronizer, Postgres, the JSON Ledger API, local dev token generation, DAR deployment scripts, and health checks. It intentionally excludes Keycloak/OIDC, PQS, the Splice layer, the business backend, and the frontend app, so the base stays small and predictable. A developer starts from a working Canton runtime and adds only the pieces they need.

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.

Note that https://openid.net/specs/openid-connect-self-issued-v2-1_0.html is coming to canton to allow removing the reliance on IDPs.

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.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

The goal has always been to let developers run a complete Canton development stack with a single command, npx dappbooster --canton and get a full local Canton stack running without having to manually (Splice frontend, JS backend, wallet, Splice, wallet-gateway, and wallet-service). Where developers could customize the validators it starts, which optional services to enable, like PQS.

We understand there may be other ways to provide this one-command Canton stack, for example creating DPM templates. During the recent NYC 2026 ETHGlobal hackathon we realized those templates exist. This is the way we propose, but we are open to collaborate with other alternatives if you consider them more appropriate.


The milestones describe the work in detail. At a high level:

1. **Sign-with-Canton (SIWC)** replaces username/password-style auth at the validator boundary with JWTs issued against the party's own protocol signing keys, so the same wallet that signs Daml transactions also proves identity to every validator it talks to. This is what makes the workflow practical at the network level: the same wallet, the same keys, and the user's parties across many validators.

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.

Did you implement a new auth method in Canton or where are you validating the JWTs? In the wallet service? We are right now adding this actually as part of the CIP-103 work to Canton, using the self-signed OIDC standard.

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

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

At the moment of submitting this RFP, we were not aware of the existence of self-signed OIDC standard. So this SIWC item is no longer relevant.

@pablofullana

Copy link
Copy Markdown
Author

Thank you very much for your proposal. There is significant overlap with the Self-Signed OIDC work that is currently being completed by DA, which provides the native ability to authenticate to the user validator as well as to the provider app using self-signed JWTs.

At the same time, Send has already published, their browser variant of a CIP-103 wallet.

Would you be open to connect with the developers of CIP-103, Wallet Gateway and JWT auth to discuss how to structure your proposal in a way that incorporates these changes?

@daravep , thanks for the review. The overlap concerns are well-placed and we want to bake them in rather than work around them.

Yes to the offer to connect. A call with the CIP-103, Wallet Gateway, and JWT auth folks at DA is the right venue before we revise the proposal body. If you can point us at the right contacts or set it up, we'll coordinate timing as soon as possible (pablo@bootnode.dev).

We'll work through the inline feedback and reply on each thread shortly.

@pablofullana

pablofullana commented Jun 18, 2026

Copy link
Copy Markdown
Author

@daravep , below is a chart and a condensed list of our proposal's components to make the scope easier to follow at a glance, happy to refine if anything reads unclear.

image
  • [New] dAppBooster CLI: a single command npx dappbooster --canton with everything you need to build Apps on Canton.

  • [Existing] Splice: provisions a local instance of the standard Splice stack developed by Canton.

  • [New] Wallet-Gateway for Developers: (formerly named wallet-service) extends the existing CIP-103 wallet-gateway with developer-focused capabilities. It exposes an RPC interface with methods such as prepareTransaction, executePrepared, cip56.listPendingTransfers, cip56.listHoldings, and many others.

  • [New] dApp Backend: based on the Quickstart backend example, it's a TypeScript backend that acts as a bridge between the frontend and the Canton infrastructure, enabling contract queries, PQS access, and other backend services.

  • [New] dApp Frontend: a TypeScript + Vite scaffold that provides the building blocks common to most Canton dApps, including wallet connectivity, connected-party visualization, and other essential integrations.

  • [New] dApp Components: a collection of reusable React components for Canton dApps, including: token inputs, token selectors, party inputs, bigint inputs, and other commonly needed UI elements.

  • [Temporary] Connect Kit: a lightweight connector that enables frontend applications to discover Carpincho through window.canton.carpincho. This component can eventually be replaced by PartyLayer if it adds support for automatic wallet discovery through the window.canton namespace.

  • [New] Carpincho: a browser wallet extension designed for Canton developers.

    • End-user features: create external parties, manage token holdings, transfer tokens, approve transfers (CIP-56 and Amulet support), and view transaction activity.
    • Developer-oriented features: when connected to Wallet Gateway for Developers, Carpincho unlocks advanced development workflows such as DAR deployment, contract creation, choice execution, active contract inspection, and additional capabilities planned on the roadmap.
    • demo video: carpincho wallet demo
  • (New) CIP-56 faucet: a local faucet that allows any connected party to manage sample CIP-56 utility tokens.

Hoping this gives a clearer picture going into the sync with the CIP-103, Wallet Gateway, and JWT auth team at DA.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: Voting Live

Development

Successfully merging this pull request may close these issues.

3 participants