Cashu TS is a JavaScript library for Cashu wallets written in Typescript.
Wallet Features:
- connect to mint (load keys)
- request minting tokens
- minting tokens
- sending tokens (get encoded token for chosen value)
- receiving tokens
- melting tokens
- check if tokens are spent
- ...
Implemented NUTs:
Supported token formats:
- v1 read
- v2 read (deprecated)
- v3 read/write
- v4 read/write
Go to the docs for detailed usage, or have a look at the integration tests for examples on how to implement a wallet.
npm i @cashu/cashu-ts
import { CashuMint, CashuWallet, MintQuoteState } from '@cashu/cashu-ts';
const mintUrl = 'http://localhost:3338';
const mint = new CashuMint(mintUrl);
const wallet = new CashuWallet(mint);
await wallet.loadMint(); // persist wallet.keys and wallet.keysets to avoid calling loadMint() in the future
const mintQuote = await wallet.createMintQuote(64);
// pay the invoice here before you continue...
const mintQuoteChecked = await wallet.checkMintQuote(mintQuote.quote);
if (mintQuoteChecked.state == MintQuoteState.PAID) {
const proofs = await wallet.mintProofs(64, mintQuote.quote);
}
import { CashuMint, CashuWallet } from '@cashu/cashu-ts';
const mintUrl = 'http://localhost:3338'; // the mint URL
const mint = new CashuMint(mintUrl);
const wallet = new CashuWallet(mint); // load the keysets of the mint
const invoice = 'lnbc......'; // Lightning invoice to pay
const meltQuote = await wallet.createMeltQuote(invoice);
const amountToSend = meltQuote.amount + meltQuote.fee_reserve;
// CashuWallet.send performs coin selection and swaps the proofs with the mint
// if no appropriate amount can be selected offline. We must include potential
// ecash fees that the mint might require to melt the resulting proofsToSend later.
const { keep: proofsToKeep, send: proofsToSend } = await wallet.send(amountToSend, proofs, {
includeFees: true
});
// store proofsToKeep in wallet ..
const meltResponse = await wallet.meltProofs(meltQuote, proofsToSend);
// store meltResponse.change in wallet ..
// we assume that `wallet` already minted `proofs`, as above
const { keep, send } = await wallet.send(32, proofs);
const token = getEncodedTokenV4({ mint: mintUrl, proofs: send });
console.log(token);
const wallet2 = new CashuWallet(mint); // receiving wallet
const receiveProofs = await wallet2.receive(token);
try {
const decodedToken = getDecodedToken(token);
console.log(decodedToken); // { mint: "https://mint.0xchat.com", unit: "sat", proofs: [...] }
} catch (_) {
console.log('Invalid token');
}
Contributions are very welcome.
If you want to contribute, please open an Issue or a PR.
If you open a PR, please do so from the development
branch as the base branch.
Features and fixes should be implemented by branching off development
. Hotfixes can be implemented by branching off a given tag
. A new release can be created if at least one new feature or fix has been added to the development
branch. If the release has breaking API changes, the major version must be incremented (X.0.0). If not, the release can increment the minor version (0.X.0). Patches and hotfixes increment the patch version (0.0.X). To create a new release, the following steps must be taken:
git checkout development && git pull
Checkout and pull latest changes fromdevelopment
npm version <major | minor | patch>
create new release commit & taggit push && git push --tags
push commit and tag- Create a new release on github, targeting the newly created tag
- The CI will build and deploy to npm, with provenance
git checkout main && git pull && git merge <tag>
After creating a new version, merge the tag intomain