Skip to content

feat(core-signing-taurus-protect): add Taurus-PROTECT signing provider - #2268

Open
nbonvin wants to merge 2 commits into
canton-network:mainfrom
taurusgroup:feature/taurus-protect-signing-driver
Open

feat(core-signing-taurus-protect): add Taurus-PROTECT signing provider#2268
nbonvin wants to merge 2 commits into
canton-network:mainfrom
taurusgroup:feature/taurus-protect-signing-driver

Conversation

@nbonvin

@nbonvin nbonvin commented Aug 11, 2026

Copy link
Copy Markdown

Route Canton commands through a Taurus-PROTECT Canton gateway
(tg-canton-gatewayd): a submit provider — the gateway prepares, signs
(ECDSA P-256) and submits each CIP-103 command under Taurus governance,
so the wallet never handles a raw signature; it forwards commands and
reconciles status.

New package @canton-network/core-signing-taurus-protect:

  • GatewayClient: JSON-RPC transport (connect, listAccounts,
    prepareExecute, getTransactionStatus) with lazy session and one-shot
    reconnect, a monotonic per-command status cache with requestId
    re-seed, a pre-flight 1 MiB body guard, and an always-set commandId
    as the end-to-end idempotency key.
  • routingOnlyCommands: on the encoded path the gateway validates the
    full argument tree only to discard it for the PTX, and real
    token-standard arguments fail that validation, so commands are
    reduced to the routing fields (templateId '#'-prefixed, argument
    trees blanked).
  • TaurusProtectSigningDriver: SigningDriverInterface over the client;
    the gateway lifecycle rides in metadata.gatewayStatus ('executed'
    maps to 'signed', unknown values to 'failed').

wallet-gateway-remote wiring:

  • TransactionService: sign forwards the command once and re-polls
    after; execute reconciles and never posts to the ledger. A command
    is complete only on 'failed', or on 'executed' once the updateId is
    present — the gateway reports 'executed' before the updateId is
    observable. The ledger updateId stands in for the signature, and the
    executed payload/txChanged event is exactly
    {updateId, completionOffset: 0}.
  • TaurusProtectWalletAllocator: imports parties provisioned in
    Taurus-PROTECT (no topology transaction, no hash signing), guarding
    ambiguous prefixes; the vault picker lists parties by prefix.
  • Wallet sync skips Taurus-PROTECT wallets in the sync-needed check
    and the repair loop: parties are hosted remotely, so absence from
    the local rights snapshot says nothing.
  • Registered when TAURUS_PROTECT_GATEWAY_URL and
    TAURUS_PROTECT_GATEWAY_TOKEN are set.

Single-tenant by design: one machine token serves all wallet users.

Signed-off-by: NBO 519181+nbonvin@users.noreply.github.com

@nbonvin
nbonvin marked this pull request as ready for review August 11, 2026 13:59
@nbonvin
nbonvin requested a review from a team as a code owner August 11, 2026 13:59
@nbonvin nbonvin changed the title Adds Taurus-PROTECT as a signing provider for the Wallet Gateway Adds Taurus-PROTECT as a signing provider for the Wallet Gateway Aug 12, 2026
@nbonvin nbonvin changed the title Adds Taurus-PROTECT as a signing provider for the Wallet Gateway add Taurus-PROTECT as a signing provider for the Wallet Gateway Aug 12, 2026

@mjuchli-da mjuchli-da 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 for the contribution. We are excited to list Taurus as a signing driver.
We have just switched over from yarn to pnpm. Would you mind rebasing the PR again? Afterward, we will do a detailed review.

@nbonvin nbonvin changed the title add Taurus-PROTECT as a signing provider for the Wallet Gateway feat(core-signing-taurus-protect): add Taurus-PROTECT signing provider Aug 14, 2026
 Route Canton commands through a Taurus-PROTECT Canton gateway
 (tg-canton-gatewayd): a submit provider — the gateway prepares, signs
 (ECDSA P-256) and submits each CIP-103 command under Taurus governance,
 so the wallet never handles a raw signature; it forwards commands and
 reconciles status.

 New package @canton-network/core-signing-taurus-protect:
 - GatewayClient: JSON-RPC transport (connect, listAccounts,
   prepareExecute, getTransactionStatus) with lazy session and one-shot
   reconnect, a monotonic per-command status cache with requestId
   re-seed, a pre-flight 1 MiB body guard, and an always-set commandId
   as the end-to-end idempotency key.
 - routingOnlyCommands: on the encoded path the gateway validates the
   full argument tree only to discard it for the PTX, and real
   token-standard arguments fail that validation, so commands are
   reduced to the routing fields (templateId '#'-prefixed, argument
   trees blanked).
 - TaurusProtectSigningDriver: SigningDriverInterface over the client;
   the gateway lifecycle rides in metadata.gatewayStatus ('executed'
   maps to 'signed', unknown values to 'failed').

 wallet-gateway-remote wiring:
 - TransactionService: sign forwards the command once and re-polls
   after; execute reconciles and never posts to the ledger. A command
   is complete only on 'failed', or on 'executed' once the updateId is
   present — the gateway reports 'executed' before the updateId is
   observable. The ledger updateId stands in for the signature, and the
   executed payload/txChanged event is exactly
   {updateId, completionOffset: 0}.
 - TaurusProtectWalletAllocator: imports parties provisioned in
   Taurus-PROTECT (no topology transaction, no hash signing), guarding
   ambiguous prefixes; the vault picker lists parties by prefix.
 - Wallet sync skips Taurus-PROTECT wallets in the sync-needed check
   and the repair loop: parties are hosted remotely, so absence from
   the local rights snapshot says nothing.
 - Registered when TAURUS_PROTECT_GATEWAY_URL and
   TAURUS_PROTECT_GATEWAY_TOKEN are set.

 Single-tenant by design: one machine token serves all wallet users.

Signed-off-by: NBO <519181+nbonvin@users.noreply.github.com>
flatpack now uses `pnpm pack --pack-destination`: FLATPACK_OUTDIR is a
directory the packer reads back, so `yarn pack --out` would write a file
named after the directory. README install/run commands follow the repo
sweep.

setConfiguration compared a two-field config with lodash isEqual; a field
comparison does the same, so lodash and @types/lodash are dropped.

Signed-off-by: NBO <519181+nbonvin@users.noreply.github.com>
@nbonvin
nbonvin force-pushed the feature/taurus-protect-signing-driver branch from dd705d6 to a2602e1 Compare August 14, 2026 12:07
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