Vite wallet
An ICP wallet built with React and Vite on @ic-reactor/core,
@ic-reactor/react and @ic-reactor/vite-plugin, against a local icp-cli
network that runs the NNS ICP ledger, Internet Identity and a small Rust
backend canister of the example’s own.
- The page’s network: one client per tab,
createClient({ network: "env", auth }). The Vite plugin sets theic_envcookie and proxies/apito the local network, so the backend is called as{ name: "backend" }and the ledger by its{ id }. A panel shows the id the client resolved and the cookie it came from. - Two ways to sign in, one client: Internet Identity through
@icp-sdk/auth’sAuthClient, pointed at the local II, and a “dev account” of the app’s own, anAuthLikeholding an Ed25519 key, offered only on a local page. Switching accounts shows the next account nothing of the last. - Reads and writes: the balance with
skipTokenwhile signed out and arefetchInterval, so a top-up from the example’s faucet shows by itself; ICP transfers withparseUnits, the fee, deduplication bycreated_at_timeand amemoper transfer, typed ledger errors and the unknown-outcome path; a profile write refused before sending while signed out. - Optimistic updates: an address book whose adds and removes show at once and roll back on a refusal or a failure, while the client’s own invalidation still runs; paying a contact refreshes both balances and not the address book.
The guides behind it: Auth for the two sign-in sources,
Writes for transfers and optimistic updates, and
the Vite plugin for the cookie and the /api proxy.
Every scenario has tests on createTestClient() that run without a replica
(pnpm test). To run the wallet itself you need icp-cli’s local network,
which the example installs (pnpm icp:start, pnpm icp:deploy,
pnpm dev), and the Rust toolchain for the backend; see its README.
StackBlitz installs the example from npm and runs those tests (npm test):
you can read and change the code there and run them again. It cannot run the
wallet itself. icp-cli’s local network is a native binary, which StackBlitz
does not run, and the backend needs the Rust toolchain, so the page it would
serve has no network to call. Clone the repository to run the wallet.