Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
121 commits
Select commit Hold shift + click to select a range
3b88dcb
feat(carpincho-wallet): bring feature-ready wallet from darkpool
gabitoesmiapodo Jun 18, 2026
42ba779
chore(carpincho-wallet): default wallet-service RPC to localhost
gabitoesmiapodo Jun 18, 2026
f4b7768
feat(wallet-service): add amulet faucet tap
gabitoesmiapodo Jun 18, 2026
7296386
fix(wallet-service): pass amulet registry as URL
gabitoesmiapodo Jun 18, 2026
f91d6a0
fix(carpincho-wallet): fail closed on password strength and enforce i…
gabitoesmiapodo Jun 18, 2026
4e082cf
fix(carpincho-wallet): re-auth before revealing private key and auto-…
gabitoesmiapodo Jun 18, 2026
15f56b8
fix(carpincho-wallet): gate injected-provider account access behind p…
gabitoesmiapodo Jun 18, 2026
ecfc668
fix(carpincho-wallet): keep the default minimum password score at 1
gabitoesmiapodo Jun 18, 2026
d8ecedb
refactor(carpincho-wallet): simplify clipboard, gatekeeper, and provi…
gabitoesmiapodo Jun 18, 2026
d6b6d74
chore: gitignore .env.fivenorth
gabitoesmiapodo Jun 18, 2026
c1eaf60
refactor(carpincho-wallet): classify provider methods by access tier …
gabitoesmiapodo Jun 18, 2026
a6c82d3
refactor(carpincho-wallet): extract shared ConfirmPasswordForm
gabitoesmiapodo Jun 18, 2026
2357f5e
docs: sync wallet-service and carpincho docs to amulet.tap and the or…
gabitoesmiapodo Jun 18, 2026
1b7667a
feat(carpincho-wallet): expose dApp host and favicon in connection st…
gabitoesmiapodo Jun 18, 2026
ccf0f0d
feat(carpincho-wallet): redesign connection footer as a single dApp +…
gabitoesmiapodo Jun 18, 2026
510199a
refactor(carpincho-wallet): render the dApp favicon with Radix Avatar
gabitoesmiapodo Jun 18, 2026
4abb762
refactor(carpincho-wallet): tidy connection footer after review
gabitoesmiapodo Jun 18, 2026
0e5c7c3
chore(carpincho-wallet): remove dead extension and theme exports
gabitoesmiapodo Jun 18, 2026
e13d1b9
refactor(carpincho-wallet): reuse icon-button styling and restore foo…
gabitoesmiapodo Jun 18, 2026
73060e8
docs(carpincho-wallet): sync icon catalogue and Radix list to the foo…
gabitoesmiapodo Jun 18, 2026
50f8c43
refactor(carpincho-wallet): show token balance instead of UTXO count …
gabitoesmiapodo Jun 18, 2026
de60552
refactor(carpincho-wallet): extract auto-accept toggle into AutoAccep…
gabitoesmiapodo Jun 19, 2026
4eeaa2d
fix(carpincho-wallet): use a span not a heading for the auto-accept l…
gabitoesmiapodo Jun 19, 2026
a8abdab
feat(carpincho-wallet): add TransferDetailsSheet for transfer metadata
gabitoesmiapodo Jun 19, 2026
ad3315a
refactor(carpincho-wallet): split TransferCard into needs-action and …
gabitoesmiapodo Jun 19, 2026
533eeef
test(carpincho-wallet): assert Accept button is disabled while accepting
gabitoesmiapodo Jun 19, 2026
cb3e2f6
feat(carpincho-wallet): add ActivityPanel folding pending transfers i…
gabitoesmiapodo Jun 19, 2026
34dbf22
fix(carpincho-wallet): make ActivityPanel pending-count effects ident…
gabitoesmiapodo Jun 19, 2026
f06440c
feat(carpincho-wallet): surface auto-accept on the assets tab
gabitoesmiapodo Jun 19, 2026
cad6883
refactor(carpincho-wallet): drop the transfers tab and badge activity
gabitoesmiapodo Jun 19, 2026
c73820f
fix(carpincho-wallet): restore no-account guard in ActivityPanel and …
gabitoesmiapodo Jun 19, 2026
bcbbd77
fix(carpincho-wallet): force-mount the assets tab so auto-accept keep…
gabitoesmiapodo Jun 19, 2026
9868bf3
refactor(carpincho-wallet): add token icon, bare eye next to accept, …
gabitoesmiapodo Jun 19, 2026
eaa6009
refactor(carpincho-wallet): vertically center the needs-action card a…
gabitoesmiapodo Jun 19, 2026
f6293f8
refactor(carpincho-wallet): refine accept feedback and pending-activi…
gabitoesmiapodo Jun 19, 2026
c57b1d1
refactor(carpincho-wallet): drop unreachable isAccepting state from T…
gabitoesmiapodo Jun 19, 2026
9ff258c
refactor(carpincho-wallet): share DetailRow and name activity render …
gabitoesmiapodo Jun 19, 2026
ebe23a9
docs(carpincho-wallet): sync agents and architecture with the activit…
gabitoesmiapodo Jun 19, 2026
804ffa7
chore(carpincho-wallet): add collapsible and json-view deps for utils…
gabitoesmiapodo Jun 19, 2026
e63eace
feat(carpincho-wallet): add Collapsible ui wrapper
gabitoesmiapodo Jun 19, 2026
c15448e
feat(carpincho-wallet): add Copyable and route CopyPartyIdButton thro…
gabitoesmiapodo Jun 19, 2026
f288e21
feat(carpincho-wallet): add themed JsonView wrapper
gabitoesmiapodo Jun 19, 2026
518d4c4
feat(carpincho-wallet): add validated JsonField for ledger command pa…
gabitoesmiapodo Jun 19, 2026
8235584
feat(carpincho-wallet): add CreateContractUtil screen
gabitoesmiapodo Jun 19, 2026
7a3c75e
feat(carpincho-wallet): add ExerciseChoiceUtil component
gabitoesmiapodo Jun 19, 2026
570bb06
feat(carpincho-wallet): add ActiveContractsUtil with collapsible cards
gabitoesmiapodo Jun 19, 2026
73e655a
refactor(carpincho-wallet): restyle DAR upload as a dropzone
gabitoesmiapodo Jun 19, 2026
4e22f53
feat(carpincho-wallet): add UtilDetail shell
gabitoesmiapodo Jun 19, 2026
f663b2a
feat(carpincho-wallet): add UtilsList with faucet action and drill-in…
gabitoesmiapodo Jun 19, 2026
86f66f5
feat(carpincho-wallet): replace LedgerToolsPanel with master/detail U…
gabitoesmiapodo Jun 19, 2026
876cf45
feat(carpincho-wallet): remove Tap Amulet from Assets tab
gabitoesmiapodo Jun 19, 2026
96e0b5f
feat(carpincho-wallet): make detail-sheet rows copyable
gabitoesmiapodo Jun 19, 2026
3fc13d1
feat(carpincho-wallet): make transaction details copyable and tree-re…
gabitoesmiapodo Jun 19, 2026
e97a611
feat(carpincho-wallet): copy counterparty party id from transfer cards
gabitoesmiapodo Jun 19, 2026
367c903
feat(carpincho-wallet): replace raw JSON <pre> blocks with JsonView tree
gabitoesmiapodo Jun 19, 2026
100f604
fix(carpincho-wallet): remove dead ternary in PendingActionCard and s…
gabitoesmiapodo Jun 19, 2026
a9018db
style(carpincho-wallet): polish utils faucet row, DAR dropzone, and j…
gabitoesmiapodo Jun 19, 2026
4273d25
fix(carpincho-wallet): render non-object JsonView payloads as plain text
gabitoesmiapodo Jun 19, 2026
be19e97
style(carpincho-wallet): card rows, stacked tx details, copy-by-title…
gabitoesmiapodo Jun 19, 2026
0d0988e
style(carpincho-wallet): unify data rows, framed identifier values, n…
gabitoesmiapodo Jun 19, 2026
2ef2f92
refactor(carpincho-wallet): open utils in a modal instead of drill-in
gabitoesmiapodo Jun 19, 2026
73577e0
style(carpincho-wallet): frame+copy all data rows, account cards, con…
gabitoesmiapodo Jun 19, 2026
a4b8faf
fix(carpincho-wallet): auto-accept copy applies to all incoming trans…
gabitoesmiapodo Jun 19, 2026
fd6bb6b
refactor(carpincho-wallet): drop dead mono flag from activity detail …
gabitoesmiapodo Jun 19, 2026
ffdc418
refactor(carpincho-wallet): extract shared UpdateIdResult and Copyabl…
gabitoesmiapodo Jun 19, 2026
0b01f1a
docs(carpincho-wallet): sync agents and architecture with the utils-t…
gabitoesmiapodo Jun 19, 2026
fa5a4d1
feat(carpincho-wallet): add whole-vault export/import to VaultContext
gabitoesmiapodo Jun 19, 2026
1efda22
feat(carpincho-wallet): add secure-context downloadJson utility
gabitoesmiapodo Jun 19, 2026
744c3b6
feat(carpincho-wallet): add whole-vault backup export/import UI
gabitoesmiapodo Jun 19, 2026
15fc390
feat(carpincho-wallet): collapse password change into a single step
gabitoesmiapodo Jun 19, 2026
798e754
style(carpincho-wallet): replace awkward password strength helper text
gabitoesmiapodo Jun 19, 2026
0b158db
feat(carpincho-wallet): restructure drawer around Vault and drop per-…
gabitoesmiapodo Jun 19, 2026
d4e8a1b
style(carpincho-wallet): balance vault backup actions, add import hel…
gabitoesmiapodo Jun 19, 2026
8f09ee3
fix(carpincho-wallet): guard password change against double submit
gabitoesmiapodo Jun 19, 2026
8596990
fix(carpincho-wallet): harden vault import validation and backup clip…
gabitoesmiapodo Jun 19, 2026
5b9dcd4
refactor(carpincho-wallet): extract shared FileDropInput for DAR and …
gabitoesmiapodo Jun 19, 2026
205645c
docs(carpincho-wallet): sync agents and architecture with the vault m…
gabitoesmiapodo Jun 19, 2026
f1fad95
style(carpincho-wallet): separate current and new password fields wit…
gabitoesmiapodo Jun 19, 2026
0f7a588
feat(carpincho-wallet): add useWalletServiceTest hook for the RPC con…
gabitoesmiapodo Jun 19, 2026
c08452d
test(carpincho-wallet): harden useWalletServiceTest error handling an…
gabitoesmiapodo Jun 19, 2026
f6b5b51
feat(carpincho-wallet): add Configure RPC onboarding step with auto-t…
gabitoesmiapodo Jun 19, 2026
6319c1f
fix(carpincho-wallet): resolve status-band flex alignment and tighten…
gabitoesmiapodo Jun 19, 2026
2a1392f
refactor(carpincho-wallet): move password recommendations tooltip to …
gabitoesmiapodo Jun 19, 2026
7cff79a
refactor(carpincho-wallet): drop the connection footer from the accou…
gabitoesmiapodo Jun 19, 2026
ba55e36
feat(carpincho-wallet): make first-run onboarding a three-step vault/…
gabitoesmiapodo Jun 19, 2026
9d7ad7a
refactor(carpincho-wallet): use useId for the Configure RPC field id
gabitoesmiapodo Jun 19, 2026
328e6f5
fix(carpincho-wallet): restore password recommendations tooltip in ch…
gabitoesmiapodo Jun 19, 2026
8b3c579
test(carpincho-wallet): cover RPC auto-recovery and stabilize passwor…
gabitoesmiapodo Jun 19, 2026
60ed192
refactor(carpincho-wallet): simplify RPC status band and dedupe displ…
gabitoesmiapodo Jun 19, 2026
a6dbc72
docs(carpincho-wallet): sync architecture.md with three-step onboardi…
gabitoesmiapodo Jun 19, 2026
7c42ca1
refactor(carpincho-wallet): drop the brand-gradient fill from the dAp…
gabitoesmiapodo Jun 19, 2026
53a7589
refactor(carpincho-wallet): trim the Upload DAR modal label and butto…
gabitoesmiapodo Jun 19, 2026
5a27c09
refactor(carpincho-wallet): shorten the Create and Exercise action bu…
gabitoesmiapodo Jun 19, 2026
c39dd6e
refactor(carpincho-wallet): let tooltips auto-position instead of pin…
gabitoesmiapodo Jun 19, 2026
2d21605
feat(carpincho-wallet): collapse active-contract rows to the short id…
gabitoesmiapodo Jun 19, 2026
e0c58df
fix(carpincho-wallet): give the holdings list a fixed height to stop …
gabitoesmiapodo Jun 19, 2026
41f4436
refactor(carpincho-wallet): move the activity row time below the titl…
gabitoesmiapodo Jun 19, 2026
e932fdb
refactor(carpincho-wallet): rename the vault export confirm button to…
gabitoesmiapodo Jun 19, 2026
e9b63ad
refactor(carpincho-wallet): unify status pills and section titles beh…
gabitoesmiapodo Jun 19, 2026
55a6262
refactor(carpincho-wallet): unify list-item padding and tab content t…
gabitoesmiapodo Jun 19, 2026
d3cf707
feat(carpincho-wallet): filter active contracts live, refresh via an …
gabitoesmiapodo Jun 19, 2026
7680394
feat(carpincho-wallet): filter active contracts by template or contra…
gabitoesmiapodo Jun 19, 2026
e1c837f
feat(carpincho-wallet): spin the refresh icon and make the filter a s…
gabitoesmiapodo Jun 19, 2026
4089a6c
feat(carpincho-wallet): speed up the refresh icon spin to a 500ms turn
gabitoesmiapodo Jun 19, 2026
09bc0ed
test(carpincho-wallet): cover the refresh spinner stop transition
gabitoesmiapodo Jun 19, 2026
3e6d64f
refactor(carpincho-wallet): drop redundant type=text on the contract …
gabitoesmiapodo Jun 19, 2026
69dad28
docs(carpincho-wallet): list REFRESH_ICON and the spin-fast keyframe
gabitoesmiapodo Jun 19, 2026
0c506b7
refactor(carpincho-wallet): drop the unused templateId filter from li…
gabitoesmiapodo Jun 19, 2026
1872897
feat(carpincho-wallet): add encrypted backup container type and guard
gabitoesmiapodo Jun 19, 2026
074bb57
feat(carpincho-wallet): add encrypted vault export/import to VaultCon…
gabitoesmiapodo Jun 19, 2026
9a29c5f
feat(carpincho-wallet): encrypted, file-only vault backup UI
gabitoesmiapodo Jun 19, 2026
89d1072
feat(carpincho-wallet): restore-from-backup option in onboarding acco…
gabitoesmiapodo Jun 19, 2026
bc996b5
refactor(carpincho-wallet): make plaintext envelope build/merge inter…
gabitoesmiapodo Jun 19, 2026
c4a8eac
test(carpincho-wallet): cover dedupe-skip, malformed-partyId, and loc…
gabitoesmiapodo Jun 19, 2026
224697c
refactor(carpincho-wallet): one-step vault export, plainer backup cop…
gabitoesmiapodo Jun 19, 2026
a7cbc63
perf(carpincho-wallet): re-encrypt once per batch import, not per acc…
gabitoesmiapodo Jun 19, 2026
96bec02
refactor(carpincho-wallet): reuse isRecord guard, single source for b…
gabitoesmiapodo Jun 19, 2026
d6fd182
docs(carpincho-wallet): sync vault backup API and onboarding restore …
gabitoesmiapodo Jun 19, 2026
83a4126
test(carpincho-wallet): add stable data-testid selectors across UI flows
gabitoesmiapodo Jun 19, 2026
61208fc
fix: gate copied checkmark on successful clipboard write via onSucces…
gabitoesmiapodo Jun 22, 2026
990b5a6
fix(carpincho-wallet): drop drag-and-drop wording from file-picker pr…
gabitoesmiapodo Jun 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ dist-extension/
# env
.env
.env.local
.env.fivenorth

# typescript
*.tsbuildinfo
Expand Down
2 changes: 1 addition & 1 deletion canton-barebones/wallet-service/AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ This file applies only to `canton-barebones/wallet-service/`. For monorepo-wide

## Scope

The wallet-service is a consumer-dApp-agnostic Express JSON-RPC bridge between Carpincho and the local Canton participant. It holds the Canton bearer token boundary, prepares and executes transactions, proxies participant reads, exposes CIP-56 token-standard reads/transfers and Amulet (Canton Coin) preapproval management, and handles wallet-internal party onboarding.
The wallet-service is a consumer-dApp-agnostic Express JSON-RPC bridge between Carpincho and the local Canton participant. It holds the Canton bearer token boundary, prepares and executes transactions, proxies participant reads, exposes CIP-56 token-standard reads/transfers and Amulet (Canton Coin) preapproval management and DevNet faucet tap, and handles wallet-internal party onboarding.

## Working Rules

Expand Down
3 changes: 2 additions & 1 deletion canton-barebones/wallet-service/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,9 @@ These add Canton token-standard reads and transfers plus Amulet (Canton Coin) pr
| `amulet.preapproval.create` | Prepares enabling Amulet auto-accept. |
| `amulet.preapproval.cancel` | Prepares disabling Amulet auto-accept. |
| `amulet.preapproval.acceptProposal` | Accepts a `TransferPreapprovalProposal` for the receiver. |
| `amulet.tap` | Prepares the fixed 100 AMT Splice DevNet faucet tap for a receiver (DevNet only). |

The write methods (`create*`, `acceptTransfer`, `amulet.preapproval.create/cancel/acceptProposal`) return prepared transactions; Carpincho signs locally and submits via `executePrepared`.
The write methods (`create*`, `acceptTransfer`, `amulet.preapproval.create/cancel/acceptProposal`, `amulet.tap`) return prepared transactions; Carpincho signs locally and submits via `executePrepared`.

`prepareExecute`, `prepareExecuteAndWait`, and `signMessage` stay in
Carpincho because they require the user's key and approval UI.
Expand Down
6 changes: 6 additions & 0 deletions canton-barebones/wallet-service/src/mock.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,11 @@ export const createMockRpc = (
return rpcResult(id, { commands: [], disclosedContracts: [] })
case 'amulet.preapproval.status':
return rpcResult(id, { active: false, expired: false })
case 'amulet.tap':
return rpcResult(id, {
commands: { ExerciseCommand: { choice: 'AmuletRules_DevNet_Tap' } },
disclosedContracts: [],
})
case 'amulet.preapproval.create':
case 'amulet.preapproval.cancel':
return rpcResult(id, { commands: [], disclosedContracts: [] })
Expand Down Expand Up @@ -218,6 +223,7 @@ export const createMockRpc = (
'cip56.listHoldings',
'cip56.createTransfer',
'amulet.preapproval.status',
'amulet.tap',
'amulet.preapproval.create',
'amulet.preapproval.acceptProposal',
'amulet.preapproval.cancel',
Expand Down
21 changes: 20 additions & 1 deletion canton-barebones/wallet-service/src/rpc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ type ActiveJsContractReader = {

type Cip56TokenSdk = {
amulet?: {
tap?: (receiver: string, amount: string) => Promise<[unknown, unknown[]]>
preapproval: {
ctx?: {
validatorParty?: string
Expand Down Expand Up @@ -256,6 +257,7 @@ const TRANSFER_PREAPPROVAL_PROPOSAL_TEMPLATE_ID =
'#splice-wallet:Splice.Wallet.TransferPreapproval:TransferPreapprovalProposal'
const TRANSFER_PREAPPROVAL_PROPOSAL_MAX_ATTEMPTS = 31
const TRANSFER_PREAPPROVAL_PROPOSAL_RETRY_MS = 1_000
const AMULET_TAP_AMOUNT = '100'

export const rpcResult = (id: JsonRpcId, result: unknown): JsonRpcSuccess => ({
jsonrpc: '2.0',
Expand Down Expand Up @@ -571,7 +573,7 @@ export const createRpc = (config: WalletServiceConfig, deps: RpcDependencies = {
amulet: {
validatorUrl: config.splice.validatorUrl,
scanApiUrl: config.splice.scanApiUrl,
registryUrl: config.splice.registryApiUrl,
registryUrl: new URL(config.splice.registryApiUrl),
auth,
},
})
Expand Down Expand Up @@ -880,6 +882,20 @@ export const createRpc = (config: WalletServiceConfig, deps: RpcDependencies = {
}
}

// Prepares the fixed DevNet tap command so Carpincho can sign as the receiver.
const amuletTap = async (
params: unknown,
): Promise<{ commands: unknown; disclosedContracts: unknown[] }> => {
const p = objectParam<Record<string, unknown>>(params, 'amulet.tap')
const receiver = requiredStringParam(p, 'receiver')
const sdk = await getTokenSdk()
if (sdk.amulet?.tap === undefined) {
throw new Error('Amulet tap is unavailable')
}
const [commands, disclosedContracts] = await sdk.amulet.tap(receiver, AMULET_TAP_AMOUNT)
return { commands, disclosedContracts }
}

// Prepares the receiver-signed proposal that asks the validator provider to enable auto-accept.
const amuletPreapprovalCreate = async (
params: unknown,
Expand Down Expand Up @@ -1082,6 +1098,8 @@ export const createRpc = (config: WalletServiceConfig, deps: RpcDependencies = {
return rpcResult(id, await cip56CreateTransfer(request.params))
case 'amulet.preapproval.status':
return rpcResult(id, await amuletPreapprovalStatus(request.params))
case 'amulet.tap':
return rpcResult(id, await amuletTap(request.params))
case 'amulet.preapproval.create':
return rpcResult(id, await amuletPreapprovalCreate(request.params))
case 'amulet.preapproval.acceptProposal':
Expand Down Expand Up @@ -1137,6 +1155,7 @@ export const createRpc = (config: WalletServiceConfig, deps: RpcDependencies = {
'cip56.acceptTransfer',
'cip56.createTransfer',
'amulet.preapproval.status',
'amulet.tap',
'amulet.preapproval.create',
'amulet.preapproval.acceptProposal',
'amulet.preapproval.cancel',
Expand Down
35 changes: 34 additions & 1 deletion canton-barebones/wallet-service/test/rpc.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ describe('CIP-56 token helpers', () => {
assert.deepEqual(seen.amuletConfig, {
validatorUrl: 'http://localhost:2000/api/validator',
scanApiUrl: 'http://scan.localhost:4000/api/scan',
registryUrl: 'http://localhost:2000/api/validator/v0/scan-proxy',
registryUrl: new URL('http://localhost:2000/api/validator/v0/scan-proxy'),
auth: { method: 'static', token: 'backend.jwt' },
})
})
Expand Down Expand Up @@ -465,6 +465,39 @@ describe('CIP-56 token helpers', () => {
})
})

it('prepares a fixed DevNet Amulet tap command for the receiver party', async () => {
// Scenario: Carpincho needs a test-only faucet button that requests a fixed
// 100 AMT for the selected external party while preserving local signing.
const disclosedContracts = [{ contractId: 'tap-context-cid', createdEventBlob: 'blob' }]
const seen: { receiver?: string; amount?: string } = {}
const rpc = createRpc(withToken(), {
sdkFactory: async () => ({
amulet: {
tap: async (receiver: string, amount: string) => {
seen.receiver = receiver
seen.amount = amount
return [{ ExerciseCommand: { choice: 'AmuletRules_DevNet_Tap' } }, disclosedContracts]
},
},
}),
})

const res = (await rpc.handle({
jsonrpc: '2.0',
id: 1,
method: 'amulet.tap',
params: { receiver: 'receiver::party' },
})) as JsonRpcResponse

assert.ok('result' in res)
assert.deepEqual(res.result, {
commands: { ExerciseCommand: { choice: 'AmuletRules_DevNet_Tap' } },
disclosedContracts,
})
assert.equal(seen.receiver, 'receiver::party')
assert.equal(seen.amount, '100')
})

it('accepts an Amulet transfer preapproval proposal as the validator provider', async () => {
// Scenario: after Carpincho creates the receiver-signed proposal, the local
// validator provider must accept it with a normal participant submit.
Expand Down
4 changes: 4 additions & 0 deletions carpincho-wallet/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Optional. Minimum zxcvbn strength score (0-4) required to set a vault password.
# 0 too weak, 1 very guessable, 2 fair, 3 strong, 4 excellent.
# Defaults to 1 when unset. Use 3 for a security-conscious build.
# VITE_MIN_PASSWORD_SCORE=1
15 changes: 12 additions & 3 deletions carpincho-wallet/AGENTS.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion carpincho-wallet/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

Standalone browser wallet for the Canton barebones.

Carpincho is a wallet/provider UI with an encrypted local vault, an injected CIP-0103 browser provider, and optional WalletConnect support. A dApp connects to Carpincho through the injected provider by default; Carpincho answers wallet/provider requests and forwards Canton execution requests to the app's wallet-service JSON-RPC endpoint.
Carpincho is a wallet/provider UI with an encrypted local vault, an injected CIP-0103 browser provider, and optional WalletConnect support. A dApp connects to Carpincho through the injected provider by default; Carpincho answers wallet/provider requests and forwards Canton execution requests to the app's wallet-service JSON-RPC endpoint. A dApp must be explicitly approved per origin before Carpincho exposes accounts or signs for it: an unapproved site sees no accounts, and the first `connect` opens an approval prompt in Carpincho.

```text
dApp frontend -> injected CIP-0103 provider -> carpincho-wallet -> wallet-service /rpc -> Canton participant
Expand Down
Loading