Repository files navigation

Bankify

Turn any cashu mint into a lightning wallet with NWC support

What is bankify?

Bankify is a library that makes it easy to connect cashu mints to NWC in order to give users of your apps access to the lightning network. I created it in response to a frustration I've had: not enough custodial bitcoin "web wallets" support Nostr Wallet Connect aka NWC. The only ones I'm aware of (til I released this app) are getalby.com, cashu.me, and mutiny wallet if you configure it to use a federation first. But mutiny wallet is shutting down and alby wallet stopped opening new accounts for their custodial service, so only cashu.me will work in the near future -- and cashu.me is "send only," unfortunately, so it doesn't even support all of the features NWC offers. Bankify to the rescue!

How can I try it?

Just click here: https://supertestnet.github.io/bankify/

How does it work?

Cashu mints have a standardized api for "melting" and "minting" ecash tokens, and these api endpoints are effectively the same as "send" and "receive" buttons in other custodial wallets. The "melt" option lets you pay a mint with ecash and in return they will pay a lightning invoice of an equivalent amount for you, and the "mint" option lets you request a lightning invoice from the mint, such that upon being paid, the mint will give you an equivalent amount of ecash tokens. So I made a simple storage service that does those things automatically in the background, including managing ecash, and just gives you nice and easy Send and Receive buttons. This app also runs a Nostr Wallet Connect server in the background so that NWC clients can connect to it and give it commands using that standardized api. So essentially this app just translates between two custodial api standards.

Bankify for nodeJS

If you look at the file bankify_for_nodejs.js, you'll find a simplified version of bankify. (In some sense it's "de-simplified" because bankify_for_nodejs integrates the super_nostr dependency directly, so it's larger than the "regular" bankify.js.) If you include this .js file in a nodejs package, it should let you run bankify on a server rather than on a webpage. This may also be useful for devs who prefer to write their client apps in nodejs.

Bankify API

Whether you use bankify.js or bankify_for_nodejs.js, they both have the same, very simple api.

First, select a mint:

varmint="https://mint.coinos.io";//Find alternative mints at bitcoinmints.com//Note that currently bankify supports cashu mints but not fedimints//So don’t use ones that start with fed1, use ones that start with https

Second, craft permissions (optional):

varpermissions=["get_info","get_balance","make_invoice","pay_invoice","lookup_invoice","list_transactions",];//See full permissions list here: https://docs.nwc.dev/reference-api/overview//Note that Bankify only supports the 6 permissions listed above//Also note that Bankify *defaults* to the permissions above -- so if you don't create a custom permissions array, you'll get the above

Third, pick a relay (optional):

varrelay="wss://nostrue.com";//Find alternative relays at https://relays.xport.top///Note that Bankify *defaults* to the relay above -- so if you don't create a custom relay variable, you'll get the above

Fourth, create your connection string:

(async()=>{varnwc_string=awaitbankify.createNWCconnection(mint,permissions,relay);console.log(nwc_string);})();

Fifth, you can test the connection string using any nwc_client, such as:

https://supertestnet.github.io/nwc_tester/

Sixth, once you've verified that your NWC connection works as expected, you can interact with it using the NWC api. I have a library for making interactions with NWC easier:

https://github.com/supertestnet/nwcjs

WARNINGS

The bankify webapp includes a wallet that demonstrates the features of the API. This wallet is not safe and not intended to be used except for experiments and demos. A big reason why it is unsafe is because it stores your private keys and ecash notes unencrypted in localStorage. That means browser extensions and stuff like that can read the data there and steal your money. Moreover, if you clear your cookies very thoroughly, your money will disappear.

Beyond that, ecash always comes with the standard "custodial wallet" trust assumptions: if the mint wants to steal from you, it's very easy for them; if they get arrested, your money will probably be gone; if they get hacked, you're out of luck. I made the webapp for testing and demonstration purposes and I warn you: don't put any money in it unless you're happy to lose that money for the pursuit of science and the enrichment of someone-who-isn't-you.

Also: the webapp's NWC connection lives in the browser tab where you have Bankify open, so if you close that browser tab, it stops working. Therefore, I do not recommend using bankify.js for zaps on nostr. Your nostr client will probably try to give it commands while your browser tab is closed, and it just won't work. For that use case, consider using bankify_for_nodejs.js instead.

Also, the bankify software does not validate responses given by a mint. So a mint can track you by giving you an invalid proof and then waiting for you to spend it. I am grateful if someone modifies bankify so that it does validate data! Pull requests welcome.

About

Turn any cashu mint into a lightning wallet with NWC support

Resources

Stars

18 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Bankify

Turn any cashu mint into a lightning wallet with NWC support

What is bankify?

Bankify is a library that makes it easy to connect cashu mints to NWC in order to give users of your apps access to the lightning network. I created it in response to a frustration I've had: not enough custodial bitcoin "web wallets" support Nostr Wallet Connect aka NWC. The only ones I'm aware of (til I released this app) are getalby.com, cashu.me, and mutiny wallet if you configure it to use a federation first. But mutiny wallet is shutting down and alby wallet stopped opening new accounts for their custodial service, so only cashu.me will work in the near future -- and cashu.me is "send only," unfortunately, so it doesn't even support all of the features NWC offers. Bankify to the rescue!

How can I try it?

Just click here: https://supertestnet.github.io/bankify/

How does it work?

Cashu mints have a standardized api for "melting" and "minting" ecash tokens, and these api endpoints are effectively the same as "send" and "receive" buttons in other custodial wallets. The "melt" option lets you pay a mint with ecash and in return they will pay a lightning invoice of an equivalent amount for you, and the "mint" option lets you request a lightning invoice from the mint, such that upon being paid, the mint will give you an equivalent amount of ecash tokens. So I made a simple storage service that does those things automatically in the background, including managing ecash, and just gives you nice and easy Send and Receive buttons. This app also runs a Nostr Wallet Connect server in the background so that NWC clients can connect to it and give it commands using that standardized api. So essentially this app just translates between two custodial api standards.

Bankify for nodeJS

If you look at the file bankify_for_nodejs.js, you'll find a simplified version of bankify. (In some sense it's "de-simplified" because bankify_for_nodejs integrates the super_nostr dependency directly, so it's larger than the "regular" bankify.js.) If you include this .js file in a nodejs package, it should let you run bankify on a server rather than on a webpage. This may also be useful for devs who prefer to write their client apps in nodejs.

Bankify API

Whether you use bankify.js or bankify_for_nodejs.js, they both have the same, very simple api.

First, select a mint:

varmint="https://mint.coinos.io";//Find alternative mints at bitcoinmints.com//Note that currently bankify supports cashu mints but not fedimints//So don’t use ones that start with fed1, use ones that start with https

Second, craft permissions (optional):

varpermissions=["get_info","get_balance","make_invoice","pay_invoice","lookup_invoice","list_transactions",];//See full permissions list here: https://docs.nwc.dev/reference-api/overview//Note that Bankify only supports the 6 permissions listed above//Also note that Bankify *defaults* to the permissions above -- so if you don't create a custom permissions array, you'll get the above

Third, pick a relay (optional):

varrelay="wss://nostrue.com";//Find alternative relays at https://relays.xport.top///Note that Bankify *defaults* to the relay above -- so if you don't create a custom relay variable, you'll get the above

Fourth, create your connection string:

(async()=>{varnwc_string=awaitbankify.createNWCconnection(mint,permissions,relay);console.log(nwc_string);})();

Fifth, you can test the connection string using any nwc_client, such as:

https://supertestnet.github.io/nwc_tester/

Sixth, once you've verified that your NWC connection works as expected, you can interact with it using the NWC api. I have a library for making interactions with NWC easier:

https://github.com/supertestnet/nwcjs

WARNINGS

The bankify webapp includes a wallet that demonstrates the features of the API. This wallet is not safe and not intended to be used except for experiments and demos. A big reason why it is unsafe is because it stores your private keys and ecash notes unencrypted in localStorage. That means browser extensions and stuff like that can read the data there and steal your money. Moreover, if you clear your cookies very thoroughly, your money will disappear.

Beyond that, ecash always comes with the standard "custodial wallet" trust assumptions: if the mint wants to steal from you, it's very easy for them; if they get arrested, your money will probably be gone; if they get hacked, you're out of luck. I made the webapp for testing and demonstration purposes and I warn you: don't put any money in it unless you're happy to lose that money for the pursuit of science and the enrichment of someone-who-isn't-you.

Also: the webapp's NWC connection lives in the browser tab where you have Bankify open, so if you close that browser tab, it stops working. Therefore, I do not recommend using bankify.js for zaps on nostr. Your nostr client will probably try to give it commands while your browser tab is closed, and it just won't work. For that use case, consider using bankify_for_nodejs.js instead.

Also, the bankify software does not validate responses given by a mint. So a mint can track you by giving you an invalid proof and then waiting for you to spend it. I am grateful if someone modifies bankify so that it does validate data! Pull requests welcome.

About

Turn any cashu mint into a lightning wallet with NWC support

Resources

Stars

18 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bankify

Turn any cashu mint into a lightning wallet with NWC support

What is bankify?

Bankify is a library that makes it easy to connect cashu mints to NWC in order to give users of your apps access to the lightning network. I created it in response to a frustration I've had: not enough custodial bitcoin "web wallets" support Nostr Wallet Connect aka NWC. The only ones I'm aware of (til I released this app) are getalby.com, cashu.me, and mutiny wallet if you configure it to use a federation first. But mutiny wallet is shutting down and alby wallet stopped opening new accounts for their custodial service, so only cashu.me will work in the near future -- and cashu.me is "send only," unfortunately, so it doesn't even support all of the features NWC offers. Bankify to the rescue!

How can I try it?

Just click here: https://supertestnet.github.io/bankify/

How does it work?

Cashu mints have a standardized api for "melting" and "minting" ecash tokens, and these api endpoints are effectively the same as "send" and "receive" buttons in other custodial wallets. The "melt" option lets you pay a mint with ecash and in return they will pay a lightning invoice of an equivalent amount for you, and the "mint" option lets you request a lightning invoice from the mint, such that upon being paid, the mint will give you an equivalent amount of ecash tokens. So I made a simple storage service that does those things automatically in the background, including managing ecash, and just gives you nice and easy Send and Receive buttons. This app also runs a Nostr Wallet Connect server in the background so that NWC clients can connect to it and give it commands using that standardized api. So essentially this app just translates between two custodial api standards.

Bankify for nodeJS

If you look at the file bankify_for_nodejs.js, you'll find a simplified version of bankify. (In some sense it's "de-simplified" because bankify_for_nodejs integrates the super_nostr dependency directly, so it's larger than the "regular" bankify.js.) If you include this .js file in a nodejs package, it should let you run bankify on a server rather than on a webpage. This may also be useful for devs who prefer to write their client apps in nodejs.

Bankify API

Whether you use bankify.js or bankify_for_nodejs.js, they both have the same, very simple api.

First, select a mint:

varmint="https://mint.coinos.io";//Find alternative mints at bitcoinmints.com//Note that currently bankify supports cashu mints but not fedimints//So don’t use ones that start with fed1, use ones that start with https

Second, craft permissions (optional):

varpermissions=["get_info","get_balance","make_invoice","pay_invoice","lookup_invoice","list_transactions",];//See full permissions list here: https://docs.nwc.dev/reference-api/overview//Note that Bankify only supports the 6 permissions listed above//Also note that Bankify *defaults* to the permissions above -- so if you don't create a custom permissions array, you'll get the above

Third, pick a relay (optional):

varrelay="wss://nostrue.com";//Find alternative relays at https://relays.xport.top///Note that Bankify *defaults* to the relay above -- so if you don't create a custom relay variable, you'll get the above

Fourth, create your connection string:

(async()=>{varnwc_string=awaitbankify.createNWCconnection(mint,permissions,relay);console.log(nwc_string);})();

Fifth, you can test the connection string using any nwc_client, such as:

https://supertestnet.github.io/nwc_tester/

Sixth, once you've verified that your NWC connection works as expected, you can interact with it using the NWC api. I have a library for making interactions with NWC easier:

https://github.com/supertestnet/nwcjs

WARNINGS

The bankify webapp includes a wallet that demonstrates the features of the API. This wallet is not safe and not intended to be used except for experiments and demos. A big reason why it is unsafe is because it stores your private keys and ecash notes unencrypted in localStorage. That means browser extensions and stuff like that can read the data there and steal your money. Moreover, if you clear your cookies very thoroughly, your money will disappear.

Beyond that, ecash always comes with the standard "custodial wallet" trust assumptions: if the mint wants to steal from you, it's very easy for them; if they get arrested, your money will probably be gone; if they get hacked, you're out of luck. I made the webapp for testing and demonstration purposes and I warn you: don't put any money in it unless you're happy to lose that money for the pursuit of science and the enrichment of someone-who-isn't-you.

Also: the webapp's NWC connection lives in the browser tab where you have Bankify open, so if you close that browser tab, it stops working. Therefore, I do not recommend using bankify.js for zaps on nostr. Your nostr client will probably try to give it commands while your browser tab is closed, and it just won't work. For that use case, consider using bankify_for_nodejs.js instead.

Also, the bankify software does not validate responses given by a mint. So a mint can track you by giving you an invalid proof and then waiting for you to spend it. I am grateful if someone modifies bankify so that it does validate data! Pull requests welcome.

About

Turn any cashu mint into a lightning wallet with NWC support

Resources

Stars

18 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bankify

Turn any cashu mint into a lightning wallet with NWC support

What is bankify?

Bankify is a library that makes it easy to connect cashu mints to NWC in order to give users of your apps access to the lightning network. I created it in response to a frustration I've had: not enough custodial bitcoin "web wallets" support Nostr Wallet Connect aka NWC. The only ones I'm aware of (til I released this app) are getalby.com, cashu.me, and mutiny wallet if you configure it to use a federation first. But mutiny wallet is shutting down and alby wallet stopped opening new accounts for their custodial service, so only cashu.me will work in the near future -- and cashu.me is "send only," unfortunately, so it doesn't even support all of the features NWC offers. Bankify to the rescue!

How can I try it?

Just click here: https://supertestnet.github.io/bankify/

How does it work?

Cashu mints have a standardized api for "melting" and "minting" ecash tokens, and these api endpoints are effectively the same as "send" and "receive" buttons in other custodial wallets. The "melt" option lets you pay a mint with ecash and in return they will pay a lightning invoice of an equivalent amount for you, and the "mint" option lets you request a lightning invoice from the mint, such that upon being paid, the mint will give you an equivalent amount of ecash tokens. So I made a simple storage service that does those things automatically in the background, including managing ecash, and just gives you nice and easy Send and Receive buttons. This app also runs a Nostr Wallet Connect server in the background so that NWC clients can connect to it and give it commands using that standardized api. So essentially this app just translates between two custodial api standards.

Bankify for nodeJS

If you look at the file bankify_for_nodejs.js, you'll find a simplified version of bankify. (In some sense it's "de-simplified" because bankify_for_nodejs integrates the super_nostr dependency directly, so it's larger than the "regular" bankify.js.) If you include this .js file in a nodejs package, it should let you run bankify on a server rather than on a webpage. This may also be useful for devs who prefer to write their client apps in nodejs.

Bankify API

Whether you use bankify.js or bankify_for_nodejs.js, they both have the same, very simple api.

First, select a mint:

varmint="https://mint.coinos.io";//Find alternative mints at bitcoinmints.com//Note that currently bankify supports cashu mints but not fedimints//So don’t use ones that start with fed1, use ones that start with https

Second, craft permissions (optional):

varpermissions=["get_info","get_balance","make_invoice","pay_invoice","lookup_invoice","list_transactions",];//See full permissions list here: https://docs.nwc.dev/reference-api/overview//Note that Bankify only supports the 6 permissions listed above//Also note that Bankify *defaults* to the permissions above -- so if you don't create a custom permissions array, you'll get the above

Third, pick a relay (optional):

varrelay="wss://nostrue.com";//Find alternative relays at https://relays.xport.top///Note that Bankify *defaults* to the relay above -- so if you don't create a custom relay variable, you'll get the above

Fourth, create your connection string:

(async()=>{varnwc_string=awaitbankify.createNWCconnection(mint,permissions,relay);console.log(nwc_string);})();

Fifth, you can test the connection string using any nwc_client, such as:

https://supertestnet.github.io/nwc_tester/

Sixth, once you've verified that your NWC connection works as expected, you can interact with it using the NWC api. I have a library for making interactions with NWC easier:

https://github.com/supertestnet/nwcjs

WARNINGS

The bankify webapp includes a wallet that demonstrates the features of the API. This wallet is not safe and not intended to be used except for experiments and demos. A big reason why it is unsafe is because it stores your private keys and ecash notes unencrypted in localStorage. That means browser extensions and stuff like that can read the data there and steal your money. Moreover, if you clear your cookies very thoroughly, your money will disappear.

Beyond that, ecash always comes with the standard "custodial wallet" trust assumptions: if the mint wants to steal from you, it's very easy for them; if they get arrested, your money will probably be gone; if they get hacked, you're out of luck. I made the webapp for testing and demonstration purposes and I warn you: don't put any money in it unless you're happy to lose that money for the pursuit of science and the enrichment of someone-who-isn't-you.

Also: the webapp's NWC connection lives in the browser tab where you have Bankify open, so if you close that browser tab, it stops working. Therefore, I do not recommend using bankify.js for zaps on nostr. Your nostr client will probably try to give it commands while your browser tab is closed, and it just won't work. For that use case, consider using bankify_for_nodejs.js instead.

Also, the bankify software does not validate responses given by a mint. So a mint can track you by giving you an invalid proof and then waiting for you to spend it. I am grateful if someone modifies bankify so that it does validate data! Pull requests welcome.

About

Turn any cashu mint into a lightning wallet with NWC support

Resources

Stars

18 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Bankify

Turn any cashu mint into a lightning wallet with NWC support

What is bankify?

Bankify is a library that makes it easy to connect cashu mints to NWC in order to give users of your apps access to the lightning network. I created it in response to a frustration I've had: not enough custodial bitcoin "web wallets" support Nostr Wallet Connect aka NWC. The only ones I'm aware of (til I released this app) are getalby.com, cashu.me, and mutiny wallet if you configure it to use a federation first. But mutiny wallet is shutting down and alby wallet stopped opening new accounts for their custodial service, so only cashu.me will work in the near future -- and cashu.me is "send only," unfortunately, so it doesn't even support all of the features NWC offers. Bankify to the rescue!

How can I try it?

Just click here: https://supertestnet.github.io/bankify/

How does it work?

Cashu mints have a standardized api for "melting" and "minting" ecash tokens, and these api endpoints are effectively the same as "send" and "receive" buttons in other custodial wallets. The "melt" option lets you pay a mint with ecash and in return they will pay a lightning invoice of an equivalent amount for you, and the "mint" option lets you request a lightning invoice from the mint, such that upon being paid, the mint will give you an equivalent amount of ecash tokens. So I made a simple storage service that does those things automatically in the background, including managing ecash, and just gives you nice and easy Send and Receive buttons. This app also runs a Nostr Wallet Connect server in the background so that NWC clients can connect to it and give it commands using that standardized api. So essentially this app just translates between two custodial api standards.

Bankify for nodeJS

If you look at the file bankify_for_nodejs.js, you'll find a simplified version of bankify. (In some sense it's "de-simplified" because bankify_for_nodejs integrates the super_nostr dependency directly, so it's larger than the "regular" bankify.js.) If you include this .js file in a nodejs package, it should let you run bankify on a server rather than on a webpage. This may also be useful for devs who prefer to write their client apps in nodejs.

Bankify API

Whether you use bankify.js or bankify_for_nodejs.js, they both have the same, very simple api.

First, select a mint:

varmint="https://mint.coinos.io";//Find alternative mints at bitcoinmints.com//Note that currently bankify supports cashu mints but not fedimints//So don’t use ones that start with fed1, use ones that start with https

Second, craft permissions (optional):

varpermissions=["get_info","get_balance","make_invoice","pay_invoice","lookup_invoice","list_transactions",];//See full permissions list here: https://docs.nwc.dev/reference-api/overview//Note that Bankify only supports the 6 permissions listed above//Also note that Bankify *defaults* to the permissions above -- so if you don't create a custom permissions array, you'll get the above

Third, pick a relay (optional):

varrelay="wss://nostrue.com";//Find alternative relays at https://relays.xport.top///Note that Bankify *defaults* to the relay above -- so if you don't create a custom relay variable, you'll get the above

Fourth, create your connection string:

(async()=>{varnwc_string=awaitbankify.createNWCconnection(mint,permissions,relay);console.log(nwc_string);})();

Fifth, you can test the connection string using any nwc_client, such as:

https://supertestnet.github.io/nwc_tester/

Sixth, once you've verified that your NWC connection works as expected, you can interact with it using the NWC api. I have a library for making interactions with NWC easier:

https://github.com/supertestnet/nwcjs

WARNINGS

The bankify webapp includes a wallet that demonstrates the features of the API. This wallet is not safe and not intended to be used except for experiments and demos. A big reason why it is unsafe is because it stores your private keys and ecash notes unencrypted in localStorage. That means browser extensions and stuff like that can read the data there and steal your money. Moreover, if you clear your cookies very thoroughly, your money will disappear.

Beyond that, ecash always comes with the standard "custodial wallet" trust assumptions: if the mint wants to steal from you, it's very easy for them; if they get arrested, your money will probably be gone; if they get hacked, you're out of luck. I made the webapp for testing and demonstration purposes and I warn you: don't put any money in it unless you're happy to lose that money for the pursuit of science and the enrichment of someone-who-isn't-you.

Also: the webapp's NWC connection lives in the browser tab where you have Bankify open, so if you close that browser tab, it stops working. Therefore, I do not recommend using bankify.js for zaps on nostr. Your nostr client will probably try to give it commands while your browser tab is closed, and it just won't work. For that use case, consider using bankify_for_nodejs.js instead.

Also, the bankify software does not validate responses given by a mint. So a mint can track you by giving you an invalid proof and then waiting for you to spend it. I am grateful if someone modifies bankify so that it does validate data! Pull requests welcome.

About

Turn any cashu mint into a lightning wallet with NWC support

Resources

Stars

18 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bankify

Turn any cashu mint into a lightning wallet with NWC support

What is bankify?

Bankify is a library that makes it easy to connect cashu mints to NWC in order to give users of your apps access to the lightning network. I created it in response to a frustration I've had: not enough custodial bitcoin "web wallets" support Nostr Wallet Connect aka NWC. The only ones I'm aware of (til I released this app) are getalby.com, cashu.me, and mutiny wallet if you configure it to use a federation first. But mutiny wallet is shutting down and alby wallet stopped opening new accounts for their custodial service, so only cashu.me will work in the near future -- and cashu.me is "send only," unfortunately, so it doesn't even support all of the features NWC offers. Bankify to the rescue!

How can I try it?

Just click here: https://supertestnet.github.io/bankify/

How does it work?

Cashu mints have a standardized api for "melting" and "minting" ecash tokens, and these api endpoints are effectively the same as "send" and "receive" buttons in other custodial wallets. The "melt" option lets you pay a mint with ecash and in return they will pay a lightning invoice of an equivalent amount for you, and the "mint" option lets you request a lightning invoice from the mint, such that upon being paid, the mint will give you an equivalent amount of ecash tokens. So I made a simple storage service that does those things automatically in the background, including managing ecash, and just gives you nice and easy Send and Receive buttons. This app also runs a Nostr Wallet Connect server in the background so that NWC clients can connect to it and give it commands using that standardized api. So essentially this app just translates between two custodial api standards.

Bankify for nodeJS

If you look at the file bankify_for_nodejs.js, you'll find a simplified version of bankify. (In some sense it's "de-simplified" because bankify_for_nodejs integrates the super_nostr dependency directly, so it's larger than the "regular" bankify.js.) If you include this .js file in a nodejs package, it should let you run bankify on a server rather than on a webpage. This may also be useful for devs who prefer to write their client apps in nodejs.

Bankify API

Whether you use bankify.js or bankify_for_nodejs.js, they both have the same, very simple api.

First, select a mint:

varmint="https://mint.coinos.io";//Find alternative mints at bitcoinmints.com//Note that currently bankify supports cashu mints but not fedimints//So don’t use ones that start with fed1, use ones that start with https

Second, craft permissions (optional):

varpermissions=["get_info","get_balance","make_invoice","pay_invoice","lookup_invoice","list_transactions",];//See full permissions list here: https://docs.nwc.dev/reference-api/overview//Note that Bankify only supports the 6 permissions listed above//Also note that Bankify *defaults* to the permissions above -- so if you don't create a custom permissions array, you'll get the above

Third, pick a relay (optional):

varrelay="wss://nostrue.com";//Find alternative relays at https://relays.xport.top///Note that Bankify *defaults* to the relay above -- so if you don't create a custom relay variable, you'll get the above

Fourth, create your connection string:

(async()=>{varnwc_string=awaitbankify.createNWCconnection(mint,permissions,relay);console.log(nwc_string);})();

Fifth, you can test the connection string using any nwc_client, such as:

https://supertestnet.github.io/nwc_tester/

Sixth, once you've verified that your NWC connection works as expected, you can interact with it using the NWC api. I have a library for making interactions with NWC easier:

https://github.com/supertestnet/nwcjs

WARNINGS

The bankify webapp includes a wallet that demonstrates the features of the API. This wallet is not safe and not intended to be used except for experiments and demos. A big reason why it is unsafe is because it stores your private keys and ecash notes unencrypted in localStorage. That means browser extensions and stuff like that can read the data there and steal your money. Moreover, if you clear your cookies very thoroughly, your money will disappear.

Beyond that, ecash always comes with the standard "custodial wallet" trust assumptions: if the mint wants to steal from you, it's very easy for them; if they get arrested, your money will probably be gone; if they get hacked, you're out of luck. I made the webapp for testing and demonstration purposes and I warn you: don't put any money in it unless you're happy to lose that money for the pursuit of science and the enrichment of someone-who-isn't-you.

Also: the webapp's NWC connection lives in the browser tab where you have Bankify open, so if you close that browser tab, it stops working. Therefore, I do not recommend using bankify.js for zaps on nostr. Your nostr client will probably try to give it commands while your browser tab is closed, and it just won't work. For that use case, consider using bankify_for_nodejs.js instead.

Also, the bankify software does not validate responses given by a mint. So a mint can track you by giving you an invalid proof and then waiting for you to spend it. I am grateful if someone modifies bankify so that it does validate data! Pull requests welcome.

About

Turn any cashu mint into a lightning wallet with NWC support

Resources

Stars

18 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Bankify

Turn any cashu mint into a lightning wallet with NWC support

What is bankify?

Bankify is a library that makes it easy to connect cashu mints to NWC in order to give users of your apps access to the lightning network. I created it in response to a frustration I've had: not enough custodial bitcoin "web wallets" support Nostr Wallet Connect aka NWC. The only ones I'm aware of (til I released this app) are getalby.com, cashu.me, and mutiny wallet if you configure it to use a federation first. But mutiny wallet is shutting down and alby wallet stopped opening new accounts for their custodial service, so only cashu.me will work in the near future -- and cashu.me is "send only," unfortunately, so it doesn't even support all of the features NWC offers. Bankify to the rescue!

How can I try it?

Just click here: https://supertestnet.github.io/bankify/

How does it work?

Cashu mints have a standardized api for "melting" and "minting" ecash tokens, and these api endpoints are effectively the same as "send" and "receive" buttons in other custodial wallets. The "melt" option lets you pay a mint with ecash and in return they will pay a lightning invoice of an equivalent amount for you, and the "mint" option lets you request a lightning invoice from the mint, such that upon being paid, the mint will give you an equivalent amount of ecash tokens. So I made a simple storage service that does those things automatically in the background, including managing ecash, and just gives you nice and easy Send and Receive buttons. This app also runs a Nostr Wallet Connect server in the background so that NWC clients can connect to it and give it commands using that standardized api. So essentially this app just translates between two custodial api standards.

Bankify for nodeJS

If you look at the file bankify_for_nodejs.js, you'll find a simplified version of bankify. (In some sense it's "de-simplified" because bankify_for_nodejs integrates the super_nostr dependency directly, so it's larger than the "regular" bankify.js.) If you include this .js file in a nodejs package, it should let you run bankify on a server rather than on a webpage. This may also be useful for devs who prefer to write their client apps in nodejs.

Bankify API

Whether you use bankify.js or bankify_for_nodejs.js, they both have the same, very simple api.

First, select a mint:

varmint="https://mint.coinos.io";//Find alternative mints at bitcoinmints.com//Note that currently bankify supports cashu mints but not fedimints//So don’t use ones that start with fed1, use ones that start with https

Second, craft permissions (optional):

varpermissions=["get_info","get_balance","make_invoice","pay_invoice","lookup_invoice","list_transactions",];//See full permissions list here: https://docs.nwc.dev/reference-api/overview//Note that Bankify only supports the 6 permissions listed above//Also note that Bankify *defaults* to the permissions above -- so if you don't create a custom permissions array, you'll get the above

Third, pick a relay (optional):

varrelay="wss://nostrue.com";//Find alternative relays at https://relays.xport.top///Note that Bankify *defaults* to the relay above -- so if you don't create a custom relay variable, you'll get the above

Fourth, create your connection string:

(async()=>{varnwc_string=awaitbankify.createNWCconnection(mint,permissions,relay);console.log(nwc_string);})();

Fifth, you can test the connection string using any nwc_client, such as:

https://supertestnet.github.io/nwc_tester/

Sixth, once you've verified that your NWC connection works as expected, you can interact with it using the NWC api. I have a library for making interactions with NWC easier:

https://github.com/supertestnet/nwcjs

WARNINGS

The bankify webapp includes a wallet that demonstrates the features of the API. This wallet is not safe and not intended to be used except for experiments and demos. A big reason why it is unsafe is because it stores your private keys and ecash notes unencrypted in localStorage. That means browser extensions and stuff like that can read the data there and steal your money. Moreover, if you clear your cookies very thoroughly, your money will disappear.

Beyond that, ecash always comes with the standard "custodial wallet" trust assumptions: if the mint wants to steal from you, it's very easy for them; if they get arrested, your money will probably be gone; if they get hacked, you're out of luck. I made the webapp for testing and demonstration purposes and I warn you: don't put any money in it unless you're happy to lose that money for the pursuit of science and the enrichment of someone-who-isn't-you.

Also: the webapp's NWC connection lives in the browser tab where you have Bankify open, so if you close that browser tab, it stops working. Therefore, I do not recommend using bankify.js for zaps on nostr. Your nostr client will probably try to give it commands while your browser tab is closed, and it just won't work. For that use case, consider using bankify_for_nodejs.js instead.

Also, the bankify software does not validate responses given by a mint. So a mint can track you by giving you an invalid proof and then waiting for you to spend it. I am grateful if someone modifies bankify so that it does validate data! Pull requests welcome.

About

Turn any cashu mint into a lightning wallet with NWC support

Resources

Stars

18 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Bankify

Turn any cashu mint into a lightning wallet with NWC support

What is bankify?

Bankify is a library that makes it easy to connect cashu mints to NWC in order to give users of your apps access to the lightning network. I created it in response to a frustration I've had: not enough custodial bitcoin "web wallets" support Nostr Wallet Connect aka NWC. The only ones I'm aware of (til I released this app) are getalby.com, cashu.me, and mutiny wallet if you configure it to use a federation first. But mutiny wallet is shutting down and alby wallet stopped opening new accounts for their custodial service, so only cashu.me will work in the near future -- and cashu.me is "send only," unfortunately, so it doesn't even support all of the features NWC offers. Bankify to the rescue!

How can I try it?

Just click here: https://supertestnet.github.io/bankify/

How does it work?

Cashu mints have a standardized api for "melting" and "minting" ecash tokens, and these api endpoints are effectively the same as "send" and "receive" buttons in other custodial wallets. The "melt" option lets you pay a mint with ecash and in return they will pay a lightning invoice of an equivalent amount for you, and the "mint" option lets you request a lightning invoice from the mint, such that upon being paid, the mint will give you an equivalent amount of ecash tokens. So I made a simple storage service that does those things automatically in the background, including managing ecash, and just gives you nice and easy Send and Receive buttons. This app also runs a Nostr Wallet Connect server in the background so that NWC clients can connect to it and give it commands using that standardized api. So essentially this app just translates between two custodial api standards.

Bankify for nodeJS

If you look at the file bankify_for_nodejs.js, you'll find a simplified version of bankify. (In some sense it's "de-simplified" because bankify_for_nodejs integrates the super_nostr dependency directly, so it's larger than the "regular" bankify.js.) If you include this .js file in a nodejs package, it should let you run bankify on a server rather than on a webpage. This may also be useful for devs who prefer to write their client apps in nodejs.

Bankify API

Whether you use bankify.js or bankify_for_nodejs.js, they both have the same, very simple api.

First, select a mint:

varmint="https://mint.coinos.io";//Find alternative mints at bitcoinmints.com//Note that currently bankify supports cashu mints but not fedimints//So don’t use ones that start with fed1, use ones that start with https

Second, craft permissions (optional):

varpermissions=["get_info","get_balance","make_invoice","pay_invoice","lookup_invoice","list_transactions",];//See full permissions list here: https://docs.nwc.dev/reference-api/overview//Note that Bankify only supports the 6 permissions listed above//Also note that Bankify *defaults* to the permissions above -- so if you don't create a custom permissions array, you'll get the above

Third, pick a relay (optional):

varrelay="wss://nostrue.com";//Find alternative relays at https://relays.xport.top///Note that Bankify *defaults* to the relay above -- so if you don't create a custom relay variable, you'll get the above

Fourth, create your connection string:

(async()=>{varnwc_string=awaitbankify.createNWCconnection(mint,permissions,relay);console.log(nwc_string);})();

Fifth, you can test the connection string using any nwc_client, such as:

https://supertestnet.github.io/nwc_tester/

Sixth, once you've verified that your NWC connection works as expected, you can interact with it using the NWC api. I have a library for making interactions with NWC easier:

https://github.com/supertestnet/nwcjs

WARNINGS

The bankify webapp includes a wallet that demonstrates the features of the API. This wallet is not safe and not intended to be used except for experiments and demos. A big reason why it is unsafe is because it stores your private keys and ecash notes unencrypted in localStorage. That means browser extensions and stuff like that can read the data there and steal your money. Moreover, if you clear your cookies very thoroughly, your money will disappear.

Beyond that, ecash always comes with the standard "custodial wallet" trust assumptions: if the mint wants to steal from you, it's very easy for them; if they get arrested, your money will probably be gone; if they get hacked, you're out of luck. I made the webapp for testing and demonstration purposes and I warn you: don't put any money in it unless you're happy to lose that money for the pursuit of science and the enrichment of someone-who-isn't-you.

Also: the webapp's NWC connection lives in the browser tab where you have Bankify open, so if you close that browser tab, it stops working. Therefore, I do not recommend using bankify.js for zaps on nostr. Your nostr client will probably try to give it commands while your browser tab is closed, and it just won't work. For that use case, consider using bankify_for_nodejs.js instead.

Also, the bankify software does not validate responses given by a mint. So a mint can track you by giving you an invalid proof and then waiting for you to spend it. I am grateful if someone modifies bankify so that it does validate data! Pull requests welcome.

About

Turn any cashu mint into a lightning wallet with NWC support

Resources

Stars

18 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages