From 3abe565c157f5f4e187b9e0753f0db406593b69a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 19 Dec 2024 09:59:27 +0000 Subject: [PATCH] deploy: 27a6e6a3a9c68df8b78943a7de12fa4242669133 --- 404.html | 6 +++--- AdvancedForms/index.html | 4 ++-- Apps/index.html | 4 ++-- BTCPayServer/LocalDevSetup/index.html | 4 ++-- BTCPayServer/Security/index.html | 4 ++-- BTCPayServer/db-migration/index.html | 4 ++-- BTCPayServer/greenfield-authorization/index.html | 4 ++-- BTCPayServer/greenfield-development/index.html | 4 ++-- BTCPayVsOthers/index.html | 4 ++-- BigCommerce/index.html | 4 ++-- Breez/index.html | 4 ++-- Bringin/index.html | 4 ++-- ColdCardWallet/index.html | 4 ++-- Community/index.html | 4 ++-- Conference-PoS-guide/index.html | 4 ++-- Configurator/index.html | 4 ++-- Contribute/Design/index.html | 4 ++-- Contribute/Dev/index.html | 4 ++-- Contribute/DevCode/index.html | 4 ++-- Contribute/DevTest/index.html | 4 ++-- Contribute/Misc/index.html | 4 ++-- Contribute/Translate/index.html | 4 ++-- Contribute/Write/index.html | 4 ++-- Contribute/WriteBlog/index.html | 4 ++-- Contribute/WriteDocs/index.html | 4 ++-- Contribute/WriteSoftware/index.html | 4 ++-- Contribute/index.html | 4 ++-- CreateStore/index.html | 4 ++-- CreateWallet/index.html | 4 ++-- CustomIntegration/index.html | 4 ++-- Dashboard/index.html | 4 ++-- Deployment/Azure/index.html | 4 ++-- Deployment/AzurePennyPinching/index.html | 4 ++-- Deployment/Clovyr/index.html | 4 ++-- Deployment/DynamicDNS/index.html | 4 ++-- Deployment/GoogleCloud/index.html | 4 ++-- Deployment/Hack0/index.html | 4 ++-- Deployment/Hardware/index.html | 4 ++-- Deployment/HardwareAsAService/index.html | 4 ++-- Deployment/LightningInABox/index.html | 4 ++-- Deployment/LunaNode/index.html | 4 ++-- Deployment/ManualDeployment/index.html | 4 ++-- Deployment/ManualDeploymentExtended/index.html | 4 ++-- Deployment/RaspberryPi4/index.html | 4 ++-- Deployment/ReverseProxyToTor/index.html | 4 ++-- Deployment/ReverseSSHtunnel/index.html | 4 ++-- Deployment/ThirdPartyHosting/index.html | 4 ++-- Deployment/index.html | 4 ++-- Deployment/voltagecloud/index.html | 4 ++-- Deployment/webdeployment/index.html | 4 ++-- Development/Altcoins/index.html | 4 ++-- Development/GreenFieldExample-NodeJS/index.html | 4 ++-- Development/GreenFieldExample/index.html | 4 ++-- Development/GreenfieldExample-PHP/index.html | 4 ++-- Development/InvoiceMetadata/index.html | 4 ++-- Development/LocalDev/index.html | 4 ++-- Development/LocalDevelopment/index.html | 4 ++-- Development/Plugins/index.html | 4 ++-- Development/TestnetDemo/index.html | 4 ++-- Development/Theme/index.html | 4 ++-- Development/ecommerce-integration-guide/index.html | 4 ++-- Development/index.html | 4 ++-- Docker/backup-restore/index.html | 4 ++-- Docker/chatwoot/index.html | 4 ++-- Docker/cloudflare-tunnel/index.html | 4 ++-- Docker/fastsync/index.html | 4 ++-- Docker/fireflyiii/index.html | 4 ++-- Docker/index.html | 6 +++--- Docker/joinmarket/index.html | 4 ++-- Docker/lightning-terminal/index.html | 4 ++-- Docker/ndlc/index.html | 4 ++-- Docker/pihole/index.html | 4 ++-- Docker/tallycoin-connect/index.html | 4 ++-- Drupal/index.html | 4 ++-- DynamicReports/index.html | 4 ++-- ElectrumPersonalServer/index.html | 4 ++-- ElectrumWallet/index.html | 4 ++-- ElectrumX/index.html | 4 ++-- FAQ/Altcoin/index.html | 4 ++-- FAQ/Apps/index.html | 4 ++-- FAQ/Deployment/index.html | 4 ++-- FAQ/General/index.html | 4 ++-- FAQ/Integrations/index.html | 4 ++-- FAQ/LightningNetwork/index.html | 4 ++-- FAQ/ServerSettings/index.html | 4 ++-- FAQ/Stores/index.html | 4 ++-- FAQ/Synchronization/index.html | 4 ++-- FAQ/Wallet/index.html | 4 ++-- FAQ/index.html | 4 ++-- Forms/index.html | 4 ++-- Grandnode/index.html | 4 ++-- Guide/index.html | 8 +++----- HardwareWalletIntegration/index.html | 4 ++-- InvoiceNinja/index.html | 4 ++-- Invoices/index.html | 4 ++-- LNDhubAPI/index.html | 4 ++-- LedgerWallet/index.html | 4 ++-- LightningNetwork/index.html | 4 ++-- LightningNetwork_PaymentChannels/index.html | 4 ++-- Magento/index.html | 4 ++-- NBXplorer/API/index.html | 4 ++-- NBXplorer/Postgres-Migration/index.html | 4 ++-- NBXplorer/Postgres-Schema/index.html | 4 ++-- NBXplorer/index.html | 6 +++--- Nopcommerce/index.html | 4 ++-- Nostr/index.html | 4 ++-- Notifications/index.html | 4 ++-- Odoo/index.html | 4 ++-- OpenCart/index.html | 4 ++-- Payjoin/index.html | 4 ++-- PaymentRequests/index.html | 4 ++-- Payouts/index.html | 4 ++-- Payroll/index.html | 10 ++++------ PhocaCart/index.html | 4 ++-- PodServer/index.html | 4 ++-- PrestaShop/index.html | 4 ++-- PullPayments/index.html | 4 ++-- Refund/index.html | 4 ++-- RegisterAccount/index.html | 4 ++-- Reporting/index.html | 4 ++-- Shopify/index.html | 4 ++-- Shopware/index.html | 4 ++-- SideShift/index.html | 4 ++-- Sign-PSBT-with-sparrow-wallet/index.html | 4 ++-- Smartstore/index.html | 4 ++-- Support/index.html | 4 ++-- TicketTailor/index.html | 4 ++-- Translations/index.html | 4 ++-- Transmuter/DCA/index.html | 4 ++-- Transmuter/EmailReceiptsPreset/index.html | 4 ++-- Transmuter/index.html | 4 ++-- Trocador/index.html | 4 ++-- Troubleshooting/index.html | 4 ++-- TryItOut/index.html | 4 ++-- UseCase/index.html | 4 ++-- Vault/HowToVerify/index.html | 4 ++-- VirtueMart/index.html | 4 ++-- Wabisabi/index.html | 4 ++-- Walkthrough/index.html | 4 ++-- Wallet/index.html | 4 ++-- WalletSetup/index.html | 4 ++-- WasabiWallet/index.html | 4 ++-- WhatsNext/index.html | 4 ++-- Wix/index.html | 4 ++-- WooCommerce/index.html | 4 ++-- Xenforo/index.html | 4 ++-- Zapier/index.html | 4 ++-- assets/js/{101.c9b753cb.js => 101.91ca5031.js} | 2 +- assets/js/{102.95f1048f.js => 102.2830eb25.js} | 2 +- assets/js/{103.b2d2d3e3.js => 103.0a6dbe25.js} | 2 +- assets/js/{106.36628569.js => 106.2ffe956a.js} | 2 +- assets/js/{107.f70f2678.js => 107.3811d7a2.js} | 2 +- assets/js/{108.3a8fea9e.js => 108.b994c048.js} | 2 +- assets/js/{109.2c3571c9.js => 109.55958607.js} | 2 +- assets/js/{110.a04232c7.js => 110.ff0c48e3.js} | 2 +- assets/js/{112.c0e15e3e.js => 112.177150e7.js} | 2 +- assets/js/{12.2700c2c1.js => 12.029e31d9.js} | 2 +- assets/js/{121.cf62b7dd.js => 121.0b3c9f6d.js} | 2 +- assets/js/{122.6634e499.js => 122.a1c66bd7.js} | 2 +- assets/js/{123.77c37c03.js => 123.db840fc2.js} | 2 +- assets/js/{125.c1532fa3.js => 125.eb7e8652.js} | 2 +- assets/js/{126.44539e08.js => 126.0bf7064c.js} | 2 +- assets/js/{128.1db1bc76.js => 128.15fd508f.js} | 2 +- assets/js/{129.3e6b9d90.js => 129.656d8ded.js} | 2 +- assets/js/{130.9b8d0bda.js => 130.80a4ce82.js} | 2 +- assets/js/{131.9d54c0b2.js => 131.cb32887f.js} | 2 +- assets/js/{132.d008d5cb.js => 132.973f8d99.js} | 2 +- assets/js/{133.15c24758.js => 133.2f039671.js} | 2 +- assets/js/{134.2025ac8e.js => 134.077860d7.js} | 2 +- assets/js/{135.e26c9dbb.js => 135.6e9dd4bf.js} | 2 +- assets/js/{136.be9a6245.js => 136.179f2907.js} | 2 +- assets/js/{14.cfdc4e6b.js => 14.f0a7b12d.js} | 2 +- assets/js/{140.f4d196c2.js => 140.78ee4696.js} | 2 +- assets/js/{141.b8553449.js => 141.1a1ab3be.js} | 2 +- assets/js/{142.4db575f5.js => 142.192bf544.js} | 2 +- assets/js/{143.1e642c42.js => 143.ae977f45.js} | 2 +- assets/js/{144.84dce42a.js => 144.49d3e7d3.js} | 2 +- assets/js/{145.09d8e3b9.js => 145.4c1826fa.js} | 2 +- assets/js/{147.80b09c45.js => 147.d87e4bb1.js} | 2 +- assets/js/{151.95095468.js => 151.4db629a2.js} | 2 +- assets/js/{152.a29cef95.js => 152.e0b71af1.js} | 2 +- assets/js/153.067e2612.js | 1 + assets/js/153.4418bed1.js | 1 - assets/js/{154.8153ff79.js => 154.856c6a00.js} | 2 +- assets/js/{155.76bdfde2.js => 155.82d8cd18.js} | 2 +- assets/js/{156.5360e1f0.js => 156.a35a7351.js} | 2 +- assets/js/157.9452af5e.js | 1 + assets/js/157.cd5cf560.js | 1 - assets/js/{158.5a547443.js => 158.e52a4150.js} | 2 +- assets/js/{159.a6c444d9.js => 159.39a96ad8.js} | 2 +- assets/js/{16.a83ce535.js => 16.1cce81fb.js} | 2 +- assets/js/{161.7ede444c.js => 161.675f22a2.js} | 2 +- assets/js/{162.87d1962e.js => 162.33382585.js} | 2 +- assets/js/{163.a18f8c13.js => 163.fd44193d.js} | 2 +- assets/js/{164.86969602.js => 164.29b7de06.js} | 2 +- assets/js/{165.25950d0a.js => 165.522921b7.js} | 2 +- assets/js/{166.952eff9e.js => 166.f92af150.js} | 2 +- assets/js/{167.8325632a.js => 167.ada0f246.js} | 2 +- assets/js/{168.bc090dde.js => 168.fe7b823f.js} | 2 +- assets/js/{169.940b4060.js => 169.b46bec4c.js} | 2 +- assets/js/{17.aa77e5f2.js => 17.5b836fdd.js} | 2 +- assets/js/{170.14da59b4.js => 170.f8636740.js} | 2 +- assets/js/{171.712fd1e0.js => 171.e808340f.js} | 2 +- assets/js/{172.c8542fb2.js => 172.062cbc74.js} | 2 +- assets/js/{173.fabfe7bf.js => 173.c5fa937c.js} | 2 +- assets/js/{18.d51024cf.js => 18.dc3e9d95.js} | 2 +- assets/js/{20.dc4d9383.js => 20.84f9500b.js} | 2 +- assets/js/{22.c13a7bf1.js => 22.a1a495dd.js} | 2 +- assets/js/{23.fcea8aa8.js => 23.8751bac3.js} | 2 +- assets/js/{24.3eabf55c.js => 24.d26a9dd2.js} | 2 +- assets/js/{29.5a61b42a.js => 29.4f814518.js} | 2 +- assets/js/{31.6602158f.js => 31.e7391443.js} | 2 +- assets/js/{32.5c1bc3c9.js => 32.3355b5eb.js} | 2 +- assets/js/{35.ddb3535e.js => 35.a6e66fb8.js} | 2 +- assets/js/{41.6bb6d0af.js => 41.2f27517d.js} | 2 +- assets/js/{42.e55dc09c.js => 42.9ea78455.js} | 2 +- assets/js/{48.a7c396c2.js => 48.8bf7be7a.js} | 2 +- assets/js/{49.b4d574ce.js => 49.6f8f6c8a.js} | 2 +- assets/js/{50.96e8683a.js => 50.05a5fdf4.js} | 2 +- assets/js/{52.da3bfa3f.js => 52.4615899c.js} | 2 +- assets/js/{53.7465bd8d.js => 53.ae28d12a.js} | 2 +- assets/js/{59.c922a6e3.js => 59.871cb143.js} | 2 +- assets/js/{61.83afe78a.js => 61.4768525b.js} | 2 +- assets/js/{62.60907b1a.js => 62.a16b9f24.js} | 2 +- assets/js/{66.7c69963b.js => 66.352643ec.js} | 2 +- assets/js/{67.78656f08.js => 67.7572d8d1.js} | 2 +- assets/js/{68.747dbff3.js => 68.f7d2aae5.js} | 2 +- assets/js/{69.c57daaf1.js => 69.82dc139e.js} | 2 +- assets/js/{70.cbc81b59.js => 70.d6ab05ec.js} | 2 +- assets/js/{71.bf08e2f8.js => 71.e199fa5e.js} | 2 +- assets/js/{72.f8ac4708.js => 72.e2a5c1d4.js} | 2 +- assets/js/{73.f971e08e.js => 73.1210fc2b.js} | 2 +- assets/js/{75.89e3020f.js => 75.0456fd85.js} | 2 +- assets/js/{76.2fb25567.js => 76.50847d02.js} | 2 +- assets/js/{79.ad9bc617.js => 79.d1b8b2da.js} | 2 +- assets/js/{80.09b42ef2.js => 80.1c986895.js} | 2 +- assets/js/{84.88cedb38.js => 84.09891e28.js} | 2 +- assets/js/{85.62148a14.js => 85.3dd2e30e.js} | 2 +- assets/js/{87.b75e9822.js => 87.2633d791.js} | 2 +- assets/js/{88.25ff612b.js => 88.d65ea862.js} | 2 +- assets/js/{91.62310f4b.js => 91.b8cc05dc.js} | 2 +- assets/js/{92.1627dffa.js => 92.2d1f820a.js} | 2 +- assets/js/{94.15ec39a3.js => 94.9963b739.js} | 2 +- assets/js/{95.45ab5873.js => 95.e0d6fe47.js} | 2 +- assets/js/{app.f6e25125.js => app.cf41e488.js} | 4 ++-- index.html | 8 +++----- sitemap.xml | 2 +- 247 files changed, 401 insertions(+), 407 deletions(-) rename assets/js/{101.c9b753cb.js => 101.91ca5031.js} (99%) rename assets/js/{102.95f1048f.js => 102.2830eb25.js} (98%) rename assets/js/{103.b2d2d3e3.js => 103.0a6dbe25.js} (97%) rename assets/js/{106.36628569.js => 106.2ffe956a.js} (96%) rename assets/js/{107.f70f2678.js => 107.3811d7a2.js} (98%) rename assets/js/{108.3a8fea9e.js => 108.b994c048.js} (98%) rename assets/js/{109.2c3571c9.js => 109.55958607.js} (96%) rename assets/js/{110.a04232c7.js => 110.ff0c48e3.js} (99%) rename assets/js/{112.c0e15e3e.js => 112.177150e7.js} (99%) rename assets/js/{12.2700c2c1.js => 12.029e31d9.js} (83%) rename assets/js/{121.cf62b7dd.js => 121.0b3c9f6d.js} (99%) rename assets/js/{122.6634e499.js => 122.a1c66bd7.js} (99%) rename assets/js/{123.77c37c03.js => 123.db840fc2.js} (98%) rename assets/js/{125.c1532fa3.js => 125.eb7e8652.js} (99%) rename assets/js/{126.44539e08.js => 126.0bf7064c.js} (99%) rename assets/js/{128.1db1bc76.js => 128.15fd508f.js} (99%) rename assets/js/{129.3e6b9d90.js => 129.656d8ded.js} (99%) rename assets/js/{130.9b8d0bda.js => 130.80a4ce82.js} (99%) rename assets/js/{131.9d54c0b2.js => 131.cb32887f.js} (98%) rename assets/js/{132.d008d5cb.js => 132.973f8d99.js} (99%) rename assets/js/{133.15c24758.js => 133.2f039671.js} (99%) rename assets/js/{134.2025ac8e.js => 134.077860d7.js} (98%) rename assets/js/{135.e26c9dbb.js => 135.6e9dd4bf.js} (97%) rename assets/js/{136.be9a6245.js => 136.179f2907.js} (99%) rename assets/js/{14.cfdc4e6b.js => 14.f0a7b12d.js} (88%) rename assets/js/{140.f4d196c2.js => 140.78ee4696.js} (98%) rename assets/js/{141.b8553449.js => 141.1a1ab3be.js} (99%) rename assets/js/{142.4db575f5.js => 142.192bf544.js} (96%) rename assets/js/{143.1e642c42.js => 143.ae977f45.js} (99%) rename assets/js/{144.84dce42a.js => 144.49d3e7d3.js} (99%) rename assets/js/{145.09d8e3b9.js => 145.4c1826fa.js} (99%) rename assets/js/{147.80b09c45.js => 147.d87e4bb1.js} (99%) rename assets/js/{151.95095468.js => 151.4db629a2.js} (99%) rename assets/js/{152.a29cef95.js => 152.e0b71af1.js} (98%) create mode 100644 assets/js/153.067e2612.js delete mode 100644 assets/js/153.4418bed1.js rename assets/js/{154.8153ff79.js => 154.856c6a00.js} (99%) rename assets/js/{155.76bdfde2.js => 155.82d8cd18.js} (97%) rename assets/js/{156.5360e1f0.js => 156.a35a7351.js} (99%) create mode 100644 assets/js/157.9452af5e.js delete mode 100644 assets/js/157.cd5cf560.js rename assets/js/{158.5a547443.js => 158.e52a4150.js} (96%) rename assets/js/{159.a6c444d9.js => 159.39a96ad8.js} (90%) rename assets/js/{16.a83ce535.js => 16.1cce81fb.js} (93%) rename assets/js/{161.7ede444c.js => 161.675f22a2.js} (95%) rename assets/js/{162.87d1962e.js => 162.33382585.js} (98%) rename assets/js/{163.a18f8c13.js => 163.fd44193d.js} (98%) rename assets/js/{164.86969602.js => 164.29b7de06.js} (97%) rename assets/js/{165.25950d0a.js => 165.522921b7.js} (98%) rename assets/js/{166.952eff9e.js => 166.f92af150.js} (99%) rename assets/js/{167.8325632a.js => 167.ada0f246.js} (97%) rename assets/js/{168.bc090dde.js => 168.fe7b823f.js} (99%) rename assets/js/{169.940b4060.js => 169.b46bec4c.js} (98%) rename assets/js/{17.aa77e5f2.js => 17.5b836fdd.js} (82%) rename assets/js/{170.14da59b4.js => 170.f8636740.js} (99%) rename assets/js/{171.712fd1e0.js => 171.e808340f.js} (95%) rename assets/js/{172.c8542fb2.js => 172.062cbc74.js} (98%) rename assets/js/{173.fabfe7bf.js => 173.c5fa937c.js} (99%) rename assets/js/{18.d51024cf.js => 18.dc3e9d95.js} (99%) rename assets/js/{20.dc4d9383.js => 20.84f9500b.js} (99%) rename assets/js/{22.c13a7bf1.js => 22.a1a495dd.js} (81%) rename assets/js/{23.fcea8aa8.js => 23.8751bac3.js} (86%) rename assets/js/{24.3eabf55c.js => 24.d26a9dd2.js} (88%) rename assets/js/{29.5a61b42a.js => 29.4f814518.js} (75%) rename assets/js/{31.6602158f.js => 31.e7391443.js} (93%) rename assets/js/{32.5c1bc3c9.js => 32.3355b5eb.js} (98%) rename assets/js/{35.ddb3535e.js => 35.a6e66fb8.js} (89%) rename assets/js/{41.6bb6d0af.js => 41.2f27517d.js} (99%) rename assets/js/{42.e55dc09c.js => 42.9ea78455.js} (84%) rename assets/js/{48.a7c396c2.js => 48.8bf7be7a.js} (92%) rename assets/js/{49.b4d574ce.js => 49.6f8f6c8a.js} (93%) rename assets/js/{50.96e8683a.js => 50.05a5fdf4.js} (97%) rename assets/js/{52.da3bfa3f.js => 52.4615899c.js} (99%) rename assets/js/{53.7465bd8d.js => 53.ae28d12a.js} (98%) rename assets/js/{59.c922a6e3.js => 59.871cb143.js} (96%) rename assets/js/{61.83afe78a.js => 61.4768525b.js} (99%) rename assets/js/{62.60907b1a.js => 62.a16b9f24.js} (98%) rename assets/js/{66.7c69963b.js => 66.352643ec.js} (99%) rename assets/js/{67.78656f08.js => 67.7572d8d1.js} (99%) rename assets/js/{68.747dbff3.js => 68.f7d2aae5.js} (99%) rename assets/js/{69.c57daaf1.js => 69.82dc139e.js} (99%) rename assets/js/{70.cbc81b59.js => 70.d6ab05ec.js} (99%) rename assets/js/{71.bf08e2f8.js => 71.e199fa5e.js} (99%) rename assets/js/{72.f8ac4708.js => 72.e2a5c1d4.js} (96%) rename assets/js/{73.f971e08e.js => 73.1210fc2b.js} (97%) rename assets/js/{75.89e3020f.js => 75.0456fd85.js} (99%) rename assets/js/{76.2fb25567.js => 76.50847d02.js} (97%) rename assets/js/{79.ad9bc617.js => 79.d1b8b2da.js} (99%) rename assets/js/{80.09b42ef2.js => 80.1c986895.js} (94%) rename assets/js/{84.88cedb38.js => 84.09891e28.js} (98%) rename assets/js/{85.62148a14.js => 85.3dd2e30e.js} (95%) rename assets/js/{87.b75e9822.js => 87.2633d791.js} (91%) rename assets/js/{88.25ff612b.js => 88.d65ea862.js} (97%) rename assets/js/{91.62310f4b.js => 91.b8cc05dc.js} (99%) rename assets/js/{92.1627dffa.js => 92.2d1f820a.js} (98%) rename assets/js/{94.15ec39a3.js => 94.9963b739.js} (99%) rename assets/js/{95.45ab5873.js => 95.e0d6fe47.js} (98%) rename assets/js/{app.f6e25125.js => app.cf41e488.js} (70%) diff --git a/404.html b/404.html index 03e56be009..bf87af891f 100644 --- a/404.html +++ b/404.html @@ -9,13 +9,13 @@ - + -

404

That's a Four-Oh-Four.
+ - + diff --git a/AdvancedForms/index.html b/AdvancedForms/index.html index c67fdd1b26..86b04d04c3 100644 --- a/AdvancedForms/index.html +++ b/AdvancedForms/index.html @@ -9,7 +9,7 @@ - + @@ -173,6 +173,6 @@ →

- + diff --git a/Apps/index.html b/Apps/index.html index 96394c0b79..a86d60e669 100644 --- a/Apps/index.html +++ b/Apps/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# BTCPay Server Apps

The primary purpose of BTCPay Server is to remove dependencies on trusted third-parties. The Apps are built in applications that obsolete central-authorities and allow users an easy way to extend the use case of the software. Users can self-host all sorts of customizable applications that work out of the box.

To create an app, go to Apps > Create a new app. Apps are store-dependent, which means that each app needs to be connected to a store.

# Point of Sale App

The web-based PoS app allows users with brick and mortar stores to readily accept cryptocurrencies without fees or a third-party, directly to their wallet. The PoS can be displayed easily on tablets or any other devices which support web browsing. Users can easily create a homescreen shortcut for a quick access to the web-app.

BTCPay Pos

Adding new products is easy. The app has a shopping cart feature, tips, product inventory, custom payment options and more.

The Point of sale app can also be used to receive donations, tips or even as a small e-commerce shop, depending on the options or customizations applied.

Curently, the Point of Sale app supports three different views:

  • A Static view representing only the items for sale.
  • A Cart view including items for sale and a cart for checkout.
  • A Light view consisting only of a keypad for easy and quick payments (Starting from v1.0.5.6 (opens new window)).

To get your first Point of Sale app running, follow theses few simple steps:

  1. Go to Apps and Create a new app
  2. Add a name for your app
  3. Choose app type > Point Of Sale
  4. Select the store to associate with the app.
  5. Customize your PoS by choosing a view (Static, Cart, Light), adding your own items with prices, photos, and a description.
  6. Click Save Settings.
  7. Click View App to view your PoS (Your customers can access the PoS through that link).

You can change the appearance of your Point of Sale app by following the theme customization guide.

# Crowdfunding App

Crowdfunding is an application which you can launch from BTCPay Server interface that allows you to create a self-hosted funding campaign, similar to Kickstarter or Indiegogo. Unlike traditional crowdfunding platforms, the creator of the campaign is the owner of the platform. Funds go directly to the creator’s wallet without any fees.

  1. Go to > Apps
  2. Add a name of your app
  3. Choose app type > Crowdfund
  4. Select the store to associate with the app.
  5. Customize your Crowdfund by adding your own perks with prices, photos, and description.
  6. Check the box > Allow crowdfund to be publicly visible
  7. Click "Save Settings".
  8. Click "View App" to view your Crowdfund (Contributors can access the crowdfund through that link).

If you would like to provide digital or physical products to the backers of your crowdfunding campaign, you can integrate WooCommerce store into it. You can also set limits on contribution perks using the inventory feature.

# Payment Button

Easily-embeddable HTML and highly-customizable payment buttons allow users to receive tips and donations. Online stores can also integrate payment buttons. When a site visitor clicks on the button, BTCPay displays the invoice.

  1. In your left menu bar, under the "PLUGINS" section, select "Pay Button".
  2. Allow anyone to create invoices.
  3. Customize your button.
  4. Copy the generated form and embed it on your website.
- + diff --git a/BTCPayServer/LocalDevSetup/index.html b/BTCPayServer/LocalDevSetup/index.html index 27208a1ef1..71176d84b0 100644 --- a/BTCPayServer/LocalDevSetup/index.html +++ b/BTCPayServer/LocalDevSetup/index.html @@ -9,7 +9,7 @@ - + @@ -72,6 +72,6 @@ type=lnd-rest;server=https://127.0.0.1:8084/;macaroonfilepath="local path to admin.macaroon on your computer, without these quotes";allowinsecure=true

Now you can create a lightning invoice on BTCPay Server regtest and make a payment through Polar.

PLEASE NOTE: You may get an exception break in Visual Studio. You must quickly click "Continue" in VS so the invoice is generated. Or, uncheck the box that says, "Break when this exception type is thrown".

# FAQ

# docker-compose up dev failed or tests are not passing, what should I do?

  1. Run docker-compose down --volumes (this will reset your test environment)
  2. Run docker-compose pull (this will ensure you have the latest images)
  3. Run again with docker-compose up dev

# How to run the Altcoin environment?

docker-compose -f docker-compose.altcoins.yml up dev

If you still have issues, try to restart docker.

# How to run the Selenium test with a browser?

Run dotnet user-secrets set RunSeleniumInBrowser true to run tests in browser.

To switch back to headless mode (recommended) you can run dotnet user-secrets remove RunSeleniumInBrowser.

# Session not created: This version of ChromeDriver only supports Chrome version 88

When you run tests for selenium, you may end up with this error. This happen when we update the selenium packages on BTCPay Server while you did not update your chrome version.

If you want to use a older chrome driver on this page (opens new window) then point to it with

dotnet user-secrets set ChromeDriverDirectory "path/to/the/driver/directory"

- + diff --git a/BTCPayServer/Security/index.html b/BTCPayServer/Security/index.html index b76bbe9ed6..cbc5071f48 100644 --- a/BTCPayServer/Security/index.html +++ b/BTCPayServer/Security/index.html @@ -9,7 +9,7 @@ - + @@ -89,6 +89,6 @@ →

- + diff --git a/BTCPayServer/db-migration/index.html b/BTCPayServer/db-migration/index.html index 7288855f5b..92287b01db 100644 --- a/BTCPayServer/db-migration/index.html +++ b/BTCPayServer/db-migration/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Migration from SQLite and MySQL to Postgres

# Introduction

This document is intended for BTCPay Server integrators such as Raspiblitz, Umbrel, Embassy OS or anybody running BTCPay Server on SQLite or MySql.

If you are a user of an integrated solution, please contact the integrator directly and provide them with the link to this document.

BTCPay Server has for long time supported three different backends:

  1. Postgres
  2. SQLite
  3. MySql

While most of our users are using the Postgres backend, maintaining supports for all those databases has been very challenging, and Postgres is the only one part of our test suite.

As a result, we regret to inform you that we decided to stop the support of MySql and SQLite.

We understand that dropping support might be painful for users and integrators of our product, and we will do our best to provide a migration path.

Please keep us informed if you experience any issues while migrating on our community chat (opens new window).

# Procedure

In order to successfully migrate, you will need to run BTCPay Server 1.7.8 or newer.

As a reminder there are three settings controlling the choice of backend of BTCPay Server which can be controller by command line, environment variable or configuration settings.

Command line argument Environment variable
--postgres BTCPAY_POSTGRES="..."
--mysql BTCPAY_MYSQL="..."
--sqlitefile BTCPAY_SQLITEFILE="blah.db"

If you are currently using mysql or sqlitefile, and you wish to migrate to postgres, you simply need to add the command line argument --postgres or the environment variable BTCPAY_POSTGRES pointing to a fresh postgres database.

It is strongly advised not to create a database in Postgres before performing the migration with BTCPay Server. This is because BTCPay Server will automatically create the necessary database for you. However, if you must create the database manually, please ensure that the C_TYPE and COLLATE settings are both set to C.

Careful: Do not remove the former mysql or sqlitefile setting, you should have both: the postgres setting and the former sqlite/mysql setting

From 1.7.8, BTCPay Server will interprete this and attempt to copy the data from mysql and sqlite into the new postgres database.

Note that once the migration is complete, the old mysql and sqlite settings will simply be ignored.

If the migration fails, you can revert the postgres setting you added, so the next restart will run on the old unsupported database. You can retry a migration by adding the postgres setting again.

# Known issues

  • The migration script isn't very optimized, and will attempt to load every table in memory. If your sqlite or mysql database is too big, you may experience an Out Of Memory issue. If that happen to you, please contact us.
  • There are no migration for plugin's data.
- + diff --git a/BTCPayServer/greenfield-authorization/index.html b/BTCPayServer/greenfield-authorization/index.html index 28b21cdb26..15c5a1bb5b 100644 --- a/BTCPayServer/greenfield-authorization/index.html +++ b/BTCPayServer/greenfield-authorization/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

- + diff --git a/BTCPayServer/greenfield-development/index.html b/BTCPayServer/greenfield-development/index.html index 9b262f8103..479942c5ea 100644 --- a/BTCPayServer/greenfield-development/index.html +++ b/BTCPayServer/greenfield-development/index.html @@ -9,7 +9,7 @@ - + @@ -78,6 +78,6 @@ →

- + diff --git a/BTCPayVsOthers/index.html b/BTCPayVsOthers/index.html index 2435443a9a..6b29b02ea2 100644 --- a/BTCPayVsOthers/index.html +++ b/BTCPayVsOthers/index.html @@ -9,7 +9,7 @@ - + @@ -69,6 +69,6 @@ →

- + diff --git a/BigCommerce/index.html b/BigCommerce/index.html index 091dd110f2..6ccf7d7c1e 100644 --- a/BigCommerce/index.html +++ b/BigCommerce/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@ →

- + diff --git a/Breez/index.html b/Breez/index.html index cc23ceb202..3b8ade6746 100644 --- a/Breez/index.html +++ b/Breez/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

- + diff --git a/Bringin/index.html b/Bringin/index.html index 7c678c5987..8a602d5989 100644 --- a/Bringin/index.html +++ b/Bringin/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

- + diff --git a/ColdCardWallet/index.html b/ColdCardWallet/index.html index 5b3fd526ea..37808f5b6d 100644 --- a/ColdCardWallet/index.html +++ b/ColdCardWallet/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Connecting Coldcard Wallet to BTCPay Server

This document shows how to use a Coldcard Wallet with your BTCPay Server.

# Coldcard Wallet Setup

This guide assumes, you have a Coldcard wallet set up. To configure the Coldcard, please see the quick setup guide on manufacturer's website (opens new window).

# Quick Setup

  1. Insert the MicroSD card into the Coldcard wallet.
  2. Go to Advanced > MicroSD Card > Electrum Wallet > Native-Segwit
  3. Insert the MicroSD card back into your PC
  4. In BTCPay Server, Stores > Settings > Setup > Connect an existing wallet > Import wallet file
  5. Choose File > select the wallet file earlier exported from Coldcard.
  6. Click Continue
  7. Confirm the addresses match the ones shown in your BTCPay Server.

The Coldcard is now connected to your BTCPay Server. Payments go directly to Coldcard. The video below shows how to connect your BTCPay store to your Coldcard.

# Spending from BTCPay Server wallet with Coldcard (PSBT)

Once there are some funds in received to your BTCPay Wallet connected to Coldcard, you can spend them by using PSBT (opens new window) (Partially Signed Bitcoin Transactions). This allows completely offline signing of your transactions, without ever having to connect your hardware wallet to the internet.

  1. Wallets > Manage > Send
  2. Fill in destination address and the amount
  3. Click on the Sign with a wallet supporting PSBT button.
  4. You will be redirected to PSBT tab, with pre-filled information, click on the Sign with a wallet supporting PSBT (save as file)
  5. Save the file onto MicroSD card
  6. Insert MicroSD into your Coldcard.
  7. In Coldcard, click on the Ready To Sign
  8. Review the transaction information, and click OK button to sign it.
  9. Transaction will be saved onto MicroSD.
  10. In BTCPay, go to PSBT tab of the wallet and upload the signed PSBT file.
  11. Click Decode
  12. Click Other Actions and select Review
  13. Review your transactions and click Broadcast to broadcast it on the network.

The video below shows how to connect your BTCPay store to your Coldcard.

- + diff --git a/Community/index.html b/Community/index.html index 05eb5e7156..0cd3410088 100644 --- a/Community/index.html +++ b/Community/index.html @@ -9,7 +9,7 @@ - + @@ -62,6 +62,6 @@

- + diff --git a/Conference-PoS-guide/index.html b/Conference-PoS-guide/index.html index 3278cd9f9d..e8464956a0 100644 --- a/Conference-PoS-guide/index.html +++ b/Conference-PoS-guide/index.html @@ -9,7 +9,7 @@ - + @@ -69,6 +69,6 @@ →

- + diff --git a/Configurator/index.html b/Configurator/index.html index 8c8bc108ba..247a096df5 100644 --- a/Configurator/index.html +++ b/Configurator/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/Contribute/Design/index.html b/Contribute/Design/index.html index 7df825df72..5c7f7137b5 100644 --- a/Contribute/Design/index.html +++ b/Contribute/Design/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

- + diff --git a/Contribute/Dev/index.html b/Contribute/Dev/index.html index aed5823884..76e44b6eb7 100644 --- a/Contribute/Dev/index.html +++ b/Contribute/Dev/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Coding BTCPay Server

# Why coding matters

By helping the project grow, become more mature, advanced and elaborate, coders working on BTCPay Server are a central component of the project.

If you have coding skills, be it writing or reviewing code, you can contribute to BTCPay Server.

# Where to start

If you're a developer looking to help, but you're not sure where to begin, check the good first issue label (opens new window), which contains small pieces of work that have been specifically flagged as being friendly to new contributors.

Contributors looking to do something a bit more challenging, before opening a pull request, please create an issue (opens new window) or join our community chat (opens new window) to get early feedback, discuss best ways to tackle the problem and to ensure there is no work duplication.

We are actively looking for developers who can take on and resolve GitHub issues and help with development. If you would like to help us, but need some guidance, the #dev channel on Mattermost (opens new window) is the place to ask questions.

# Setup Developer Environment

If you are interested in getting started as a developer or tester of the software behind BTCPay Server, check out the Setup Developer Environment guide that will walk you step by step through every software used in development with BTCPay such as Git, GitBash, Github, Docker, Visual Studio, Postgres, etc. If you have never coded before and you are looking to learn something new, start here.

# Local BTCPay Development

If you already have a developer environment setup you can start with the BTCPay specific Local Development documentation.

# Local BTCPay Testing

Once you have your development environment tools setup and your local BTCPay Server running, view the Local Testing guide. This shows you how to use BTCPay in regtest mode for use in development and for users who want to test new features before they are released.

# Requirements

Software requirements (ie. IDE) can also be found in local development.

# Videos

BTCPay Server development videos can be found here or on the BTCPayServer YouTube (opens new window) channel.

- + diff --git a/Contribute/DevCode/index.html b/Contribute/DevCode/index.html index b57fa463ea..07df6209f6 100644 --- a/Contribute/DevCode/index.html +++ b/Contribute/DevCode/index.html @@ -9,7 +9,7 @@ - + @@ -99,6 +99,6 @@ →

- + diff --git a/Contribute/DevTest/index.html b/Contribute/DevTest/index.html index d923fc1240..6920576238 100644 --- a/Contribute/DevTest/index.html +++ b/Contribute/DevTest/index.html @@ -9,7 +9,7 @@ - + @@ -84,6 +84,6 @@ →

- + diff --git a/Contribute/Misc/index.html b/Contribute/Misc/index.html index 173c64a1a6..b96bf846f1 100644 --- a/Contribute/Misc/index.html +++ b/Contribute/Misc/index.html @@ -9,7 +9,7 @@ - + @@ -64,6 +64,6 @@

- + diff --git a/Contribute/Translate/index.html b/Contribute/Translate/index.html index 6489871201..c1b1451c78 100644 --- a/Contribute/Translate/index.html +++ b/Contribute/Translate/index.html @@ -9,7 +9,7 @@ - + @@ -77,6 +77,6 @@ →

- + diff --git a/Contribute/Write/index.html b/Contribute/Write/index.html index 03cb62c6d2..9360826764 100644 --- a/Contribute/Write/index.html +++ b/Contribute/Write/index.html @@ -9,7 +9,7 @@ - + @@ -59,6 +59,6 @@ GitHub (opens new window)

# Documenting BTCPay Server

# Why documentation matters

Documentation is essential to give users of all skill levels concise and clear information about the software and how to use it. BTCPay server has many different use cases and as a result many different kinds of users seeking information from the documentation. Writers contributing to BTCPay Server are as important as any other contributor.

If you have technical knowledge in a certain area, want to help document new features or simply get involved in the BTCPay Server project, documentation is a great place to get started with contributing.

If you have writing skills or if you have a fair knowledge of the English language, then you can contribute to BTCPay Server or review the work of other contributors. Writing contributors can help in a number of places.

# BTCPay Documentation

Documentation work needing to be completed can be found in the open issues page (opens new window) on Github. For information on how to start a documentation task, see the documentation guide.

For documentation guidance or discussion of a new documentation idea, join the #documentation channel on Mattermost (opens new window).

# BTCPay Blog

Another great way to contribute is by writing content for the BTCPay blog. To get started on a blog topic, join the #content creation channel on Mattermost (opens new window).

# Requirements

In order to contribute to BTCPay Server as a writer there are some requirements.

Since most of the documentation done in BTCPay Server is submitted and reviewed through Github, you must have a Github account (opens new window). It's also on Github that you can contribute by reviewing the documentation work done by others (pull requests).

Important note: Contributions explained in this documentation are meant to be done in English only. If you wish to contribute in other languages, see Translations.

# Text Editor

It is recommended to have a Rich-Text editor.

Notepad++ (opens new window) is a decent software and easy to use for the newer contributors.

For more advanced users, Visual Studio Code (VS Code) (opens new window) is a good choice. The Markdown All In One extension in VS Code is also recommended, for visual comfort while editing and the ability to preview Markdown changes. This is helpful for the BTCPay documentation which is written primarily in Markdown.

These are only recommended: If you already use other similar software that you're accustomed to, you are free to continue using them.

# Version Control

To be able to manage your contributions (such as forking repositories, creating and working on branches, making pull requests and issues, etc.) it's recommended you have Github Desktop (opens new window). You can see the step by step guide to making a pull request using Github Desktop here.

- + diff --git a/Contribute/WriteBlog/index.html b/Contribute/WriteBlog/index.html index ed7c0eb459..eac19f886e 100644 --- a/Contribute/WriteBlog/index.html +++ b/Contribute/WriteBlog/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/Contribute/WriteDocs/index.html b/Contribute/WriteDocs/index.html index 08cebeb206..d68f717133 100644 --- a/Contribute/WriteDocs/index.html +++ b/Contribute/WriteDocs/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

- + diff --git a/Contribute/WriteSoftware/index.html b/Contribute/WriteSoftware/index.html index 72a4c6eb7f..e7aeaecfba 100644 --- a/Contribute/WriteSoftware/index.html +++ b/Contribute/WriteSoftware/index.html @@ -9,7 +9,7 @@ - + @@ -70,6 +70,6 @@ →

- + diff --git a/Contribute/index.html b/Contribute/index.html index 929ef9ac04..7f864a6711 100644 --- a/Contribute/index.html +++ b/Contribute/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# How to contribute to BTCPay Server?

BTCPay Server is built and maintained entirely by volunteer contributors around the internet.

We welcome, appreciate and encourage new contributions.

Depending on your skills and interest, you can help in a number of ways:

Every contribution is important and if you have any questions, feel free to consult our growing community.

- + diff --git a/CreateStore/index.html b/CreateStore/index.html index b5b7e194f4..19b557707b 100644 --- a/CreateStore/index.html +++ b/CreateStore/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/CreateWallet/index.html b/CreateWallet/index.html index c27f18e4ef..0c6896fbca 100644 --- a/CreateWallet/index.html +++ b/CreateWallet/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

- + diff --git a/CustomIntegration/index.html b/CustomIntegration/index.html index 80fb17837c..e6f9227b8c 100644 --- a/CustomIntegration/index.html +++ b/CustomIntegration/index.html @@ -9,7 +9,7 @@ - + @@ -93,6 +93,6 @@ (opens new window)

- + diff --git a/Dashboard/index.html b/Dashboard/index.html index 4c43062aa0..0d78346f18 100644 --- a/Dashboard/index.html +++ b/Dashboard/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

- + diff --git a/Deployment/Azure/index.html b/Deployment/Azure/index.html index cc2f3e846f..263e73bfcf 100644 --- a/Deployment/Azure/index.html +++ b/Deployment/Azure/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Azure Deployment

This setup is similar to the Docker Deployment, except that the docker-compose is hosted by Microsoft Azure.

# One-click setup

Start by clicking the following button:

Deploy to Azure (opens new window)

You can log into Azure (opens new window) with your Microsoft account.

Final installation steps:

Fill in the remaining options: Azure Resource Config

  • Click 'Purchase' to confirm
  • (Wait for Azure deployment)
  • Type ip into the search bar and select the first option, BTCPayServerPublicIP
  • Copy the hostname for your Azure deployment, under DNS name: Azure BTCPayServerPublicIP
  • Visit it (all major browsers supported)
  • Click 'Register' and create an account - This will be your admin account!
  • At your domain registrar, point your domain at this hostname (read more: How to change your BTCPay Server domain name)
  • Then, visit https://EXAMPLE.eastus.cloudapp.azure.com/server/maintenance
  • Enter your domain name and click 'Confirm'
  • (Wait 1-5 minutes)
  • Done! Visit https://EXAMPLE.MYSITE.com/stores to create your store and begin invoicing.

For advanced users, you can connect via SSH with the information on https://EXAMPLE.MYSITE.com/server/services/ssh, and:

  • Run docker ps and docker logs xxx to view running processes
  • Run btcpay-down.sh and btcpay-up.sh to stop and start the BTCPayServer

Approximate Cost (unpruned, Bitcoin-only, after Azure $200 free trial): 60 USD per month

After all your nodes have synced and you've confirmed everything works, follow this guide to fine-tune for savings; costs should drop to 30 or 40 USD per month.

Learn more: btcpayserver/btcpayserver-azure (opens new window)

- + diff --git a/Deployment/AzurePennyPinching/index.html b/Deployment/AzurePennyPinching/index.html index 0ec31b29b6..518bfcf48a 100644 --- a/Deployment/AzurePennyPinching/index.html +++ b/Deployment/AzurePennyPinching/index.html @@ -9,7 +9,7 @@ - + @@ -92,6 +92,6 @@ →

- + diff --git a/Deployment/Clovyr/index.html b/Deployment/Clovyr/index.html index 57973d6425..fd797704d0 100644 --- a/Deployment/Clovyr/index.html +++ b/Deployment/Clovyr/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@ →

- + diff --git a/Deployment/DynamicDNS/index.html b/Deployment/DynamicDNS/index.html index 3f721c798f..a3e58099eb 100644 --- a/Deployment/DynamicDNS/index.html +++ b/Deployment/DynamicDNS/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@ →

- + diff --git a/Deployment/GoogleCloud/index.html b/Deployment/GoogleCloud/index.html index 2f5fb390a7..d0cd957df2 100644 --- a/Deployment/GoogleCloud/index.html +++ b/Deployment/GoogleCloud/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/Deployment/Hack0/index.html b/Deployment/Hack0/index.html index 81c583156d..b3ac129bd5 100644 --- a/Deployment/Hack0/index.html +++ b/Deployment/Hack0/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@ →

- + diff --git a/Deployment/Hardware/index.html b/Deployment/Hardware/index.html index 1954a4d632..93c71e2d53 100644 --- a/Deployment/Hardware/index.html +++ b/Deployment/Hardware/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Hardware Deployment

Hardware deployment is advised when you want to be in total control of your own infrastructure.

Those are very useful for personal use or for people who wants absolute control over their infrastructure.

The main downside of hardware deployment is that it requires some hardware investment, and higher learning curve. The availability of your server will also probably lower than using a VPS such as LunaNode, as you are more likely to suffer from internet down time or hardware failure.

If you are still not sure whether you need hardware deployment, please see our diagram.

While all hardware deployments are similar to one another, we document step by step the process on three different hardware settings.

You can easily adapt those documentation on the custom hardware you prefer, we support arm32, arm64 and amd64.

Note that those solutions are all based on our docker deployment system.

- + diff --git a/Deployment/HardwareAsAService/index.html b/Deployment/HardwareAsAService/index.html index a5967dbea9..8afcdeaf5d 100644 --- a/Deployment/HardwareAsAService/index.html +++ b/Deployment/HardwareAsAService/index.html @@ -9,7 +9,7 @@ - + @@ -70,6 +70,6 @@ →

- + diff --git a/Deployment/LightningInABox/index.html b/Deployment/LightningInABox/index.html index d73dc053fc..bf95058d1e 100644 --- a/Deployment/LightningInABox/index.html +++ b/Deployment/LightningInABox/index.html @@ -9,7 +9,7 @@ - + @@ -144,6 +144,6 @@ →

- + diff --git a/Deployment/LunaNode/index.html b/Deployment/LunaNode/index.html index 32c5a12733..c826cb56f3 100644 --- a/Deployment/LunaNode/index.html +++ b/Deployment/LunaNode/index.html @@ -9,7 +9,7 @@ - + @@ -75,6 +75,6 @@ →

- + diff --git a/Deployment/ManualDeployment/index.html b/Deployment/ManualDeployment/index.html index a63ef67994..a13ab8b172 100644 --- a/Deployment/ManualDeployment/index.html +++ b/Deployment/ManualDeployment/index.html @@ -9,7 +9,7 @@ - + @@ -112,6 +112,6 @@ →

- + diff --git a/Deployment/ManualDeploymentExtended/index.html b/Deployment/ManualDeploymentExtended/index.html index 4715cbc43e..eeb0437f88 100644 --- a/Deployment/ManualDeploymentExtended/index.html +++ b/Deployment/ManualDeploymentExtended/index.html @@ -9,7 +9,7 @@ - + @@ -732,6 +732,6 @@

- + diff --git a/Deployment/RaspberryPi4/index.html b/Deployment/RaspberryPi4/index.html index aa9a5e96f1..ebfe146dbe 100644 --- a/Deployment/RaspberryPi4/index.html +++ b/Deployment/RaspberryPi4/index.html @@ -9,7 +9,7 @@ - + @@ -166,6 +166,6 @@ →

- + diff --git a/Deployment/ReverseProxyToTor/index.html b/Deployment/ReverseProxyToTor/index.html index 79af0132b7..d1c1d80982 100644 --- a/Deployment/ReverseProxyToTor/index.html +++ b/Deployment/ReverseProxyToTor/index.html @@ -9,7 +9,7 @@ - + @@ -265,6 +265,6 @@ →

- + diff --git a/Deployment/ReverseSSHtunnel/index.html b/Deployment/ReverseSSHtunnel/index.html index e8c7417085..099cd6f665 100644 --- a/Deployment/ReverseSSHtunnel/index.html +++ b/Deployment/ReverseSSHtunnel/index.html @@ -9,7 +9,7 @@ - + @@ -109,6 +109,6 @@ →

- + diff --git a/Deployment/ThirdPartyHosting/index.html b/Deployment/ThirdPartyHosting/index.html index 22349c6982..625f022022 100644 --- a/Deployment/ThirdPartyHosting/index.html +++ b/Deployment/ThirdPartyHosting/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

- + diff --git a/Deployment/index.html b/Deployment/index.html index 881b994d39..d5312c98ea 100644 --- a/Deployment/index.html +++ b/Deployment/index.html @@ -9,7 +9,7 @@ - + @@ -62,6 +62,6 @@ →

- + diff --git a/Deployment/voltagecloud/index.html b/Deployment/voltagecloud/index.html index 0fca9bd686..1c3c9a2cf1 100644 --- a/Deployment/voltagecloud/index.html +++ b/Deployment/voltagecloud/index.html @@ -9,7 +9,7 @@ - + @@ -90,6 +90,6 @@ →

- + diff --git a/Deployment/webdeployment/index.html b/Deployment/webdeployment/index.html index 190fafe18e..ffb4e5d222 100644 --- a/Deployment/webdeployment/index.html +++ b/Deployment/webdeployment/index.html @@ -9,7 +9,7 @@ - + @@ -73,6 +73,6 @@ Found a deployment that is missing, and do you want it added or notified us? Join the community chat (opens new window) on Mattermost by downloading Mattermost app (opens new window), or on Telegram (opens new window) and tell us about it. You can also create an issue in the BTCPay server Documents on Github (opens new window).

- + diff --git a/Development/Altcoins/index.html b/Development/Altcoins/index.html index 5dbd9b01ef..afd5705b3b 100644 --- a/Development/Altcoins/index.html +++ b/Development/Altcoins/index.html @@ -9,7 +9,7 @@ - + @@ -70,6 +70,6 @@ →

- + diff --git a/Development/GreenFieldExample-NodeJS/index.html b/Development/GreenFieldExample-NodeJS/index.html index 2f263251d3..b1493f819b 100644 --- a/Development/GreenFieldExample-NodeJS/index.html +++ b/Development/GreenFieldExample-NodeJS/index.html @@ -9,7 +9,7 @@ - + @@ -285,6 +285,6 @@ →

- + diff --git a/Development/GreenFieldExample/index.html b/Development/GreenFieldExample/index.html index 71d129d3ba..f7a47d084b 100644 --- a/Development/GreenFieldExample/index.html +++ b/Development/GreenFieldExample/index.html @@ -9,7 +9,7 @@ - + @@ -160,6 +160,6 @@ →

- + diff --git a/Development/GreenfieldExample-PHP/index.html b/Development/GreenfieldExample-PHP/index.html index ef3bd25a16..5ecde34425 100644 --- a/Development/GreenfieldExample-PHP/index.html +++ b/Development/GreenfieldExample-PHP/index.html @@ -9,7 +9,7 @@ - + @@ -209,6 +209,6 @@ →

- + diff --git a/Development/InvoiceMetadata/index.html b/Development/InvoiceMetadata/index.html index f5ddce9a13..31b9914c7e 100644 --- a/Development/InvoiceMetadata/index.html +++ b/Development/InvoiceMetadata/index.html @@ -9,7 +9,7 @@ - + @@ -132,6 +132,6 @@ →

- + diff --git a/Development/LocalDev/index.html b/Development/LocalDev/index.html index a2a45701d0..b74c0ef877 100644 --- a/Development/LocalDev/index.html +++ b/Development/LocalDev/index.html @@ -9,7 +9,7 @@ - + @@ -77,6 +77,6 @@ dotnet test -c Altcoins-Debug

# HTTPS support for local development

Some browser security features may require that you use HTTPS to be properly tested.

In this case, use Bitcoin-HTTPS (or Altcoin-HTTPS) launch profile. This will create a self signed certificate for your development purpose.

However, your browser will not trust it, making it difficult to debug.

You can instruct your OS to trust this development time certificate by running:

dotnet dev-certs https --trust
 

# Videos

For more information check out these videos:

and these notes:

- + diff --git a/Development/LocalDevelopment/index.html b/Development/LocalDevelopment/index.html index 4a7174c987..574821fe1b 100644 --- a/Development/LocalDevelopment/index.html +++ b/Development/LocalDevelopment/index.html @@ -9,7 +9,7 @@ - + @@ -98,6 +98,6 @@ →

- + diff --git a/Development/Plugins/index.html b/Development/Plugins/index.html index 2f9e1424a3..c68645703f 100644 --- a/Development/Plugins/index.html +++ b/Development/Plugins/index.html @@ -9,7 +9,7 @@ - + @@ -236,6 +236,6 @@ →

- + diff --git a/Development/TestnetDemo/index.html b/Development/TestnetDemo/index.html index 381d3eb1c4..2d8ef3c400 100644 --- a/Development/TestnetDemo/index.html +++ b/Development/TestnetDemo/index.html @@ -9,7 +9,7 @@ - + @@ -63,6 +63,6 @@

- + diff --git a/Development/Theme/index.html b/Development/Theme/index.html index c402d42604..bcd07ae3fa 100644 --- a/Development/Theme/index.html +++ b/Development/Theme/index.html @@ -9,7 +9,7 @@ - + @@ -94,6 +94,6 @@ →

- + diff --git a/Development/ecommerce-integration-guide/index.html b/Development/ecommerce-integration-guide/index.html index 12c6f8ab17..3a88a5bb21 100644 --- a/Development/ecommerce-integration-guide/index.html +++ b/Development/ecommerce-integration-guide/index.html @@ -9,7 +9,7 @@ - + @@ -107,6 +107,6 @@ →

- + diff --git a/Development/index.html b/Development/index.html index f1247d3c3c..ad590b2af0 100644 --- a/Development/index.html +++ b/Development/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/Docker/backup-restore/index.html b/Docker/backup-restore/index.html index 7b82750483..cf82187c6b 100644 --- a/Docker/backup-restore/index.html +++ b/Docker/backup-restore/index.html @@ -9,7 +9,7 @@ - + @@ -123,6 +123,6 @@ →

- + diff --git a/Docker/chatwoot/index.html b/Docker/chatwoot/index.html index 66c961fe08..3cee87d58c 100644 --- a/Docker/chatwoot/index.html +++ b/Docker/chatwoot/index.html @@ -9,7 +9,7 @@ - + @@ -69,6 +69,6 @@
  1. Wait for BTPay to be online and then create the database for chatwoot
docker exec -ti chatwoot sh -c "export DISABLE_DATABASE_ENVIRONMENT_CHECK=1 && bundle exec rails db:reset"
 
  1. Go to chatwoot website at https://chatwoot.xpayserver.com and set up.
- + diff --git a/Docker/cloudflare-tunnel/index.html b/Docker/cloudflare-tunnel/index.html index d826e08533..82e97a3ff3 100644 --- a/Docker/cloudflare-tunnel/index.html +++ b/Docker/cloudflare-tunnel/index.html @@ -9,7 +9,7 @@ - + @@ -77,6 +77,6 @@ →

- + diff --git a/Docker/fastsync/index.html b/Docker/fastsync/index.html index 5d72e96b79..712e6a5b4b 100644 --- a/Docker/fastsync/index.html +++ b/Docker/fastsync/index.html @@ -9,7 +9,7 @@ - + @@ -86,6 +86,6 @@ →

- + diff --git a/Docker/fireflyiii/index.html b/Docker/fireflyiii/index.html index 4dc799344b..d8963bd914 100644 --- a/Docker/fireflyiii/index.html +++ b/Docker/fireflyiii/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@ →

- + diff --git a/Docker/index.html b/Docker/index.html index 14c4282ed5..51f8328744 100644 --- a/Docker/index.html +++ b/Docker/index.html @@ -9,7 +9,7 @@ - + @@ -142,7 +142,7 @@

Or on powershell:

cd docker-compose-generator
 $BTCPAYGEN_DOCKER_IMAGE="btcpayserver/docker-compose-generator:local"
 

Then run ./build.sh or . .\build.ps1. -This will generate your docker-compose in the Generated folder, which you can then run and test.

Note that BTCPayServer developers will not spend excessive time testing your image, so make sure it works.

# Support

Image Version x64 arm32v7 arm64v8 links
btcpayserver/docker-compose-generator latest (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/lightning v24.05 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
shahanafarooqui/rtl v0.15.4 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/lnd v0.18.3-beta (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/bitcoin 26.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/btcpayserver 1.13.7$<BTCPAY_BUILD_CONFIGURATION>? (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/monero 0.18.3.4 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
nicolasdorier/nbxplorer 2.5.14 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/letsencrypt-nginx-proxy-companion 2.2.9-2 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
nginx 1.25.3-bookworm (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/docker-gen 0.10.7 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/btctransmuter 0.0.59 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/cloudflared 2023.10.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/btcpayserver-configurator 0.0.21 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/eps 0.2.2 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/joinmarket 0.9.10 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
nicolasdorier/ndlc-cli 1.0.1 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
pihole/pihole 2023.05.2 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/snapdrop 1.2 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/tor 0.4.8.10 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/woocommerce 3.1.0 (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/postgres 13.13 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
kamigawabul/btglnd latest (opens new window) Github (opens new window) - DockerHub (opens new window)
kamigawabul/docker-bitcoingold 0.15.2 (opens new window) Github (opens new window) - DockerHub (opens new window)
acinq/eclair release-0.7.0 (opens new window) Github (opens new window) - DockerHub (opens new window)
chekaz/docker-bitcoinplus 2.7.0 (opens new window) Github (opens new window) - DockerHub (opens new window)
dalijolijo/docker-bitcore 0.90.9.10 (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/dash 20.1.0 (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/dogecoin 1.14.7 (opens new window) Github (opens new window) - DockerHub (opens new window)
chekaz/docker-feathercoin 0.16.3 (opens new window) Github (opens new window) - DockerHub (opens new window)
groestlcoin/lightning v23.05 (opens new window) Github (opens new window) - DockerHub (opens new window)
groestlcoin/groestlcoin-lightning-charge version-0.4.22 (opens new window) Github (opens new window) - DockerHub (opens new window)
groestlcoin/groestlcoin-spark version-0.2.16 (opens new window) Github (opens new window) - DockerHub (opens new window)
groestlcoin/eclair v0.6.0 (opens new window) Github (opens new window) - DockerHub (opens new window)
groestlcoin/lnd v0.10.0-grs (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/groestlcoin 25.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/elements 23.2.3 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/litecoin 0.21.2.1-2 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
wakiyamap/docker-monacoin 0.20.2 (opens new window) Github (opens new window) - DockerHub (opens new window)
redis 6.2.2-buster (opens new window) Github (opens new window) - DockerHub (opens new window)
jvandrew/btcqbo 0.3.36 (opens new window) Github (opens new window) - DockerHub (opens new window)
shesek/bwt 0.2.2-electrum (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
chatwoot/chatwoot v1.7.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
lukechilds/electrumx latest (opens new window) Github (opens new window) - DockerHub (opens new window)
fireflyiii/core latest (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
podcastindexorg/podcasting20-helipad v0.1.10 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
jvandrew/librepatron 0.7.39 (opens new window) Github (opens new window) - DockerHub (opens new window)
jvandrew/isso atron.22 (opens new window) Github (opens new window) - DockerHub (opens new window)
lightninglabs/lightning-terminal v0.12.3-alpha-path-prefix (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
mempool/frontend v2.5.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
mempool/backend v2.5.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
mariadb 10.11 (opens new window) Github (opens new window) - DockerHub (opens new window)
kukks/nnostr-relay v0.0.23 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
sphinxlightning/sphinx-relay v2.2.9 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
djbooth007/tallycoin_connect v1.8.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
benjaminchodroff/rust-teos latest (opens new window) Github (opens new window) - DockerHub (opens new window)
apotdevin/thunderhub base-v0.13.31 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
lncapital/torq 0.20.3 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
timescale/timescaledb latest-pg14 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
zammad/zammad-docker-compose zammad-postgresql-3.4.0-4 (opens new window) Github (opens new window) - DockerHub (opens new window)
memcached 1.5.22-alpine (opens new window) Github (opens new window) - DockerHub (opens new window)
traefik v2.6 (opens new window) Github (opens new window) - DockerHub (opens new window)
chekaz/docker-trezarcoin 0.13.0 (opens new window) Github (opens new window) - DockerHub (opens new window)
romanornr/docker-viacoin 0.15.2 (opens new window) Github (opens new window) - DockerHub (opens new window)

# FAQ

# How can I modify my environment?

As root, run . btcpay-setup.sh; this will show you the environment variable it is expecting. +This will generate your docker-compose in the Generated folder, which you can then run and test.

Note that BTCPayServer developers will not spend excessive time testing your image, so make sure it works.

# Support

Image Version x64 arm32v7 arm64v8 links
btcpayserver/docker-compose-generator latest (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/lightning v24.05 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
shahanafarooqui/rtl v0.15.4 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/lnd v0.18.3-beta (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/bitcoin 26.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/btcpayserver 1.13.7$<BTCPAY_BUILD_CONFIGURATION>? (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/monero 0.18.3.4 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
nicolasdorier/nbxplorer 2.5.14 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/letsencrypt-nginx-proxy-companion 2.2.9-2 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
nginx 1.25.3-bookworm (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/docker-gen 0.10.7 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/btctransmuter 0.0.59 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/cloudflared 2023.10.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/btcpayserver-configurator 0.0.21 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/eps 0.2.2 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/joinmarket 0.9.10 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
nicolasdorier/ndlc-cli 1.0.1 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
pihole/pihole 2023.05.2 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/snapdrop 1.2 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/tor 0.4.8.10 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/woocommerce 3.1.0 (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/postgres 13.13 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
kamigawabul/btglnd latest (opens new window) Github (opens new window) - DockerHub (opens new window)
kamigawabul/docker-bitcoingold 0.15.2 (opens new window) Github (opens new window) - DockerHub (opens new window)
acinq/eclair release-0.7.0 (opens new window) Github (opens new window) - DockerHub (opens new window)
chekaz/docker-bitcoinplus 2.7.0 (opens new window) Github (opens new window) - DockerHub (opens new window)
dalijolijo/docker-bitcore 0.90.9.10 (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/dash 20.1.0 (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/dogecoin 1.14.7 (opens new window) Github (opens new window) - DockerHub (opens new window)
chekaz/docker-feathercoin 0.16.3 (opens new window) Github (opens new window) - DockerHub (opens new window)
groestlcoin/lightning v23.05 (opens new window) Github (opens new window) - DockerHub (opens new window)
groestlcoin/groestlcoin-lightning-charge version-0.4.22 (opens new window) Github (opens new window) - DockerHub (opens new window)
groestlcoin/groestlcoin-spark version-0.2.16 (opens new window) Github (opens new window) - DockerHub (opens new window)
groestlcoin/eclair v0.6.0 (opens new window) Github (opens new window) - DockerHub (opens new window)
groestlcoin/lnd v0.10.0-grs (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/groestlcoin 25.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/elements 23.2.3 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
btcpayserver/litecoin 0.21.2.1-2 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
wakiyamap/docker-monacoin 0.20.2 (opens new window) Github (opens new window) - DockerHub (opens new window)
redis 6.2.2-buster (opens new window) Github (opens new window) - DockerHub (opens new window)
jvandrew/btcqbo 0.3.36 (opens new window) Github (opens new window) - DockerHub (opens new window)
shesek/bwt 0.2.2-electrum (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
chatwoot/chatwoot v1.7.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
lukechilds/electrumx latest (opens new window) Github (opens new window) - DockerHub (opens new window)
fireflyiii/core latest (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
podcastindexorg/podcasting20-helipad v0.1.10 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
jvandrew/librepatron 0.7.39 (opens new window) Github (opens new window) - DockerHub (opens new window)
jvandrew/isso atron.22 (opens new window) Github (opens new window) - DockerHub (opens new window)
lightninglabs/lightning-terminal v0.13.5-alpha-path-prefix (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
mempool/frontend v2.5.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
mempool/backend v2.5.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
mariadb 10.11 (opens new window) Github (opens new window) - DockerHub (opens new window)
kukks/nnostr-relay v0.0.23 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
sphinxlightning/sphinx-relay v2.2.9 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
djbooth007/tallycoin_connect v1.8.0 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
benjaminchodroff/rust-teos latest (opens new window) Github (opens new window) - DockerHub (opens new window)
apotdevin/thunderhub base-v0.13.31 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
lncapital/torq 0.20.3 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
timescale/timescaledb latest-pg14 (opens new window) (opens new window) (opens new window) Github (opens new window) - DockerHub (opens new window)
zammad/zammad-docker-compose zammad-postgresql-3.4.0-4 (opens new window) Github (opens new window) - DockerHub (opens new window)
memcached 1.5.22-alpine (opens new window) Github (opens new window) - DockerHub (opens new window)
traefik v2.6 (opens new window) Github (opens new window) - DockerHub (opens new window)
chekaz/docker-trezarcoin 0.13.0 (opens new window) Github (opens new window) - DockerHub (opens new window)
romanornr/docker-viacoin 0.15.2 (opens new window) Github (opens new window) - DockerHub (opens new window)

# FAQ

# How can I modify my environment?

As root, run . btcpay-setup.sh; this will show you the environment variable it is expecting. For example, if you support btc and ltc already, and want to add btg:

export BTCPAYGEN_CRYPTO3='btg'
 . btcpay-setup.sh -i
 

# I deployed before btcpay-setup.sh existed (before May 17, 2018), can I migrate to this new system?

Yes, run the following commands to update:

sudo su -
@@ -218,6 +218,6 @@
       
       →
     

- + diff --git a/Docker/joinmarket/index.html b/Docker/joinmarket/index.html index 533f98867a..1823206e38 100644 --- a/Docker/joinmarket/index.html +++ b/Docker/joinmarket/index.html @@ -9,7 +9,7 @@ - + @@ -108,6 +108,6 @@ →

- + diff --git a/Docker/lightning-terminal/index.html b/Docker/lightning-terminal/index.html index 677f690ff3..b83fe99c1d 100644 --- a/Docker/lightning-terminal/index.html +++ b/Docker/lightning-terminal/index.html @@ -9,7 +9,7 @@ - + @@ -75,6 +75,6 @@ →

- + diff --git a/Docker/ndlc/index.html b/Docker/ndlc/index.html index 1599206640..3bfc52f1a4 100644 --- a/Docker/ndlc/index.html +++ b/Docker/ndlc/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@ →

- + diff --git a/Docker/pihole/index.html b/Docker/pihole/index.html index e585f53012..f7f613804e 100644 --- a/Docker/pihole/index.html +++ b/Docker/pihole/index.html @@ -9,7 +9,7 @@ - + @@ -76,6 +76,6 @@ →

- + diff --git a/Docker/tallycoin-connect/index.html b/Docker/tallycoin-connect/index.html index 9c86cc073d..68c7548b10 100644 --- a/Docker/tallycoin-connect/index.html +++ b/Docker/tallycoin-connect/index.html @@ -9,7 +9,7 @@ - + @@ -76,6 +76,6 @@ →

- + diff --git a/Drupal/index.html b/Drupal/index.html index b4bdff1343..7d842c161f 100644 --- a/Drupal/index.html +++ b/Drupal/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@ →

- + diff --git a/DynamicReports/index.html b/DynamicReports/index.html index 40f417632b..70092e89e3 100644 --- a/DynamicReports/index.html +++ b/DynamicReports/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/ElectrumPersonalServer/index.html b/ElectrumPersonalServer/index.html index 28003f3813..72b5daa850 100644 --- a/ElectrumPersonalServer/index.html +++ b/ElectrumPersonalServer/index.html @@ -9,7 +9,7 @@ - + @@ -73,6 +73,6 @@ →

- + diff --git a/ElectrumWallet/index.html b/ElectrumWallet/index.html index 889c57945e..0c08f4f537 100644 --- a/ElectrumWallet/index.html +++ b/ElectrumWallet/index.html @@ -9,7 +9,7 @@ - + @@ -61,6 +61,6 @@

If you are running a version older than Electrum 4, also enter the following command and press 'enter'

wallet.storage.write()
 
ElectrumWallet

Restart your Electrum and verify that the newly set gap limit is correct by entering in the console:

wallet.gap_limit
 

There's no good answer to how much you should set the gap limit to. Most merchants set 100-200. If you're a big merchants with high transaction volume, you can try with even higher gap limit.

For more details about the Gap Limit, check the FAQ.

Electrum and BTCPay Server are now connected. Any payments received to your BTCPay will be visible in Electrum, where you can further spend them.

- + diff --git a/ElectrumX/index.html b/ElectrumX/index.html index 9d9c85c0e3..4280c08f33 100644 --- a/ElectrumX/index.html +++ b/ElectrumX/index.html @@ -9,7 +9,7 @@ - + @@ -75,6 +75,6 @@ →

- + diff --git a/FAQ/Altcoin/index.html b/FAQ/Altcoin/index.html index ce27eae0ff..6757ce91cc 100644 --- a/FAQ/Altcoin/index.html +++ b/FAQ/Altcoin/index.html @@ -9,7 +9,7 @@ - + @@ -71,6 +71,6 @@

- + diff --git a/FAQ/Apps/index.html b/FAQ/Apps/index.html index 40b5a019b0..192c8eae63 100644 --- a/FAQ/Apps/index.html +++ b/FAQ/Apps/index.html @@ -9,7 +9,7 @@ - + @@ -180,6 +180,6 @@ →

- + diff --git a/FAQ/Deployment/index.html b/FAQ/Deployment/index.html index 66774e61c4..a5d5f7e366 100644 --- a/FAQ/Deployment/index.html +++ b/FAQ/Deployment/index.html @@ -9,7 +9,7 @@ - + @@ -286,6 +286,6 @@ →

- + diff --git a/FAQ/General/index.html b/FAQ/General/index.html index 8d256e4c71..70a8dd15fa 100644 --- a/FAQ/General/index.html +++ b/FAQ/General/index.html @@ -9,7 +9,7 @@ - + @@ -80,6 +80,6 @@ →

- + diff --git a/FAQ/Integrations/index.html b/FAQ/Integrations/index.html index 73783bad5f..8122f914a9 100644 --- a/FAQ/Integrations/index.html +++ b/FAQ/Integrations/index.html @@ -9,7 +9,7 @@ - + @@ -116,6 +116,6 @@ →

- + diff --git a/FAQ/LightningNetwork/index.html b/FAQ/LightningNetwork/index.html index cb248e3b81..58aac1b4e6 100644 --- a/FAQ/LightningNetwork/index.html +++ b/FAQ/LightningNetwork/index.html @@ -9,7 +9,7 @@ - + @@ -198,6 +198,6 @@ →

- + diff --git a/FAQ/ServerSettings/index.html b/FAQ/ServerSettings/index.html index 5e2a5d010a..a9157916ab 100644 --- a/FAQ/ServerSettings/index.html +++ b/FAQ/ServerSettings/index.html @@ -9,7 +9,7 @@ - + @@ -125,6 +125,6 @@ →

- + diff --git a/FAQ/Stores/index.html b/FAQ/Stores/index.html index e431c57d5a..8263c6ae4f 100644 --- a/FAQ/Stores/index.html +++ b/FAQ/Stores/index.html @@ -9,7 +9,7 @@ - + @@ -77,6 +77,6 @@ →

- + diff --git a/FAQ/Synchronization/index.html b/FAQ/Synchronization/index.html index 67e48242b1..36813a21ca 100644 --- a/FAQ/Synchronization/index.html +++ b/FAQ/Synchronization/index.html @@ -9,7 +9,7 @@ - + @@ -132,6 +132,6 @@ →

- + diff --git a/FAQ/Wallet/index.html b/FAQ/Wallet/index.html index 5e15d744f8..b87bfa3cb1 100644 --- a/FAQ/Wallet/index.html +++ b/FAQ/Wallet/index.html @@ -9,7 +9,7 @@ - + @@ -79,6 +79,6 @@ →

- + diff --git a/FAQ/index.html b/FAQ/index.html index 5d4865c85b..ef92111e28 100644 --- a/FAQ/index.html +++ b/FAQ/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Frequently Asked Questions and Common Issues

This document contains a Table of contents to all FAQ and common issues.

# General FAQ

General, non-technical questions about BTCPay. What it is, how it works, what are its features, why is it different and who can use it.

# Deployment FAQ

Questions and solutions to BTCPay installation.

# General Deployment FAQ

# Web Deployment FAQ

# Luna Node Web Deployment FAQ

# Manual Deployment FAQ

# Synchronization FAQ

Common questions and issues that may occur during the initial sync of BTCPay.

# Integrations FAQ

Questions about e-commerce and other integrations.

# Integrations General

# WooCommerce FAQ

# Server Settings FAQ

Common problems and questions server admins have.

# Maintenance FAQ

# Theme / Customization FAQ

# Policies FAQ

# Services FAQ

# Files FAQ

# Stores FAQ

Store settings explained.

# Wallet FAQ

Here are some of the questions and problems about wallets in BTCPay.

# Apps FAQ

Frequent questions about the applications in BTCPay.

# Lightning Network FAQ

Lightning Network troubleshooting and common problems.

# Lightning Network General FAQ

# Lightning Network LND FAQ

# Lightning Network Core Lightning (CLN) FAQ

# Altcoins FAQ

- + diff --git a/Forms/index.html b/Forms/index.html index 31729c0b93..4c9d041f61 100644 --- a/Forms/index.html +++ b/Forms/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ We'll start by giving it a name; in the example, we will use Restaurant. Unlike before, we will start with the empty field that was generated.

BTCPay Server formbuilder - Create new form
  1. We will name the first field, Table number
  2. Define the Type of the field; we need it to be Text or Number, click on the drop-down and select Number.
BTCPay Server formbuilder - Create new form
  1. The label we set for this field as it shows to the customer; in our example, we will name it Table Number.
  2. Regarding The name of the field, we replicate the previous field's name, Table Number, for consistency.
  3. We could define a Default value; however, we'll keep it empty in the example.
  4. Helper Text This is the text provided below the field we are creating to indicate what you request from the customer.
  5. Last, we can set two parameters; one is always to make it required to be filled out; in this example, we will set this to yes. And if it's a Constant, users can't change this so we won't use the setting for the example.
BTCPay Server formbuilder - Create new form

After you've filled in the parameters for the field, it should show on the left of your editor how the field displays and functions when the customer interacts with it.

BTCPay Server formbuilder - Create new form

Now that the first field is done, you can click on the + Add form element below your first field and create the rest of the required form fields. Once you've made all the fields, click Save in the top right of your screen, and all should be set!

BTCPay Server formbuilder - Create new form

The Form Builder makes creating custom forms flexible and easy. If you still require more personalization, as mentioned at the start of this guide, please read on Advanced Forms to learn about the JSON created in the Code tab in the Form builder.

# Public Forms

When Allow form for public use is enabled, a form can be used as a way to share a URL, where users must fill in the form and an invoice is then generated.

By default, the invoice currency is set to the store's default currency, and the amount is set to "any".

You can configure the form to have a pre-configured currency and amount by creating fields with specific names.

You can create these fields with type hidden to not show it to the user. Additionally, if you'd like the user to not be able to modify the values, you must set Constant to checked.

This can be used as an alternative to the Pay Button, with the added benefit that you can lock in invoice parameters such as amount and currency.

# Adjust invoice amounts based on user input

In most modern ecommerce scenarios, you need to modify the amount being charged based on user input, such as their preferred shipping method, their country, promotional codes, etc.

The form comes with such functionality as of BTCPay Server version 1.11.0. Any field that has its name start with invoice_amount_adjustment (supported since v1.11) or invoice_amount_multiply_adjustment (supported since v1.12) and its value being a valid number will automatically adjust the invoice amount.

This functionality currently works for public form usage and for the Point of Sale plugin. See the Mirror Fields section of the Advanced Forms guide for details.

# Charging extra based on shipping method

Create a field of type "select", with the name invoice_amount_adjustment_shipping_method, and options that map to what shipping methods you have available. We will use 2 options: DHL with a value of 10 and Fedex with a value of 20. When a user selects either or, the invoice amount will be adjusted by 10 or 20 respectively.

Note: This is a simple example. While the invoice amount will be correctly adjusted, you will not be able to see the selected shipping option inside the created invoice. We must make use of Mirror fields to accomplish this.

To save the user selected shipping method choice we must do the following instead:

# Promo codes

When the user enters chocolate in the promo code field, the invoice amount will be adjusted by -5.

# Showing user input on the receipt

By default, none of the user input will be shown on the invoice receipt. To do this, we must create a mapping for each field.

- + diff --git a/Grandnode/index.html b/Grandnode/index.html index ab9327b987..321dfd0f5f 100644 --- a/Grandnode/index.html +++ b/Grandnode/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/Guide/index.html b/Guide/index.html index 98958917db..fc057c3175 100644 --- a/Guide/index.html +++ b/Guide/index.html @@ -9,7 +9,7 @@ - + @@ -57,15 +57,13 @@ FAQ GitHub - (opens new window)

# BTCPay Server Documentation

# What is BTCPay Server?

BTCPay Server is a free, open-source & self-hosted bitcoin payment gateway that allows self-sovereign individuals and businesses to accept bitcoin payments online or in person without any fees.

BTCPay Server

# How BTCPay Server works?

BTCPay Server is a self-hosted and automated invoicing system. At checkout, a customer is presented with an invoice that they pay from their wallet. BTCPay Server follows the status of the invoice through the blockchain and informs you when the payment has been settled so that you can fulfill the order. It also takes care of payment refunding and bitcoin management alongside plenty of other features.

BTCPay Server is free to use and completely open-source, so developers or security auditors can always inspect the quality of the code.

# Features

  • Direct, peer-to-peer Bitcoin payments
  • No transaction fees (other than the network fee (opens new window))
  • No processing fees
  • No middleman
  • No KYC
  • Non-custodial (complete control over the private key)
  • Enhanced privacy
  • Enhanced security
  • Self-hosted software
  • SegWit support
  • Lightning Network support (LND, Core Lightning (CLN) & Eclair implementations)
  • Tor support
  • Opt-in altcoin integrations
  • Full compatibility with legacy BitPay API (easy migration)
  • Process payments for others
  • Easy-embeddable payment buttons
  • Point of sale app
  • Crowdfunding app
  • Payment Requests
  • Internal, full-node reliant wallet with hardware wallet integration
  • Payjoin Support

# Getting started

To start using BTCPay Server, decide how you would like to deploy it. If you decide on a self-hosted option, start by reviewing our extensive deployment documentation. We recommend Docker deployment. If your choice is a third-party hosting, read our third-party host docs.

# Get involved

Contributing to an open-source project is a great way to learn, network, and build your portfolio. Volunteers around the internet maintain BTCPay Server. If you would like to contribute to the project development, check our contributing guidelines

If you're interested in helping out with documentation, look at the video below.

# Support

If you have trouble using BTCPay Server, consider joining the communities listed on the official website (opens new window) to get help from BTCPay community members.

Only file a Github issue (opens new window) for technical issues you can't resolve through other channels or feature requests you've validated with other members of the community.

Please check out our official website (opens new window),and FAQ for more details.

Our Supporters

+ (opens new window)

# BTCPay Server Documentation

# What is BTCPay Server?

BTCPay Server is a free, open-source & self-hosted bitcoin payment gateway that allows self-sovereign individuals and businesses to accept bitcoin payments online or in person without any fees.

BTCPay Server

# How BTCPay Server works?

BTCPay Server is a self-hosted and automated invoicing system. At checkout, a customer is presented with an invoice that they pay from their wallet. BTCPay Server follows the status of the invoice through the blockchain and informs you when the payment has been settled so that you can fulfill the order. It also takes care of payment refunding and bitcoin management alongside plenty of other features.

BTCPay Server is free to use and completely open-source, so developers or security auditors can always inspect the quality of the code.

# Features

  • Direct, peer-to-peer Bitcoin payments
  • No transaction fees (other than the network fee (opens new window))
  • No processing fees
  • No middleman
  • No KYC
  • Non-custodial (complete control over the private key)
  • Enhanced privacy
  • Enhanced security
  • Self-hosted software
  • SegWit support
  • Lightning Network support (LND, Core Lightning (CLN) & Eclair implementations)
  • Tor support
  • Opt-in altcoin integrations
  • Full compatibility with legacy BitPay API (easy migration)
  • Process payments for others
  • Easy-embeddable payment buttons
  • Point of sale app
  • Crowdfunding app
  • Payment Requests
  • Internal, full-node reliant wallet with hardware wallet integration
  • Payjoin Support

# Getting started

To start using BTCPay Server, decide how you would like to deploy it. If you decide on a self-hosted option, start by reviewing our extensive deployment documentation. We recommend Docker deployment. If your choice is a third-party hosting, read our third-party host docs.

# Get involved

Contributing to an open-source project is a great way to learn, network, and build your portfolio. Volunteers around the internet maintain BTCPay Server. If you would like to contribute to the project development, check our contributing guidelines

If you're interested in helping out with documentation, look at the video below.

# Support

If you have trouble using BTCPay Server, consider joining the communities listed on the official website (opens new window) to get help from BTCPay community members.

Only file a Github issue (opens new window) for technical issues you can't resolve through other channels or feature requests you've validated with other members of the community.

Please check out our official website (opens new window),and FAQ for more details.

Our Supporters

The BTCPay Server Project is proudly supported by these entities through the BTCPay Server Foundation.

- + diff --git a/HardwareWalletIntegration/index.html b/HardwareWalletIntegration/index.html index 1e169f4c0b..215c20ebd2 100644 --- a/HardwareWalletIntegration/index.html +++ b/HardwareWalletIntegration/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/InvoiceNinja/index.html b/InvoiceNinja/index.html index fb4b200b7a..3b5af39bff 100644 --- a/InvoiceNinja/index.html +++ b/InvoiceNinja/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

- + diff --git a/Invoices/index.html b/Invoices/index.html index 20b3f55387..605e98a36c 100644 --- a/Invoices/index.html +++ b/Invoices/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

- + diff --git a/LNDhubAPI/index.html b/LNDhubAPI/index.html index 8c68d158aa..cd2123fc93 100644 --- a/LNDhubAPI/index.html +++ b/LNDhubAPI/index.html @@ -9,7 +9,7 @@ - + @@ -73,6 +73,6 @@ →

- + diff --git a/LedgerWallet/index.html b/LedgerWallet/index.html index 150a326aad..0e781be6f9 100644 --- a/LedgerWallet/index.html +++ b/LedgerWallet/index.html @@ -9,7 +9,7 @@ - + @@ -59,6 +59,6 @@ GitHub (opens new window)

# Connecting Ledger Wallet to BTCPay Server

This document shows how to connect Ledger Nano S Wallet to BTCPay Server.

WARNING

Direct Ledger Nano S integration is no longer supported. For Bitcoin wallets, you can use your Ledger hardware wallet regularly via the new hardware wallet integration.

For altcoin wallets, you can spend funds from your external wallet, sign a transaction within the internal wallet with HD Private Key or mnemonic seed or a hot wallet.

To set up a new altcoin wallet, add the extended public key manually or create a new wallet.

# Ledger Nano S Wallet Setup

This guide assumes, you have a Nano S wallet set up. To configure the Nano S, please see the quick setup guide on manufacturer's website (opens new window).

# Requirements

  1. Bitcoin App installed on the Ledger
  2. Google Chrome or Firefox
  3. For Firefox, U2F needs to be enabled in about:config
  4. No other U2F devices plugged in into your PC (Yubikey, other wallets, etc)

# Quick Setup

  1. Plug in Ledger Nano S into your PC.
  2. Open the Bitcoin app on your Ledger.
  3. In BTCPay Server, Store > Settings > Wallet > Setup > Derivation Scheme > Import from Hardware Device > Ledger wallet
  4. Select the account which you want to use, in most cases it's the Account 0
  5. Confirm the Export public key on the wallet.
  6. The extended public key will now automatically be added from Ledger to your BTCPay Server Store.
  7. Make sure that the derivation scheme is Enabled
  8. Click Continue
  9. Confirm the address match in BTCPay.

Your Ledger wallet is now connected to your BTCPay. Payments go directly to Ledger.

# Manual Setup

If you have more than 20 accounts in your Ledger you might not be able to find the correct account because the select shows a maximum of 20 entries. In this case you can manually find the extended public key for your wanted account in these steps:

  1. Open the Ledger live app (opens new window)
  2. Accounts -> choose your account
  3. Edit Account on the top right via the tool-icon
  4. In Edit Account -> ADVANCED LOGS
  5. Copy the extended public key string
  6. Paste it manually into the "DerivationScheme" textfield
  7. Continue with Step 7 of the Quick Setup above
Ledger Account "Advanced Logs" info screenshot

# Spending from BTCPay Server wallet with Ledger

Once there are some funds in received to your BTCPay Wallet connected to Ledger, you can spend them by signing a transaction with your hardware wallet. This allows easy interaction of the Ledger wallet with your full node, without leaking information to third-party servers.

  1. Plug in Ledger Nano S into your PC.
  2. Open the Bitcoin app on your Ledger.
  3. In BTCPay, go to Wallets > Manage > Send
  4. Fill in destination address and the amount
  5. Click on the Sign with your Ledger Wallet device.
  6. BTCPay will establish a connection with the Ledger wallet and display transaction information on the wallet screen.
  7. Confirm the transaction on the Ledger.
  8. In Ledger, click on the Ready To Sign
  9. Review your transactions and click Broadcast to broadcast it on the network.

The video below shows how to connect your BTCPay store to your Ledger and how to use Ledger with the internal BTCPay wallet.

- + diff --git a/LightningNetwork/index.html b/LightningNetwork/index.html index 82a6a6e61d..87a8bc1c7f 100644 --- a/LightningNetwork/index.html +++ b/LightningNetwork/index.html @@ -9,7 +9,7 @@ - + @@ -109,6 +109,6 @@

- + diff --git a/LightningNetwork_PaymentChannels/index.html b/LightningNetwork_PaymentChannels/index.html index 18541a4148..4135c6bf45 100644 --- a/LightningNetwork_PaymentChannels/index.html +++ b/LightningNetwork_PaymentChannels/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

# Opening and operating payment channels

Given that the Lightning Network is a relatively new technology under active development, getting your freshly deployed node ready to send and receive payments, still, requires a couple of steps.

Overview:

  1. The lightning node is deployed, enabled and its on-chain wallet is funded
  2. A peer is identified and the first payment channel is opened
  3. Inbound and outbound liquidity is acquired. The node is now able to send and receive
  4. Liquidity management, an ongoing process to maintain the capacity to send and receive

Key considerations:

  • Choosing the channel partner. Consider opening the first channel to a well connected peer with robust uptime. This will increase the chances for your payments to be routed and settled.
  • Inbound vs outbound capacity. Outbound capacity allows nodes to send payments whereas inbound capacity allows nodes to receive payments. As a merchant using lightning, having inbound capacity is essential for customers to be able to pay you.
  • Inbound capacity. A node adds inbound capacity by either spending sats from its local balance or having other nodes in the network open channels to it.
  • Liquidity management: maintaining the ability to send and receive is a continous process where a balance between inbound vs outbound capacity has to be maintained across payment channels. This capacity distribution must be adjusted depending upon the use case of the node operator.
  • Lightning Service Providers: LSPs offer paid third-party services that improve the ease of operating a lightning network node. Such services can be used to acquire inbound capacity or to automate the rebalancing process.

Below a set of good resources for a deeper dive into topics such as:

- + diff --git a/Magento/index.html b/Magento/index.html index d6ee109bfb..95c388dca2 100644 --- a/Magento/index.html +++ b/Magento/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/NBXplorer/API/index.html b/NBXplorer/API/index.html index 301d6c9d58..e28265dc6f 100644 --- a/NBXplorer/API/index.html +++ b/NBXplorer/API/index.html @@ -9,7 +9,7 @@ - + @@ -73,6 +73,6 @@ →

- + diff --git a/NBXplorer/Postgres-Migration/index.html b/NBXplorer/Postgres-Migration/index.html index 73347f4e4c..e76993a8b4 100644 --- a/NBXplorer/Postgres-Migration/index.html +++ b/NBXplorer/Postgres-Migration/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

- + diff --git a/NBXplorer/Postgres-Schema/index.html b/NBXplorer/Postgres-Schema/index.html index 2b904b1597..fae6a315af 100644 --- a/NBXplorer/Postgres-Schema/index.html +++ b/NBXplorer/Postgres-Schema/index.html @@ -9,7 +9,7 @@ - + @@ -87,6 +87,6 @@ →

- + diff --git a/NBXplorer/index.html b/NBXplorer/index.html index a8b0153639..2fde617c71 100644 --- a/NBXplorer/index.html +++ b/NBXplorer/index.html @@ -9,7 +9,7 @@ - + @@ -63,7 +63,7 @@

On Linux:

./build.sh
 

Then to run:

On Powershell:

.\run.ps1 --help
 

On Linux:

./run.sh --help
-

Example, if you have ltc node and btc node on regtest (default configuration), and want to connect to them: (see documentation for other options in the postgres connection string (opens new window))

./run.sh --chains=btc,ltc --network=regtest --postgres "User ID=postgres;Host=127.0.0.1;Port=39382;Database=nbxplorer"
+

Example, if you have ltc node and btc node on regtest (default configuration), and want to connect to them: (see documentation for other options in the postgres connection string (opens new window))

./run.sh --chains=btc,ltc --network=regtest --postgres "User ID=postgres;Host=127.0.0.1;Port=5432;Database=nbxplorer"
 

# How to use the API?

Check the API documentation (opens new window), you can then use any client library:

Here is a small C# example (opens new window) showing a 2-2 multisig with Alice and Bob that you can run on regtest.

# With Docker

Use our image (opens new window). You can check the sample (opens new window) for configuring and composing it bitcoin core.

# How to develop on it?

If you are on Windows, I recommend Visual Studio 2022 (17.8.0). If you are on other platform and want lightweight environment, use Visual Studio Code (opens new window). @@ -108,6 +108,6 @@ →

- + diff --git a/Nopcommerce/index.html b/Nopcommerce/index.html index 25fb562667..af38adf0ba 100644 --- a/Nopcommerce/index.html +++ b/Nopcommerce/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/Nostr/index.html b/Nostr/index.html index 3e1fa684c1..f618e0ceb1 100644 --- a/Nostr/index.html +++ b/Nostr/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

- + diff --git a/Notifications/index.html b/Notifications/index.html index 41d5eab7aa..1d1e4a2ae2 100644 --- a/Notifications/index.html +++ b/Notifications/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ {Invoice.Status} {Invoice.OrderId}

Find the source here for possible updates (opens new window)

Create new Email rule
- + diff --git a/Odoo/index.html b/Odoo/index.html index 3def757eec..a9cc37e922 100644 --- a/Odoo/index.html +++ b/Odoo/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

- + diff --git a/OpenCart/index.html b/OpenCart/index.html index d0b996d220..f0a4c8e44e 100644 --- a/OpenCart/index.html +++ b/OpenCart/index.html @@ -9,7 +9,7 @@ - + @@ -89,6 +89,6 @@ →

- + diff --git a/Payjoin/index.html b/Payjoin/index.html index b96dc1860b..20e4d672e3 100644 --- a/Payjoin/index.html +++ b/Payjoin/index.html @@ -9,7 +9,7 @@ - + @@ -59,6 +59,6 @@ GitHub (opens new window)

# BTCPay Server Payjoin Guide

This document explains how to use BTCPay Server's Payjoin feature. For a detailed, technical explanation of how payjoin is implemented, check BIP78 (opens new window)

You can follow this video to better understand what payjoin is and how to use it.

# Enabling Payjoin as a merchant

  1. Create a store
  2. Configure a hot wallet for your derivation scheme. Be sure to use either segwit or segwit wrapped as the address type.
  3. Enable Payjoin/P2EP in the "General Settings" and click "Save"

It's important to note that you will need at least 1 UTXO for payjoin to work.

Receive PayJoin in BTCPay Server
Receive PayJoin in BTCPay Server
Receive PayJoin in BTCPay Server

# Paying to Payjoin as a user

The BTCPay Wallet supports Payjoin.

  1. Retrieve the BIP21 payment link from a BTCPay Server invoice which has payjoin enabled by either:
    • Scan the QR code with the camera scanning feature
    • Copy the link from the "Open in wallet" button and paste it in the "Parse BIP21" prompt
  2. The send form should be populated with the payment details. You can check if the invoice supports payjoin by expanding "advanced settings" to see if there is a "Payjoin endpoint" input with a url.
  3. Sign your transaction using either BTCPay Server's hardware wallet support via BTCPay Vault or the hot wallet feature.
  4. Once your original transaction is ready, you will be given the option to either Broadcast (Payjoin) or to Broadcast (Simple). Choose Broadcast (Payjoin).
  5. The payjoin server will propose a new special transaction, if possible. If the payjoin server is unable to do the payjoin, the original transaction is broadcast instead.
  6. If you are using a hardware wallet, you will be asked to sign the payjoin transaction again (the hot wallet feature signs the transaction for you automatically).
  7. Congratulations, you've just helped improve Bitcoin's fungibility and your financial sovereignty!
Receive PayJoin in BTCPay Server
Receive PayJoin in BTCPay Server
Receive PayJoin in BTCPay Server
Receive PayJoin in BTCPay Server

# Why did a payjoin not happen?

There's multiple reasons for this:

  • The store did not have any utxos to contribute towards a payjoin
  • Your wallet does not use the same format as the store's (essential to not raise suspicion to analysis companies)
  • You are not using segwit or p2sh wrapped segwit.
  • The payjoin server is not available

# Supported wallets

Please contact and encourage your wallet developers to add support. The more widespread the usage of payjoin, the more broken the heuristics used by blockchain analysis companies become and can effectively trace your financial history. If you are a wallet developer, please contact us if you need help or have feedback.

- + diff --git a/PaymentRequests/index.html b/PaymentRequests/index.html index 5faef19752..35d03465ae 100644 --- a/PaymentRequests/index.html +++ b/PaymentRequests/index.html @@ -9,7 +9,7 @@ - + @@ -75,6 +75,6 @@ →

- + diff --git a/Payouts/index.html b/Payouts/index.html index 6a1c3056ba..c32c0b4ee4 100644 --- a/Payouts/index.html +++ b/Payouts/index.html @@ -9,7 +9,7 @@ - + @@ -81,6 +81,6 @@ →

- + diff --git a/Payroll/index.html b/Payroll/index.html index b2c4fdacc1..4979255c0d 100644 --- a/Payroll/index.html +++ b/Payroll/index.html @@ -9,7 +9,7 @@ - + @@ -58,10 +58,8 @@ GitHub (opens new window)

# Payroll Plugin for BTCPay Server

The Payroll Plugin for BTCPay Server aims to streamline the payroll process by providing an easy-to-use interface for uploading invoices and facilitating payments. -This plugin enables administrators to manage payroll users, inspect invoices, and initiate payments seamlessly within the BTCPay Server.

# Usage

  • Install the plugin from the BTCPay Server > Settings > Plugin > Available Plugins, and restart
Payroll Plugin
  • Once done, you'll see the Payroll plugin listed under plugins in the left sidebar of BTCPay Server

  • You can create a payroll user for each person that needs access to the system. It is recommended that you generate strong passwords and share the login link with the respective users

  • To do that click on the manage users button on the top right, then click on the create user button.

Manage User
Create User
  • Do well to fill in the form with the appropriate information, and also with a strong password.
  • As an admin, you can go ahead and upload invoices manually for users by going to the Payroll Invoice section and clicking on admin upload invoice.
  • The admin can share links to the invoice page with users, allowing users to log in and manually upload their invoice.
Share Invoice upload link
  • Once invoices are uploaded, the admin has the ability to pay the invoice(s), download invoice(s), and also mark an invoice as paid, if it has been initially signed off my the admin.
  • When an admin clicks on pay invoice, it takes them to a Bitcoin wallet with a prepopulated Send dialog (the amount of Bitcoin is calculated automatically, based on current conversion rates)
  • The admin can then sign the generated transaction and broadcast it.
  • Once the transaction is confirmed on the blockchain, the payroll invoice state will be updated to Completed
  • The admin can also manage payroll users. The admin can do all of the following: -
    • An admin can reset passwords for users
    • An admin can disable/activate payroll users
    • An admin can edit payroll users
    • An admin can also download invoices belonging to a particular user

# Contributing to plugin development

This documentation is a work in progress. You can contribute by improving it. -Also, a list of open issues is maintained on: https://github.com/rockstardev/BTCPayServerPlugins.RockstarDev/issues?q=is%3Aissue+is%3Aopen+label%3Apayroll -If the issue is not assigned to anyone, feel free to pick it up and open a PR

# License

https://github.com/rockstardev/BTCPayServerPlugins.RockstarDev/blob/master/LICENSE

- + diff --git a/PhocaCart/index.html b/PhocaCart/index.html index 037ca67ebb..197e759e30 100644 --- a/PhocaCart/index.html +++ b/PhocaCart/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

- + diff --git a/PodServer/index.html b/PodServer/index.html index ea63bda8dc..c684ae71d5 100644 --- a/PodServer/index.html +++ b/PodServer/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

- + diff --git a/PrestaShop/index.html b/PrestaShop/index.html index 2afc08bc47..65ab78e5ff 100644 --- a/PrestaShop/index.html +++ b/PrestaShop/index.html @@ -9,7 +9,7 @@ - + @@ -70,6 +70,6 @@ →

- + diff --git a/PullPayments/index.html b/PullPayments/index.html index c6524c35a6..44babee5f1 100644 --- a/PullPayments/index.html +++ b/PullPayments/index.html @@ -9,7 +9,7 @@ - + @@ -100,6 +100,6 @@ 6
  • Clicking on the notification brings the sender to a page listing all outstanding payouts 7
  • Check the payout to approve, pay and confirm 8
  • You are then brought to the normal wallet user interface of BTCPay Server
  • WARNING

    Clicking on Confirm selected payouts will use the current exchange rate of your wallet's store settings. The rate is then fixed, even if you don't complete the payment. Payments made at a later time will use this previously confirmed rate.

    # Additional use cases for the Pull Payments feature

    The Pull Payment feature can be used in multiple applications, the first one being Refunds.

    - + diff --git a/Refund/index.html b/Refund/index.html index 7eb94debc6..1103048459 100644 --- a/Refund/index.html +++ b/Refund/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

    - + diff --git a/RegisterAccount/index.html b/RegisterAccount/index.html index 2bd2ad47eb..6d02e2cc67 100644 --- a/RegisterAccount/index.html +++ b/RegisterAccount/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/Reporting/index.html b/Reporting/index.html index 05ad368ffd..f530ec0479 100644 --- a/Reporting/index.html +++ b/Reporting/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ (opens new window)

    - + diff --git a/Shopify/index.html b/Shopify/index.html index 27167972fd..12d64e6b45 100644 --- a/Shopify/index.html +++ b/Shopify/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/Shopware/index.html b/Shopware/index.html index 2116b00a22..9d74f59035 100644 --- a/Shopware/index.html +++ b/Shopware/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/SideShift/index.html b/SideShift/index.html index 520c14fd4c..45a12bd1eb 100644 --- a/SideShift/index.html +++ b/SideShift/index.html @@ -9,7 +9,7 @@ - + @@ -75,6 +75,6 @@ →

    - + diff --git a/Sign-PSBT-with-sparrow-wallet/index.html b/Sign-PSBT-with-sparrow-wallet/index.html index 98f473f871..d631015cfa 100644 --- a/Sign-PSBT-with-sparrow-wallet/index.html +++ b/Sign-PSBT-with-sparrow-wallet/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

    # Creating a PSBT with BTCPay Server and Sparrow wallet

    This guide explains how you can create a partially signed bitcoin transaction (PSBT) on BTCPay Server and sign and broadcast it with Sparrow wallet (opens new window). We use BitBox02 (opens new window) hardware wallet in this example, but it will work with any other supported hardware wallet. This can be useful if you have an airgapped setup or persons creating the transaction and signing it are different people.

    # 1. Creating a transaction (on BTCPay Server):

    • Log into your BTCPay Server and select the store you want to send from
    • Under "Wallets" select "Bitcoin"
    • Click on button [Send]

    # On send screen:

    BTCPay: Create transaction on BTCPay Server
    • Enter the destination bitcoin address
    • Enter the amount
    • Optional: Change fee rate (get the current fee rate on mempool.space (opens new window) depending on how fast you want the transaction to be confirmed)
    • Important: click on "Advanced Settings" so it expands and check "Always include non-witness UTXO if available" (this is needed so hardware wallets like BitBox02 can sign the transaction)
    • Optional: on "Allow fee increase (RBF)", set to "Yes" (this is useful if you select a too low fee you can bump the fee so your transaction is not stuck and get’s confirmed)
    • Click [Sign transaction] button

    # On choosing signing method screen:

    BTCPay: Choose signing method: Partially Signed Bitcoin Transaction
    • Select "Partially Signed Bitcoin Transaction"

    # On PSBT screen:

    BTCPay: Download the PSBT file
    • Open the accordion of "Export PSBT for signing" click on button [Download PSBT file]
    • Store the file on hard-drive (you can use it to sign the PSBT yourself, or you can send it to somebody doing the signing on Sparrow wallet, see below); e.g. psbt-export.psbt

    # 2. Signing and sending the PSBT (on Sparrow wallet)

    • Open your Sparrow wallet app and corresponding wallet holding the data for the xPub used in your store
    • Next, import the PSBT file you created on BTCPay Server
    • In menu: File -> Open Transaction -> File...
    • Select the file you stored (or got sent from accounting) e.g. psbt-export.psbt

    # On showing the imported PSBT transaction:

    Sparrow wallet: Load the PSBT file
    • Make sure under headline "Signatures:" the "signing wallet" matches the wallet you want to sent from
    • Click on [Finalize Transaction for Signing]

    # Signing the transaction:

    Sparrow wallet: PSBT loaded, ready for signing
    • Click on [Sign]

    # Connect Hardware wallet popup:

    Sparrow wallet: connect to hardware wallet (e.g. in our case BitBox02)
    • Plug-in your hardware wallet (BitBox02 in our case)
    • Enter your hardware wallet pin (for BitBox02 it shows on screen open BitBox app but you do not need to, wait until you can enter the pin)
    • After BitBox02 unlocked, click [Scan...], your hardware wallet will show up

    # Wallet connected successfully:

    Sparrow wallet: hardware wallet successfully connected
    • Click [Sign]
    • A summary of the transaction will be shown on the BitBox02 device, you need to confirm it there

    # Broadcasting the transaction:

    Sparrow wallet: broadcast the transaction
    • After signing was successful you need to broadcast the transaction to the Bitcoin network
    • Click [Broadcast Transaction]

    TIP

    Alternatively, instead of broadcasting the transaction from Sparrow wallet (e.g. if you have an airgapped setup) you could also copy and paste the signed transaction PSBT from the textbox and upload it to your BTCPay Server and let it broadcast the transaction to the network.

    Congrats, done!

    - + diff --git a/Smartstore/index.html b/Smartstore/index.html index df1bdd0c40..133307d886 100644 --- a/Smartstore/index.html +++ b/Smartstore/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/Support/index.html b/Support/index.html index 922ac48bbf..52ec68c67b 100644 --- a/Support/index.html +++ b/Support/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

    - + diff --git a/TicketTailor/index.html b/TicketTailor/index.html index 81d5ceeca2..51ae722a59 100644 --- a/TicketTailor/index.html +++ b/TicketTailor/index.html @@ -9,7 +9,7 @@ - + @@ -69,6 +69,6 @@ →

    - + diff --git a/Translations/index.html b/Translations/index.html index ce7640ca42..b284700a30 100644 --- a/Translations/index.html +++ b/Translations/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/Transmuter/DCA/index.html b/Transmuter/DCA/index.html index da261714ef..4fd085b3b8 100644 --- a/Transmuter/DCA/index.html +++ b/Transmuter/DCA/index.html @@ -9,7 +9,7 @@ - + @@ -73,6 +73,6 @@ →

    - + diff --git a/Transmuter/EmailReceiptsPreset/index.html b/Transmuter/EmailReceiptsPreset/index.html index 96503e532c..d27863b919 100644 --- a/Transmuter/EmailReceiptsPreset/index.html +++ b/Transmuter/EmailReceiptsPreset/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

    - + diff --git a/Transmuter/index.html b/Transmuter/index.html index 6ca4ca0edd..84da440cf4 100644 --- a/Transmuter/index.html +++ b/Transmuter/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ There must be a class implementing BtcTransmuterExtension in this library. This file bootstraps the plugin name and adds all the services to system on startup.

    # Adding a Trigger

    # Adding an Action

    # Adding an External Service

    - + diff --git a/Trocador/index.html b/Trocador/index.html index e485ba4eeb..107941ecb1 100644 --- a/Trocador/index.html +++ b/Trocador/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/Troubleshooting/index.html b/Troubleshooting/index.html index e11bc5252f..e97f695b47 100644 --- a/Troubleshooting/index.html +++ b/Troubleshooting/index.html @@ -9,7 +9,7 @@ - + @@ -98,6 +98,6 @@ →

    - + diff --git a/TryItOut/index.html b/TryItOut/index.html index 822e9177c4..c8f7831f00 100644 --- a/TryItOut/index.html +++ b/TryItOut/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/UseCase/index.html b/UseCase/index.html index f460481bbf..ef93ff53b9 100644 --- a/UseCase/index.html +++ b/UseCase/index.html @@ -9,7 +9,7 @@ - + @@ -66,6 +66,6 @@ →

    - + diff --git a/Vault/HowToVerify/index.html b/Vault/HowToVerify/index.html index 91adc1ad36..f5a1c48a6d 100644 --- a/Vault/HowToVerify/index.html +++ b/Vault/HowToVerify/index.html @@ -9,7 +9,7 @@ - + @@ -83,6 +83,6 @@ →

    - + diff --git a/VirtueMart/index.html b/VirtueMart/index.html index c1d263d12e..e141e4e7c1 100644 --- a/VirtueMart/index.html +++ b/VirtueMart/index.html @@ -9,7 +9,7 @@ - + @@ -88,6 +88,6 @@ →

    - + diff --git a/Wabisabi/index.html b/Wabisabi/index.html index 0630edb373..8192a10716 100644 --- a/Wabisabi/index.html +++ b/Wabisabi/index.html @@ -9,7 +9,7 @@ - + @@ -88,6 +88,6 @@ →

    - + diff --git a/Walkthrough/index.html b/Walkthrough/index.html index 9af493b133..3971a49ddd 100644 --- a/Walkthrough/index.html +++ b/Walkthrough/index.html @@ -9,7 +9,7 @@ - + @@ -80,6 +80,6 @@ →

    - + diff --git a/Wallet/index.html b/Wallet/index.html index a5d321cdee..c493b4629b 100644 --- a/Wallet/index.html +++ b/Wallet/index.html @@ -9,7 +9,7 @@ - + @@ -63,6 +63,6 @@ Here, you have the options to perform several actions on your wallet, such Rescanning wallet for missing transactions, prunning old transactions, view wallet phrase, remove wallet among features.

    Wallet Rescan

    If you manually added the extended public key from an external wallet, you'd need to adjust AccountKeyPath that you can find in your external wallet, for example m/84'/0'/0' to be able to spend from the BTCPay Wallet.

    In wallet settings you will also find the speed policy for the specific store. There are 2 main settings under Payment, Payment invalid if transaction fails to confirm in ... after invoice creation and Consider the invoice confirmed when the payment transaction.... The latter lets you set the number of confirmations required to be recognized as settled.

    Wallet settings

    # Re-scan

    The Rescan relies on Bitcoin Core 0.17.0's scantxoutset to scan the current state of the blockchain (called UTXO Set) for coins belonging to the configured derivation scheme.

    Wallet Rescan

    Wallet re-scan solves two critical problems for BTCPay users:

    1. Gap limit
    2. Importing a previously used wallet

    Gap limit: Most wallets typically have the address gap limit set to 20. This means that if a merchant receives 21 or more consecutive unpaid invoices, those wallets show the incorrect balance and some transactions may not be visible.

    Wallet import: When users add a derivation scheme of a wallet that had transactions in the past (previously used wallet), BTCPay won't be able to show the balance and transactions from the past.

    Wallet rescan progress

    Re-scan is a feature that solves both of these problems. Once the scan is complete, BTCPay Server will show the correct balance, along with the past transactions of the wallet.

    Wallet re-scan requires access to the full node which means that this function is only available for server owners.

    Users who use a third-party host should use a newly generated xpub key and also use an external wallet like Electrum which allows them to increase the gap limit.

    # Labels

    At the bottom of your wallet settings, you can manage your custom transaction label.

    Clicking on the link would take you to a page where you can view all custom labels associated to all transaction. You can remove any or all custom labels given the required permission.

    Wallet settings
    - + diff --git a/WalletSetup/index.html b/WalletSetup/index.html index 7637ddc72f..e5862c6dfd 100644 --- a/WalletSetup/index.html +++ b/WalletSetup/index.html @@ -9,7 +9,7 @@ - + @@ -58,6 +58,6 @@ GitHub (opens new window)

    # (3) Wallet Setup

    After account registration and store creation, it's time to configure a wallet in your BTCPay Server, so that you can start receiving payments into it.

    There are two ways to set up a wallet in BTCPay Server:

    There are many options on how set up a wallet with your BTCPay Server. It's up to you to decide what works best for your use-case. Once you configure a wallet, you're all set. The next step, is to start exploring the features.

    Proceed to the next step - What's Next?.

    - + diff --git a/WasabiWallet/index.html b/WasabiWallet/index.html index 6de91d873c..5b493bfb40 100644 --- a/WasabiWallet/index.html +++ b/WasabiWallet/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ After the loading is done and the wallet is opened, click on the 3 dots at the top right corner to go to Wallet Info .

    Wasabi Find Wallet Info

    Select and copy the Extended Account Public Key. This is the public key from which BTCPay will derive addresses. This cannot be used to derive private keys and spend the bitcoin.

    Wasabi Extended Account Public Key

    # Setup store wallet

    1. Assuming you created a store and are now in the Dashboard. Click on Set up a wallet
    Connect Wasabi Wallet to BTCPay Server
    1. As you did the above steps in wasabi, Click Connect an existing wallet
    Connect Wasabi Wallet to BTCPay Server
    1. Choose Enter extended public key
    Connect Wasabi Wallet to BTCPay Server
    1. Paste the Extended Account Public Key into derivation scheme field as it is, without adding anything else and click Continue
    Connect Wasabi Wallet to BTCPay Server
    1. Return to the Wasabi Wallet. Click the Receive button and generate a new address.
    Wasabi Receive
    1. Compare the address you see in Wasabi Wallet to addresses shown in BTCPay Server. Find a match, continue.
    Connect Wasabi Wallet to BTCPay Server
    1. When you found a match, your wallet is now connected to the store.
    Connect Wasabi Wallet to BTCPay Server

    # Connecting Wasabi to BTCPay Server Full Node (If you're self-hosting BTCPay)

    After the wallets are connected, it is highly recommended to connect Wasabi Wallet to your full node in BTCPay. The process is easy but can only be done if you self-host BTCPay and are logged in as Admin. Tor has to be enabled in BTCPay (it is enabled by default). This process enhances privacy even further.

    In BTCPay, go Server Settings > Services > Full node P2P > See Information. On the BTCP-P2P page, click on the Show Confidential QR Code. Bellow the QR Code, there's a link See QR Code information by clicking here, so click on the link to reveal your string. Copy the string but remove bitcoin-p2p:// part.

    In Wasabi, go to the Bitcoin tab at Settings and paste the endpoint in Bitcoin P2P Endpoint.

    Restart Wasabi to apply the changes.

    # Configuring the Gap Limit in Wasabi

    At the search bar on top, click on Wallet Folder. Shortly the json file will be shown in a sub-folder. Open that file with a text editor like notepad. Find the line "MinGapLimit": 21, and change it to "MinGapLimit": 100, and save the file.

    There's no good answer to how much you should set the gap limit to. Most merchants set 100-200. If you're a big merchant with high transaction volume, you can try with even a higher gap limit.

    For more details about the Gap Limit, check the FAQ.

    Wasabi Wallet and BTCPay Server are now connected. Any payments received to your BTCPay will be visible in Wasabi, where you can further spend or mix them.

    - + diff --git a/WhatsNext/index.html b/WhatsNext/index.html index 57a2d190fb..d8436d360a 100644 --- a/WhatsNext/index.html +++ b/WhatsNext/index.html @@ -9,7 +9,7 @@ - + @@ -67,6 +67,6 @@ →

    - + diff --git a/Wix/index.html b/Wix/index.html index e33d7a884d..3348a32841 100644 --- a/Wix/index.html +++ b/Wix/index.html @@ -9,7 +9,7 @@ - + @@ -93,6 +93,6 @@ →

    - + diff --git a/WooCommerce/index.html b/WooCommerce/index.html index 489bcabfee..da3d616488 100644 --- a/WooCommerce/index.html +++ b/WooCommerce/index.html @@ -9,7 +9,7 @@ - + @@ -115,6 +115,6 @@ →

    - + diff --git a/Xenforo/index.html b/Xenforo/index.html index 1bd1f8c5d4..fa0d9ad328 100644 --- a/Xenforo/index.html +++ b/Xenforo/index.html @@ -9,7 +9,7 @@ - + @@ -68,6 +68,6 @@ →

    - + diff --git a/Zapier/index.html b/Zapier/index.html index b910fb5cf8..07c0c51223 100644 --- a/Zapier/index.html +++ b/Zapier/index.html @@ -9,7 +9,7 @@ - + @@ -77,6 +77,6 @@ →

    - + diff --git a/assets/js/101.c9b753cb.js b/assets/js/101.91ca5031.js similarity index 99% rename from assets/js/101.c9b753cb.js rename to assets/js/101.91ca5031.js index 63177e8089..efcc0c1efe 100644 --- a/assets/js/101.c9b753cb.js +++ b/assets/js/101.91ca5031.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[101],{768:function(e,t,a){"use strict";a.r(t);var i=a(17),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"accept-bitcoin-in-bigcommerce-with-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#accept-bitcoin-in-bigcommerce-with-btcpay-server"}},[e._v("#")]),e._v(" Accept Bitcoin in BigCommerce with BTCPay Server")]),e._v(" "),t("p",[e._v("Introducing BTCPay Server for BigCommerce an open-source payment gateway that enables you accept Bitcoin payments directly on your website or store from customers with no fees.")]),e._v(" "),t("p",[e._v("Our integration with "),t("a",{attrs:{href:"https://bigcommerce.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BigCommerce"),t("OutboundLink")],1),e._v(" allows you to connect your self-hosted BTCPay Server with your BigCommerce store, enabling you to accept Bitcoin payments seamlessly.")]),e._v(" "),t("h2",{attrs:{id:"why-choose-btcpay-for-your-bigcommerce-store"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-choose-btcpay-for-your-bigcommerce-store"}},[e._v("#")]),e._v(" Why Choose BTCPay for Your BigCommerce Store?")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("No Fees, No Hidden Costs")]),e._v(": BTCPay Server empowers your business with a truly fee-free payment solution. Enjoy every cent of your transactions without any deductions")]),e._v(" "),t("li",[t("strong",[e._v("Direct payment")]),e._v(": Say goodbye to intermediaries and lengthy KYC processes. Receive payments directly to your wallet with complete privacy")]),e._v(" "),t("li",[t("strong",[e._v("Automated Payment Processing")]),e._v(": BTCPay Server takes care of payments and invoice management automatically.")]),e._v(" "),t("li",[t("strong",[e._v("Great Checkout Experience")]),e._v(": Enhance customer experience with Bitcoin QR code displays during checkout.")]),e._v(" "),t("li",[t("strong",[e._v("Self-hosted infrastructure")]),e._v(": With BTCPay Server, you own your payment instances. You also maintain complete control over your payment infrastructure.")]),e._v(" "),t("li",[t("strong",[e._v("Easy data exports")]),e._v(": Easily export payment data with CSV files, making financial management a breeze.")]),e._v(" "),t("li",[t("strong",[e._v("Multilingual ready")]),e._v(": Serve a global audience right out of your corner.")]),e._v(" "),t("li",[t("strong",[e._v("Community-driven support")]),e._v(": Get responsive assistance from our dedicated community ("),t("a",{attrs:{href:"http://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1),e._v(").")])]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites:")]),e._v(" "),t("p",[e._v("Before diving into the setup process, ensure you have the following:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://login.bigcommerce.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("A BigCommerce Account"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("BTCPay Server - "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or run by a "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third-party host")]),e._v(" v2.0.0 or later.")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("Created BTCPay Server store")]),e._v(" with "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("wallet set up")])],1)]),e._v(" "),t("h2",{attrs:{id:"setting-up-btcpay-server-with-bigcommerce"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-btcpay-server-with-bigcommerce"}},[e._v("#")]),e._v(" Setting up BTCPay Server with BigCommerce")]),e._v(" "),t("h3",{attrs:{id:"install-the-plugin-on-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-the-plugin-on-btcpay-server"}},[e._v("#")]),e._v(" Install the plugin on BTCPay Server")]),e._v(" "),t("ol",[t("li",[e._v("In your BTCPay instance, navigate to Plugins=> Add New => BigCommerce")]),e._v(" "),t("li",[e._v("Restart BTCPay Server.")]),e._v(" "),t("li",[e._v("If successful, you'd see Bigcommerce included in the plugin section.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/fd08535d-8a6a-4d94-a55c-317b297858c1",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v("Click on it, it would display BigCommerce configuration page for BTCPay server where you can configure your credentials and also view your callback Urls.")]),e._v(" "),t("h3",{attrs:{id:"setup-the-bigcommerce-app"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-the-bigcommerce-app"}},[e._v("#")]),e._v(" Setup the BigCommerce app")]),e._v(" "),t("ol",[t("li",[e._v("Now, you need to create a BigCommerce application. go to "),t("a",{attrs:{href:"https://devtools.bigcommerce.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("devtools.bigcommerce.com"),t("OutboundLink")],1),e._v(" and click on Create an app button.")]),e._v(" "),t("li",[e._v("After inputting the name of the application, you'd need to fill more details about the application including the callback urls, permission and scopes, etc.\nFor the callback urls (auth, load, uninstall), you can copy it from your Bigcommerce plugin page on BTCPay Server, and prefill the inputs on your BigCommerce app.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/c359d350-54cd-465b-8b75-b4b55c23e5a0",alt:"image",title:"image"}})]),e._v(" "),t("ol",{attrs:{start:"3"}},[t("li",[e._v("There are also required permissions that you will need to grant the BigCommerce application for the integration to be successful. So from the OAuth scopes list, ensure you select the\nfollowing permissions and their access levels.\n"),t("ul",[t("li",[e._v("Orders => Modify")]),e._v(" "),t("li",[e._v("Order Transactions => Modify")]),e._v(" "),t("li",[e._v("Content => Modify")]),e._v(" "),t("li",[e._v("Checkout Content => Modify")]),e._v(" "),t("li",[e._v("Carts => Modify")]),e._v(" "),t("li",[e._v("Checkouts => Modify")]),e._v(" "),t("li",[e._v("Information & Settings => Read-Only")])])])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/a49d2d5e-8d28-4f8e-97d4-bfac64bd0b24",alt:"image",title:"image"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/9bbfc66d-e6c7-4ba9-8f47-16ed6eab29dd",alt:"image",title:"image"}})]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Go ahead and fill out other information about the application, once completed you can save.")]),e._v(" "),t("li",[e._v('Once your application is included in the app list, click on the "View Client Id" icon of the just created application to get the client Id and secret of the BigCommerce application.')]),e._v(" "),t("li",[e._v("Go back to your BigCommerce plugin on BTCPay server, and update the configuration details with the client Id and secret as copied from the BigCommerce application. Please ensure they are copied properly.")])]),e._v(" "),t("p",[e._v("P.S: It is important to note that you cannot assign a BigCommerce application credential to multiple stores on BTCPay Server.")]),e._v(" "),t("h3",{attrs:{id:"install-the-app-to-your-store-and-connect"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-the-app-to-your-store-and-connect"}},[e._v("#")]),e._v(" Install the app to your store and connect")]),e._v(" "),t("p",[e._v("Once you have completed the above steps, it is time to install your BigCommerce application in your store and start receiving payment using Bitcoin.")]),e._v(" "),t("ol",[t("li",[e._v("Login to your "),t("a",{attrs:{href:"https://login.bigcommerce.com/login/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BigCommerce"),t("OutboundLink")],1),e._v(", Navigate to Apps => MyApps")]),e._v(" "),t("li",[e._v('Select "My Draft Apps", there you would see a list of all your BigCommerce application that you\'ve set up including this newly created application.')]),e._v(" "),t("li",[e._v('Hover on your newly created application and click on "Learn more"')]),e._v(" "),t("li",[e._v("It would take you to a page containing your application details including permissions granted to the application, with a button to install.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/a6b2ea8b-5d2b-44ee-a359-d471cc52a834",alt:"image",title:"image"}})]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[e._v("Click on the install button, acknowledge that PCI-DSS compliance, and confirm the installation.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/aa2dd84a-d54a-4f10-83e7-f7b9bc9c4e57",alt:"image",title:"image"}})]),e._v(" "),t("ol",{attrs:{start:"6"}},[t("li",[e._v("Once the installation is successful, you should see the application listed on the Apps section of your navigation panel.")])]),e._v(" "),t("p",[e._v('You manually need to create an offline payment method containing "Bitcoin" (e.g. Bitcoin / Lightning Network) in the BigCommerce store under Settings => Setup => Payments => Additional providers')]),e._v(" "),t("h3",{attrs:{id:"verify-script-installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#verify-script-installation"}},[e._v("#")]),e._v(" Verify script installation")]),e._v(" "),t("p",[e._v("Two more steps to go. First, we need to verify that the checkout script was updated successfully on your store.")]),e._v(" "),t("ol",[t("li",[e._v("Navigate to StoreFront => Script Manager.")]),e._v(" "),t("li",[e._v("Confirm you have a script with the name: btcpay-checkout, with date-installed corresponding to the date at which the app was installed. If you do, you are good to go.")]),e._v(" "),t("li",[e._v("If you dont, kindly verify the permissions granted and retry the installation process.")])]),e._v(" "),t("h3",{attrs:{id:"create-an-offline-payment-method"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-an-offline-payment-method"}},[e._v("#")]),e._v(" Create an offline payment method")]),e._v(" "),t("p",[e._v("Now that we have the checkout scripts uploaded to the BigCommerce application, we need to configure an offline payment method. This is the important for checkout payment.")]),e._v(" "),t("p",[e._v("On your BigCommerce dashboard, navigate to Settings => Setup => Payments => Additional providers")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/24bf27d4-ab73-4f50-9b95-442a2556db75",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v('From the list of Offline payment method, choose "Money Order" and then click "Set up" button. It would take you to the configuration page for Money Order payment method.')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/057c6c32-8177-48bf-9754-0759d138c3ca",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v('We need to change the Display name for this guide. Let\'s name it "Bitcoin / Lightning Network" or "Bitcoin Payment". You can input the display name of your choice when configuring this, however the name inputted must include the word "bitcoin" so it can be detected by BTCPay Server as shown below')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/31f766b1-a489-49a2-a11b-7d4eada45269",alt:"image",title:"image"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/30b2e9a4-5785-4f17-929f-98c666ae81d1",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v("Once the name has been updated, go ahead and save the changes.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/28eacef7-4587-458f-b3d8-3d6ac4764cf3",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v("Now if you return to the Offline payment method list, we should see Money Order checked.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/df0ddb1e-c487-466c-96de-ad2dc6818e96",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v("Now you are ready to receive Bitcoin payment from your BigCommerce store.")]),e._v(" "),t("h2",{attrs:{id:"how-to-receive-payment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-receive-payment"}},[e._v("#")]),e._v(" How to receive payment:")]),e._v(" "),t("p",[e._v("On the checkout page, after all necessary information has been inputted, the payment screen would be similar to this:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/afde799b-5c27-470c-b175-fb27233e6ff8",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v('From the payment providers listed, select "Bitcoin/Lightning Network".')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/da589c8f-f3de-4c63-9776-36aae9be574d",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v('Notice that the button now changes to "Pay with Bitcoin".')]),e._v(" "),t("p",[e._v('To complete the payment, the customer clicks on the the "Pay with Bitcoin" button. The QR code would pop on the screen with an option to pay directly through the customer\'s wallet.')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/0f3073c3-e0e5-464e-b879-0bfe37384eaf",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v("Once the payment is complete and confirmed, an invoice is then successfully created on the merchant BTCPay instance as well as the payment.")]),e._v(" "),t("h2",{attrs:{id:"big-commerce-uninstall"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#big-commerce-uninstall"}},[e._v("#")]),e._v(" Big Commerce Uninstall")]),e._v(" "),t("p",[e._v("Once you uninstall the application, the client Id and the client secret is also deleted from the store and can be reused by another store, or the same store with a new application.\nSo if you uninstalled, and you want to still use the same store, go back to your BTCPay instance and save the clientId and secret.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[101],{770:function(e,t,a){"use strict";a.r(t);var i=a(17),o=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"accept-bitcoin-in-bigcommerce-with-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#accept-bitcoin-in-bigcommerce-with-btcpay-server"}},[e._v("#")]),e._v(" Accept Bitcoin in BigCommerce with BTCPay Server")]),e._v(" "),t("p",[e._v("Introducing BTCPay Server for BigCommerce an open-source payment gateway that enables you accept Bitcoin payments directly on your website or store from customers with no fees.")]),e._v(" "),t("p",[e._v("Our integration with "),t("a",{attrs:{href:"https://bigcommerce.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BigCommerce"),t("OutboundLink")],1),e._v(" allows you to connect your self-hosted BTCPay Server with your BigCommerce store, enabling you to accept Bitcoin payments seamlessly.")]),e._v(" "),t("h2",{attrs:{id:"why-choose-btcpay-for-your-bigcommerce-store"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-choose-btcpay-for-your-bigcommerce-store"}},[e._v("#")]),e._v(" Why Choose BTCPay for Your BigCommerce Store?")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("No Fees, No Hidden Costs")]),e._v(": BTCPay Server empowers your business with a truly fee-free payment solution. Enjoy every cent of your transactions without any deductions")]),e._v(" "),t("li",[t("strong",[e._v("Direct payment")]),e._v(": Say goodbye to intermediaries and lengthy KYC processes. Receive payments directly to your wallet with complete privacy")]),e._v(" "),t("li",[t("strong",[e._v("Automated Payment Processing")]),e._v(": BTCPay Server takes care of payments and invoice management automatically.")]),e._v(" "),t("li",[t("strong",[e._v("Great Checkout Experience")]),e._v(": Enhance customer experience with Bitcoin QR code displays during checkout.")]),e._v(" "),t("li",[t("strong",[e._v("Self-hosted infrastructure")]),e._v(": With BTCPay Server, you own your payment instances. You also maintain complete control over your payment infrastructure.")]),e._v(" "),t("li",[t("strong",[e._v("Easy data exports")]),e._v(": Easily export payment data with CSV files, making financial management a breeze.")]),e._v(" "),t("li",[t("strong",[e._v("Multilingual ready")]),e._v(": Serve a global audience right out of your corner.")]),e._v(" "),t("li",[t("strong",[e._v("Community-driven support")]),e._v(": Get responsive assistance from our dedicated community ("),t("a",{attrs:{href:"http://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1),e._v(").")])]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites:")]),e._v(" "),t("p",[e._v("Before diving into the setup process, ensure you have the following:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://login.bigcommerce.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("A BigCommerce Account"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("BTCPay Server - "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or run by a "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third-party host")]),e._v(" v2.0.0 or later.")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("Created BTCPay Server store")]),e._v(" with "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("wallet set up")])],1)]),e._v(" "),t("h2",{attrs:{id:"setting-up-btcpay-server-with-bigcommerce"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-btcpay-server-with-bigcommerce"}},[e._v("#")]),e._v(" Setting up BTCPay Server with BigCommerce")]),e._v(" "),t("h3",{attrs:{id:"install-the-plugin-on-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-the-plugin-on-btcpay-server"}},[e._v("#")]),e._v(" Install the plugin on BTCPay Server")]),e._v(" "),t("ol",[t("li",[e._v("In your BTCPay instance, navigate to Plugins=> Add New => BigCommerce")]),e._v(" "),t("li",[e._v("Restart BTCPay Server.")]),e._v(" "),t("li",[e._v("If successful, you'd see Bigcommerce included in the plugin section.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/fd08535d-8a6a-4d94-a55c-317b297858c1",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v("Click on it, it would display BigCommerce configuration page for BTCPay server where you can configure your credentials and also view your callback Urls.")]),e._v(" "),t("h3",{attrs:{id:"setup-the-bigcommerce-app"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-the-bigcommerce-app"}},[e._v("#")]),e._v(" Setup the BigCommerce app")]),e._v(" "),t("ol",[t("li",[e._v("Now, you need to create a BigCommerce application. go to "),t("a",{attrs:{href:"https://devtools.bigcommerce.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("devtools.bigcommerce.com"),t("OutboundLink")],1),e._v(" and click on Create an app button.")]),e._v(" "),t("li",[e._v("After inputting the name of the application, you'd need to fill more details about the application including the callback urls, permission and scopes, etc.\nFor the callback urls (auth, load, uninstall), you can copy it from your Bigcommerce plugin page on BTCPay Server, and prefill the inputs on your BigCommerce app.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/c359d350-54cd-465b-8b75-b4b55c23e5a0",alt:"image",title:"image"}})]),e._v(" "),t("ol",{attrs:{start:"3"}},[t("li",[e._v("There are also required permissions that you will need to grant the BigCommerce application for the integration to be successful. So from the OAuth scopes list, ensure you select the\nfollowing permissions and their access levels.\n"),t("ul",[t("li",[e._v("Orders => Modify")]),e._v(" "),t("li",[e._v("Order Transactions => Modify")]),e._v(" "),t("li",[e._v("Content => Modify")]),e._v(" "),t("li",[e._v("Checkout Content => Modify")]),e._v(" "),t("li",[e._v("Carts => Modify")]),e._v(" "),t("li",[e._v("Checkouts => Modify")]),e._v(" "),t("li",[e._v("Information & Settings => Read-Only")])])])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/a49d2d5e-8d28-4f8e-97d4-bfac64bd0b24",alt:"image",title:"image"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/9bbfc66d-e6c7-4ba9-8f47-16ed6eab29dd",alt:"image",title:"image"}})]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Go ahead and fill out other information about the application, once completed you can save.")]),e._v(" "),t("li",[e._v('Once your application is included in the app list, click on the "View Client Id" icon of the just created application to get the client Id and secret of the BigCommerce application.')]),e._v(" "),t("li",[e._v("Go back to your BigCommerce plugin on BTCPay server, and update the configuration details with the client Id and secret as copied from the BigCommerce application. Please ensure they are copied properly.")])]),e._v(" "),t("p",[e._v("P.S: It is important to note that you cannot assign a BigCommerce application credential to multiple stores on BTCPay Server.")]),e._v(" "),t("h3",{attrs:{id:"install-the-app-to-your-store-and-connect"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#install-the-app-to-your-store-and-connect"}},[e._v("#")]),e._v(" Install the app to your store and connect")]),e._v(" "),t("p",[e._v("Once you have completed the above steps, it is time to install your BigCommerce application in your store and start receiving payment using Bitcoin.")]),e._v(" "),t("ol",[t("li",[e._v("Login to your "),t("a",{attrs:{href:"https://login.bigcommerce.com/login/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BigCommerce"),t("OutboundLink")],1),e._v(", Navigate to Apps => MyApps")]),e._v(" "),t("li",[e._v('Select "My Draft Apps", there you would see a list of all your BigCommerce application that you\'ve set up including this newly created application.')]),e._v(" "),t("li",[e._v('Hover on your newly created application and click on "Learn more"')]),e._v(" "),t("li",[e._v("It would take you to a page containing your application details including permissions granted to the application, with a button to install.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/a6b2ea8b-5d2b-44ee-a359-d471cc52a834",alt:"image",title:"image"}})]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[e._v("Click on the install button, acknowledge that PCI-DSS compliance, and confirm the installation.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/aa2dd84a-d54a-4f10-83e7-f7b9bc9c4e57",alt:"image",title:"image"}})]),e._v(" "),t("ol",{attrs:{start:"6"}},[t("li",[e._v("Once the installation is successful, you should see the application listed on the Apps section of your navigation panel.")])]),e._v(" "),t("p",[e._v('You manually need to create an offline payment method containing "Bitcoin" (e.g. Bitcoin / Lightning Network) in the BigCommerce store under Settings => Setup => Payments => Additional providers')]),e._v(" "),t("h3",{attrs:{id:"verify-script-installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#verify-script-installation"}},[e._v("#")]),e._v(" Verify script installation")]),e._v(" "),t("p",[e._v("Two more steps to go. First, we need to verify that the checkout script was updated successfully on your store.")]),e._v(" "),t("ol",[t("li",[e._v("Navigate to StoreFront => Script Manager.")]),e._v(" "),t("li",[e._v("Confirm you have a script with the name: btcpay-checkout, with date-installed corresponding to the date at which the app was installed. If you do, you are good to go.")]),e._v(" "),t("li",[e._v("If you dont, kindly verify the permissions granted and retry the installation process.")])]),e._v(" "),t("h3",{attrs:{id:"create-an-offline-payment-method"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-an-offline-payment-method"}},[e._v("#")]),e._v(" Create an offline payment method")]),e._v(" "),t("p",[e._v("Now that we have the checkout scripts uploaded to the BigCommerce application, we need to configure an offline payment method. This is the important for checkout payment.")]),e._v(" "),t("p",[e._v("On your BigCommerce dashboard, navigate to Settings => Setup => Payments => Additional providers")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/24bf27d4-ab73-4f50-9b95-442a2556db75",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v('From the list of Offline payment method, choose "Money Order" and then click "Set up" button. It would take you to the configuration page for Money Order payment method.')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/057c6c32-8177-48bf-9754-0759d138c3ca",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v('We need to change the Display name for this guide. Let\'s name it "Bitcoin / Lightning Network" or "Bitcoin Payment". You can input the display name of your choice when configuring this, however the name inputted must include the word "bitcoin" so it can be detected by BTCPay Server as shown below')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/31f766b1-a489-49a2-a11b-7d4eada45269",alt:"image",title:"image"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/30b2e9a4-5785-4f17-929f-98c666ae81d1",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v("Once the name has been updated, go ahead and save the changes.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/28eacef7-4587-458f-b3d8-3d6ac4764cf3",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v("Now if you return to the Offline payment method list, we should see Money Order checked.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/df0ddb1e-c487-466c-96de-ad2dc6818e96",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v("Now you are ready to receive Bitcoin payment from your BigCommerce store.")]),e._v(" "),t("h2",{attrs:{id:"how-to-receive-payment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-receive-payment"}},[e._v("#")]),e._v(" How to receive payment:")]),e._v(" "),t("p",[e._v("On the checkout page, after all necessary information has been inputted, the payment screen would be similar to this:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/afde799b-5c27-470c-b175-fb27233e6ff8",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v('From the payment providers listed, select "Bitcoin/Lightning Network".')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/da589c8f-f3de-4c63-9776-36aae9be574d",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v('Notice that the button now changes to "Pay with Bitcoin".')]),e._v(" "),t("p",[e._v('To complete the payment, the customer clicks on the the "Pay with Bitcoin" button. The QR code would pop on the screen with an option to pay directly through the customer\'s wallet.')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/user-attachments/assets/0f3073c3-e0e5-464e-b879-0bfe37384eaf",alt:"image",title:"image"}})]),e._v(" "),t("p",[e._v("Once the payment is complete and confirmed, an invoice is then successfully created on the merchant BTCPay instance as well as the payment.")]),e._v(" "),t("h2",{attrs:{id:"big-commerce-uninstall"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#big-commerce-uninstall"}},[e._v("#")]),e._v(" Big Commerce Uninstall")]),e._v(" "),t("p",[e._v("Once you uninstall the application, the client Id and the client secret is also deleted from the store and can be reused by another store, or the same store with a new application.\nSo if you uninstalled, and you want to still use the same store, go back to your BTCPay instance and save the clientId and secret.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/102.95f1048f.js b/assets/js/102.2830eb25.js similarity index 98% rename from assets/js/102.95f1048f.js rename to assets/js/102.2830eb25.js index 5504e3722a..025d5e8262 100644 --- a/assets/js/102.95f1048f.js +++ b/assets/js/102.2830eb25.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[102],{769:function(e,t,n){"use strict";n.r(t);var i=n(17),a=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"breez-lightning-support-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#breez-lightning-support-plugin"}},[e._v("#")]),e._v(" Breez lightning support plugin")]),e._v(" "),t("h2",{attrs:{id:"beta-release"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#beta-release"}},[e._v("#")]),e._v(" BETA RELEASE")]),e._v(" "),t("p",[e._v("Allows you to enable lightning on your stores using "),t("a",{attrs:{href:"https://breez.technology/sdk/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Breez SDK"),t("OutboundLink")],1),e._v(", powered by "),t("a",{attrs:{href:"https://blockstream.com/lightning/greenlight/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Blockstream Greenlight"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Breez SDK and Greenlight enables you to have a non-custodial lightning experience, without hosting any of the infrastructure yourself.")]),e._v(" "),t("p",[e._v("Additionally, Breez SDK comes with built-in liquidity and channel automation, reducing the complexity of managing your lightning node.")]),e._v(" "),t("p",[e._v("If you have used any other wallet that uses Breez SDK, you can import it directly into BTCPay Server and continue using it in parallel.")]),e._v(" "),t("h2",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("ol",[t("li",[e._v("Install the plugin from the BTCPay Server > Settings > Plugin > Available Plugins, and restart")]),e._v(" "),t("li",[e._v("In your store > Wallets > Lightning, Configure Breez")]),e._v(" "),t("li",[e._v("You will be on a page asking for:\n"),t("ul",[t("li",[e._v("Mnemonic: This is your 12 word seed phrase. YOU SHOULD GENERATE THIS FROM A SEGWIT OR LEGACY SEGWIT WALLET AND KEEP IT SAFE. If you have used Breez before, you can use the same seed phrase you used in Breez. You can also use the seed phrase from your BTCPay hot wallet. This SEED PHRASE will be stored on BTCPAY SERVER. IF YOU USE A SHARED BTCPAY SERVER, YOU ARE EXPOSING YOUR SEED PHRASE TO THE SERVER ADMINISTRATOR. Type it in 'word word word...\" format.")]),e._v(" "),t("li",[e._v("Greenlight credentials: In the case of a new seed, you'll need to acquire certificates for issuing new nodes from Blockstream. You can get these for free at https://greenlight.blockstream.com. Select the entire "),t("code",[e._v("gl-certs.zip")]),e._v(" file provided by Greenlight.")]),e._v(" "),t("li",[e._v("Invite Code: Alternatively, you may have an invite code which can be used instead of the Greenlight credentials.")])])]),e._v(" "),t("li",[e._v("Click Save")]),e._v(" "),t("li",[e._v("Your new lightning node will be created.")]),e._v(" "),t("li",[e._v("Your first lightning invoice will have a relatively high minimum amount limit. This is because Breez SDK requires a minimum amount to be able to open a channel. A note on Inbound Liquidity - Breez appears to provide a low inbound liquidity at first and as you use it, it grants more inbound liquidity gradaully which puts you at risk of receiving partial paid invoices. But if you want instant channel inbound liquidity, use the Swap In feature to bring in Bitcoin, then create a lightning invoice from an outside lightning wallet such as Breez or Phoenix wallet, and pay it via the Payments tab in Breez. This lubricates the channels and your inbound liquidity will increase by the amount of your paid outbound invoice. You pay the channel open fee, instead of your customers. The amount you set your inbound liquidity is up to you so make it high enough that you don't have to regularly increase channel size which costs you sats down the road. For example, if you receive ten payments of 50,000 sats a month (500,000 sats), to start with 1.5 to 2 million sats channel at the beginning.")]),e._v(" "),t("li",[e._v("You can now use your lightning node to receive payments.")])]),e._v(" "),t("p",[e._v("NOTE: In the future, Blockstream Greenlight will offer a way to generate read-only access keys for your already issued node, so that you can use these instead of exposing your mnemonic phrase to BTCPay Server, allowing a lightweight, non-custodial lightning experience, even on shared BTCPay Server instances.")]),e._v(" "),t("h2",{attrs:{id:"additional-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-features"}},[e._v("#")]),e._v(" Additional features")]),e._v(" "),t("ul",[t("li",[e._v("Swap-in: Send and convert onchain funds to your Breez lightning nodes.")]),e._v(" "),t("li",[e._v("Swap-out: Send and convert lightning funds to your onchain wallet.")])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[102],{768:function(e,t,n){"use strict";n.r(t);var i=n(17),a=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"breez-lightning-support-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#breez-lightning-support-plugin"}},[e._v("#")]),e._v(" Breez lightning support plugin")]),e._v(" "),t("h2",{attrs:{id:"beta-release"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#beta-release"}},[e._v("#")]),e._v(" BETA RELEASE")]),e._v(" "),t("p",[e._v("Allows you to enable lightning on your stores using "),t("a",{attrs:{href:"https://breez.technology/sdk/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Breez SDK"),t("OutboundLink")],1),e._v(", powered by "),t("a",{attrs:{href:"https://blockstream.com/lightning/greenlight/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Blockstream Greenlight"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Breez SDK and Greenlight enables you to have a non-custodial lightning experience, without hosting any of the infrastructure yourself.")]),e._v(" "),t("p",[e._v("Additionally, Breez SDK comes with built-in liquidity and channel automation, reducing the complexity of managing your lightning node.")]),e._v(" "),t("p",[e._v("If you have used any other wallet that uses Breez SDK, you can import it directly into BTCPay Server and continue using it in parallel.")]),e._v(" "),t("h2",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("ol",[t("li",[e._v("Install the plugin from the BTCPay Server > Settings > Plugin > Available Plugins, and restart")]),e._v(" "),t("li",[e._v("In your store > Wallets > Lightning, Configure Breez")]),e._v(" "),t("li",[e._v("You will be on a page asking for:\n"),t("ul",[t("li",[e._v("Mnemonic: This is your 12 word seed phrase. YOU SHOULD GENERATE THIS FROM A SEGWIT OR LEGACY SEGWIT WALLET AND KEEP IT SAFE. If you have used Breez before, you can use the same seed phrase you used in Breez. You can also use the seed phrase from your BTCPay hot wallet. This SEED PHRASE will be stored on BTCPAY SERVER. IF YOU USE A SHARED BTCPAY SERVER, YOU ARE EXPOSING YOUR SEED PHRASE TO THE SERVER ADMINISTRATOR. Type it in 'word word word...\" format.")]),e._v(" "),t("li",[e._v("Greenlight credentials: In the case of a new seed, you'll need to acquire certificates for issuing new nodes from Blockstream. You can get these for free at https://greenlight.blockstream.com. Select the entire "),t("code",[e._v("gl-certs.zip")]),e._v(" file provided by Greenlight.")]),e._v(" "),t("li",[e._v("Invite Code: Alternatively, you may have an invite code which can be used instead of the Greenlight credentials.")])])]),e._v(" "),t("li",[e._v("Click Save")]),e._v(" "),t("li",[e._v("Your new lightning node will be created.")]),e._v(" "),t("li",[e._v("Your first lightning invoice will have a relatively high minimum amount limit. This is because Breez SDK requires a minimum amount to be able to open a channel. A note on Inbound Liquidity - Breez appears to provide a low inbound liquidity at first and as you use it, it grants more inbound liquidity gradaully which puts you at risk of receiving partial paid invoices. But if you want instant channel inbound liquidity, use the Swap In feature to bring in Bitcoin, then create a lightning invoice from an outside lightning wallet such as Breez or Phoenix wallet, and pay it via the Payments tab in Breez. This lubricates the channels and your inbound liquidity will increase by the amount of your paid outbound invoice. You pay the channel open fee, instead of your customers. The amount you set your inbound liquidity is up to you so make it high enough that you don't have to regularly increase channel size which costs you sats down the road. For example, if you receive ten payments of 50,000 sats a month (500,000 sats), to start with 1.5 to 2 million sats channel at the beginning.")]),e._v(" "),t("li",[e._v("You can now use your lightning node to receive payments.")])]),e._v(" "),t("p",[e._v("NOTE: In the future, Blockstream Greenlight will offer a way to generate read-only access keys for your already issued node, so that you can use these instead of exposing your mnemonic phrase to BTCPay Server, allowing a lightweight, non-custodial lightning experience, even on shared BTCPay Server instances.")]),e._v(" "),t("h2",{attrs:{id:"additional-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-features"}},[e._v("#")]),e._v(" Additional features")]),e._v(" "),t("ul",[t("li",[e._v("Swap-in: Send and convert onchain funds to your Breez lightning nodes.")]),e._v(" "),t("li",[e._v("Swap-out: Send and convert lightning funds to your onchain wallet.")])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/103.b2d2d3e3.js b/assets/js/103.0a6dbe25.js similarity index 97% rename from assets/js/103.b2d2d3e3.js rename to assets/js/103.0a6dbe25.js index 1de6a16c80..60b0ff1586 100644 --- a/assets/js/103.b2d2d3e3.js +++ b/assets/js/103.0a6dbe25.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{770:function(e,t,n){"use strict";n.r(t);var a=n(17),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"bringin-euro-offramp-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bringin-euro-offramp-plugin"}},[e._v("#")]),e._v(" Bringin Euro offramp plugin")]),e._v(" "),t("p",[e._v("Allows you to automatically forward received funds to Bringin, a Euro offramp provider.")]),e._v(" "),t("h2",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("ol",[t("li",[e._v("Install the plugin from the BTCPay Server > Settings > Plugin > Available Plugins, and restart")]),e._v(" "),t("li",[e._v('In the dashboard, or the side navigation, click on "Bringin" tostart configuring the plugin')]),e._v(" "),t("li",[e._v("You will need an API key, click on the onboarding link to start getting your account set up.")]),e._v(" "),t("li",[e._v("Once your account is set up, click on Integrations on the Bringin dashboard and get the API Key under BTCPay Server")]),e._v(" "),t("li",[e._v("Paste the API Key in the BTCPay Server plugin configuration, and new options should appear to configure the plugin")]),e._v(" "),t("li",[e._v("You can configure the available payment method options supported by Bringin, such as Lightning and On-chain.")]),e._v(" "),t("li",[e._v("Click Save")]),e._v(" "),t("li",[e._v("Make sure to configure payout processors so that payments to Bringin are automatically created.")])]),e._v(" "),t("h2",{attrs:{id:"flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#flow"}},[e._v("#")]),e._v(" Flow")]),e._v(" "),t("p",[e._v('When an invoice on your store is paid and settled, every payment is counted per payment type (lightning, on-chain coming soon), relative to the "percentage" configured (set to 0 to not enable this payment).\nOnce the threshold is reached, an order is created on Bringin, and a payout paying this order is created. A payout processor then picks this payout and sends it to Bringin. Once the payment settles, the funds are automatically converted to Euro and the balance is reflected in your Bringin account and the BTCPay Server Bringin widget.')])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[103],{769:function(e,t,n){"use strict";n.r(t);var a=n(17),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"bringin-euro-offramp-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bringin-euro-offramp-plugin"}},[e._v("#")]),e._v(" Bringin Euro offramp plugin")]),e._v(" "),t("p",[e._v("Allows you to automatically forward received funds to Bringin, a Euro offramp provider.")]),e._v(" "),t("h2",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("ol",[t("li",[e._v("Install the plugin from the BTCPay Server > Settings > Plugin > Available Plugins, and restart")]),e._v(" "),t("li",[e._v('In the dashboard, or the side navigation, click on "Bringin" tostart configuring the plugin')]),e._v(" "),t("li",[e._v("You will need an API key, click on the onboarding link to start getting your account set up.")]),e._v(" "),t("li",[e._v("Once your account is set up, click on Integrations on the Bringin dashboard and get the API Key under BTCPay Server")]),e._v(" "),t("li",[e._v("Paste the API Key in the BTCPay Server plugin configuration, and new options should appear to configure the plugin")]),e._v(" "),t("li",[e._v("You can configure the available payment method options supported by Bringin, such as Lightning and On-chain.")]),e._v(" "),t("li",[e._v("Click Save")]),e._v(" "),t("li",[e._v("Make sure to configure payout processors so that payments to Bringin are automatically created.")])]),e._v(" "),t("h2",{attrs:{id:"flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#flow"}},[e._v("#")]),e._v(" Flow")]),e._v(" "),t("p",[e._v('When an invoice on your store is paid and settled, every payment is counted per payment type (lightning, on-chain coming soon), relative to the "percentage" configured (set to 0 to not enable this payment).\nOnce the threshold is reached, an order is created on Bringin, and a payout paying this order is created. A payout processor then picks this payout and sends it to Bringin. Once the payment settles, the funds are automatically converted to Euro and the balance is reflected in your Bringin account and the BTCPay Server Bringin widget.')])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/106.36628569.js b/assets/js/106.2ffe956a.js similarity index 96% rename from assets/js/106.36628569.js rename to assets/js/106.2ffe956a.js index 6372ad7575..2f6e9ceb5c 100644 --- a/assets/js/106.36628569.js +++ b/assets/js/106.2ffe956a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[106],{776:function(e,t,r){"use strict";r.r(t);var n=r(17),s=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"design-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#design-btcpay-server"}},[e._v("#")]),e._v(" Design BTCPay Server")]),e._v(" "),t("h2",{attrs:{id:"why-designing-matters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-designing-matters"}},[e._v("#")]),e._v(" Why designing matters")]),e._v(" "),t("p",[e._v("Designing for BTCPay Server consists of improving overall experience for the end-user, making it easier to navigate the menus, options, etc...")]),e._v(" "),t("p",[e._v("To contribute design to BTCPay Server, check out the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/ux-ui",target:"_blank",rel:"noopener noreferrer"}},[e._v("UX/UI channel"),t("OutboundLink")],1),e._v(" for current discussions and the Figma "),t("a",{attrs:{href:"https://www.figma.com/file/C7Xyq0FlxgFW8vaBr8ht1z/BTCPAY?node-id=1766%3A1005",target:"_blank",rel:"noopener noreferrer"}},[e._v("getting started"),t("OutboundLink")],1),e._v(" section for the design projects that are currently being worked on.")]),e._v(" "),t("p",[e._v("Graphic content also helps promote BTCPay Server. Be it full scale logos, memes or other graphics, we're always enjoying seeing what contributors come up with.\nFollowing the "),t("a",{attrs:{href:"https://design.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Codified Design Guidelines"),t("OutboundLink")],1),e._v(" is "),t("strong",[e._v("required")]),e._v(" so that graphical content can be consistent between contributors.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[106],{783:function(e,t,r){"use strict";r.r(t);var n=r(17),s=Object(n.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"design-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#design-btcpay-server"}},[e._v("#")]),e._v(" Design BTCPay Server")]),e._v(" "),t("h2",{attrs:{id:"why-designing-matters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-designing-matters"}},[e._v("#")]),e._v(" Why designing matters")]),e._v(" "),t("p",[e._v("Designing for BTCPay Server consists of improving overall experience for the end-user, making it easier to navigate the menus, options, etc...")]),e._v(" "),t("p",[e._v("To contribute design to BTCPay Server, check out the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/ux-ui",target:"_blank",rel:"noopener noreferrer"}},[e._v("UX/UI channel"),t("OutboundLink")],1),e._v(" for current discussions and the Figma "),t("a",{attrs:{href:"https://www.figma.com/file/C7Xyq0FlxgFW8vaBr8ht1z/BTCPAY?node-id=1766%3A1005",target:"_blank",rel:"noopener noreferrer"}},[e._v("getting started"),t("OutboundLink")],1),e._v(" section for the design projects that are currently being worked on.")]),e._v(" "),t("p",[e._v("Graphic content also helps promote BTCPay Server. Be it full scale logos, memes or other graphics, we're always enjoying seeing what contributors come up with.\nFollowing the "),t("a",{attrs:{href:"https://design.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Codified Design Guidelines"),t("OutboundLink")],1),e._v(" is "),t("strong",[e._v("required")]),e._v(" so that graphical content can be consistent between contributors.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/107.f70f2678.js b/assets/js/107.3811d7a2.js similarity index 98% rename from assets/js/107.f70f2678.js rename to assets/js/107.3811d7a2.js index 4b8f147375..725272fb94 100644 --- a/assets/js/107.f70f2678.js +++ b/assets/js/107.3811d7a2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[107],{778:function(e,t,r){"use strict";r.r(t);var o=r(17),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"coding-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coding-btcpay-server"}},[e._v("#")]),e._v(" Coding BTCPay Server")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#why-coding-matters"}},[e._v("Why coding matters")])]),t("li",[t("a",{attrs:{href:"#where-to-start"}},[e._v("Where to start")]),t("ul",[t("li",[t("a",{attrs:{href:"#setup-developer-environment"}},[e._v("Setup Developer Environment")])]),t("li",[t("a",{attrs:{href:"#local-btcpay-development"}},[e._v("Local BTCPay Development")])]),t("li",[t("a",{attrs:{href:"#local-btcpay-testing"}},[e._v("Local BTCPay Testing")])])])]),t("li",[t("a",{attrs:{href:"#requirements"}},[e._v("Requirements")])]),t("li",[t("a",{attrs:{href:"#videos"}},[e._v("Videos")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"why-coding-matters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-coding-matters"}},[e._v("#")]),e._v(" Why coding matters")]),e._v(" "),t("p",[e._v("By helping the project grow, become more mature, advanced and elaborate, coders working on BTCPay Server are a central component of the project.")]),e._v(" "),t("p",[e._v("If you have coding skills, be it writing or reviewing code, you can contribute to BTCPay Server.")]),e._v(" "),t("h2",{attrs:{id:"where-to-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-to-start"}},[e._v("#")]),e._v(" Where to start")]),e._v(" "),t("p",[e._v("If you're a developer looking to help, but you're not sure where to begin, check the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22",target:"_blank",rel:"noopener noreferrer"}},[e._v("good first issue label"),t("OutboundLink")],1),e._v(", which contains small pieces of work that have been specifically flagged as being friendly to new contributors.")]),e._v(" "),t("p",[e._v("Contributors looking to do something a bit more challenging, before opening a pull request, please "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[e._v("create an issue"),t("OutboundLink")],1),e._v(" or join "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("our community chat"),t("OutboundLink")],1),e._v(" to get early feedback, discuss best ways to tackle the problem and to ensure there is no work duplication.")]),e._v(" "),t("p",[e._v("We are actively looking for developers who can take on and resolve GitHub issues and help with development. If you would like to help us, but need some guidance, the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/dev",target:"_blank",rel:"noopener noreferrer"}},[e._v("#dev channel on Mattermost"),t("OutboundLink")],1),e._v(" is the place to ask questions.")]),e._v(" "),t("h3",{attrs:{id:"setup-developer-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-developer-environment"}},[e._v("#")]),e._v(" Setup Developer Environment")]),e._v(" "),t("p",[e._v("If you are interested in getting started as a developer or tester of the software behind BTCPay Server, check out the "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/"}},[e._v("Setup Developer Environment")]),e._v(" guide that will walk you step by step through every software used in development with BTCPay such as Git, GitBash, Github, Docker, Visual Studio, Postgres, etc. If you have never coded before and you are looking to learn something new, start here.")],1),e._v(" "),t("h3",{attrs:{id:"local-btcpay-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-btcpay-development"}},[e._v("#")]),e._v(" Local BTCPay Development")]),e._v(" "),t("p",[e._v("If you already have a developer environment setup you can start with the BTCPay specific "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("Local Development")]),e._v(" documentation.")],1),e._v(" "),t("h3",{attrs:{id:"local-btcpay-testing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-btcpay-testing"}},[e._v("#")]),e._v(" Local BTCPay Testing")]),e._v(" "),t("p",[e._v("Once you have your development environment tools setup and your local BTCPay Server running, view the "),t("RouterLink",{attrs:{to:"/Contribute/DevTest/"}},[e._v("Local Testing")]),e._v(" guide. This shows you how to use BTCPay in regtest mode for use in development and for users who want to test new features before they are released.")],1),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Software requirements (ie. IDE) can also be found in "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/#which-ide"}},[e._v("local development")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videos"}},[e._v("#")]),e._v(" Videos")]),e._v(" "),t("p",[e._v("BTCPay Server development videos can be found "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/#videos"}},[e._v("here")]),e._v(" or on the "),t("a",{attrs:{href:"https://www.youtube.com/channel/UCpG9WL6TJuoNfFVkaDMp9ug",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer YouTube"),t("OutboundLink")],1),e._v(" channel.")],1)])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[107],{776:function(e,t,r){"use strict";r.r(t);var o=r(17),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"coding-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#coding-btcpay-server"}},[e._v("#")]),e._v(" Coding BTCPay Server")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#why-coding-matters"}},[e._v("Why coding matters")])]),t("li",[t("a",{attrs:{href:"#where-to-start"}},[e._v("Where to start")]),t("ul",[t("li",[t("a",{attrs:{href:"#setup-developer-environment"}},[e._v("Setup Developer Environment")])]),t("li",[t("a",{attrs:{href:"#local-btcpay-development"}},[e._v("Local BTCPay Development")])]),t("li",[t("a",{attrs:{href:"#local-btcpay-testing"}},[e._v("Local BTCPay Testing")])])])]),t("li",[t("a",{attrs:{href:"#requirements"}},[e._v("Requirements")])]),t("li",[t("a",{attrs:{href:"#videos"}},[e._v("Videos")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"why-coding-matters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-coding-matters"}},[e._v("#")]),e._v(" Why coding matters")]),e._v(" "),t("p",[e._v("By helping the project grow, become more mature, advanced and elaborate, coders working on BTCPay Server are a central component of the project.")]),e._v(" "),t("p",[e._v("If you have coding skills, be it writing or reviewing code, you can contribute to BTCPay Server.")]),e._v(" "),t("h2",{attrs:{id:"where-to-start"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-to-start"}},[e._v("#")]),e._v(" Where to start")]),e._v(" "),t("p",[e._v("If you're a developer looking to help, but you're not sure where to begin, check the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22",target:"_blank",rel:"noopener noreferrer"}},[e._v("good first issue label"),t("OutboundLink")],1),e._v(", which contains small pieces of work that have been specifically flagged as being friendly to new contributors.")]),e._v(" "),t("p",[e._v("Contributors looking to do something a bit more challenging, before opening a pull request, please "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[e._v("create an issue"),t("OutboundLink")],1),e._v(" or join "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("our community chat"),t("OutboundLink")],1),e._v(" to get early feedback, discuss best ways to tackle the problem and to ensure there is no work duplication.")]),e._v(" "),t("p",[e._v("We are actively looking for developers who can take on and resolve GitHub issues and help with development. If you would like to help us, but need some guidance, the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/dev",target:"_blank",rel:"noopener noreferrer"}},[e._v("#dev channel on Mattermost"),t("OutboundLink")],1),e._v(" is the place to ask questions.")]),e._v(" "),t("h3",{attrs:{id:"setup-developer-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-developer-environment"}},[e._v("#")]),e._v(" Setup Developer Environment")]),e._v(" "),t("p",[e._v("If you are interested in getting started as a developer or tester of the software behind BTCPay Server, check out the "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/"}},[e._v("Setup Developer Environment")]),e._v(" guide that will walk you step by step through every software used in development with BTCPay such as Git, GitBash, Github, Docker, Visual Studio, Postgres, etc. If you have never coded before and you are looking to learn something new, start here.")],1),e._v(" "),t("h3",{attrs:{id:"local-btcpay-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-btcpay-development"}},[e._v("#")]),e._v(" Local BTCPay Development")]),e._v(" "),t("p",[e._v("If you already have a developer environment setup you can start with the BTCPay specific "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("Local Development")]),e._v(" documentation.")],1),e._v(" "),t("h3",{attrs:{id:"local-btcpay-testing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-btcpay-testing"}},[e._v("#")]),e._v(" Local BTCPay Testing")]),e._v(" "),t("p",[e._v("Once you have your development environment tools setup and your local BTCPay Server running, view the "),t("RouterLink",{attrs:{to:"/Contribute/DevTest/"}},[e._v("Local Testing")]),e._v(" guide. This shows you how to use BTCPay in regtest mode for use in development and for users who want to test new features before they are released.")],1),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Software requirements (ie. IDE) can also be found in "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/#which-ide"}},[e._v("local development")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videos"}},[e._v("#")]),e._v(" Videos")]),e._v(" "),t("p",[e._v("BTCPay Server development videos can be found "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/#videos"}},[e._v("here")]),e._v(" or on the "),t("a",{attrs:{href:"https://www.youtube.com/channel/UCpG9WL6TJuoNfFVkaDMp9ug",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer YouTube"),t("OutboundLink")],1),e._v(" channel.")],1)])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/108.3a8fea9e.js b/assets/js/108.b994c048.js similarity index 98% rename from assets/js/108.3a8fea9e.js rename to assets/js/108.b994c048.js index f788ec33e3..e3578432c2 100644 --- a/assets/js/108.3a8fea9e.js +++ b/assets/js/108.b994c048.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{780:function(e,t,r){"use strict";r.r(t);var a=r(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"contributing-to-btcpay-server-in-other-ways"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contributing-to-btcpay-server-in-other-ways"}},[e._v("#")]),e._v(" Contributing to BTCPay Server in other ways")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#create-videos-graphics"}},[e._v("Create Videos & Graphics")])]),t("li",[t("a",{attrs:{href:"#hosting-providers"}},[e._v("Hosting Providers")])]),t("li",[t("a",{attrs:{href:"#contribute-to-the-directory"}},[e._v("Contribute to the Directory")])]),t("li",[t("a",{attrs:{href:"#project-discussions"}},[e._v("Project Discussions")])]),t("li",[t("a",{attrs:{href:"#community"}},[e._v("Community")])]),t("li",[t("a",{attrs:{href:"#spreading-the-word"}},[e._v("Spreading the word")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"create-videos-graphics"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-videos-graphics"}},[e._v("#")]),e._v(" Create Videos & Graphics")]),e._v(" "),t("p",[e._v("Making videos that promote some features or that show how BTCPay Server works is a great way to help.\nVideo tutorials also help new users navigate around what BTCPay Server can offer them.")]),e._v(" "),t("p",[e._v("You can see examples of videos that are already on the Official BTCPay Server "),t("a",{attrs:{href:"https://www.youtube.com/channel/UCpG9WL6TJuoNfFVkaDMp9ug/",target:"_blank",rel:"noopener noreferrer"}},[e._v("YouTube channel"),t("OutboundLink")],1),e._v(" for inspiration.")]),e._v(" "),t("h2",{attrs:{id:"hosting-providers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hosting-providers"}},[e._v("#")]),e._v(" Hosting Providers")]),e._v(" "),t("p",[e._v("The BTCPay Server community is looking for more VPS hosting providers to implement "),t("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[e._v("1-Click BTCPay Server deployment")]),e._v(" and make the deployment of software more accessible, decentralized and widely-available.")],1),e._v(" "),t("h2",{attrs:{id:"contribute-to-the-directory"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contribute-to-the-directory"}},[e._v("#")]),e._v(" Contribute to the Directory")]),e._v(" "),t("p",[e._v("The Directory has been created to showcase the possibilities of BTCPay Server for merchant checkouts, donations, fundraisers, or any other use-case users come up with.")]),e._v(" "),t("p",[e._v("It contains a non-exhaustive list of websites that use the software.")]),e._v(" "),t("p",[e._v("Anyone can "),t("a",{attrs:{href:"https://directory.btcpayserver.org/newentry",target:"_blank",rel:"noopener noreferrer"}},[e._v("add a person or an organisation"),t("OutboundLink")],1),e._v(" to the "),t("a",{attrs:{href:"https://directory.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Directory"),t("OutboundLink")],1),e._v(".\nIf you know how to use Github, you can directly create a Pull Request and add an entry by editing the "),t("code",[e._v(".vuepress/list.js")]),e._v(" file.")]),e._v(" "),t("p",[e._v("Please note that only websites that use BTCPay Server are accepted in the Directory and entries are expected to be in English language.")]),e._v(" "),t("h2",{attrs:{id:"project-discussions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#project-discussions"}},[e._v("#")]),e._v(" Project Discussions")]),e._v(" "),t("p",[e._v("Check out the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/discussions",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Discussions Page"),t("OutboundLink")],1),e._v(" and provide feedback on new feature ideas and other project topics. Features that may be good ideas for the project but aren't ready for development yet, can be found here.")]),e._v(" "),t("h2",{attrs:{id:"community"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#community"}},[e._v("#")]),e._v(" Community")]),e._v(" "),t("p",[e._v("You can help BTCPay Server even if you're not a developer.")]),e._v(" "),t("p",[e._v("The easiest way is to use the software as a business or individual, provide feedback and "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("report any bugs or issues"),t("OutboundLink")],1),e._v(" you or your customers encounter. Another great way is to join the "),t("RouterLink",{attrs:{to:"/Community/"}},[e._v("community")]),e._v(" and help others troubleshoot by sharing information you may have from your experience using BTCPay Server.")],1),e._v(" "),t("p",[e._v("Consider helping newcomers like the community helped you.")]),e._v(" "),t("h2",{attrs:{id:"spreading-the-word"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#spreading-the-word"}},[e._v("#")]),e._v(" Spreading the word")]),e._v(" "),t("p",[e._v("You like BTCPay Server, what it stands for and what it offers? Spread the word! It's the easiest way to contribute and help the community.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[108],{779:function(e,t,r){"use strict";r.r(t);var a=r(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"contributing-to-btcpay-server-in-other-ways"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contributing-to-btcpay-server-in-other-ways"}},[e._v("#")]),e._v(" Contributing to BTCPay Server in other ways")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#create-videos-graphics"}},[e._v("Create Videos & Graphics")])]),t("li",[t("a",{attrs:{href:"#hosting-providers"}},[e._v("Hosting Providers")])]),t("li",[t("a",{attrs:{href:"#contribute-to-the-directory"}},[e._v("Contribute to the Directory")])]),t("li",[t("a",{attrs:{href:"#project-discussions"}},[e._v("Project Discussions")])]),t("li",[t("a",{attrs:{href:"#community"}},[e._v("Community")])]),t("li",[t("a",{attrs:{href:"#spreading-the-word"}},[e._v("Spreading the word")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"create-videos-graphics"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-videos-graphics"}},[e._v("#")]),e._v(" Create Videos & Graphics")]),e._v(" "),t("p",[e._v("Making videos that promote some features or that show how BTCPay Server works is a great way to help.\nVideo tutorials also help new users navigate around what BTCPay Server can offer them.")]),e._v(" "),t("p",[e._v("You can see examples of videos that are already on the Official BTCPay Server "),t("a",{attrs:{href:"https://www.youtube.com/channel/UCpG9WL6TJuoNfFVkaDMp9ug/",target:"_blank",rel:"noopener noreferrer"}},[e._v("YouTube channel"),t("OutboundLink")],1),e._v(" for inspiration.")]),e._v(" "),t("h2",{attrs:{id:"hosting-providers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hosting-providers"}},[e._v("#")]),e._v(" Hosting Providers")]),e._v(" "),t("p",[e._v("The BTCPay Server community is looking for more VPS hosting providers to implement "),t("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[e._v("1-Click BTCPay Server deployment")]),e._v(" and make the deployment of software more accessible, decentralized and widely-available.")],1),e._v(" "),t("h2",{attrs:{id:"contribute-to-the-directory"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#contribute-to-the-directory"}},[e._v("#")]),e._v(" Contribute to the Directory")]),e._v(" "),t("p",[e._v("The Directory has been created to showcase the possibilities of BTCPay Server for merchant checkouts, donations, fundraisers, or any other use-case users come up with.")]),e._v(" "),t("p",[e._v("It contains a non-exhaustive list of websites that use the software.")]),e._v(" "),t("p",[e._v("Anyone can "),t("a",{attrs:{href:"https://directory.btcpayserver.org/newentry",target:"_blank",rel:"noopener noreferrer"}},[e._v("add a person or an organisation"),t("OutboundLink")],1),e._v(" to the "),t("a",{attrs:{href:"https://directory.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Directory"),t("OutboundLink")],1),e._v(".\nIf you know how to use Github, you can directly create a Pull Request and add an entry by editing the "),t("code",[e._v(".vuepress/list.js")]),e._v(" file.")]),e._v(" "),t("p",[e._v("Please note that only websites that use BTCPay Server are accepted in the Directory and entries are expected to be in English language.")]),e._v(" "),t("h2",{attrs:{id:"project-discussions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#project-discussions"}},[e._v("#")]),e._v(" Project Discussions")]),e._v(" "),t("p",[e._v("Check out the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/discussions",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Discussions Page"),t("OutboundLink")],1),e._v(" and provide feedback on new feature ideas and other project topics. Features that may be good ideas for the project but aren't ready for development yet, can be found here.")]),e._v(" "),t("h2",{attrs:{id:"community"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#community"}},[e._v("#")]),e._v(" Community")]),e._v(" "),t("p",[e._v("You can help BTCPay Server even if you're not a developer.")]),e._v(" "),t("p",[e._v("The easiest way is to use the software as a business or individual, provide feedback and "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("report any bugs or issues"),t("OutboundLink")],1),e._v(" you or your customers encounter. Another great way is to join the "),t("RouterLink",{attrs:{to:"/Community/"}},[e._v("community")]),e._v(" and help others troubleshoot by sharing information you may have from your experience using BTCPay Server.")],1),e._v(" "),t("p",[e._v("Consider helping newcomers like the community helped you.")]),e._v(" "),t("h2",{attrs:{id:"spreading-the-word"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#spreading-the-word"}},[e._v("#")]),e._v(" Spreading the word")]),e._v(" "),t("p",[e._v("You like BTCPay Server, what it stands for and what it offers? Spread the word! It's the easiest way to contribute and help the community.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/109.2c3571c9.js b/assets/js/109.55958607.js similarity index 96% rename from assets/js/109.2c3571c9.js rename to assets/js/109.55958607.js index 8368b470da..67c9f07c72 100644 --- a/assets/js/109.2c3571c9.js +++ b/assets/js/109.55958607.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[109],{781:function(t,e,o){"use strict";o.r(e);var r=o(17),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"how-to-contribute-to-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-contribute-to-btcpay-server"}},[t._v("#")]),t._v(" How to contribute to BTCPay Server?")]),t._v(" "),e("p",[t._v("BTCPay Server is built and maintained entirely by volunteer contributors around the internet.")]),t._v(" "),e("p",[t._v("We welcome, appreciate and encourage new contributions.")]),t._v(" "),e("p",[t._v("Depending on your skills and interest, you can help in a number of ways:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Contribute/Dev/"}},[t._v("Software")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Contribute/DevCode/"}},[t._v("Development")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/DevTest/"}},[t._v("Testing")])],1)])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Write/"}},[t._v("Writing")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Contribute/WriteSoftware/"}},[t._v("Tools")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/WriteDocs/"}},[t._v("Documentation")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/WriteBlog/"}},[t._v("Blog")])],1)])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Design/"}},[t._v("Designing")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Translate/"}},[t._v("Translating")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Misc/"}},[t._v("Miscellaneous")])],1)]),t._v(" "),e("p",[t._v("Every contribution is important and if you have any questions, feel free to consult our growing "),e("RouterLink",{attrs:{to:"/Community/"}},[t._v("community")]),t._v(".")],1)])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[109],{780:function(t,e,o){"use strict";o.r(e);var r=o(17),n=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"how-to-contribute-to-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-contribute-to-btcpay-server"}},[t._v("#")]),t._v(" How to contribute to BTCPay Server?")]),t._v(" "),e("p",[t._v("BTCPay Server is built and maintained entirely by volunteer contributors around the internet.")]),t._v(" "),e("p",[t._v("We welcome, appreciate and encourage new contributions.")]),t._v(" "),e("p",[t._v("Depending on your skills and interest, you can help in a number of ways:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Contribute/Dev/"}},[t._v("Software")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Contribute/DevCode/"}},[t._v("Development")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/DevTest/"}},[t._v("Testing")])],1)])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Write/"}},[t._v("Writing")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Contribute/WriteSoftware/"}},[t._v("Tools")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/WriteDocs/"}},[t._v("Documentation")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/WriteBlog/"}},[t._v("Blog")])],1)])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Design/"}},[t._v("Designing")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Translate/"}},[t._v("Translating")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Contribute/Misc/"}},[t._v("Miscellaneous")])],1)]),t._v(" "),e("p",[t._v("Every contribution is important and if you have any questions, feel free to consult our growing "),e("RouterLink",{attrs:{to:"/Community/"}},[t._v("community")]),t._v(".")],1)])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/110.a04232c7.js b/assets/js/110.ff0c48e3.js similarity index 99% rename from assets/js/110.a04232c7.js rename to assets/js/110.ff0c48e3.js index 1d2463f237..5832b8ac53 100644 --- a/assets/js/110.a04232c7.js +++ b/assets/js/110.ff0c48e3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[110],{783:function(t,e,r){"use strict";r.r(e);var o=r(17),a=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"documenting-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#documenting-btcpay-server"}},[t._v("#")]),t._v(" Documenting BTCPay Server")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#why-documentation-matters"}},[t._v("Why documentation matters")])]),e("li",[e("a",{attrs:{href:"#btcpay-documentation"}},[t._v("BTCPay Documentation")])]),e("li",[e("a",{attrs:{href:"#btcpay-blog"}},[t._v("BTCPay Blog")])]),e("li",[e("a",{attrs:{href:"#requirements"}},[t._v("Requirements")])]),e("li",[e("a",{attrs:{href:"#recommended-software"}},[t._v("Recommended software")]),e("ul",[e("li",[e("a",{attrs:{href:"#text-editor"}},[t._v("Text Editor")])]),e("li",[e("a",{attrs:{href:"#version-control"}},[t._v("Version Control")])])])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"why-documentation-matters"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#why-documentation-matters"}},[t._v("#")]),t._v(" Why documentation matters")]),t._v(" "),e("p",[t._v("Documentation is essential to give users of all skill levels concise and clear information about the software and how to use it. BTCPay server has many different use cases and as a result many different kinds of users seeking information from the documentation. Writers contributing to BTCPay Server are as important as any other contributor.")]),t._v(" "),e("p",[t._v("If you have technical knowledge in a certain area, want to help document new features or simply get involved in the BTCPay Server project, documentation is a great place to get started with contributing.")]),t._v(" "),e("p",[t._v("If you have writing skills or if you have a fair knowledge of the English language, then you can contribute to BTCPay Server or review the work of other contributors. Writing contributors can help in a number of places.")]),t._v(" "),e("h2",{attrs:{id:"btcpay-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-documentation"}},[t._v("#")]),t._v(" BTCPay Documentation")]),t._v(" "),e("p",[t._v("Documentation work needing to be completed can be found in the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("open issues page"),e("OutboundLink")],1),t._v(" on Github. For information on how to start a documentation task, see the "),e("RouterLink",{attrs:{to:"/Contribute/WriteDocs/"}},[t._v("documentation guide")]),t._v(".")],1),t._v(" "),e("p",[t._v("For documentation guidance or discussion of a new documentation idea, join the "),e("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/documentation",target:"_blank",rel:"noopener noreferrer"}},[t._v("#documentation channel on Mattermost"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"btcpay-blog"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-blog"}},[t._v("#")]),t._v(" BTCPay Blog")]),t._v(" "),e("p",[t._v("Another great way to contribute is by writing content for the "),e("RouterLink",{attrs:{to:"/Contribute/WriteBlog/"}},[t._v("BTCPay blog")]),t._v(". To get started on a blog topic, join the "),e("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/content-creation",target:"_blank",rel:"noopener noreferrer"}},[t._v("#content creation channel on Mattermost"),e("OutboundLink")],1),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("In order to contribute to BTCPay Server as a writer there are some requirements.")]),t._v(" "),e("p",[t._v("Since most of the documentation done in BTCPay Server is submitted and reviewed through Github, you must have a "),e("a",{attrs:{href:"https://github.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github account"),e("OutboundLink")],1),t._v(". It's also on Github that you can contribute by reviewing the documentation work done by others (pull requests).")]),t._v(" "),e("p",[e("strong",[t._v("Important note")]),t._v(": Contributions explained in this documentation are meant to be done in "),e("strong",[t._v("English")]),t._v(" only. If you wish to contribute in other languages, see "),e("RouterLink",{attrs:{to:"/Contribute/Translate/"}},[t._v("Translations")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"recommended-software"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#recommended-software"}},[t._v("#")]),t._v(" Recommended software")]),t._v(" "),e("h3",{attrs:{id:"text-editor"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#text-editor"}},[t._v("#")]),t._v(" Text Editor")]),t._v(" "),e("p",[t._v("It is recommended to have a Rich-Text editor.")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://notepad-plus-plus.org/downloads/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Notepad++"),e("OutboundLink")],1),t._v(" is a decent software and easy to use for the newer contributors.")]),t._v(" "),e("p",[t._v("For more advanced users, "),e("a",{attrs:{href:"https://visualstudio.microsoft.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Visual Studio Code (VS Code)"),e("OutboundLink")],1),t._v(" is a good choice.\nThe "),e("code",[t._v("Markdown All In One")]),t._v(" extension in VS Code is also recommended, for visual comfort while editing and the ability to preview Markdown changes. This is helpful for the BTCPay documentation which is written primarily in Markdown.")]),t._v(" "),e("p",[t._v("These are only recommended: If you already use other similar software that you're accustomed to, you are free to continue using them.")]),t._v(" "),e("h3",{attrs:{id:"version-control"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#version-control"}},[t._v("#")]),t._v(" Version Control")]),t._v(" "),e("p",[t._v("To be able to manage your contributions (such as forking repositories, creating and working on branches, making pull requests and issues, etc.) it's recommended you have "),e("a",{attrs:{href:"https://desktop.github.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github Desktop"),e("OutboundLink")],1),t._v(". You can see the step by step guide to making a pull request using Github Desktop "),e("RouterLink",{attrs:{to:"/Contribute/WriteSoftware/"}},[t._v("here")]),t._v(".")],1)])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[110],{782:function(t,e,r){"use strict";r.r(e);var o=r(17),a=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"documenting-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#documenting-btcpay-server"}},[t._v("#")]),t._v(" Documenting BTCPay Server")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#why-documentation-matters"}},[t._v("Why documentation matters")])]),e("li",[e("a",{attrs:{href:"#btcpay-documentation"}},[t._v("BTCPay Documentation")])]),e("li",[e("a",{attrs:{href:"#btcpay-blog"}},[t._v("BTCPay Blog")])]),e("li",[e("a",{attrs:{href:"#requirements"}},[t._v("Requirements")])]),e("li",[e("a",{attrs:{href:"#recommended-software"}},[t._v("Recommended software")]),e("ul",[e("li",[e("a",{attrs:{href:"#text-editor"}},[t._v("Text Editor")])]),e("li",[e("a",{attrs:{href:"#version-control"}},[t._v("Version Control")])])])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"why-documentation-matters"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#why-documentation-matters"}},[t._v("#")]),t._v(" Why documentation matters")]),t._v(" "),e("p",[t._v("Documentation is essential to give users of all skill levels concise and clear information about the software and how to use it. BTCPay server has many different use cases and as a result many different kinds of users seeking information from the documentation. Writers contributing to BTCPay Server are as important as any other contributor.")]),t._v(" "),e("p",[t._v("If you have technical knowledge in a certain area, want to help document new features or simply get involved in the BTCPay Server project, documentation is a great place to get started with contributing.")]),t._v(" "),e("p",[t._v("If you have writing skills or if you have a fair knowledge of the English language, then you can contribute to BTCPay Server or review the work of other contributors. Writing contributors can help in a number of places.")]),t._v(" "),e("h2",{attrs:{id:"btcpay-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-documentation"}},[t._v("#")]),t._v(" BTCPay Documentation")]),t._v(" "),e("p",[t._v("Documentation work needing to be completed can be found in the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("open issues page"),e("OutboundLink")],1),t._v(" on Github. For information on how to start a documentation task, see the "),e("RouterLink",{attrs:{to:"/Contribute/WriteDocs/"}},[t._v("documentation guide")]),t._v(".")],1),t._v(" "),e("p",[t._v("For documentation guidance or discussion of a new documentation idea, join the "),e("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/documentation",target:"_blank",rel:"noopener noreferrer"}},[t._v("#documentation channel on Mattermost"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"btcpay-blog"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-blog"}},[t._v("#")]),t._v(" BTCPay Blog")]),t._v(" "),e("p",[t._v("Another great way to contribute is by writing content for the "),e("RouterLink",{attrs:{to:"/Contribute/WriteBlog/"}},[t._v("BTCPay blog")]),t._v(". To get started on a blog topic, join the "),e("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/content-creation",target:"_blank",rel:"noopener noreferrer"}},[t._v("#content creation channel on Mattermost"),e("OutboundLink")],1),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"requirements"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),e("p",[t._v("In order to contribute to BTCPay Server as a writer there are some requirements.")]),t._v(" "),e("p",[t._v("Since most of the documentation done in BTCPay Server is submitted and reviewed through Github, you must have a "),e("a",{attrs:{href:"https://github.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github account"),e("OutboundLink")],1),t._v(". It's also on Github that you can contribute by reviewing the documentation work done by others (pull requests).")]),t._v(" "),e("p",[e("strong",[t._v("Important note")]),t._v(": Contributions explained in this documentation are meant to be done in "),e("strong",[t._v("English")]),t._v(" only. If you wish to contribute in other languages, see "),e("RouterLink",{attrs:{to:"/Contribute/Translate/"}},[t._v("Translations")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"recommended-software"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#recommended-software"}},[t._v("#")]),t._v(" Recommended software")]),t._v(" "),e("h3",{attrs:{id:"text-editor"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#text-editor"}},[t._v("#")]),t._v(" Text Editor")]),t._v(" "),e("p",[t._v("It is recommended to have a Rich-Text editor.")]),t._v(" "),e("p",[e("a",{attrs:{href:"https://notepad-plus-plus.org/downloads/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Notepad++"),e("OutboundLink")],1),t._v(" is a decent software and easy to use for the newer contributors.")]),t._v(" "),e("p",[t._v("For more advanced users, "),e("a",{attrs:{href:"https://visualstudio.microsoft.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Visual Studio Code (VS Code)"),e("OutboundLink")],1),t._v(" is a good choice.\nThe "),e("code",[t._v("Markdown All In One")]),t._v(" extension in VS Code is also recommended, for visual comfort while editing and the ability to preview Markdown changes. This is helpful for the BTCPay documentation which is written primarily in Markdown.")]),t._v(" "),e("p",[t._v("These are only recommended: If you already use other similar software that you're accustomed to, you are free to continue using them.")]),t._v(" "),e("h3",{attrs:{id:"version-control"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#version-control"}},[t._v("#")]),t._v(" Version Control")]),t._v(" "),e("p",[t._v("To be able to manage your contributions (such as forking repositories, creating and working on branches, making pull requests and issues, etc.) it's recommended you have "),e("a",{attrs:{href:"https://desktop.github.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github Desktop"),e("OutboundLink")],1),t._v(". You can see the step by step guide to making a pull request using Github Desktop "),e("RouterLink",{attrs:{to:"/Contribute/WriteSoftware/"}},[t._v("here")]),t._v(".")],1)])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/112.c0e15e3e.js b/assets/js/112.177150e7.js similarity index 99% rename from assets/js/112.c0e15e3e.js rename to assets/js/112.177150e7.js index f813d03d69..0ecff5d0b3 100644 --- a/assets/js/112.c0e15e3e.js +++ b/assets/js/112.177150e7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{789:function(t,a,e){"use strict";e.r(a);var s=e(17),n=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"using-the-btcpay-api-for-custom-integration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using-the-btcpay-api-for-custom-integration"}},[t._v("#")]),t._v(" Using the BTCPay API for Custom Integration")]),t._v(" "),a("p",[t._v("BTCPay Server provides 2 APIS in order to integrate with it:")]),t._v(" "),a("ul",[a("li",[a("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[t._v("GreenField API")]),t._v(" - A RESTful API that aims to allow you to use BTCPay Server headless. This is the recommended API for projects which do not wish to recycle code from a Bitpay integration.")],1),t._v(" "),a("li",[t._v("Bitpay Invoice API - BTCPay implements the same API as Bitpay for creating and managing invoices.")])]),t._v(" "),a("p",[a("strong",[t._v("Migrating from BitPay to BTCPay")]),t._v(" normally is as easy as changing a URL.")]),t._v(" "),a("p",[t._v("While Bitpay only allows one account for one merchant, BTCPay allows a user to manage multiple stores.")]),t._v(" "),a("h2",{attrs:{id:"official-client-libraries"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#official-client-libraries"}},[t._v("#")]),t._v(" Official Client Libraries")]),t._v(" "),a("p",[t._v("BTCPay maintains official client libraries for "),a("a",{attrs:{href:"https://github.com/MetacoSA/NBitpayClient",target:"_blank",rel:"noopener noreferrer"}},[t._v("C#"),a("OutboundLink")],1),t._v(", "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpay-python",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://github.com/btcpayserver/node-btcpay",target:"_blank",rel:"noopener noreferrer"}},[t._v("NodeJS"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("In addition, there are forked repositories of Bitpay's "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-php-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("PHP"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://github.com/bitpay/ruby-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Ruby"),a("OutboundLink")],1),t._v(" clients.")]),t._v(" "),a("h2",{attrs:{id:"accessing-the-api-manually"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#accessing-the-api-manually"}},[t._v("#")]),t._v(" Accessing the API Manually")]),t._v(" "),a("p",[t._v("If not using one of the libraries above, the REST API can be accessed manually.")]),t._v(" "),a("p",[t._v("The authentication mechanism is using "),a("code",[t._v("BitId")]),t._v(".")]),t._v(" "),a("p",[t._v("With "),a("code",[t._v("BitId")]),t._v(", the "),a("code",[t._v("client")]),t._v(" of the API (like an e-commerce plugin) generates a private key, then informs the "),a("code",[t._v("server")]),t._v(" (BTCPay) about the "),a("code",[t._v("public key")]),t._v(".")]),t._v(" "),a("p",[t._v("Every requests to the API sent by the client is signed with the client's "),a("code",[t._v("private key")]),t._v(".")]),t._v(" "),a("p",[t._v("We call "),a("code",[t._v("pairing")]),t._v(" the process to inform BTCPay about your "),a("code",[t._v("public key")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"pairing-process"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#pairing-process"}},[t._v("#")]),t._v(" Pairing process")]),t._v(" "),a("p",[t._v("Your first need to create a new store:")]),t._v(" "),a("ol",[a("li",[t._v("Log in")]),t._v(" "),a("li",[t._v("Go to Stores menu")]),t._v(" "),a("li",[t._v("Click on "),a("code",[t._v("Create a new store")])]),t._v(" "),a("li",[t._v("Enter a friendly name for the store, validate.")])]),t._v(" "),a("p",[t._v("There is two method of "),a("code",[t._v("pairing")]),t._v(", client side pairing and server side pairing.")]),t._v(" "),a("h3",{attrs:{id:"client-side-pairing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#client-side-pairing"}},[t._v("#")]),t._v(" Client side pairing")]),t._v(" "),a("p",[t._v("With client side pairing, the "),a("code",[t._v("client")]),t._v(" generates a URL from their "),a("code",[t._v("public key")]),t._v(" which a human user can browse to validate the pairing.")]),t._v(" "),a("p",[t._v("Typically the URL looks like "),a("code",[t._v("https://btcpay.example.com/api-access-request?pairingCode=")]),t._v(".")]),t._v(" "),a("p",[t._v("You can find documentation about how to achieve this with "),a("a",{attrs:{href:"https://support.bitpay.com/hc/en-us/articles/115003001183-How-do-I-pair-my-client-and-create-a-token-",target:"_blank",rel:"noopener noreferrer"}},[t._v("this link"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"server-side-pairing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#server-side-pairing"}},[t._v("#")]),t._v(" Server side pairing")]),t._v(" "),a("p",[t._v("The second way, is to generate your private key via some bitcoin library then:")]),t._v(" "),a("ol",[a("li",[t._v("Go to the store's settings")]),t._v(" "),a("li",[t._v("Click on "),a("code",[t._v("Access tokens")])]),t._v(" "),a("li",[t._v("Click on "),a("code",[t._v("Create new Token")])]),t._v(" "),a("li",[t._v("Select merchant's facade and enter your public key,")]),t._v(" "),a("li",[t._v("Click request pairing")]),t._v(" "),a("li",[t._v("Click on Approve")])]),t._v(" "),a("h2",{attrs:{id:"note"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#note"}},[t._v("#")]),t._v(" Note")]),t._v(" "),a("p",[a("strong",[t._v("BTCPay Server has an API compatible with Bitpay")]),t._v("; changing your e-commerce application "),a("strong",[t._v("from Bitpay to BTCPay")]),t._v(" should take minimal effort.")]),t._v(" "),a("p",[t._v("You can read the full API documentation "),a("a",{attrs:{href:"https://bitpay.com/api#resource-Invoices",target:"_blank",rel:"noopener noreferrer"}},[t._v("on Bitpay's website"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("There is only one difference: Bitpay only allows one account for one merchant, BTCPay allows a user to manage multiple stores.")]),t._v(" "),a("h2",{attrs:{id:"modal-checkout"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#modal-checkout"}},[t._v("#")]),t._v(" Modal Checkout")]),t._v(" "),a("p",[t._v("To generate a pop-up modal experience:")]),t._v(" "),a("ol",[a("li",[t._v("Include the btcpay.js script in your html page")])]),t._v(" "),a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://your.btcpay.url/modal/btcpay.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("ol",{attrs:{start:"2"}},[a("li",[t._v("Call the invoice API to generate an invoice (example code). This is sample backend code as it contains an auth token that should not be exposed in your front-end.")])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" axiosClient "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" axios"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("baseURL")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("BTCPAY_URL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("timeout")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("responseType")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'json'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("BTCPAY_AUTH")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" invoiceCreation "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("price")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12345")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("currency")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'USD'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("orderId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'something'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("itemDesc")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'item description'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("notificationUrl")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://webhook.after.checkout.com/goeshere'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("redirectURL")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://go.here.after.checkout.com'")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" response "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" axiosClient"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("post")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/invoices'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" invoiceCreation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" invoiceId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" response"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[t._v("Use the invoiceId to pop up the modal")])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("window"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("btcpay"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("showInvoice")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("invoiceId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("You'll often want to do something like refresh the state of your page when the invoice is paid, or note some kind of state before the modal pops up. You can attach event listeners like this:")])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("window"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("btcpay"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("onModalWillEnter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("yourCallbackFunction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nwindow"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("btcpay"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("onModalWillLeave")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("yourCallbackFunction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nwindow"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("btcpay"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("onModalReceiveMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("yourCallbackFunction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// available from v1.0.5.6")]),t._v("\n")])])]),a("p",[a("code",[t._v("onModalReceiveMessage")]),t._v(" will invoke your callback when a new status has been pushed from BTCPay Server to the invoice UI. The data format is "),a("code",[t._v('{invoiceId: "x", status: "y" }')])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[112],{790:function(t,a,e){"use strict";e.r(a);var s=e(17),n=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"using-the-btcpay-api-for-custom-integration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using-the-btcpay-api-for-custom-integration"}},[t._v("#")]),t._v(" Using the BTCPay API for Custom Integration")]),t._v(" "),a("p",[t._v("BTCPay Server provides 2 APIS in order to integrate with it:")]),t._v(" "),a("ul",[a("li",[a("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[t._v("GreenField API")]),t._v(" - A RESTful API that aims to allow you to use BTCPay Server headless. This is the recommended API for projects which do not wish to recycle code from a Bitpay integration.")],1),t._v(" "),a("li",[t._v("Bitpay Invoice API - BTCPay implements the same API as Bitpay for creating and managing invoices.")])]),t._v(" "),a("p",[a("strong",[t._v("Migrating from BitPay to BTCPay")]),t._v(" normally is as easy as changing a URL.")]),t._v(" "),a("p",[t._v("While Bitpay only allows one account for one merchant, BTCPay allows a user to manage multiple stores.")]),t._v(" "),a("h2",{attrs:{id:"official-client-libraries"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#official-client-libraries"}},[t._v("#")]),t._v(" Official Client Libraries")]),t._v(" "),a("p",[t._v("BTCPay maintains official client libraries for "),a("a",{attrs:{href:"https://github.com/MetacoSA/NBitpayClient",target:"_blank",rel:"noopener noreferrer"}},[t._v("C#"),a("OutboundLink")],1),t._v(", "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpay-python",target:"_blank",rel:"noopener noreferrer"}},[t._v("Python"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://github.com/btcpayserver/node-btcpay",target:"_blank",rel:"noopener noreferrer"}},[t._v("NodeJS"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("In addition, there are forked repositories of Bitpay's "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-php-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("PHP"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://github.com/bitpay/ruby-client",target:"_blank",rel:"noopener noreferrer"}},[t._v("Ruby"),a("OutboundLink")],1),t._v(" clients.")]),t._v(" "),a("h2",{attrs:{id:"accessing-the-api-manually"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#accessing-the-api-manually"}},[t._v("#")]),t._v(" Accessing the API Manually")]),t._v(" "),a("p",[t._v("If not using one of the libraries above, the REST API can be accessed manually.")]),t._v(" "),a("p",[t._v("The authentication mechanism is using "),a("code",[t._v("BitId")]),t._v(".")]),t._v(" "),a("p",[t._v("With "),a("code",[t._v("BitId")]),t._v(", the "),a("code",[t._v("client")]),t._v(" of the API (like an e-commerce plugin) generates a private key, then informs the "),a("code",[t._v("server")]),t._v(" (BTCPay) about the "),a("code",[t._v("public key")]),t._v(".")]),t._v(" "),a("p",[t._v("Every requests to the API sent by the client is signed with the client's "),a("code",[t._v("private key")]),t._v(".")]),t._v(" "),a("p",[t._v("We call "),a("code",[t._v("pairing")]),t._v(" the process to inform BTCPay about your "),a("code",[t._v("public key")]),t._v(".")]),t._v(" "),a("h2",{attrs:{id:"pairing-process"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#pairing-process"}},[t._v("#")]),t._v(" Pairing process")]),t._v(" "),a("p",[t._v("Your first need to create a new store:")]),t._v(" "),a("ol",[a("li",[t._v("Log in")]),t._v(" "),a("li",[t._v("Go to Stores menu")]),t._v(" "),a("li",[t._v("Click on "),a("code",[t._v("Create a new store")])]),t._v(" "),a("li",[t._v("Enter a friendly name for the store, validate.")])]),t._v(" "),a("p",[t._v("There is two method of "),a("code",[t._v("pairing")]),t._v(", client side pairing and server side pairing.")]),t._v(" "),a("h3",{attrs:{id:"client-side-pairing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#client-side-pairing"}},[t._v("#")]),t._v(" Client side pairing")]),t._v(" "),a("p",[t._v("With client side pairing, the "),a("code",[t._v("client")]),t._v(" generates a URL from their "),a("code",[t._v("public key")]),t._v(" which a human user can browse to validate the pairing.")]),t._v(" "),a("p",[t._v("Typically the URL looks like "),a("code",[t._v("https://btcpay.example.com/api-access-request?pairingCode=")]),t._v(".")]),t._v(" "),a("p",[t._v("You can find documentation about how to achieve this with "),a("a",{attrs:{href:"https://support.bitpay.com/hc/en-us/articles/115003001183-How-do-I-pair-my-client-and-create-a-token-",target:"_blank",rel:"noopener noreferrer"}},[t._v("this link"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("h3",{attrs:{id:"server-side-pairing"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#server-side-pairing"}},[t._v("#")]),t._v(" Server side pairing")]),t._v(" "),a("p",[t._v("The second way, is to generate your private key via some bitcoin library then:")]),t._v(" "),a("ol",[a("li",[t._v("Go to the store's settings")]),t._v(" "),a("li",[t._v("Click on "),a("code",[t._v("Access tokens")])]),t._v(" "),a("li",[t._v("Click on "),a("code",[t._v("Create new Token")])]),t._v(" "),a("li",[t._v("Select merchant's facade and enter your public key,")]),t._v(" "),a("li",[t._v("Click request pairing")]),t._v(" "),a("li",[t._v("Click on Approve")])]),t._v(" "),a("h2",{attrs:{id:"note"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#note"}},[t._v("#")]),t._v(" Note")]),t._v(" "),a("p",[a("strong",[t._v("BTCPay Server has an API compatible with Bitpay")]),t._v("; changing your e-commerce application "),a("strong",[t._v("from Bitpay to BTCPay")]),t._v(" should take minimal effort.")]),t._v(" "),a("p",[t._v("You can read the full API documentation "),a("a",{attrs:{href:"https://bitpay.com/api#resource-Invoices",target:"_blank",rel:"noopener noreferrer"}},[t._v("on Bitpay's website"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("There is only one difference: Bitpay only allows one account for one merchant, BTCPay allows a user to manage multiple stores.")]),t._v(" "),a("h2",{attrs:{id:"modal-checkout"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#modal-checkout"}},[t._v("#")]),t._v(" Modal Checkout")]),t._v(" "),a("p",[t._v("To generate a pop-up modal experience:")]),t._v(" "),a("ol",[a("li",[t._v("Include the btcpay.js script in your html page")])]),t._v(" "),a("div",{staticClass:"language-html extra-class"},[a("pre",{pre:!0,attrs:{class:"language-html"}},[a("code",[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),a("span",{pre:!0,attrs:{class:"token attr-value"}},[a("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("https://your.btcpay.url/modal/btcpay.js"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),a("span",{pre:!0,attrs:{class:"token script"}}),a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token tag"}},[a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),a("ol",{attrs:{start:"2"}},[a("li",[t._v("Call the invoice API to generate an invoice (example code). This is sample backend code as it contains an auth token that should not be exposed in your front-end.")])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" axiosClient "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" axios"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("create")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("baseURL")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("BTCPAY_URL")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("timeout")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("5000")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("responseType")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'json'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token constant"}},[t._v("BTCPAY_AUTH")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" invoiceCreation "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("price")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("12345")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("currency")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'USD'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("orderId")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'something'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("itemDesc")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'item description'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("notificationUrl")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://webhook.after.checkout.com/goeshere'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),a("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("redirectURL")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://go.here.after.checkout.com'")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" response "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" axiosClient"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("post")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/invoices'")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" invoiceCreation"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" invoiceId "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" response"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("data"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("id\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[t._v("Use the invoiceId to pop up the modal")])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("window"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("btcpay"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("showInvoice")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("invoiceId"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("You'll often want to do something like refresh the state of your page when the invoice is paid, or note some kind of state before the modal pops up. You can attach event listeners like this:")])]),t._v(" "),a("div",{staticClass:"language-js extra-class"},[a("pre",{pre:!0,attrs:{class:"language-js"}},[a("code",[t._v("window"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("btcpay"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("onModalWillEnter")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("yourCallbackFunction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nwindow"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("btcpay"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("onModalWillLeave")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("yourCallbackFunction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\nwindow"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("btcpay"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("onModalReceiveMessage")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("yourCallbackFunction"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// available from v1.0.5.6")]),t._v("\n")])])]),a("p",[a("code",[t._v("onModalReceiveMessage")]),t._v(" will invoke your callback when a new status has been pushed from BTCPay Server to the invoice UI. The data format is "),a("code",[t._v('{invoiceId: "x", status: "y" }')])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/12.2700c2c1.js b/assets/js/12.029e31d9.js similarity index 83% rename from assets/js/12.2700c2c1.js rename to assets/js/12.029e31d9.js index 3a156a848d..59b93c2adb 100644 --- a/assets/js/12.2700c2c1.js +++ b/assets/js/12.029e31d9.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{340:function(e,t,o){e.exports=o.p+"assets/img/16_wix_btcpay-config.5f3fa8a9.png"},709:function(e,t,o){e.exports=o.p+"assets/img/01_wix_dev-mode.d3ebf3bb.png"},710:function(e,t,o){e.exports=o.p+"assets/img/02_wix_service-plugin-payment.99ffd208.png"},711:function(e,t,o){e.exports=o.p+"assets/img/03_wix_ppsp-start-now.044a2d88.png"},712:function(e,t,o){e.exports=o.p+"assets/img/04_wix_ppsp-legal-notice.658c1fe6.png"},713:function(e,t,o){e.exports=o.p+"assets/img/05_wix_ppsp-name.990dfe01.png"},714:function(e,t,o){e.exports=o.p+"assets/img/06_wix_ppsp-btcpay-config.5d4b9637.png"},715:function(e,t,o){e.exports=o.p+"assets/img/07_wix_gh-btcpay-config.a90cd4e2.png"},716:function(e,t,o){e.exports=o.p+"assets/img/08_wix_ppsp-btcpay-config-complete.06d14fc5.png"},717:function(e,t,o){e.exports=o.p+"assets/img/09_wix_gh-btcpay.f4ba84b1.png"},718:function(e,t,o){e.exports=o.p+"assets/img/10_wix_ppsp-btcpay.aa84c719.png"},719:function(e,t,o){e.exports=o.p+"assets/img/11_wix_backend-expose-site-api.a7733acf.png"},720:function(e,t,o){e.exports=o.p+"assets/img/12_wix_backend-http-functions.ba365413.png"},721:function(e,t,o){e.exports=o.p+"assets/img/13_wix_settings.9275944e.png"},722:function(e,t,o){e.exports=o.p+"assets/img/14_wix_accept-payments.984c3b09.png"},723:function(e,t,o){e.exports=o.p+"assets/img/15_wix_list-btcpay.aabe82d7.png"},724:function(e,t,o){e.exports=o.p+"assets/img/17_btcpay-api-key-page.a525c66b.png"},725:function(e,t,o){e.exports=o.p+"assets/img/18_btcpay-api-key-permissions-1.2a52f496.png"},726:function(e,t,o){e.exports=o.p+"assets/img/18_btcpay-api-key-permissions-2.4a634a53.png"},727:function(e,t,o){e.exports=o.p+"assets/img/19_btcpay-api-key-copy.4cb4fc6a.png"},728:function(e,t,o){e.exports=o.p+"assets/img/20_btcpay-store-id.62536621.png"},729:function(e,t,o){e.exports=o.p+"assets/img/21_btcpay-webhook-page.6ca3fd85.png"},730:function(e,t,o){e.exports=o.p+"assets/img/22_btcpay-webhook-saved.1e659e6d.png"},731:function(e,t,o){e.exports=o.p+"assets/img/23_wix_btcpay-config-saved.30337d07.png"},905:function(e,t,o){"use strict";o.r(t);var a=o(17),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btcpay-server-integration-for-wix"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-integration-for-wix"}},[e._v("#")]),e._v(" BTCPay Server integration for Wix")]),e._v(" "),t("p",[e._v("This guide will show you how you can enable Bitcoin payments using BTCPay Server on your Wix store. At the time of writing it is not possible to package this into a Wix app, so you will need to follow the steps below and copy and paste the code into your Wix editor.")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("You have a "),t("a",{attrs:{href:"https://wix.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wix"),t("OutboundLink")],1),e._v(" account and online store up and running")]),e._v(" "),t("li",[e._v("You have a BTCPay Server version 1.10.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")]),e._v(".")],1),e._v(" "),t("li",[e._v("BTCPay needs to be reachable from the internet via a domain, e.g. https://mainnet.demo.btcpayserver.org")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've a wallet connected to your store")]),e._v(" and/or "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning Network")]),e._v(" enabled or connected.")],1)]),e._v(" "),t("h2",{attrs:{id:"create-a-payment-provider-service-plugin-ppsp"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-payment-provider-service-plugin-ppsp"}},[e._v("#")]),e._v(" Create a payment provider service plugin (PPSP)")]),e._v(" "),t("ol",[t("li",[e._v("In your Wix site, open your Wix Editor.")]),e._v(" "),t("li",[e._v('At the top click on "'),t("strong",[e._v("Dev Mode")]),e._v('" and the "'),t("strong",[e._v("Turn on Dev Mode")]),e._v('" button to enable the developer mode.\n'),t("img",{attrs:{src:o(709),alt:"Dev Mode",title:"Dev Mode"}})]),e._v(" "),t("li",[e._v("Now on the left side, click on the "),t("code",[e._v("{ }")]),e._v(" icon to open the code editor.")]),e._v(" "),t("li",[e._v('In the section "Service Plugins" click on the '),t("strong",[e._v("(+)")]),e._v(' sign and select "'),t("strong",[e._v("Payment")]),e._v('"\n'),t("img",{attrs:{src:o(710),alt:"Add payment provider service plugin",title:"Add payment provider service plugin"}})]),e._v(" "),t("li",[e._v('On the following screen, click "'),t("strong",[e._v("Start now")]),e._v('"\n'),t("img",{attrs:{src:o(711),alt:"Start now",title:"Start now"}})]),e._v(" "),t("li",[e._v('On the legal terms page, check the terms and click "'),t("strong",[e._v("Accept")]),e._v('"\n'),t("img",{attrs:{src:o(712),alt:"Accept terms",title:"Accept terms"}})]),e._v(" "),t("li",[e._v('Now enter the name of the plugin: "'),t("strong",[e._v("BTCPay")]),e._v('" (you can use any name but this will make it easier to follow the guide). Then, click "Add & Edit Code":\n'),t("img",{attrs:{src:o(713),alt:"Add & Edit Code",title:"Add & Edit Code"}})]),e._v(" "),t("li",[e._v('This created the directory "BTCPay" containing two files: '),t("code",[e._v("BTCPay.js")]),e._v(" and "),t("code",[e._v("BTCPay-config.js")]),e._v(" which is open in the editor.\n"),t("img",{attrs:{src:o(714),alt:"BTCPay-config.js",title:"BTCPay-config.js"}})]),e._v(" "),t("li",[e._v("Next steps are to copy the contents of those two files from our "),t("a",{attrs:{href:"https://github.com/btcpayserver/wix",target:"_blank",rel:"noopener noreferrer"}},[e._v("Git repository"),t("OutboundLink")],1),e._v(". You can see the same data structure as on your wix editor. In the "),t("code",[e._v("BTCPay-config.js")]),e._v(" file, paste the code from the same file on our Git repository: "),t("a",{attrs:{href:"https://github.com/btcpayserver/wix/blob/main/backend/service-plugins/payment-provider/BTCPay/BTCPay-config.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay-config.js"),t("OutboundLink")],1),e._v('. Easiest to click the "'),t("strong",[e._v("Copy raw file")]),e._v('" icon.\n'),t("img",{attrs:{src:o(715),alt:"BTCPay-config.js",title:"BTCPay-config.js"}})]),e._v(" "),t("li",[e._v("Make sure you delete example code on the "),t("code",[e._v("BTCPay-config.js")]),e._v(" file in the wix editor before pasting the new code.\n"),t("img",{attrs:{src:o(716),alt:"BTCPay-config.js completed",title:"BTCPay-config.js completed"}})]),e._v(" "),t("li",[e._v("Now, open the "),t("code",[e._v("BTCPay.js")]),e._v(" file in the wix editor and paste the code from our Git repository: "),t("a",{attrs:{href:"https://github.com/btcpayserver/wix/blob/main/backend/service-plugins/payment-provider/BTCPay/BTCPay.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay.js"),t("OutboundLink")],1),e._v(". Do not forget to remove all the example code from the file before pasting the copied code.\n"),t("img",{attrs:{src:o(717),alt:"BTCPay.js",title:"BTCPay.js"}}),e._v(" "),t("img",{attrs:{src:o(718),alt:"BTCPay.js",title:"BTCPay.js"}})]),e._v(" "),t("li",[e._v("Now we need to add the "),t("code",[e._v("http-functions.js")]),e._v(" file to the "),t("code",[e._v("backend")]),e._v(' directory. To do so, in the "backend" section of your editor click again on the '),t("strong",[e._v("(+)")]),e._v(' icon and select "'),t("strong",[e._v("Expose Site API")]),e._v('" which creates the mentioned '),t("code",[e._v("http-functions.js")]),e._v(" file. Note: If you already have that file present then you can skip this step.\n"),t("img",{attrs:{src:o(719),alt:"Create http-functions.js",title:"Create http-functions.js"}})]),e._v(" "),t("li",[e._v("Copy the code from our Git repository: "),t("a",{attrs:{href:"https://github.com/btcpayserver/wix/blob/main/backend/http-functions.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("http-functions.js"),t("OutboundLink")],1),e._v(". If you already had a "),t("code",[e._v("http-functions.js")]),e._v(" file, make sure to add the code from the Git repository to the existing file add the copied code below the existing code. If not then make sure you delete all the example code before pasting the code from GitHub.\n"),t("img",{attrs:{src:o(720),alt:"http-functions.js",title:"http-functions.js"}})]),e._v(" "),t("li",[e._v("Now the code is done it is important to click on publish to save the changes and make the plugin available.")])]),e._v(" "),t("h2",{attrs:{id:"configure-the-payment-service-provider-plugin-pspp"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configure-the-payment-service-provider-plugin-pspp"}},[e._v("#")]),e._v(" Configure the payment service provider plugin (PSPP)")]),e._v(" "),t("ol",[t("li",[e._v("Go back to your site's dashboard. On the left menu click on \""),t("strong",[e._v("Settings")]),e._v('", on that page click "'),t("strong",[e._v("Accept Payments")]),e._v('"\n'),t("img",{attrs:{src:o(721),alt:"Settings",title:"Settings"}}),e._v(" "),t("img",{attrs:{src:o(722),alt:"Accept Payments",title:"Accept Payments"}})]),e._v(" "),t("li",[e._v('On the following page, you should see "Bitcoin Payments with BTCPay" as payment provider. If not, try to refresh the page to clear the Wix cache. Click on "Connect"\n'),t("img",{attrs:{src:o(723),alt:"BTCPay",title:"BTCPay"}})]),e._v(" "),t("li",[e._v("You are now on the configuration page. You need to enter the following fields:\n"),t("ul",[t("li",[t("strong",[e._v("BTCPay URL")]),e._v(": The URL of your BTCPay Server instance, e.g. "),t("code",[e._v("https://btcpay.example.com")])]),e._v(" "),t("li",[t("strong",[e._v("API Key")]),e._v(": The API key of your BTCPay store")]),e._v(" "),t("li",[t("strong",[e._v("Store ID")]),e._v(": The store ID of your BTCPay store")]),e._v(" "),t("li",[t("strong",[e._v("Webhook Secret")]),e._v(": The webhook secret of your BTCPay store\n"),t("img",{attrs:{src:o(340),alt:"Configuration",title:"Configuration"}})])])])]),e._v(" "),t("h3",{attrs:{id:"btcpay-server-url"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-url"}},[e._v("#")]),e._v(" BTCPay Server URL")]),e._v(" "),t("ol",[t("li",[e._v('First, enter the "'),t("strong",[e._v("BTCPay Server URL")]),e._v('", in our case '),t("code",[e._v("https://testing.btcpay.tech")])]),e._v(" "),t("li",[e._v('Next, you need to get the API Key, Store ID, and Webhook Secret from your BTCPay store. To do so, log in to your BTCPay store. We assume you already have a store setup, in our guide here it is called "Wix BTCPay Demo"')])]),e._v(" "),t("h3",{attrs:{id:"api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-key"}},[e._v("#")]),e._v(" API Key")]),e._v(" "),t("ol",[t("li",[e._v('Go to the API Keys page under "'),t("strong",[e._v("Account")]),e._v('" -> "'),t("strong",[e._v("API Keys")]),e._v('" (For BTCPay Server versions prior 2.0 it is under "Account" -> "Manage Account" -> "API Keys"). Click on "'),t("strong",[e._v("Generate Key")]),e._v('"\n'),t("img",{attrs:{src:o(724),alt:"API Keys",title:"API Keys"}})]),e._v(" "),t("li",[e._v('Enter a label such as "Wix API Key".')]),e._v(" "),t("li",[e._v('For the permissions, click on the "'),t("em",[t("strong",[e._v("Select specific stores")])]),e._v('" link and select the store you want to connect to Wix, in our example "Wix BTCPay Demo" - for the following permissions: '),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(", "),t("code",[e._v("Create non-approved pull payments")]),e._v(" (used for refunds in the future)\n"),t("img",{attrs:{src:o(725),alt:"API Key permissions 1",title:"API Key permissions 1"}}),e._v(" "),t("img",{attrs:{src:o(726),alt:"API Key permissions 2",title:"API Key permissions 2"}})]),e._v(" "),t("li",[e._v('Click on "'),t("strong",[e._v("Generate API Key")]),e._v('" button and on the following page copy the API Key shown at the top\n'),t("img",{attrs:{src:o(727),alt:"Copy generated API key",title:"Copy generated API key"}})]),e._v(" "),t("li",[e._v('In your Wix store: paste that copied API key into the "'),t("strong",[e._v("API Key")]),e._v('" field')])]),e._v(" "),t("h3",{attrs:{id:"store-id"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#store-id"}},[e._v("#")]),e._v(" Store ID")]),e._v(" "),t("ol",[t("li",[e._v('Go back to your BTCPay store and copy the "'),t("strong",[e._v("Store ID")]),e._v('". Go to your store and click on "Settings" and copy the Store ID shown\n'),t("img",{attrs:{src:o(728),alt:"Copy Store ID",title:"Copy Store ID"}})]),e._v(" "),t("li",[e._v('In your Wix store: paste that copied Store ID into the "'),t("strong",[e._v("Store ID")]),e._v('" field')])]),e._v(" "),t("h3",{attrs:{id:"webhook-secret"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#webhook-secret"}},[e._v("#")]),e._v(" Webhook Secret")]),e._v(" "),t("ol",[t("li",[e._v('Go back to your BTCPay store and click on "Settings" -> "Webhooks". Click on "Create Webhook"\n'),t("img",{attrs:{src:o(729),alt:"Create webhook page",title:"Create webhook page"}})]),e._v(" "),t("li",[t("strong",[e._v("Payload URL")]),e._v(": Your Wix store URL where it can be reached combined with a callback path. E.g. "),t("code",[e._v("https://example.com/_functions/btcpayTrxWebHook")]),e._v(" (replace example.com with your Wix store URL)")]),e._v(" "),t("li",[t("strong",[e._v("Secret")]),e._v(': This is auto-generated by BTCPay, you can show it by clicking on the "eye" icon')]),e._v(" "),t("li",[e._v('Copy the "'),t("strong",[e._v("Secret")]),e._v('" and paste it into the "'),t("strong",[e._v("Webhook Secret")]),e._v("\" field in your Wix store e.g. 'YOURWEBHOOKSECRET' as shown in our example")]),e._v(" "),t("li",[e._v("Back on BTCPay webhook page, you can leave the other settings as is")]),e._v(" "),t("li",[e._v('Click on "'),t("strong",[e._v("Add Webhook")]),e._v('" to create the webhook on BTCPay. You should see the "The webhook has been created." message\n'),t("img",{attrs:{src:o(730),alt:"Webhook created successfully",title:"Webhook created successfully"}})])]),e._v(" "),t("h3",{attrs:{id:"save-the-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#save-the-configuration"}},[e._v("#")]),e._v(" Save the configuration")]),e._v(" "),t("ol",[t("li",[e._v('Back in your Wix store, click on "'),t("strong",[e._v("Connect")]),e._v('" to save the configuration\n'),t("img",{attrs:{src:o(340),alt:"Save configuration",title:"Save configuration"}}),e._v(" "),t("img",{attrs:{src:o(731),alt:"Configuration saved",title:"Configuration saved"}})])]),e._v(" "),t("h2",{attrs:{id:"testing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#testing"}},[e._v("#")]),e._v(" Testing")]),e._v(" "),t("p",[e._v('You are now ready to test your BTCPay integration on your Wix store. Add some products to the cart and go through the checkout process and select "'),t("strong",[e._v("Bitcoin payments with BTCPay")]),e._v('"')]),e._v(" "),t("h2",{attrs:{id:"troubleshooting-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting-faq"}},[e._v("#")]),e._v(" Troubleshooting / FAQ")]),e._v(" "),t("h3",{attrs:{id:"it-does-not-work-what-can-i-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#it-does-not-work-what-can-i-do"}},[e._v("#")]),e._v(" It does not work, what can I do?")]),e._v(" "),t("ul",[t("li",[e._v("Make sure you followed the guide step by step and copied the right values into the right places")]),e._v(" "),t("li",[e._v('In Wix under "'),t("strong",[e._v("Developer tools")]),e._v('" select "'),t("strong",[e._v("Logging Tools")]),e._v('" and there open the "'),t("strong",[e._v("Wix Logs")]),e._v('", it will live log any errors. So try to do the checkout or save the configuration form to see if there is any error.')])]),e._v(" "),t("h3",{attrs:{id:"after-copying-the-code-from-the-git-repository-i-dont-see-the-payment-method-listed-in-accept-payments-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#after-copying-the-code-from-the-git-repository-i-dont-see-the-payment-method-listed-in-accept-payments-"}},[e._v("#")]),e._v(' After copying the code from the Git repository, I don\'t see the payment method listed in "Accept payments"')]),e._v(" "),t("p",[e._v('Try to delete the browser cache and reload the page. You can also try to go into editor and click on "Publish" to save the changes. Then reload the payment method list page again.')]),e._v(" "),t("h3",{attrs:{id:"how-can-i-change-the-text-of-the-payment-method-bitcoin-payments-with-btcpay-in-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-change-the-text-of-the-payment-method-bitcoin-payments-with-btcpay-in-the-checkout"}},[e._v("#")]),e._v(' How can I change the text of the payment method, "Bitcoin Payments with BTCPay" in the checkout?')]),e._v(" "),t("p",[e._v("You need to go into your Wix Editor and edit the file "),t("code",[e._v("BTCPay-config.js")]),e._v(". You can change the text in the "),t("code",[e._v("title")]),e._v(" field")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("...\nhostedPage: {\n title: 'Bitcoin Payments with BTCPay', // change this line\n billingAddressMandatoryFields: ['EMAIL'],\n...\n")])])]),t("h3",{attrs:{id:"i-still-have-a-problem-where-can-i-get-help"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-still-have-a-problem-where-can-i-get-help"}},[e._v("#")]),e._v(" I still have a problem, where can I get help?")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{340:function(e,t,o){e.exports=o.p+"assets/img/16_wix_btcpay-config.5f3fa8a9.png"},690:function(e,t,o){e.exports=o.p+"assets/img/01_wix_dev-mode.d3ebf3bb.png"},691:function(e,t,o){e.exports=o.p+"assets/img/02_wix_service-plugin-payment.99ffd208.png"},692:function(e,t,o){e.exports=o.p+"assets/img/03_wix_ppsp-start-now.044a2d88.png"},693:function(e,t,o){e.exports=o.p+"assets/img/04_wix_ppsp-legal-notice.658c1fe6.png"},694:function(e,t,o){e.exports=o.p+"assets/img/05_wix_ppsp-name.990dfe01.png"},695:function(e,t,o){e.exports=o.p+"assets/img/06_wix_ppsp-btcpay-config.5d4b9637.png"},696:function(e,t,o){e.exports=o.p+"assets/img/07_wix_gh-btcpay-config.a90cd4e2.png"},697:function(e,t,o){e.exports=o.p+"assets/img/08_wix_ppsp-btcpay-config-complete.06d14fc5.png"},698:function(e,t,o){e.exports=o.p+"assets/img/09_wix_gh-btcpay.f4ba84b1.png"},699:function(e,t,o){e.exports=o.p+"assets/img/10_wix_ppsp-btcpay.aa84c719.png"},700:function(e,t,o){e.exports=o.p+"assets/img/11_wix_backend-expose-site-api.a7733acf.png"},701:function(e,t,o){e.exports=o.p+"assets/img/12_wix_backend-http-functions.ba365413.png"},702:function(e,t,o){e.exports=o.p+"assets/img/13_wix_settings.9275944e.png"},703:function(e,t,o){e.exports=o.p+"assets/img/14_wix_accept-payments.984c3b09.png"},704:function(e,t,o){e.exports=o.p+"assets/img/15_wix_list-btcpay.aabe82d7.png"},705:function(e,t,o){e.exports=o.p+"assets/img/17_btcpay-api-key-page.a525c66b.png"},706:function(e,t,o){e.exports=o.p+"assets/img/18_btcpay-api-key-permissions-1.2a52f496.png"},707:function(e,t,o){e.exports=o.p+"assets/img/18_btcpay-api-key-permissions-2.4a634a53.png"},708:function(e,t,o){e.exports=o.p+"assets/img/19_btcpay-api-key-copy.4cb4fc6a.png"},709:function(e,t,o){e.exports=o.p+"assets/img/20_btcpay-store-id.62536621.png"},710:function(e,t,o){e.exports=o.p+"assets/img/21_btcpay-webhook-page.6ca3fd85.png"},711:function(e,t,o){e.exports=o.p+"assets/img/22_btcpay-webhook-saved.1e659e6d.png"},712:function(e,t,o){e.exports=o.p+"assets/img/23_wix_btcpay-config-saved.30337d07.png"},903:function(e,t,o){"use strict";o.r(t);var a=o(17),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btcpay-server-integration-for-wix"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-integration-for-wix"}},[e._v("#")]),e._v(" BTCPay Server integration for Wix")]),e._v(" "),t("p",[e._v("This guide will show you how you can enable Bitcoin payments using BTCPay Server on your Wix store. At the time of writing it is not possible to package this into a Wix app, so you will need to follow the steps below and copy and paste the code into your Wix editor.")]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("You have a "),t("a",{attrs:{href:"https://wix.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wix"),t("OutboundLink")],1),e._v(" account and online store up and running")]),e._v(" "),t("li",[e._v("You have a BTCPay Server version 1.10.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")]),e._v(".")],1),e._v(" "),t("li",[e._v("BTCPay needs to be reachable from the internet via a domain, e.g. https://mainnet.demo.btcpayserver.org")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've a wallet connected to your store")]),e._v(" and/or "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning Network")]),e._v(" enabled or connected.")],1)]),e._v(" "),t("h2",{attrs:{id:"create-a-payment-provider-service-plugin-ppsp"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-payment-provider-service-plugin-ppsp"}},[e._v("#")]),e._v(" Create a payment provider service plugin (PPSP)")]),e._v(" "),t("ol",[t("li",[e._v("In your Wix site, open your Wix Editor.")]),e._v(" "),t("li",[e._v('At the top click on "'),t("strong",[e._v("Dev Mode")]),e._v('" and the "'),t("strong",[e._v("Turn on Dev Mode")]),e._v('" button to enable the developer mode.\n'),t("img",{attrs:{src:o(690),alt:"Dev Mode",title:"Dev Mode"}})]),e._v(" "),t("li",[e._v("Now on the left side, click on the "),t("code",[e._v("{ }")]),e._v(" icon to open the code editor.")]),e._v(" "),t("li",[e._v('In the section "Service Plugins" click on the '),t("strong",[e._v("(+)")]),e._v(' sign and select "'),t("strong",[e._v("Payment")]),e._v('"\n'),t("img",{attrs:{src:o(691),alt:"Add payment provider service plugin",title:"Add payment provider service plugin"}})]),e._v(" "),t("li",[e._v('On the following screen, click "'),t("strong",[e._v("Start now")]),e._v('"\n'),t("img",{attrs:{src:o(692),alt:"Start now",title:"Start now"}})]),e._v(" "),t("li",[e._v('On the legal terms page, check the terms and click "'),t("strong",[e._v("Accept")]),e._v('"\n'),t("img",{attrs:{src:o(693),alt:"Accept terms",title:"Accept terms"}})]),e._v(" "),t("li",[e._v('Now enter the name of the plugin: "'),t("strong",[e._v("BTCPay")]),e._v('" (you can use any name but this will make it easier to follow the guide). Then, click "Add & Edit Code":\n'),t("img",{attrs:{src:o(694),alt:"Add & Edit Code",title:"Add & Edit Code"}})]),e._v(" "),t("li",[e._v('This created the directory "BTCPay" containing two files: '),t("code",[e._v("BTCPay.js")]),e._v(" and "),t("code",[e._v("BTCPay-config.js")]),e._v(" which is open in the editor.\n"),t("img",{attrs:{src:o(695),alt:"BTCPay-config.js",title:"BTCPay-config.js"}})]),e._v(" "),t("li",[e._v("Next steps are to copy the contents of those two files from our "),t("a",{attrs:{href:"https://github.com/btcpayserver/wix",target:"_blank",rel:"noopener noreferrer"}},[e._v("Git repository"),t("OutboundLink")],1),e._v(". You can see the same data structure as on your wix editor. In the "),t("code",[e._v("BTCPay-config.js")]),e._v(" file, paste the code from the same file on our Git repository: "),t("a",{attrs:{href:"https://github.com/btcpayserver/wix/blob/main/backend/service-plugins/payment-provider/BTCPay/BTCPay-config.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay-config.js"),t("OutboundLink")],1),e._v('. Easiest to click the "'),t("strong",[e._v("Copy raw file")]),e._v('" icon.\n'),t("img",{attrs:{src:o(696),alt:"BTCPay-config.js",title:"BTCPay-config.js"}})]),e._v(" "),t("li",[e._v("Make sure you delete example code on the "),t("code",[e._v("BTCPay-config.js")]),e._v(" file in the wix editor before pasting the new code.\n"),t("img",{attrs:{src:o(697),alt:"BTCPay-config.js completed",title:"BTCPay-config.js completed"}})]),e._v(" "),t("li",[e._v("Now, open the "),t("code",[e._v("BTCPay.js")]),e._v(" file in the wix editor and paste the code from our Git repository: "),t("a",{attrs:{href:"https://github.com/btcpayserver/wix/blob/main/backend/service-plugins/payment-provider/BTCPay/BTCPay.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay.js"),t("OutboundLink")],1),e._v(". Do not forget to remove all the example code from the file before pasting the copied code.\n"),t("img",{attrs:{src:o(698),alt:"BTCPay.js",title:"BTCPay.js"}}),e._v(" "),t("img",{attrs:{src:o(699),alt:"BTCPay.js",title:"BTCPay.js"}})]),e._v(" "),t("li",[e._v("Now we need to add the "),t("code",[e._v("http-functions.js")]),e._v(" file to the "),t("code",[e._v("backend")]),e._v(' directory. To do so, in the "backend" section of your editor click again on the '),t("strong",[e._v("(+)")]),e._v(' icon and select "'),t("strong",[e._v("Expose Site API")]),e._v('" which creates the mentioned '),t("code",[e._v("http-functions.js")]),e._v(" file. Note: If you already have that file present then you can skip this step.\n"),t("img",{attrs:{src:o(700),alt:"Create http-functions.js",title:"Create http-functions.js"}})]),e._v(" "),t("li",[e._v("Copy the code from our Git repository: "),t("a",{attrs:{href:"https://github.com/btcpayserver/wix/blob/main/backend/http-functions.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("http-functions.js"),t("OutboundLink")],1),e._v(". If you already had a "),t("code",[e._v("http-functions.js")]),e._v(" file, make sure to add the code from the Git repository to the existing file add the copied code below the existing code. If not then make sure you delete all the example code before pasting the code from GitHub.\n"),t("img",{attrs:{src:o(701),alt:"http-functions.js",title:"http-functions.js"}})]),e._v(" "),t("li",[e._v("Now the code is done it is important to click on publish to save the changes and make the plugin available.")])]),e._v(" "),t("h2",{attrs:{id:"configure-the-payment-service-provider-plugin-pspp"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configure-the-payment-service-provider-plugin-pspp"}},[e._v("#")]),e._v(" Configure the payment service provider plugin (PSPP)")]),e._v(" "),t("ol",[t("li",[e._v("Go back to your site's dashboard. On the left menu click on \""),t("strong",[e._v("Settings")]),e._v('", on that page click "'),t("strong",[e._v("Accept Payments")]),e._v('"\n'),t("img",{attrs:{src:o(702),alt:"Settings",title:"Settings"}}),e._v(" "),t("img",{attrs:{src:o(703),alt:"Accept Payments",title:"Accept Payments"}})]),e._v(" "),t("li",[e._v('On the following page, you should see "Bitcoin Payments with BTCPay" as payment provider. If not, try to refresh the page to clear the Wix cache. Click on "Connect"\n'),t("img",{attrs:{src:o(704),alt:"BTCPay",title:"BTCPay"}})]),e._v(" "),t("li",[e._v("You are now on the configuration page. You need to enter the following fields:\n"),t("ul",[t("li",[t("strong",[e._v("BTCPay URL")]),e._v(": The URL of your BTCPay Server instance, e.g. "),t("code",[e._v("https://btcpay.example.com")])]),e._v(" "),t("li",[t("strong",[e._v("API Key")]),e._v(": The API key of your BTCPay store")]),e._v(" "),t("li",[t("strong",[e._v("Store ID")]),e._v(": The store ID of your BTCPay store")]),e._v(" "),t("li",[t("strong",[e._v("Webhook Secret")]),e._v(": The webhook secret of your BTCPay store\n"),t("img",{attrs:{src:o(340),alt:"Configuration",title:"Configuration"}})])])])]),e._v(" "),t("h3",{attrs:{id:"btcpay-server-url"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-url"}},[e._v("#")]),e._v(" BTCPay Server URL")]),e._v(" "),t("ol",[t("li",[e._v('First, enter the "'),t("strong",[e._v("BTCPay Server URL")]),e._v('", in our case '),t("code",[e._v("https://testing.btcpay.tech")])]),e._v(" "),t("li",[e._v('Next, you need to get the API Key, Store ID, and Webhook Secret from your BTCPay store. To do so, log in to your BTCPay store. We assume you already have a store setup, in our guide here it is called "Wix BTCPay Demo"')])]),e._v(" "),t("h3",{attrs:{id:"api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-key"}},[e._v("#")]),e._v(" API Key")]),e._v(" "),t("ol",[t("li",[e._v('Go to the API Keys page under "'),t("strong",[e._v("Account")]),e._v('" -> "'),t("strong",[e._v("API Keys")]),e._v('" (For BTCPay Server versions prior 2.0 it is under "Account" -> "Manage Account" -> "API Keys"). Click on "'),t("strong",[e._v("Generate Key")]),e._v('"\n'),t("img",{attrs:{src:o(705),alt:"API Keys",title:"API Keys"}})]),e._v(" "),t("li",[e._v('Enter a label such as "Wix API Key".')]),e._v(" "),t("li",[e._v('For the permissions, click on the "'),t("em",[t("strong",[e._v("Select specific stores")])]),e._v('" link and select the store you want to connect to Wix, in our example "Wix BTCPay Demo" - for the following permissions: '),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(", "),t("code",[e._v("Create non-approved pull payments")]),e._v(" (used for refunds in the future)\n"),t("img",{attrs:{src:o(706),alt:"API Key permissions 1",title:"API Key permissions 1"}}),e._v(" "),t("img",{attrs:{src:o(707),alt:"API Key permissions 2",title:"API Key permissions 2"}})]),e._v(" "),t("li",[e._v('Click on "'),t("strong",[e._v("Generate API Key")]),e._v('" button and on the following page copy the API Key shown at the top\n'),t("img",{attrs:{src:o(708),alt:"Copy generated API key",title:"Copy generated API key"}})]),e._v(" "),t("li",[e._v('In your Wix store: paste that copied API key into the "'),t("strong",[e._v("API Key")]),e._v('" field')])]),e._v(" "),t("h3",{attrs:{id:"store-id"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#store-id"}},[e._v("#")]),e._v(" Store ID")]),e._v(" "),t("ol",[t("li",[e._v('Go back to your BTCPay store and copy the "'),t("strong",[e._v("Store ID")]),e._v('". Go to your store and click on "Settings" and copy the Store ID shown\n'),t("img",{attrs:{src:o(709),alt:"Copy Store ID",title:"Copy Store ID"}})]),e._v(" "),t("li",[e._v('In your Wix store: paste that copied Store ID into the "'),t("strong",[e._v("Store ID")]),e._v('" field')])]),e._v(" "),t("h3",{attrs:{id:"webhook-secret"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#webhook-secret"}},[e._v("#")]),e._v(" Webhook Secret")]),e._v(" "),t("ol",[t("li",[e._v('Go back to your BTCPay store and click on "Settings" -> "Webhooks". Click on "Create Webhook"\n'),t("img",{attrs:{src:o(710),alt:"Create webhook page",title:"Create webhook page"}})]),e._v(" "),t("li",[t("strong",[e._v("Payload URL")]),e._v(": Your Wix store URL where it can be reached combined with a callback path. E.g. "),t("code",[e._v("https://example.com/_functions/btcpayTrxWebHook")]),e._v(" (replace example.com with your Wix store URL)")]),e._v(" "),t("li",[t("strong",[e._v("Secret")]),e._v(': This is auto-generated by BTCPay, you can show it by clicking on the "eye" icon')]),e._v(" "),t("li",[e._v('Copy the "'),t("strong",[e._v("Secret")]),e._v('" and paste it into the "'),t("strong",[e._v("Webhook Secret")]),e._v("\" field in your Wix store e.g. 'YOURWEBHOOKSECRET' as shown in our example")]),e._v(" "),t("li",[e._v("Back on BTCPay webhook page, you can leave the other settings as is")]),e._v(" "),t("li",[e._v('Click on "'),t("strong",[e._v("Add Webhook")]),e._v('" to create the webhook on BTCPay. You should see the "The webhook has been created." message\n'),t("img",{attrs:{src:o(711),alt:"Webhook created successfully",title:"Webhook created successfully"}})])]),e._v(" "),t("h3",{attrs:{id:"save-the-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#save-the-configuration"}},[e._v("#")]),e._v(" Save the configuration")]),e._v(" "),t("ol",[t("li",[e._v('Back in your Wix store, click on "'),t("strong",[e._v("Connect")]),e._v('" to save the configuration\n'),t("img",{attrs:{src:o(340),alt:"Save configuration",title:"Save configuration"}}),e._v(" "),t("img",{attrs:{src:o(712),alt:"Configuration saved",title:"Configuration saved"}})])]),e._v(" "),t("h2",{attrs:{id:"testing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#testing"}},[e._v("#")]),e._v(" Testing")]),e._v(" "),t("p",[e._v('You are now ready to test your BTCPay integration on your Wix store. Add some products to the cart and go through the checkout process and select "'),t("strong",[e._v("Bitcoin payments with BTCPay")]),e._v('"')]),e._v(" "),t("h2",{attrs:{id:"troubleshooting-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting-faq"}},[e._v("#")]),e._v(" Troubleshooting / FAQ")]),e._v(" "),t("h3",{attrs:{id:"it-does-not-work-what-can-i-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#it-does-not-work-what-can-i-do"}},[e._v("#")]),e._v(" It does not work, what can I do?")]),e._v(" "),t("ul",[t("li",[e._v("Make sure you followed the guide step by step and copied the right values into the right places")]),e._v(" "),t("li",[e._v('In Wix under "'),t("strong",[e._v("Developer tools")]),e._v('" select "'),t("strong",[e._v("Logging Tools")]),e._v('" and there open the "'),t("strong",[e._v("Wix Logs")]),e._v('", it will live log any errors. So try to do the checkout or save the configuration form to see if there is any error.')])]),e._v(" "),t("h3",{attrs:{id:"after-copying-the-code-from-the-git-repository-i-dont-see-the-payment-method-listed-in-accept-payments-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#after-copying-the-code-from-the-git-repository-i-dont-see-the-payment-method-listed-in-accept-payments-"}},[e._v("#")]),e._v(' After copying the code from the Git repository, I don\'t see the payment method listed in "Accept payments"')]),e._v(" "),t("p",[e._v('Try to delete the browser cache and reload the page. You can also try to go into editor and click on "Publish" to save the changes. Then reload the payment method list page again.')]),e._v(" "),t("h3",{attrs:{id:"how-can-i-change-the-text-of-the-payment-method-bitcoin-payments-with-btcpay-in-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-change-the-text-of-the-payment-method-bitcoin-payments-with-btcpay-in-the-checkout"}},[e._v("#")]),e._v(' How can I change the text of the payment method, "Bitcoin Payments with BTCPay" in the checkout?')]),e._v(" "),t("p",[e._v("You need to go into your Wix Editor and edit the file "),t("code",[e._v("BTCPay-config.js")]),e._v(". You can change the text in the "),t("code",[e._v("title")]),e._v(" field")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("...\nhostedPage: {\n title: 'Bitcoin Payments with BTCPay', // change this line\n billingAddressMandatoryFields: ['EMAIL'],\n...\n")])])]),t("h3",{attrs:{id:"i-still-have-a-problem-where-can-i-get-help"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-still-have-a-problem-where-can-i-get-help"}},[e._v("#")]),e._v(" I still have a problem, where can I get help?")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/121.cf62b7dd.js b/assets/js/121.0b3c9f6d.js similarity index 99% rename from assets/js/121.cf62b7dd.js rename to assets/js/121.0b3c9f6d.js index cbc89b681b..28faf8fe97 100644 --- a/assets/js/121.cf62b7dd.js +++ b/assets/js/121.0b3c9f6d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[121],{804:function(t,s,a){"use strict";a.r(s);var e=a(17),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"forward-ports-with-a-reverse-ssh-tunnel"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#forward-ports-with-a-reverse-ssh-tunnel"}},[t._v("#")]),t._v(" Forward ports with a reverse SSH tunnel")]),t._v(" "),s("h2",{attrs:{id:"advantages"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#advantages"}},[t._v("#")]),t._v(" Advantages")]),t._v(" "),s("ul",[s("li",[t._v("no port forwarding needed on the LAN of the host")]),t._v(" "),s("li",[t._v("encrypted connection")]),t._v(" "),s("li",[t._v("hides the IP of the host")])]),t._v(" "),s("h2",{attrs:{id:"requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),s("ul",[s("li",[t._v("a Virtual Private Server (VPS) - eg. a minimal package on Lunanode for ~3.5$/month")]),t._v(" "),s("li",[t._v("root access on the VPS - only root can forward ports under no. 1000")]),t._v(" "),s("li",[t._v("ssh access to the host computer (where the ports will be forwarded from)")])]),t._v(" "),s("h2",{attrs:{id:"setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup"}},[t._v("#")]),t._v(" Setup")]),t._v(" "),s("h3",{attrs:{id:"on-the-host-your-btcpay-server-instance"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#on-the-host-your-btcpay-server-instance"}},[t._v("#")]),t._v(" On the host (your BTCPay Server instance)")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# switch to root user (if not logged in as root)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# check for an existing ssh public key")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" ~/.ssh/*.pub\n")])])]),s("p",[t._v("If there is none generate one (keep pressing ENTER):")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("ssh-keygen "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-t")]),t._v(" rsa "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-b")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4096")]),t._v("\n")])])]),s("p",[t._v("This will generate the SSH keypair "),s("code",[t._v("id_rsa")]),t._v(" (private key) and "),s("code",[t._v("id_rsa.pub")]),t._v(" inside "),s("code",[t._v("~/.ssh")]),t._v(".")]),t._v(" "),s("p",[t._v("The private key needs to get added to the ssh-agent:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# start the ssh-agent in the background")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("eval")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("ssh-agent "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# add private key to ssh-agent")]),t._v("\nssh-add ~/.ssh/id_rsa\n")])])]),s("p",[t._v("Copy the public key over to the VPS (fill in the "),s("code",[t._v("VPS_IP_ADDRESS")]),t._v(").\nYou will be prompted for the root password of the VPS.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("ssh-copy-id "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" ~/.ssh/id_rsa.pub root@VPS_IP_ADDRESS\n")])])]),s("p",[t._v("To verify that it works, SSH into the VPS – this should not prompt for the password anymore:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ssh")]),t._v(" root@VPS_IP_ADDRESS\n")])])]),s("h3",{attrs:{id:"on-the-vps"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#on-the-vps"}},[t._v("#")]),t._v(" On the VPS")]),t._v(" "),s("p",[t._v("You can either reuse the connection from before or login as root.")]),t._v(" "),s("p",[t._v("Edit the sshd config:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("nano")]),t._v(" /etc/ssh/sshd_config\n")])])]),s("p",[t._v("Make sure these entries are active (meaning there is no "),s("code",[t._v("#")]),t._v(" at the beggining of the line).\nAlternatively, you can just paste these on the end of the file:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("RSAAuthentication yes # not needed on latest OpenSSH versions\nPubkeyAuthentication yes\nGatewayPorts yes\nAllowTcpForwarding yes\nClientAliveInterval 60\n")])])]),s("p",[t._v("CTRL+O, ENTER to save, CTRL+X to exit.")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("You can lose access at this point if the sshd config is wrong. Please double-check!")])]),t._v(" "),s("p",[t._v("Restart the sshd service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart sshd\n")])])]),s("h3",{attrs:{id:"back-to-the-host-your-btcpay-server-instance"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#back-to-the-host-your-btcpay-server-instance"}},[t._v("#")]),t._v(" Back to the host (your BTCPay Server instance)")]),t._v(" "),s("h4",{attrs:{id:"install-and-set-up-autossh"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-and-set-up-autossh"}},[t._v("#")]),t._v(" Install and set up autossh")]),t._v(" "),s("p",[t._v("Install the "),s("code",[t._v("autossh")]),t._v(" dependency:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" autossh\n")])])]),s("p",[t._v("Create the service file:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("nano")]),t._v(" /etc/systemd/system/autossh-tunnel.service\n")])])]),s("p",[t._v("Paste the following and fill in the "),s("code",[t._v("VPS_IP_ADDRESS")]),t._v(".\nAdd or remove ports as required.")]),t._v(" "),s("div",{staticClass:"language-ini extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ini"}},[s("code",[s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Unit")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Description")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("AutoSSH tunnel service")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("After")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("network.target")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Service")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("User")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("root")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Group")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("root")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Environment")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v('"'),s("span",{pre:!0,attrs:{class:"token inner-value"}},[t._v("AUTOSSH_GATETIME=0")]),t._v('"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("ExecStart")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v('/usr/bin/autossh -C -M 0 -v -N -o "ServerAliveInterval=60" -R 9735:localhost:9735 -R 443:localhost:443 -R 80:localhost:80 root@VPS_IP_ADDRESS')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("StandardOutput")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("journal")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Install")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("WantedBy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("multi-user.target")]),t._v("\n")])])]),s("p",[t._v("Enable and start the service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" autossh-tunnel\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start autossh-tunnel\n")])])]),s("p",[t._v("The port forwarding with a reverse ssh-tunnel is now complete.\nYou should be able access the ports/services of the host computer through the IP of the VPS.")]),t._v(" "),s("h2",{attrs:{id:"monitoring"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#monitoring"}},[t._v("#")]),t._v(" Monitoring")]),t._v(" "),s("p",[t._v("Check if there are any errors on the host computer:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" autossh-tunnel\n")])])]),s("p",[t._v("To check if tunnel is active on the VPS:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tulpn")]),t._v("\n")])])]),s("h2",{attrs:{id:"resources"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resources"}},[t._v("#")]),t._v(" Resources")]),t._v(" "),s("ul",[s("li",[t._v("Raspiblitz FAQ: "),s("a",{attrs:{href:"https://github.com/rootzoll/raspiblitz/blob/master/FAQ.md#how-to-setup-port-forwarding-with-a-ssh-tunnel",target:"_blank",rel:"noopener noreferrer"}},[t._v("How to setup port-forwarding with a SSH tunnel?"),s("OutboundLink")],1)]),t._v(" "),s("li",[t._v("RaspiBolt Docs: "),s("a",{attrs:{href:"https://raspibolt.org/guide/raspberry-pi/security.html#login-with-ssh-keys",target:"_blank",rel:"noopener noreferrer"}},[t._v("Login with SSH keys"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[121],{806:function(t,s,a){"use strict";a.r(s);var e=a(17),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"forward-ports-with-a-reverse-ssh-tunnel"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#forward-ports-with-a-reverse-ssh-tunnel"}},[t._v("#")]),t._v(" Forward ports with a reverse SSH tunnel")]),t._v(" "),s("h2",{attrs:{id:"advantages"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#advantages"}},[t._v("#")]),t._v(" Advantages")]),t._v(" "),s("ul",[s("li",[t._v("no port forwarding needed on the LAN of the host")]),t._v(" "),s("li",[t._v("encrypted connection")]),t._v(" "),s("li",[t._v("hides the IP of the host")])]),t._v(" "),s("h2",{attrs:{id:"requirements"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),s("ul",[s("li",[t._v("a Virtual Private Server (VPS) - eg. a minimal package on Lunanode for ~3.5$/month")]),t._v(" "),s("li",[t._v("root access on the VPS - only root can forward ports under no. 1000")]),t._v(" "),s("li",[t._v("ssh access to the host computer (where the ports will be forwarded from)")])]),t._v(" "),s("h2",{attrs:{id:"setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup"}},[t._v("#")]),t._v(" Setup")]),t._v(" "),s("h3",{attrs:{id:"on-the-host-your-btcpay-server-instance"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#on-the-host-your-btcpay-server-instance"}},[t._v("#")]),t._v(" On the host (your BTCPay Server instance)")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# switch to root user (if not logged in as root)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# check for an existing ssh public key")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" ~/.ssh/*.pub\n")])])]),s("p",[t._v("If there is none generate one (keep pressing ENTER):")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("ssh-keygen "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-t")]),t._v(" rsa "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-b")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4096")]),t._v("\n")])])]),s("p",[t._v("This will generate the SSH keypair "),s("code",[t._v("id_rsa")]),t._v(" (private key) and "),s("code",[t._v("id_rsa.pub")]),t._v(" inside "),s("code",[t._v("~/.ssh")]),t._v(".")]),t._v(" "),s("p",[t._v("The private key needs to get added to the ssh-agent:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# start the ssh-agent in the background")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("eval")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("ssh-agent "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# add private key to ssh-agent")]),t._v("\nssh-add ~/.ssh/id_rsa\n")])])]),s("p",[t._v("Copy the public key over to the VPS (fill in the "),s("code",[t._v("VPS_IP_ADDRESS")]),t._v(").\nYou will be prompted for the root password of the VPS.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("ssh-copy-id "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" ~/.ssh/id_rsa.pub root@VPS_IP_ADDRESS\n")])])]),s("p",[t._v("To verify that it works, SSH into the VPS – this should not prompt for the password anymore:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ssh")]),t._v(" root@VPS_IP_ADDRESS\n")])])]),s("h3",{attrs:{id:"on-the-vps"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#on-the-vps"}},[t._v("#")]),t._v(" On the VPS")]),t._v(" "),s("p",[t._v("You can either reuse the connection from before or login as root.")]),t._v(" "),s("p",[t._v("Edit the sshd config:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("nano")]),t._v(" /etc/ssh/sshd_config\n")])])]),s("p",[t._v("Make sure these entries are active (meaning there is no "),s("code",[t._v("#")]),t._v(" at the beggining of the line).\nAlternatively, you can just paste these on the end of the file:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("RSAAuthentication yes # not needed on latest OpenSSH versions\nPubkeyAuthentication yes\nGatewayPorts yes\nAllowTcpForwarding yes\nClientAliveInterval 60\n")])])]),s("p",[t._v("CTRL+O, ENTER to save, CTRL+X to exit.")]),t._v(" "),s("div",{staticClass:"custom-block warning"},[s("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),s("p",[t._v("You can lose access at this point if the sshd config is wrong. Please double-check!")])]),t._v(" "),s("p",[t._v("Restart the sshd service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart sshd\n")])])]),s("h3",{attrs:{id:"back-to-the-host-your-btcpay-server-instance"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#back-to-the-host-your-btcpay-server-instance"}},[t._v("#")]),t._v(" Back to the host (your BTCPay Server instance)")]),t._v(" "),s("h4",{attrs:{id:"install-and-set-up-autossh"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-and-set-up-autossh"}},[t._v("#")]),t._v(" Install and set up autossh")]),t._v(" "),s("p",[t._v("Install the "),s("code",[t._v("autossh")]),t._v(" dependency:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" autossh\n")])])]),s("p",[t._v("Create the service file:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("nano")]),t._v(" /etc/systemd/system/autossh-tunnel.service\n")])])]),s("p",[t._v("Paste the following and fill in the "),s("code",[t._v("VPS_IP_ADDRESS")]),t._v(".\nAdd or remove ports as required.")]),t._v(" "),s("div",{staticClass:"language-ini extra-class"},[s("pre",{pre:!0,attrs:{class:"language-ini"}},[s("code",[s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Unit")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Description")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("AutoSSH tunnel service")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("After")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("network.target")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Service")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("User")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("root")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Group")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("root")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("Environment")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v('"'),s("span",{pre:!0,attrs:{class:"token inner-value"}},[t._v("AUTOSSH_GATETIME=0")]),t._v('"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("ExecStart")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v('/usr/bin/autossh -C -M 0 -v -N -o "ServerAliveInterval=60" -R 9735:localhost:9735 -R 443:localhost:443 -R 80:localhost:80 root@VPS_IP_ADDRESS')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("StandardOutput")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("journal")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token section"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token section-name selector"}},[t._v("Install")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token key attr-name"}},[t._v("WantedBy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token value attr-value"}},[t._v("multi-user.target")]),t._v("\n")])])]),s("p",[t._v("Enable and start the service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v(" autossh-tunnel\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start autossh-tunnel\n")])])]),s("p",[t._v("The port forwarding with a reverse ssh-tunnel is now complete.\nYou should be able access the ports/services of the host computer through the IP of the VPS.")]),t._v(" "),s("h2",{attrs:{id:"monitoring"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#monitoring"}},[t._v("#")]),t._v(" Monitoring")]),t._v(" "),s("p",[t._v("Check if there are any errors on the host computer:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" journalctl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-n")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" autossh-tunnel\n")])])]),s("p",[t._v("To check if tunnel is active on the VPS:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tulpn")]),t._v("\n")])])]),s("h2",{attrs:{id:"resources"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resources"}},[t._v("#")]),t._v(" Resources")]),t._v(" "),s("ul",[s("li",[t._v("Raspiblitz FAQ: "),s("a",{attrs:{href:"https://github.com/rootzoll/raspiblitz/blob/master/FAQ.md#how-to-setup-port-forwarding-with-a-ssh-tunnel",target:"_blank",rel:"noopener noreferrer"}},[t._v("How to setup port-forwarding with a SSH tunnel?"),s("OutboundLink")],1)]),t._v(" "),s("li",[t._v("RaspiBolt Docs: "),s("a",{attrs:{href:"https://raspibolt.org/guide/raspberry-pi/security.html#login-with-ssh-keys",target:"_blank",rel:"noopener noreferrer"}},[t._v("Login with SSH keys"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/122.6634e499.js b/assets/js/122.a1c66bd7.js similarity index 99% rename from assets/js/122.6634e499.js rename to assets/js/122.a1c66bd7.js index 4e716ba31e..c20c62233a 100644 --- a/assets/js/122.6634e499.js +++ b/assets/js/122.a1c66bd7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[122],{806:function(e,t,r){"use strict";r.r(t);var s=r(17),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"third-party-hosting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#third-party-hosting"}},[e._v("#")]),e._v(" Third-party hosting")]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("third-party host")]),e._v(" is an individual or a business which "),t("strong",[e._v("self-hosts a BTCPay Server instance and enables other users to register and use the server")]),e._v(". On a self-hosted server, the owner can add an unlimited amount of users and stores and allow those users to manage their stores independently and receive payments to their own wallets.")]),e._v(" "),t("p",[e._v("While this feature in BTCPay Server exists for complex multi-store business management, community enthusiasts use it to help other users (mostly beginners), sometimes skip an overwhelming step of "),t("strong",[e._v("deploying a self-hosted BTCPay server")]),e._v(". Users who want to test or develop applications on top of BTCPay Server also use "),t("strong",[e._v("instances hosted by third-parties")]),e._v(". Some hosts try to spread the adoption of cryptocurrencies by allowing their local merchants to receive payments for free or for a small sign-up fee.")]),e._v(" "),t("p",[e._v("In layman words, think of this feature as a payment processor factory which allows anyone to deploy a server and help others receive payments which are validated via the server owners' "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Full_node",target:"_blank",rel:"noopener noreferrer"}},[e._v("full Bitcoin node"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Third-party hosts")]),e._v(" play an important role in the ecosystem since they provide an easy and cost-effective "),t("strong",[e._v("way for users to try and use BTCPay Server")]),e._v(". The role of honest hosts who provide free service to others is essential in the early phase of BTCPay Server adoption. However, users should be familiar with the pros, cons and potential risks involved when using a trusted third-party. Find the optimal balance between your use-case, cost, and privacy/security trade-offs.")]),e._v(" "),t("p",[e._v("Some of the hosts are entirely free to use and maintain the server cost from donations of their users. If you've been using a reliable free host for a while, you should consider donating to them to support them.")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#third-party-hosting"}},[e._v("Third-party hosting")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#advantages-and-disadvantages"}},[e._v("Advantages and disadvantages")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#pros"}},[e._v("Pros")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#cons"}},[e._v("Cons")])])])]),e._v(" "),t("li",[t("a",{attrs:{href:"#concerns-for-use"}},[e._v("Concerns For Use")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#security-concerns"}},[e._v("Security Concerns")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#privacy-concerns"}},[e._v("Privacy Concerns")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#trust-concerns"}},[e._v("Trust Concerns")])])])]),e._v(" "),t("li",[t("a",{attrs:{href:"#third-party-hosting-faq"}},[e._v("Third Party Hosting FAQ")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#where-is-the-list-of-btcpay-third-party-hosts"}},[e._v("Where is the list of BTCPay third-party hosts?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#how-can-one-become-a-third-party-host"}},[e._v("How can one become a third-party host?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#are-there-any-limitations-in-features-when-using-a-third-party-host"}},[e._v("Are there any limitations in features when using a third-party host?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[e._v("Can I enable the use of my Lightning Network node to others?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#what-does-the-trusted-third-party-host-know-about-their-users"}},[e._v("What does the trusted third-party host know about their users?")])])])])]),e._v(" "),t("h2",{attrs:{id:"advantages-and-disadvantages"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advantages-and-disadvantages"}},[e._v("#")]),e._v(" Advantages and disadvantages")]),e._v(" "),t("h3",{attrs:{id:"pros"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pros"}},[e._v("#")]),e._v(" Pros")]),e._v(" "),t("ul",[t("li",[e._v("Easy and quicker setup")]),e._v(" "),t("li",[e._v("Cheaper and in most cases free (depending if the host is premium or free)")]),e._v(" "),t("li",[e._v("Receive payments directly to your wallet")]),e._v(" "),t("li",[e._v("Private key never required (if it is, it's a scam!)")])]),e._v(" "),t("h3",{attrs:{id:"cons"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cons"}},[e._v("#")]),e._v(" Cons")]),e._v(" "),t("ul",[t("li",[e._v("Security concerns")]),e._v(" "),t("li",[e._v("Privacy concerns")]),e._v(" "),t("li",[e._v("Limitation of features")]),e._v(" "),t("li",[e._v("No control over a server")]),e._v(" "),t("li",[e._v("Have to trust the owner of the server")])]),e._v(" "),t("h2",{attrs:{id:"concerns-for-use"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#concerns-for-use"}},[e._v("#")]),e._v(" Concerns For Use")]),e._v(" "),t("h3",{attrs:{id:"security-concerns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security-concerns"}},[e._v("#")]),e._v(" Security Concerns")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://nakamotoinstitute.org/trusted-third-parties/#selection-7.6-6.2",target:"_blank",rel:"noopener noreferrer"}},[e._v("Trusted third parties are security holes"),t("OutboundLink")],1),e._v(". By relying on someone else to manage a server for you, you are potentially exposing yourself to a certain attack vector.")]),e._v(" "),t("p",[e._v("The most significant attack vector when using a third-party host is the chance that this host will gain access to the management of your funds. This can occur in two ways.")]),e._v(" "),t("p",[e._v("First, a host may allow you to create "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Hot_wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("hot wallets"),t("OutboundLink")],1),e._v(" on their server. This gives the host complete access to your funds. They will act as a custodian of your private keys and thus your funds. This means you must trust they will not spend your funds. This type of wallet is NOT recommended for use with third-party hosts.")]),e._v(" "),t("p",[e._v("Secondly, a malicious and technically skilled host can create a forked version of BTCPay Server and modify it to be able to either spy on your transactions or replace your "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Deterministic_wallet_tools#Risks_of_Sharing_an_Extended_Public_Key_.28xpub.29",target:"_blank",rel:"noopener noreferrer"}},[e._v("extended public key"),t("OutboundLink")],1),e._v(" with their own. This means that future payments made to you may end up in this malicious party's wallet.")]),e._v(" "),t("p",[e._v("While a wallet connected with an extended public key IS recommended for use with third-party hosts, It's impossible to know for certain, if the third party host is using a malicious fork. If you don't trust the third party host it is best to do the following:")]),e._v(" "),t("ul",[t("li",[e._v("Do not use hot wallet on the third party server, use an extended public key")]),e._v(" "),t("li",[e._v("Use it mainly for testing, learning and getting started with BTCPay")]),e._v(" "),t("li",[e._v("Do not use it with high volume payments or extremely valuable transactions")])]),e._v(" "),t("p",[e._v("In BTCPay Server, a private key is never "),t("em",[e._v("required")]),e._v(". This means that funds are safe even if the server is hacked, but a malicious host can intercept future payments and steal those funds. If you follow your transactions via a watch-only wallet, you should be able to detect such attack quickly and notice that your orders are being marked as paid, whereas you don't see the transactions in your wallet.")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),t("p",[e._v("If a third-party host asks for your private key or pre-generates one for you, be sure it's a scam. Never share your private key with anyone. It's called private for a reason.")])]),e._v(" "),t("p",[e._v("An extended public key replacement attack applies to a self-hosted server as well. A malicious hacker can try to hack your server and try to replace an extended public key.")]),e._v(" "),t("h3",{attrs:{id:"privacy-concerns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#privacy-concerns"}},[e._v("#")]),e._v(" Privacy Concerns")]),e._v(" "),t("p",[e._v("BTCPay Server does not allow server hosts to view the stores of other users nor have access to any personal data (except for registration email address). The extended public key and even balances of other users can't be seen. However, as mentioned, a malicious third-party could modify that by creating a fork that can look like BTCPay Server on the front but be something completely different in reality.")]),e._v(" "),t("p",[e._v("The biggest concern, which happens when using a third-party host (even if the owner of a self-hosted server is not malicious) comes from the nature of the Bitcoin itself. If a user is not running a full node but instead relies on someone else's node, his transactions can be listened to by the owner of that node. Running a full node is not just a convenience that gives you features and enables privacy, it gives you better security and the right to \"vote\" and validate all the transactions yourself. Don't trust, verify.")]),e._v(" "),t("p",[e._v("Here are some good resources where you learn more about the importance of full nodes")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Why_Your_Business_Should_Use_a_Full_Node_to_Accept_Bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Why Your Business Should Use a Full Node to Accept Bitcoin"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Clearing_Up_Misconceptions_About_Full_Nodes",target:"_blank",rel:"noopener noreferrer"}},[e._v("Clearing Up Misconceptions About Full Nodes"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"trust-concerns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#trust-concerns"}},[e._v("#")]),e._v(" Trust Concerns")]),e._v(" "),t("p",[e._v("Third-party hosts have the ability to enable specific features for their non-admin users which require users to place some level of trust in the third-party host, if such features are used.")]),e._v(" "),t("p",[e._v("Specifically, third-party hosts should not enable the following policies without understanding that users will be using hot wallets on the server. These features are disabled by default for non-admins to reduce the risk considerations for both third-party hosts and their users:")]),e._v(" "),t("ul",[t("li",[e._v("Allow non-admins to create hot wallets for their stores")]),e._v(" "),t("li",[e._v("Allow non-admins to import their hot wallets to the node wallet")]),e._v(" "),t("li",[e._v("Allow non-admins to use the internal lightning node in their stores")])]),e._v(" "),t("p",[e._v("Third-party users who are granted access to an internal lightning node or hot wallet functionality to enable features such as Payjoin, should understand the risk and trust associated with "),t("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[e._v("using hot wallets")]),e._v(" before choosing to use it. Use one of the "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("recommended wallets")]),e._v(" which provide an extended public key to use in your store, if you are unsure which wallet type to use.")],1),e._v(" "),t("h2",{attrs:{id:"third-party-hosting-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#third-party-hosting-faq"}},[e._v("#")]),e._v(" Third Party Hosting FAQ")]),e._v(" "),t("h2",{attrs:{id:"where-is-the-list-of-btcpay-third-party-hosts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-is-the-list-of-btcpay-third-party-hosts"}},[e._v("#")]),e._v(" Where is the list of BTCPay third-party hosts?")]),e._v(" "),t("p",[e._v("Feel free to chat with the "),t("RouterLink",{attrs:{to:"/Community/"}},[e._v("Community")]),e._v(" to find the appropriate host for your needs, but also make sure to choose one that is trustworthy. Read the rest of this document to better understand the pros and cons of using a third-party host.")],1),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("The BTCPay Server "),t("a",{attrs:{href:"https://directory.btcpayserver.org/filter/hosts",target:"_blank",rel:"noopener noreferrer"}},[e._v("Directory"),t("OutboundLink")],1),e._v(" lists multiple free or paid third-party hosts that you can register to, to start exploring BTCPay Server.")])]),e._v(" "),t("h2",{attrs:{id:"how-can-one-become-a-third-party-host"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-one-become-a-third-party-host"}},[e._v("#")]),e._v(" How can one become a third-party host?")]),e._v(" "),t("p",[e._v("To become a third-party host, you need to self-host a BTCPay Server and enable registration for other users.\nGo to Server Settings > Policies > Disable registration, unmark the checkbox. You may also want to configure the "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-configure-smtp-settings-in-btcpay"}},[e._v("SMTP settings")]),e._v(" to allow them to reset their password if they forget it.")],1),e._v(" "),t("p",[e._v("Alternatively you may keep public registration disabled on your homepage and only invite specific users to create a new account by "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-add-a-new-user-by-invite"}},[e._v("invitation link")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"are-there-any-limitations-in-features-when-using-a-third-party-host"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-there-any-limitations-in-features-when-using-a-third-party-host"}},[e._v("#")]),e._v(" Are there any limitations in features when using a third-party host?")]),e._v(" "),t("p",[e._v("Yes. Here are some restrictions.")]),e._v(" "),t("ul",[t("li",[e._v("No "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning Network")]),e._v(" by default. Can be enabled by the third-party host but at the cost of a security risk for registrants using that third-party. "),t("a",{attrs:{href:"#can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[e._v("More information")])],1),e._v(" "),t("li",[e._v("No "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#what-is-wallet-re-scan-in-btcpay"}},[e._v("wallet re-scan")])],1),e._v(" "),t("li",[e._v("No "),t("RouterLink",{attrs:{to:"/Walkthrough/#server-settings"}},[e._v("Server Settings")]),e._v(" access")],1)]),e._v(" "),t("p",[e._v("The limitations happen for technical reasons, mostly because these features require a user to run a full node to use them.")]),e._v(" "),t("h2",{attrs:{id:"can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[e._v("#")]),e._v(" Can I enable the use of my Lightning Network node to others?")]),e._v(" "),t("p",[e._v("Yes, you can enable users that have registered on your BTCPay Server instance to use your Lightning Network node.\n"),t("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-many-users-can-use-lightning-network-in-btcpay"}},[e._v("See how")])],1),e._v(" "),t("h2",{attrs:{id:"what-does-the-trusted-third-party-host-know-about-their-users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-does-the-trusted-third-party-host-know-about-their-users"}},[e._v("#")]),e._v(" What does the trusted third-party host know about their users?")]),e._v(" "),t("p",[e._v("Third party hosts (non-malicious) can see the following:")]),e._v(" "),t("ul",[t("li",[e._v("Total number of users")]),e._v(" "),t("li",[e._v("The email and username of those users")])]),e._v(" "),t("p",[e._v("Note: If additional features are enabled such as non-admin lightning wallet, hot wallets or transmuter, the server admin can see additional information related to those features. Since it's impossible to know if the third party host is using a malicious fork, it's best to assume they may know all details about your BTCPay Server usage.")]),e._v(" "),t("p",[e._v("If you are worried about the information a third party host knows about you, please consider "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("deploying your own")]),e._v(" self-hosted server.")],1)])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[122],{808:function(e,t,r){"use strict";r.r(t);var s=r(17),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"third-party-hosting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#third-party-hosting"}},[e._v("#")]),e._v(" Third-party hosting")]),e._v(" "),t("p",[e._v("A "),t("strong",[e._v("third-party host")]),e._v(" is an individual or a business which "),t("strong",[e._v("self-hosts a BTCPay Server instance and enables other users to register and use the server")]),e._v(". On a self-hosted server, the owner can add an unlimited amount of users and stores and allow those users to manage their stores independently and receive payments to their own wallets.")]),e._v(" "),t("p",[e._v("While this feature in BTCPay Server exists for complex multi-store business management, community enthusiasts use it to help other users (mostly beginners), sometimes skip an overwhelming step of "),t("strong",[e._v("deploying a self-hosted BTCPay server")]),e._v(". Users who want to test or develop applications on top of BTCPay Server also use "),t("strong",[e._v("instances hosted by third-parties")]),e._v(". Some hosts try to spread the adoption of cryptocurrencies by allowing their local merchants to receive payments for free or for a small sign-up fee.")]),e._v(" "),t("p",[e._v("In layman words, think of this feature as a payment processor factory which allows anyone to deploy a server and help others receive payments which are validated via the server owners' "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Full_node",target:"_blank",rel:"noopener noreferrer"}},[e._v("full Bitcoin node"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Third-party hosts")]),e._v(" play an important role in the ecosystem since they provide an easy and cost-effective "),t("strong",[e._v("way for users to try and use BTCPay Server")]),e._v(". The role of honest hosts who provide free service to others is essential in the early phase of BTCPay Server adoption. However, users should be familiar with the pros, cons and potential risks involved when using a trusted third-party. Find the optimal balance between your use-case, cost, and privacy/security trade-offs.")]),e._v(" "),t("p",[e._v("Some of the hosts are entirely free to use and maintain the server cost from donations of their users. If you've been using a reliable free host for a while, you should consider donating to them to support them.")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#third-party-hosting"}},[e._v("Third-party hosting")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#advantages-and-disadvantages"}},[e._v("Advantages and disadvantages")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#pros"}},[e._v("Pros")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#cons"}},[e._v("Cons")])])])]),e._v(" "),t("li",[t("a",{attrs:{href:"#concerns-for-use"}},[e._v("Concerns For Use")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#security-concerns"}},[e._v("Security Concerns")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#privacy-concerns"}},[e._v("Privacy Concerns")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#trust-concerns"}},[e._v("Trust Concerns")])])])]),e._v(" "),t("li",[t("a",{attrs:{href:"#third-party-hosting-faq"}},[e._v("Third Party Hosting FAQ")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#where-is-the-list-of-btcpay-third-party-hosts"}},[e._v("Where is the list of BTCPay third-party hosts?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#how-can-one-become-a-third-party-host"}},[e._v("How can one become a third-party host?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#are-there-any-limitations-in-features-when-using-a-third-party-host"}},[e._v("Are there any limitations in features when using a third-party host?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[e._v("Can I enable the use of my Lightning Network node to others?")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#what-does-the-trusted-third-party-host-know-about-their-users"}},[e._v("What does the trusted third-party host know about their users?")])])])])]),e._v(" "),t("h2",{attrs:{id:"advantages-and-disadvantages"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#advantages-and-disadvantages"}},[e._v("#")]),e._v(" Advantages and disadvantages")]),e._v(" "),t("h3",{attrs:{id:"pros"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pros"}},[e._v("#")]),e._v(" Pros")]),e._v(" "),t("ul",[t("li",[e._v("Easy and quicker setup")]),e._v(" "),t("li",[e._v("Cheaper and in most cases free (depending if the host is premium or free)")]),e._v(" "),t("li",[e._v("Receive payments directly to your wallet")]),e._v(" "),t("li",[e._v("Private key never required (if it is, it's a scam!)")])]),e._v(" "),t("h3",{attrs:{id:"cons"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cons"}},[e._v("#")]),e._v(" Cons")]),e._v(" "),t("ul",[t("li",[e._v("Security concerns")]),e._v(" "),t("li",[e._v("Privacy concerns")]),e._v(" "),t("li",[e._v("Limitation of features")]),e._v(" "),t("li",[e._v("No control over a server")]),e._v(" "),t("li",[e._v("Have to trust the owner of the server")])]),e._v(" "),t("h2",{attrs:{id:"concerns-for-use"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#concerns-for-use"}},[e._v("#")]),e._v(" Concerns For Use")]),e._v(" "),t("h3",{attrs:{id:"security-concerns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security-concerns"}},[e._v("#")]),e._v(" Security Concerns")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://nakamotoinstitute.org/trusted-third-parties/#selection-7.6-6.2",target:"_blank",rel:"noopener noreferrer"}},[e._v("Trusted third parties are security holes"),t("OutboundLink")],1),e._v(". By relying on someone else to manage a server for you, you are potentially exposing yourself to a certain attack vector.")]),e._v(" "),t("p",[e._v("The most significant attack vector when using a third-party host is the chance that this host will gain access to the management of your funds. This can occur in two ways.")]),e._v(" "),t("p",[e._v("First, a host may allow you to create "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Hot_wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("hot wallets"),t("OutboundLink")],1),e._v(" on their server. This gives the host complete access to your funds. They will act as a custodian of your private keys and thus your funds. This means you must trust they will not spend your funds. This type of wallet is NOT recommended for use with third-party hosts.")]),e._v(" "),t("p",[e._v("Secondly, a malicious and technically skilled host can create a forked version of BTCPay Server and modify it to be able to either spy on your transactions or replace your "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Deterministic_wallet_tools#Risks_of_Sharing_an_Extended_Public_Key_.28xpub.29",target:"_blank",rel:"noopener noreferrer"}},[e._v("extended public key"),t("OutboundLink")],1),e._v(" with their own. This means that future payments made to you may end up in this malicious party's wallet.")]),e._v(" "),t("p",[e._v("While a wallet connected with an extended public key IS recommended for use with third-party hosts, It's impossible to know for certain, if the third party host is using a malicious fork. If you don't trust the third party host it is best to do the following:")]),e._v(" "),t("ul",[t("li",[e._v("Do not use hot wallet on the third party server, use an extended public key")]),e._v(" "),t("li",[e._v("Use it mainly for testing, learning and getting started with BTCPay")]),e._v(" "),t("li",[e._v("Do not use it with high volume payments or extremely valuable transactions")])]),e._v(" "),t("p",[e._v("In BTCPay Server, a private key is never "),t("em",[e._v("required")]),e._v(". This means that funds are safe even if the server is hacked, but a malicious host can intercept future payments and steal those funds. If you follow your transactions via a watch-only wallet, you should be able to detect such attack quickly and notice that your orders are being marked as paid, whereas you don't see the transactions in your wallet.")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),t("p",[e._v("If a third-party host asks for your private key or pre-generates one for you, be sure it's a scam. Never share your private key with anyone. It's called private for a reason.")])]),e._v(" "),t("p",[e._v("An extended public key replacement attack applies to a self-hosted server as well. A malicious hacker can try to hack your server and try to replace an extended public key.")]),e._v(" "),t("h3",{attrs:{id:"privacy-concerns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#privacy-concerns"}},[e._v("#")]),e._v(" Privacy Concerns")]),e._v(" "),t("p",[e._v("BTCPay Server does not allow server hosts to view the stores of other users nor have access to any personal data (except for registration email address). The extended public key and even balances of other users can't be seen. However, as mentioned, a malicious third-party could modify that by creating a fork that can look like BTCPay Server on the front but be something completely different in reality.")]),e._v(" "),t("p",[e._v("The biggest concern, which happens when using a third-party host (even if the owner of a self-hosted server is not malicious) comes from the nature of the Bitcoin itself. If a user is not running a full node but instead relies on someone else's node, his transactions can be listened to by the owner of that node. Running a full node is not just a convenience that gives you features and enables privacy, it gives you better security and the right to \"vote\" and validate all the transactions yourself. Don't trust, verify.")]),e._v(" "),t("p",[e._v("Here are some good resources where you learn more about the importance of full nodes")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Why_Your_Business_Should_Use_a_Full_Node_to_Accept_Bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Why Your Business Should Use a Full Node to Accept Bitcoin"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Clearing_Up_Misconceptions_About_Full_Nodes",target:"_blank",rel:"noopener noreferrer"}},[e._v("Clearing Up Misconceptions About Full Nodes"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"trust-concerns"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#trust-concerns"}},[e._v("#")]),e._v(" Trust Concerns")]),e._v(" "),t("p",[e._v("Third-party hosts have the ability to enable specific features for their non-admin users which require users to place some level of trust in the third-party host, if such features are used.")]),e._v(" "),t("p",[e._v("Specifically, third-party hosts should not enable the following policies without understanding that users will be using hot wallets on the server. These features are disabled by default for non-admins to reduce the risk considerations for both third-party hosts and their users:")]),e._v(" "),t("ul",[t("li",[e._v("Allow non-admins to create hot wallets for their stores")]),e._v(" "),t("li",[e._v("Allow non-admins to import their hot wallets to the node wallet")]),e._v(" "),t("li",[e._v("Allow non-admins to use the internal lightning node in their stores")])]),e._v(" "),t("p",[e._v("Third-party users who are granted access to an internal lightning node or hot wallet functionality to enable features such as Payjoin, should understand the risk and trust associated with "),t("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[e._v("using hot wallets")]),e._v(" before choosing to use it. Use one of the "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("recommended wallets")]),e._v(" which provide an extended public key to use in your store, if you are unsure which wallet type to use.")],1),e._v(" "),t("h2",{attrs:{id:"third-party-hosting-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#third-party-hosting-faq"}},[e._v("#")]),e._v(" Third Party Hosting FAQ")]),e._v(" "),t("h2",{attrs:{id:"where-is-the-list-of-btcpay-third-party-hosts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-is-the-list-of-btcpay-third-party-hosts"}},[e._v("#")]),e._v(" Where is the list of BTCPay third-party hosts?")]),e._v(" "),t("p",[e._v("Feel free to chat with the "),t("RouterLink",{attrs:{to:"/Community/"}},[e._v("Community")]),e._v(" to find the appropriate host for your needs, but also make sure to choose one that is trustworthy. Read the rest of this document to better understand the pros and cons of using a third-party host.")],1),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("The BTCPay Server "),t("a",{attrs:{href:"https://directory.btcpayserver.org/filter/hosts",target:"_blank",rel:"noopener noreferrer"}},[e._v("Directory"),t("OutboundLink")],1),e._v(" lists multiple free or paid third-party hosts that you can register to, to start exploring BTCPay Server.")])]),e._v(" "),t("h2",{attrs:{id:"how-can-one-become-a-third-party-host"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-one-become-a-third-party-host"}},[e._v("#")]),e._v(" How can one become a third-party host?")]),e._v(" "),t("p",[e._v("To become a third-party host, you need to self-host a BTCPay Server and enable registration for other users.\nGo to Server Settings > Policies > Disable registration, unmark the checkbox. You may also want to configure the "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-configure-smtp-settings-in-btcpay"}},[e._v("SMTP settings")]),e._v(" to allow them to reset their password if they forget it.")],1),e._v(" "),t("p",[e._v("Alternatively you may keep public registration disabled on your homepage and only invite specific users to create a new account by "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-add-a-new-user-by-invite"}},[e._v("invitation link")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"are-there-any-limitations-in-features-when-using-a-third-party-host"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#are-there-any-limitations-in-features-when-using-a-third-party-host"}},[e._v("#")]),e._v(" Are there any limitations in features when using a third-party host?")]),e._v(" "),t("p",[e._v("Yes. Here are some restrictions.")]),e._v(" "),t("ul",[t("li",[e._v("No "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning Network")]),e._v(" by default. Can be enabled by the third-party host but at the cost of a security risk for registrants using that third-party. "),t("a",{attrs:{href:"#can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[e._v("More information")])],1),e._v(" "),t("li",[e._v("No "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#what-is-wallet-re-scan-in-btcpay"}},[e._v("wallet re-scan")])],1),e._v(" "),t("li",[e._v("No "),t("RouterLink",{attrs:{to:"/Walkthrough/#server-settings"}},[e._v("Server Settings")]),e._v(" access")],1)]),e._v(" "),t("p",[e._v("The limitations happen for technical reasons, mostly because these features require a user to run a full node to use them.")]),e._v(" "),t("h2",{attrs:{id:"can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-enable-the-use-of-my-lightning-network-node-to-others"}},[e._v("#")]),e._v(" Can I enable the use of my Lightning Network node to others?")]),e._v(" "),t("p",[e._v("Yes, you can enable users that have registered on your BTCPay Server instance to use your Lightning Network node.\n"),t("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#how-many-users-can-use-lightning-network-in-btcpay"}},[e._v("See how")])],1),e._v(" "),t("h2",{attrs:{id:"what-does-the-trusted-third-party-host-know-about-their-users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-does-the-trusted-third-party-host-know-about-their-users"}},[e._v("#")]),e._v(" What does the trusted third-party host know about their users?")]),e._v(" "),t("p",[e._v("Third party hosts (non-malicious) can see the following:")]),e._v(" "),t("ul",[t("li",[e._v("Total number of users")]),e._v(" "),t("li",[e._v("The email and username of those users")])]),e._v(" "),t("p",[e._v("Note: If additional features are enabled such as non-admin lightning wallet, hot wallets or transmuter, the server admin can see additional information related to those features. Since it's impossible to know if the third party host is using a malicious fork, it's best to assume they may know all details about your BTCPay Server usage.")]),e._v(" "),t("p",[e._v("If you are worried about the information a third party host knows about you, please consider "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("deploying your own")]),e._v(" self-hosted server.")],1)])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/123.77c37c03.js b/assets/js/123.db840fc2.js similarity index 98% rename from assets/js/123.77c37c03.js rename to assets/js/123.db840fc2.js index 37fe99edab..e72e3551d0 100644 --- a/assets/js/123.77c37c03.js +++ b/assets/js/123.db840fc2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[123],{808:function(e,t,o){"use strict";o.r(t);var r=o(17),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"introduction-to-web-deployments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction-to-web-deployments"}},[e._v("#")]),e._v(" Introduction to Web Deployments")]),e._v(" "),t("p",[e._v("We will take you through possible "),t("code",[e._v("Web Deployments")]),e._v(" on this page and update the list as more providers offer BTCPay Server as a service.\nBut what is a "),t("code",[e._v("Web deployment")]),e._v("?\nIn short, a third-party hosted environment.")]),e._v(" "),t("p",[e._v("What do they do? They offer you the user, storage space, and compute power.\nAnd in particular, for this page, they offer hosted Bitcoin nodes.")]),e._v(" "),t("p",[e._v("Now you don't have to buy, host and maintain your own hardware. The service provider takes care of this.\nThis comes with the risk factor of trusting someone to host your bitcoin node and BTCPay Server on top of that.\nEvery hoster comes with its own pros and cons. One might be cheaper, and the other maybe has better support levels.\nHowever, we will guide you through the ones we've listed and offer BTCPay Server solutions.")]),e._v(" "),t("p",[e._v("Below you will find a short introduction to each service and a detailed guide on each of them.")]),e._v(" "),t("h2",{attrs:{id:"known-web-deployments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#known-web-deployments"}},[e._v("#")]),e._v(" Known web deployments")]),e._v(" "),t("h3",{attrs:{id:"lunanode-web-wizard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lunanode-web-wizard"}},[e._v("#")]),e._v(" LunaNode web-wizard")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.lunanode.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("LunaNode"),t("OutboundLink")],1),e._v(" is a Canadian-based hosting provider that accepts Bitcoin payments and requires no personal identification except for a phone number verification.")]),e._v(" "),t("p",[e._v("Their web wizard is one of the easiest ways to "),t("strong",[e._v("deploy BTCPay Servers from a very user-friendly interface")]),e._v(".\nLunaNode will provide you with a generic domain for your server to get you started.")]),e._v(" "),t("p",[e._v("For more details on "),t("code",[e._v("LunaNode")]),e._v(" click "),t("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"voltage-cloud"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#voltage-cloud"}},[e._v("#")]),e._v(" Voltage Cloud")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.voltage.cloud",target:"_blank",rel:"noopener noreferrer"}},[e._v("Voltage"),t("OutboundLink")],1),e._v(" is an infrastructure provider for Bitcoin.\nBy focusing on Bitcoin exclusively, they can offer quality services to their clients.\nAutomatically connect your Voltage Lightning node.")]),e._v(" "),t("p",[e._v("For more details on "),t("code",[e._v("Voltage Cloud")]),e._v(" click "),t("RouterLink",{attrs:{to:"/Deployment/voltagecloud/"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"clovyr"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clovyr"}},[e._v("#")]),e._v(" Clovyr")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://clovyr.app/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Clovyr"),t("OutboundLink")],1),e._v(" is an application deployment service.\nThey allow deploying services, including BTCPay Server, either to their own servers, or to a variety of other VPS providers, such as Digital Ocean, AWS, and Linode.\nFor more details on "),t("code",[e._v("Clovyr")]),e._v(" click "),t("RouterLink",{attrs:{to:"/Deployment/Clovyr/"}},[e._v("here")])],1),e._v(" "),t("h2",{attrs:{id:"elestio"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#elestio"}},[e._v("#")]),e._v(" Elestio")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://elest.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Elestio"),t("OutboundLink")],1),e._v(" is a fully managed DevOps platform to deploy your code and open-source software.\nThey allow you to choose the cloud service provider of your choice such as Digital Ocean, AWS, Linode and many others. Elestio takes care of the migrations, backups, version changes and security to help you deploy your BTCPay Server easily.")]),e._v(" "),t("p",[e._v("For more details on "),t("code",[e._v("Elestio")]),e._v(" click "),t("a",{attrs:{href:"https://elest.io/open-source/btcpay",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"missing-deployments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#missing-deployments"}},[e._v("#")]),e._v(" Missing deployments?")]),e._v(" "),t("p",[e._v("As we are a FOSS project, we might miss certain deployments.\nFound a deployment that is missing, and do you want it added or notified us?\nJoin the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("community chat"),t("OutboundLink")],1),e._v(" on Mattermost by downloading "),t("a",{attrs:{href:"https://mattermost.com/download/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost app"),t("OutboundLink")],1),e._v(", or on "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1),e._v(" and tell us about it.\nYou can also create an issue in the BTCPay server Documents on "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[123],{807:function(e,t,o){"use strict";o.r(t);var r=o(17),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"introduction-to-web-deployments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction-to-web-deployments"}},[e._v("#")]),e._v(" Introduction to Web Deployments")]),e._v(" "),t("p",[e._v("We will take you through possible "),t("code",[e._v("Web Deployments")]),e._v(" on this page and update the list as more providers offer BTCPay Server as a service.\nBut what is a "),t("code",[e._v("Web deployment")]),e._v("?\nIn short, a third-party hosted environment.")]),e._v(" "),t("p",[e._v("What do they do? They offer you the user, storage space, and compute power.\nAnd in particular, for this page, they offer hosted Bitcoin nodes.")]),e._v(" "),t("p",[e._v("Now you don't have to buy, host and maintain your own hardware. The service provider takes care of this.\nThis comes with the risk factor of trusting someone to host your bitcoin node and BTCPay Server on top of that.\nEvery hoster comes with its own pros and cons. One might be cheaper, and the other maybe has better support levels.\nHowever, we will guide you through the ones we've listed and offer BTCPay Server solutions.")]),e._v(" "),t("p",[e._v("Below you will find a short introduction to each service and a detailed guide on each of them.")]),e._v(" "),t("h2",{attrs:{id:"known-web-deployments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#known-web-deployments"}},[e._v("#")]),e._v(" Known web deployments")]),e._v(" "),t("h3",{attrs:{id:"lunanode-web-wizard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lunanode-web-wizard"}},[e._v("#")]),e._v(" LunaNode web-wizard")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.lunanode.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("LunaNode"),t("OutboundLink")],1),e._v(" is a Canadian-based hosting provider that accepts Bitcoin payments and requires no personal identification except for a phone number verification.")]),e._v(" "),t("p",[e._v("Their web wizard is one of the easiest ways to "),t("strong",[e._v("deploy BTCPay Servers from a very user-friendly interface")]),e._v(".\nLunaNode will provide you with a generic domain for your server to get you started.")]),e._v(" "),t("p",[e._v("For more details on "),t("code",[e._v("LunaNode")]),e._v(" click "),t("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"voltage-cloud"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#voltage-cloud"}},[e._v("#")]),e._v(" Voltage Cloud")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.voltage.cloud",target:"_blank",rel:"noopener noreferrer"}},[e._v("Voltage"),t("OutboundLink")],1),e._v(" is an infrastructure provider for Bitcoin.\nBy focusing on Bitcoin exclusively, they can offer quality services to their clients.\nAutomatically connect your Voltage Lightning node.")]),e._v(" "),t("p",[e._v("For more details on "),t("code",[e._v("Voltage Cloud")]),e._v(" click "),t("RouterLink",{attrs:{to:"/Deployment/voltagecloud/"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"clovyr"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clovyr"}},[e._v("#")]),e._v(" Clovyr")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://clovyr.app/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Clovyr"),t("OutboundLink")],1),e._v(" is an application deployment service.\nThey allow deploying services, including BTCPay Server, either to their own servers, or to a variety of other VPS providers, such as Digital Ocean, AWS, and Linode.\nFor more details on "),t("code",[e._v("Clovyr")]),e._v(" click "),t("RouterLink",{attrs:{to:"/Deployment/Clovyr/"}},[e._v("here")])],1),e._v(" "),t("h2",{attrs:{id:"elestio"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#elestio"}},[e._v("#")]),e._v(" Elestio")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://elest.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Elestio"),t("OutboundLink")],1),e._v(" is a fully managed DevOps platform to deploy your code and open-source software.\nThey allow you to choose the cloud service provider of your choice such as Digital Ocean, AWS, Linode and many others. Elestio takes care of the migrations, backups, version changes and security to help you deploy your BTCPay Server easily.")]),e._v(" "),t("p",[e._v("For more details on "),t("code",[e._v("Elestio")]),e._v(" click "),t("a",{attrs:{href:"https://elest.io/open-source/btcpay",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"missing-deployments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#missing-deployments"}},[e._v("#")]),e._v(" Missing deployments?")]),e._v(" "),t("p",[e._v("As we are a FOSS project, we might miss certain deployments.\nFound a deployment that is missing, and do you want it added or notified us?\nJoin the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("community chat"),t("OutboundLink")],1),e._v(" on Mattermost by downloading "),t("a",{attrs:{href:"https://mattermost.com/download/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost app"),t("OutboundLink")],1),e._v(", or on "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1),e._v(" and tell us about it.\nYou can also create an issue in the BTCPay server Documents on "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/125.c1532fa3.js b/assets/js/125.eb7e8652.js similarity index 99% rename from assets/js/125.c1532fa3.js rename to assets/js/125.eb7e8652.js index 0db3403e41..f509e6ec12 100644 --- a/assets/js/125.c1532fa3.js +++ b/assets/js/125.eb7e8652.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[125],{811:function(t,s,a){"use strict";a.r(s);var n=a(17),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"greenfield-api-example-with-nodejs-javascript"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#greenfield-api-example-with-nodejs-javascript"}},[t._v("#")]),t._v(" Greenfield API example with Node.js (JavaScript)")]),t._v(" "),s("p",[t._v("The "),s("strong",[s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Greenfield API"),s("OutboundLink")],1)]),t._v(" (also available on your instance on "),s("code",[t._v("/docs")]),t._v(") allows you to operate BTCPay Server via an easy-to-use REST API.")]),t._v(" "),s("p",[t._v("Note that you can partially generate clients in the language of your choice by using the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/swagger.json",target:"_blank",rel:"noopener noreferrer"}},[t._v("Swagger file"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("In this guide, we will show you how to use it using Node.js/JavaScript.")]),t._v(" "),s("h2",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),s("p",[t._v("Unless for a few endpoints like creating a store and API key on behalf of a specific user, Basic Auth should be avoided and an API key should be used instead. Make sure that API keys only have the needed permissions and not more. E.g. if you only create invoices you should not give the API key the permission to manage your stores.")]),t._v(" "),s("p",[t._v("You can create a new API key in the BTCPay Server UI under "),s("code",[t._v("Account")]),t._v(" -> "),s("code",[t._v("Manage account")]),t._v(" -> "),s("code",[t._v("API keys")])]),t._v(" "),s("p",[t._v("For the ecommerce examples below the API key needs the following permissions:")]),t._v(" "),s("ul",[s("li",[t._v("View invoices")]),t._v(" "),s("li",[t._v("Create invoice")]),t._v(" "),s("li",[t._v("Modify invoices")]),t._v(" "),s("li",[t._v("Modify stores webhooks")]),t._v(" "),s("li",[t._v("View your stores")]),t._v(" "),s("li",[t._v("Create non-approved pull payments")])]),t._v(" "),s("p",[t._v("For an overview of available permissions see the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#section/Authentication/API_Key",target:"_blank",rel:"noopener noreferrer"}},[t._v("API documentation"),s("OutboundLink")],1),t._v(" or the permissions documented on each endpoint.")]),t._v(" "),s("h2",{attrs:{id:"ecommerce-examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ecommerce-examples"}},[t._v("#")]),t._v(" eCommerce examples")]),t._v(" "),s("p",[t._v("The following examples will show you how to create a basic eCommerce flow using the Greenfield API by creating an invoice, registering a webhook, processing webhooks, and issuing a full refund of an invoice.")]),t._v(" "),s("h3",{attrs:{id:"create-an-invoice"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-an-invoice"}},[t._v("#")]),t._v(" Create an invoice")]),t._v(" "),s("p",[t._v("We create an invoice using the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_CreateInvoice",target:"_blank",rel:"noopener noreferrer"}},[t._v("create invoice endpoint"),s("OutboundLink")],1),t._v(". This is a simple example but you can set a lot more data like order id, buyer email or custom metadata. That said, don't store redundant data on the invoice to prevent data leaks in case of a hack. E.g. in most cases it makes no sense to store the customer address on your eCommerce system and also on the BTCPay invoice.")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" storeId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_STORE_ID'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_API_KEY'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" amount "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" currency "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'USD'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/api/v1/stores/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("storeId"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/invoices")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("amount")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" amount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("currency")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" currency\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'POST'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"register-a-webhook-optional"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#register-a-webhook-optional"}},[t._v("#")]),t._v(" Register a webhook (optional)")]),t._v(" "),s("p",[t._v("Let's register a webhook to be notified when the invoice is paid. You can use the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Webhooks_CreateWebhook",target:"_blank",rel:"noopener noreferrer"}},[t._v("create webhook endpoint"),s("OutboundLink")],1),t._v(" to register a webhook.")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" storeId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_STORE_ID'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_API_KEY'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/api/v1/stores/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("storeId"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/webhooks")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("url")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://example.com/your-webhook-endpoint'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'POST'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("This step is optional, you can also manually create a webhook in the BTCPay Server UI in your store "),s("code",[t._v("Settings")]),t._v(" -> "),s("code",[t._v("Webhooks")]),t._v(".")]),t._v(" "),s("h3",{attrs:{id:"validate-and-process-webhooks"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#validate-and-process-webhooks"}},[t._v("#")]),t._v(" Validate and process webhooks")]),t._v(" "),s("p",[t._v("You can use your Node.js Express web application to receive webhook requests from your BTCPay Server.")]),t._v(" "),s("p",[t._v("First you need a route so that your Node.js application can receive POST requests.\nBased on how you set up the express server this should look something like this:")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("app"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("post")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/your-webhook-endpoint'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" res")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Do stuff here")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("What's important is that the webhook sends a HTTP-header "),s("code",[t._v("BTCPAY-SIG")]),t._v(" which is the signed request using the "),s("code",[t._v("secret")]),t._v(" you got back from the previous step when registering the webhook. You can use that "),s("code",[t._v("secret")]),t._v(" and the raw payload (as bytes) you get from the webhook, hash it and compare it to "),s("code",[t._v("BTCPAY-SIG")]),t._v(". Therefore, you need "),s("code",[t._v("body-parser")]),t._v(" which is a middleware to parse the raw body of the request. For comparing the hashes you also need "),s("code",[t._v("crypto")]),t._v(" which is a built-in Node.js module.")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" bodyParser "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body-parser'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" crypto "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'crypto'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("You can parse the raw body of the request like this:")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("app"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("use")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n bodyParser"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("verify")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" buf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rawBody "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" buf\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("This makes sure that in req.rawBody the correct content is parsed so that you can compare the hashed req.rawBody with the "),s("code",[t._v("BTCPAY-SIG")]),t._v(" header value.")]),t._v(" "),s("p",[t._v("However, if you are using TypeScript, you might run into this error:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("Property 'rawBody' does not exist on type 'Request'.\n")])])]),s("p",[t._v("The temporary fix is to use the "),s("code",[t._v("as")]),t._v(" keyword to tell the compiler to consider the "),s("code",[t._v("req")]),t._v(" object as another type when you accessing the "),s("code",[t._v("rawBody")]),t._v(". Here is an example of how to obtain "),s("code",[t._v("rawBody")]),t._v(" using this workaround, no need for the middleware code above:")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" Request"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Response "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"express-serve-static-core"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" https "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"firebase-functions"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\ntype FirebaseRequest "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" https"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Request\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("myFunc")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("req")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Request"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("res")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Response")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" rawBody "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("req "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" FirebaseRequest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rawBody"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Replace "),s("code",[t._v("req.rawBody")]),t._v(" with "),s("code",[t._v("rawBody")]),t._v(" in the next sections if utilizing this method with TypeScript.")]),t._v(" "),s("p",[t._v("In your router it looks like this put all together: (Change "),s("code",[t._v("webhookSecret")]),t._v(" with the "),s("code",[t._v("secret")]),t._v(" you got back from the previous step when registering the webhook).")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("app"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("post")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/your-webhook-endpoint'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" res")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" sigHashAlg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sha256'")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" sigHeaderName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'BTCPAY-SIG'")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" webhookSecret "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SECRET_FROM_REGISTERING_WEBHOOK'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// see previous step")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rawBody"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("status")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("500")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Request body empty'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" checksum "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sigHeaderName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'utf8'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" hmac "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" crypto"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createHmac")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sigHashAlg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" webhookSecret"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" digest "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n sigHashAlg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'='")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" hmac"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("update")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rawBody"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("digest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'hex'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'utf8'")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n checksum"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!==")]),t._v(" digest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("crypto"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("timingSafeEqual")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("digest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" checksum"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Request body digest (")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("digest"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(") did not match ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("sigHeaderName"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" (")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("checksum"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("status")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("500")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Request body digest (")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("digest"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(") did not match ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("sigHeaderName"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" (")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("checksum"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Your own processing code goes here. E.g. update your internal order id depending on the invoice payment status.")]),t._v("\n\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("status")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Success: request body was signed'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"issue-a-full-refund-of-an-invoice"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#issue-a-full-refund-of-an-invoice"}},[t._v("#")]),t._v(" Issue a full refund of an invoice")]),t._v(" "),s("p",[t._v("Using the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_Refund",target:"_blank",rel:"noopener noreferrer"}},[t._v("invoice refund endpoint"),s("OutboundLink")],1),t._v(" you can issue a full (or even partial) refund of an invoice. This will return a link where the customer can claim the refund.")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" storeId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_STORE_ID'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_API_KEY'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" invoiceId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'EXISTING_INVOICE_ID'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/api/v1/stores/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("storeId"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/invoices/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("invoiceId"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/refund")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("refundVariant")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'CurrentRate'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("paymentMethod")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'BTC'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'POST'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h2",{attrs:{id:"btcpay-server-management-examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-management-examples"}},[t._v("#")]),t._v(" BTCPay Server management examples")]),t._v(" "),s("p",[t._v("Here we assume you are an ambassador and host BTCPay Server for your users. You manage your users on your own system and want to create a user and set email and password for their BTCPay Server login. Then using the same credentials to create a store and an API key on behalf of that user.")]),t._v(" "),s("h3",{attrs:{id:"create-a-new-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-user"}},[t._v("#")]),t._v(" Create a new user")]),t._v(" "),s("p",[t._v("Creating a new user can be done by using "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Users_CreateUser",target:"_blank",rel:"noopener noreferrer"}},[t._v("this endpoint"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" adminApiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_ADMIN_API_KEY'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/api/v1/users'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" adminApiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("email")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'satoshi.nakamoto@example.com'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("password")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SuperSecurePasswordsShouldBeQuiteLong123'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("isAdministrator")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'POST'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"create-a-new-api-key-for-the-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-api-key-for-the-user"}},[t._v("#")]),t._v(" Create a new API key (for the user)")]),t._v(" "),s("p",[t._v("While we can use basic authentication to access the greenfield API, it is recommended to use API Keys to limit the scope of the credentials.")]),t._v(" "),s("p",[t._v("For example: If we want to "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Stores_CreateStore",target:"_blank",rel:"noopener noreferrer"}},[t._v("create a new store"),s("OutboundLink")],1),t._v(" we need the "),s("code",[t._v("btcpay.store.canmodifystoresettings")]),t._v(" permission for the API key. Warning: If you do not pass any permission then the API key will have unrestricted access.")]),t._v(" "),s("p",[t._v("As mentioned above, you can do this through the BTCPay Server UI of your instance, but let's do it through the API using "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/ApiKeys_CreateUserApiKey",target:"_blank",rel:"noopener noreferrer"}},[t._v("this endpoint"),s("OutboundLink")],1),t._v(" where we with our admin API key create an API key for our new user.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" adminApiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_ADMIN_API_KEY'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" email "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'satoshi.nakamoto@example.com'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/api/v1/users/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("email"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/api-keys")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" adminApiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("label")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Satoshi Nakamoto API Key'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("permissions")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'btcpay.store.canmodifystoresettings'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'POST'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// returns apiKey")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"create-a-new-store"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-store"}},[t._v("#")]),t._v(" Create a new store")]),t._v(" "),s("p",[t._v("Now, we can use the api key to "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Stores_CreateStore",target:"_blank",rel:"noopener noreferrer"}},[t._v("create a new store"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayserverUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" userApiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'USER_API_KEY'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// From previous step")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/api/v1/stores'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" userApiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Satoshi Store'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'POST'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"read-store-information"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#read-store-information"}},[t._v("#")]),t._v(" Read store information")]),t._v(" "),s("p",[t._v("We can use the new apikey to "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Stores_GetStore",target:"_blank",rel:"noopener noreferrer"}},[t._v("read store"),s("OutboundLink")],1),t._v(" information:")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" userApiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'USER_API_KEY'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// From previous step")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" storeId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'STORE_ID'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// From previous step")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/api/v1/stores/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("storeId"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" userApiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GET'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[125],{809:function(t,s,a){"use strict";a.r(s);var n=a(17),e=Object(n.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"greenfield-api-example-with-nodejs-javascript"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#greenfield-api-example-with-nodejs-javascript"}},[t._v("#")]),t._v(" Greenfield API example with Node.js (JavaScript)")]),t._v(" "),s("p",[t._v("The "),s("strong",[s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Greenfield API"),s("OutboundLink")],1)]),t._v(" (also available on your instance on "),s("code",[t._v("/docs")]),t._v(") allows you to operate BTCPay Server via an easy-to-use REST API.")]),t._v(" "),s("p",[t._v("Note that you can partially generate clients in the language of your choice by using the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/swagger.json",target:"_blank",rel:"noopener noreferrer"}},[t._v("Swagger file"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("In this guide, we will show you how to use it using Node.js/JavaScript.")]),t._v(" "),s("h2",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),s("p",[t._v("Unless for a few endpoints like creating a store and API key on behalf of a specific user, Basic Auth should be avoided and an API key should be used instead. Make sure that API keys only have the needed permissions and not more. E.g. if you only create invoices you should not give the API key the permission to manage your stores.")]),t._v(" "),s("p",[t._v("You can create a new API key in the BTCPay Server UI under "),s("code",[t._v("Account")]),t._v(" -> "),s("code",[t._v("Manage account")]),t._v(" -> "),s("code",[t._v("API keys")])]),t._v(" "),s("p",[t._v("For the ecommerce examples below the API key needs the following permissions:")]),t._v(" "),s("ul",[s("li",[t._v("View invoices")]),t._v(" "),s("li",[t._v("Create invoice")]),t._v(" "),s("li",[t._v("Modify invoices")]),t._v(" "),s("li",[t._v("Modify stores webhooks")]),t._v(" "),s("li",[t._v("View your stores")]),t._v(" "),s("li",[t._v("Create non-approved pull payments")])]),t._v(" "),s("p",[t._v("For an overview of available permissions see the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#section/Authentication/API_Key",target:"_blank",rel:"noopener noreferrer"}},[t._v("API documentation"),s("OutboundLink")],1),t._v(" or the permissions documented on each endpoint.")]),t._v(" "),s("h2",{attrs:{id:"ecommerce-examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ecommerce-examples"}},[t._v("#")]),t._v(" eCommerce examples")]),t._v(" "),s("p",[t._v("The following examples will show you how to create a basic eCommerce flow using the Greenfield API by creating an invoice, registering a webhook, processing webhooks, and issuing a full refund of an invoice.")]),t._v(" "),s("h3",{attrs:{id:"create-an-invoice"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-an-invoice"}},[t._v("#")]),t._v(" Create an invoice")]),t._v(" "),s("p",[t._v("We create an invoice using the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_CreateInvoice",target:"_blank",rel:"noopener noreferrer"}},[t._v("create invoice endpoint"),s("OutboundLink")],1),t._v(". This is a simple example but you can set a lot more data like order id, buyer email or custom metadata. That said, don't store redundant data on the invoice to prevent data leaks in case of a hack. E.g. in most cases it makes no sense to store the customer address on your eCommerce system and also on the BTCPay invoice.")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" storeId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_STORE_ID'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_API_KEY'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" amount "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" currency "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'USD'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/api/v1/stores/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("storeId"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/invoices")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("amount")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" amount"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("currency")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" currency\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'POST'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"register-a-webhook-optional"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#register-a-webhook-optional"}},[t._v("#")]),t._v(" Register a webhook (optional)")]),t._v(" "),s("p",[t._v("Let's register a webhook to be notified when the invoice is paid. You can use the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Webhooks_CreateWebhook",target:"_blank",rel:"noopener noreferrer"}},[t._v("create webhook endpoint"),s("OutboundLink")],1),t._v(" to register a webhook.")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" storeId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_STORE_ID'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_API_KEY'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/api/v1/stores/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("storeId"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/webhooks")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("url")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://example.com/your-webhook-endpoint'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'POST'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("This step is optional, you can also manually create a webhook in the BTCPay Server UI in your store "),s("code",[t._v("Settings")]),t._v(" -> "),s("code",[t._v("Webhooks")]),t._v(".")]),t._v(" "),s("h3",{attrs:{id:"validate-and-process-webhooks"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#validate-and-process-webhooks"}},[t._v("#")]),t._v(" Validate and process webhooks")]),t._v(" "),s("p",[t._v("You can use your Node.js Express web application to receive webhook requests from your BTCPay Server.")]),t._v(" "),s("p",[t._v("First you need a route so that your Node.js application can receive POST requests.\nBased on how you set up the express server this should look something like this:")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("app"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("post")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/your-webhook-endpoint'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" res")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Do stuff here")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("What's important is that the webhook sends a HTTP-header "),s("code",[t._v("BTCPAY-SIG")]),t._v(" which is the signed request using the "),s("code",[t._v("secret")]),t._v(" you got back from the previous step when registering the webhook. You can use that "),s("code",[t._v("secret")]),t._v(" and the raw payload (as bytes) you get from the webhook, hash it and compare it to "),s("code",[t._v("BTCPAY-SIG")]),t._v(". Therefore, you need "),s("code",[t._v("body-parser")]),t._v(" which is a middleware to parse the raw body of the request. For comparing the hashes you also need "),s("code",[t._v("crypto")]),t._v(" which is a built-in Node.js module.")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" bodyParser "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'body-parser'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" crypto "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("require")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'crypto'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("You can parse the raw body of the request like this:")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("app"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("use")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n bodyParser"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("verify")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" buf")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rawBody "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" buf\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("This makes sure that in req.rawBody the correct content is parsed so that you can compare the hashed req.rawBody with the "),s("code",[t._v("BTCPAY-SIG")]),t._v(" header value.")]),t._v(" "),s("p",[t._v("However, if you are using TypeScript, you might run into this error:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("Property 'rawBody' does not exist on type 'Request'.\n")])])]),s("p",[t._v("The temporary fix is to use the "),s("code",[t._v("as")]),t._v(" keyword to tell the compiler to consider the "),s("code",[t._v("req")]),t._v(" object as another type when you accessing the "),s("code",[t._v("rawBody")]),t._v(". Here is an example of how to obtain "),s("code",[t._v("rawBody")]),t._v(" using this workaround, no need for the middleware code above:")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" Request"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Response "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"express-serve-static-core"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("import")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" https "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("from")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"firebase-functions"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\ntype FirebaseRequest "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" https"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Request\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function-variable function"}},[t._v("myFunc")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("req")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Request"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("res")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" Response")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" rawBody "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("req "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("as")]),t._v(" FirebaseRequest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rawBody"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Replace "),s("code",[t._v("req.rawBody")]),t._v(" with "),s("code",[t._v("rawBody")]),t._v(" in the next sections if utilizing this method with TypeScript.")]),t._v(" "),s("p",[t._v("In your router it looks like this put all together: (Change "),s("code",[t._v("webhookSecret")]),t._v(" with the "),s("code",[t._v("secret")]),t._v(" you got back from the previous step when registering the webhook).")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[t._v("app"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("post")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/your-webhook-endpoint'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" res")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" sigHashAlg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sha256'")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" sigHeaderName "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'BTCPAY-SIG'")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" webhookSecret "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SECRET_FROM_REGISTERING_WEBHOOK'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// see previous step")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rawBody"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("status")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("500")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Request body empty'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" checksum "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("get")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sigHeaderName"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'utf8'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" hmac "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" crypto"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("createHmac")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("sigHashAlg"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" webhookSecret"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" digest "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Buffer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("from")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n sigHashAlg "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'='")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" hmac"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("update")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("req"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("rawBody"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("digest")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'hex'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'utf8'")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n checksum"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!==")]),t._v(" digest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("length "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("||")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("crypto"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("timingSafeEqual")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("digest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" checksum"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Request body digest (")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("digest"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(") did not match ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("sigHeaderName"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" (")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("checksum"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("status")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("500")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("Request body digest (")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("digest"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(") did not match ")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("sigHeaderName"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(" (")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("checksum"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("else")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Your own processing code goes here. E.g. update your internal order id depending on the invoice payment status.")]),t._v("\n\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("status")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("200")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Success: request body was signed'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"issue-a-full-refund-of-an-invoice"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#issue-a-full-refund-of-an-invoice"}},[t._v("#")]),t._v(" Issue a full refund of an invoice")]),t._v(" "),s("p",[t._v("Using the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_Refund",target:"_blank",rel:"noopener noreferrer"}},[t._v("invoice refund endpoint"),s("OutboundLink")],1),t._v(" you can issue a full (or even partial) refund of an invoice. This will return a link where the customer can claim the refund.")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" storeId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_STORE_ID'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_API_KEY'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" invoiceId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'EXISTING_INVOICE_ID'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/api/v1/stores/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("storeId"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/invoices/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("invoiceId"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/refund")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("refundVariant")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'CurrentRate'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("paymentMethod")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'BTC'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'POST'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h2",{attrs:{id:"btcpay-server-management-examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-management-examples"}},[t._v("#")]),t._v(" BTCPay Server management examples")]),t._v(" "),s("p",[t._v("Here we assume you are an ambassador and host BTCPay Server for your users. You manage your users on your own system and want to create a user and set email and password for their BTCPay Server login. Then using the same credentials to create a store and an API key on behalf of that user.")]),t._v(" "),s("h3",{attrs:{id:"create-a-new-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-user"}},[t._v("#")]),t._v(" Create a new user")]),t._v(" "),s("p",[t._v("Creating a new user can be done by using "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Users_CreateUser",target:"_blank",rel:"noopener noreferrer"}},[t._v("this endpoint"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" adminApiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_ADMIN_API_KEY'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/api/v1/users'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" adminApiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("email")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'satoshi.nakamoto@example.com'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("password")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'SuperSecurePasswordsShouldBeQuiteLong123'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("isAdministrator")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'POST'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"create-a-new-api-key-for-the-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-api-key-for-the-user"}},[t._v("#")]),t._v(" Create a new API key (for the user)")]),t._v(" "),s("p",[t._v("While we can use basic authentication to access the greenfield API, it is recommended to use API Keys to limit the scope of the credentials.")]),t._v(" "),s("p",[t._v("For example: If we want to "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Stores_CreateStore",target:"_blank",rel:"noopener noreferrer"}},[t._v("create a new store"),s("OutboundLink")],1),t._v(" we need the "),s("code",[t._v("btcpay.store.canmodifystoresettings")]),t._v(" permission for the API key. Warning: If you do not pass any permission then the API key will have unrestricted access.")]),t._v(" "),s("p",[t._v("As mentioned above, you can do this through the BTCPay Server UI of your instance, but let's do it through the API using "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/ApiKeys_CreateUserApiKey",target:"_blank",rel:"noopener noreferrer"}},[t._v("this endpoint"),s("OutboundLink")],1),t._v(" where we with our admin API key create an API key for our new user.")]),t._v(" "),s("div",{staticClass:"language-js extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" adminApiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'YOUR_ADMIN_API_KEY'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" email "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'satoshi.nakamoto@example.com'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/api/v1/users/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("email"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/api-keys")]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" adminApiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("label")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Satoshi Nakamoto API Key'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("permissions")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'btcpay.store.canmodifystoresettings'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'POST'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// returns apiKey")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"create-a-new-store"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-store"}},[t._v("#")]),t._v(" Create a new store")]),t._v(" "),s("p",[t._v("Now, we can use the api key to "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Stores_CreateStore",target:"_blank",rel:"noopener noreferrer"}},[t._v("create a new store"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayserverUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" userApiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'USER_API_KEY'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// From previous step")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/api/v1/stores'")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" userApiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" payload "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("name")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'Satoshi Store'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'POST'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("body")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constant"}},[t._v("JSON")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("stringify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("payload"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("h3",{attrs:{id:"read-store-information"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#read-store-information"}},[t._v("#")]),t._v(" Read store information")]),t._v(" "),s("p",[t._v("We can use the new apikey to "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Stores_GetStore",target:"_blank",rel:"noopener noreferrer"}},[t._v("read store"),s("OutboundLink")],1),t._v(" information:")]),t._v(" "),s("div",{staticClass:"language-JS extra-class"},[s("pre",{pre:!0,attrs:{class:"language-js"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'https://mainnet.demo.btcpayserver.org'")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" userApiKey "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'USER_API_KEY'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// From previous step")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" storeId "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'STORE_ID'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// From previous step")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" apiEndpoint "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token template-string"}},[s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("/api/v1/stores/")]),s("span",{pre:!0,attrs:{class:"token interpolation"}},[s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("${")]),t._v("storeId"),s("span",{pre:!0,attrs:{class:"token interpolation-punctuation punctuation"}},[t._v("}")])]),s("span",{pre:!0,attrs:{class:"token template-punctuation string"}},[t._v("`")])]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" headers "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string-property property"}},[t._v("'Content-Type'")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'application/json'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("Authorization")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'token '")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" userApiKey\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("btcpayServerUrl "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("+")]),t._v(" apiEndpoint"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("method")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'GET'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token literal-property property"}},[t._v("headers")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" headers\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("response")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" response"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("json")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("then")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token parameter"}},[t._v("data")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n console"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("log")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n res"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("send")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("data"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=e.exports}}]); \ No newline at end of file diff --git a/assets/js/126.44539e08.js b/assets/js/126.0bf7064c.js similarity index 99% rename from assets/js/126.44539e08.js rename to assets/js/126.0bf7064c.js index 6aae3b7d15..ab509f99e5 100644 --- a/assets/js/126.44539e08.js +++ b/assets/js/126.0bf7064c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[126],{813:function(a,s,t){"use strict";t.r(s);var e=t(17),r=Object(e.a)({},(function(){var a=this,s=a._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"greenfield-api-example-with-curl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#greenfield-api-example-with-curl"}},[a._v("#")]),a._v(" Greenfield API example with cURL")]),a._v(" "),s("p",[a._v("The "),s("strong",[s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Greenfield API"),s("OutboundLink")],1)]),a._v(" (also available on your instance on "),s("code",[a._v("/docs")]),a._v(") allows you to operate BTCPay Server via an easy-to-use REST API.")]),a._v(" "),s("p",[a._v("Note that you can partially generate clients in the language of your choice by using the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/swagger.json",target:"_blank",rel:"noopener noreferrer"}},[a._v("Swagger file"),s("OutboundLink")],1),a._v(".")]),a._v(" "),s("p",[a._v("In this guide, we will show you how to use it via command line on linux using "),s("code",[a._v("curl")]),a._v(" and "),s("code",[a._v("jq")]),a._v(".")]),a._v(" "),s("h2",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[a._v("#")]),a._v(" Prerequisites")]),a._v(" "),s("p",[a._v("Unless for a few endpoints like creating a store and API key on behalf of a specific user, Basic Auth should be avoided and an API key should be used instead. Make sure that API keys only have the needed permissions and not more. E.g. if you only create invoices you should not give the API key the permission to manage your stores.")]),a._v(" "),s("p",[a._v("You can create a new API key in the BTCPay Server UI under "),s("code",[a._v("Account")]),a._v(" -> "),s("code",[a._v("Manage account")]),a._v(" -> "),s("code",[a._v("API keys")])]),a._v(" "),s("p",[a._v("For the ecommerce examples below the API key needs the following permissions:")]),a._v(" "),s("ul",[s("li",[a._v("View invoices")]),a._v(" "),s("li",[a._v("Create invoice")]),a._v(" "),s("li",[a._v("Modify invoices")]),a._v(" "),s("li",[a._v("Modify stores webhooks")]),a._v(" "),s("li",[a._v("View your stores")]),a._v(" "),s("li",[a._v("Create non-approved pull payments")])]),a._v(" "),s("p",[a._v("For an overview of available permissions see the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#section/Authentication/API_Key",target:"_blank",rel:"noopener noreferrer"}},[a._v("API documentation"),s("OutboundLink")],1),a._v(" or the permissions documented on each endpoint.")]),a._v(" "),s("h2",{attrs:{id:"ecommerce-examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ecommerce-examples"}},[a._v("#")]),a._v(" eCommerce examples")]),a._v(" "),s("p",[a._v("The following examples will show you how to create a basic eCommerce flow using the Greenfield API by creating an invoice, registering a webhook, processing webhooks, and issuing a full refund of an invoice.")]),a._v(" "),s("h3",{attrs:{id:"create-an-invoice"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-an-invoice"}},[a._v("#")]),a._v(" Create an invoice")]),a._v(" "),s("p",[a._v("We create an invoice using the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_CreateInvoice",target:"_blank",rel:"noopener noreferrer"}},[a._v("create invoice endpoint"),s("OutboundLink")],1),a._v(". This is a simple example but you can set a lot more data like order id, buyer email or custom metadata. That said, don't store redundant data on the invoice to prevent data leaks in case of a hack. E.g. in most cases it makes no sense to store the customer address on your eCommerce system and also on the BTCPay invoice.")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAY_INSTANCE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://mainnet.demo.btcpayserver.org"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_API_KEY"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("STORE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_STORE_ID"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AMOUNT")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"10"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("CURRENCY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"USD"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BODY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$AMOUNT")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {amount:$a}'")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$CURRENCY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {currency:$a}'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Authorization: token '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$API_KEY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BODY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v("/api/v1/stores/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$STORE_ID")]),a._v('/invoices"')]),a._v("\n")])])]),s("h3",{attrs:{id:"register-a-webhook-optional"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#register-a-webhook-optional"}},[a._v("#")]),a._v(" Register a webhook (optional)")]),a._v(" "),s("p",[a._v("Let's register a webhook to be notified when the invoice is paid. You can use the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Webhooks_CreateWebhook",target:"_blank",rel:"noopener noreferrer"}},[a._v("create webhook endpoint"),s("OutboundLink")],1),a._v(" to register a webhook.")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAY_INSTANCE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://mainnet.demo.btcpayserver.org"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_API_KEY"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("STORE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_STORE_ID"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("URL")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://example.com/your-webhook-endpoint"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BODY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$URL")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {url:$a}'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Authorization: token '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$API_KEY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BODY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v("/api/v1/stores/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$STORE_ID")]),a._v('/webhooks"')]),a._v("\n")])])]),s("p",[a._v("This step is optional, you can also manually create a webhook in the BTCPay Server UI in your store "),s("code",[a._v("Settings")]),a._v(" -> "),s("code",[a._v("Webhooks")]),a._v(".")]),a._v(" "),s("h3",{attrs:{id:"validate-and-process-webhooks"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#validate-and-process-webhooks"}},[a._v("#")]),a._v(" Validate and process webhooks")]),a._v(" "),s("p",[a._v("This is not really possible with curl in bash but when you run a webserver. You can check the examples for "),s("RouterLink",{attrs:{to:"/Development/GreenFieldExample-NodeJS/"}},[a._v("NodeJS")]),a._v(" and "),s("RouterLink",{attrs:{to:"/Development/GreenfieldExample-PHP/"}},[a._v("PHP")]),a._v(".")],1),a._v(" "),s("h3",{attrs:{id:"issue-a-full-refund-of-an-invoice"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#issue-a-full-refund-of-an-invoice"}},[a._v("#")]),a._v(" Issue a full refund of an invoice")]),a._v(" "),s("p",[a._v("Using the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_Refund",target:"_blank",rel:"noopener noreferrer"}},[a._v("invoice refund endpoint"),s("OutboundLink")],1),a._v(" you can issue a full (or even partial) refund of an invoice. This will return a link where the customer can claim the refund.")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAY_INSTANCE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://mainnet.demo.btcpayserver.org"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_API_KEY"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("STORE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_STORE_ID"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("INVOICE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"EXISTING_INVOICE_ID"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("PAYMENT_METHOD")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"BTC"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("REFUND_VARIANT")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"CurrentRate"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BODY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$REFUND_VARIANT")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {refundVariant:$a}'")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$PAYMENT_METHOD")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {paymentMethod:$a}'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Authorization: token '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$API_KEY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BODY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v("/api/v1/stores/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$STORE_ID")]),a._v("/invoices/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$INVOICE_ID")]),a._v('/refund"')]),a._v("\n")])])]),s("h2",{attrs:{id:"btcpay-server-management-examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-management-examples"}},[a._v("#")]),a._v(" BTCPay Server management examples")]),a._v(" "),s("p",[a._v("Here we assume you are an ambassador and host BTCPay Server for your users. You manage your users on your own system and want to create a user and set email and password for their BTCPay Server login. Then using the same credentials to create a store and an API key on behalf of that user.")]),a._v(" "),s("h3",{attrs:{id:"create-a-new-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-user"}},[a._v("#")]),a._v(" Create a new user")]),a._v(" "),s("p",[a._v("Creating a new user can be done by using "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Users_CreateUser",target:"_blank",rel:"noopener noreferrer"}},[a._v("this endpoint"),s("OutboundLink")],1),a._v(".")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAY_INSTANCE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://mainnet.demo.btcpayserver.org"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("ADMIN_API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_ADMIN_API_KEY"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"satoshi.nakamoto@example.com"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("PASSWORD")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"SuperSecurePasswordsShouldBeQuiteLong123"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BODY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$USER")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {email:$a}'")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$PASSWORD")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {password:$a}'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Authorization: token '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$ADMIN_API_KEY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BODY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v('/api/v1/users"')]),a._v("\n")])])]),s("h3",{attrs:{id:"create-a-store-on-behalf-of-the-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-store-on-behalf-of-the-user"}},[a._v("#")]),a._v(" Create a store on behalf of the user")]),a._v(" "),s("p",[a._v("Now we create a store with the new users credentials the user becomes the owner "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Stores_CreateStore",target:"_blank",rel:"noopener noreferrer"}},[a._v("create a new store"),s("OutboundLink")],1),a._v(".")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("STORE_NAME")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"My awesome store"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BODY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$STORE_NAME")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {name:$a}'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("NEW_STORE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--user")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$USER")]),a._v(":"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$PASSWORD")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BODY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v('/api/v1/stores"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-r")]),a._v(" .id"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"New store id: '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$NEW_STORE_ID")]),a._v('"')]),a._v("\n")])])]),s("h3",{attrs:{id:"create-a-new-api-key-on-behalf-of-the-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-api-key-on-behalf-of-the-user"}},[a._v("#")]),a._v(" Create a new API key on behalf of the user")]),a._v(" "),s("p",[a._v("Now we can create an API key and limit it to the new store with e.g. the "),s("code",[a._v("btcpay.store.canmodifystoresettings")]),a._v(" permission. Likely you also want to allow API key to create invoices, but for this example we keep it simple.")]),a._v(" "),s("p",[a._v('You can find the needed permissions for endpoints on the endpoint docs under "Authorization" or an overview of permissions in the '),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#section/Authentication/API_Key",target:"_blank",rel:"noopener noreferrer"}},[a._v("authorization section"),s("OutboundLink")],1),a._v(".")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("ADMIN_API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_ADMIN_API_KEY"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"satoshi.nakamoto@example.com"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("PERMISSION")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"btcpay.store.canmodifystoresettings"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("NEW_STORE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"NEW_STORE_ID_FROM_PREVIOUS_STEP"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BODY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$PERMISSION")]),a._v(":"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$NEW_STORE_ID")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {permissions:[$a]}'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("USER_API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Authorization: token '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$ADMIN_API_KEY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BODY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v("/api/v1/users/"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$USER")]),a._v('/api-keys"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-r")]),a._v(" .apiKey"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"New user api key: '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$USER_API_KEY")]),a._v('"')]),a._v("\n")])])]),s("h3",{attrs:{id:"read-store-information"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#read-store-information"}},[a._v("#")]),a._v(" Read store information")]),a._v(" "),s("p",[a._v("We can use the new apikey to "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Stores_GetStore",target:"_blank",rel:"noopener noreferrer"}},[a._v("read store"),s("OutboundLink")],1),a._v(" information:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("USER_API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"API_KEY_FROM_PREVIOUS_STEP"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("NEW_STORE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"NEW_STORE_ID_FROM_BEFORE_PREVIOUS_STEP"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Authorization: token '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$USER_API_KEY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" GET "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v("/api/v1/stores/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$NEW_STORE_ID")]),a._v('"')]),a._v("\n")])])])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[126],{811:function(a,s,t){"use strict";t.r(s);var e=t(17),r=Object(e.a)({},(function(){var a=this,s=a._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[s("h1",{attrs:{id:"greenfield-api-example-with-curl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#greenfield-api-example-with-curl"}},[a._v("#")]),a._v(" Greenfield API example with cURL")]),a._v(" "),s("p",[a._v("The "),s("strong",[s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Greenfield API"),s("OutboundLink")],1)]),a._v(" (also available on your instance on "),s("code",[a._v("/docs")]),a._v(") allows you to operate BTCPay Server via an easy-to-use REST API.")]),a._v(" "),s("p",[a._v("Note that you can partially generate clients in the language of your choice by using the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/swagger.json",target:"_blank",rel:"noopener noreferrer"}},[a._v("Swagger file"),s("OutboundLink")],1),a._v(".")]),a._v(" "),s("p",[a._v("In this guide, we will show you how to use it via command line on linux using "),s("code",[a._v("curl")]),a._v(" and "),s("code",[a._v("jq")]),a._v(".")]),a._v(" "),s("h2",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[a._v("#")]),a._v(" Prerequisites")]),a._v(" "),s("p",[a._v("Unless for a few endpoints like creating a store and API key on behalf of a specific user, Basic Auth should be avoided and an API key should be used instead. Make sure that API keys only have the needed permissions and not more. E.g. if you only create invoices you should not give the API key the permission to manage your stores.")]),a._v(" "),s("p",[a._v("You can create a new API key in the BTCPay Server UI under "),s("code",[a._v("Account")]),a._v(" -> "),s("code",[a._v("Manage account")]),a._v(" -> "),s("code",[a._v("API keys")])]),a._v(" "),s("p",[a._v("For the ecommerce examples below the API key needs the following permissions:")]),a._v(" "),s("ul",[s("li",[a._v("View invoices")]),a._v(" "),s("li",[a._v("Create invoice")]),a._v(" "),s("li",[a._v("Modify invoices")]),a._v(" "),s("li",[a._v("Modify stores webhooks")]),a._v(" "),s("li",[a._v("View your stores")]),a._v(" "),s("li",[a._v("Create non-approved pull payments")])]),a._v(" "),s("p",[a._v("For an overview of available permissions see the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#section/Authentication/API_Key",target:"_blank",rel:"noopener noreferrer"}},[a._v("API documentation"),s("OutboundLink")],1),a._v(" or the permissions documented on each endpoint.")]),a._v(" "),s("h2",{attrs:{id:"ecommerce-examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ecommerce-examples"}},[a._v("#")]),a._v(" eCommerce examples")]),a._v(" "),s("p",[a._v("The following examples will show you how to create a basic eCommerce flow using the Greenfield API by creating an invoice, registering a webhook, processing webhooks, and issuing a full refund of an invoice.")]),a._v(" "),s("h3",{attrs:{id:"create-an-invoice"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-an-invoice"}},[a._v("#")]),a._v(" Create an invoice")]),a._v(" "),s("p",[a._v("We create an invoice using the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_CreateInvoice",target:"_blank",rel:"noopener noreferrer"}},[a._v("create invoice endpoint"),s("OutboundLink")],1),a._v(". This is a simple example but you can set a lot more data like order id, buyer email or custom metadata. That said, don't store redundant data on the invoice to prevent data leaks in case of a hack. E.g. in most cases it makes no sense to store the customer address on your eCommerce system and also on the BTCPay invoice.")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAY_INSTANCE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://mainnet.demo.btcpayserver.org"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_API_KEY"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("STORE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_STORE_ID"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("AMOUNT")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"10"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("CURRENCY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"USD"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BODY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$AMOUNT")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {amount:$a}'")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$CURRENCY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {currency:$a}'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Authorization: token '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$API_KEY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BODY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v("/api/v1/stores/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$STORE_ID")]),a._v('/invoices"')]),a._v("\n")])])]),s("h3",{attrs:{id:"register-a-webhook-optional"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#register-a-webhook-optional"}},[a._v("#")]),a._v(" Register a webhook (optional)")]),a._v(" "),s("p",[a._v("Let's register a webhook to be notified when the invoice is paid. You can use the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Webhooks_CreateWebhook",target:"_blank",rel:"noopener noreferrer"}},[a._v("create webhook endpoint"),s("OutboundLink")],1),a._v(" to register a webhook.")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAY_INSTANCE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://mainnet.demo.btcpayserver.org"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_API_KEY"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("STORE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_STORE_ID"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("URL")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://example.com/your-webhook-endpoint"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BODY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$URL")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {url:$a}'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Authorization: token '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$API_KEY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BODY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v("/api/v1/stores/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$STORE_ID")]),a._v('/webhooks"')]),a._v("\n")])])]),s("p",[a._v("This step is optional, you can also manually create a webhook in the BTCPay Server UI in your store "),s("code",[a._v("Settings")]),a._v(" -> "),s("code",[a._v("Webhooks")]),a._v(".")]),a._v(" "),s("h3",{attrs:{id:"validate-and-process-webhooks"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#validate-and-process-webhooks"}},[a._v("#")]),a._v(" Validate and process webhooks")]),a._v(" "),s("p",[a._v("This is not really possible with curl in bash but when you run a webserver. You can check the examples for "),s("RouterLink",{attrs:{to:"/Development/GreenFieldExample-NodeJS/"}},[a._v("NodeJS")]),a._v(" and "),s("RouterLink",{attrs:{to:"/Development/GreenfieldExample-PHP/"}},[a._v("PHP")]),a._v(".")],1),a._v(" "),s("h3",{attrs:{id:"issue-a-full-refund-of-an-invoice"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#issue-a-full-refund-of-an-invoice"}},[a._v("#")]),a._v(" Issue a full refund of an invoice")]),a._v(" "),s("p",[a._v("Using the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_Refund",target:"_blank",rel:"noopener noreferrer"}},[a._v("invoice refund endpoint"),s("OutboundLink")],1),a._v(" you can issue a full (or even partial) refund of an invoice. This will return a link where the customer can claim the refund.")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAY_INSTANCE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://mainnet.demo.btcpayserver.org"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_API_KEY"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("STORE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_STORE_ID"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("INVOICE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"EXISTING_INVOICE_ID"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("PAYMENT_METHOD")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"BTC"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("REFUND_VARIANT")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"CurrentRate"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BODY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$REFUND_VARIANT")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {refundVariant:$a}'")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$PAYMENT_METHOD")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {paymentMethod:$a}'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Authorization: token '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$API_KEY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BODY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v("/api/v1/stores/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$STORE_ID")]),a._v("/invoices/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$INVOICE_ID")]),a._v('/refund"')]),a._v("\n")])])]),s("h2",{attrs:{id:"btcpay-server-management-examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-management-examples"}},[a._v("#")]),a._v(" BTCPay Server management examples")]),a._v(" "),s("p",[a._v("Here we assume you are an ambassador and host BTCPay Server for your users. You manage your users on your own system and want to create a user and set email and password for their BTCPay Server login. Then using the same credentials to create a store and an API key on behalf of that user.")]),a._v(" "),s("h3",{attrs:{id:"create-a-new-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-user"}},[a._v("#")]),a._v(" Create a new user")]),a._v(" "),s("p",[a._v("Creating a new user can be done by using "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Users_CreateUser",target:"_blank",rel:"noopener noreferrer"}},[a._v("this endpoint"),s("OutboundLink")],1),a._v(".")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAY_INSTANCE")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"https://mainnet.demo.btcpayserver.org"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("ADMIN_API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_ADMIN_API_KEY"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"satoshi.nakamoto@example.com"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("PASSWORD")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"SuperSecurePasswordsShouldBeQuiteLong123"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BODY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$USER")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {email:$a}'")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$PASSWORD")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {password:$a}'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Authorization: token '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$ADMIN_API_KEY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BODY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v('/api/v1/users"')]),a._v("\n")])])]),s("h3",{attrs:{id:"create-a-store-on-behalf-of-the-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-store-on-behalf-of-the-user"}},[a._v("#")]),a._v(" Create a store on behalf of the user")]),a._v(" "),s("p",[a._v("Now we create a store with the new users credentials the user becomes the owner "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Stores_CreateStore",target:"_blank",rel:"noopener noreferrer"}},[a._v("create a new store"),s("OutboundLink")],1),a._v(".")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("STORE_NAME")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"My awesome store"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BODY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$STORE_NAME")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {name:$a}'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("NEW_STORE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--user")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$USER")]),a._v(":"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$PASSWORD")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BODY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v('/api/v1/stores"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-r")]),a._v(" .id"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"New store id: '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$NEW_STORE_ID")]),a._v('"')]),a._v("\n")])])]),s("h3",{attrs:{id:"create-a-new-api-key-on-behalf-of-the-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-api-key-on-behalf-of-the-user"}},[a._v("#")]),a._v(" Create a new API key on behalf of the user")]),a._v(" "),s("p",[a._v("Now we can create an API key and limit it to the new store with e.g. the "),s("code",[a._v("btcpay.store.canmodifystoresettings")]),a._v(" permission. Likely you also want to allow API key to create invoices, but for this example we keep it simple.")]),a._v(" "),s("p",[a._v('You can find the needed permissions for endpoints on the endpoint docs under "Authorization" or an overview of permissions in the '),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#section/Authentication/API_Key",target:"_blank",rel:"noopener noreferrer"}},[a._v("authorization section"),s("OutboundLink")],1),a._v(".")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("ADMIN_API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"YOUR_ADMIN_API_KEY"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("USER")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"satoshi.nakamoto@example.com"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("PERMISSION")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"btcpay.store.canmodifystoresettings"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("NEW_STORE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"NEW_STORE_ID_FROM_PREVIOUS_STEP"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BODY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"{}"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("--arg")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"a"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$PERMISSION")]),a._v(":"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$NEW_STORE_ID")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v("'. + {permissions:[$a]}'")]),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("USER_API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Authorization: token '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$ADMIN_API_KEY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" POST "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-d")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BODY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v("/api/v1/users/"),s("span",{pre:!0,attrs:{class:"token environment constant"}},[a._v("$USER")]),a._v('/api-keys"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("|")]),a._v(" jq "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-r")]),a._v(" .apiKey"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v(")")])]),a._v('"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("echo")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"New user api key: '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$USER_API_KEY")]),a._v('"')]),a._v("\n")])])]),s("h3",{attrs:{id:"read-store-information"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#read-store-information"}},[a._v("#")]),a._v(" Read store information")]),a._v(" "),s("p",[a._v("We can use the new apikey to "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Stores_GetStore",target:"_blank",rel:"noopener noreferrer"}},[a._v("read store"),s("OutboundLink")],1),a._v(" information:")]),a._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("USER_API_KEY")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"API_KEY_FROM_PREVIOUS_STEP"')]),a._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("NEW_STORE_ID")]),s("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"NEW_STORE_ID_FROM_BEFORE_PREVIOUS_STEP"')]),a._v("\n\n"),s("span",{pre:!0,attrs:{class:"token function"}},[a._v("curl")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-s")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Content-Type: application/json"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-H")]),a._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"Authorization: token '),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$USER_API_KEY")]),a._v('"')]),a._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-X")]),a._v(" GET "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("\\")]),a._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAY_INSTANCE")]),a._v("/api/v1/stores/"),s("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$NEW_STORE_ID")]),a._v('"')]),a._v("\n")])])])])}),[],!1,null,null,null);s.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/128.1db1bc76.js b/assets/js/128.15fd508f.js similarity index 99% rename from assets/js/128.1db1bc76.js rename to assets/js/128.15fd508f.js index b1f10132a9..96840e074c 100644 --- a/assets/js/128.1db1bc76.js +++ b/assets/js/128.15fd508f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[128],{814:function(t,s,a){"use strict";a.r(s);var e=a(17),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"invoice-metadata"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#invoice-metadata"}},[t._v("#")]),t._v(" Invoice metadata")]),t._v(" "),s("p",[t._v("Each invoice contains metadata, which is a customizable JSON object that can be tailored through the API during the creation of an invoice. Although it lacks a fixed schema, certain properties within the metadata can be interpreted by the UI.")]),t._v(" "),s("p",[t._v("This page provides an overview of these properties and explains how they are utilized within the BTCPay Server.")]),t._v(" "),s("h2",{attrs:{id:"well-known-properties"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#well-known-properties"}},[t._v("#")]),t._v(" Well-known properties")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Property path")]),t._v(" "),s("th",[t._v("Description")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[s("code",[t._v(".orderId")])]),t._v(" "),s("td",[t._v("Refers to the order ID from an external system, such as an e-commerce platform like WooCommerce. This property is indexed, allowing for efficient invoice searches using the "),s("code",[t._v("orderId")]),t._v(".")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".orderUrl")])]),t._v(" "),s("td",[t._v("Refers to a URL linking back to the order page of the external system. This link is displayed in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".paymentRequestId")])]),t._v(" "),s("td",[t._v("In the invoice details view, a link is provided for navigating to the payment request page associated with the invoice.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".posData")])]),t._v(" "),s("td",[t._v("A custom JSON object that represents information displayed in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".receiptData")])]),t._v(" "),s("td",[t._v("A custom JSON object that represents information displayed on the receipt page of an invoice.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerName")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerEmail")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerAddress1")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerAddress2")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerCity")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerState")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerZip")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerCountry")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerPhone")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".itemDesc")])]),t._v(" "),s("td",[t._v("When using the Point of Sale (except in keypad or cart view), this field is set to the item description of the purchased item. This information is included in the CSV invoice export feature and appears in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".itemCode")])]),t._v(" "),s("td",[t._v("When using the Point of Sale (except in keypad or cart view), this field is set to the item code of the purchased item. This information is included in the CSV invoice export feature and appears in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".physical")])]),t._v(" "),s("td",[t._v("Boolean value indicating whether this is a physical good; displayed in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".taxIncluded")])]),t._v(" "),s("td",[t._v("Number representing the tax amount in the invoice currency. This information will appear in the invoice details view. During invoice creation, the value is automatically rounded to significant digits and ensured not to be greater than the invoice's price.")])])])]),t._v(" "),s("h2",{attrs:{id:"examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),s("p",[t._v("Point of sale invoice (Product list view):")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pos-app_346KRC5BjXXXo8cRFKwTBmdR6ZJ4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemCode"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"green tea"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemDesc"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Green Tea"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:14142/apps/346KRC5BjXXXo8cRFKwTBmdR6ZJ4/pos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"receiptData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Green Tea"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"Lovely, fresh and tender, Meng Ding Gan Lu ('sweet dew') is grown in the lush Meng Ding Mountains of the southwestern province of Sichuan where it has been cultivated for over a thousand years.\"")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Point of sale invoice (Cart view):")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pos-app_346KRC5BjXXXo8cRFKwTBmdR6ZJ4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"posData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tip"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.48")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"cart"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pu erh"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"image"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/img/pos-sample/pu-erh.jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"price"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"formatted"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$2.00"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pu Erh"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"inventory"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rooibos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"image"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/img/pos-sample/rooibos.jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"price"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"formatted"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$1.20"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Rooibos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"inventory"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"total"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.68")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"subTotal"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"customAmount"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"discountAmount"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"discountPercentage"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemDesc"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tea shop"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:14142/apps/346KRC5BjXXXo8cRFKwTBmdR6ZJ4/pos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"receiptData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Tip"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$0.48"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Cart"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Pu Erh"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$2.00 x 1 = $2.00"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Rooibos"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$1.20 x 1 = $1.20"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Point of sale invoice (Keypad view):")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pos-app_346KRC5BjXXXo8cRFKwTBmdR6ZJ4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"posData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"total"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"12.00"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"subTotal"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"12.00"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemDesc"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tea shop"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:14142/apps/346KRC5BjXXXo8cRFKwTBmdR6ZJ4/pos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"receiptData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[128],{815:function(t,s,a){"use strict";a.r(s);var e=a(17),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"invoice-metadata"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#invoice-metadata"}},[t._v("#")]),t._v(" Invoice metadata")]),t._v(" "),s("p",[t._v("Each invoice contains metadata, which is a customizable JSON object that can be tailored through the API during the creation of an invoice. Although it lacks a fixed schema, certain properties within the metadata can be interpreted by the UI.")]),t._v(" "),s("p",[t._v("This page provides an overview of these properties and explains how they are utilized within the BTCPay Server.")]),t._v(" "),s("h2",{attrs:{id:"well-known-properties"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#well-known-properties"}},[t._v("#")]),t._v(" Well-known properties")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Property path")]),t._v(" "),s("th",[t._v("Description")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[s("code",[t._v(".orderId")])]),t._v(" "),s("td",[t._v("Refers to the order ID from an external system, such as an e-commerce platform like WooCommerce. This property is indexed, allowing for efficient invoice searches using the "),s("code",[t._v("orderId")]),t._v(".")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".orderUrl")])]),t._v(" "),s("td",[t._v("Refers to a URL linking back to the order page of the external system. This link is displayed in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".paymentRequestId")])]),t._v(" "),s("td",[t._v("In the invoice details view, a link is provided for navigating to the payment request page associated with the invoice.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".posData")])]),t._v(" "),s("td",[t._v("A custom JSON object that represents information displayed in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".receiptData")])]),t._v(" "),s("td",[t._v("A custom JSON object that represents information displayed on the receipt page of an invoice.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerName")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerEmail")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerAddress1")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerAddress2")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerCity")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerState")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerZip")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerCountry")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".buyerPhone")])]),t._v(" "),s("td",[t._v("Visible in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".itemDesc")])]),t._v(" "),s("td",[t._v("When using the Point of Sale (except in keypad or cart view), this field is set to the item description of the purchased item. This information is included in the CSV invoice export feature and appears in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".itemCode")])]),t._v(" "),s("td",[t._v("When using the Point of Sale (except in keypad or cart view), this field is set to the item code of the purchased item. This information is included in the CSV invoice export feature and appears in the invoice details view.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".physical")])]),t._v(" "),s("td",[t._v("Boolean value indicating whether this is a physical good; displayed in the invoice details view and in the BitPay API-compatible endpoints.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".taxIncluded")])]),t._v(" "),s("td",[t._v("Number representing the tax amount in the invoice currency. This information will appear in the invoice details view. During invoice creation, the value is automatically rounded to significant digits and ensured not to be greater than the invoice's price.")])])])]),t._v(" "),s("h2",{attrs:{id:"examples"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#examples"}},[t._v("#")]),t._v(" Examples")]),t._v(" "),s("p",[t._v("Point of sale invoice (Product list view):")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pos-app_346KRC5BjXXXo8cRFKwTBmdR6ZJ4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemCode"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"green tea"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemDesc"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Green Tea"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:14142/apps/346KRC5BjXXXo8cRFKwTBmdR6ZJ4/pos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"receiptData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Green Tea"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Description"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("\"Lovely, fresh and tender, Meng Ding Gan Lu ('sweet dew') is grown in the lush Meng Ding Mountains of the southwestern province of Sichuan where it has been cultivated for over a thousand years.\"")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Point of sale invoice (Cart view):")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pos-app_346KRC5BjXXXo8cRFKwTBmdR6ZJ4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"posData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tip"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.48")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"cart"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pu erh"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"image"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/img/pos-sample/pu-erh.jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"price"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"formatted"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$2.00"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Pu Erh"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"inventory"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"id"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"rooibos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"count"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"image"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"~/img/pos-sample/rooibos.jpg"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"price"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"formatted"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$1.20"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"title"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Rooibos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"inventory"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"total"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.68")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"subTotal"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3.2")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"customAmount"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"discountAmount"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"discountPercentage"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemDesc"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tea shop"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:14142/apps/346KRC5BjXXXo8cRFKwTBmdR6ZJ4/pos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"receiptData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Tip"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$0.48"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Cart"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Pu Erh"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$2.00 x 1 = $2.00"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Rooibos"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"$1.20 x 1 = $1.20"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Point of sale invoice (Keypad view):")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderId"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"pos-app_346KRC5BjXXXo8cRFKwTBmdR6ZJ4"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"posData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"total"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"12.00"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"subTotal"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"12.00"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"itemDesc"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Tea shop"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"orderUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:14142/apps/346KRC5BjXXXo8cRFKwTBmdR6ZJ4/pos"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"receiptData"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/129.3e6b9d90.js b/assets/js/129.656d8ded.js similarity index 99% rename from assets/js/129.3e6b9d90.js rename to assets/js/129.656d8ded.js index 962db9a579..068322ba21 100644 --- a/assets/js/129.3e6b9d90.js +++ b/assets/js/129.656d8ded.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[129],{815:function(e,t,r){"use strict";r.r(t);var s=r(17),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-development"}},[e._v("#")]),e._v(" Local development")]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("p",[e._v("For the "),t("strong",[e._v("development environment")]),e._v(" you need to install these tools:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/8.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET 8.0 SDK"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Docker: "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-windows/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Windows"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-mac/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mac OS"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),t("p",[e._v("To execute tests and run the project for debugging, you need to run a number of "),t("strong",[e._v("dependencies")]),e._v(".")]),e._v(" "),t("p",[e._v("We wrapped all our dependencies in a docker-compose file that you can use to bootstrap the development environment:\nThe file "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(" can be used to spin everything up:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/btcpayserver/btcpayserver.git\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver/BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" up dev\n")])])]),t("h2",{attrs:{id:"which-ide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#which-ide"}},[e._v("#")]),e._v(" Which IDE?")]),e._v(" "),t("p",[e._v("We recommend using Visual Studio 2022 (Windows Only) or Rider (cross platform). Visual Studio Code (cross platform) should also be possible, but isn't as straightforward to setup for a comfortable development environment.\nYou can of course use VIM if you are hardcore, .NET Core is easy to use via command-line.")]),e._v(" "),t("p",[e._v("Visual Studio Code, Visual Studio and Rider will run the launch profile "),t("code",[e._v("Bitcoin")]),e._v(".\nThis will run a "),t("strong",[e._v("BTCPay Server instance connecting to the services in your Docker service")]),e._v(", so you can easily debug and step through the code.")]),e._v(" "),t("h2",{attrs:{id:"build-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-configuration"}},[e._v("#")]),e._v(" Build configuration")]),e._v(" "),t("p",[e._v("A build configuration defines how to "),t("strong",[e._v("build BTCPay Server")]),e._v(". For example, whether to include some source files, whether to optimize for debugging or performance.")]),e._v(" "),t("p",[e._v("There are several build configurations:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Debug")])]),e._v(" "),t("li",[t("code",[e._v("Release")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Debug")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Release")])])]),e._v(" "),t("p",[e._v("How to use a different one during your local development depends on your IDE.\nBy default "),t("code",[e._v("Debug")]),e._v(" is used, this is a Bitcoin only build excluding any altcoin dependencies. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("You can select which build to use via the "),t("code",[e._v("-c")]),e._v(" switch in "),t("code",[e._v("dotnet")]),e._v(" command line. If you use command line and want to run a Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("h2",{attrs:{id:"launch-profiles"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#launch-profiles"}},[e._v("#")]),e._v(" Launch profiles")]),e._v(" "),t("p",[e._v("When you "),t("strong",[e._v("start BTCPay Server locally for local development")]),e._v(", it needs the right parameter so it can connect to the development time dependencies in the docker-compose file.")]),e._v(" "),t("p",[e._v("Those parameters are wrapped into the dotnet concept of "),t("code",[e._v("launch profile")]),e._v(".")]),e._v(" "),t("p",[e._v("The launch profiles are specified in the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/Properties/launchSettings.json",target:"_blank",rel:"noopener noreferrer"}},[e._v("launchSettings.json"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("There are currently three launch profiles:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Bitcoin")])]),e._v(" "),t("li",[t("code",[e._v("Bitcoin-HTTPS")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-HTTPS")])])]),e._v(" "),t("p",[e._v("By default, "),t("code",[e._v("Bitcoin")]),e._v(" is used. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("If you use command line, "),t("code",[e._v("dotnet run")]),e._v(" allows you to select the launch profile of your choice:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run --launch-profile Bitcoin\n")])])]),t("h2",{attrs:{id:"running-tests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#running-tests"}},[e._v("#")]),e._v(" Running tests")]),e._v(" "),t("p",[e._v("Running tests is functioning in the exact same way as running the development time BTCPay Server.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[e._v("The concept of "),t("code",[e._v("launch profile")]),e._v(" does not apply for tests, but the concept of build configuration does. For example, if I want to run tests on the Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("p",[e._v("The tests are already configured to use the development time dependencies in the docker-compose presented earlier.")]),e._v(" "),t("p",[e._v("You can use the "),t("code",[e._v("--f")]),e._v(" (filter) switch to run a specific test.")]),e._v(" "),t("p",[e._v("If you use an IDE, consult your IDE documentation to run tests or switch to different configurations.")]),e._v(" "),t("h2",{attrs:{id:"altcoin-support-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#altcoin-support-development"}},[e._v("#")]),e._v(" Altcoin support development")]),e._v(" "),t("p",[e._v("By default, your IDE or simple "),t("code",[e._v("dotnet run")]),e._v(" will use "),t("code",[e._v("Bitcoin")]),e._v(" launch profile on "),t("code",[e._v("Debug")]),e._v(" build.")]),e._v(" "),t("ul",[t("li",[e._v("This means that BTCPay Server will be hosted on a local HTTP port, building without altcoin support,")]),e._v(" "),t("li",[e._v("Run BTCPay Server to connect to Bitcoin only dependencies specified in "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p",[e._v("If you want to "),t("strong",[e._v("develop with altcoins support")]),e._v(" you need to use the "),t("code",[e._v("Altcoins-HTTPS")]),e._v(" launch profile, on the "),t("code",[e._v("Altcoins-Debug")]),e._v(" build, and run the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.altcoins.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.altcoins.yml"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If using command line:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" docker-compose.altcoins.yml up dev\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v("/BTCPayServer\ndotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug --launch-profile Altcoins-HTTPS\n")])])]),t("p",[e._v("For tests")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug\n")])])]),t("h2",{attrs:{id:"https-support-for-local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#https-support-for-local-development"}},[e._v("#")]),e._v(" HTTPS support for local development")]),e._v(" "),t("p",[e._v("Some browser security features may require that you use "),t("strong",[e._v("HTTPS")]),e._v(" to be properly tested.")]),e._v(" "),t("p",[e._v("In this case, use "),t("code",[e._v("Bitcoin-HTTPS")]),e._v(" (or "),t("code",[e._v("Altcoin-HTTPS")]),e._v(") launch profile. This will create a self signed certificate for your development purpose.")]),e._v(" "),t("p",[e._v("However, your browser will not trust it, making it difficult to debug.")]),e._v(" "),t("p",[e._v("You can instruct your OS to trust this development time certificate by running:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet dev-certs https "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--trust")]),e._v("\n")])])]),t("h2",{attrs:{id:"videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videos"}},[e._v("#")]),e._v(" Videos")]),e._v(" "),t("p",[e._v("For more information check out these videos:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=ZePbMPSIvHM",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to contribute to BTCPay Server Development (Windows)"),t("OutboundLink")],1),e._v(" by Nicolas Dorier")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=j486T_Rk-yw",target:"_blank",rel:"noopener noreferrer"}},[e._v("Setting up BTCPayServer development environment on Linux (Ubuntu)"),t("OutboundLink")],1),e._v(" by RockStarDev")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=GWR_CcMsEV0",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Development - Testing pull request, payments (MacOS)"),t("OutboundLink")],1),e._v(" by Pavlenex")])]),e._v(" "),t("p",[e._v("and these notes:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to get started with development"),t("OutboundLink")],1),e._v(" by Nicolas Dorier (covering relevant docker commands, paying regtest invoices)")])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[129],{813:function(e,t,r){"use strict";r.r(t);var s=r(17),a=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-development"}},[e._v("#")]),e._v(" Local development")]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("p",[e._v("For the "),t("strong",[e._v("development environment")]),e._v(" you need to install these tools:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/8.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET 8.0 SDK"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Docker: "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-windows/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Windows"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-mac/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mac OS"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),t("p",[e._v("To execute tests and run the project for debugging, you need to run a number of "),t("strong",[e._v("dependencies")]),e._v(".")]),e._v(" "),t("p",[e._v("We wrapped all our dependencies in a docker-compose file that you can use to bootstrap the development environment:\nThe file "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(" can be used to spin everything up:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/btcpayserver/btcpayserver.git\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver/BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" up dev\n")])])]),t("h2",{attrs:{id:"which-ide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#which-ide"}},[e._v("#")]),e._v(" Which IDE?")]),e._v(" "),t("p",[e._v("We recommend using Visual Studio 2022 (Windows Only) or Rider (cross platform). Visual Studio Code (cross platform) should also be possible, but isn't as straightforward to setup for a comfortable development environment.\nYou can of course use VIM if you are hardcore, .NET Core is easy to use via command-line.")]),e._v(" "),t("p",[e._v("Visual Studio Code, Visual Studio and Rider will run the launch profile "),t("code",[e._v("Bitcoin")]),e._v(".\nThis will run a "),t("strong",[e._v("BTCPay Server instance connecting to the services in your Docker service")]),e._v(", so you can easily debug and step through the code.")]),e._v(" "),t("h2",{attrs:{id:"build-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-configuration"}},[e._v("#")]),e._v(" Build configuration")]),e._v(" "),t("p",[e._v("A build configuration defines how to "),t("strong",[e._v("build BTCPay Server")]),e._v(". For example, whether to include some source files, whether to optimize for debugging or performance.")]),e._v(" "),t("p",[e._v("There are several build configurations:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Debug")])]),e._v(" "),t("li",[t("code",[e._v("Release")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Debug")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Release")])])]),e._v(" "),t("p",[e._v("How to use a different one during your local development depends on your IDE.\nBy default "),t("code",[e._v("Debug")]),e._v(" is used, this is a Bitcoin only build excluding any altcoin dependencies. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("You can select which build to use via the "),t("code",[e._v("-c")]),e._v(" switch in "),t("code",[e._v("dotnet")]),e._v(" command line. If you use command line and want to run a Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("h2",{attrs:{id:"launch-profiles"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#launch-profiles"}},[e._v("#")]),e._v(" Launch profiles")]),e._v(" "),t("p",[e._v("When you "),t("strong",[e._v("start BTCPay Server locally for local development")]),e._v(", it needs the right parameter so it can connect to the development time dependencies in the docker-compose file.")]),e._v(" "),t("p",[e._v("Those parameters are wrapped into the dotnet concept of "),t("code",[e._v("launch profile")]),e._v(".")]),e._v(" "),t("p",[e._v("The launch profiles are specified in the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/Properties/launchSettings.json",target:"_blank",rel:"noopener noreferrer"}},[e._v("launchSettings.json"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("There are currently three launch profiles:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Bitcoin")])]),e._v(" "),t("li",[t("code",[e._v("Bitcoin-HTTPS")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-HTTPS")])])]),e._v(" "),t("p",[e._v("By default, "),t("code",[e._v("Bitcoin")]),e._v(" is used. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("If you use command line, "),t("code",[e._v("dotnet run")]),e._v(" allows you to select the launch profile of your choice:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run --launch-profile Bitcoin\n")])])]),t("h2",{attrs:{id:"running-tests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#running-tests"}},[e._v("#")]),e._v(" Running tests")]),e._v(" "),t("p",[e._v("Running tests is functioning in the exact same way as running the development time BTCPay Server.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[e._v("The concept of "),t("code",[e._v("launch profile")]),e._v(" does not apply for tests, but the concept of build configuration does. For example, if I want to run tests on the Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("p",[e._v("The tests are already configured to use the development time dependencies in the docker-compose presented earlier.")]),e._v(" "),t("p",[e._v("You can use the "),t("code",[e._v("--f")]),e._v(" (filter) switch to run a specific test.")]),e._v(" "),t("p",[e._v("If you use an IDE, consult your IDE documentation to run tests or switch to different configurations.")]),e._v(" "),t("h2",{attrs:{id:"altcoin-support-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#altcoin-support-development"}},[e._v("#")]),e._v(" Altcoin support development")]),e._v(" "),t("p",[e._v("By default, your IDE or simple "),t("code",[e._v("dotnet run")]),e._v(" will use "),t("code",[e._v("Bitcoin")]),e._v(" launch profile on "),t("code",[e._v("Debug")]),e._v(" build.")]),e._v(" "),t("ul",[t("li",[e._v("This means that BTCPay Server will be hosted on a local HTTP port, building without altcoin support,")]),e._v(" "),t("li",[e._v("Run BTCPay Server to connect to Bitcoin only dependencies specified in "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p",[e._v("If you want to "),t("strong",[e._v("develop with altcoins support")]),e._v(" you need to use the "),t("code",[e._v("Altcoins-HTTPS")]),e._v(" launch profile, on the "),t("code",[e._v("Altcoins-Debug")]),e._v(" build, and run the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.altcoins.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.altcoins.yml"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If using command line:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" docker-compose.altcoins.yml up dev\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v("/BTCPayServer\ndotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug --launch-profile Altcoins-HTTPS\n")])])]),t("p",[e._v("For tests")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug\n")])])]),t("h2",{attrs:{id:"https-support-for-local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#https-support-for-local-development"}},[e._v("#")]),e._v(" HTTPS support for local development")]),e._v(" "),t("p",[e._v("Some browser security features may require that you use "),t("strong",[e._v("HTTPS")]),e._v(" to be properly tested.")]),e._v(" "),t("p",[e._v("In this case, use "),t("code",[e._v("Bitcoin-HTTPS")]),e._v(" (or "),t("code",[e._v("Altcoin-HTTPS")]),e._v(") launch profile. This will create a self signed certificate for your development purpose.")]),e._v(" "),t("p",[e._v("However, your browser will not trust it, making it difficult to debug.")]),e._v(" "),t("p",[e._v("You can instruct your OS to trust this development time certificate by running:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet dev-certs https "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--trust")]),e._v("\n")])])]),t("h2",{attrs:{id:"videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videos"}},[e._v("#")]),e._v(" Videos")]),e._v(" "),t("p",[e._v("For more information check out these videos:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=ZePbMPSIvHM",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to contribute to BTCPay Server Development (Windows)"),t("OutboundLink")],1),e._v(" by Nicolas Dorier")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=j486T_Rk-yw",target:"_blank",rel:"noopener noreferrer"}},[e._v("Setting up BTCPayServer development environment on Linux (Ubuntu)"),t("OutboundLink")],1),e._v(" by RockStarDev")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=GWR_CcMsEV0",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Development - Testing pull request, payments (MacOS)"),t("OutboundLink")],1),e._v(" by Pavlenex")])]),e._v(" "),t("p",[e._v("and these notes:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to get started with development"),t("OutboundLink")],1),e._v(" by Nicolas Dorier (covering relevant docker commands, paying regtest invoices)")])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/130.9b8d0bda.js b/assets/js/130.80a4ce82.js similarity index 99% rename from assets/js/130.9b8d0bda.js rename to assets/js/130.80a4ce82.js index 983f61e5bb..7f1aac2cef 100644 --- a/assets/js/130.9b8d0bda.js +++ b/assets/js/130.80a4ce82.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[130],{816:function(e,t,s){"use strict";s.r(t);var a=s(17),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-development"}},[e._v("#")]),e._v(" Local development")]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("p",[e._v("For the "),t("strong",[e._v("development environment")]),e._v(" you need to install these tools:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/8.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET 8.0 SDK"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Docker: "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-windows/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Windows"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-mac/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mac OS"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),t("p",[e._v("To execute tests and run the project for debugging, you need to run a number of "),t("strong",[e._v("dependencies")]),e._v(".")]),e._v(" "),t("p",[e._v("We wrapped all our dependencies in a docker-compose file that you can use to bootstrap the development environment:\nThe file "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(" can be used to spin everything up:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/btcpayserver/btcpayserver.git\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver/BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" up dev\n")])])]),t("h2",{attrs:{id:"which-ide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#which-ide"}},[e._v("#")]),e._v(" Which IDE?")]),e._v(" "),t("p",[e._v("We recommend using Visual Studio 2022 (Windows Only) or Rider (cross platform). Visual Studio Code (cross platform) should also be possible, but isn't as straightforward to setup for a comfortable development environment.\nYou can of course use VIM if you are hardcore, .NET Core is easy to use via command-line.")]),e._v(" "),t("p",[e._v("Visual Studio Code, Visual Studio and Rider will run the launch profile "),t("code",[e._v("Bitcoin")]),e._v(".\nThis will run a "),t("strong",[e._v("BTCPay Server instance connecting to the services in your Docker service")]),e._v(", so you can easily debug and step through the code.")]),e._v(" "),t("h2",{attrs:{id:"build-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-configuration"}},[e._v("#")]),e._v(" Build configuration")]),e._v(" "),t("p",[e._v("A build configuration defines how to "),t("strong",[e._v("build BTCPay Server")]),e._v(". For example, whether to include some source files, whether to optimize for debugging or performance.")]),e._v(" "),t("p",[e._v("There are several build configurations:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Debug")])]),e._v(" "),t("li",[t("code",[e._v("Release")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Debug")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Release")])])]),e._v(" "),t("p",[e._v("How to use a different one during your local development depends on your IDE.\nBy default "),t("code",[e._v("Debug")]),e._v(" is used, this is a Bitcoin only build excluding any altcoin dependencies. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("You can select which build to use via the "),t("code",[e._v("-c")]),e._v(" switch in "),t("code",[e._v("dotnet")]),e._v(" command line. If you use command line and want to run a Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("h2",{attrs:{id:"launch-profiles"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#launch-profiles"}},[e._v("#")]),e._v(" Launch profiles")]),e._v(" "),t("p",[e._v("When you "),t("strong",[e._v("start BTCPay Server locally for local development")]),e._v(", it needs the right parameter so it can connect to the development time dependencies in the docker-compose file.")]),e._v(" "),t("p",[e._v("Those parameters are wrapped into the dotnet concept of "),t("code",[e._v("launch profile")]),e._v(".")]),e._v(" "),t("p",[e._v("The launch profiles are specified in the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/Properties/launchSettings.json",target:"_blank",rel:"noopener noreferrer"}},[e._v("launchSettings.json"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("There are currently three launch profiles:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Bitcoin")])]),e._v(" "),t("li",[t("code",[e._v("Bitcoin-HTTPS")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-HTTPS")])])]),e._v(" "),t("p",[e._v("By default, "),t("code",[e._v("Bitcoin")]),e._v(" is used. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("If you use command line, "),t("code",[e._v("dotnet run")]),e._v(" allows you to select the launch profile of your choice:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run --launch-profile Bitcoin\n")])])]),t("h2",{attrs:{id:"running-tests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#running-tests"}},[e._v("#")]),e._v(" Running tests")]),e._v(" "),t("p",[e._v("Running tests is functioning in the exact same way as running the development time BTCPay Server.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[e._v("The concept of "),t("code",[e._v("launch profile")]),e._v(" does not apply for tests, but the concept of build configuration does. For example, if I want to run tests on the Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("p",[e._v("The tests are already configured to use the development time dependencies in the docker-compose presented earlier.")]),e._v(" "),t("p",[e._v("You can use the "),t("code",[e._v("--f")]),e._v(" (filter) switch to run a specific test.")]),e._v(" "),t("p",[e._v("If you use an IDE, consult your IDE documentation to run tests or switch to different configurations.")]),e._v(" "),t("h2",{attrs:{id:"altcoin-support-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#altcoin-support-development"}},[e._v("#")]),e._v(" Altcoin support development")]),e._v(" "),t("p",[e._v("By default, your IDE or simple "),t("code",[e._v("dotnet run")]),e._v(" will use "),t("code",[e._v("Bitcoin")]),e._v(" launch profile on "),t("code",[e._v("Debug")]),e._v(" build.")]),e._v(" "),t("ul",[t("li",[e._v("This means that BTCPay Server will be hosted on a local HTTP port, building without altcoin support,")]),e._v(" "),t("li",[e._v("Run BTCPay Server to connect to Bitcoin only dependencies specified in "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p",[e._v("If you want to "),t("strong",[e._v("develop with altcoins support")]),e._v(" you need to use the "),t("code",[e._v("Altcoins-HTTPS")]),e._v(" launch profile, on the "),t("code",[e._v("Altcoins-Debug")]),e._v(" build, and run the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.altcoins.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.altcoins.yml"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If using command line:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" docker-compose.altcoins.yml up dev\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v("/BTCPayServer\ndotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug --launch-profile Altcoins-HTTPS\n")])])]),t("p",[e._v("For tests")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug\n")])])]),t("h2",{attrs:{id:"https-support-for-local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#https-support-for-local-development"}},[e._v("#")]),e._v(" HTTPS support for local development")]),e._v(" "),t("p",[e._v("Some browser security features may require that you use "),t("strong",[e._v("HTTPS")]),e._v(" to be properly tested.")]),e._v(" "),t("p",[e._v("In this case, use "),t("code",[e._v("Bitcoin-HTTPS")]),e._v(" (or "),t("code",[e._v("Altcoin-HTTPS")]),e._v(") launch profile. This will create a self signed certificate for your development purpose.")]),e._v(" "),t("p",[e._v("However, your browser will not trust it, making it difficult to debug.")]),e._v(" "),t("p",[e._v("You can instruct your OS to trust this development time certificate by running:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet dev-certs https "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--trust")]),e._v("\n")])])]),t("h2",{attrs:{id:"videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videos"}},[e._v("#")]),e._v(" Videos")]),e._v(" "),t("p",[e._v("For more information check out these videos:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=ZePbMPSIvHM",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to contribute to BTCPay Server Development (Windows)"),t("OutboundLink")],1),e._v(" by Nicolas Dorier")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=j486T_Rk-yw",target:"_blank",rel:"noopener noreferrer"}},[e._v("Setting up BTCPayServer development environment on Linux (Ubuntu)"),t("OutboundLink")],1),e._v(" by RockStarDev")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=GWR_CcMsEV0",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Development - Testing pull request, payments (MacOS)"),t("OutboundLink")],1),e._v(" by Pavlenex")])]),e._v(" "),t("p",[e._v("and these notes:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to get started with development"),t("OutboundLink")],1),e._v(" by Nicolas Dorier (covering relevant docker commands, paying regtest invoices)")])]),e._v(" "),t("h2",{attrs:{id:"how-to-manually-test-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-manually-test-payments"}},[e._v("#")]),e._v(" How to manually test payments")]),e._v(" "),t("h3",{attrs:{id:"using-the-test-bitcoin-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-bitcoin-cli"}},[e._v("#")]),e._v(" Using the test bitcoin-cli")]),e._v(" "),t("p",[e._v("You can call bitcoin-cli inside the container with "),t("code",[e._v("docker exec")]),e._v(".\nFor example, if you want to send "),t("code",[e._v("0.23111090")]),e._v(" to "),t("code",[e._v("mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[e._v("./docker-bitcoin-cli.sh sendtoaddress "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("0.23111090")]),e._v("\n")])])]),t("p",[e._v("If you are using Powershell:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-bitcoin-"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cli")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 sendtoaddress "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf"')]),e._v(" 0"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("23111090\n")])])]),t("p",[e._v("You can also generate blocks:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-bitcoin-generate"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 3\n")])])]),t("h3",{attrs:{id:"using-polar-to-test-lightning-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-polar-to-test-lightning-payments"}},[e._v("#")]),e._v(" Using Polar to test Lightning payments")]),e._v(" "),t("ul",[t("li",[e._v("Install and run "),t("a",{attrs:{href:"https://lightningpolar.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Polar"),t("OutboundLink")],1),e._v(". Setup a small network of nodes.")]),e._v(" "),t("li",[e._v("Go to your store's General Settings and enable Lightning.")]),e._v(" "),t("li",[e._v("Build your connection string using the Connect information in the Polar app.")])]),e._v(" "),t("p",[e._v('LND Connection string example:\ntype=lnd-rest;server=https://127.0.0.1:8084/;macaroonfilepath="local path to admin.macaroon on your computer, without these quotes";allowinsecure=true')]),e._v(" "),t("p",[e._v("Now you can create a Lightning invoice on BTCPay Server regtest and make a payment through Polar.")]),e._v(" "),t("p",[e._v('PLEASE NOTE: You may get an exception break in Visual Studio. You must quickly click "Continue" in VS so the invoice is generated.\nOr, uncheck the box that says, "Break when this exception type is thrown".')]),e._v(" "),t("h3",{attrs:{id:"using-the-test-litecoin-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-litecoin-cli"}},[e._v("#")]),e._v(" Using the test litecoin-cli")]),e._v(" "),t("p",[e._v("Same as bitcoin-cli, but with "),t("code",[e._v(".\\docker-litecoin-cli.ps1")]),e._v(" and "),t("code",[e._v(".\\docker-litecoin-cli.sh")]),e._v(" instead.")]),e._v(" "),t("h3",{attrs:{id:"using-the-test-lightning-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-lightning-cli"}},[e._v("#")]),e._v(" Using the test lightning-cli")]),e._v(" "),t("p",[e._v("If you are using Linux:")]),e._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[e._v("./docker-customer-lightning-cli.sh pay lnbcrt100u1pd2e6uspp5ajnadvhazjrz55twd5k6yeg9u87wpw0q2fdr7g960yl5asv5fmnqdq9d3hkccqpxmedyrk0ehw5ueqx5e0r4qrrv74cewddfcvsxaawqz7634cmjj39sqwy5tvhz0hasktkk6t9pqfdh3edmf3z09zst5y7khv3rvxh8ctqqw6mwhh\n")])])]),t("p",[e._v("If you are using Powershell:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-customer-lightning-"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cli")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 pay lnbcrt100u1pd2e6uspp5ajnadvhazjrz55twd5k6yeg9u87wpw0q2fdr7g960yl5asv5fmnqdq9d3hkccqpxmedyrk0ehw5ueqx5e0r4qrrv74cewddfcvsxaawqz7634cmjj39sqwy5tvhz0hasktkk6t9pqfdh3edmf3z09zst5y7khv3rvxh8ctqqw6mwhh\n")])])]),t("p",[e._v("If you get this message:")]),e._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"code"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("205")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"message"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Could not find a route"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"data"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"getroute_tries"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"sendpay_tries"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("Please, run the test "),t("code",[e._v("CanSetLightningServer")]),e._v(", this will establish a channel between the customer and the merchant, then, retry.")]),e._v(" "),t("p",[e._v("Alternatively you can run the "),t("code",[e._v("./docker-lightning-channel-setup.sh")]),e._v(" script to establish the channel connection.\nThe "),t("code",[e._v("./docker-lightning-channel-teardown.sh")]),e._v(" script closes any existing lightning channels.")]),e._v(" "),t("h3",{attrs:{id:"alternative-lightning-testing-using-polar-to-test-lightning-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#alternative-lightning-testing-using-polar-to-test-lightning-payments"}},[e._v("#")]),e._v(" Alternative Lightning testing: Using Polar to test Lightning payments")]),e._v(" "),t("ul",[t("li",[e._v("Install and run "),t("a",{attrs:{href:"https://lightningpolar.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Polar"),t("OutboundLink")],1),e._v(". Setup a small network of nodes.")]),e._v(" "),t("li",[e._v("Go to your store's General Settings and enable Lightning.")]),e._v(" "),t("li",[e._v("Build your connection string using the Connect information in the Polar app.")])]),e._v(" "),t("p",[e._v('LND Connection string example:\ntype=lnd-rest;server=https://127.0.0.1:8084/;macaroonfilepath="local path to admin.macaroon on your computer, without these quotes";allowinsecure=true')]),e._v(" "),t("p",[e._v("Now you can create a lightning invoice on BTCPay Server regtest and make a payment through Polar.")]),e._v(" "),t("p",[e._v('PLEASE NOTE: You may get an exception break in Visual Studio. You must quickly click "Continue" in VS so the invoice is generated.\nOr, uncheck the box that says, "Break when this exception type is thrown".')]),e._v(" "),t("h2",{attrs:{id:"faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),t("h3",{attrs:{id:"docker-compose-up-dev-failed-or-tests-are-not-passing-what-should-i-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#docker-compose-up-dev-failed-or-tests-are-not-passing-what-should-i-do"}},[e._v("#")]),e._v(" "),t("code",[e._v("docker-compose up dev")]),e._v(" failed or tests are not passing, what should I do?")]),e._v(" "),t("ol",[t("li",[e._v("Run "),t("code",[e._v("docker-compose down --volumes")]),e._v(" (this will reset your test environment)")]),e._v(" "),t("li",[e._v("Run "),t("code",[e._v("docker-compose pull")]),e._v(" (this will ensure you have the latest images)")]),e._v(" "),t("li",[e._v("Run again with "),t("code",[e._v("docker-compose up dev")])])]),e._v(" "),t("h3",{attrs:{id:"how-to-run-the-altcoin-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-altcoin-environment"}},[e._v("#")]),e._v(" How to run the Altcoin environment?")]),e._v(" "),t("p",[t("code",[e._v("docker-compose -f docker-compose.altcoins.yml up dev")])]),e._v(" "),t("p",[e._v("If you still have issues, try to restart docker.")]),e._v(" "),t("h3",{attrs:{id:"how-to-run-the-selenium-test-with-a-browser"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-selenium-test-with-a-browser"}},[e._v("#")]),e._v(" How to run the Selenium test with a browser?")]),e._v(" "),t("p",[e._v("Run "),t("code",[e._v("dotnet user-secrets set RunSeleniumInBrowser true")]),e._v(" to run tests in browser.")]),e._v(" "),t("p",[e._v("To switch back to headless mode (recommended) you can run "),t("code",[e._v("dotnet user-secrets remove RunSeleniumInBrowser")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"session-not-created-this-version-of-chromedriver-only-supports-chrome-version-88"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#session-not-created-this-version-of-chromedriver-only-supports-chrome-version-88"}},[e._v("#")]),e._v(" Session not created: This version of ChromeDriver only supports Chrome version 88")]),e._v(" "),t("p",[e._v("When you run tests for selenium, you may end up with this error.\nThis happen when we update the selenium packages on BTCPay Server while you did not update your chrome version.")]),e._v(" "),t("p",[e._v("If you want to use a older chrome driver on "),t("a",{attrs:{href:"https://chromedriver.chromium.org/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("this page"),t("OutboundLink")],1),e._v(" then point to it with")]),e._v(" "),t("p",[t("code",[e._v('dotnet user-secrets set ChromeDriverDirectory "path/to/the/driver/directory"')])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[130],{814:function(e,t,s){"use strict";s.r(t);var a=s(17),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-development"}},[e._v("#")]),e._v(" Local development")]),e._v(" "),t("h2",{attrs:{id:"prerequisites"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[e._v("#")]),e._v(" Prerequisites")]),e._v(" "),t("p",[e._v("For the "),t("strong",[e._v("development environment")]),e._v(" you need to install these tools:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/8.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET 8.0 SDK"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Docker: "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-windows/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Windows"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/docker-for-mac/install/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mac OS"),t("OutboundLink")],1),e._v(" | "),t("a",{attrs:{href:"https://docs.docker.com/install/linux/docker-ce/ubuntu/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Linux"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"dependencies"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dependencies"}},[e._v("#")]),e._v(" Dependencies")]),e._v(" "),t("p",[e._v("To execute tests and run the project for debugging, you need to run a number of "),t("strong",[e._v("dependencies")]),e._v(".")]),e._v(" "),t("p",[e._v("We wrapped all our dependencies in a docker-compose file that you can use to bootstrap the development environment:\nThe file "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(" can be used to spin everything up:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/btcpayserver/btcpayserver.git\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver/BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" up dev\n")])])]),t("h2",{attrs:{id:"which-ide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#which-ide"}},[e._v("#")]),e._v(" Which IDE?")]),e._v(" "),t("p",[e._v("We recommend using Visual Studio 2022 (Windows Only) or Rider (cross platform). Visual Studio Code (cross platform) should also be possible, but isn't as straightforward to setup for a comfortable development environment.\nYou can of course use VIM if you are hardcore, .NET Core is easy to use via command-line.")]),e._v(" "),t("p",[e._v("Visual Studio Code, Visual Studio and Rider will run the launch profile "),t("code",[e._v("Bitcoin")]),e._v(".\nThis will run a "),t("strong",[e._v("BTCPay Server instance connecting to the services in your Docker service")]),e._v(", so you can easily debug and step through the code.")]),e._v(" "),t("h2",{attrs:{id:"build-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-configuration"}},[e._v("#")]),e._v(" Build configuration")]),e._v(" "),t("p",[e._v("A build configuration defines how to "),t("strong",[e._v("build BTCPay Server")]),e._v(". For example, whether to include some source files, whether to optimize for debugging or performance.")]),e._v(" "),t("p",[e._v("There are several build configurations:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Debug")])]),e._v(" "),t("li",[t("code",[e._v("Release")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Debug")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-Release")])])]),e._v(" "),t("p",[e._v("How to use a different one during your local development depends on your IDE.\nBy default "),t("code",[e._v("Debug")]),e._v(" is used, this is a Bitcoin only build excluding any altcoin dependencies. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("You can select which build to use via the "),t("code",[e._v("-c")]),e._v(" switch in "),t("code",[e._v("dotnet")]),e._v(" command line. If you use command line and want to run a Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("h2",{attrs:{id:"launch-profiles"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#launch-profiles"}},[e._v("#")]),e._v(" Launch profiles")]),e._v(" "),t("p",[e._v("When you "),t("strong",[e._v("start BTCPay Server locally for local development")]),e._v(", it needs the right parameter so it can connect to the development time dependencies in the docker-compose file.")]),e._v(" "),t("p",[e._v("Those parameters are wrapped into the dotnet concept of "),t("code",[e._v("launch profile")]),e._v(".")]),e._v(" "),t("p",[e._v("The launch profiles are specified in the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/Properties/launchSettings.json",target:"_blank",rel:"noopener noreferrer"}},[e._v("launchSettings.json"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("There are currently three launch profiles:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("Bitcoin")])]),e._v(" "),t("li",[t("code",[e._v("Bitcoin-HTTPS")])]),e._v(" "),t("li",[t("code",[e._v("Altcoins-HTTPS")])])]),e._v(" "),t("p",[e._v("By default, "),t("code",[e._v("Bitcoin")]),e._v(" is used. How to use a different one during your local development depends on your IDE.")]),e._v(" "),t("p",[e._v("If you use command line, "),t("code",[e._v("dotnet run")]),e._v(" allows you to select the launch profile of your choice:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run --launch-profile Bitcoin\n")])])]),t("h2",{attrs:{id:"running-tests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#running-tests"}},[e._v("#")]),e._v(" Running tests")]),e._v(" "),t("p",[e._v("Running tests is functioning in the exact same way as running the development time BTCPay Server.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[e._v("The concept of "),t("code",[e._v("launch profile")]),e._v(" does not apply for tests, but the concept of build configuration does. For example, if I want to run tests on the Release build:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release\n")])])]),t("p",[e._v("The tests are already configured to use the development time dependencies in the docker-compose presented earlier.")]),e._v(" "),t("p",[e._v("You can use the "),t("code",[e._v("--f")]),e._v(" (filter) switch to run a specific test.")]),e._v(" "),t("p",[e._v("If you use an IDE, consult your IDE documentation to run tests or switch to different configurations.")]),e._v(" "),t("h2",{attrs:{id:"altcoin-support-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#altcoin-support-development"}},[e._v("#")]),e._v(" Altcoin support development")]),e._v(" "),t("p",[e._v("By default, your IDE or simple "),t("code",[e._v("dotnet run")]),e._v(" will use "),t("code",[e._v("Bitcoin")]),e._v(" launch profile on "),t("code",[e._v("Debug")]),e._v(" build.")]),e._v(" "),t("ul",[t("li",[e._v("This means that BTCPay Server will be hosted on a local HTTP port, building without altcoin support,")]),e._v(" "),t("li",[e._v("Run BTCPay Server to connect to Bitcoin only dependencies specified in "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.yml"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p",[e._v("If you want to "),t("strong",[e._v("develop with altcoins support")]),e._v(" you need to use the "),t("code",[e._v("Altcoins-HTTPS")]),e._v(" launch profile, on the "),t("code",[e._v("Altcoins-Debug")]),e._v(" build, and run the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/docker-compose.altcoins.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Tests/docker-compose.altcoins.yml"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If using command line:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker-compose")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" docker-compose.altcoins.yml up dev\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v("/BTCPayServer\ndotnet run "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug --launch-profile Altcoins-HTTPS\n")])])]),t("p",[e._v("For tests")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Altcoins-Debug\n")])])]),t("h2",{attrs:{id:"https-support-for-local-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#https-support-for-local-development"}},[e._v("#")]),e._v(" HTTPS support for local development")]),e._v(" "),t("p",[e._v("Some browser security features may require that you use "),t("strong",[e._v("HTTPS")]),e._v(" to be properly tested.")]),e._v(" "),t("p",[e._v("In this case, use "),t("code",[e._v("Bitcoin-HTTPS")]),e._v(" (or "),t("code",[e._v("Altcoin-HTTPS")]),e._v(") launch profile. This will create a self signed certificate for your development purpose.")]),e._v(" "),t("p",[e._v("However, your browser will not trust it, making it difficult to debug.")]),e._v(" "),t("p",[e._v("You can instruct your OS to trust this development time certificate by running:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet dev-certs https "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--trust")]),e._v("\n")])])]),t("h2",{attrs:{id:"videos"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#videos"}},[e._v("#")]),e._v(" Videos")]),e._v(" "),t("p",[e._v("For more information check out these videos:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=ZePbMPSIvHM",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to contribute to BTCPay Server Development (Windows)"),t("OutboundLink")],1),e._v(" by Nicolas Dorier")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=j486T_Rk-yw",target:"_blank",rel:"noopener noreferrer"}},[e._v("Setting up BTCPayServer development environment on Linux (Ubuntu)"),t("OutboundLink")],1),e._v(" by RockStarDev")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://youtube.com/watch?v=GWR_CcMsEV0",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Development - Testing pull request, payments (MacOS)"),t("OutboundLink")],1),e._v(" by Pavlenex")])]),e._v(" "),t("p",[e._v("and these notes:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("How to get started with development"),t("OutboundLink")],1),e._v(" by Nicolas Dorier (covering relevant docker commands, paying regtest invoices)")])]),e._v(" "),t("h2",{attrs:{id:"how-to-manually-test-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-manually-test-payments"}},[e._v("#")]),e._v(" How to manually test payments")]),e._v(" "),t("h3",{attrs:{id:"using-the-test-bitcoin-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-bitcoin-cli"}},[e._v("#")]),e._v(" Using the test bitcoin-cli")]),e._v(" "),t("p",[e._v("You can call bitcoin-cli inside the container with "),t("code",[e._v("docker exec")]),e._v(".\nFor example, if you want to send "),t("code",[e._v("0.23111090")]),e._v(" to "),t("code",[e._v("mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[e._v("./docker-bitcoin-cli.sh sendtoaddress "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("0.23111090")]),e._v("\n")])])]),t("p",[e._v("If you are using Powershell:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-bitcoin-"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cli")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 sendtoaddress "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf"')]),e._v(" 0"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("23111090\n")])])]),t("p",[e._v("You can also generate blocks:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-bitcoin-generate"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 3\n")])])]),t("h3",{attrs:{id:"using-polar-to-test-lightning-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-polar-to-test-lightning-payments"}},[e._v("#")]),e._v(" Using Polar to test Lightning payments")]),e._v(" "),t("ul",[t("li",[e._v("Install and run "),t("a",{attrs:{href:"https://lightningpolar.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Polar"),t("OutboundLink")],1),e._v(". Setup a small network of nodes.")]),e._v(" "),t("li",[e._v("Go to your store's General Settings and enable Lightning.")]),e._v(" "),t("li",[e._v("Build your connection string using the Connect information in the Polar app.")])]),e._v(" "),t("p",[e._v('LND Connection string example:\ntype=lnd-rest;server=https://127.0.0.1:8084/;macaroonfilepath="local path to admin.macaroon on your computer, without these quotes";allowinsecure=true')]),e._v(" "),t("p",[e._v("Now you can create a Lightning invoice on BTCPay Server regtest and make a payment through Polar.")]),e._v(" "),t("p",[e._v('PLEASE NOTE: You may get an exception break in Visual Studio. You must quickly click "Continue" in VS so the invoice is generated.\nOr, uncheck the box that says, "Break when this exception type is thrown".')]),e._v(" "),t("h3",{attrs:{id:"using-the-test-litecoin-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-litecoin-cli"}},[e._v("#")]),e._v(" Using the test litecoin-cli")]),e._v(" "),t("p",[e._v("Same as bitcoin-cli, but with "),t("code",[e._v(".\\docker-litecoin-cli.ps1")]),e._v(" and "),t("code",[e._v(".\\docker-litecoin-cli.sh")]),e._v(" instead.")]),e._v(" "),t("h3",{attrs:{id:"using-the-test-lightning-cli"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-lightning-cli"}},[e._v("#")]),e._v(" Using the test lightning-cli")]),e._v(" "),t("p",[e._v("If you are using Linux:")]),e._v(" "),t("div",{staticClass:"language-sh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-sh"}},[t("code",[e._v("./docker-customer-lightning-cli.sh pay lnbcrt100u1pd2e6uspp5ajnadvhazjrz55twd5k6yeg9u87wpw0q2fdr7g960yl5asv5fmnqdq9d3hkccqpxmedyrk0ehw5ueqx5e0r4qrrv74cewddfcvsxaawqz7634cmjj39sqwy5tvhz0hasktkk6t9pqfdh3edmf3z09zst5y7khv3rvxh8ctqqw6mwhh\n")])])]),t("p",[e._v("If you are using Powershell:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-customer-lightning-"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cli")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 pay lnbcrt100u1pd2e6uspp5ajnadvhazjrz55twd5k6yeg9u87wpw0q2fdr7g960yl5asv5fmnqdq9d3hkccqpxmedyrk0ehw5ueqx5e0r4qrrv74cewddfcvsxaawqz7634cmjj39sqwy5tvhz0hasktkk6t9pqfdh3edmf3z09zst5y7khv3rvxh8ctqqw6mwhh\n")])])]),t("p",[e._v("If you get this message:")]),e._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"code"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("205")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"message"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Could not find a route"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"data"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"getroute_tries"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"sendpay_tries"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("Please, run the test "),t("code",[e._v("CanSetLightningServer")]),e._v(", this will establish a channel between the customer and the merchant, then, retry.")]),e._v(" "),t("p",[e._v("Alternatively you can run the "),t("code",[e._v("./docker-lightning-channel-setup.sh")]),e._v(" script to establish the channel connection.\nThe "),t("code",[e._v("./docker-lightning-channel-teardown.sh")]),e._v(" script closes any existing lightning channels.")]),e._v(" "),t("h3",{attrs:{id:"alternative-lightning-testing-using-polar-to-test-lightning-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#alternative-lightning-testing-using-polar-to-test-lightning-payments"}},[e._v("#")]),e._v(" Alternative Lightning testing: Using Polar to test Lightning payments")]),e._v(" "),t("ul",[t("li",[e._v("Install and run "),t("a",{attrs:{href:"https://lightningpolar.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Polar"),t("OutboundLink")],1),e._v(". Setup a small network of nodes.")]),e._v(" "),t("li",[e._v("Go to your store's General Settings and enable Lightning.")]),e._v(" "),t("li",[e._v("Build your connection string using the Connect information in the Polar app.")])]),e._v(" "),t("p",[e._v('LND Connection string example:\ntype=lnd-rest;server=https://127.0.0.1:8084/;macaroonfilepath="local path to admin.macaroon on your computer, without these quotes";allowinsecure=true')]),e._v(" "),t("p",[e._v("Now you can create a lightning invoice on BTCPay Server regtest and make a payment through Polar.")]),e._v(" "),t("p",[e._v('PLEASE NOTE: You may get an exception break in Visual Studio. You must quickly click "Continue" in VS so the invoice is generated.\nOr, uncheck the box that says, "Break when this exception type is thrown".')]),e._v(" "),t("h2",{attrs:{id:"faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),t("h3",{attrs:{id:"docker-compose-up-dev-failed-or-tests-are-not-passing-what-should-i-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#docker-compose-up-dev-failed-or-tests-are-not-passing-what-should-i-do"}},[e._v("#")]),e._v(" "),t("code",[e._v("docker-compose up dev")]),e._v(" failed or tests are not passing, what should I do?")]),e._v(" "),t("ol",[t("li",[e._v("Run "),t("code",[e._v("docker-compose down --volumes")]),e._v(" (this will reset your test environment)")]),e._v(" "),t("li",[e._v("Run "),t("code",[e._v("docker-compose pull")]),e._v(" (this will ensure you have the latest images)")]),e._v(" "),t("li",[e._v("Run again with "),t("code",[e._v("docker-compose up dev")])])]),e._v(" "),t("h3",{attrs:{id:"how-to-run-the-altcoin-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-altcoin-environment"}},[e._v("#")]),e._v(" How to run the Altcoin environment?")]),e._v(" "),t("p",[t("code",[e._v("docker-compose -f docker-compose.altcoins.yml up dev")])]),e._v(" "),t("p",[e._v("If you still have issues, try to restart docker.")]),e._v(" "),t("h3",{attrs:{id:"how-to-run-the-selenium-test-with-a-browser"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-selenium-test-with-a-browser"}},[e._v("#")]),e._v(" How to run the Selenium test with a browser?")]),e._v(" "),t("p",[e._v("Run "),t("code",[e._v("dotnet user-secrets set RunSeleniumInBrowser true")]),e._v(" to run tests in browser.")]),e._v(" "),t("p",[e._v("To switch back to headless mode (recommended) you can run "),t("code",[e._v("dotnet user-secrets remove RunSeleniumInBrowser")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"session-not-created-this-version-of-chromedriver-only-supports-chrome-version-88"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#session-not-created-this-version-of-chromedriver-only-supports-chrome-version-88"}},[e._v("#")]),e._v(" Session not created: This version of ChromeDriver only supports Chrome version 88")]),e._v(" "),t("p",[e._v("When you run tests for selenium, you may end up with this error.\nThis happen when we update the selenium packages on BTCPay Server while you did not update your chrome version.")]),e._v(" "),t("p",[e._v("If you want to use a older chrome driver on "),t("a",{attrs:{href:"https://chromedriver.chromium.org/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("this page"),t("OutboundLink")],1),e._v(" then point to it with")]),e._v(" "),t("p",[t("code",[e._v('dotnet user-secrets set ChromeDriverDirectory "path/to/the/driver/directory"')])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/131.9d54c0b2.js b/assets/js/131.cb32887f.js similarity index 98% rename from assets/js/131.9d54c0b2.js rename to assets/js/131.cb32887f.js index 4ac5483f28..855b50f0b7 100644 --- a/assets/js/131.9d54c0b2.js +++ b/assets/js/131.cb32887f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[131],{819:function(e,t,r){"use strict";r.r(t);var o=r(17),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"testnet-demo"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#testnet-demo"}},[e._v("#")]),e._v(" Testnet demo")]),e._v(" "),t("p",[e._v("First let's create a new store:")]),e._v(" "),t("ol",[t("li",[e._v("Go to the "),t("a",{attrs:{href:"https://testnet.demo.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Testnet website"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("On the right side click on "),t("strong",[e._v("Create an account")]),e._v(" to "),t("a",{attrs:{href:"https://testnet.demo.btcpayserver.org/register",target:"_blank",rel:"noopener noreferrer"}},[e._v("create an account"),t("OutboundLink")],1),e._v(" or "),t("strong",[e._v("Sign In")]),e._v(" if you already have an account.")]),e._v(" "),t("li",[e._v("After having signed in, create a new store.")])]),e._v(" "),t("p",[e._v("Let's use Electrum to create a testnet wallet for your store:")]),e._v(" "),t("ol",[t("li",[e._v("Download "),t("a",{attrs:{href:"https://electrum.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Run Electrum with parameter "),t("code",[e._v("--testnet")]),e._v(" (i.e. on Mac OS using "),t("code",[e._v("open -a Electrum.app --args --testnet")]),e._v(")")]),e._v(" "),t("li",[e._v("Click through the wizard and create a test wallet, using the default settings Electrum proposes")]),e._v(" "),t("li",[e._v('After the wallet is set up, go to "Wallet" > "Information" in the Electrum menu.')]),e._v(" "),t("li",[e._v('Copy the "Master Public Key" string (starting by '),t("code",[e._v("*pub...")]),e._v(")")])]),e._v(" "),t("p",[e._v("Let's configure the store so it uses your Electrum wallet:")]),e._v(" "),t("ol",[t("li",[e._v("Go to the Settings page of your store in BTCPay")]),e._v(" "),t("li",[e._v('On the "General Settings" page you will find the "Wallet" section - click the "Setup" button for configuring an on-chain wallet.')]),e._v(" "),t("li",[e._v('Paste the "Master Public Key" copied from Electrum into the "Derivation Scheme" text field and click "Continue"')]),e._v(" "),t("li",[e._v('Confirm the addresses by clicking on "Receive" in Electrum: The "Receiving address" should match the first address shown in BTCPay')]),e._v(" "),t("li",[e._v("After that your test wallet should appear on the "),t("a",{attrs:{href:"https://testnet.demo.btcpayserver.org/wallets",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wallets page"),t("OutboundLink")],1),e._v(" of your BTCPay account")])]),e._v(" "),t("p",[e._v("Then you can create an invoice, either through")]),e._v(" "),t("ul",[t("li",[e._v('The "Invoice" menu on the website or')]),e._v(" "),t("li",[e._v("The process documented in the "),t("RouterLink",{attrs:{to:"/CustomIntegration/"}},[e._v("Custom integration")])],1)]),e._v(" "),t("h2",{attrs:{id:"questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#questions"}},[e._v("#")]),e._v(" Questions")]),e._v(" "),t("p",[e._v("If you have questions about the BTCPay Server on Testnet, you can join the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("community chat"),t("OutboundLink")],1),e._v(".\nIf you have questions about any of the other tools or commands, etc. it's likely you can find answers to your questions by doing a search on the internet or on "),t("a",{attrs:{href:"https://stackoverflow.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("StackOverflow"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[131],{828:function(e,t,r){"use strict";r.r(t);var o=r(17),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"testnet-demo"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#testnet-demo"}},[e._v("#")]),e._v(" Testnet demo")]),e._v(" "),t("p",[e._v("First let's create a new store:")]),e._v(" "),t("ol",[t("li",[e._v("Go to the "),t("a",{attrs:{href:"https://testnet.demo.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Testnet website"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("On the right side click on "),t("strong",[e._v("Create an account")]),e._v(" to "),t("a",{attrs:{href:"https://testnet.demo.btcpayserver.org/register",target:"_blank",rel:"noopener noreferrer"}},[e._v("create an account"),t("OutboundLink")],1),e._v(" or "),t("strong",[e._v("Sign In")]),e._v(" if you already have an account.")]),e._v(" "),t("li",[e._v("After having signed in, create a new store.")])]),e._v(" "),t("p",[e._v("Let's use Electrum to create a testnet wallet for your store:")]),e._v(" "),t("ol",[t("li",[e._v("Download "),t("a",{attrs:{href:"https://electrum.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Run Electrum with parameter "),t("code",[e._v("--testnet")]),e._v(" (i.e. on Mac OS using "),t("code",[e._v("open -a Electrum.app --args --testnet")]),e._v(")")]),e._v(" "),t("li",[e._v("Click through the wizard and create a test wallet, using the default settings Electrum proposes")]),e._v(" "),t("li",[e._v('After the wallet is set up, go to "Wallet" > "Information" in the Electrum menu.')]),e._v(" "),t("li",[e._v('Copy the "Master Public Key" string (starting by '),t("code",[e._v("*pub...")]),e._v(")")])]),e._v(" "),t("p",[e._v("Let's configure the store so it uses your Electrum wallet:")]),e._v(" "),t("ol",[t("li",[e._v("Go to the Settings page of your store in BTCPay")]),e._v(" "),t("li",[e._v('On the "General Settings" page you will find the "Wallet" section - click the "Setup" button for configuring an on-chain wallet.')]),e._v(" "),t("li",[e._v('Paste the "Master Public Key" copied from Electrum into the "Derivation Scheme" text field and click "Continue"')]),e._v(" "),t("li",[e._v('Confirm the addresses by clicking on "Receive" in Electrum: The "Receiving address" should match the first address shown in BTCPay')]),e._v(" "),t("li",[e._v("After that your test wallet should appear on the "),t("a",{attrs:{href:"https://testnet.demo.btcpayserver.org/wallets",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wallets page"),t("OutboundLink")],1),e._v(" of your BTCPay account")])]),e._v(" "),t("p",[e._v("Then you can create an invoice, either through")]),e._v(" "),t("ul",[t("li",[e._v('The "Invoice" menu on the website or')]),e._v(" "),t("li",[e._v("The process documented in the "),t("RouterLink",{attrs:{to:"/CustomIntegration/"}},[e._v("Custom integration")])],1)]),e._v(" "),t("h2",{attrs:{id:"questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#questions"}},[e._v("#")]),e._v(" Questions")]),e._v(" "),t("p",[e._v("If you have questions about the BTCPay Server on Testnet, you can join the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("community chat"),t("OutboundLink")],1),e._v(".\nIf you have questions about any of the other tools or commands, etc. it's likely you can find answers to your questions by doing a search on the internet or on "),t("a",{attrs:{href:"https://stackoverflow.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("StackOverflow"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/132.d008d5cb.js b/assets/js/132.973f8d99.js similarity index 99% rename from assets/js/132.d008d5cb.js rename to assets/js/132.973f8d99.js index ebb99253bc..b0e71ab467 100644 --- a/assets/js/132.d008d5cb.js +++ b/assets/js/132.973f8d99.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[132],{822:function(e,t,r){"use strict";r.r(t);var a=r(17),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("While "),t("RouterLink",{attrs:{to:"/LunaNodeWebDeployment/"}},[e._v("our instructions")]),e._v(" cover how to install BTCPayServer in one click on Azure or Lunanode, BTCPay Server is not limited to those options.")],1),e._v(" "),t("p",[e._v("You will find below information about how you can install BTCPay Server easily in any environment having docker available.")]),e._v(" "),t("h1",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[e._v("#")]),e._v(" Architecture")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/btcpayserver/btcpayserver-doc/raw/master/docs/img/Architecture.png",alt:"Architecture",title:"Architecture"}})]),e._v(" "),t("p",[e._v("As you can see, BTCPay depends on several pieces of infrastructure, mainly:")]),e._v(" "),t("ul",[t("li",[e._v("A lightweight block explorer (NBXplorer),")]),e._v(" "),t("li",[e._v("A database (PostgreSQL),")]),e._v(" "),t("li",[e._v("A full node (eg. Bitcoin Core)")])]),e._v(" "),t("p",[e._v("There can be more dependencies if you support more than just standard Bitcoin transactions, including:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/ElementsProject/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("Core Lightning (CLN)"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/litecoin-project/litecoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("LitecoinD"),t("OutboundLink")],1),e._v(" and other coin daemons")]),e._v(" "),t("li",[e._v("And more...")])]),e._v(" "),t("p",[e._v("Note: The setup process can be time consuming, but is heavily automated to make it a fun and easy experience.")]),e._v(" "),t("p",[e._v("Take a look at how BTCPay works in a video below.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/nr0UNbz3AoQ/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=nr0UNbz3AoQ",title:"YouTube","data-id":"nr0UNbz3AoQ"}},[t("iframe",{attrs:{title:"YouTube","data-src":"https://www.youtube-nocookie.com/embed/nr0UNbz3AoQ?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("p",[e._v("Here is a presentation of the global architecture at Advancing Bitcoin conference.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Up0dvorzSNM/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Up0dvorzSNM",title:"BTCPay - Architecture overview","data-id":"Up0dvorzSNM"}},[t("iframe",{attrs:{title:"BTCPay - Architecture overview","data-src":"https://www.youtube-nocookie.com/embed/Up0dvorzSNM?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h1",{attrs:{id:"full-installation-for-technical-users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#full-installation-for-technical-users"}},[e._v("#")]),e._v(" Full installation (for technical users)")]),e._v(" "),t("p",[e._v("You can also install BTCPay Server on your own machine or VPS instance.")]),e._v(" "),t("p",[e._v("The officially supported setup is driven by Docker (and Docker-Compose).")]),e._v(" "),t("p",[e._v("First, make sure you have a domain name pointing to your host "),t("code",[e._v("A record")]),e._v(", with ports "),t("code",[e._v("443")]),e._v(" and "),t("code",[e._v("80")]),e._v(" externally accessible. For Lightning Network, port "),t("code",[e._v("9735")]),e._v(" is required ("),t("code",[e._v("9736")]),e._v(" if you use Litecoin Lightning). Otherwise, you will have to set a domain manually by running "),t("code",[e._v("changedomain.sh")]),e._v(".")]),e._v(" "),t("p",[e._v("Let's assume your domain is "),t("code",[e._v("btcpay.EXAMPLE.com")]),e._v(".")]),e._v(" "),t("p",[e._v("The setup below assumes you want to support Bitcoin, Core Lightning (CLN), HTTPS automatically configured by Nginx. It also enables node pruning, which you can "),t("a",{attrs:{href:"#generated-docker-compose"}},[e._v("modify")]),e._v(" or ignore if you have enough disk space for a full node. Finally, your domain is "),t("code",[e._v("btcpay.EXAMPLE.com")]),e._v(" should reflect your actual domain name.")]),e._v(" "),t("p",[t("a",{attrs:{href:"#environment-variables"}},[e._v("Environment variables")]),e._v(" can be tailored to your needs. Some variables require additional storage space.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Login as root")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Create a folder for BTCPay")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkdir")]),e._v(" BTCPayServer\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Clone this repository")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/btcpayserver/btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run btcpay-setup.sh with the right parameters")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btcpay.EXAMPLE.com"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("NBITCOIN_NETWORK")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mainnet"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-save-storage-s"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_ENABLE_SSH")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("true\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exit")]),e._v("\n")])])]),t("p",[t("code",[e._v("btcpay-setup.sh")]),e._v(" will then:")]),e._v(" "),t("ul",[t("li",[e._v("Install Docker")]),e._v(" "),t("li",[e._v("Install Docker-Compose")]),e._v(" "),t("li",[e._v("Make sure BTCPay starts at reboot via upstart or systemd")]),e._v(" "),t("li",[e._v("Setup environment variables to use BTCPay utilities")]),e._v(" "),t("li",[e._v("Add BTCPay utilities in /usr/bin")]),e._v(" "),t("li",[e._v("Start BTCPay Server")])]),e._v(" "),t("p",[e._v("Video below guides you step by step on how to set up BTCPay Server on a VPS with Docker.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/x6hqTFgHqhA/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=x6hqTFgHqhA",title:"YouTube","data-id":"x6hqTFgHqhA"}},[t("iframe",{attrs:{title:"YouTube","data-src":"https://www.youtube-nocookie.com/embed/x6hqTFgHqhA?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("p",[e._v("Check out this video if you're interested in learning more about setting up "),t("a",{attrs:{href:"https://www.youtube.com/playlist?list=PLH4m2oS2ratfaprAFx9E3ZDjwxNKvCk4e",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay with Docker Compose"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("figure",[t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btcpayserver/",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/docker/automated/btcpayserver/btcpayserver.svg",alt:"Docker automated build",title:"Docker automated build"}}),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"environment-variables"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environment-variables"}},[e._v("#")]),e._v(" Environment variables")]),e._v(" "),t("p",[t("code",[e._v("btcpay-setup.sh")]),e._v(" will use the following environment variables:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("BTCPAY_HOST")]),e._v(": The hostname of your website (eg. "),t("code",[e._v("btcpay.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAY_ADDITIONAL_HOSTS")]),e._v(": Optional, specify additional domains to your BTCPayServer with https support if enabled. (eg. example2.com,example3.com)")]),e._v(" "),t("li",[t("code",[e._v("REVERSEPROXY_HTTP_PORT")]),e._v(": The public port the reverse proxy binds to for HTTP traffic (default: 80)")]),e._v(" "),t("li",[t("code",[e._v("REVERSEPROXY_HTTPS_PORT")]),e._v(": The public port the reverse proxy binds to for HTTPS traffic (default: 443)")]),e._v(" "),t("li",[t("code",[e._v("REVERSEPROXY_DEFAULT_HOST")]),e._v(": Optional, if using a reverse proxy nginx, specify which website should be presented if the server is accessed by its IP or by an unrecognized domain name.")]),e._v(" "),t("li",[t("code",[e._v("NOREVERSEPROXY_HTTP_PORT")]),e._v(": Optional, if not using a reverse proxy, specify which port should be opened for HTTP traffic. (default: 80)")]),e._v(" "),t("li",[t("code",[e._v("NBITCOIN_NETWORK")]),e._v(": The type of network to use (eg. "),t("code",[e._v("mainnet")]),e._v(", "),t("code",[e._v("testnet")]),e._v(", or "),t("code",[e._v("regtest")]),e._v(". Default: "),t("code",[e._v("mainnet")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("LIGHTNING_ALIAS")]),e._v(": An alias for your lightning network node, if used")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_CRYPTO1")]),e._v(": First supported crypto currency (eg. "),t("code",[e._v("btc")]),e._v(", "),t("code",[e._v("ltc")]),e._v(". Default: "),t("code",[e._v("btc")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_CRYPTO2")]),e._v(": Second supported crypto currency (eg. "),t("code",[e._v("btc")]),e._v(", "),t("code",[e._v("ltc")]),e._v(". Default: "),t("code",[e._v("(empty)")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_CRYPTON")]),e._v(": N'th supported crypto currency where N is 9 at maximum. (eg. "),t("code",[e._v("btc")]),e._v(", "),t("code",[e._v("ltc")]),e._v(". Default: "),t("code",[e._v("(empty)")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_REVERSEPROXY")]),e._v(": Specify reverse proxy to use; NGinx has HTTPS support. (eg. "),t("code",[e._v("nginx")]),e._v(", "),t("code",[e._v("traefik")]),e._v(", "),t("code",[e._v("(empty)")]),e._v(". Default: "),t("code",[e._v("nginx")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_LIGHTNING")]),e._v(": Lightning network implementation to use (eg. "),t("code",[e._v("clightning")]),e._v(", "),t("code",[e._v("lnd")]),e._v(", Default: "),t("code",[e._v("(empty)")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_SUBNAME")]),e._v(": The subname of the generated docker-compose file, where the full name is "),t("code",[e._v("Generated/docker-compose.SUBNAME.yml")]),e._v(" (Default: "),t("code",[e._v("generated")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(": Semicolon-separated list of additional fragments you want to use (eg. "),t("code",[e._v("opt-save-storage")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("LETSENCRYPT_EMAIL")]),e._v(": An email will be sent to this address if certificate expires and fails to renew automatically (eg. "),t("code",[e._v("me@example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("ACME_CA_URI")]),e._v(": The API endpoint to ask for HTTPS certificate (Default: "),t("code",[e._v("production")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAY_ENABLE_SSH")]),e._v(": Optional, gives BTCPay Server SSH access to the host by allowing it to edit authorized_keys of the host, it can be used for managing the authorized_keys or updating BTCPay Server directly through the website. (Default: false)")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_DOCKER_IMAGE")]),e._v(": Optional, Specify which generator image to use if you have customized the C# generator. Set to "),t("code",[e._v("btcpayserver/docker-compose-generator:local")]),e._v(" to build the generator locally at runtime.")]),e._v(" "),t("li",[t("code",[e._v("BTCPAY_IMAGE")]),e._v(": Optional, Specify which btcpayserver image to use if you have a customized btcpayserver.")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_EXCLUDE_FRAGMENTS")]),e._v(": Semicolon-separated list of fragments you want to forcefully exclude (eg. "),t("code",[e._v("litecoin-clightning")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("TOR_RELAY_NICKNAME")]),e._v(": If tor relay is activated with opt-add-tor-relay, the relay nickname")]),e._v(" "),t("li",[t("code",[e._v("TOR_RELAY_EMAIL")]),e._v(": If tor relay is activated with opt-add-tor-relay, the email for Tor to contact you regarding your relay")])]),e._v(" "),t("p",[e._v("Additionally, there are specific environment variables for some addons:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("LIBREPATRON_HOST")]),e._v(": If libre patron is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-librepatron.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-librepatron"),t("OutboundLink")],1),e._v(", the hostname of your libre patron website (eg. "),t("code",[e._v("librepatron.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("ZAMMAD_HOST")]),e._v(": If zammad is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-zammad.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-zammad"),t("OutboundLink")],1),e._v(", the hostname of your zammad website (eg. "),t("code",[e._v("zammad.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("WOOCOMMERCE_HOST")]),e._v(": If woocommerce is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-woocommerce.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-woocommerce"),t("OutboundLink")],1),e._v(", the hostname of your woocommerce website (eg. "),t("code",[e._v("store.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("EPS_XPUB")]),e._v(": If Electrum Personal Server (EPS) is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrum-ps.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-ps"),t("OutboundLink")],1),e._v(", you must set the Extended Public Key (XPUB, YPUB or ZPUB) of the wallet you want to use, before first run of the EPS server. If you accidentally start EPS without this, it will not work properly as the model of EPS is to monitor only specified wallets.")]),e._v(" "),t("li",[e._v("If Bitcoin Wallet Tracker is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-bwt.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-bwt"),t("OutboundLink")],1),e._v(", you can use "),t("code",[e._v("BWT_XPUB")]),e._v("/"),t("code",[e._v("BWT_XPUB_*")]),e._v(" (to set your XPUB/YPUB/ZPUB), "),t("code",[e._v("BWT_DESCRIPTOR")]),e._v("/"),t("code",[e._v("BWT_DESCRIPTOR_*")]),e._v(" (for script descriptors), "),t("code",[e._v("BWT_RESCAN_SINCE")]),e._v(" (set to the wallet creation date in YYYY-MM-DD to speed up the rescan), "),t("code",[e._v("BWT_BITCOIND_WALLET")]),e._v(" and "),t("code",[e._v("BWT_GAP_LIMIT")]),e._v(".")]),e._v(" "),t("li",[t("code",[e._v("LND_WTCLIENT_SWEEP_FEE")]),e._v(": If LND watchtower is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-wtclient.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-wtclient"),t("OutboundLink")],1),e._v(", you can use "),t("code",[e._v("LND_WTCLIENT_SWEEP_FEE")]),e._v(" to change the sweep fee used in constructing the justice transaction (default is 10 sat/byte)")]),e._v(" "),t("li",[t("code",[e._v("FIREFLY_HOST")]),e._v(": If fireflyiii is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-fireflyiii.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-fireflyiii"),t("OutboundLink")],1),e._v(", the hostname of your fireflyiii website (eg. "),t("code",[e._v("firefly.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("CLOUDFLARE_TUNNEL_TOKEN")]),e._v(": Used to expose your instance to clearnet with a Cloudflare Argo Tunnel (if cloudflare tunnel is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-cloudflared.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-cloudflared"),t("OutboundLink")],1),e._v(", for setup instructions "),t("RouterLink",{attrs:{to:"/Docker/cloudflare-tunnel/"}},[e._v("see documentation")]),e._v(")")],1)]),e._v(" "),t("h1",{attrs:{id:"tooling"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tooling"}},[e._v("#")]),e._v(" Tooling")]),e._v(" "),t("p",[e._v("A wide variety of useful scripts are available once BTCPay is installed:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("bitcoin-cli.sh")]),e._v(": Access your Bitcoin node instance (for RPC)")]),e._v(" "),t("li",[t("code",[e._v("bitcoin-lightning-cli.sh")]),e._v(": Access your CLN node instance (for RPC)")]),e._v(" "),t("li",[t("code",[e._v("changedomain.sh")]),e._v(": Change the domain of your BTCPayServer (remember to disable 2FA/U2F first, as you risk being unable to log in to your account)")]),e._v(" "),t("li",[t("code",[e._v("btcpay-update.sh")]),e._v(": Update BTCPayServer to the latest version")]),e._v(" "),t("li",[t("code",[e._v("btcpay-up.sh")]),e._v(": Run "),t("code",[e._v("docker-compose up")])]),e._v(" "),t("li",[t("code",[e._v("btcpay-down.sh")]),e._v(": Run "),t("code",[e._v("docker-compose down")])]),e._v(" "),t("li",[t("code",[e._v("btcpay-setup.sh")]),e._v(": Change the settings of your server")]),e._v(" "),t("li",[t("code",[e._v("btcpay-clean.sh")]),e._v(": Purge any unused docker images")]),e._v(" "),t("li",[t("code",[e._v(". ./btcpay-setup.sh")]),e._v(": Information about additional parameters")]),e._v(" "),t("li",[t("code",[e._v(". ./btcpay-setup.sh -i")]),e._v(": Set up your BTCPayServer")]),e._v(" "),t("li",[t("code",[e._v("btcpay-restart.sh")]),e._v(": Restart your BTCPayServer")])]),e._v(" "),t("h1",{attrs:{id:"under-the-hood"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#under-the-hood"}},[e._v("#")]),e._v(" Under the hood")]),e._v(" "),t("h2",{attrs:{id:"generated-docker-compose"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generated-docker-compose"}},[e._v("#")]),e._v(" Generated docker-compose")]),e._v(" "),t("p",[e._v("When you run "),t("code",[e._v("btcpay-setup.sh")]),e._v(", your environment variables are used by "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/build.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("build.sh"),t("OutboundLink")],1),e._v(" (or "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/build.ps1",target:"_blank",rel:"noopener noreferrer"}},[e._v("build.ps1"),t("OutboundLink")],1),e._v(") to generate a docker-compose adapted for your needs. For the full list of options, see: "),t("a",{attrs:{href:"#environment-variables"}},[e._v("Environment variables")])]),e._v(" "),t("p",[e._v("By default, the generated file is "),t("code",[e._v("Generated/docker-compose.generated.yml")]),e._v(", constructed from the relevant "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments",target:"_blank",rel:"noopener noreferrer"}},[e._v("Docker fragments"),t("OutboundLink")],1),e._v(" for your setup.")]),e._v(" "),t("p",[e._v("Available "),t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(" currently are:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage"),t("OutboundLink")],1),e._v(" will keep around 1 year of blocks (prune BTC for 100 GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage-s.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage-s"),t("OutboundLink")],1),e._v(" will keep around 6 months of blocks (prune BTC for 50 GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage-xs"),t("OutboundLink")],1),e._v(" will keep around 3 months of blocks (prune BTC for 25 GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage-xxs"),t("OutboundLink")],1),e._v(" will keep around 2 weeks of blocks (prune BTC for 5 GB) (lightning not supported)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-autocompact.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-autocompact"),t("OutboundLink")],1),e._v(" will activate auto compacting of LND database.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-autopilot.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-autopilot"),t("OutboundLink")],1),e._v(" will activate auto pilot on LND. (5 channels, 60% of allocation)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-keysend.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-keysend"),t("OutboundLink")],1),e._v(" will activate keysend on LND.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-wtclient.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-wtclient"),t("OutboundLink")],1),e._v(" will activate the watchtower client on LND. "),t("code",[e._v("LND_WTCLIENT_SWEEP_FEE")]),e._v(" can be used to override the default 10 sat/byte justice transaction fee")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-watchtower.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-watchtower"),t("OutboundLink")],1),e._v(" will activate the LND watchtower RPC")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-memory.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-memory"),t("OutboundLink")],1),e._v(" will decrease the default dbcache at the expense of longer synchronization time. (Useful if your machine is less than 2GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-more-memory.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-more-memory"),t("OutboundLink")],1),e._v(" will increase the default dbcache to make synchronization faster (Useful if your machine is has around 4GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-btcqbo.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-btcqbo"),t("OutboundLink")],1),e._v(" will allow you to create an invoice on Quickbooks which include a way for your customer to pay on BTCPay Server (More information on this "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr/btcqbo/",target:"_blank",rel:"noopener noreferrer"}},[e._v("github repository"),t("OutboundLink")],1),e._v(", this add-on is maintained by "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr",target:"_blank",rel:"noopener noreferrer"}},[e._v("JeffVandrewJr"),t("OutboundLink")],1),e._v(", see more on "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=srgwL9ozg6c",target:"_blank",rel:"noopener noreferrer"}},[e._v("this video"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-librepatron.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-librepatron"),t("OutboundLink")],1),e._v(", for a self-hosted Patreon alternative backed by BTCPay (More information on this "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron",target:"_blank",rel:"noopener noreferrer"}},[e._v("github repository"),t("OutboundLink")],1),e._v(", this add-on is maintained by "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr",target:"_blank",rel:"noopener noreferrer"}},[e._v("JeffVandrewJr"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-woocommerce.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-woocommerce"),t("OutboundLink")],1),e._v(", for a self-hosted woocommerce with BTCPay Server plugin pre installed.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-tor.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-tor"),t("OutboundLink")],1),e._v(", for exposing BTCPayServer, Woocommerce, your lightning nodes as hidden services and accept onion peers for your full node. Warning: This options is for working around NAT and firewall problems as well as to help protect your customer's privacy. This will not protect your privacy against a targeted attack against you.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-btctransmuter.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-btctransmuter"),t("OutboundLink")],1),e._v(", for a self-hosted IFTTT style service for crypto services such as fiat settlement. (More information on this "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/",target:"_blank",rel:"noopener noreferrer"}},[e._v("github repository"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-txindex.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-txindex"),t("OutboundLink")],1),e._v(", to enable txindex=1 in bitcoin.conf if you require txindexing for Bisq, DOJO, etc.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-expose-unsafe.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-expose-unsafe"),t("OutboundLink")],1),e._v(", to unsafely expose bitcoind P2P port 8333 if you require P2P for Bisq, DOJO, Esplora, etc. WARNING: ONLY USE ON TRUSTED LAN OR WITH FIREWALL RULES WHITELISTING SPECIFIC HOSTS")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-tor-relay.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-tor-relay"),t("OutboundLink")],1),e._v(", for a non-exit tor relay. Make sure to have port 9001 accessible externally. "),t("a",{attrs:{href:"https://community.torproject.org/relay/community-resources/eff-tor-legal-faq",target:"_blank",rel:"noopener noreferrer"}},[e._v("Please read the legal implications of running a tor relay"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://trac.torproject.org/projects/tor/wiki/TorRelayGuide#RelayRequirements",target:"_blank",rel:"noopener noreferrer"}},[e._v("what resources are used to operate the relay"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrumx.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrumx"),t("OutboundLink")],1),e._v(", to integrate a full ElectrumX server (from official source) with BTCPay, using the BTCPay server's full bitcoin node for complete privacy when using your own Electrum wallet. You can also open port 50002 up to the internet on your router etc, to be part of the ElectrumX network, helping other Electrum wallet users to get connected. The bitcoin option "),t("code",[e._v("-txindex")]),e._v(" is mandatory for ElectrumX, and this fragment will enable it on your BTCPay server automatically - No need to use the fragment opt-txindex.yml.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrum-ps.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-ps"),t("OutboundLink")],1),e._v(", to integrate Electrum Personal Server (EPS) with BTCPay (EPS is a single-user alternative to the ElectrumX Server option above). EPS will also use the BTCPay server's full bitcoin node for complete privacy when using your own Electrum wallet, for your own personal use (i.e. other users cannot use your server to verify transactions). Also, the bitcoin option "),t("code",[e._v("-txindex")]),e._v(" is NOT mandatory for EPS, and it will run on a pruned node (unlike ElectrumX). You will need to add your XPUB/YPUB/ZPUB as environment variable "),t("code",[e._v("EPS_XPUB")]),e._v(" before enabling EPS for the first time (see above section on environment variables, and see "),t("RouterLink",{attrs:{to:"/ElectrumPersonalServer/"}},[e._v("full documentation")]),e._v(" for details).")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-bwt.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-bwt"),t("OutboundLink")],1),e._v(", to integrate the "),t("a",{attrs:{href:"https://github.com/bwt-dev/bwt",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Wallet Tracker"),t("OutboundLink")],1),e._v(" Electrum server, which uses a personal wallet index model similar to that of EPS. You will need to set "),t("code",[e._v("BWT_XPUB")]),e._v(" with your XPUB/YPUB/ZPUB (see environment variables section). The server will only be available locally and through an onion service.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-configurator.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-configurator"),t("OutboundLink")],1),e._v(", to integrate the "),t("a",{attrs:{href:"https://install.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Configurator"),t("OutboundLink")],1),e._v(" to manage your BTCPay deployment through a UI, and to allow new deployments elsewhere easily.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-pihole.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-pihole"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/pihole/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-ndlc.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-ndlc"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/ndlc/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-lightning-terminal.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-lightning-terminal"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning Terminal/LiT"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-mempool.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-mempool"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/mempool/mempool",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mempool"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-sphinxrelay.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-sphinxrelay"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/stakwork/sphinx-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sphinx Relay"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-tallycoin-connect.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-tallycoin-connect"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tallycoin Connect"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-thunderhub.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-thunderhub"),t("OutboundLink")],1),e._v(" for a LND Lightning Node Manager in your Browser. Maintained by "),t("a",{attrs:{href:"https://github.com/apotdevin",target:"_blank",rel:"noopener noreferrer"}},[e._v("apotdevin"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-teos.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-teos"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/talaia-labs/python-teos",target:"_blank",rel:"noopener noreferrer"}},[e._v("The Eye Of Satoshi"),t("OutboundLink")],1),e._v(", a BOLT13 Lightning Watchtower. Use port 9814 on your server or Tor to connect.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-chatwoot.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-chatwoot"),t("OutboundLink")],1),e._v(" for open source chat support system. ("),t("RouterLink",{attrs:{to:"/Docker/chatwoot/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-zammad.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-zammad"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://zammad.com/features",target:"_blank",rel:"noopener noreferrer"}},[e._v("Zammad"),t("OutboundLink")],1),e._v(", a web based open source helpdesk/customer support system with many features to manage customer communication via several channels like telephone, facebook, twitter, chat and e-mails")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-monero-expose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-monero-expose"),t("OutboundLink")],1),e._v(" to expose monero node's RPC port at 127.0.0.1:18081 to connect your own wallet. Use f.e. ssh port forwarding to forward to your own computer.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-fireflyiii.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-fireflyiii"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/fireflyiii/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-joinmarket.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-joinmarket"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/joinmarket/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-helipad.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-helipad"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/Podcastindex-org/helipad",target:"_blank",rel:"noopener noreferrer"}},[e._v("Podcastindex.org Helipad"),t("OutboundLink")],1),e._v(". Requires LND.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-nostr-relay.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-nostr-relay"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/kukks/Nnostr",target:"_blank",rel:"noopener noreferrer"}},[e._v("Nostr Relay"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-cloudflared.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-cloudflared"),t("OutboundLink")],1),e._v(" to expose your local server on clearnet painlessly ("),t("RouterLink",{attrs:{to:"/Docker/cloudflare-tunnel/"}},[e._v("see documentation")]),e._v(").")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-torq.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-torq"),t("OutboundLink")],1),e._v(" to install "),t("a",{attrs:{href:"https://github.com/lncapital/torq",target:"_blank",rel:"noopener noreferrer"}},[e._v("Torq"),t("OutboundLink")],1),e._v(" node management application. Requires LND.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-snapdrop.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-snapdrop"),t("OutboundLink")],1),e._v(" to install "),t("a",{attrs:{href:"https://snapdrop.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Snapdrop"),t("OutboundLink")],1),e._v(". You can then browse to "),t("code",[e._v("/snapdrop")]),e._v(" of your server to access it.")])]),e._v(" "),t("p",[e._v("You can also create your own "),t("a",{attrs:{href:"#how-can-i-customize-the-generated-docker-compose-file"}},[e._v("custom fragments")]),e._v(".")]),e._v(" "),t("p",[e._v("If you want to add an option to "),t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(" and re-configure your install:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-lnd-autopilot"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("For example, if you want "),t("code",[e._v("btc")]),e._v(" and "),t("code",[e._v("ltc")]),e._v(" support with "),t("code",[e._v("nginx")]),e._v(" and "),t("code",[e._v("clightning")]),e._v(" inside "),t("code",[e._v("Generated/docker-compose.custom.yml")]),e._v(":")]),e._v(" "),t("p",[e._v("Note: The first run might take a while, but following runs are instantaneous.")]),e._v(" "),t("p",[e._v("On Windows (run in "),t("a",{attrs:{href:"https://docs.microsoft.com/en-us/powershell/scripting/windows-powershell/starting-windows-powershell",target:"_blank",rel:"noopener noreferrer"}},[e._v("powershell"),t("OutboundLink")],1),e._v("):")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("Invoke-Command")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_CRYPTO1")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_CRYPTO2")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ltc"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_REVERSEPROXY")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_LIGHTNING")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_SUBNAME")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"custom"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\build"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("On Linux:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO2")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ltc"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_SUBNAME")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"custom"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n./build.sh\n")])])]),t("p",[e._v("Next, you will need to configure the runtime environment variables for "),t("code",[e._v("Generated/docker-compose.custom.yml")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("If you are using NGinx, "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/Production/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("read this"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("If you are not using NGinx, "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/Production-NoReverseProxy/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("read this instead"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("h2",{attrs:{id:"again-what-does-btcpay-setupsh-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#again-what-does-btcpay-setupsh-do"}},[e._v("#")]),e._v(" Again, what does "),t("code",[e._v("btcpay-setup.sh")]),e._v(" do?")]),e._v(" "),t("p",[t("code",[e._v("btcpay-setup.sh")]),e._v(" is a utility which does the following:")]),e._v(" "),t("ol",[t("li",[e._v("Makes sure docker and docker-compose are installed on your system")]),e._v(" "),t("li",[e._v("Generates a docker-compose via "),t("code",[e._v("./build.sh")])]),e._v(" "),t("li",[e._v("Sets up an "),t("a",{attrs:{href:"https://docs.docker.com/compose/env-file/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Environment File"),t("OutboundLink")],1),e._v(" to configure your docker-compose")]),e._v(" "),t("li",[e._v("Sets up environment variables so the tools described in "),t("a",{attrs:{href:"#tooling"}},[e._v("Tooling")]),e._v(" can work")]),e._v(" "),t("li",[e._v("Adds symlinks of those tools into "),t("code",[e._v("/usr/bin")])]),e._v(" "),t("li",[e._v("Makes sure BTCPay restarts on reboot via upstart or systemd")]),e._v(" "),t("li",[e._v("Starts BTCPay via docker-compose")])]),e._v(" "),t("h2",{attrs:{id:"overview-of-files-generated-by-btcpay-setupsh"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview-of-files-generated-by-btcpay-setupsh"}},[e._v("#")]),e._v(" Overview of files generated by "),t("code",[e._v("btcpay-setup.sh")])]),e._v(" "),t("p",[t("code",[e._v("/etc/profile.d/btcpay-env.sh")]),e._v(" ensures that your environment variables are correctly setup when you login, so you can use the tools:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_OLD_PREGEN")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"false"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO2")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO3")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO4")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO5")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO6")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO7")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO8")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO9")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_DOCKER_COMPOSE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/var/lib/waagent/custom-script/download/0/btcpayserver-docker/Production/docker-compose.generated.yml"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_BASE_DIRECTORY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/var/lib/waagent/custom-script/download/0"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_ENV_FILE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/var/lib/waagent/custom-script/download/0/.env"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST_SSHKEYFILE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/root/.ssh/id_rsa_btcpay"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_ENV_FILE")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&>")]),e._v(" /dev/null"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("then")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-v")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'^#'")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_ENV_FILE")]),e._v('"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("xargs")]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("fi")]),e._v("\n")])])]),t("p",[t("code",[e._v("/etc/systemd/system/btcpayserver.service")]),e._v(" ensures that you can control btcpay via "),t("code",[e._v("systemctl")]),e._v(", and that BTCPayServer starts on reboot:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token section"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token section-name selector"}},[e._v("Unit")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("Description")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("BTCPayServer service")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("After")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("docker.service network-online.target")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("Requires")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("docker.service network-online.target")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token section"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token section-name selector"}},[e._v("Service")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("oneshot")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("RemainAfterExit")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("yes")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ExecStart")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"$BTCPAY_BASE_DIRECTORY/btcpayserver-docker\" && . helpers.sh && btcpay_up'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ExecStop")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"$BTCPAY_BASE_DIRECTORY/btcpayserver-docker\" && . helpers.sh && btcpay_down'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ExecReload")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"$BTCPAY_BASE_DIRECTORY/btcpayserver-docker\" && . helpers.sh && btcpay_restart'")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token section"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token section-name selector"}},[e._v("Install")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("WantedBy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("multi-user.target")]),e._v("\n")])])]),t("p",[t("code",[e._v(".env")]),e._v(" ("),t("code",[e._v("$BTCPAY_ENV_FILE")]),e._v(") contains environment variables passed to the containers managed by your docker-compose:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("btcpay.EXAMPLE.com")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ACME_CA_URI")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("production")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("NBITCOIN_NETWORK")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("mainnet")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("LETSENCRYPT_EMAIL")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("me@EXAMPLE.com")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("BTCPAY_SSHTRUSTEDFINGERPRINTS")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("SHA256:eSCD7NtQ/Q6IBl2iRB9caAQ3lDZd8s8iUL6SdeNnhpA")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("BTCPAY_SSHKEYFILE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/datadir/id_rsa")]),e._v("\n")])])]),t("h1",{attrs:{id:"how-can-i-add-an-altcoin-to-btcpayserver"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-add-an-altcoin-to-btcpayserver"}},[e._v("#")]),e._v(" How can I add an altcoin to BTCPayServer?")]),e._v(" "),t("ol",[t("li",[e._v("Add support for your crypto to "),t("a",{attrs:{href:"https://github.com/MetacoSA/NBitcoin/tree/master/NBitcoin.Altcoins",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBitcoin"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBxplorer"),t("OutboundLink")],1),e._v(", and "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer"),t("OutboundLink")],1),e._v(". (Use examples from other coins)")]),e._v(" "),t("li",[e._v("Create your own docker image ("),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/docker-bitcoin/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Create a docker-compose fragment ("),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/bitcoin.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Add your "),t("code",[e._v("CryptoDefinition")]),e._v(" ("),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/src/CryptoDefinition.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v(")")])]),e._v(" "),t("p",[t("code",[e._v("build.sh")]),e._v(" is using a pre-built image of the "),t("code",[e._v("docker-compose generator")]),e._v(" on "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-compose-generator/",target:"_blank",rel:"noopener noreferrer"}},[e._v("docker hub"),t("OutboundLink")],1),e._v(".\nIf you modify the code source of "),t("code",[e._v("docker-compose generator")]),e._v(" (for example, the "),t("code",[e._v("CryptoDefinition")]),e._v(" "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/src/CryptoDefinition.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v("), you need to configure "),t("code",[e._v("build.sh")]),e._v(" to use your own image by setting the environment variable "),t("code",[e._v("BTCPAYGEN_DOCKER_IMAGE")]),e._v(" to "),t("code",[e._v("btcpayserver/docker-compose-generator:local")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" docker-compose-generator\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_DOCKER_IMAGE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btcpayserver/docker-compose-generator:local"')]),e._v("\n")])])]),t("p",[e._v("Or on powershell:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[e._v("cd docker-compose-generator\n"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_DOCKER_IMAGE")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btcpayserver/docker-compose-generator:local"')]),e._v("\n")])])]),t("p",[e._v("Then run "),t("code",[e._v("./build.sh")]),e._v(" or "),t("code",[e._v(". .\\build.ps1")]),e._v(".\nThis will generate your docker-compose in the "),t("code",[e._v("Generated")]),e._v(" folder, which you can then run and test.")]),e._v(" "),t("p",[e._v("Note that BTCPayServer developers will not spend excessive time testing your image, so make sure it works.")]),e._v(" "),t("h1",{attrs:{id:"support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[e._v("#")]),e._v(" Support")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Image")]),e._v(" "),t("th",[e._v("Version")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("x64")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("arm32v7")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("arm64v8")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("links")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("btcpayserver/docker-compose-generator")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-docker/dcg-latest/docker-compose-generator/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-docker/dcg-latest/docker-compose-generator/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-docker/dcg-latest/docker-compose-generator/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-compose-generator",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/lightning")]),e._v(" "),t("td",[e._v("v24.05")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lightning/basedon-v24.05/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lightning/basedon-v24.05/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lightning/basedon-v24.05/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("shahanafarooqui/rtl")]),e._v(" "),t("td",[e._v("v0.15.4")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/RTL/v0.15.4/dockerfiles/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/RTL/v0.15.4/dockerfiles/Dockerfile.arm32v7",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/RTL/v0.15.4/dockerfiles/Dockerfile.arm64v8",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Ride-The-Lightning/RTL",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/shahanafarooqui/rtl",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/lnd")]),e._v(" "),t("td",[e._v("v0.18.3-beta")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lnd/basedon-v0.18.3-beta/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lnd/basedon-v0.18.3-beta/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lnd/basedon-v0.18.3-beta/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/bitcoin")]),e._v(" "),t("td",[e._v("26.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Bitcoin/26.0/Bitcoin/26.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Bitcoin/26.0/Bitcoin/26.0/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Bitcoin/26.0/Bitcoin/26.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/btcpayserver")]),e._v(" "),t("td",[e._v("1.13.7$?")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver/v1.13.7/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver/v1.13.7/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver/v1.13.7/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/monero")]),e._v(" "),t("td",[e._v("0.18.3.4")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Monero/0.18.3.4/Monero/0.18.3.4/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Monero/0.18.3.4/Monero/0.18.3.4/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Monero/0.18.3.4/Monero/0.18.3.4/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/monero",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("nicolasdorier/nbxplorer")]),e._v(" "),t("td",[e._v("2.5.14")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/nbxplorer/v2.5.14/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/nbxplorer/v2.5.14/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/nbxplorer/v2.5.14/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/dgarage/nbxplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/nbxplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/letsencrypt-nginx-proxy-companion")]),e._v(" "),t("td",[e._v("2.2.9-2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion/v2.2.9-2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion/v2.2.9-2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion/v2.2.9-2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/letsencrypt-nginx-proxy-companion",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("nginx")]),e._v(" "),t("td",[e._v("1.25.3-bookworm")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/nginxinc/docker-nginx/1.23.2/stable/debian/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/nginxinc/docker-nginx/1.23.2/stable/debian/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/nginxinc/docker-nginx/1.23.2/stable/debian/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/nginxinc/docker-nginx",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/nginx",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/docker-gen")]),e._v(" "),t("td",[e._v("0.10.7")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-gen/0.10.7/Dockerfile.alpine",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-gen/0.10.7/Dockerfile.alpine",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-gen/0.10.7/Dockerfile.alpine",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/docker-gen",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-gen",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/btctransmuter")]),e._v(" "),t("td",[e._v("0.0.59")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btctransmuter/v0.0.59/Dockerfiles/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btctransmuter/v0.0.59/Dockerfiles/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btctransmuter/v0.0.59/Dockerfiles/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btctransmuter",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btctransmuter",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/cloudflared")]),e._v(" "),t("td",[e._v("2023.10.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Cloudflared/2023.10.0/Cloudflared/2023.10.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Cloudflared/2023.10.0/Cloudflared/2023.10.0/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Cloudflared/2023.10.0/Cloudflared/2023.10.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/cloudflared",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/btcpayserver-configurator")]),e._v(" "),t("td",[e._v("0.0.21")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-configurator/v0.0.21/Dockerfiles/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-configurator/v0.0.21/Dockerfiles/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-configurator/v0.0.21/Dockerfiles/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-configurator",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btcpayserver-configurator",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/eps")]),e._v(" "),t("td",[e._v("0.2.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/EPS/0.2.2/EPS/0.2.2/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/EPS/0.2.2/EPS/0.2.2/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/EPS/0.2.2/EPS/0.2.2/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/eps",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/joinmarket")]),e._v(" "),t("td",[e._v("0.9.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/JoinMarket/0.9.10/JoinMarket/0.9.10/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/JoinMarket/0.9.10/JoinMarket/0.9.10/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/JoinMarket/0.9.10/JoinMarket/0.9.10/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/joinmarket",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("nicolasdorier/ndlc-cli")]),e._v(" "),t("td",[e._v("1.0.1")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/ndlc/releases/1.0.1/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/ndlc/releases/1.0.1/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/ndlc/releases/1.0.1/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/dgarage/ndlc",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/ndlc-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("pihole/pihole")]),e._v(" "),t("td",[e._v("2023.05.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/pi-hole/docker-pi-hole/2023.05.2/src/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/pi-hole/docker-pi-hole/2023.05.2/src/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/pi-hole/docker-pi-hole/2023.05.2/src/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/pi-hole/docker-pi-hole",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/pihole/pihole",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/snapdrop")]),e._v(" "),t("td",[e._v("1.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Snapdrop/1.2/Snapdrop/1.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Snapdrop/1.2/Snapdrop/1.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Snapdrop/1.2/Snapdrop/1.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/snapdrop",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/tor")]),e._v(" "),t("td",[e._v("0.4.8.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Tor/0.4.8.10/Tor/0.4.8.10/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Tor/0.4.8.10/Tor/0.4.8.10/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Tor/0.4.8.10/Tor/0.4.8.10/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/tor",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/woocommerce")]),e._v(" "),t("td",[e._v("3.1.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/WooCommerce/3.1.0/WooCommerce/3.1.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/WooCommerce/3.1.0/WooCommerce/3.1.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/woocommerce",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/postgres")]),e._v(" "),t("td",[e._v("13.13")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Postgres/13.13/Postgres/13.13/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Postgres/13.13/Postgres/13.13/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Postgres/13.13/Postgres/13.13/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/postgres",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("kamigawabul/btglnd")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/vutov/lnd/master/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/vutov/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/kamigawabul/btglnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("kamigawabul/docker-bitcoingold")]),e._v(" "),t("td",[e._v("0.15.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Vutov/docker-bitcoin/master/bitcoingold/0.15.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Vutov/docker-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/kamigawabul/docker-bitcoingold",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("acinq/eclair")]),e._v(" "),t("td",[e._v("release-0.7.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ACINQ/eclair/v0.7.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ACINQ/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/acinq/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chekaz/docker-bitcoinplus")]),e._v(" "),t("td",[e._v("2.7.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ChekaZ/docker/master/bitcoinplus/2.7.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ChekaZ/docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chekaz/docker-bitcoinplus",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("dalijolijo/docker-bitcore")]),e._v(" "),t("td",[e._v("0.90.9.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dalijolijo/btcpayserver-docker-bitcore/master/docker-bitcored/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/dalijolijo/btcpayserver-docker-bitcore",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/dalijolijo/docker-bitcore",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/dash")]),e._v(" "),t("td",[e._v("20.1.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Dash/20.1.0/Dash/20.1.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Dash/20.1.0/Dash/20.1.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/dash",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/dogecoin")]),e._v(" "),t("td",[e._v("1.14.7")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Dogecoin/1.14.7/Dogecoin/1.14.7/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/dogecoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chekaz/docker-feathercoin")]),e._v(" "),t("td",[e._v("0.16.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ChekaZ/docker/master/feathercoin/0.16.3/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ChekaZ/docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chekaz/docker-feathercoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/lightning")]),e._v(" "),t("td",[e._v("v23.05")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/lightning/v23.05/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/groestlcoin-lightning-charge")]),e._v(" "),t("td",[e._v("version-0.4.22")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/groestlcoin-lightning-charge/v0.4.22/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/groestlcoin-lightning-charge",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/groestlcoin-lightning-charge",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/groestlcoin-spark")]),e._v(" "),t("td",[e._v("version-0.2.16")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/groestlcoin-spark/v0.2.16/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/groestlcoin-spark",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/groestlcoin-spark",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/eclair")]),e._v(" "),t("td",[e._v("v0.6.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/eclair/v0.6.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/lnd")]),e._v(" "),t("td",[e._v("v0.10.0-grs")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/lnd/v0.10.0-grs/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/groestlcoin")]),e._v(" "),t("td",[e._v("25.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Groestlcoin/25.0/Groestlcoin/25.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Groestlcoin/25.0/Groestlcoin/25.0/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Groestlcoin/25.0/Groestlcoin/25.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/groestlcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/elements")]),e._v(" "),t("td",[e._v("23.2.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Elements/23.2.3/Elements/23.2.3/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Elements/23.2.3/Elements/23.2.3/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Elements/23.2.3/Elements/23.2.3/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/elements",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/litecoin")]),e._v(" "),t("td",[e._v("0.21.2.1-2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Litecoin/0.21.2.1-2/Litecoin/0.21.2.1/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Litecoin/0.21.2.1-2/Litecoin/0.21.2.1/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Litecoin/0.21.2.1-2/Litecoin/0.21.2.1/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/litecoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("wakiyamap/docker-monacoin")]),e._v(" "),t("td",[e._v("0.20.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/wakiyamap/docker-bitcoin/master/monacoin/0.20.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/wakiyamap/docker-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/wakiyamap/docker-monacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("redis")]),e._v(" "),t("td",[e._v("6.2.2-buster")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/docker-library/redis/f1a8498333ae3ab340b5b39fbac1d7e1dc0d628c/5.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/docker-library/redis",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/redis",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("jvandrew/btcqbo")]),e._v(" "),t("td",[e._v("0.3.36")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/JeffVandrewJr/btcqbo/v0.3.36/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/JeffVandrewJr/btcqbo",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/jvandrew/btcqbo",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("shesek/bwt")]),e._v(" "),t("td",[e._v("0.2.2-electrum")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/bwt-dev/bwt/v0.2.2/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/bwt-dev/bwt/v0.2.2/docker/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/bwt-dev/bwt/v0.2.2/docker/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/bwt-dev/bwt",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/shesek/bwt",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chatwoot/chatwoot")]),e._v(" "),t("td",[e._v("v1.7.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/chatwoot/chatwoot/v1.7.0/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/chatwoot/chatwoot/v1.7.0/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/chatwoot/chatwoot/v1.7.0/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/chatwoot/chatwoot",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chatwoot/chatwoot",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("lukechilds/electrumx")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lukechilds/docker-electrumx/master/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/lukechilds/docker-electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/lukechilds/electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("fireflyiii/core")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/66fb773b-063e-42d7-b6a5-e7729a22e8b3/_apis/git/repositories/e9c3dcf8-4533-4ef1-83cc-75527cab3377/items?path=%2FDockerfile&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/66fb773b-063e-42d7-b6a5-e7729a22e8b3/_apis/git/repositories/e9c3dcf8-4533-4ef1-83cc-75527cab3377/items?path=%2FDockerfile&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/66fb773b-063e-42d7-b6a5-e7729a22e8b3/_apis/git/repositories/e9c3dcf8-4533-4ef1-83cc-75527cab3377/items?path=%2FDockerfile&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/_git/MainImage",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/fireflyiii/core",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("podcastindexorg/podcasting20-helipad")]),e._v(" "),t("td",[e._v("v0.1.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Podcastindex-org/helipad/v0.1.10/umbrel/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Podcastindex-org/helipad/v0.1.10/umbrel/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Podcastindex-org/helipad/v0.1.10/umbrel/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Podcastindex-org/helipad",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/podcastindexorg/podcasting20-helipad",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("jvandrew/librepatron")]),e._v(" "),t("td",[e._v("0.7.39")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/JeffVandrewJr/patron/v0.7.39/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/jvandrew/librepatron",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("jvandrew/isso")]),e._v(" "),t("td",[e._v("atron.22")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/JeffVandrewJr/isso/patron.22/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/JeffVandrewJr/isso",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/jvandrew/isso",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("lightninglabs/lightning-terminal")]),e._v(" "),t("td",[e._v("v0.12.3-alpha-path-prefix")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lightninglabs/lightning-terminal/v0.12.3-alpha/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lightninglabs/lightning-terminal/v0.12.3-alpha/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("mempool/frontend")]),e._v(" "),t("td",[e._v("v2.5.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/frontend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/frontend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/frontend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/mempool/mempool",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/mempool/frontend",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("mempool/backend")]),e._v(" "),t("td",[e._v("v2.5.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/backend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/backend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/backend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/mempool/mempool",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/mempool/backend",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("mariadb")]),e._v(" "),t("td",[e._v("10.11")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/docker-library/mariadb/master/10.11/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/docker-library/mariadb",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/mariadb",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("kukks/nnostr-relay")]),e._v(" "),t("td",[e._v("v0.0.23")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/kukks/nnostr/Relay/v0.0.23/Relay/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/kukks/nnostr/Relay/v0.0.23/Relay/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/kukks/nnostr/Relay/v0.0.23/Relay/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/kukks/nnostr",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/kukks/nnostr-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("sphinxlightning/sphinx-relay")]),e._v(" "),t("td",[e._v("v2.2.9")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/stakwork/sphinx-relay/v2.2.9/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/stakwork/sphinx-relay/v2.2.9/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/stakwork/sphinx-relay/v2.2.9/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/stakwork/sphinx-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/sphinxlightning/sphinx-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("djbooth007/tallycoin_connect")]),e._v(" "),t("td",[e._v("v1.8.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/djbooth007/tallycoin_connect/v1.8.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/djbooth007/tallycoin_connect/v1.8.0/Dockerfile.arm32v7",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/djbooth007/tallycoin_connect/v1.8.0/Dockerfile.arm64v8",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("benjaminchodroff/rust-teos")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/benjaminchodroff/rust-teos/master/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/benjaminchodroff/rust-teos",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/benjaminchodroff/rust-teos",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("apotdevin/thunderhub")]),e._v(" "),t("td",[e._v("base-v0.13.31")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/apotdevin/thunderhub/v0.13.31/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/apotdevin/thunderhub/v0.13.31/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/apotdevin/thunderhub/v0.13.31/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/apotdevin/thunderhub",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/apotdevin/thunderhub",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("lncapital/torq")]),e._v(" "),t("td",[e._v("0.20.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lncapital/torq/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lncapital/torq/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lncapital/torq/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/lncapital/torq",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/lncapital/torq",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("timescale/timescaledb")]),e._v(" "),t("td",[e._v("latest-pg14")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/timescale/timescaledb-docker/main/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/timescale/timescaledb-docker/main/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/timescale/timescaledb-docker/main/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/timescale/timescaledb-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/timescale/timescaledb",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("zammad/zammad-docker-compose")]),e._v(" "),t("td",[e._v("zammad-postgresql-3.4.0-4")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/zammad/zammad-docker-compose/ff20084ce2829486076e9781fe27407ca6cc09bb/containers/zammad-postgresql/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/zammad/zammad-docker-compose",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/zammad/zammad-docker-compose",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("memcached")]),e._v(" "),t("td",[e._v("1.5.22-alpine")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/docker-library/memcached/eb38bf28263b8e5bb7367797cb7b181b65d769bd/alpine/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/docker-library/memcached",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/memcached",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("traefik")]),e._v(" "),t("td",[e._v("v2.6")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/containous/traefik-library-image/master/scratch/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/containous/traefik-library-image",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/traefik",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chekaz/docker-trezarcoin")]),e._v(" "),t("td",[e._v("0.13.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ChekaZ/docker/master/trezarcoin/1.2.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ChekaZ/docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chekaz/docker-trezarcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("romanornr/docker-viacoin")]),e._v(" "),t("td",[e._v("0.15.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/viacoin/docker-viacoin/master/viacoin/0.15.2/docker-viacoin",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/viacoin/docker-viacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/romanornr/docker-viacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])])])]),e._v(" "),t("h1",{attrs:{id:"faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),t("h2",{attrs:{id:"how-can-i-modify-my-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-modify-my-environment"}},[e._v("#")]),e._v(" How can I modify my environment?")]),e._v(" "),t("p",[e._v("As root, run "),t("code",[e._v(". btcpay-setup.sh")]),e._v("; this will show you the environment variable it is expecting.\nFor example, if you support "),t("code",[e._v("btc")]),e._v(" and "),t("code",[e._v("ltc")]),e._v(" already, and want to add "),t("code",[e._v("btg")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO3")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'btg'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("h2",{attrs:{id:"i-deployed-before-btcpay-setupsh-existed-before-may-17-2018-can-i-migrate-to-this-new-system"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-deployed-before-btcpay-setupsh-existed-before-may-17-2018-can-i-migrate-to-this-new-system"}},[e._v("#")]),e._v(" I deployed before "),t("code",[e._v("btcpay-setup.sh")]),e._v(" existed (before May 17, 2018), can I migrate to this new system?")]),e._v(" "),t("p",[e._v("Yes, run the following commands to update:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$DOWNLOAD_ROOT")]),e._v("/btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout master\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" pull\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout 9acb5d8067cb5c46f59858137feb699b41ac9f19\nbtcpay-update.sh\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout master\nbtcpay-update.sh\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exit")]),e._v("\n")])])]),t("h2",{attrs:{id:"im-getting-an-error-on-windows-cannot-create-container-for-service-docker-mount-denied"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#im-getting-an-error-on-windows-cannot-create-container-for-service-docker-mount-denied"}},[e._v("#")]),e._v(" I'm getting an error on Windows: "),t("code",[e._v("Cannot create container for service docker: Mount denied")]),e._v("?")]),e._v(" "),t("p",[e._v("If you see this error:")]),e._v(" "),t("p",[t("code",[e._v("Cannot create container for service docker: b'Mount denied:\\nThe source path \"\\\\\\\\var\\\\\\\\run\\\\\\\\docker.sock:/var/run/docker.sock\"\\nis not a valid Windows path'")]),e._v(".")]),e._v(" "),t("p",[e._v("Run this in "),t("a",{attrs:{href:"https://docs.microsoft.com/en-us/powershell/scripting/windows-powershell/starting-windows-powershell",target:"_blank",rel:"noopener noreferrer"}},[e._v("powershell"),t("OutboundLink")],1),e._v(":")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$Env")]),e._v(":COMPOSE_CONVERT_WINDOWS_PATHS=1\n")])])]),t("p",[e._v("Then, run "),t("code",[e._v("docker-compose -f EXAMPLE.yml up")]),e._v(".")]),e._v(" "),t("p",[e._v("This bug comes from Docker for Windows and is "),t("a",{attrs:{href:"https://github.com/docker/for-win/issues/1829",target:"_blank",rel:"noopener noreferrer"}},[e._v("tracked on Github"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-i-can-prune-my-nodes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-i-can-prune-my-nodes"}},[e._v("#")]),e._v(" How I can prune my node(s)?")]),e._v(" "),t("p",[e._v("This will prune your Bitcoin full node to a maximum of 100GB (of blocks):")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-save-storage"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("Other options are "),t("a",{attrs:{href:"#generated-docker-compose"}},[e._v("documented here")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-can-i-customize-the-generated-docker-compose-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-customize-the-generated-docker-compose-file"}},[e._v("#")]),e._v(" How can I customize the generated docker-compose file?")]),e._v(" "),t("p",[e._v("In some instances, you might want to customize your environment in more detail. While you could modify "),t("code",[e._v("Generated/docker-compose.generated.yml")]),e._v(" manually, your changes would be overwritten the next time you run "),t("code",[e._v("btcpay-update.sh")]),e._v(".")]),e._v(" "),t("p",[e._v("Luckily, you can leverage "),t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(" for this!")]),e._v(" "),t("p",[e._v("Let's enable "),t("strong",[e._v("pruning to 60 GB")]),e._v(", for example:")]),e._v(" "),t("p",[e._v("First, copy "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage"),t("OutboundLink")],1),e._v(" into the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments",target:"_blank",rel:"noopener noreferrer"}},[e._v("the docker fragment folder"),t("OutboundLink")],1),e._v(" as "),t("code",[e._v("opt-save-storage.custom.yml")]),e._v(". "),t("strong",[e._v("Important:")]),e._v(" the file must end with "),t("code",[e._v(".custom.yml")]),e._v(", or there will be git conflicts whenever you run "),t("code",[e._v("btcpay-update.sh")]),e._v(".")]),e._v(" "),t("p",[e._v("Modify the new "),t("code",[e._v("opt-save-storage.custom.yml")]),e._v(" file to your taste:")]),e._v(" "),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v('@@ -14,8 +14,7 @@ version: "3"\n'),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("services:\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" bitcoind:\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" environment:\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" BITCOIN_EXTRA_ARGS: prune=100000\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" BITCOIN_EXTRA_ARGS: prune=60000\n")])])])])]),t("p",[e._v("Then set it up:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-save-storage.custom"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("h2",{attrs:{id:"can-i-run-btcpay-server-on-ports-other-than-80-and-443"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-run-btcpay-server-on-ports-other-than-80-and-443"}},[e._v("#")]),e._v(" Can I run BTCPay Server on ports other than 80 and 443?")]),e._v(" "),t("p",[e._v("You can change the ports for HTTP and HTTPS by setting the environment variables "),t("code",[e._v("REVERSEPROXY_HTTP_PORT")]),e._v(" and "),t("code",[e._v("REVERSEPROXY_HTTPS_PORT")]),e._v(". This is handy when ports 80 and 443 are already in use on your host, or you want to offload SSL termination with an existing web proxy.")]),e._v(" "),t("p",[e._v("When you set "),t("code",[e._v("REVERSEPROXY_HTTP_PORT")]),e._v(" to another value than 80, the built-in Let's Encrypt certificate will not work, as Let's Encrypt will try to validate your SSL certificate request by connecting from the internet to your domain on port 80. This validation request should be able to reach BTCPay Server in order to receive the certificate.")]),e._v(" "),t("p",[e._v("If you need to run on a different port, it's best to terminate SSL using another web proxy and forward your traffic.")]),e._v(" "),t("h2",{attrs:{id:"can-i-offload-https-termination"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-offload-https-termination"}},[e._v("#")]),e._v(" Can I offload HTTPS termination?")]),e._v(" "),t("p",[e._v("Yes. Please "),t("RouterLink",{attrs:{to:"/FAQ/FAQ-Deployment/#can-i-use-an-existing-nginx-server-as-a-reverse-proxy-with-ssl-termination"}},[e._v("see the documentation")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"how-can-i-back-up-my-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-back-up-my-btcpay-server"}},[e._v("#")]),e._v(" How can I back up my BTCPay Server?")]),e._v(" "),t("p",[e._v("See the "),t("RouterLink",{attrs:{to:"/Docker/backup-restore/"}},[e._v("Backup & Restore")]),e._v(" guide in our documentation.")],1),e._v(" "),t("details",[t("summary",[e._v("For backwards compatibility: Click here for the description of the old backup.sh process")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Please consider switching to the "),t("RouterLink",{attrs:{to:"/Docker/backup-restore/"}},[e._v("new Backup & Restore process")]),e._v(", because the "),t("code",[e._v("backup.sh")]),e._v(" will not be maintained anymore.")],1)]),e._v(" "),t("p",[e._v("We provide a backup script that dumps the database and saves the important files:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v('/btcpayserver-docker"')]),e._v("\n./backup.sh\n")])])]),t("p",[e._v("This will save the backup locally as "),t("code",[e._v("/var/lib/docker/volumes/backup_datadir/_data/backup.tar.gz")]),e._v(".\nThese are the options to customize the backup name and location:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("BACKUP_TIMESTAMP=true")]),e._v(" saves the backup with datetime as part of the file name, so that backups do not get overwritten.")]),e._v(" "),t("li",[t("code",[e._v("BACKUP_PROVIDER=SCP")]),e._v(" saves the backup remotely, requires additional "),t("code",[e._v("SCP_TARGET")]),e._v(" environment variable (see below).")]),e._v(" "),t("li",[t("code",[e._v("BACKUP_PROVIDER=Dropbox")]),e._v(" saves the backup to Dropbox, requires additional "),t("code",[e._v("DROPBOX_TOKEN")]),e._v(" environment variable (see below).")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v('/btcpayserver-docker"')]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Backup with custom file name and timestamp:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_TIMESTAMP")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("true ./backup.sh\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Backup via SCP:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_PROVIDER")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("SCP "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("SCP_TARGET")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("myhost:backups/btcpay ./backup.sh\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Backup to Dropbox:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_PROVIDER")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("Dropbox "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("DROPBOX_TOKEN")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("myDropboxToken ./backup.sh\n")])])]),t("p",[e._v("You can also choose to only dump the database.\nThis option does not need to stop and restart the docker-containers:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v('/btcpayserver-docker"')]),e._v("\n./backup.sh --only-db\n")])])])]),e._v(" "),t("h2",{attrs:{id:"how-can-i-connect-to-the-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-connect-to-the-database"}},[e._v("#")]),e._v(" How can I connect to the database?")]),e._v(" "),t("p",[e._v("On the server you can open a database session by connecting via "),t("code",[e._v("psql")]),e._v(" as the postgres user:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exec")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-ti")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ps")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-a")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-q")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"name=postgres_1"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(" psql "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-U")]),e._v(" postgres\n")])])]),t("p",[e._v("Then, inside "),t("code",[e._v("psql")]),e._v(" you can select a database and interact with the tables:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list databases")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("l\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# connect to database")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("c btcpayservermainnet\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list tables")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("dt\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list users")]),e._v("\nSELECT "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Id"')]),e._v(", "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Email"')]),e._v(" FROM "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"AspNetUsers"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# end session")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("q\n")])])]),t("p",[e._v("The main BTCPay Server database tables are part of the "),t("code",[e._v("public")]),e._v(" schema.\nPlugins have their own schema, named after the plugin.")]),e._v(" "),t("p",[e._v("By default, only the tables of the "),t("code",[e._v("public")]),e._v(" schema are shown.\nIf you want to also see and select the plugin tables, you need to extend the search path:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list plugin schemas")]),e._v("\nSELECT * FROM pg_catalog.pg_namespace WHERE nspname LIKE "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'BTCPayServer.%'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# extend search path")]),e._v("\nSET search_path TO "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"BTCPayServer.Plugins.MyPlugin"')]),e._v(", public"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# table list now also shows the MyPlugin tables")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("dt\n")])])]),t("h2",{attrs:{id:"how-do-i-upgrade-my-btcpay-server-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-upgrade-my-btcpay-server-docker"}},[e._v("#")]),e._v(" How do I upgrade my BTCPay Server docker?")]),e._v(" "),t("p",[e._v("Run the script "),t("code",[e._v("./btcpay-update.sh")]),e._v(" and patiently wait for your server to be upgraded.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[132],{821:function(e,t,r){"use strict";r.r(t);var a=r(17),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"introduction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),t("p",[e._v("While "),t("RouterLink",{attrs:{to:"/LunaNodeWebDeployment/"}},[e._v("our instructions")]),e._v(" cover how to install BTCPayServer in one click on Azure or Lunanode, BTCPay Server is not limited to those options.")],1),e._v(" "),t("p",[e._v("You will find below information about how you can install BTCPay Server easily in any environment having docker available.")]),e._v(" "),t("h1",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[e._v("#")]),e._v(" Architecture")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://github.com/btcpayserver/btcpayserver-doc/raw/master/docs/img/Architecture.png",alt:"Architecture",title:"Architecture"}})]),e._v(" "),t("p",[e._v("As you can see, BTCPay depends on several pieces of infrastructure, mainly:")]),e._v(" "),t("ul",[t("li",[e._v("A lightweight block explorer (NBXplorer),")]),e._v(" "),t("li",[e._v("A database (PostgreSQL),")]),e._v(" "),t("li",[e._v("A full node (eg. Bitcoin Core)")])]),e._v(" "),t("p",[e._v("There can be more dependencies if you support more than just standard Bitcoin transactions, including:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/ElementsProject/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("Core Lightning (CLN)"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/litecoin-project/litecoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("LitecoinD"),t("OutboundLink")],1),e._v(" and other coin daemons")]),e._v(" "),t("li",[e._v("And more...")])]),e._v(" "),t("p",[e._v("Note: The setup process can be time consuming, but is heavily automated to make it a fun and easy experience.")]),e._v(" "),t("p",[e._v("Take a look at how BTCPay works in a video below.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/nr0UNbz3AoQ/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=nr0UNbz3AoQ",title:"YouTube","data-id":"nr0UNbz3AoQ"}},[t("iframe",{attrs:{title:"YouTube","data-src":"https://www.youtube-nocookie.com/embed/nr0UNbz3AoQ?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("p",[e._v("Here is a presentation of the global architecture at Advancing Bitcoin conference.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Up0dvorzSNM/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Up0dvorzSNM",title:"BTCPay - Architecture overview","data-id":"Up0dvorzSNM"}},[t("iframe",{attrs:{title:"BTCPay - Architecture overview","data-src":"https://www.youtube-nocookie.com/embed/Up0dvorzSNM?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h1",{attrs:{id:"full-installation-for-technical-users"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#full-installation-for-technical-users"}},[e._v("#")]),e._v(" Full installation (for technical users)")]),e._v(" "),t("p",[e._v("You can also install BTCPay Server on your own machine or VPS instance.")]),e._v(" "),t("p",[e._v("The officially supported setup is driven by Docker (and Docker-Compose).")]),e._v(" "),t("p",[e._v("First, make sure you have a domain name pointing to your host "),t("code",[e._v("A record")]),e._v(", with ports "),t("code",[e._v("443")]),e._v(" and "),t("code",[e._v("80")]),e._v(" externally accessible. For Lightning Network, port "),t("code",[e._v("9735")]),e._v(" is required ("),t("code",[e._v("9736")]),e._v(" if you use Litecoin Lightning). Otherwise, you will have to set a domain manually by running "),t("code",[e._v("changedomain.sh")]),e._v(".")]),e._v(" "),t("p",[e._v("Let's assume your domain is "),t("code",[e._v("btcpay.EXAMPLE.com")]),e._v(".")]),e._v(" "),t("p",[e._v("The setup below assumes you want to support Bitcoin, Core Lightning (CLN), HTTPS automatically configured by Nginx. It also enables node pruning, which you can "),t("a",{attrs:{href:"#generated-docker-compose"}},[e._v("modify")]),e._v(" or ignore if you have enough disk space for a full node. Finally, your domain is "),t("code",[e._v("btcpay.EXAMPLE.com")]),e._v(" should reflect your actual domain name.")]),e._v(" "),t("p",[t("a",{attrs:{href:"#environment-variables"}},[e._v("Environment variables")]),e._v(" can be tailored to your needs. Some variables require additional storage space.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Login as root")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Create a folder for BTCPay")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkdir")]),e._v(" BTCPayServer\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Clone this repository")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone https://github.com/btcpayserver/btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run btcpay-setup.sh with the right parameters")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btcpay.EXAMPLE.com"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("NBITCOIN_NETWORK")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mainnet"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-save-storage-s"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_ENABLE_SSH")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("true\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exit")]),e._v("\n")])])]),t("p",[t("code",[e._v("btcpay-setup.sh")]),e._v(" will then:")]),e._v(" "),t("ul",[t("li",[e._v("Install Docker")]),e._v(" "),t("li",[e._v("Install Docker-Compose")]),e._v(" "),t("li",[e._v("Make sure BTCPay starts at reboot via upstart or systemd")]),e._v(" "),t("li",[e._v("Setup environment variables to use BTCPay utilities")]),e._v(" "),t("li",[e._v("Add BTCPay utilities in /usr/bin")]),e._v(" "),t("li",[e._v("Start BTCPay Server")])]),e._v(" "),t("p",[e._v("Video below guides you step by step on how to set up BTCPay Server on a VPS with Docker.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/x6hqTFgHqhA/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=x6hqTFgHqhA",title:"YouTube","data-id":"x6hqTFgHqhA"}},[t("iframe",{attrs:{title:"YouTube","data-src":"https://www.youtube-nocookie.com/embed/x6hqTFgHqhA?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("p",[e._v("Check out this video if you're interested in learning more about setting up "),t("a",{attrs:{href:"https://www.youtube.com/playlist?list=PLH4m2oS2ratfaprAFx9E3ZDjwxNKvCk4e",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay with Docker Compose"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("figure",[t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btcpayserver/",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/docker/automated/btcpayserver/btcpayserver.svg",alt:"Docker automated build",title:"Docker automated build"}}),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"environment-variables"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environment-variables"}},[e._v("#")]),e._v(" Environment variables")]),e._v(" "),t("p",[t("code",[e._v("btcpay-setup.sh")]),e._v(" will use the following environment variables:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("BTCPAY_HOST")]),e._v(": The hostname of your website (eg. "),t("code",[e._v("btcpay.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAY_ADDITIONAL_HOSTS")]),e._v(": Optional, specify additional domains to your BTCPayServer with https support if enabled. (eg. example2.com,example3.com)")]),e._v(" "),t("li",[t("code",[e._v("REVERSEPROXY_HTTP_PORT")]),e._v(": The public port the reverse proxy binds to for HTTP traffic (default: 80)")]),e._v(" "),t("li",[t("code",[e._v("REVERSEPROXY_HTTPS_PORT")]),e._v(": The public port the reverse proxy binds to for HTTPS traffic (default: 443)")]),e._v(" "),t("li",[t("code",[e._v("REVERSEPROXY_DEFAULT_HOST")]),e._v(": Optional, if using a reverse proxy nginx, specify which website should be presented if the server is accessed by its IP or by an unrecognized domain name.")]),e._v(" "),t("li",[t("code",[e._v("NOREVERSEPROXY_HTTP_PORT")]),e._v(": Optional, if not using a reverse proxy, specify which port should be opened for HTTP traffic. (default: 80)")]),e._v(" "),t("li",[t("code",[e._v("NBITCOIN_NETWORK")]),e._v(": The type of network to use (eg. "),t("code",[e._v("mainnet")]),e._v(", "),t("code",[e._v("testnet")]),e._v(", or "),t("code",[e._v("regtest")]),e._v(". Default: "),t("code",[e._v("mainnet")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("LIGHTNING_ALIAS")]),e._v(": An alias for your lightning network node, if used")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_CRYPTO1")]),e._v(": First supported crypto currency (eg. "),t("code",[e._v("btc")]),e._v(", "),t("code",[e._v("ltc")]),e._v(". Default: "),t("code",[e._v("btc")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_CRYPTO2")]),e._v(": Second supported crypto currency (eg. "),t("code",[e._v("btc")]),e._v(", "),t("code",[e._v("ltc")]),e._v(". Default: "),t("code",[e._v("(empty)")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_CRYPTON")]),e._v(": N'th supported crypto currency where N is 9 at maximum. (eg. "),t("code",[e._v("btc")]),e._v(", "),t("code",[e._v("ltc")]),e._v(". Default: "),t("code",[e._v("(empty)")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_REVERSEPROXY")]),e._v(": Specify reverse proxy to use; NGinx has HTTPS support. (eg. "),t("code",[e._v("nginx")]),e._v(", "),t("code",[e._v("traefik")]),e._v(", "),t("code",[e._v("(empty)")]),e._v(". Default: "),t("code",[e._v("nginx")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_LIGHTNING")]),e._v(": Lightning network implementation to use (eg. "),t("code",[e._v("clightning")]),e._v(", "),t("code",[e._v("lnd")]),e._v(", Default: "),t("code",[e._v("(empty)")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_SUBNAME")]),e._v(": The subname of the generated docker-compose file, where the full name is "),t("code",[e._v("Generated/docker-compose.SUBNAME.yml")]),e._v(" (Default: "),t("code",[e._v("generated")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(": Semicolon-separated list of additional fragments you want to use (eg. "),t("code",[e._v("opt-save-storage")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("LETSENCRYPT_EMAIL")]),e._v(": An email will be sent to this address if certificate expires and fails to renew automatically (eg. "),t("code",[e._v("me@example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("ACME_CA_URI")]),e._v(": The API endpoint to ask for HTTPS certificate (Default: "),t("code",[e._v("production")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("BTCPAY_ENABLE_SSH")]),e._v(": Optional, gives BTCPay Server SSH access to the host by allowing it to edit authorized_keys of the host, it can be used for managing the authorized_keys or updating BTCPay Server directly through the website. (Default: false)")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_DOCKER_IMAGE")]),e._v(": Optional, Specify which generator image to use if you have customized the C# generator. Set to "),t("code",[e._v("btcpayserver/docker-compose-generator:local")]),e._v(" to build the generator locally at runtime.")]),e._v(" "),t("li",[t("code",[e._v("BTCPAY_IMAGE")]),e._v(": Optional, Specify which btcpayserver image to use if you have a customized btcpayserver.")]),e._v(" "),t("li",[t("code",[e._v("BTCPAYGEN_EXCLUDE_FRAGMENTS")]),e._v(": Semicolon-separated list of fragments you want to forcefully exclude (eg. "),t("code",[e._v("litecoin-clightning")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("TOR_RELAY_NICKNAME")]),e._v(": If tor relay is activated with opt-add-tor-relay, the relay nickname")]),e._v(" "),t("li",[t("code",[e._v("TOR_RELAY_EMAIL")]),e._v(": If tor relay is activated with opt-add-tor-relay, the email for Tor to contact you regarding your relay")])]),e._v(" "),t("p",[e._v("Additionally, there are specific environment variables for some addons:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("LIBREPATRON_HOST")]),e._v(": If libre patron is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-librepatron.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-librepatron"),t("OutboundLink")],1),e._v(", the hostname of your libre patron website (eg. "),t("code",[e._v("librepatron.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("ZAMMAD_HOST")]),e._v(": If zammad is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-zammad.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-zammad"),t("OutboundLink")],1),e._v(", the hostname of your zammad website (eg. "),t("code",[e._v("zammad.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("WOOCOMMERCE_HOST")]),e._v(": If woocommerce is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-woocommerce.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-woocommerce"),t("OutboundLink")],1),e._v(", the hostname of your woocommerce website (eg. "),t("code",[e._v("store.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("EPS_XPUB")]),e._v(": If Electrum Personal Server (EPS) is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrum-ps.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-ps"),t("OutboundLink")],1),e._v(", you must set the Extended Public Key (XPUB, YPUB or ZPUB) of the wallet you want to use, before first run of the EPS server. If you accidentally start EPS without this, it will not work properly as the model of EPS is to monitor only specified wallets.")]),e._v(" "),t("li",[e._v("If Bitcoin Wallet Tracker is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-bwt.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-bwt"),t("OutboundLink")],1),e._v(", you can use "),t("code",[e._v("BWT_XPUB")]),e._v("/"),t("code",[e._v("BWT_XPUB_*")]),e._v(" (to set your XPUB/YPUB/ZPUB), "),t("code",[e._v("BWT_DESCRIPTOR")]),e._v("/"),t("code",[e._v("BWT_DESCRIPTOR_*")]),e._v(" (for script descriptors), "),t("code",[e._v("BWT_RESCAN_SINCE")]),e._v(" (set to the wallet creation date in YYYY-MM-DD to speed up the rescan), "),t("code",[e._v("BWT_BITCOIND_WALLET")]),e._v(" and "),t("code",[e._v("BWT_GAP_LIMIT")]),e._v(".")]),e._v(" "),t("li",[t("code",[e._v("LND_WTCLIENT_SWEEP_FEE")]),e._v(": If LND watchtower is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-wtclient.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-wtclient"),t("OutboundLink")],1),e._v(", you can use "),t("code",[e._v("LND_WTCLIENT_SWEEP_FEE")]),e._v(" to change the sweep fee used in constructing the justice transaction (default is 10 sat/byte)")]),e._v(" "),t("li",[t("code",[e._v("FIREFLY_HOST")]),e._v(": If fireflyiii is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-fireflyiii.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-fireflyiii"),t("OutboundLink")],1),e._v(", the hostname of your fireflyiii website (eg. "),t("code",[e._v("firefly.example.com")]),e._v(")")]),e._v(" "),t("li",[t("code",[e._v("CLOUDFLARE_TUNNEL_TOKEN")]),e._v(": Used to expose your instance to clearnet with a Cloudflare Argo Tunnel (if cloudflare tunnel is activated with "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-cloudflared.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-cloudflared"),t("OutboundLink")],1),e._v(", for setup instructions "),t("RouterLink",{attrs:{to:"/Docker/cloudflare-tunnel/"}},[e._v("see documentation")]),e._v(")")],1)]),e._v(" "),t("h1",{attrs:{id:"tooling"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tooling"}},[e._v("#")]),e._v(" Tooling")]),e._v(" "),t("p",[e._v("A wide variety of useful scripts are available once BTCPay is installed:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("bitcoin-cli.sh")]),e._v(": Access your Bitcoin node instance (for RPC)")]),e._v(" "),t("li",[t("code",[e._v("bitcoin-lightning-cli.sh")]),e._v(": Access your CLN node instance (for RPC)")]),e._v(" "),t("li",[t("code",[e._v("changedomain.sh")]),e._v(": Change the domain of your BTCPayServer (remember to disable 2FA/U2F first, as you risk being unable to log in to your account)")]),e._v(" "),t("li",[t("code",[e._v("btcpay-update.sh")]),e._v(": Update BTCPayServer to the latest version")]),e._v(" "),t("li",[t("code",[e._v("btcpay-up.sh")]),e._v(": Run "),t("code",[e._v("docker-compose up")])]),e._v(" "),t("li",[t("code",[e._v("btcpay-down.sh")]),e._v(": Run "),t("code",[e._v("docker-compose down")])]),e._v(" "),t("li",[t("code",[e._v("btcpay-setup.sh")]),e._v(": Change the settings of your server")]),e._v(" "),t("li",[t("code",[e._v("btcpay-clean.sh")]),e._v(": Purge any unused docker images")]),e._v(" "),t("li",[t("code",[e._v(". ./btcpay-setup.sh")]),e._v(": Information about additional parameters")]),e._v(" "),t("li",[t("code",[e._v(". ./btcpay-setup.sh -i")]),e._v(": Set up your BTCPayServer")]),e._v(" "),t("li",[t("code",[e._v("btcpay-restart.sh")]),e._v(": Restart your BTCPayServer")])]),e._v(" "),t("h1",{attrs:{id:"under-the-hood"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#under-the-hood"}},[e._v("#")]),e._v(" Under the hood")]),e._v(" "),t("h2",{attrs:{id:"generated-docker-compose"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generated-docker-compose"}},[e._v("#")]),e._v(" Generated docker-compose")]),e._v(" "),t("p",[e._v("When you run "),t("code",[e._v("btcpay-setup.sh")]),e._v(", your environment variables are used by "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/build.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("build.sh"),t("OutboundLink")],1),e._v(" (or "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/build.ps1",target:"_blank",rel:"noopener noreferrer"}},[e._v("build.ps1"),t("OutboundLink")],1),e._v(") to generate a docker-compose adapted for your needs. For the full list of options, see: "),t("a",{attrs:{href:"#environment-variables"}},[e._v("Environment variables")])]),e._v(" "),t("p",[e._v("By default, the generated file is "),t("code",[e._v("Generated/docker-compose.generated.yml")]),e._v(", constructed from the relevant "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments",target:"_blank",rel:"noopener noreferrer"}},[e._v("Docker fragments"),t("OutboundLink")],1),e._v(" for your setup.")]),e._v(" "),t("p",[e._v("Available "),t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(" currently are:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage"),t("OutboundLink")],1),e._v(" will keep around 1 year of blocks (prune BTC for 100 GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage-s.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage-s"),t("OutboundLink")],1),e._v(" will keep around 6 months of blocks (prune BTC for 50 GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage-xs.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage-xs"),t("OutboundLink")],1),e._v(" will keep around 3 months of blocks (prune BTC for 25 GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage-xxs.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage-xxs"),t("OutboundLink")],1),e._v(" will keep around 2 weeks of blocks (prune BTC for 5 GB) (lightning not supported)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-autocompact.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-autocompact"),t("OutboundLink")],1),e._v(" will activate auto compacting of LND database.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-autopilot.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-autopilot"),t("OutboundLink")],1),e._v(" will activate auto pilot on LND. (5 channels, 60% of allocation)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-keysend.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-keysend"),t("OutboundLink")],1),e._v(" will activate keysend on LND.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-wtclient.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-wtclient"),t("OutboundLink")],1),e._v(" will activate the watchtower client on LND. "),t("code",[e._v("LND_WTCLIENT_SWEEP_FEE")]),e._v(" can be used to override the default 10 sat/byte justice transaction fee")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-lnd-watchtower.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-lnd-watchtower"),t("OutboundLink")],1),e._v(" will activate the LND watchtower RPC")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-memory.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-memory"),t("OutboundLink")],1),e._v(" will decrease the default dbcache at the expense of longer synchronization time. (Useful if your machine is less than 2GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-more-memory.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-more-memory"),t("OutboundLink")],1),e._v(" will increase the default dbcache to make synchronization faster (Useful if your machine is has around 4GB)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-btcqbo.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-btcqbo"),t("OutboundLink")],1),e._v(" will allow you to create an invoice on Quickbooks which include a way for your customer to pay on BTCPay Server (More information on this "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr/btcqbo/",target:"_blank",rel:"noopener noreferrer"}},[e._v("github repository"),t("OutboundLink")],1),e._v(", this add-on is maintained by "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr",target:"_blank",rel:"noopener noreferrer"}},[e._v("JeffVandrewJr"),t("OutboundLink")],1),e._v(", see more on "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=srgwL9ozg6c",target:"_blank",rel:"noopener noreferrer"}},[e._v("this video"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-librepatron.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-librepatron"),t("OutboundLink")],1),e._v(", for a self-hosted Patreon alternative backed by BTCPay (More information on this "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron",target:"_blank",rel:"noopener noreferrer"}},[e._v("github repository"),t("OutboundLink")],1),e._v(", this add-on is maintained by "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr",target:"_blank",rel:"noopener noreferrer"}},[e._v("JeffVandrewJr"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-woocommerce.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-woocommerce"),t("OutboundLink")],1),e._v(", for a self-hosted woocommerce with BTCPay Server plugin pre installed.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-tor.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-tor"),t("OutboundLink")],1),e._v(", for exposing BTCPayServer, Woocommerce, your lightning nodes as hidden services and accept onion peers for your full node. Warning: This options is for working around NAT and firewall problems as well as to help protect your customer's privacy. This will not protect your privacy against a targeted attack against you.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-btctransmuter.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-btctransmuter"),t("OutboundLink")],1),e._v(", for a self-hosted IFTTT style service for crypto services such as fiat settlement. (More information on this "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/",target:"_blank",rel:"noopener noreferrer"}},[e._v("github repository"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-txindex.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-txindex"),t("OutboundLink")],1),e._v(", to enable txindex=1 in bitcoin.conf if you require txindexing for Bisq, DOJO, etc.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-expose-unsafe.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-expose-unsafe"),t("OutboundLink")],1),e._v(", to unsafely expose bitcoind P2P port 8333 if you require P2P for Bisq, DOJO, Esplora, etc. WARNING: ONLY USE ON TRUSTED LAN OR WITH FIREWALL RULES WHITELISTING SPECIFIC HOSTS")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-tor-relay.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-tor-relay"),t("OutboundLink")],1),e._v(", for a non-exit tor relay. Make sure to have port 9001 accessible externally. "),t("a",{attrs:{href:"https://community.torproject.org/relay/community-resources/eff-tor-legal-faq",target:"_blank",rel:"noopener noreferrer"}},[e._v("Please read the legal implications of running a tor relay"),t("OutboundLink")],1),e._v(" and "),t("a",{attrs:{href:"https://trac.torproject.org/projects/tor/wiki/TorRelayGuide#RelayRequirements",target:"_blank",rel:"noopener noreferrer"}},[e._v("what resources are used to operate the relay"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrumx.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrumx"),t("OutboundLink")],1),e._v(", to integrate a full ElectrumX server (from official source) with BTCPay, using the BTCPay server's full bitcoin node for complete privacy when using your own Electrum wallet. You can also open port 50002 up to the internet on your router etc, to be part of the ElectrumX network, helping other Electrum wallet users to get connected. The bitcoin option "),t("code",[e._v("-txindex")]),e._v(" is mandatory for ElectrumX, and this fragment will enable it on your BTCPay server automatically - No need to use the fragment opt-txindex.yml.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrum-ps.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-ps"),t("OutboundLink")],1),e._v(", to integrate Electrum Personal Server (EPS) with BTCPay (EPS is a single-user alternative to the ElectrumX Server option above). EPS will also use the BTCPay server's full bitcoin node for complete privacy when using your own Electrum wallet, for your own personal use (i.e. other users cannot use your server to verify transactions). Also, the bitcoin option "),t("code",[e._v("-txindex")]),e._v(" is NOT mandatory for EPS, and it will run on a pruned node (unlike ElectrumX). You will need to add your XPUB/YPUB/ZPUB as environment variable "),t("code",[e._v("EPS_XPUB")]),e._v(" before enabling EPS for the first time (see above section on environment variables, and see "),t("RouterLink",{attrs:{to:"/ElectrumPersonalServer/"}},[e._v("full documentation")]),e._v(" for details).")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-bwt.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-bwt"),t("OutboundLink")],1),e._v(", to integrate the "),t("a",{attrs:{href:"https://github.com/bwt-dev/bwt",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Wallet Tracker"),t("OutboundLink")],1),e._v(" Electrum server, which uses a personal wallet index model similar to that of EPS. You will need to set "),t("code",[e._v("BWT_XPUB")]),e._v(" with your XPUB/YPUB/ZPUB (see environment variables section). The server will only be available locally and through an onion service.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-configurator.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-configurator"),t("OutboundLink")],1),e._v(", to integrate the "),t("a",{attrs:{href:"https://install.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Configurator"),t("OutboundLink")],1),e._v(" to manage your BTCPay deployment through a UI, and to allow new deployments elsewhere easily.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-pihole.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-pihole"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/pihole/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-ndlc.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-ndlc"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/ndlc/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-lightning-terminal.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-lightning-terminal"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning Terminal/LiT"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-mempool.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-mempool"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/mempool/mempool",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mempool"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-sphinxrelay.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-sphinxrelay"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/stakwork/sphinx-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sphinx Relay"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-tallycoin-connect.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-tallycoin-connect"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tallycoin Connect"),t("OutboundLink")],1),e._v(". Maintained by "),t("a",{attrs:{href:"https://github.com/dennisreimann",target:"_blank",rel:"noopener noreferrer"}},[e._v("dennisreimann"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-thunderhub.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-thunderhub"),t("OutboundLink")],1),e._v(" for a LND Lightning Node Manager in your Browser. Maintained by "),t("a",{attrs:{href:"https://github.com/apotdevin",target:"_blank",rel:"noopener noreferrer"}},[e._v("apotdevin"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-teos.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-teos"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/talaia-labs/python-teos",target:"_blank",rel:"noopener noreferrer"}},[e._v("The Eye Of Satoshi"),t("OutboundLink")],1),e._v(", a BOLT13 Lightning Watchtower. Use port 9814 on your server or Tor to connect.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-chatwoot.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-chatwoot"),t("OutboundLink")],1),e._v(" for open source chat support system. ("),t("RouterLink",{attrs:{to:"/Docker/chatwoot/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-zammad.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-zammad"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://zammad.com/features",target:"_blank",rel:"noopener noreferrer"}},[e._v("Zammad"),t("OutboundLink")],1),e._v(", a web based open source helpdesk/customer support system with many features to manage customer communication via several channels like telephone, facebook, twitter, chat and e-mails")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-monero-expose.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-monero-expose"),t("OutboundLink")],1),e._v(" to expose monero node's RPC port at 127.0.0.1:18081 to connect your own wallet. Use f.e. ssh port forwarding to forward to your own computer.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-fireflyiii.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-fireflyiii"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/fireflyiii/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-joinmarket.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-joinmarket"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Docker/joinmarket/"}},[e._v("See the documentation")]),e._v(")")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-helipad.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-helipad"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/Podcastindex-org/helipad",target:"_blank",rel:"noopener noreferrer"}},[e._v("Podcastindex.org Helipad"),t("OutboundLink")],1),e._v(". Requires LND.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-nostr-relay.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-nostr-relay"),t("OutboundLink")],1),e._v(" for "),t("a",{attrs:{href:"https://github.com/kukks/Nnostr",target:"_blank",rel:"noopener noreferrer"}},[e._v("Nostr Relay"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-cloudflared.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-cloudflared"),t("OutboundLink")],1),e._v(" to expose your local server on clearnet painlessly ("),t("RouterLink",{attrs:{to:"/Docker/cloudflare-tunnel/"}},[e._v("see documentation")]),e._v(").")],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-torq.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-torq"),t("OutboundLink")],1),e._v(" to install "),t("a",{attrs:{href:"https://github.com/lncapital/torq",target:"_blank",rel:"noopener noreferrer"}},[e._v("Torq"),t("OutboundLink")],1),e._v(" node management application. Requires LND.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-snapdrop.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-snapdrop"),t("OutboundLink")],1),e._v(" to install "),t("a",{attrs:{href:"https://snapdrop.net/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Snapdrop"),t("OutboundLink")],1),e._v(". You can then browse to "),t("code",[e._v("/snapdrop")]),e._v(" of your server to access it.")])]),e._v(" "),t("p",[e._v("You can also create your own "),t("a",{attrs:{href:"#how-can-i-customize-the-generated-docker-compose-file"}},[e._v("custom fragments")]),e._v(".")]),e._v(" "),t("p",[e._v("If you want to add an option to "),t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(" and re-configure your install:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-lnd-autopilot"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("For example, if you want "),t("code",[e._v("btc")]),e._v(" and "),t("code",[e._v("ltc")]),e._v(" support with "),t("code",[e._v("nginx")]),e._v(" and "),t("code",[e._v("clightning")]),e._v(" inside "),t("code",[e._v("Generated/docker-compose.custom.yml")]),e._v(":")]),e._v(" "),t("p",[e._v("Note: The first run might take a while, but following runs are instantaneous.")]),e._v(" "),t("p",[e._v("On Windows (run in "),t("a",{attrs:{href:"https://docs.microsoft.com/en-us/powershell/scripting/windows-powershell/starting-windows-powershell",target:"_blank",rel:"noopener noreferrer"}},[e._v("powershell"),t("OutboundLink")],1),e._v("):")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("Invoke-Command")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_CRYPTO1")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_CRYPTO2")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ltc"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_REVERSEPROXY")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_LIGHTNING")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_SUBNAME")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"custom"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\build"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("On Linux:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO2")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"ltc"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_SUBNAME")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"custom"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n./build.sh\n")])])]),t("p",[e._v("Next, you will need to configure the runtime environment variables for "),t("code",[e._v("Generated/docker-compose.custom.yml")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("If you are using NGinx, "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/Production/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("read this"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("If you are not using NGinx, "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/Production-NoReverseProxy/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("read this instead"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("h2",{attrs:{id:"again-what-does-btcpay-setupsh-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#again-what-does-btcpay-setupsh-do"}},[e._v("#")]),e._v(" Again, what does "),t("code",[e._v("btcpay-setup.sh")]),e._v(" do?")]),e._v(" "),t("p",[t("code",[e._v("btcpay-setup.sh")]),e._v(" is a utility which does the following:")]),e._v(" "),t("ol",[t("li",[e._v("Makes sure docker and docker-compose are installed on your system")]),e._v(" "),t("li",[e._v("Generates a docker-compose via "),t("code",[e._v("./build.sh")])]),e._v(" "),t("li",[e._v("Sets up an "),t("a",{attrs:{href:"https://docs.docker.com/compose/env-file/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Environment File"),t("OutboundLink")],1),e._v(" to configure your docker-compose")]),e._v(" "),t("li",[e._v("Sets up environment variables so the tools described in "),t("a",{attrs:{href:"#tooling"}},[e._v("Tooling")]),e._v(" can work")]),e._v(" "),t("li",[e._v("Adds symlinks of those tools into "),t("code",[e._v("/usr/bin")])]),e._v(" "),t("li",[e._v("Makes sure BTCPay restarts on reboot via upstart or systemd")]),e._v(" "),t("li",[e._v("Starts BTCPay via docker-compose")])]),e._v(" "),t("h2",{attrs:{id:"overview-of-files-generated-by-btcpay-setupsh"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview-of-files-generated-by-btcpay-setupsh"}},[e._v("#")]),e._v(" Overview of files generated by "),t("code",[e._v("btcpay-setup.sh")])]),e._v(" "),t("p",[t("code",[e._v("/etc/profile.d/btcpay-env.sh")]),e._v(" ensures that your environment variables are correctly setup when you login, so you can use the tools:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_OLD_PREGEN")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"false"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO2")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO3")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO4")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO5")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO6")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO7")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO8")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO9")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"clightning"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_DOCKER_COMPOSE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/var/lib/waagent/custom-script/download/0/btcpayserver-docker/Production/docker-compose.generated.yml"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_BASE_DIRECTORY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/var/lib/waagent/custom-script/download/0"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_ENV_FILE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/var/lib/waagent/custom-script/download/0/.env"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST_SSHKEYFILE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/root/.ssh/id_rsa_btcpay"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_ENV_FILE")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&>")]),e._v(" /dev/null"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("then")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-v")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'^#'")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_ENV_FILE")]),e._v('"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("xargs")]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("fi")]),e._v("\n")])])]),t("p",[t("code",[e._v("/etc/systemd/system/btcpayserver.service")]),e._v(" ensures that you can control btcpay via "),t("code",[e._v("systemctl")]),e._v(", and that BTCPayServer starts on reboot:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token section"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token section-name selector"}},[e._v("Unit")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("Description")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("BTCPayServer service")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("After")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("docker.service network-online.target")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("Requires")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("docker.service network-online.target")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token section"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token section-name selector"}},[e._v("Service")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("Type")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("oneshot")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("RemainAfterExit")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("yes")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ExecStart")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"$BTCPAY_BASE_DIRECTORY/btcpayserver-docker\" && . helpers.sh && btcpay_up'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ExecStop")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"$BTCPAY_BASE_DIRECTORY/btcpayserver-docker\" && . helpers.sh && btcpay_down'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ExecReload")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/bin/bash -c '. /etc/profile.d/btcpay-env.sh && cd \"$BTCPAY_BASE_DIRECTORY/btcpayserver-docker\" && . helpers.sh && btcpay_restart'")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token section"}},[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token section-name selector"}},[e._v("Install")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")])]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("WantedBy")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("multi-user.target")]),e._v("\n")])])]),t("p",[t("code",[e._v(".env")]),e._v(" ("),t("code",[e._v("$BTCPAY_ENV_FILE")]),e._v(") contains environment variables passed to the containers managed by your docker-compose:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("btcpay.EXAMPLE.com")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("ACME_CA_URI")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("production")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("NBITCOIN_NETWORK")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("mainnet")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("LETSENCRYPT_EMAIL")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("me@EXAMPLE.com")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("BTCPAY_SSHTRUSTEDFINGERPRINTS")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("SHA256:eSCD7NtQ/Q6IBl2iRB9caAQ3lDZd8s8iUL6SdeNnhpA")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("BTCPAY_SSHKEYFILE")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("/datadir/id_rsa")]),e._v("\n")])])]),t("h1",{attrs:{id:"how-can-i-add-an-altcoin-to-btcpayserver"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-add-an-altcoin-to-btcpayserver"}},[e._v("#")]),e._v(" How can I add an altcoin to BTCPayServer?")]),e._v(" "),t("ol",[t("li",[e._v("Add support for your crypto to "),t("a",{attrs:{href:"https://github.com/MetacoSA/NBitcoin/tree/master/NBitcoin.Altcoins",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBitcoin"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBxplorer"),t("OutboundLink")],1),e._v(", and "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer"),t("OutboundLink")],1),e._v(". (Use examples from other coins)")]),e._v(" "),t("li",[e._v("Create your own docker image ("),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/docker-bitcoin/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Create a docker-compose fragment ("),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/bitcoin.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Add your "),t("code",[e._v("CryptoDefinition")]),e._v(" ("),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/src/CryptoDefinition.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v(")")])]),e._v(" "),t("p",[t("code",[e._v("build.sh")]),e._v(" is using a pre-built image of the "),t("code",[e._v("docker-compose generator")]),e._v(" on "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-compose-generator/",target:"_blank",rel:"noopener noreferrer"}},[e._v("docker hub"),t("OutboundLink")],1),e._v(".\nIf you modify the code source of "),t("code",[e._v("docker-compose generator")]),e._v(" (for example, the "),t("code",[e._v("CryptoDefinition")]),e._v(" "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/src/CryptoDefinition.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Example for BTC"),t("OutboundLink")],1),e._v("), you need to configure "),t("code",[e._v("build.sh")]),e._v(" to use your own image by setting the environment variable "),t("code",[e._v("BTCPAYGEN_DOCKER_IMAGE")]),e._v(" to "),t("code",[e._v("btcpayserver/docker-compose-generator:local")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" docker-compose-generator\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_DOCKER_IMAGE")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btcpayserver/docker-compose-generator:local"')]),e._v("\n")])])]),t("p",[e._v("Or on powershell:")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[e._v("cd docker-compose-generator\n"),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_DOCKER_IMAGE")]),e._v("="),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btcpayserver/docker-compose-generator:local"')]),e._v("\n")])])]),t("p",[e._v("Then run "),t("code",[e._v("./build.sh")]),e._v(" or "),t("code",[e._v(". .\\build.ps1")]),e._v(".\nThis will generate your docker-compose in the "),t("code",[e._v("Generated")]),e._v(" folder, which you can then run and test.")]),e._v(" "),t("p",[e._v("Note that BTCPayServer developers will not spend excessive time testing your image, so make sure it works.")]),e._v(" "),t("h1",{attrs:{id:"support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[e._v("#")]),e._v(" Support")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Image")]),e._v(" "),t("th",[e._v("Version")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("x64")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("arm32v7")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("arm64v8")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("links")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("btcpayserver/docker-compose-generator")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-docker/dcg-latest/docker-compose-generator/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-docker/dcg-latest/docker-compose-generator/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-docker/dcg-latest/docker-compose-generator/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-compose-generator",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/lightning")]),e._v(" "),t("td",[e._v("v24.05")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lightning/basedon-v24.05/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lightning/basedon-v24.05/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lightning/basedon-v24.05/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("shahanafarooqui/rtl")]),e._v(" "),t("td",[e._v("v0.15.4")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/RTL/v0.15.4/dockerfiles/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/RTL/v0.15.4/dockerfiles/Dockerfile.arm32v7",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Ride-The-Lightning/RTL/v0.15.4/dockerfiles/Dockerfile.arm64v8",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Ride-The-Lightning/RTL",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/shahanafarooqui/rtl",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/lnd")]),e._v(" "),t("td",[e._v("v0.18.3-beta")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lnd/basedon-v0.18.3-beta/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lnd/basedon-v0.18.3-beta/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/lnd/basedon-v0.18.3-beta/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/bitcoin")]),e._v(" "),t("td",[e._v("26.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Bitcoin/26.0/Bitcoin/26.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Bitcoin/26.0/Bitcoin/26.0/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Bitcoin/26.0/Bitcoin/26.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/btcpayserver")]),e._v(" "),t("td",[e._v("1.13.7$?")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver/v1.13.7/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver/v1.13.7/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver/v1.13.7/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/monero")]),e._v(" "),t("td",[e._v("0.18.3.4")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Monero/0.18.3.4/Monero/0.18.3.4/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Monero/0.18.3.4/Monero/0.18.3.4/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Monero/0.18.3.4/Monero/0.18.3.4/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/monero",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("nicolasdorier/nbxplorer")]),e._v(" "),t("td",[e._v("2.5.14")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/nbxplorer/v2.5.14/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/nbxplorer/v2.5.14/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/nbxplorer/v2.5.14/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/dgarage/nbxplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/nbxplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/letsencrypt-nginx-proxy-companion")]),e._v(" "),t("td",[e._v("2.2.9-2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion/v2.2.9-2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion/v2.2.9-2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion/v2.2.9-2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/docker-letsencrypt-nginx-proxy-companion",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/letsencrypt-nginx-proxy-companion",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("nginx")]),e._v(" "),t("td",[e._v("1.25.3-bookworm")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/nginxinc/docker-nginx/1.23.2/stable/debian/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/nginxinc/docker-nginx/1.23.2/stable/debian/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/nginxinc/docker-nginx/1.23.2/stable/debian/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/nginxinc/docker-nginx",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/nginx",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/docker-gen")]),e._v(" "),t("td",[e._v("0.10.7")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-gen/0.10.7/Dockerfile.alpine",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-gen/0.10.7/Dockerfile.alpine",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/docker-gen/0.10.7/Dockerfile.alpine",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/docker-gen",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/docker-gen",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/btctransmuter")]),e._v(" "),t("td",[e._v("0.0.59")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btctransmuter/v0.0.59/Dockerfiles/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btctransmuter/v0.0.59/Dockerfiles/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btctransmuter/v0.0.59/Dockerfiles/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btctransmuter",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btctransmuter",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/cloudflared")]),e._v(" "),t("td",[e._v("2023.10.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Cloudflared/2023.10.0/Cloudflared/2023.10.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Cloudflared/2023.10.0/Cloudflared/2023.10.0/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Cloudflared/2023.10.0/Cloudflared/2023.10.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/cloudflared",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/btcpayserver-configurator")]),e._v(" "),t("td",[e._v("0.0.21")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-configurator/v0.0.21/Dockerfiles/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-configurator/v0.0.21/Dockerfiles/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/btcpayserver-configurator/v0.0.21/Dockerfiles/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-configurator",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/btcpayserver-configurator",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/eps")]),e._v(" "),t("td",[e._v("0.2.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/EPS/0.2.2/EPS/0.2.2/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/EPS/0.2.2/EPS/0.2.2/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/EPS/0.2.2/EPS/0.2.2/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/eps",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/joinmarket")]),e._v(" "),t("td",[e._v("0.9.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/JoinMarket/0.9.10/JoinMarket/0.9.10/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/JoinMarket/0.9.10/JoinMarket/0.9.10/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/JoinMarket/0.9.10/JoinMarket/0.9.10/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/joinmarket",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("nicolasdorier/ndlc-cli")]),e._v(" "),t("td",[e._v("1.0.1")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/ndlc/releases/1.0.1/amd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/ndlc/releases/1.0.1/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dgarage/ndlc/releases/1.0.1/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/dgarage/ndlc",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/ndlc-cli",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("pihole/pihole")]),e._v(" "),t("td",[e._v("2023.05.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/pi-hole/docker-pi-hole/2023.05.2/src/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/pi-hole/docker-pi-hole/2023.05.2/src/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/pi-hole/docker-pi-hole/2023.05.2/src/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/pi-hole/docker-pi-hole",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/pihole/pihole",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/snapdrop")]),e._v(" "),t("td",[e._v("1.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Snapdrop/1.2/Snapdrop/1.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Snapdrop/1.2/Snapdrop/1.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Snapdrop/1.2/Snapdrop/1.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/snapdrop",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/tor")]),e._v(" "),t("td",[e._v("0.4.8.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Tor/0.4.8.10/Tor/0.4.8.10/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Tor/0.4.8.10/Tor/0.4.8.10/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Tor/0.4.8.10/Tor/0.4.8.10/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/tor",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/woocommerce")]),e._v(" "),t("td",[e._v("3.1.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/WooCommerce/3.1.0/WooCommerce/3.1.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/WooCommerce/3.1.0/WooCommerce/3.1.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/woocommerce",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/postgres")]),e._v(" "),t("td",[e._v("13.13")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Postgres/13.13/Postgres/13.13/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Postgres/13.13/Postgres/13.13/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Postgres/13.13/Postgres/13.13/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/postgres",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("kamigawabul/btglnd")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/vutov/lnd/master/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/vutov/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/kamigawabul/btglnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("kamigawabul/docker-bitcoingold")]),e._v(" "),t("td",[e._v("0.15.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Vutov/docker-bitcoin/master/bitcoingold/0.15.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Vutov/docker-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/kamigawabul/docker-bitcoingold",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("acinq/eclair")]),e._v(" "),t("td",[e._v("release-0.7.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ACINQ/eclair/v0.7.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ACINQ/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/acinq/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chekaz/docker-bitcoinplus")]),e._v(" "),t("td",[e._v("2.7.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ChekaZ/docker/master/bitcoinplus/2.7.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ChekaZ/docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chekaz/docker-bitcoinplus",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("dalijolijo/docker-bitcore")]),e._v(" "),t("td",[e._v("0.90.9.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/dalijolijo/btcpayserver-docker-bitcore/master/docker-bitcored/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/dalijolijo/btcpayserver-docker-bitcore",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/dalijolijo/docker-bitcore",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/dash")]),e._v(" "),t("td",[e._v("20.1.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Dash/20.1.0/Dash/20.1.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Dash/20.1.0/Dash/20.1.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/dash",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/dogecoin")]),e._v(" "),t("td",[e._v("1.14.7")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Dogecoin/1.14.7/Dogecoin/1.14.7/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/dogecoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chekaz/docker-feathercoin")]),e._v(" "),t("td",[e._v("0.16.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ChekaZ/docker/master/feathercoin/0.16.3/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ChekaZ/docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chekaz/docker-feathercoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/lightning")]),e._v(" "),t("td",[e._v("v23.05")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/lightning/v23.05/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/lightning",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/groestlcoin-lightning-charge")]),e._v(" "),t("td",[e._v("version-0.4.22")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/groestlcoin-lightning-charge/v0.4.22/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/groestlcoin-lightning-charge",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/groestlcoin-lightning-charge",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/groestlcoin-spark")]),e._v(" "),t("td",[e._v("version-0.2.16")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/groestlcoin-spark/v0.2.16/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/groestlcoin-spark",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/groestlcoin-spark",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/eclair")]),e._v(" "),t("td",[e._v("v0.6.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/eclair/v0.6.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/eclair",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("groestlcoin/lnd")]),e._v(" "),t("td",[e._v("v0.10.0-grs")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Groestlcoin/lnd/v0.10.0-grs/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Groestlcoin/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/groestlcoin/lnd",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/groestlcoin")]),e._v(" "),t("td",[e._v("25.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Groestlcoin/25.0/Groestlcoin/25.0/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Groestlcoin/25.0/Groestlcoin/25.0/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Groestlcoin/25.0/Groestlcoin/25.0/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/groestlcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/elements")]),e._v(" "),t("td",[e._v("23.2.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Elements/23.2.3/Elements/23.2.3/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Elements/23.2.3/Elements/23.2.3/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Elements/23.2.3/Elements/23.2.3/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/elements",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("btcpayserver/litecoin")]),e._v(" "),t("td",[e._v("0.21.2.1-2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Litecoin/0.21.2.1-2/Litecoin/0.21.2.1/linuxamd64.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Litecoin/0.21.2.1-2/Litecoin/0.21.2.1/linuxarm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/btcpayserver/dockerfile-deps/Litecoin/0.21.2.1-2/Litecoin/0.21.2.1/linuxarm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/btcpayserver/dockerfile-deps",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/btcpayserver/litecoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("wakiyamap/docker-monacoin")]),e._v(" "),t("td",[e._v("0.20.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/wakiyamap/docker-bitcoin/master/monacoin/0.20.2/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/wakiyamap/docker-bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/wakiyamap/docker-monacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("redis")]),e._v(" "),t("td",[e._v("6.2.2-buster")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/docker-library/redis/f1a8498333ae3ab340b5b39fbac1d7e1dc0d628c/5.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/docker-library/redis",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/redis",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("jvandrew/btcqbo")]),e._v(" "),t("td",[e._v("0.3.36")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/JeffVandrewJr/btcqbo/v0.3.36/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/JeffVandrewJr/btcqbo",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/jvandrew/btcqbo",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("shesek/bwt")]),e._v(" "),t("td",[e._v("0.2.2-electrum")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/bwt-dev/bwt/v0.2.2/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/bwt-dev/bwt/v0.2.2/docker/arm32v7.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/bwt-dev/bwt/v0.2.2/docker/arm64v8.Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/bwt-dev/bwt",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/shesek/bwt",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chatwoot/chatwoot")]),e._v(" "),t("td",[e._v("v1.7.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/chatwoot/chatwoot/v1.7.0/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/chatwoot/chatwoot/v1.7.0/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/chatwoot/chatwoot/v1.7.0/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/chatwoot/chatwoot",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chatwoot/chatwoot",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("lukechilds/electrumx")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lukechilds/docker-electrumx/master/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/lukechilds/docker-electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/lukechilds/electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("fireflyiii/core")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/66fb773b-063e-42d7-b6a5-e7729a22e8b3/_apis/git/repositories/e9c3dcf8-4533-4ef1-83cc-75527cab3377/items?path=%2FDockerfile&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/66fb773b-063e-42d7-b6a5-e7729a22e8b3/_apis/git/repositories/e9c3dcf8-4533-4ef1-83cc-75527cab3377/items?path=%2FDockerfile&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/66fb773b-063e-42d7-b6a5-e7729a22e8b3/_apis/git/repositories/e9c3dcf8-4533-4ef1-83cc-75527cab3377/items?path=%2FDockerfile&versionDescriptor%5BversionOptions%5D=0&versionDescriptor%5BversionType%5D=0&versionDescriptor%5Bversion%5D=main&resolveLfs=true&%24format=octetStream&api-version=5.0&download=true",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://dev.azure.com/Firefly-III/_git/MainImage",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/fireflyiii/core",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("podcastindexorg/podcasting20-helipad")]),e._v(" "),t("td",[e._v("v0.1.10")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Podcastindex-org/helipad/v0.1.10/umbrel/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Podcastindex-org/helipad/v0.1.10/umbrel/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/Podcastindex-org/helipad/v0.1.10/umbrel/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/Podcastindex-org/helipad",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/podcastindexorg/podcasting20-helipad",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("jvandrew/librepatron")]),e._v(" "),t("td",[e._v("0.7.39")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/JeffVandrewJr/patron/v0.7.39/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/jvandrew/librepatron",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("jvandrew/isso")]),e._v(" "),t("td",[e._v("atron.22")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/JeffVandrewJr/isso/patron.22/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/JeffVandrewJr/isso",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/jvandrew/isso",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("lightninglabs/lightning-terminal")]),e._v(" "),t("td",[e._v("v0.13.5-alpha-path-prefix")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lightninglabs/lightning-terminal/v0.13.5-alpha/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lightninglabs/lightning-terminal/v0.13.5-alpha/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/lightninglabs/lightning-terminal",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("mempool/frontend")]),e._v(" "),t("td",[e._v("v2.5.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/frontend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/frontend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/frontend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/mempool/mempool",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/mempool/frontend",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("mempool/backend")]),e._v(" "),t("td",[e._v("v2.5.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/backend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/backend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/mempool/mempool/v2.5.0/docker/backend/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/mempool/mempool",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/mempool/backend",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("mariadb")]),e._v(" "),t("td",[e._v("10.11")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/docker-library/mariadb/master/10.11/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/docker-library/mariadb",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/mariadb",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("kukks/nnostr-relay")]),e._v(" "),t("td",[e._v("v0.0.23")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/kukks/nnostr/Relay/v0.0.23/Relay/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/kukks/nnostr/Relay/v0.0.23/Relay/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/kukks/nnostr/Relay/v0.0.23/Relay/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/kukks/nnostr",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/kukks/nnostr-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("sphinxlightning/sphinx-relay")]),e._v(" "),t("td",[e._v("v2.2.9")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/stakwork/sphinx-relay/v2.2.9/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/stakwork/sphinx-relay/v2.2.9/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/stakwork/sphinx-relay/v2.2.9/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/stakwork/sphinx-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/sphinxlightning/sphinx-relay",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("djbooth007/tallycoin_connect")]),e._v(" "),t("td",[e._v("v1.8.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/djbooth007/tallycoin_connect/v1.8.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/djbooth007/tallycoin_connect/v1.8.0/Dockerfile.arm32v7",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/djbooth007/tallycoin_connect/v1.8.0/Dockerfile.arm64v8",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("benjaminchodroff/rust-teos")]),e._v(" "),t("td",[e._v("latest")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/benjaminchodroff/rust-teos/master/docker/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/benjaminchodroff/rust-teos",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/benjaminchodroff/rust-teos",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("apotdevin/thunderhub")]),e._v(" "),t("td",[e._v("base-v0.13.31")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/apotdevin/thunderhub/v0.13.31/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/apotdevin/thunderhub/v0.13.31/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/apotdevin/thunderhub/v0.13.31/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/apotdevin/thunderhub",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/apotdevin/thunderhub",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("lncapital/torq")]),e._v(" "),t("td",[e._v("0.20.3")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lncapital/torq/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lncapital/torq/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/lncapital/torq/master/README.md",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/lncapital/torq",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/lncapital/torq",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("timescale/timescaledb")]),e._v(" "),t("td",[e._v("latest-pg14")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/timescale/timescaledb-docker/main/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/timescale/timescaledb-docker/main/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/timescale/timescaledb-docker/main/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/timescale/timescaledb-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/timescale/timescaledb",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("zammad/zammad-docker-compose")]),e._v(" "),t("td",[e._v("zammad-postgresql-3.4.0-4")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/zammad/zammad-docker-compose/ff20084ce2829486076e9781fe27407ca6cc09bb/containers/zammad-postgresql/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/zammad/zammad-docker-compose",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/zammad/zammad-docker-compose",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("memcached")]),e._v(" "),t("td",[e._v("1.5.22-alpine")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/docker-library/memcached/eb38bf28263b8e5bb7367797cb7b181b65d769bd/alpine/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/docker-library/memcached",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/memcached",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("traefik")]),e._v(" "),t("td",[e._v("v2.6")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/containous/traefik-library-image/master/scratch/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/containous/traefik-library-image",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/_/traefik",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("chekaz/docker-trezarcoin")]),e._v(" "),t("td",[e._v("0.13.0")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/ChekaZ/docker/master/trezarcoin/1.2.0/Dockerfile",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/ChekaZ/docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/chekaz/docker-trezarcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])]),e._v(" "),t("tr",[t("td",[e._v("romanornr/docker-viacoin")]),e._v(" "),t("td",[e._v("0.15.2")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://raw.githubusercontent.com/viacoin/docker-viacoin/master/viacoin/0.15.2/docker-viacoin",target:"_blank",rel:"noopener noreferrer"}},[t("OutboundLink")],1)]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}}),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[t("a",{attrs:{href:"https://github.com/viacoin/docker-viacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" - "),t("a",{attrs:{href:"https://hub.docker.com/r/romanornr/docker-viacoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("DockerHub"),t("OutboundLink")],1)])])])]),e._v(" "),t("h1",{attrs:{id:"faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),t("h2",{attrs:{id:"how-can-i-modify-my-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-modify-my-environment"}},[e._v("#")]),e._v(" How can I modify my environment?")]),e._v(" "),t("p",[e._v("As root, run "),t("code",[e._v(". btcpay-setup.sh")]),e._v("; this will show you the environment variable it is expecting.\nFor example, if you support "),t("code",[e._v("btc")]),e._v(" and "),t("code",[e._v("ltc")]),e._v(" already, and want to add "),t("code",[e._v("btg")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO3")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'btg'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("h2",{attrs:{id:"i-deployed-before-btcpay-setupsh-existed-before-may-17-2018-can-i-migrate-to-this-new-system"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-deployed-before-btcpay-setupsh-existed-before-may-17-2018-can-i-migrate-to-this-new-system"}},[e._v("#")]),e._v(" I deployed before "),t("code",[e._v("btcpay-setup.sh")]),e._v(" existed (before May 17, 2018), can I migrate to this new system?")]),e._v(" "),t("p",[e._v("Yes, run the following commands to update:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$DOWNLOAD_ROOT")]),e._v("/btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout master\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" pull\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout 9acb5d8067cb5c46f59858137feb699b41ac9f19\nbtcpay-update.sh\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout master\nbtcpay-update.sh\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exit")]),e._v("\n")])])]),t("h2",{attrs:{id:"im-getting-an-error-on-windows-cannot-create-container-for-service-docker-mount-denied"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#im-getting-an-error-on-windows-cannot-create-container-for-service-docker-mount-denied"}},[e._v("#")]),e._v(" I'm getting an error on Windows: "),t("code",[e._v("Cannot create container for service docker: Mount denied")]),e._v("?")]),e._v(" "),t("p",[e._v("If you see this error:")]),e._v(" "),t("p",[t("code",[e._v("Cannot create container for service docker: b'Mount denied:\\nThe source path \"\\\\\\\\var\\\\\\\\run\\\\\\\\docker.sock:/var/run/docker.sock\"\\nis not a valid Windows path'")]),e._v(".")]),e._v(" "),t("p",[e._v("Run this in "),t("a",{attrs:{href:"https://docs.microsoft.com/en-us/powershell/scripting/windows-powershell/starting-windows-powershell",target:"_blank",rel:"noopener noreferrer"}},[e._v("powershell"),t("OutboundLink")],1),e._v(":")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$Env")]),e._v(":COMPOSE_CONVERT_WINDOWS_PATHS=1\n")])])]),t("p",[e._v("Then, run "),t("code",[e._v("docker-compose -f EXAMPLE.yml up")]),e._v(".")]),e._v(" "),t("p",[e._v("This bug comes from Docker for Windows and is "),t("a",{attrs:{href:"https://github.com/docker/for-win/issues/1829",target:"_blank",rel:"noopener noreferrer"}},[e._v("tracked on Github"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-i-can-prune-my-nodes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-i-can-prune-my-nodes"}},[e._v("#")]),e._v(" How I can prune my node(s)?")]),e._v(" "),t("p",[e._v("This will prune your Bitcoin full node to a maximum of 100GB (of blocks):")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-save-storage"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("Other options are "),t("a",{attrs:{href:"#generated-docker-compose"}},[e._v("documented here")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-can-i-customize-the-generated-docker-compose-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-customize-the-generated-docker-compose-file"}},[e._v("#")]),e._v(" How can I customize the generated docker-compose file?")]),e._v(" "),t("p",[e._v("In some instances, you might want to customize your environment in more detail. While you could modify "),t("code",[e._v("Generated/docker-compose.generated.yml")]),e._v(" manually, your changes would be overwritten the next time you run "),t("code",[e._v("btcpay-update.sh")]),e._v(".")]),e._v(" "),t("p",[e._v("Luckily, you can leverage "),t("code",[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(" for this!")]),e._v(" "),t("p",[e._v("Let's enable "),t("strong",[e._v("pruning to 60 GB")]),e._v(", for example:")]),e._v(" "),t("p",[e._v("First, copy "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-save-storage.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-save-storage"),t("OutboundLink")],1),e._v(" into the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments",target:"_blank",rel:"noopener noreferrer"}},[e._v("the docker fragment folder"),t("OutboundLink")],1),e._v(" as "),t("code",[e._v("opt-save-storage.custom.yml")]),e._v(". "),t("strong",[e._v("Important:")]),e._v(" the file must end with "),t("code",[e._v(".custom.yml")]),e._v(", or there will be git conflicts whenever you run "),t("code",[e._v("btcpay-update.sh")]),e._v(".")]),e._v(" "),t("p",[e._v("Modify the new "),t("code",[e._v("opt-save-storage.custom.yml")]),e._v(" file to your taste:")]),e._v(" "),t("div",{staticClass:"language-diff extra-class"},[t("pre",{pre:!0,attrs:{class:"language-diff"}},[t("code",[e._v('@@ -14,8 +14,7 @@ version: "3"\n'),t("span",{pre:!0,attrs:{class:"token unchanged"}},[t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v("services:\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" bitcoind:\n")]),t("span",{pre:!0,attrs:{class:"token prefix unchanged"}},[e._v(" ")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" environment:\n")])]),t("span",{pre:!0,attrs:{class:"token deleted-sign deleted"}},[t("span",{pre:!0,attrs:{class:"token prefix deleted"}},[e._v("-")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" BITCOIN_EXTRA_ARGS: prune=100000\n")])]),t("span",{pre:!0,attrs:{class:"token inserted-sign inserted"}},[t("span",{pre:!0,attrs:{class:"token prefix inserted"}},[e._v("+")]),t("span",{pre:!0,attrs:{class:"token line"}},[e._v(" BITCOIN_EXTRA_ARGS: prune=60000\n")])])])])]),t("p",[e._v("Then set it up:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-save-storage.custom"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("h2",{attrs:{id:"can-i-run-btcpay-server-on-ports-other-than-80-and-443"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-run-btcpay-server-on-ports-other-than-80-and-443"}},[e._v("#")]),e._v(" Can I run BTCPay Server on ports other than 80 and 443?")]),e._v(" "),t("p",[e._v("You can change the ports for HTTP and HTTPS by setting the environment variables "),t("code",[e._v("REVERSEPROXY_HTTP_PORT")]),e._v(" and "),t("code",[e._v("REVERSEPROXY_HTTPS_PORT")]),e._v(". This is handy when ports 80 and 443 are already in use on your host, or you want to offload SSL termination with an existing web proxy.")]),e._v(" "),t("p",[e._v("When you set "),t("code",[e._v("REVERSEPROXY_HTTP_PORT")]),e._v(" to another value than 80, the built-in Let's Encrypt certificate will not work, as Let's Encrypt will try to validate your SSL certificate request by connecting from the internet to your domain on port 80. This validation request should be able to reach BTCPay Server in order to receive the certificate.")]),e._v(" "),t("p",[e._v("If you need to run on a different port, it's best to terminate SSL using another web proxy and forward your traffic.")]),e._v(" "),t("h2",{attrs:{id:"can-i-offload-https-termination"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-offload-https-termination"}},[e._v("#")]),e._v(" Can I offload HTTPS termination?")]),e._v(" "),t("p",[e._v("Yes. Please "),t("RouterLink",{attrs:{to:"/FAQ/FAQ-Deployment/#can-i-use-an-existing-nginx-server-as-a-reverse-proxy-with-ssl-termination"}},[e._v("see the documentation")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"how-can-i-back-up-my-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-back-up-my-btcpay-server"}},[e._v("#")]),e._v(" How can I back up my BTCPay Server?")]),e._v(" "),t("p",[e._v("See the "),t("RouterLink",{attrs:{to:"/Docker/backup-restore/"}},[e._v("Backup & Restore")]),e._v(" guide in our documentation.")],1),e._v(" "),t("details",[t("summary",[e._v("For backwards compatibility: Click here for the description of the old backup.sh process")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Please consider switching to the "),t("RouterLink",{attrs:{to:"/Docker/backup-restore/"}},[e._v("new Backup & Restore process")]),e._v(", because the "),t("code",[e._v("backup.sh")]),e._v(" will not be maintained anymore.")],1)]),e._v(" "),t("p",[e._v("We provide a backup script that dumps the database and saves the important files:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v('/btcpayserver-docker"')]),e._v("\n./backup.sh\n")])])]),t("p",[e._v("This will save the backup locally as "),t("code",[e._v("/var/lib/docker/volumes/backup_datadir/_data/backup.tar.gz")]),e._v(".\nThese are the options to customize the backup name and location:")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("BACKUP_TIMESTAMP=true")]),e._v(" saves the backup with datetime as part of the file name, so that backups do not get overwritten.")]),e._v(" "),t("li",[t("code",[e._v("BACKUP_PROVIDER=SCP")]),e._v(" saves the backup remotely, requires additional "),t("code",[e._v("SCP_TARGET")]),e._v(" environment variable (see below).")]),e._v(" "),t("li",[t("code",[e._v("BACKUP_PROVIDER=Dropbox")]),e._v(" saves the backup to Dropbox, requires additional "),t("code",[e._v("DROPBOX_TOKEN")]),e._v(" environment variable (see below).")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v('/btcpayserver-docker"')]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Backup with custom file name and timestamp:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_TIMESTAMP")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("true ./backup.sh\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Backup via SCP:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_PROVIDER")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("SCP "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("SCP_TARGET")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("myhost:backups/btcpay ./backup.sh\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Backup to Dropbox:")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BACKUP_PROVIDER")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("Dropbox "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("DROPBOX_TOKEN")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("myDropboxToken ./backup.sh\n")])])]),t("p",[e._v("You can also choose to only dump the database.\nThis option does not need to stop and restart the docker-containers:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v('/btcpayserver-docker"')]),e._v("\n./backup.sh --only-db\n")])])])]),e._v(" "),t("h2",{attrs:{id:"how-can-i-connect-to-the-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-connect-to-the-database"}},[e._v("#")]),e._v(" How can I connect to the database?")]),e._v(" "),t("p",[e._v("On the server you can open a database session by connecting via "),t("code",[e._v("psql")]),e._v(" as the postgres user:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exec")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-ti")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ps")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-a")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-q")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-f")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"name=postgres_1"')]),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v(")")])]),e._v(" psql "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-U")]),e._v(" postgres\n")])])]),t("p",[e._v("Then, inside "),t("code",[e._v("psql")]),e._v(" you can select a database and interact with the tables:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list databases")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("l\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# connect to database")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("c btcpayservermainnet\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list tables")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("dt\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list users")]),e._v("\nSELECT "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Id"')]),e._v(", "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Email"')]),e._v(" FROM "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"AspNetUsers"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# end session")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("q\n")])])]),t("p",[e._v("The main BTCPay Server database tables are part of the "),t("code",[e._v("public")]),e._v(" schema.\nPlugins have their own schema, named after the plugin.")]),e._v(" "),t("p",[e._v("By default, only the tables of the "),t("code",[e._v("public")]),e._v(" schema are shown.\nIf you want to also see and select the plugin tables, you need to extend the search path:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# list plugin schemas")]),e._v("\nSELECT * FROM pg_catalog.pg_namespace WHERE nspname LIKE "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'BTCPayServer.%'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# extend search path")]),e._v("\nSET search_path TO "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"BTCPayServer.Plugins.MyPlugin"')]),e._v(", public"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# table list now also shows the MyPlugin tables")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("dt\n")])])]),t("h2",{attrs:{id:"how-do-i-upgrade-my-btcpay-server-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-upgrade-my-btcpay-server-docker"}},[e._v("#")]),e._v(" How do I upgrade my BTCPay Server docker?")]),e._v(" "),t("p",[e._v("Run the script "),t("code",[e._v("./btcpay-update.sh")]),e._v(" and patiently wait for your server to be upgraded.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/133.15c24758.js b/assets/js/133.2f039671.js similarity index 99% rename from assets/js/133.15c24758.js rename to assets/js/133.2f039671.js index 6b0bf025fd..ddf36a4fcd 100644 --- a/assets/js/133.15c24758.js +++ b/assets/js/133.2f039671.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[133],{823:function(e,t,a){"use strict";a.r(t);var s=a(17),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"backup-restore"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#backup-restore"}},[e._v("#")]),e._v(" Backup & Restore")]),e._v(" "),t("p",[e._v("This guide gets you up to speed with the "),t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("Docker deployment")]),e._v("'s Backup & Restore process.\nYou will learn about what to keep in mind when doing a backup and how to restore a backup.")],1),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#remarks-and-considerations"}},[e._v("Remarks and Considerations")]),t("ul",[t("li",[t("a",{attrs:{href:"#lightning-channel-backup"}},[e._v("Lightning channel backup")])])])]),t("li",[t("a",{attrs:{href:"#how-does-the-backup-work"}},[e._v("How does the backup work?")]),t("ul",[t("li",[t("a",{attrs:{href:"#set-a-backup-passphrase"}},[e._v("Set a backup passphrase")])]),t("li",[t("a",{attrs:{href:"#automation-by-crontab"}},[e._v("Automation by crontab")])])])]),t("li",[t("a",{attrs:{href:"#how-to-restore"}},[e._v("How to restore?")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"remarks-and-considerations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#remarks-and-considerations"}},[e._v("#")]),e._v(" Remarks and Considerations")]),e._v(" "),t("p",[e._v("The original backups strategy in BTCPay Server still exists and can be found "),t("RouterLink",{attrs:{to:"/Docker/#how-can-i-back-up-my-btcpay-server"}},[e._v("here")]),e._v(".\nWhile this documentation covers the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/pull/641",target:"_blank",rel:"noopener noreferrer"}},[e._v("new process"),t("OutboundLink")],1),e._v(", the old "),t("code",[e._v("backup.sh")]),e._v(" script still works.")],1),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("BTCPay Server is and will never be responsible for your backup.\nPlease make sure the backup includes the files and data you want to store.\nAlso, test the restore process before starting to rely on it.")])]),e._v(" "),t("h3",{attrs:{id:"lightning-channel-backup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lightning-channel-backup"}},[e._v("#")]),e._v(" Lightning channel backup")]),e._v(" "),t("p",[e._v("Please be aware of this important issue:\nOld Lightning channel state is toxic!\nYou can lose all your funds if you close a channel based on an outdated state and the state changes often!\nIf you publish an old state (say from yesterday's backup), you will most likely lose all your funds in the channel because the counterparty might publish a "),t("a",{attrs:{href:"https://www.d11n.net/lightning-network-payment-channel-lifecycle.html#what-happens-in-case-of-a-false-close%3F",target:"_blank",rel:"noopener noreferrer"}},[e._v("revocation transaction"),t("OutboundLink")],1),e._v("!")]),e._v(" "),t("p",[e._v("There is a high chance of failure in a disaster recovery scenario, where you may do a backup once per night and need to restore that one backup.")]),e._v(" "),t("p",[e._v("The Lightning channel backup from the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" script will be sufficient in a migration case, where the shutdown of the old server happens cleanly.\nThe old server should not be started after the restoration and start of the new server.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("The Lightning static channel backup should be watched by a script and copied over to a remote server to ensure you always have the latest state available.\nWe will provide such a script with a future update.\nFor now, keep the above in mind when restoring from the backup!")])]),e._v(" "),t("h2",{attrs:{id:"how-does-the-backup-work"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-the-backup-work"}},[e._v("#")]),e._v(" How does the backup work?")]),e._v(" "),t("p",[e._v("The backup process is run with the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" script.")]),e._v(" "),t("p",[e._v("Log in to your server, switch to the "),t("code",[e._v("root")]),e._v(" user and type the following:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# The backup script needs to be run as the root user")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# As the other scripts, it is inside the BTCPay base directory")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n./btcpay-backup.sh\n")])])]),t("p",[e._v("The backup process needs to be run as "),t("code",[e._v("root")]),e._v(".\nIt will check for and let you know if you have to switch users.")]),e._v(" "),t("p",[e._v("The script will do the following steps:")]),e._v(" "),t("ul",[t("li",[e._v("Ensure the database container is running")]),e._v(" "),t("li",[e._v("Make a dump of the database")]),e._v(" "),t("li",[e._v("Stop BTCPay Server")]),e._v(" "),t("li",[e._v("Archive the Docker volumes and database dump\n"),t("ul",[t("li",[e._v("Excluding the blockchains "),t("code",[e._v("blocks")]),e._v(" and "),t("code",[e._v("chainstate")]),e._v(" directories")]),e._v(" "),t("li",[e._v("Optional: "),t("a",{attrs:{href:"#set-a-backup-passphrase"}},[e._v("Encrypt the archive")])])])]),e._v(" "),t("li",[e._v("Restart BTCPay Server")]),e._v(" "),t("li",[e._v("Cleanup: Remove temporary files like the database dump")])]),e._v(" "),t("p",[e._v("If the backup directory doesn't exist yet, the script will create it.\nWith these preparations taken, the backup process is now starting.")]),e._v(" "),t("p",[e._v("The script has checks to ensure it either works or fails with a comprehensive error message at every step of the way.\nIf there are errors, you will be notified like this:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" Database container could not be started or found.\n")])])]),t("p",[e._v("If everything works smoothly, you will see multiple completed marks in your console.\nWhenever the backup has completed successfully, it will state:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" Backup done => /var/lib/docker/volumes/backup_datadir/_data/backup.tar.gz\n")])])]),t("p",[e._v("Your BTCPay Server has now finished the backup process.\nYou must store these backups safely, for instance, by copying them to a remote server.")]),e._v(" "),t("p",[e._v("After making a backup the first time, it is always wise to at least test your backup in a restore scenario.\nWe will go over the extra options you can set with your backup in the next topic.")]),e._v(" "),t("h3",{attrs:{id:"set-a-backup-passphrase"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-a-backup-passphrase"}},[e._v("#")]),e._v(" Set a backup passphrase")]),e._v(" "),t("p",[e._v("You can set the "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" environment variable for encrypting the backup.\nThis passphrase will be used by the backup and restore scripts to encrypt and decrypt the backup file.\nFor the backup script, this would look like the following:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Set the passphrase without adding it to the shell history")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("read")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-p")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Enter passphrase: "')]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n\n./btcpay-backup.sh\n")])])]),t("p",[e._v("This "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" if set, is necessary to be in the "),t("a",{attrs:{href:"#how-to-restore"}},[e._v("restore process")]),e._v(" as well.")]),e._v(" "),t("h3",{attrs:{id:"automation-by-crontab"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automation-by-crontab"}},[e._v("#")]),e._v(" Automation by crontab")]),e._v(" "),t("p",[e._v("Here is an example of a crontab script that does a nightly backup at 4:15 AM:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("SHELL=/bin/bash\nPATH=/bin:/usr/sbin:/usr/bin:/usr/local/bin\n15 4 * * * /root/BTCPayServer/btcpayserver-docker/btcpay-backup.sh >/dev/null 2>&1\n")])])]),t("p",[e._v("You need to set the right "),t("code",[e._v("SHELL")]),e._v(" and "),t("code",[e._v("PATH")]),e._v(", so that the script can run with the correct context.\nYou might also want to set the "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" environment variable.")]),e._v(" "),t("p",[e._v("Also ensure the base path (here "),t("code",[e._v("/root/BTCPayServer")]),e._v(") matches the output of "),t("code",[e._v("echo $BTCPAY_BASE_DIRECTORY")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-restore"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-restore"}},[e._v("#")]),e._v(" How to restore?")]),e._v(" "),t("p",[e._v("It's very similar to the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" process but in reverse.\nThe "),t("code",[e._v("btcpay-restore.sh")]),e._v(" script needs to be run with the path to your "),t("code",[e._v("backup.tar.gz")]),e._v(" file.")]),e._v(" "),t("p",[e._v("First off, open a terminal and type the following as root.\nRemember that if you set "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" on the backup, you also need to provide it for decryption :")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# The restore script needs to be run as the root user")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# As the other scripts, it is inside the BTCPay base directory")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Optional: Set the passphrase if you have used one for the backup")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("read")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-p")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Enter passphrase: "')]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run the restore script with the full path to the backup file")]),e._v("\n./btcpay-restore.sh /var/backups/backup.tar.gz.gpg\n")])])]),t("p",[e._v("The script will do the following steps:")]),e._v(" "),t("ul",[t("li",[e._v("Extract (and decrypt) the backup archive")]),e._v(" "),t("li",[e._v("Stop BTCPay Server")]),e._v(" "),t("li",[e._v("Restore the Docker volumes")]),e._v(" "),t("li",[e._v("Start the database container")]),e._v(" "),t("li",[e._v("Import the database dump")]),e._v(" "),t("li",[e._v("Restart BTCPay Server")]),e._v(" "),t("li",[e._v("Cleanup: Remove the temporary restore directory")])]),e._v(" "),t("p",[e._v("If the backup file cannot be found in the provided path, the script will exit with an error.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" /var/backups/backup.tar.gz.gpg does not exist.\n")])])]),t("p",[e._v("Just as the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" script, the restore will stop at ANY error it may encounter.\nIf the backup file was created while the "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" was set but not used on restoring, the following error would occur:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" Decryption failed. Please check the error message above.\n")])])]),t("p",[e._v("When the restore has completed, you get the message:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" Restore done\n")])])]),t("p",[e._v("Everything should be up and running again when the restore is complete.\nYou've successfully restored your BTCPay Server. Congratulations!")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Always make sure your backup strategy is tested and fits your needs.\nNo one solution fits all, and we tried to cover the basic cases.\nFor the latest updates, always feel free to ask on the BTCPay Server community channels.")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[133],{822:function(e,t,a){"use strict";a.r(t);var s=a(17),r=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"backup-restore"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#backup-restore"}},[e._v("#")]),e._v(" Backup & Restore")]),e._v(" "),t("p",[e._v("This guide gets you up to speed with the "),t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("Docker deployment")]),e._v("'s Backup & Restore process.\nYou will learn about what to keep in mind when doing a backup and how to restore a backup.")],1),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#remarks-and-considerations"}},[e._v("Remarks and Considerations")]),t("ul",[t("li",[t("a",{attrs:{href:"#lightning-channel-backup"}},[e._v("Lightning channel backup")])])])]),t("li",[t("a",{attrs:{href:"#how-does-the-backup-work"}},[e._v("How does the backup work?")]),t("ul",[t("li",[t("a",{attrs:{href:"#set-a-backup-passphrase"}},[e._v("Set a backup passphrase")])]),t("li",[t("a",{attrs:{href:"#automation-by-crontab"}},[e._v("Automation by crontab")])])])]),t("li",[t("a",{attrs:{href:"#how-to-restore"}},[e._v("How to restore?")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"remarks-and-considerations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#remarks-and-considerations"}},[e._v("#")]),e._v(" Remarks and Considerations")]),e._v(" "),t("p",[e._v("The original backups strategy in BTCPay Server still exists and can be found "),t("RouterLink",{attrs:{to:"/Docker/#how-can-i-back-up-my-btcpay-server"}},[e._v("here")]),e._v(".\nWhile this documentation covers the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/pull/641",target:"_blank",rel:"noopener noreferrer"}},[e._v("new process"),t("OutboundLink")],1),e._v(", the old "),t("code",[e._v("backup.sh")]),e._v(" script still works.")],1),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("BTCPay Server is and will never be responsible for your backup.\nPlease make sure the backup includes the files and data you want to store.\nAlso, test the restore process before starting to rely on it.")])]),e._v(" "),t("h3",{attrs:{id:"lightning-channel-backup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lightning-channel-backup"}},[e._v("#")]),e._v(" Lightning channel backup")]),e._v(" "),t("p",[e._v("Please be aware of this important issue:\nOld Lightning channel state is toxic!\nYou can lose all your funds if you close a channel based on an outdated state and the state changes often!\nIf you publish an old state (say from yesterday's backup), you will most likely lose all your funds in the channel because the counterparty might publish a "),t("a",{attrs:{href:"https://www.d11n.net/lightning-network-payment-channel-lifecycle.html#what-happens-in-case-of-a-false-close%3F",target:"_blank",rel:"noopener noreferrer"}},[e._v("revocation transaction"),t("OutboundLink")],1),e._v("!")]),e._v(" "),t("p",[e._v("There is a high chance of failure in a disaster recovery scenario, where you may do a backup once per night and need to restore that one backup.")]),e._v(" "),t("p",[e._v("The Lightning channel backup from the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" script will be sufficient in a migration case, where the shutdown of the old server happens cleanly.\nThe old server should not be started after the restoration and start of the new server.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("The Lightning static channel backup should be watched by a script and copied over to a remote server to ensure you always have the latest state available.\nWe will provide such a script with a future update.\nFor now, keep the above in mind when restoring from the backup!")])]),e._v(" "),t("h2",{attrs:{id:"how-does-the-backup-work"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-the-backup-work"}},[e._v("#")]),e._v(" How does the backup work?")]),e._v(" "),t("p",[e._v("The backup process is run with the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" script.")]),e._v(" "),t("p",[e._v("Log in to your server, switch to the "),t("code",[e._v("root")]),e._v(" user and type the following:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# The backup script needs to be run as the root user")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# As the other scripts, it is inside the BTCPay base directory")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n./btcpay-backup.sh\n")])])]),t("p",[e._v("The backup process needs to be run as "),t("code",[e._v("root")]),e._v(".\nIt will check for and let you know if you have to switch users.")]),e._v(" "),t("p",[e._v("The script will do the following steps:")]),e._v(" "),t("ul",[t("li",[e._v("Ensure the database container is running")]),e._v(" "),t("li",[e._v("Make a dump of the database")]),e._v(" "),t("li",[e._v("Stop BTCPay Server")]),e._v(" "),t("li",[e._v("Archive the Docker volumes and database dump\n"),t("ul",[t("li",[e._v("Excluding the blockchains "),t("code",[e._v("blocks")]),e._v(" and "),t("code",[e._v("chainstate")]),e._v(" directories")]),e._v(" "),t("li",[e._v("Optional: "),t("a",{attrs:{href:"#set-a-backup-passphrase"}},[e._v("Encrypt the archive")])])])]),e._v(" "),t("li",[e._v("Restart BTCPay Server")]),e._v(" "),t("li",[e._v("Cleanup: Remove temporary files like the database dump")])]),e._v(" "),t("p",[e._v("If the backup directory doesn't exist yet, the script will create it.\nWith these preparations taken, the backup process is now starting.")]),e._v(" "),t("p",[e._v("The script has checks to ensure it either works or fails with a comprehensive error message at every step of the way.\nIf there are errors, you will be notified like this:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" Database container could not be started or found.\n")])])]),t("p",[e._v("If everything works smoothly, you will see multiple completed marks in your console.\nWhenever the backup has completed successfully, it will state:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" Backup done => /var/lib/docker/volumes/backup_datadir/_data/backup.tar.gz\n")])])]),t("p",[e._v("Your BTCPay Server has now finished the backup process.\nYou must store these backups safely, for instance, by copying them to a remote server.")]),e._v(" "),t("p",[e._v("After making a backup the first time, it is always wise to at least test your backup in a restore scenario.\nWe will go over the extra options you can set with your backup in the next topic.")]),e._v(" "),t("h3",{attrs:{id:"set-a-backup-passphrase"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#set-a-backup-passphrase"}},[e._v("#")]),e._v(" Set a backup passphrase")]),e._v(" "),t("p",[e._v("You can set the "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" environment variable for encrypting the backup.\nThis passphrase will be used by the backup and restore scripts to encrypt and decrypt the backup file.\nFor the backup script, this would look like the following:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Set the passphrase without adding it to the shell history")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("read")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-p")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Enter passphrase: "')]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n\n./btcpay-backup.sh\n")])])]),t("p",[e._v("This "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" if set, is necessary to be in the "),t("a",{attrs:{href:"#how-to-restore"}},[e._v("restore process")]),e._v(" as well.")]),e._v(" "),t("h3",{attrs:{id:"automation-by-crontab"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automation-by-crontab"}},[e._v("#")]),e._v(" Automation by crontab")]),e._v(" "),t("p",[e._v("Here is an example of a crontab script that does a nightly backup at 4:15 AM:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("SHELL=/bin/bash\nPATH=/bin:/usr/sbin:/usr/bin:/usr/local/bin\n15 4 * * * /root/BTCPayServer/btcpayserver-docker/btcpay-backup.sh >/dev/null 2>&1\n")])])]),t("p",[e._v("You need to set the right "),t("code",[e._v("SHELL")]),e._v(" and "),t("code",[e._v("PATH")]),e._v(", so that the script can run with the correct context.\nYou might also want to set the "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" environment variable.")]),e._v(" "),t("p",[e._v("Also ensure the base path (here "),t("code",[e._v("/root/BTCPayServer")]),e._v(") matches the output of "),t("code",[e._v("echo $BTCPAY_BASE_DIRECTORY")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-restore"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-restore"}},[e._v("#")]),e._v(" How to restore?")]),e._v(" "),t("p",[e._v("It's very similar to the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" process but in reverse.\nThe "),t("code",[e._v("btcpay-restore.sh")]),e._v(" script needs to be run with the path to your "),t("code",[e._v("backup.tar.gz")]),e._v(" file.")]),e._v(" "),t("p",[e._v("First off, open a terminal and type the following as root.\nRemember that if you set "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" on the backup, you also need to provide it for decryption :")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# The restore script needs to be run as the root user")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# As the other scripts, it is inside the BTCPay base directory")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Optional: Set the passphrase if you have used one for the backup")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("read")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-p")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Enter passphrase: "')]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" BTCPAY_BACKUP_PASSPHRASE\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Run the restore script with the full path to the backup file")]),e._v("\n./btcpay-restore.sh /var/backups/backup.tar.gz.gpg\n")])])]),t("p",[e._v("The script will do the following steps:")]),e._v(" "),t("ul",[t("li",[e._v("Extract (and decrypt) the backup archive")]),e._v(" "),t("li",[e._v("Stop BTCPay Server")]),e._v(" "),t("li",[e._v("Restore the Docker volumes")]),e._v(" "),t("li",[e._v("Start the database container")]),e._v(" "),t("li",[e._v("Import the database dump")]),e._v(" "),t("li",[e._v("Restart BTCPay Server")]),e._v(" "),t("li",[e._v("Cleanup: Remove the temporary restore directory")])]),e._v(" "),t("p",[e._v("If the backup file cannot be found in the provided path, the script will exit with an error.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" /var/backups/backup.tar.gz.gpg does not exist.\n")])])]),t("p",[e._v("Just as the "),t("code",[e._v("btcpay-backup.sh")]),e._v(" script, the restore will stop at ANY error it may encounter.\nIf the backup file was created while the "),t("code",[e._v("BTCPAY_BACKUP_PASSPHRASE")]),e._v(" was set but not used on restoring, the following error would occur:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" Decryption failed. Please check the error message above.\n")])])]),t("p",[e._v("When the restore has completed, you get the message:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" Restore done\n")])])]),t("p",[e._v("Everything should be up and running again when the restore is complete.\nYou've successfully restored your BTCPay Server. Congratulations!")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Always make sure your backup strategy is tested and fits your needs.\nNo one solution fits all, and we tried to cover the basic cases.\nFor the latest updates, always feel free to ask on the BTCPay Server community channels.")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/134.2025ac8e.js b/assets/js/134.077860d7.js similarity index 98% rename from assets/js/134.2025ac8e.js rename to assets/js/134.077860d7.js index 30af1e39a6..96252f1455 100644 --- a/assets/js/134.2025ac8e.js +++ b/assets/js/134.077860d7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[134],{824:function(t,a,s){"use strict";s.r(a);var e=s(17),r=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"chatwoot-support"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#chatwoot-support"}},[t._v("#")]),t._v(" Chatwoot support")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://www.chatwoot.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Chatwoot"),a("OutboundLink")],1),t._v(" is a customer support tool for instant messaging channels which can help businesses provide exceptional customer support.")]),t._v(" "),a("h2",{attrs:{id:"how-to-use"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[t._v("#")]),t._v(" How to use")]),t._v(" "),a("ol",[a("li",[t._v("Connect as root to your server")]),t._v(" "),a("li",[t._v("create chatwoot configuration file where "),a("code",[t._v("{CONFIG DATA HERE}")]),t._v(" is replaced by settings from "),a("a",{attrs:{href:"https://www.chatwoot.com/docs/environment-variables",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1)])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" Generated/chatwoot-config.env "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("EOL\n{CONFIG DATA HERE}\n{CONFIG DATA HERE}\nEOL")]),t._v("\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[t._v("Add chatwoot as an option to your BTCPay deployment and set the host to use (point DNS to server as well)")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("CHATWOOT_HOST")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"chatwoot.xpayserver.com"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t._v(';opt-add-chatwoot"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Wait for BTPay to be online and then create the database for chatwoot")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exec")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-ti")]),t._v(" chatwoot "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sh")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"export DISABLE_DATABASE_ENVIRONMENT_CHECK=1 && bundle exec rails db:reset"')]),t._v("\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Go to chatwoot website at https://chatwoot.xpayserver.com and set up.")])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[134],{823:function(t,a,s){"use strict";s.r(a);var e=s(17),r=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"chatwoot-support"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#chatwoot-support"}},[t._v("#")]),t._v(" Chatwoot support")]),t._v(" "),a("p",[a("a",{attrs:{href:"https://www.chatwoot.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Chatwoot"),a("OutboundLink")],1),t._v(" is a customer support tool for instant messaging channels which can help businesses provide exceptional customer support.")]),t._v(" "),a("h2",{attrs:{id:"how-to-use"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[t._v("#")]),t._v(" How to use")]),t._v(" "),a("ol",[a("li",[t._v("Connect as root to your server")]),t._v(" "),a("li",[t._v("create chatwoot configuration file where "),a("code",[t._v("{CONFIG DATA HERE}")]),t._v(" is replaced by settings from "),a("a",{attrs:{href:"https://www.chatwoot.com/docs/environment-variables",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),a("OutboundLink")],1)])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" Generated/chatwoot-config.env "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<<")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("EOL\n{CONFIG DATA HERE}\n{CONFIG DATA HERE}\nEOL")]),t._v("\n")])])]),a("ol",{attrs:{start:"3"}},[a("li",[t._v("Add chatwoot as an option to your BTCPay deployment and set the host to use (point DNS to server as well)")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("CHATWOOT_HOST")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"chatwoot.xpayserver.com"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t._v(';opt-add-chatwoot"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Wait for BTPay to be online and then create the database for chatwoot")])]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exec")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-ti")]),t._v(" chatwoot "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sh")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"export DISABLE_DATABASE_ENVIRONMENT_CHECK=1 && bundle exec rails db:reset"')]),t._v("\n")])])]),a("ol",{attrs:{start:"4"}},[a("li",[t._v("Go to chatwoot website at https://chatwoot.xpayserver.com and set up.")])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/135.e26c9dbb.js b/assets/js/135.6e9dd4bf.js similarity index 97% rename from assets/js/135.e26c9dbb.js rename to assets/js/135.6e9dd4bf.js index 0451aafdfd..9e19479999 100644 --- a/assets/js/135.e26c9dbb.js +++ b/assets/js/135.6e9dd4bf.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[135],{827:function(s,e,t){"use strict";t.r(e);var a=t(17),r=Object(a.a)({},(function(){var s=this,e=s._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("h1",{attrs:{id:"firefly-iii-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#firefly-iii-support"}},[s._v("#")]),s._v(" Firefly III support")]),s._v(" "),e("p",[e("a",{attrs:{href:"https://www.firefly-iii.org/",target:"_blank",rel:"noopener noreferrer"}},[s._v("Firefly III"),e("OutboundLink")],1),s._v(" is a self-hosted financial manager.\nIt can help you keep track of expenses, income, budgets and everything in between. It supports credit cards, shared household accounts and savings accounts. Its pretty fancy. You should use it to save and organise money.")]),s._v(" "),e("h2",{attrs:{id:"how-to-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[s._v("#")]),s._v(" How to use")]),s._v(" "),e("ol",[e("li",[s._v("Connect as root to your server")]),s._v(" "),e("li",[s._v("Configure a domain's DNS to point to your server ip. e.g. "),e("code",[s._v("firefly.yourserver.org")])]),s._v(" "),e("li",[s._v("Add fireflyiii as an option to your docker deployment")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),s._v(';opt-add-fireflyiii"')]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("FIREFLY_HOST")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"firefly.yourserver.org"')]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-i")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v(" ./Tools/fireflyiii/init.sh\n")])])]),e("ol",{attrs:{start:"4"}},[e("li",[s._v("Access Firefly III at "),e("code",[s._v("firefly.yourserver.org")]),s._v(" and create your admin account.")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[135],{825:function(s,e,t){"use strict";t.r(e);var a=t(17),r=Object(a.a)({},(function(){var s=this,e=s._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":s.$parent.slotKey}},[e("h1",{attrs:{id:"firefly-iii-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#firefly-iii-support"}},[s._v("#")]),s._v(" Firefly III support")]),s._v(" "),e("p",[e("a",{attrs:{href:"https://www.firefly-iii.org/",target:"_blank",rel:"noopener noreferrer"}},[s._v("Firefly III"),e("OutboundLink")],1),s._v(" is a self-hosted financial manager.\nIt can help you keep track of expenses, income, budgets and everything in between. It supports credit cards, shared household accounts and savings accounts. Its pretty fancy. You should use it to save and organise money.")]),s._v(" "),e("h2",{attrs:{id:"how-to-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[s._v("#")]),s._v(" How to use")]),s._v(" "),e("ol",[e("li",[s._v("Connect as root to your server")]),s._v(" "),e("li",[s._v("Configure a domain's DNS to point to your server ip. e.g. "),e("code",[s._v("firefly.yourserver.org")])]),s._v(" "),e("li",[s._v("Add fireflyiii as an option to your docker deployment")])]),s._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[s._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),s._v(';opt-add-fireflyiii"')]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s._v("FIREFLY_HOST")]),e("span",{pre:!0,attrs:{class:"token operator"}},[s._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[s._v('"firefly.yourserver.org"')]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[s._v("-i")]),s._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[s._v(".")]),s._v(" ./Tools/fireflyiii/init.sh\n")])])]),e("ol",{attrs:{start:"4"}},[e("li",[s._v("Access Firefly III at "),e("code",[s._v("firefly.yourserver.org")]),s._v(" and create your admin account.")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/136.be9a6245.js b/assets/js/136.179f2907.js similarity index 99% rename from assets/js/136.be9a6245.js rename to assets/js/136.179f2907.js index 303ad30ea6..d83247ba33 100644 --- a/assets/js/136.be9a6245.js +++ b/assets/js/136.179f2907.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[136],{828:function(a,e,t){"use strict";t.r(e);var s=t(17),r=Object(s.a)({},(function(){var a=this,e=a._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"joinmarket-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#joinmarket-support"}},[a._v("#")]),a._v(" Joinmarket support")]),a._v(" "),e("p",[a._v("JoinMarket is software to create a special kind of bitcoin transaction called a CoinJoin transaction. Its aim is to improve the confidentiality and privacy of bitcoin transactions.")]),a._v(" "),e("p",[a._v("You will be able to use your bitcoin to help other protect their privacy, while earning a yield for this service.")]),a._v(" "),e("p",[a._v("See "),e("a",{attrs:{href:"https://github.com/JoinMarket-Org/JoinMarket-Docs/blob/master/High-level-design.md",target:"_blank",rel:"noopener noreferrer"}},[a._v("the documentation of the joinmarket project"),e("OutboundLink")],1),a._v(" for more details.")]),a._v(" "),e("p",[a._v("This is a very advanced functionality, and there is no easy way to recover if something goes wrong.")]),a._v(" "),e("p",[a._v("For hardcore bitcoiners only.")]),a._v(" "),e("h2",{attrs:{id:"how-to-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[a._v("#")]),a._v(" How to use")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a._v(';opt-add-joinmarket"')]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v(".")]),a._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-i")]),a._v("\n")])])]),e("p",[a._v("Then you need to setup your default joinmarket wallet:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh wallet-tool-generate\njm.sh set-wallet "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v("wallet_file_name"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v("password"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v("\n")])])]),e("p",[a._v("Once done, you will need to send some money to the joinmarket wallet:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh wallet-tool\n")])])]),e("h2",{attrs:{id:"how-to-change-joinmarket-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-change-joinmarket-configuration"}},[a._v("#")]),a._v(" How to change joinmarket configuration?")]),a._v(" "),e("p",[a._v("Connect to your container, and edit your configuration:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("vim")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$CONFIG")]),a._v("\n")])])]),e("h2",{attrs:{id:"managing-your-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#managing-your-wallet"}},[a._v("#")]),a._v(" Managing your wallet")]),a._v(" "),e("p",[a._v("By running "),e("code",[a._v("jm.sh")]),a._v(" without parameter, you will get a bunch of command that you can run such as:")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("Usage:\n------\n\nTooling to setup your joinmarket yield generator\n\n wallet-tool: Run wallet-tools.py on the wallet\n wallet-tool-generate: Generate a new wallet\n set-wallet: Set the wallet that the yield generator need to use\n bash: Open an interactive bash session in the joinmarket container\n receive-payjoin: Receive a payjoin payment\n sendpayment: Send a payjoin through coinjoin (password needed)\n\nExample:\n * jm.sh wallet-tool-generate\n * jm.sh set-wallet wallet.jmdat mypassword\n * jm.sh wallet-tool\n * jm.sh receive-payjoin \n * jm.sh sendpayment
    \n * jm.sh wallet-tool history\n * jm.sh bash\n")])])]),e("p",[a._v("Note "),e("code",[a._v("jm.sh")]),a._v(" commands are wrapper around joinmarket scripts. Those are just convenience command, you can always directly connect to the container via "),e("code",[a._v("jm.sh bash")]),a._v(" and achieve the same result with the joinmarket python scripts.")]),a._v(" "),e("h2",{attrs:{id:"getting-command-prompt-into-the-container"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-command-prompt-into-the-container"}},[a._v("#")]),a._v(" Getting command prompt into the container")]),a._v(" "),e("p",[a._v("You can connect to the container and have direct access to joinmarket scripts such as:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v("\nsendpayment.py wallet.jmdat "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("..")]),a._v(".\n")])])]),e("h2",{attrs:{id:"managing-the-services-such-as-yield-generators"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#managing-the-services-such-as-yield-generators"}},[a._v("#")]),a._v(" Managing the services such as yield generators")]),a._v(" "),e("p",[a._v("First connect to the container's bash")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v("\n")])])]),e("p",[a._v("You can list available services to run:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl status\n")])])]),e("p",[a._v("Which might show you")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("root"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" supervisorctl status\nob-watcher STOPPED Not started\nyg-privacyenhanced STOPPED Not started\nyield-generator-basic STOPPED Not started\n")])])]),e("p",[a._v("You can start a yield generator with:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl start yg-privacyenhanced\n")])])]),e("p",[a._v("*** Note that services will NOT be restarted automatically if the container restart. ***")]),a._v(" "),e("p",[a._v("If you want to automatically restart the service when the container restart,")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("vim")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$AUTO_START")]),a._v("\n")])])]),e("p",[a._v("Then remove the comment "),e("code",[a._v("#")]),a._v(" in front of the service name you want to automatically restart.")]),a._v(" "),e("h2",{attrs:{id:"ob-watcher"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ob-watcher"}},[a._v("#")]),a._v(" OB-Watcher")]),a._v(" "),e("p",[a._v("The "),e("code",[a._v("ob-watcher")]),a._v(" service allows you to "),e("a",{attrs:{href:"https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/orderbook.md",target:"_blank",rel:"noopener noreferrer"}},[a._v("see an order book"),e("OutboundLink")],1),a._v(".")]),a._v(" "),e("p",[a._v("You can activate it:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl start ob-watcher\n")])])]),e("p",[a._v("Then you can browse it by browsing "),e("code",[a._v("https://.com/obwatch/")])]),a._v(" "),e("h2",{attrs:{id:"troubleshooting"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[a._v("#")]),a._v(" Troubleshooting")]),a._v(" "),e("h3",{attrs:{id:"error-failed-to-load-wallet-you-need-to-remove-the-lock-file"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-failed-to-load-wallet-you-need-to-remove-the-lock-file"}},[a._v("#")]),a._v(" Error: Failed to load wallet, you need to remove the lock file")]),a._v(" "),e("p",[a._v("You might sometimes get the following error when running a python script for joinmarket:")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("Failed to load wallet, error message: RetryableStorageError('File is currently in use (locked by pid 12822). If this is a leftover from a crashed instance you need to remove the lock file `/root/.joinmarket/wallets/.wallet.jmdat.lock` manually.')\n")])])]),e("p",[a._v("This is because a service using the wallet is running, so you need to shut it down before running the command.")]),a._v(" "),e("p",[a._v("Check which service is running:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl status\n")])])]),e("p",[a._v("And stop it")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl stop yg-privacyenhanced\n")])])]),e("h3",{attrs:{id:"read-the-logs-of-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#read-the-logs-of-services"}},[a._v("#")]),a._v(" Read the logs of services")]),a._v(" "),e("p",[a._v("You can use the "),e("code",[a._v("supervisorctl tail")]),a._v(" command:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("tail")]),a._v(" yg-privacyenhanced\n")])])]),e("p",[a._v("You can also check the logs in the "),e("code",[a._v("$DATADIR/logs")]),a._v(" folder.")])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[136],{827:function(a,e,t){"use strict";t.r(e);var s=t(17),r=Object(s.a)({},(function(){var a=this,e=a._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[e("h1",{attrs:{id:"joinmarket-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#joinmarket-support"}},[a._v("#")]),a._v(" Joinmarket support")]),a._v(" "),e("p",[a._v("JoinMarket is software to create a special kind of bitcoin transaction called a CoinJoin transaction. Its aim is to improve the confidentiality and privacy of bitcoin transactions.")]),a._v(" "),e("p",[a._v("You will be able to use your bitcoin to help other protect their privacy, while earning a yield for this service.")]),a._v(" "),e("p",[a._v("See "),e("a",{attrs:{href:"https://github.com/JoinMarket-Org/JoinMarket-Docs/blob/master/High-level-design.md",target:"_blank",rel:"noopener noreferrer"}},[a._v("the documentation of the joinmarket project"),e("OutboundLink")],1),a._v(" for more details.")]),a._v(" "),e("p",[a._v("This is a very advanced functionality, and there is no easy way to recover if something goes wrong.")]),a._v(" "),e("p",[a._v("For hardcore bitcoiners only.")]),a._v(" "),e("h2",{attrs:{id:"how-to-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[a._v("#")]),a._v(" How to use")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a._v(';opt-add-joinmarket"')]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v(".")]),a._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-i")]),a._v("\n")])])]),e("p",[a._v("Then you need to setup your default joinmarket wallet:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh wallet-tool-generate\njm.sh set-wallet "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v("wallet_file_name"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v("<")]),a._v("password"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v("\n")])])]),e("p",[a._v("Once done, you will need to send some money to the joinmarket wallet:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh wallet-tool\n")])])]),e("h2",{attrs:{id:"how-to-change-joinmarket-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-change-joinmarket-configuration"}},[a._v("#")]),a._v(" How to change joinmarket configuration?")]),a._v(" "),e("p",[a._v("Connect to your container, and edit your configuration:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("vim")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$CONFIG")]),a._v("\n")])])]),e("h2",{attrs:{id:"managing-your-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#managing-your-wallet"}},[a._v("#")]),a._v(" Managing your wallet")]),a._v(" "),e("p",[a._v("By running "),e("code",[a._v("jm.sh")]),a._v(" without parameter, you will get a bunch of command that you can run such as:")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("Usage:\n------\n\nTooling to setup your joinmarket yield generator\n\n wallet-tool: Run wallet-tools.py on the wallet\n wallet-tool-generate: Generate a new wallet\n set-wallet: Set the wallet that the yield generator need to use\n bash: Open an interactive bash session in the joinmarket container\n receive-payjoin: Receive a payjoin payment\n sendpayment: Send a payjoin through coinjoin (password needed)\n\nExample:\n * jm.sh wallet-tool-generate\n * jm.sh set-wallet wallet.jmdat mypassword\n * jm.sh wallet-tool\n * jm.sh receive-payjoin \n * jm.sh sendpayment
    \n * jm.sh wallet-tool history\n * jm.sh bash\n")])])]),e("p",[a._v("Note "),e("code",[a._v("jm.sh")]),a._v(" commands are wrapper around joinmarket scripts. Those are just convenience command, you can always directly connect to the container via "),e("code",[a._v("jm.sh bash")]),a._v(" and achieve the same result with the joinmarket python scripts.")]),a._v(" "),e("h2",{attrs:{id:"getting-command-prompt-into-the-container"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-command-prompt-into-the-container"}},[a._v("#")]),a._v(" Getting command prompt into the container")]),a._v(" "),e("p",[a._v("You can connect to the container and have direct access to joinmarket scripts such as:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v("\nsendpayment.py wallet.jmdat "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[a._v("..")]),a._v(".\n")])])]),e("h2",{attrs:{id:"managing-the-services-such-as-yield-generators"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#managing-the-services-such-as-yield-generators"}},[a._v("#")]),a._v(" Managing the services such as yield generators")]),a._v(" "),e("p",[a._v("First connect to the container's bash")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("jm.sh "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("bash")]),a._v("\n")])])]),e("p",[a._v("You can list available services to run:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl status\n")])])]),e("p",[a._v("Which might show you")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("root"),e("span",{pre:!0,attrs:{class:"token operator"}},[a._v(">")]),a._v(" supervisorctl status\nob-watcher STOPPED Not started\nyg-privacyenhanced STOPPED Not started\nyield-generator-basic STOPPED Not started\n")])])]),e("p",[a._v("You can start a yield generator with:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl start yg-privacyenhanced\n")])])]),e("p",[a._v("*** Note that services will NOT be restarted automatically if the container restart. ***")]),a._v(" "),e("p",[a._v("If you want to automatically restart the service when the container restart,")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[a._v("vim")]),a._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$AUTO_START")]),a._v("\n")])])]),e("p",[a._v("Then remove the comment "),e("code",[a._v("#")]),a._v(" in front of the service name you want to automatically restart.")]),a._v(" "),e("h2",{attrs:{id:"ob-watcher"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#ob-watcher"}},[a._v("#")]),a._v(" OB-Watcher")]),a._v(" "),e("p",[a._v("The "),e("code",[a._v("ob-watcher")]),a._v(" service allows you to "),e("a",{attrs:{href:"https://github.com/JoinMarket-Org/joinmarket-clientserver/blob/master/docs/orderbook.md",target:"_blank",rel:"noopener noreferrer"}},[a._v("see an order book"),e("OutboundLink")],1),a._v(".")]),a._v(" "),e("p",[a._v("You can activate it:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl start ob-watcher\n")])])]),e("p",[a._v("Then you can browse it by browsing "),e("code",[a._v("https://.com/obwatch/")])]),a._v(" "),e("h2",{attrs:{id:"troubleshooting"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[a._v("#")]),a._v(" Troubleshooting")]),a._v(" "),e("h3",{attrs:{id:"error-failed-to-load-wallet-you-need-to-remove-the-lock-file"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#error-failed-to-load-wallet-you-need-to-remove-the-lock-file"}},[a._v("#")]),a._v(" Error: Failed to load wallet, you need to remove the lock file")]),a._v(" "),e("p",[a._v("You might sometimes get the following error when running a python script for joinmarket:")]),a._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[a._v("Failed to load wallet, error message: RetryableStorageError('File is currently in use (locked by pid 12822). If this is a leftover from a crashed instance you need to remove the lock file `/root/.joinmarket/wallets/.wallet.jmdat.lock` manually.')\n")])])]),e("p",[a._v("This is because a service using the wallet is running, so you need to shut it down before running the command.")]),a._v(" "),e("p",[a._v("Check which service is running:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl status\n")])])]),e("p",[a._v("And stop it")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl stop yg-privacyenhanced\n")])])]),e("h3",{attrs:{id:"read-the-logs-of-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#read-the-logs-of-services"}},[a._v("#")]),a._v(" Read the logs of services")]),a._v(" "),e("p",[a._v("You can use the "),e("code",[a._v("supervisorctl tail")]),a._v(" command:")]),a._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[a._v("supervisorctl "),e("span",{pre:!0,attrs:{class:"token function"}},[a._v("tail")]),a._v(" yg-privacyenhanced\n")])])]),e("p",[a._v("You can also check the logs in the "),e("code",[a._v("$DATADIR/logs")]),a._v(" folder.")])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/14.cfdc4e6b.js b/assets/js/14.f0a7b12d.js similarity index 88% rename from assets/js/14.cfdc4e6b.js rename to assets/js/14.f0a7b12d.js index 2b6de16240..c0b9dc0d8d 100644 --- a/assets/js/14.cfdc4e6b.js +++ b/assets/js/14.f0a7b12d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{332:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--19-troubleshoot-403-callback.51193927.png"},647:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--01-install-web.4d28e0bd.png"},648:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--02-install-upload.8972740d.png"},649:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--03-enable-plugin.1b4a6c9f.png"},650:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--04-add-new-payment-method.e5a94ee3.png"},651:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--05-payment-method-details.adf89c97.png"},652:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--06-payment-method-configuration-tab.45617db0.png"},653:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--07-account-manage.d477b8b4.png"},654:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--08-add-api-key.a58b2941.png"},655:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--09-permissions-and-select-store.9ccef388.png"},656:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--10-permissions-set.74d76936.png"},657:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--11-copy-api-key.94be9878.png"},658:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--12-copy-store-id.84c19f9f.png"},659:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--13-save-vm-payment-method-form.0a3e52bd.png"},660:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--14-create-webhook.1b6e4881.png"},661:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--15-webhook-payload-url.37a4f55f.png"},662:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--16-webhook-copy-secret.71b0dd07.png"},663:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--16-virtuemart-configuration-save.ee549862.png"},664:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--17-webhook-save.dfd4fca5.png"},665:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--18-troubleshoot-copy-callback-url.70d08e31.png"},897:function(e,t,a){"use strict";a.r(t);var o=a(17),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"joomla-virtuemart-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#joomla-virtuemart-integration"}},[e._v("#")]),e._v(" Joomla VirtueMart integration")]),e._v(" "),t("p",[e._v("This document explains how to "),t("strong",[e._v("integrate BTCPay Server into your Joomla VirtueMart store")]),e._v(".\nWatch the video below to go along the document |")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/k7XfybLAky0/hqdefault.jpg)"},attrs:{href:"https://youtu.be/k7XfybLAky0",title:"BTCPay Server - Joomla VirtueMart","data-id":"k7XfybLAky0"}},[t("iframe",{attrs:{title:"BTCPay Server - Joomla VirtueMart","data-src":"https://www.youtube-nocookie.com/embed/k7XfybLAky0?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Please ensure that you meet the following requirements before installing this plugin.")]),e._v(" "),t("ul",[t("li",[e._v("PHP version 7.4 or newer")]),e._v(" "),t("li",[e._v("The curl, gd, intl, json, and mbstring PHP extensions are available")]),e._v(" "),t("li",[e._v("A VirtueMart 3 / 4 store ("),t("a",{attrs:{href:"https://www.virtuemart.net/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download and installation instructions"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("You have a BTCPay Server version 1.3.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've a wallet connected to your store")])],1)]),e._v(" "),t("h2",{attrs:{id:"1-install-btcpay-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-install-btcpay-plugin"}},[e._v("#")]),e._v(" 1. Install BTCPay Plugin")]),e._v(" "),t("p",[e._v("There are three ways to "),t("strong",[e._v("download BTCPay for VirtueMart plugin")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Via the Admin Dashboard (recommended, see below)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://extensions.joomla.org/extension/vm-payment-btcpay-for-virtuemart/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Joomla Extension Directory (JED)"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/joomla-virtuemart/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Repository"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"11-install-plugin-from-joomla-admin-dashboard-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-install-plugin-from-joomla-admin-dashboard-recommended"}},[e._v("#")]),e._v(" 1.1 Install plugin from Joomla Admin Dashboard (recommended)")]),e._v(" "),t("ol",[t("li",[e._v("Menu: Extensions > Manage > Install")]),e._v(" "),t("li",[e._v('On "Install from Web" tab search for "btcpay"')]),e._v(" "),t("li",[e._v("Click on BTCPay for VirtueMart and [Install] button")]),e._v(" "),t("li",[e._v("Continue with step 1.3")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(647),alt:"BTCPay Virtuemart: Plugin installation web",title:"BTCPay Virtuemart: Plugin installation web"}})]),e._v(" "),t("h3",{attrs:{id:"12-download-and-install-plugin-from-jed-or-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-download-and-install-plugin-from-jed-or-github"}},[e._v("#")]),e._v(" 1.2 Download and install plugin from JED or GitHub")]),e._v(" "),t("ol",[t("li",[e._v("Download the latest BTCPay plugin from "),t("a",{attrs:{href:"https://github.com/btcpayserver/joomla-virtuemart/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://extensions.joomla.org/extension/vm-payment-btcpay-for-virtuemart/",target:"_blank",rel:"noopener noreferrer"}},[e._v("JED"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Menu: Extensions -> Manage -> Install")]),e._v(" "),t("li",[e._v('On tab "Upload Package File" upload the '),t("code",[e._v("btcpayvm.zip")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(648),alt:"BTCPay Virtuemart: Plugin installation upload",title:"BTCPay Virtuemart: Plugin installation upload"}})]),e._v(" "),t("h3",{attrs:{id:"13-enable-the-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#13-enable-the-plugin"}},[e._v("#")]),e._v(" 1.3 Enable the plugin")]),e._v(" "),t("ol",[t("li",[e._v("Menu: Extensions -> Plugins")]),e._v(" "),t("li",[e._v('Search for "btcpay"')]),e._v(" "),t("li",[e._v('On "Status" column click the red circle to enable the plugin')])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(649),alt:"BTCPay Virtuemart: Enable plugin",title:"BTCPay Virtuemart: Enable plugin"}})]),e._v(" "),t("h2",{attrs:{id:"2-connecting-virtuemart-and-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-connecting-virtuemart-and-btcpay-server"}},[e._v("#")]),e._v(" 2. Connecting VirtueMart and BTCPay Server")]),e._v(" "),t("p",[e._v("BTCPay for Virtuemart plugin is a "),t("strong",[e._v("bridge between your BTCPay Server (payment processor) and your e-commerce store")]),e._v(".\nNo matter if you're using a self-hosted or third-party solution, the connection process is identical.")]),e._v(" "),t("h3",{attrs:{id:"21-add-btcpay-payment-gateway-in-virtuemart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-add-btcpay-payment-gateway-in-virtuemart"}},[e._v("#")]),e._v(" 2.1 Add BTCPay payment gateway in VirtueMart")]),e._v(" "),t("ol",[t("li",[e._v("Menu: VirtueMart -> Payment Methods")]),e._v(" "),t("li",[e._v("Click button "),t("strong",[e._v("[New]")]),e._v(" "),t("img",{attrs:{src:a(650),alt:"BTCPay Virtuemart: Add new payment method",title:"BTCPay Virtuemart: Add new payment method"}})]),e._v(" "),t("li",[e._v('Configure the payment method according to your needs. Make sure on "Payment Method" dropdown you have "BTCPay for VirtueMart" selected and the payment method is published '),t("img",{attrs:{src:a(651),alt:"BTCPay Virtuemart: Payment method details",title:"BTCPay Virtuemart: Payment method details"}})]),e._v(" "),t("li",[e._v("Hit the "),t("strong",[e._v("[Save]")]),e._v(" button (the plugin table will get created)")])]),e._v(" "),t("p",[e._v('Now you can switch to the "Configuration" tab where we can connect to our BTCPay Server instance. First we need to create an API key.')]),e._v(" "),t("figure",[t("img",{attrs:{src:a(652),alt:"BTCPay Virtuemart: Payment method configuration tab",title:"BTCPay Virtuemart: Payment method configuration tab"}})]),e._v(" "),t("h3",{attrs:{id:"22-create-an-api-key-and-configure-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("#")]),e._v(" 2.2 Create an API key and configure permissions")]),e._v(" "),t("p",[e._v("On BTCPay Server instance:")]),e._v(" "),t("ol",[t("li",[e._v("Click on "),t("em",[e._v("[Account]")])]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Manage Account]")]),e._v(" "),t("img",{attrs:{src:a(653),alt:"BTCPay Joomla VirtueMart: Manage Account",title:"BTCPay Joomla VirtueMart: Manage Account"}})]),e._v(" "),t("li",[e._v("Go to the tab "),t("em",[e._v('"API Keys"')])]),e._v(" "),t("li",[e._v("Click "),t("em",[e._v("[Generate Key]")]),e._v(" to select permissions.\n"),t("img",{attrs:{src:a(654),alt:"BTCPay Joomla VirtueMart: API Keys overview",title:"BTCPay Joomla VirtueMart: API Keys overview"}})]),e._v(" "),t("li",[e._v("Add a label. "),t("strong",[e._v("Important:")]),e._v(" click on the "),t("em",[e._v('"Select specific stores"')]),e._v(" link for the following permissions: "),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(" and select the specific store you created for your VirtueMart site. It should look like when everything is set:\n"),t("img",{attrs:{src:a(655),alt:"BTCPay Joomla VirtueMart: API Keys Permissions",title:"BTCPay Joomla VirtueMart: API Keys Permissions"}})]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Generate API Key]")]),e._v(" "),t("img",{attrs:{src:a(656),alt:"BTCPay Joomla VirtueMart: API Keys Save",title:"BTCPay Joomla VirtueMart: API Keys Save"}})]),e._v(" "),t("li",[e._v("Copy the generated API Key to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form\n"),t("img",{attrs:{src:a(657),alt:"BTCPay Joomla VirtueMart: Copy API Key",title:"BTCPay Joomla VirtueMart: Copy API Key"}})]),e._v(" "),t("li",[e._v("Go to Settings and copy the store ID to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form\n"),t("img",{attrs:{src:a(658),alt:"BTCPay Joomla VirtueMart: Copy Store ID",title:"BTCPay Joomla VirtueMart: Copy Store ID"}})]),e._v(" "),t("li",[e._v("On the "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form make sure "),t("strong",[e._v("BTPCay Server URL")]),e._v(", "),t("strong",[e._v("API Key")]),e._v(" and "),t("strong",[e._v("Store ID")]),e._v(" are set and click "),t("strong",[e._v("[Save]")]),e._v(" "),t("img",{attrs:{src:a(659),alt:"BTCPay Joomla VirtueMart: Save VirtueMart Settings form",title:"BTCPay Joomla VirtueMart: Save VirtueMart Settings form"}})])]),e._v(" "),t("h3",{attrs:{id:"23-create-a-webhook-on-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#23-create-a-webhook-on-btcpay-server"}},[e._v("#")]),e._v(" 2.3 Create a webhook on BTCPay Server")]),e._v(" "),t("p",[e._v("Setting up a webhook is important that your gets updates on invoice status changes from BTCPay Server.")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("On BTCPay Server instance go to your store settings, tab "),t("strong",[e._v("[Webhooks]")]),e._v(", click "),t("strong",[e._v("[Create Webhook]")]),e._v(" "),t("img",{attrs:{src:a(660),alt:"BTCPay Joomla VirtueMart: Create webhook",title:"BTCPay Joomla VirtueMart: Create webhook"}})])]),e._v(" "),t("li",[t("p",[e._v("From "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" copy the "),t("strong",[e._v("Webhook callback URL")]),e._v(" to webhook settings "),t("strong",[e._v("Payload URL")]),e._v(".\n"),t("img",{attrs:{src:a(661),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}})])]),e._v(" "),t("li",[t("p",[e._v("On webhook settings click on the eye to reveal webhook secret. Copy that secret to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form "),t("strong",[e._v("Webhook Secret")]),e._v(" input and "),t("strong",[e._v("[Save]")]),e._v(" the VirtueMart configuration again.\n"),t("img",{attrs:{src:a(662),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}}),e._v(" "),t("img",{attrs:{src:a(663),alt:"BTCPay Joomla VirtueMart: Webhook VM save configuration",title:"BTCPay Joomla VirtueMart: Webhook VM save configuration"}})])]),e._v(" "),t("li",[t("p",[e._v("Back on webhook settings, enable "),t("strong",[e._v("Automatic redelivery")]),e._v(" and click "),t("strong",[e._v("[Add webhook]")]),e._v(" to save the webhook.\n"),t("img",{attrs:{src:a(664),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}})])])]),e._v(" "),t("h2",{attrs:{id:"3-test-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-test-the-checkout"}},[e._v("#")]),e._v(" 3. Test the checkout")]),e._v(" "),t("p",[e._v("Everything is ready to go now. Do a small test purchase and make sure the order status gets updated according to the BTCPay invoice status. On BTCPay Server invoice details you can see if the webhook events were fired successfully.")]),e._v(" "),t("h2",{attrs:{id:"customizing-virtuemart-btcpay-payment-method-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#customizing-virtuemart-btcpay-payment-method-settings"}},[e._v("#")]),e._v(" Customizing VirtueMart BTCPay payment method settings")]),e._v(" "),t("p",[e._v('Your VirtueMart BTCPay payment method settings can be found in menu: VirtueMart -> Payment Methods. Click on the payment method of type "btcpayvm" you created.')]),e._v(" "),t("h3",{attrs:{id:"section-btcpay-server-connection-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-btcpay-server-connection-settings"}},[e._v("#")]),e._v(" Section: BTCPay Server connection settings")]),e._v(" "),t("p",[e._v("This is the most important part of the configuration. The data entered here will connect your VirtueMart shop with your counterparty store configured on BTCPay Server.")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Server URL")])]),e._v(" "),t("p",[e._v("URL to your BTCPay Server instance, including protocol e.g. "),t("code",[e._v("https://btcpay.yourdomain.com")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("API Key")])]),e._v(" "),t("p",[e._v("Your BTCPay API Key as mentioned "),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("here")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Store ID")])]),e._v(" "),t("p",[e._v("The store ID of your BTCPay Server store. Can be found on the store settings page. See 8. "),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("here")])]),e._v(" "),t("p",[t("strong",[e._v("Webhook Secret")])]),e._v(" "),t("p",[e._v("The wehbook secret which was generated on webhook createion, see "),t("a",{attrs:{href:"#23-create-a-webhook-on-btcpay-server"}},[e._v("here")])]),e._v(" "),t("p",[t("strong",[e._v("Webhook callback URL")])]),e._v(" "),t("p",[e._v("This field is auto-generated by the plugin and helps you when creating the webhook on BTCPay Server. It contains the needed payment method id and parameters to allow processing of callbacks.")]),e._v(" "),t("h3",{attrs:{id:"section-order-states-mapping"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-order-states-mapping"}},[e._v("#")]),e._v(" Section: Order states mapping")]),e._v(" "),t("p",[e._v("You can adjust the mapping of BTCPay Server invoice status to VirtueMart order states. On the left are the invoice states and on the right the order states. The defaults here should be good to go - but if you need, you can overwrite them.")]),e._v(" "),t("p",[e._v("VirtueMart order statuses are explained "),t("a",{attrs:{href:"https://docs.virtuemart.net/manual/configuration-menu/order-statuses.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("BTCPay server invoice statuses are explained "),t("RouterLink",{attrs:{to:"/Invoices/#invoice-statuses"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"section-restrictions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-restrictions"}},[e._v("#")]),e._v(" Section: Restrictions")]),e._v(" "),t("p",[e._v("These are VirtueMart provided restrictions you know from other payment plugins. You can restrict the amount or countries when the payment method will be available.")]),e._v(" "),t("h3",{attrs:{id:"section-discounts-and-fees"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-discounts-and-fees"}},[e._v("#")]),e._v(" Section Discounts and fees")]),e._v(" "),t("p",[e._v("These are VirtueMart provided settings. You can set a fee, cashback and apply tax rules or set a custom logo for the payment method.")]),e._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h3",{attrs:{id:"error-on-checkout-there-was-an-error-processing-the-payment-on-btcpay-server-please-try-again-and-contact-us-if-the-problem-persists-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#error-on-checkout-there-was-an-error-processing-the-payment-on-btcpay-server-please-try-again-and-contact-us-if-the-problem-persists-"}},[e._v("#")]),e._v(' Error on checkout "There was an error processing the payment on BTCPay Server. Please try again and contact us if the problem persists."')]),e._v(" "),t("p",[e._v("This means something went wrong with creating the invoice on BTCPay Server. It could be either wrong api key, store id or another communication error. You can find the error logs of the plugin in the following directory: "),t("code",[e._v("administrator/logs")]),e._v(" there you will have one or more files called "),t("code",[e._v("btcpayvm.X.log.php")]),e._v(" where "),t("code",[e._v("X")]),e._v(" is a number e.g. "),t("code",[e._v("btcpayvm.0.log.php")]),e._v(" you will find timestamped errors there that should give you a hint what the problem is.")]),e._v(" "),t("p",[t("strong",[e._v("Example")]),e._v(":")]),e._v(" "),t("blockquote",[t("p",[e._v('2022-05-24 21:10:50 ERROR Error during POST to https://btcpay.example.com/api/v1/stores/4kD5bvAF5j8DokHqAzxb6MFDV4ikabcdefghijklm/invoices. Got response (401): {"code":"unauthenticated","message":"Authentication is required for accessing this endpoint"}')])]),e._v(" "),t("ul",[t("li",[t("p",[e._v("This means there is some authentication error. Likely your api key does not have permission create invoices for that store. Make sure you gave the api key the right permissions and you give it to the right store and also entered that in VirtueMart payment configuration form.")])]),e._v(" "),t("li",[t("p",[e._v('Another reason could be that you use a legacy api key. The legacy api keys are located in store settings -> Access Tokens. But you need to create an account api key which is located in Account -> Manage Account -> tab "API Keys". See section '),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("2.2 Create an API key and configure permissions")]),e._v(".")])])]),e._v(" "),t("h2",{attrs:{id:"the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("#")]),e._v(" The order states do not update although the invoice has been paid")]),e._v(" "),t("p",[e._v('Please check the details of your invoice if there were any errors on sending the webhook request. Some hosting providers, firewall setups or Joomla security plugins may block POST requests to your site which lead to a http status of "403 forbidden".')]),e._v(" "),t("p",[e._v("You can check and verify yourself if there is something blocking requests to your site in one of these two ways:")]),e._v(" "),t("p",[t("strong",[e._v("1. Copy webhook callback URL")]),e._v("\ngo to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(' and copy the "Webhook callback URL". e.g. '),t("code",[e._v("https://EXAMPLE.COM/index.php?option=com_virtuemart&view=pluginresponse&task=pluginnotification&pm=2")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(665),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}})]),e._v(" "),t("p",[t("strong",[e._v("2.1 Check using a command line (Linux or MacOS):")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -vX POST -H "Content-Type: application/json" \\\n -d \'{"data": "test"}\' WEBHOOK_CALLBACK_URL\n')])])]),t("p",[e._v("(replace "),t("code",[e._v("WEBHOOK_CALLBACK_URL")]),e._v(" with the one copied above)")]),e._v(" "),t("p",[e._v("Result:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".... snip ....\n* upload completely sent off: 16 out of 16 bytes\n< HTTP/1.1 403 Forbidden\n< access-control-allow-origin: *\n< Content-Type: application/json; charset=UTF-8\n< X-Cloud-Trace-Context: 4f07d5b2e5c2f05949d04421a8e2dd6a\n< Date: Thu, 17 Feb 2022 10:06:50 GMT\n< Server: Google Frontend\n< Content-Length: 26\n")])])]),t("p",[e._v('If you see that line "HTTP/1.1 403 Forbidden" or "HTTP/2 403" then something is blocking data sent to your VirtueMart site. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests.')]),e._v(" "),t("p",[t("strong",[e._v("2.2 Check using an online service (if you do not have a command line available:")])]),e._v(" "),t("ul",[t("li",[e._v("Go to "),t("a",{attrs:{href:"https://reqbin.com/post-online",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://reqbin.com/post-online"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("ol",[t("li",[e._v("Enter your callback url (copied from step 1 above): "),t("code",[e._v("https://EXAMPLE.COM/index.php?option=com_virtuemart&view=pluginresponse&task=pluginnotification&pm=2")]),e._v("\n(replace this URL with the webhook callback url from step 1)")])])]),e._v(" "),t("li",[e._v('Make sure "POST" is selected')]),e._v(" "),t("li",[t("ol",{attrs:{start:"2"}},[t("li",[e._v("Click [Send]")])])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(332),alt:"BTCPay Joomla VirtueMart: Webhook payload URL forbidden",title:"BTCPay Joomla VirtueMart: Webhook payload URL forbidden"}})]),e._v(" "),t("p",[e._v('If you see "'),t("strong",[e._v("Status 403 (Forbidden)")]),e._v('" then POST requests to your site are blocked for some reason. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests. If you see any other status code (200, 500, ...) a firewall problem seems to not apply, you probably need to further investigate.')]),e._v(" "),t("h2",{attrs:{id:"i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[e._v("#")]),e._v(" I have troubles with using the plugin or some other related questions")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[14],{332:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--19-troubleshoot-403-callback.51193927.png"},733:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--01-install-web.4d28e0bd.png"},734:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--02-install-upload.8972740d.png"},735:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--03-enable-plugin.1b4a6c9f.png"},736:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--04-add-new-payment-method.e5a94ee3.png"},737:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--05-payment-method-details.adf89c97.png"},738:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--06-payment-method-configuration-tab.45617db0.png"},739:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--07-account-manage.d477b8b4.png"},740:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--08-add-api-key.a58b2941.png"},741:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--09-permissions-and-select-store.9ccef388.png"},742:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--10-permissions-set.74d76936.png"},743:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--11-copy-api-key.94be9878.png"},744:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--12-copy-store-id.84c19f9f.png"},745:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--13-save-vm-payment-method-form.0a3e52bd.png"},746:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--14-create-webhook.1b6e4881.png"},747:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--15-webhook-payload-url.37a4f55f.png"},748:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--16-webhook-copy-secret.71b0dd07.png"},749:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--16-virtuemart-configuration-save.ee549862.png"},750:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--17-webhook-save.dfd4fca5.png"},751:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--18-troubleshoot-copy-callback-url.70d08e31.png"},907:function(e,t,a){"use strict";a.r(t);var o=a(17),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"joomla-virtuemart-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#joomla-virtuemart-integration"}},[e._v("#")]),e._v(" Joomla VirtueMart integration")]),e._v(" "),t("p",[e._v("This document explains how to "),t("strong",[e._v("integrate BTCPay Server into your Joomla VirtueMart store")]),e._v(".\nWatch the video below to go along the document |")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/k7XfybLAky0/hqdefault.jpg)"},attrs:{href:"https://youtu.be/k7XfybLAky0",title:"BTCPay Server - Joomla VirtueMart","data-id":"k7XfybLAky0"}},[t("iframe",{attrs:{title:"BTCPay Server - Joomla VirtueMart","data-src":"https://www.youtube-nocookie.com/embed/k7XfybLAky0?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Please ensure that you meet the following requirements before installing this plugin.")]),e._v(" "),t("ul",[t("li",[e._v("PHP version 7.4 or newer")]),e._v(" "),t("li",[e._v("The curl, gd, intl, json, and mbstring PHP extensions are available")]),e._v(" "),t("li",[e._v("A VirtueMart 3 / 4 store ("),t("a",{attrs:{href:"https://www.virtuemart.net/downloads",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download and installation instructions"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("You have a BTCPay Server version 1.3.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've a wallet connected to your store")])],1)]),e._v(" "),t("h2",{attrs:{id:"1-install-btcpay-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-install-btcpay-plugin"}},[e._v("#")]),e._v(" 1. Install BTCPay Plugin")]),e._v(" "),t("p",[e._v("There are three ways to "),t("strong",[e._v("download BTCPay for VirtueMart plugin")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Via the Admin Dashboard (recommended, see below)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://extensions.joomla.org/extension/vm-payment-btcpay-for-virtuemart/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Joomla Extension Directory (JED)"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/joomla-virtuemart/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Repository"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"11-install-plugin-from-joomla-admin-dashboard-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-install-plugin-from-joomla-admin-dashboard-recommended"}},[e._v("#")]),e._v(" 1.1 Install plugin from Joomla Admin Dashboard (recommended)")]),e._v(" "),t("ol",[t("li",[e._v("Menu: Extensions > Manage > Install")]),e._v(" "),t("li",[e._v('On "Install from Web" tab search for "btcpay"')]),e._v(" "),t("li",[e._v("Click on BTCPay for VirtueMart and [Install] button")]),e._v(" "),t("li",[e._v("Continue with step 1.3")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(733),alt:"BTCPay Virtuemart: Plugin installation web",title:"BTCPay Virtuemart: Plugin installation web"}})]),e._v(" "),t("h3",{attrs:{id:"12-download-and-install-plugin-from-jed-or-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-download-and-install-plugin-from-jed-or-github"}},[e._v("#")]),e._v(" 1.2 Download and install plugin from JED or GitHub")]),e._v(" "),t("ol",[t("li",[e._v("Download the latest BTCPay plugin from "),t("a",{attrs:{href:"https://github.com/btcpayserver/joomla-virtuemart/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://extensions.joomla.org/extension/vm-payment-btcpay-for-virtuemart/",target:"_blank",rel:"noopener noreferrer"}},[e._v("JED"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Menu: Extensions -> Manage -> Install")]),e._v(" "),t("li",[e._v('On tab "Upload Package File" upload the '),t("code",[e._v("btcpayvm.zip")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(734),alt:"BTCPay Virtuemart: Plugin installation upload",title:"BTCPay Virtuemart: Plugin installation upload"}})]),e._v(" "),t("h3",{attrs:{id:"13-enable-the-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#13-enable-the-plugin"}},[e._v("#")]),e._v(" 1.3 Enable the plugin")]),e._v(" "),t("ol",[t("li",[e._v("Menu: Extensions -> Plugins")]),e._v(" "),t("li",[e._v('Search for "btcpay"')]),e._v(" "),t("li",[e._v('On "Status" column click the red circle to enable the plugin')])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(735),alt:"BTCPay Virtuemart: Enable plugin",title:"BTCPay Virtuemart: Enable plugin"}})]),e._v(" "),t("h2",{attrs:{id:"2-connecting-virtuemart-and-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-connecting-virtuemart-and-btcpay-server"}},[e._v("#")]),e._v(" 2. Connecting VirtueMart and BTCPay Server")]),e._v(" "),t("p",[e._v("BTCPay for Virtuemart plugin is a "),t("strong",[e._v("bridge between your BTCPay Server (payment processor) and your e-commerce store")]),e._v(".\nNo matter if you're using a self-hosted or third-party solution, the connection process is identical.")]),e._v(" "),t("h3",{attrs:{id:"21-add-btcpay-payment-gateway-in-virtuemart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-add-btcpay-payment-gateway-in-virtuemart"}},[e._v("#")]),e._v(" 2.1 Add BTCPay payment gateway in VirtueMart")]),e._v(" "),t("ol",[t("li",[e._v("Menu: VirtueMart -> Payment Methods")]),e._v(" "),t("li",[e._v("Click button "),t("strong",[e._v("[New]")]),e._v(" "),t("img",{attrs:{src:a(736),alt:"BTCPay Virtuemart: Add new payment method",title:"BTCPay Virtuemart: Add new payment method"}})]),e._v(" "),t("li",[e._v('Configure the payment method according to your needs. Make sure on "Payment Method" dropdown you have "BTCPay for VirtueMart" selected and the payment method is published '),t("img",{attrs:{src:a(737),alt:"BTCPay Virtuemart: Payment method details",title:"BTCPay Virtuemart: Payment method details"}})]),e._v(" "),t("li",[e._v("Hit the "),t("strong",[e._v("[Save]")]),e._v(" button (the plugin table will get created)")])]),e._v(" "),t("p",[e._v('Now you can switch to the "Configuration" tab where we can connect to our BTCPay Server instance. First we need to create an API key.')]),e._v(" "),t("figure",[t("img",{attrs:{src:a(738),alt:"BTCPay Virtuemart: Payment method configuration tab",title:"BTCPay Virtuemart: Payment method configuration tab"}})]),e._v(" "),t("h3",{attrs:{id:"22-create-an-api-key-and-configure-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("#")]),e._v(" 2.2 Create an API key and configure permissions")]),e._v(" "),t("p",[e._v("On BTCPay Server instance:")]),e._v(" "),t("ol",[t("li",[e._v("Click on "),t("em",[e._v("[Account]")])]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Manage Account]")]),e._v(" "),t("img",{attrs:{src:a(739),alt:"BTCPay Joomla VirtueMart: Manage Account",title:"BTCPay Joomla VirtueMart: Manage Account"}})]),e._v(" "),t("li",[e._v("Go to the tab "),t("em",[e._v('"API Keys"')])]),e._v(" "),t("li",[e._v("Click "),t("em",[e._v("[Generate Key]")]),e._v(" to select permissions.\n"),t("img",{attrs:{src:a(740),alt:"BTCPay Joomla VirtueMart: API Keys overview",title:"BTCPay Joomla VirtueMart: API Keys overview"}})]),e._v(" "),t("li",[e._v("Add a label. "),t("strong",[e._v("Important:")]),e._v(" click on the "),t("em",[e._v('"Select specific stores"')]),e._v(" link for the following permissions: "),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(" and select the specific store you created for your VirtueMart site. It should look like when everything is set:\n"),t("img",{attrs:{src:a(741),alt:"BTCPay Joomla VirtueMart: API Keys Permissions",title:"BTCPay Joomla VirtueMart: API Keys Permissions"}})]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Generate API Key]")]),e._v(" "),t("img",{attrs:{src:a(742),alt:"BTCPay Joomla VirtueMart: API Keys Save",title:"BTCPay Joomla VirtueMart: API Keys Save"}})]),e._v(" "),t("li",[e._v("Copy the generated API Key to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form\n"),t("img",{attrs:{src:a(743),alt:"BTCPay Joomla VirtueMart: Copy API Key",title:"BTCPay Joomla VirtueMart: Copy API Key"}})]),e._v(" "),t("li",[e._v("Go to Settings and copy the store ID to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form\n"),t("img",{attrs:{src:a(744),alt:"BTCPay Joomla VirtueMart: Copy Store ID",title:"BTCPay Joomla VirtueMart: Copy Store ID"}})]),e._v(" "),t("li",[e._v("On the "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form make sure "),t("strong",[e._v("BTPCay Server URL")]),e._v(", "),t("strong",[e._v("API Key")]),e._v(" and "),t("strong",[e._v("Store ID")]),e._v(" are set and click "),t("strong",[e._v("[Save]")]),e._v(" "),t("img",{attrs:{src:a(745),alt:"BTCPay Joomla VirtueMart: Save VirtueMart Settings form",title:"BTCPay Joomla VirtueMart: Save VirtueMart Settings form"}})])]),e._v(" "),t("h3",{attrs:{id:"23-create-a-webhook-on-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#23-create-a-webhook-on-btcpay-server"}},[e._v("#")]),e._v(" 2.3 Create a webhook on BTCPay Server")]),e._v(" "),t("p",[e._v("Setting up a webhook is important that your gets updates on invoice status changes from BTCPay Server.")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("On BTCPay Server instance go to your store settings, tab "),t("strong",[e._v("[Webhooks]")]),e._v(", click "),t("strong",[e._v("[Create Webhook]")]),e._v(" "),t("img",{attrs:{src:a(746),alt:"BTCPay Joomla VirtueMart: Create webhook",title:"BTCPay Joomla VirtueMart: Create webhook"}})])]),e._v(" "),t("li",[t("p",[e._v("From "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" copy the "),t("strong",[e._v("Webhook callback URL")]),e._v(" to webhook settings "),t("strong",[e._v("Payload URL")]),e._v(".\n"),t("img",{attrs:{src:a(747),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}})])]),e._v(" "),t("li",[t("p",[e._v("On webhook settings click on the eye to reveal webhook secret. Copy that secret to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(" form "),t("strong",[e._v("Webhook Secret")]),e._v(" input and "),t("strong",[e._v("[Save]")]),e._v(" the VirtueMart configuration again.\n"),t("img",{attrs:{src:a(748),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}}),e._v(" "),t("img",{attrs:{src:a(749),alt:"BTCPay Joomla VirtueMart: Webhook VM save configuration",title:"BTCPay Joomla VirtueMart: Webhook VM save configuration"}})])]),e._v(" "),t("li",[t("p",[e._v("Back on webhook settings, enable "),t("strong",[e._v("Automatic redelivery")]),e._v(" and click "),t("strong",[e._v("[Add webhook]")]),e._v(" to save the webhook.\n"),t("img",{attrs:{src:a(750),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}})])])]),e._v(" "),t("h2",{attrs:{id:"3-test-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-test-the-checkout"}},[e._v("#")]),e._v(" 3. Test the checkout")]),e._v(" "),t("p",[e._v("Everything is ready to go now. Do a small test purchase and make sure the order status gets updated according to the BTCPay invoice status. On BTCPay Server invoice details you can see if the webhook events were fired successfully.")]),e._v(" "),t("h2",{attrs:{id:"customizing-virtuemart-btcpay-payment-method-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#customizing-virtuemart-btcpay-payment-method-settings"}},[e._v("#")]),e._v(" Customizing VirtueMart BTCPay payment method settings")]),e._v(" "),t("p",[e._v('Your VirtueMart BTCPay payment method settings can be found in menu: VirtueMart -> Payment Methods. Click on the payment method of type "btcpayvm" you created.')]),e._v(" "),t("h3",{attrs:{id:"section-btcpay-server-connection-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-btcpay-server-connection-settings"}},[e._v("#")]),e._v(" Section: BTCPay Server connection settings")]),e._v(" "),t("p",[e._v("This is the most important part of the configuration. The data entered here will connect your VirtueMart shop with your counterparty store configured on BTCPay Server.")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Server URL")])]),e._v(" "),t("p",[e._v("URL to your BTCPay Server instance, including protocol e.g. "),t("code",[e._v("https://btcpay.yourdomain.com")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("API Key")])]),e._v(" "),t("p",[e._v("Your BTCPay API Key as mentioned "),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("here")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Store ID")])]),e._v(" "),t("p",[e._v("The store ID of your BTCPay Server store. Can be found on the store settings page. See 8. "),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("here")])]),e._v(" "),t("p",[t("strong",[e._v("Webhook Secret")])]),e._v(" "),t("p",[e._v("The wehbook secret which was generated on webhook createion, see "),t("a",{attrs:{href:"#23-create-a-webhook-on-btcpay-server"}},[e._v("here")])]),e._v(" "),t("p",[t("strong",[e._v("Webhook callback URL")])]),e._v(" "),t("p",[e._v("This field is auto-generated by the plugin and helps you when creating the webhook on BTCPay Server. It contains the needed payment method id and parameters to allow processing of callbacks.")]),e._v(" "),t("h3",{attrs:{id:"section-order-states-mapping"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-order-states-mapping"}},[e._v("#")]),e._v(" Section: Order states mapping")]),e._v(" "),t("p",[e._v("You can adjust the mapping of BTCPay Server invoice status to VirtueMart order states. On the left are the invoice states and on the right the order states. The defaults here should be good to go - but if you need, you can overwrite them.")]),e._v(" "),t("p",[e._v("VirtueMart order statuses are explained "),t("a",{attrs:{href:"https://docs.virtuemart.net/manual/configuration-menu/order-statuses.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("BTCPay server invoice statuses are explained "),t("RouterLink",{attrs:{to:"/Invoices/#invoice-statuses"}},[e._v("here")])],1),e._v(" "),t("h3",{attrs:{id:"section-restrictions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-restrictions"}},[e._v("#")]),e._v(" Section: Restrictions")]),e._v(" "),t("p",[e._v("These are VirtueMart provided restrictions you know from other payment plugins. You can restrict the amount or countries when the payment method will be available.")]),e._v(" "),t("h3",{attrs:{id:"section-discounts-and-fees"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-discounts-and-fees"}},[e._v("#")]),e._v(" Section Discounts and fees")]),e._v(" "),t("p",[e._v("These are VirtueMart provided settings. You can set a fee, cashback and apply tax rules or set a custom logo for the payment method.")]),e._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h3",{attrs:{id:"error-on-checkout-there-was-an-error-processing-the-payment-on-btcpay-server-please-try-again-and-contact-us-if-the-problem-persists-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#error-on-checkout-there-was-an-error-processing-the-payment-on-btcpay-server-please-try-again-and-contact-us-if-the-problem-persists-"}},[e._v("#")]),e._v(' Error on checkout "There was an error processing the payment on BTCPay Server. Please try again and contact us if the problem persists."')]),e._v(" "),t("p",[e._v("This means something went wrong with creating the invoice on BTCPay Server. It could be either wrong api key, store id or another communication error. You can find the error logs of the plugin in the following directory: "),t("code",[e._v("administrator/logs")]),e._v(" there you will have one or more files called "),t("code",[e._v("btcpayvm.X.log.php")]),e._v(" where "),t("code",[e._v("X")]),e._v(" is a number e.g. "),t("code",[e._v("btcpayvm.0.log.php")]),e._v(" you will find timestamped errors there that should give you a hint what the problem is.")]),e._v(" "),t("p",[t("strong",[e._v("Example")]),e._v(":")]),e._v(" "),t("blockquote",[t("p",[e._v('2022-05-24 21:10:50 ERROR Error during POST to https://btcpay.example.com/api/v1/stores/4kD5bvAF5j8DokHqAzxb6MFDV4ikabcdefghijklm/invoices. Got response (401): {"code":"unauthenticated","message":"Authentication is required for accessing this endpoint"}')])]),e._v(" "),t("ul",[t("li",[t("p",[e._v("This means there is some authentication error. Likely your api key does not have permission create invoices for that store. Make sure you gave the api key the right permissions and you give it to the right store and also entered that in VirtueMart payment configuration form.")])]),e._v(" "),t("li",[t("p",[e._v('Another reason could be that you use a legacy api key. The legacy api keys are located in store settings -> Access Tokens. But you need to create an account api key which is located in Account -> Manage Account -> tab "API Keys". See section '),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("2.2 Create an API key and configure permissions")]),e._v(".")])])]),e._v(" "),t("h2",{attrs:{id:"the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("#")]),e._v(" The order states do not update although the invoice has been paid")]),e._v(" "),t("p",[e._v('Please check the details of your invoice if there were any errors on sending the webhook request. Some hosting providers, firewall setups or Joomla security plugins may block POST requests to your site which lead to a http status of "403 forbidden".')]),e._v(" "),t("p",[e._v("You can check and verify yourself if there is something blocking requests to your site in one of these two ways:")]),e._v(" "),t("p",[t("strong",[e._v("1. Copy webhook callback URL")]),e._v("\ngo to your "),t("em",[e._v("VirtueMart BTCPay Payment Method Settings")]),e._v(' and copy the "Webhook callback URL". e.g. '),t("code",[e._v("https://EXAMPLE.COM/index.php?option=com_virtuemart&view=pluginresponse&task=pluginnotification&pm=2")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(751),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}})]),e._v(" "),t("p",[t("strong",[e._v("2.1 Check using a command line (Linux or MacOS):")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -vX POST -H "Content-Type: application/json" \\\n -d \'{"data": "test"}\' WEBHOOK_CALLBACK_URL\n')])])]),t("p",[e._v("(replace "),t("code",[e._v("WEBHOOK_CALLBACK_URL")]),e._v(" with the one copied above)")]),e._v(" "),t("p",[e._v("Result:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".... snip ....\n* upload completely sent off: 16 out of 16 bytes\n< HTTP/1.1 403 Forbidden\n< access-control-allow-origin: *\n< Content-Type: application/json; charset=UTF-8\n< X-Cloud-Trace-Context: 4f07d5b2e5c2f05949d04421a8e2dd6a\n< Date: Thu, 17 Feb 2022 10:06:50 GMT\n< Server: Google Frontend\n< Content-Length: 26\n")])])]),t("p",[e._v('If you see that line "HTTP/1.1 403 Forbidden" or "HTTP/2 403" then something is blocking data sent to your VirtueMart site. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests.')]),e._v(" "),t("p",[t("strong",[e._v("2.2 Check using an online service (if you do not have a command line available:")])]),e._v(" "),t("ul",[t("li",[e._v("Go to "),t("a",{attrs:{href:"https://reqbin.com/post-online",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://reqbin.com/post-online"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("ol",[t("li",[e._v("Enter your callback url (copied from step 1 above): "),t("code",[e._v("https://EXAMPLE.COM/index.php?option=com_virtuemart&view=pluginresponse&task=pluginnotification&pm=2")]),e._v("\n(replace this URL with the webhook callback url from step 1)")])])]),e._v(" "),t("li",[e._v('Make sure "POST" is selected')]),e._v(" "),t("li",[t("ol",{attrs:{start:"2"}},[t("li",[e._v("Click [Send]")])])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(332),alt:"BTCPay Joomla VirtueMart: Webhook payload URL forbidden",title:"BTCPay Joomla VirtueMart: Webhook payload URL forbidden"}})]),e._v(" "),t("p",[e._v('If you see "'),t("strong",[e._v("Status 403 (Forbidden)")]),e._v('" then POST requests to your site are blocked for some reason. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests. If you see any other status code (200, 500, ...) a firewall problem seems to not apply, you probably need to further investigate.')]),e._v(" "),t("h2",{attrs:{id:"i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[e._v("#")]),e._v(" I have troubles with using the plugin or some other related questions")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/140.f4d196c2.js b/assets/js/140.78ee4696.js similarity index 98% rename from assets/js/140.f4d196c2.js rename to assets/js/140.78ee4696.js index 637113a3bc..328714d152 100644 --- a/assets/js/140.f4d196c2.js +++ b/assets/js/140.78ee4696.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[140],{832:function(a,t,e){"use strict";e.r(t);var s=e(17),n=Object(s.a)({},(function(){var a=this,t=a._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"tallycoin-connect"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tallycoin-connect"}},[a._v("#")]),a._v(" Tallycoin Connect")]),a._v(" "),t("p",[a._v("Set up "),t("a",{attrs:{href:"https://github.com/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[a._v("Tallycoin Connect"),t("OutboundLink")],1),a._v(" on your BTCPay Server instance to allow for the retrieval of Lightning invoices via "),t("a",{attrs:{href:"https://tallyco.in/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Tallycoin"),t("OutboundLink")],1),a._v(".\nLND required.")]),a._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[a._v("#")]),a._v(" Installation")]),a._v(" "),t("p",[a._v("To install the Tallycoin Connect service, you need to set your Tallycoin API key and a password first.\nThe password is optional, but as the service will be publicly available, you are strongly advised to require a secure password for the login.")]),a._v(" "),t("p",[a._v("You can either set "),t("code",[a._v("TALLYCOIN_PASSWD_CLEARTEXT")]),a._v(" (plain text) or "),t("code",[a._v("TALLYCOIN_PASSWD")]),a._v(", which must be a sha256 hash of your login password.")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Set API key and password")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("TALLYCOIN_APIKEY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"my-tallycoin-api-key"')]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("TALLYCOIN_PASSWD_CLEARTEXT")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"sUpErSeCuRe"')]),a._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Add fragment and run setup")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a._v(';opt-add-tallycoin-connect"')]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v(".")]),a._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-i")]),a._v("\n")])])]),t("p",[a._v("Afterwards you should see Tallycoin Connect appear as a service on the Server Settings > Services page in BTCPay Server.")]),a._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[a._v("#")]),a._v(" Troubleshooting")]),a._v(" "),t("p",[a._v("To see the logs of the Tallycoin Connect service, you can run this command:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" generated_tallycoin_connect_1\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[140],{836:function(a,t,e){"use strict";e.r(t);var s=e(17),n=Object(s.a)({},(function(){var a=this,t=a._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":a.$parent.slotKey}},[t("h1",{attrs:{id:"tallycoin-connect"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tallycoin-connect"}},[a._v("#")]),a._v(" Tallycoin Connect")]),a._v(" "),t("p",[a._v("Set up "),t("a",{attrs:{href:"https://github.com/djbooth007/tallycoin_connect",target:"_blank",rel:"noopener noreferrer"}},[a._v("Tallycoin Connect"),t("OutboundLink")],1),a._v(" on your BTCPay Server instance to allow for the retrieval of Lightning invoices via "),t("a",{attrs:{href:"https://tallyco.in/",target:"_blank",rel:"noopener noreferrer"}},[a._v("Tallycoin"),t("OutboundLink")],1),a._v(".\nLND required.")]),a._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[a._v("#")]),a._v(" Installation")]),a._v(" "),t("p",[a._v("To install the Tallycoin Connect service, you need to set your Tallycoin API key and a password first.\nThe password is optional, but as the service will be publicly available, you are strongly advised to require a secure password for the login.")]),a._v(" "),t("p",[a._v("You can either set "),t("code",[a._v("TALLYCOIN_PASSWD_CLEARTEXT")]),a._v(" (plain text) or "),t("code",[a._v("TALLYCOIN_PASSWD")]),a._v(", which must be a sha256 hash of your login password.")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Set API key and password")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("TALLYCOIN_APIKEY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"my-tallycoin-api-key"')]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v("export")]),a._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("TALLYCOIN_PASSWD_CLEARTEXT")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"sUpErSeCuRe"')]),a._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[a._v("# Add fragment and run setup")]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[a._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[a._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[a._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[a._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a._v(';opt-add-tallycoin-connect"')]),a._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[a._v(".")]),a._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-i")]),a._v("\n")])])]),t("p",[a._v("Afterwards you should see Tallycoin Connect appear as a service on the Server Settings > Services page in BTCPay Server.")]),a._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[a._v("#")]),a._v(" Troubleshooting")]),a._v(" "),t("p",[a._v("To see the logs of the Tallycoin Connect service, you can run this command:")]),a._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[a._v("docker")]),a._v(" logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[a._v("-f")]),a._v(" generated_tallycoin_connect_1\n")])])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/141.b8553449.js b/assets/js/141.1a1ab3be.js similarity index 99% rename from assets/js/141.b8553449.js rename to assets/js/141.1a1ab3be.js index 742918e74a..692bd4741b 100644 --- a/assets/js/141.b8553449.js +++ b/assets/js/141.1a1ab3be.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[141],{833:function(e,t,r){"use strict";r.r(t);var a=r(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"accept-bitcoin-on-your-drupal-commerce-store-using-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#accept-bitcoin-on-your-drupal-commerce-store-using-btcpay-server"}},[e._v("#")]),e._v(" Accept Bitcoin on your Drupal Commerce Store using BTCPay Server")]),e._v(" "),t("p",[e._v("Introducing BTCPay Server payment module for "),t("a",{attrs:{href:"https://www.drupal.org/project/commerce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Drupal Commerce 2.x"),t("OutboundLink")],1),e._v(". Drupal Commerce Store owners can now accept payments using Bitcoin and other cryptocurrencies directly through BTCPay Server without any third-party intermediary.")]),e._v(" "),t("p",[e._v("BTCPay Server supports a wide range of cryptocurrencies, with the potential for future extensions. Here are the currencies you can use now on BTCPay Server:")]),e._v(" "),t("ul",[t("li",[e._v("BTC (Bitcoin)")]),e._v(" "),t("li",[e._v("Bitcoin layer-two network (the Lightning Network) for fast and zero/low-fee transactions")]),e._v(" "),t("li",[e._v("Altcoins with full node integration including coins like Monero (XMR) and Litecoin (LTC).")]),e._v(" "),t("li",[e._v("Other Major Altcoins: Supported through plugins via platforms such as "),t("RouterLink",{attrs:{to:"/Trocador/"}},[e._v("Trocador")]),e._v(", "),t("RouterLink",{attrs:{to:"/SideShift/"}},[e._v("SideShift")]),e._v(", and FixedFloat.")],1)]),e._v(" "),t("p",[e._v("Want to accept Bitcoin on your Drupal Commerce store? Visit the "),t("a",{attrs:{href:"https://drupal.org/project/commerce_btcpay",target:"_blank",rel:"noopener noreferrer"}},[e._v("project page on Drupal.org"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"demo-store"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#demo-store"}},[e._v("#")]),e._v(" Demo store")]),e._v(" "),t("p",[e._v("A Drupal Commerce demo store connected with a (testnet) BTCPay Server where you can try the checkout (Bitcoin + Lightning Network) can be found here:"),t("br"),e._v(" "),t("a",{attrs:{href:"http://drupal.demo.btcpay.tech/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://drupal.demo.btcpay.tech"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("BTCPay Server ("),t("a",{attrs:{href:"/deployment/deployment"}},[e._v("self hosted or 3rd party")]),e._v(" or "),t("a",{attrs:{href:"/btcpay-basics/tryitout"}},[e._v("quick start with a testserver")]),e._v(")")]),e._v(" "),t("li",[e._v("Drupal Commerce 2.x installed ("),t("a",{attrs:{href:"https://docs.drupalcommerce.org/commerce2/developer-guide/install-update/installation",target:"_blank",rel:"noopener noreferrer"}},[e._v("installation guide"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Drupal: "),t("a",{attrs:{href:"https://www.drupal.org/docs/8/core/modules/file/overview#content-accessing-private-files",target:"_blank",rel:"noopener noreferrer"}},[e._v("configured and writable private file system"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"installation-and-configuration-guide-for-the-btcpay-server-drupal-commerce-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation-and-configuration-guide-for-the-btcpay-server-drupal-commerce-integration"}},[e._v("#")]),e._v(" Installation and configuration Guide for the BTCPay Server - Drupal Commerce Integration")]),e._v(" "),t("p",[e._v("Ready to accept Bitcoin on your Drupal Commerce Store? Follow this quick and easy guide to install and configure the BTCPay Drupal Commerce module. For a quick run through, check out our installation and configuration screencast:")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/XBZwyC2v48s/hqdefault.jpg)"},attrs:{href:"https://youtube.com/watch?v=XBZwyC2v48s",title:"BTCPay Server - Drupal Commerce 2.x quick walkthrough","data-id":"XBZwyC2v48s"}},[t("iframe",{attrs:{title:"BTCPay Server - Drupal Commerce 2.x quick walkthrough","data-src":"https://www.youtube-nocookie.com/embed/XBZwyC2v48s?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h3",{attrs:{id:"easy-setup-steps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#easy-setup-steps"}},[e._v("#")]),e._v(" Easy setup steps")]),e._v(" "),t("h4",{attrs:{id:"generate-pairing-code-on-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generate-pairing-code-on-btcpay-server"}},[e._v("#")]),e._v(" Generate pairing code on BTCPay server")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Setup your store:")]),e._v(" You'd need a BTCPay server instance to get started. Don't have one? click "),t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("here")]),e._v(" for a step by step guide.")],1),e._v(" "),t("li",[t("strong",[e._v("Access Tokens:")]),e._v(' Once you have your BTCPay Server instance setup and store created, navigate to the store settings and select "'),t("strong",[e._v("Access Tokens")]),e._v('"')]),e._v(" "),t("li",[e._v("Create a new token by clicking on "),t("strong",[e._v("[Create a new token]")])]),e._v(" "),t("li",[t("strong",[e._v("Label:")]),e._v(" enter some label (eg. my store)")]),e._v(" "),t("li",[t("strong",[e._v("Public key:")]),e._v(" this needs to be left "),t("strong",[e._v("empty")])]),e._v(" "),t("li",[t("strong",[e._v("Facade:")]),e._v(' Type in "merchant"')]),e._v(" "),t("li",[e._v("Click on "),t("strong",[e._v("[Request pairing]")])]),e._v(" "),t("li",[e._v("On the next screen choose your configured store in ** Pair to** select dropdown and click on "),t("strong",[e._v("[approve]")])]),e._v(" "),t("li",[e._v('Note down the displayed 7-digit code at the top status message, e.g. "d7afaXr"'),t("br"),e._v("\n(you will need that code below on gateway configuration, see below)")])]),e._v(" "),t("h4",{attrs:{id:"commerce-btcpay-installation-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#commerce-btcpay-installation-configuration"}},[e._v("#")]),e._v(" Commerce BTCPay: Installation + configuration")]),e._v(" "),t("ol",[t("li",[e._v("Install module: "),t("code",[e._v("composer require drupal/commerce_btcpay")])]),e._v(" "),t("li",[e._v("Enable the module: "),t("code",[e._v("drush en commerce_btcpay -y")])]),e._v(" "),t("li",[e._v("Make sure you have configured "),t("a",{attrs:{href:"https://www.drupal.org/docs/8/core/modules/file/overview#content-accessing-private-files",target:"_blank",rel:"noopener noreferrer"}},[e._v("private file system"),t("OutboundLink")],1),e._v(" (needed to store encrypted public+private key)")]),e._v(" "),t("li",[e._v("Commerce BTCPay configuration ("),t("strong",[e._v("Commerce -> Configuration -> Payment -> Payment gateways")]),e._v("):")]),e._v(" "),t("li",[e._v('Add payment method "BTCPay"\n'),t("ul",[t("li",[t("strong",[e._v("Mode")]),e._v(": Test or Live (you can configure both individually)")]),e._v(" "),t("li",[t("strong",[e._v("Test/Live server host")]),e._v(": enter your URL without https:// prefix e.g. btcpay.yourserver.com (Note - valid SSL certificate needed)")]),e._v(" "),t("li",[t("strong",[e._v("Test/Live Paring code")]),e._v(': enter the 7-digit pairing code from BTCPay "Access tokens" page')]),e._v(" "),t("li",[e._v("Click "),t("strong",[e._v("Save")]),e._v(" to finalize the setup."),t("br"),e._v("\nYou should see a message that the tokens were successfully created.")])])])]),e._v(" "),t("h2",{attrs:{id:"status"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#status"}},[e._v("#")]),e._v(" Status")]),e._v(" "),t("p",[t("strong",[e._v("This module is currently in alpha stage but has proven stable without issues.")]),t("br"),e._v("\nFuture updates and releases will be available on the "),t("a",{attrs:{href:"https://drupal.org/project/commerce_btcpay",target:"_blank",rel:"noopener noreferrer"}},[e._v("project page on drupal.org"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"about-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-btcpay-server"}},[e._v("#")]),e._v(" About BTCPay Server")]),e._v(" "),t("blockquote",[t("p",[t("a",{attrs:{href:"https://btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server"),t("OutboundLink")],1),e._v(" is a self-hosted, open-source cryptocurrency payment processor know for its security, privacy, and censorship resistance.")])]),e._v(" "),t("p",[e._v("It's free to use and allows you to become your own payment processor.\n"),t("strong",[e._v("To get a full overview check out our "),t("a",{attrs:{href:""}},[e._v("documentationhttps://github.com/btcpayserver/commerce_btcpay/blob/master/")]),e._v(".")])]),e._v(" "),t("h2",{attrs:{id:"compatible-with-bitpay-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#compatible-with-bitpay-api"}},[e._v("#")]),e._v(" Compatible with BitPay API")]),e._v(" "),t("p",[e._v("BTCPay was created to be an alternative to 3rd party payment provider "),t("a",{attrs:{href:"https://bitpay.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("BitPay"),t("OutboundLink")],1),e._v(". Therefore, BTCPay is invoice API compatible and you can use this payment plugin also with the official BitPay API and sites. The power of BTCPay is that you can become your own payment provider.")]),e._v(" "),t("p",[e._v("Teaser: future versions of this plugin will be based on the BTCPay Server Greenfield API which is much more powerful and allows more features.")]),e._v(" "),t("h2",{attrs:{id:"get-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#get-support"}},[e._v("#")]),e._v(" Get Support")]),e._v(" "),t("p",[e._v("You can open an issue on our "),t("a",{attrs:{href:"https://github.com/btcpayserver/commerce_btcpay/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github repository"),t("OutboundLink")],1),e._v(" or reach us on "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"http://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost chat"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[141],{832:function(e,t,r){"use strict";r.r(t);var a=r(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"accept-bitcoin-on-your-drupal-commerce-store-using-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#accept-bitcoin-on-your-drupal-commerce-store-using-btcpay-server"}},[e._v("#")]),e._v(" Accept Bitcoin on your Drupal Commerce Store using BTCPay Server")]),e._v(" "),t("p",[e._v("Introducing BTCPay Server payment module for "),t("a",{attrs:{href:"https://www.drupal.org/project/commerce",target:"_blank",rel:"noopener noreferrer"}},[e._v("Drupal Commerce 2.x"),t("OutboundLink")],1),e._v(". Drupal Commerce Store owners can now accept payments using Bitcoin and other cryptocurrencies directly through BTCPay Server without any third-party intermediary.")]),e._v(" "),t("p",[e._v("BTCPay Server supports a wide range of cryptocurrencies, with the potential for future extensions. Here are the currencies you can use now on BTCPay Server:")]),e._v(" "),t("ul",[t("li",[e._v("BTC (Bitcoin)")]),e._v(" "),t("li",[e._v("Bitcoin layer-two network (the Lightning Network) for fast and zero/low-fee transactions")]),e._v(" "),t("li",[e._v("Altcoins with full node integration including coins like Monero (XMR) and Litecoin (LTC).")]),e._v(" "),t("li",[e._v("Other Major Altcoins: Supported through plugins via platforms such as "),t("RouterLink",{attrs:{to:"/Trocador/"}},[e._v("Trocador")]),e._v(", "),t("RouterLink",{attrs:{to:"/SideShift/"}},[e._v("SideShift")]),e._v(", and FixedFloat.")],1)]),e._v(" "),t("p",[e._v("Want to accept Bitcoin on your Drupal Commerce store? Visit the "),t("a",{attrs:{href:"https://drupal.org/project/commerce_btcpay",target:"_blank",rel:"noopener noreferrer"}},[e._v("project page on Drupal.org"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"demo-store"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#demo-store"}},[e._v("#")]),e._v(" Demo store")]),e._v(" "),t("p",[e._v("A Drupal Commerce demo store connected with a (testnet) BTCPay Server where you can try the checkout (Bitcoin + Lightning Network) can be found here:"),t("br"),e._v(" "),t("a",{attrs:{href:"http://drupal.demo.btcpay.tech/",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://drupal.demo.btcpay.tech"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("BTCPay Server ("),t("a",{attrs:{href:"/deployment/deployment"}},[e._v("self hosted or 3rd party")]),e._v(" or "),t("a",{attrs:{href:"/btcpay-basics/tryitout"}},[e._v("quick start with a testserver")]),e._v(")")]),e._v(" "),t("li",[e._v("Drupal Commerce 2.x installed ("),t("a",{attrs:{href:"https://docs.drupalcommerce.org/commerce2/developer-guide/install-update/installation",target:"_blank",rel:"noopener noreferrer"}},[e._v("installation guide"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[e._v("Drupal: "),t("a",{attrs:{href:"https://www.drupal.org/docs/8/core/modules/file/overview#content-accessing-private-files",target:"_blank",rel:"noopener noreferrer"}},[e._v("configured and writable private file system"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"installation-and-configuration-guide-for-the-btcpay-server-drupal-commerce-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation-and-configuration-guide-for-the-btcpay-server-drupal-commerce-integration"}},[e._v("#")]),e._v(" Installation and configuration Guide for the BTCPay Server - Drupal Commerce Integration")]),e._v(" "),t("p",[e._v("Ready to accept Bitcoin on your Drupal Commerce Store? Follow this quick and easy guide to install and configure the BTCPay Drupal Commerce module. For a quick run through, check out our installation and configuration screencast:")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/XBZwyC2v48s/hqdefault.jpg)"},attrs:{href:"https://youtube.com/watch?v=XBZwyC2v48s",title:"BTCPay Server - Drupal Commerce 2.x quick walkthrough","data-id":"XBZwyC2v48s"}},[t("iframe",{attrs:{title:"BTCPay Server - Drupal Commerce 2.x quick walkthrough","data-src":"https://www.youtube-nocookie.com/embed/XBZwyC2v48s?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h3",{attrs:{id:"easy-setup-steps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#easy-setup-steps"}},[e._v("#")]),e._v(" Easy setup steps")]),e._v(" "),t("h4",{attrs:{id:"generate-pairing-code-on-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generate-pairing-code-on-btcpay-server"}},[e._v("#")]),e._v(" Generate pairing code on BTCPay server")]),e._v(" "),t("ol",[t("li",[t("strong",[e._v("Setup your store:")]),e._v(" You'd need a BTCPay server instance to get started. Don't have one? click "),t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("here")]),e._v(" for a step by step guide.")],1),e._v(" "),t("li",[t("strong",[e._v("Access Tokens:")]),e._v(' Once you have your BTCPay Server instance setup and store created, navigate to the store settings and select "'),t("strong",[e._v("Access Tokens")]),e._v('"')]),e._v(" "),t("li",[e._v("Create a new token by clicking on "),t("strong",[e._v("[Create a new token]")])]),e._v(" "),t("li",[t("strong",[e._v("Label:")]),e._v(" enter some label (eg. my store)")]),e._v(" "),t("li",[t("strong",[e._v("Public key:")]),e._v(" this needs to be left "),t("strong",[e._v("empty")])]),e._v(" "),t("li",[t("strong",[e._v("Facade:")]),e._v(' Type in "merchant"')]),e._v(" "),t("li",[e._v("Click on "),t("strong",[e._v("[Request pairing]")])]),e._v(" "),t("li",[e._v("On the next screen choose your configured store in ** Pair to** select dropdown and click on "),t("strong",[e._v("[approve]")])]),e._v(" "),t("li",[e._v('Note down the displayed 7-digit code at the top status message, e.g. "d7afaXr"'),t("br"),e._v("\n(you will need that code below on gateway configuration, see below)")])]),e._v(" "),t("h4",{attrs:{id:"commerce-btcpay-installation-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#commerce-btcpay-installation-configuration"}},[e._v("#")]),e._v(" Commerce BTCPay: Installation + configuration")]),e._v(" "),t("ol",[t("li",[e._v("Install module: "),t("code",[e._v("composer require drupal/commerce_btcpay")])]),e._v(" "),t("li",[e._v("Enable the module: "),t("code",[e._v("drush en commerce_btcpay -y")])]),e._v(" "),t("li",[e._v("Make sure you have configured "),t("a",{attrs:{href:"https://www.drupal.org/docs/8/core/modules/file/overview#content-accessing-private-files",target:"_blank",rel:"noopener noreferrer"}},[e._v("private file system"),t("OutboundLink")],1),e._v(" (needed to store encrypted public+private key)")]),e._v(" "),t("li",[e._v("Commerce BTCPay configuration ("),t("strong",[e._v("Commerce -> Configuration -> Payment -> Payment gateways")]),e._v("):")]),e._v(" "),t("li",[e._v('Add payment method "BTCPay"\n'),t("ul",[t("li",[t("strong",[e._v("Mode")]),e._v(": Test or Live (you can configure both individually)")]),e._v(" "),t("li",[t("strong",[e._v("Test/Live server host")]),e._v(": enter your URL without https:// prefix e.g. btcpay.yourserver.com (Note - valid SSL certificate needed)")]),e._v(" "),t("li",[t("strong",[e._v("Test/Live Paring code")]),e._v(': enter the 7-digit pairing code from BTCPay "Access tokens" page')]),e._v(" "),t("li",[e._v("Click "),t("strong",[e._v("Save")]),e._v(" to finalize the setup."),t("br"),e._v("\nYou should see a message that the tokens were successfully created.")])])])]),e._v(" "),t("h2",{attrs:{id:"status"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#status"}},[e._v("#")]),e._v(" Status")]),e._v(" "),t("p",[t("strong",[e._v("This module is currently in alpha stage but has proven stable without issues.")]),t("br"),e._v("\nFuture updates and releases will be available on the "),t("a",{attrs:{href:"https://drupal.org/project/commerce_btcpay",target:"_blank",rel:"noopener noreferrer"}},[e._v("project page on drupal.org"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"about-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-btcpay-server"}},[e._v("#")]),e._v(" About BTCPay Server")]),e._v(" "),t("blockquote",[t("p",[t("a",{attrs:{href:"https://btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server"),t("OutboundLink")],1),e._v(" is a self-hosted, open-source cryptocurrency payment processor know for its security, privacy, and censorship resistance.")])]),e._v(" "),t("p",[e._v("It's free to use and allows you to become your own payment processor.\n"),t("strong",[e._v("To get a full overview check out our "),t("a",{attrs:{href:""}},[e._v("documentationhttps://github.com/btcpayserver/commerce_btcpay/blob/master/")]),e._v(".")])]),e._v(" "),t("h2",{attrs:{id:"compatible-with-bitpay-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#compatible-with-bitpay-api"}},[e._v("#")]),e._v(" Compatible with BitPay API")]),e._v(" "),t("p",[e._v("BTCPay was created to be an alternative to 3rd party payment provider "),t("a",{attrs:{href:"https://bitpay.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("BitPay"),t("OutboundLink")],1),e._v(". Therefore, BTCPay is invoice API compatible and you can use this payment plugin also with the official BitPay API and sites. The power of BTCPay is that you can become your own payment provider.")]),e._v(" "),t("p",[e._v("Teaser: future versions of this plugin will be based on the BTCPay Server Greenfield API which is much more powerful and allows more features.")]),e._v(" "),t("h2",{attrs:{id:"get-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#get-support"}},[e._v("#")]),e._v(" Get Support")]),e._v(" "),t("p",[e._v("You can open an issue on our "),t("a",{attrs:{href:"https://github.com/btcpayserver/commerce_btcpay/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github repository"),t("OutboundLink")],1),e._v(" or reach us on "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"http://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost chat"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/142.4db575f5.js b/assets/js/142.192bf544.js similarity index 96% rename from assets/js/142.4db575f5.js rename to assets/js/142.192bf544.js index 7858e23a14..146ea854cc 100644 --- a/assets/js/142.4db575f5.js +++ b/assets/js/142.192bf544.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[142],{834:function(e,t,r){"use strict";r.r(t);var a=r(17),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"dynamic-reports-plugin-for-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-reports-plugin-for-btcpay-server"}},[e._v("#")]),e._v(" Dynamic Reports Plugin for BTCPay Server")]),e._v(" "),t("p",[e._v("This plugin allows you to create dynamic reports in BTCPay Server, along with re-enabling the old invoice export report.")]),e._v(" "),t("h2",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("p",[e._v('After installing the plugin, go to "Server Settings" -> "Dynamic Reports".')]),e._v(" "),t("h3",{attrs:{id:"re-enabling-the-old-invoice-export-report"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#re-enabling-the-old-invoice-export-report"}},[e._v("#")]),e._v(" Re-enabling the old invoice export report")]),e._v(" "),t("p",[e._v('There is a toggle button called "Enable legacy report" available to re-enable the old invoice export. After enabling it will be available in the "Reporting" menu alongside the other existing reports. This report will be available to all users on your instance.')]),e._v(" "),t("h3",{attrs:{id:"creating-custom-reports"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#creating-custom-reports"}},[e._v("#")]),e._v(" Creating custom reports")]),e._v(" "),t("p",[e._v("You can create new reports using raw sql (postgres). These reports are only viewable if you are a server admin by default. You can change this by explicitly specifying it in the report.")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[142],{833:function(e,t,r){"use strict";r.r(t);var a=r(17),i=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"dynamic-reports-plugin-for-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dynamic-reports-plugin-for-btcpay-server"}},[e._v("#")]),e._v(" Dynamic Reports Plugin for BTCPay Server")]),e._v(" "),t("p",[e._v("This plugin allows you to create dynamic reports in BTCPay Server, along with re-enabling the old invoice export report.")]),e._v(" "),t("h2",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("p",[e._v('After installing the plugin, go to "Server Settings" -> "Dynamic Reports".')]),e._v(" "),t("h3",{attrs:{id:"re-enabling-the-old-invoice-export-report"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#re-enabling-the-old-invoice-export-report"}},[e._v("#")]),e._v(" Re-enabling the old invoice export report")]),e._v(" "),t("p",[e._v('There is a toggle button called "Enable legacy report" available to re-enable the old invoice export. After enabling it will be available in the "Reporting" menu alongside the other existing reports. This report will be available to all users on your instance.')]),e._v(" "),t("h3",{attrs:{id:"creating-custom-reports"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#creating-custom-reports"}},[e._v("#")]),e._v(" Creating custom reports")]),e._v(" "),t("p",[e._v("You can create new reports using raw sql (postgres). These reports are only viewable if you are a server admin by default. You can change this by explicitly specifying it in the report.")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/143.1e642c42.js b/assets/js/143.ae977f45.js similarity index 99% rename from assets/js/143.1e642c42.js rename to assets/js/143.ae977f45.js index 86f2fb11b1..ce3aae7f03 100644 --- a/assets/js/143.1e642c42.js +++ b/assets/js/143.ae977f45.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[143],{835:function(e,t,r){"use strict";r.r(t);var o=r(17),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"electrum-personal-server-eps-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#electrum-personal-server-eps-integration"}},[e._v("#")]),e._v(" Electrum Personal Server (EPS) integration")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Personal Server or EPS"),t("OutboundLink")],1),e._v(" is a personal version of public Electrum servers like "),t("RouterLink",{attrs:{to:"/ElectrumX/"}},[e._v("ElectrumX")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("EPS can be integrated into BTCPay Server")]),e._v(" using the optional docker fragment "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrum-ps.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-ps.yml"),t("OutboundLink")],1),e._v(". Use EPS when you want to use your own full node (included in BTCPay Server) to verify your own transactions privately when using Electrum Wallet.")]),e._v(" "),t("p",[e._v("The biggest difference with public Electrum servers (eg. ElectrumX), is that "),t("strong",[e._v("EPS is for monitoring only your own wallet(s)")]),e._v('. The "XPUB" (extended public key) of the wallet you use in Electrum must be shared with EPS in order for it to function all all. Other than this, it functions (from an end user perspective) in the same way as ElectrumX etc. It is '),t("strong",[e._v("easy to integrate into BTCPay")]),e._v(" just follow the instructions below.")]),e._v(" "),t("p",[e._v("EPS does not require "),t("code",[e._v("txindex")]),e._v(" and works on a pruned node.")]),e._v(" "),t("h2",{attrs:{id:"about-tor-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-tor-support"}},[e._v("#")]),e._v(" About Tor support")]),e._v(" "),t("p",[e._v("By default your EPS is accessible over Tor. You can run the following command line via SSH on your server to get your Tor address:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" /var/lib/docker/volumes/generated_tor_servicesdir/_data/btc-electrum-ps/hostname\n")])])]),t("p",[e._v("You can can also go to your BTCPay Server > Server Settings > Services and find the tor link in "),t("code",[e._v("Other TOR hidden services")]),e._v(".")]),e._v(" "),t("p",[e._v("On the Electrum wallet machine, if you want to connect to your server via Tor, we assume in this tutorial that you run the Tor Browser locally, and thus you will use SOCKS5 port "),t("code",[e._v("9150")]),e._v(". If you run Tor through the command line instead, the local SOCKS5 port is "),t("code",[e._v("9050")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-enable-electrum-personal-server-eps-in-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-enable-electrum-personal-server-eps-in-btcpay"}},[e._v("#")]),e._v(" How to enable Electrum Personal Server (EPS) in BTCPay:")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("If you do not use Tor")]),e._v(", EPS is accessible for Electrum Wallets via TCP port 50002. You need to open this port up fully at least to be available within your own network to any PC or Android device running Electrum Wallet, and turn on port forwarding. If you use Tor, you can skip this step.")])]),e._v(" "),t("li",[t("p",[e._v('As EPS is for a single wallet (single user), you must specify the XPUB/YPUB/ZPUB of your wallet as an environment varable before you enable the EPS docker-fragment. In Electrum Wallet go to the "Wallet" menu then select "Information" to copy and paste yours. Set ENV variable for your wallet XPUB and enable the Docker Additional Fragment on your BTCPay node by running the following steps:')])])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-electrum-ps"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("EPS_XPUB")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"XPUB_ADD_YOUR_XPUB_YPUB_OR_ZPUB_HERE"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("ol",{attrs:{start:"3"}},[t("li",[e._v("WAIT for your Bitcoin full node and EPS server to fully sync:\nYou can check the status of bitcoin core sync by going to your domain for BTCPay server, and it will show you on the front page. Or, you can check from the command line as well, using these commands:\n"),t("code",[e._v("docker logs btcpayserver_bitcoind")]),e._v(" - this will show you the bitcoin core blockchain sync status (and ALL other info about your node, including any errors)\n"),t("code",[e._v("docker logs generated_electrum_ps_1")]),e._v(" - this will show you the EPS sync status. Note: EPS will NOT start syncing until bitcoin full node has finished syncing, you will see errors until that is finished and these can be ignored.")])]),e._v(" "),t("p",[e._v("Once all syncing for both bitcoin and EPS have finished synching, you can proceed to the next step. (Note: Electrum wallets will not connect to an EPS server that has not finished synching)")]),e._v(" "),t("h2",{attrs:{id:"how-to-connect-electrum-wallet-to-eps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-connect-electrum-wallet-to-eps"}},[e._v("#")]),e._v(" How to connect Electrum Wallet to EPS")]),e._v(" "),t("p",[e._v("There are three ways to use your server from Electrum Wallet:")]),e._v(" "),t("ol",[t("li",[e._v("By editing the configuration file")]),e._v(" "),t("li",[e._v("By running Electrum by the command line")]),e._v(" "),t("li",[e._v("Via the user interface (not recommended, bad privacy)")])]),e._v(" "),t("h4",{attrs:{id:"option-1-connect-to-your-eps-server-by-directly-editing-electrum-wallet-config-file-before-even-opening-the-electrum-wallet-gui-recommended-for-full-privacy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#option-1-connect-to-your-eps-server-by-directly-editing-electrum-wallet-config-file-before-even-opening-the-electrum-wallet-gui-recommended-for-full-privacy"}},[e._v("#")]),e._v(" Option 1: Connect to your EPS Server by directly editing Electrum Wallet config file (before even opening the Electrum wallet GUI - recommended for full privacy):")]),e._v(" "),t("p",[e._v("You can "),t("strong",[e._v("setup your Electrum server")]),e._v(" by editing the configuration file.")]),e._v(" "),t("p",[e._v("In the "),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Wallet folder"),t("OutboundLink")],1),e._v(", open and edit the "),t("code",[e._v("config")]),e._v(" file like this:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"auto_connect": true,')]),e._v(" and switch it to: "),t("code",[e._v('"auto_connect": false,')]),e._v(" - this will prevent your Electrum Wallet from auto-connecting to other 3rd party Electrum Servers at launch time (to obtain block headers and transaction information).")])]),e._v(" "),t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"oneserver": false,')]),e._v(" and switch it to: "),t("code",[e._v('"oneserver": true,')]),e._v(" - ensures that all data is obtained from just one server.")])]),e._v(" "),t("li",[t("p",[e._v("Find or add line: "),t("code",[e._v('"server": "yourserver:50002:s",')]),e._v("and switch it to your own EPS Server's IP address, in the example above this would be: "),t("code",[e._v('"server": "192.168.1.3:50002:s",')]),e._v("- hard code your IP address as the default upon opening the Wallet.")])])]),e._v(" "),t("p",[e._v("These 3 steps strongly recommended for full privacy by locking down Electrum Wallet to one single connection with your private server only ("),t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server#how-to",target:"_blank",rel:"noopener noreferrer"}},[e._v("Reference"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("("),t("strong",[e._v("If you use Tor")]),e._v(") If you run Tor Browser, you can use it as SOCK5 proxy by adding "),t("code",[e._v('"proxy": "socks5:127.0.0.1:9150::",')]),e._v(" to the configuration file.")])]),e._v(" "),t("h4",{attrs:{id:"option-3-connect-to-your-eps-server-by-command-line"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#option-3-connect-to-your-eps-server-by-command-line"}},[e._v("#")]),e._v(" Option 3: Connect to your EPS Server by command line")]),e._v(" "),t("p",[e._v("You can run electrum via command line "),t("code",[e._v("electrum --oneserver --server yourserver:50002:s")]),e._v(".")]),e._v(" "),t("p",[e._v("If you use Tor, add "),t("code",[e._v("-p socks5:localhost:9150")]),e._v(".")]),e._v(" "),t("h4",{attrs:{id:"option-4-connect-to-your-eps-server-from-electrum-wallet-gui-not-recommended-as-this-will-momentarily-connects-with-other-random-public-electrum-servers-if-you-are-online"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#option-4-connect-to-your-eps-server-from-electrum-wallet-gui-not-recommended-as-this-will-momentarily-connects-with-other-random-public-electrum-servers-if-you-are-online"}},[e._v("#")]),e._v(" Option 4: Connect to your EPS Server from Electrum Wallet GUI (not recommended as this will momentarily connects with other random public Electrum servers if you are online):")]),e._v(" "),t("ol",[t("li",[e._v("Open Electrum Wallet. When you click the traffic light (green or red) at the bottom of your Electrum Wallet, you will see a screen with a list of all the available Electrum servers that your wallet can connect to, normally with the "),t("code",[e._v("Select Server Automatically")]),e._v(" box already checked:")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437521-8a5eb580-01c1-11ea-9ece-0666353a6742.png",alt:"ElectrumWalletServerList",title:"ElectrumWalletServerList"}})]),e._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[e._v("Now is the time to UNCHECK that "),t("code",[e._v("Select Server Automatically")]),e._v(" setting, which will enable you to enter the IP address or domain or hostname of your EPS Server. In the case below, the EPS server is on the local network at "),t("code",[e._v("192.168.1.3")]),e._v(" so we enter that manually (leave port as 50002) and press "),t("code",[e._v("close")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68496320-4e276580-0252-11ea-8caf-facc8a246d70.png",alt:"EnterElectrumServerIP",title:"EnterElectrumServerIP"}})]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[t("p",[e._v("("),t("strong",[e._v("If you use Tor")]),e._v(") Go to proxy, then click on "),t("code",[e._v("Use Tor Proxy at port 9150")]),e._v(".")])]),e._v(" "),t("li",[t("p",[e._v("If all of the above worked well, and your node is healthy and synched, you will get a green traffic light down the bottom right of the wallet screen - that means success!")])])]),e._v(" "),t("h3",{attrs:{id:"reflection-on-what-has-been-achieved"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reflection-on-what-has-been-achieved"}},[e._v("#")]),e._v(" Reflection on what has been achieved:")]),e._v(" "),t("p",[e._v("You are now running your very "),t("strong",[e._v("own private EPS Server")]),e._v(". All Electrum Wallet related data transfer happens directly between your EPS Server and the bitcoin blockchain, without going over any other 3rd party servers. You have attained full bitcoin transaction privacy (at least from the perspective of your blockchain queries and transactions, payment/receive addresses etc - nobody except you and the blockchain can see what you are doing).")]),e._v(" "),t("h3",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting:")]),e._v(" "),t("p",[e._v("So there is one thing you may encounter, where even after you did everything correctly, you still get a red traffic light (which means not connected to any server) in the steps above. Any other troubleshooting tips that people encounter can be added, I would suggest to make a PR to this document directly.")]),e._v(" "),t("ul",[t("li",[e._v("If you get a red traffic light, shutdown Electrum Wallet completely, then go to your Electrum Wallet folder ("),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("see here"),t("OutboundLink")],1),e._v(" if you don't know where that is).")])]),e._v(" "),t("p",[e._v("Inside the Electrum Wallet folder (in this case below, it is what it looks like on a Mac) locate the "),t("code",[e._v("certs")]),e._v(" directory and delete the certificate for the server you are trying to connect to, in this case "),t("code",[e._v("192.168.1.3")]),e._v(", by dragging it to the Trash.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68497330-9a73a500-0254-11ea-9349-71bdb3bd9511.png",alt:"Certs",title:"Certs"}})]),e._v(" "),t("p",[e._v("Start up Electrum Wallet again, and connect to your "),t("strong",[e._v("EPS server")]),e._v(". If it is fully synched, it will now likely show a green traffic light, and you are good to go.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[143],{834:function(e,t,r){"use strict";r.r(t);var o=r(17),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"electrum-personal-server-eps-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#electrum-personal-server-eps-integration"}},[e._v("#")]),e._v(" Electrum Personal Server (EPS) integration")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Personal Server or EPS"),t("OutboundLink")],1),e._v(" is a personal version of public Electrum servers like "),t("RouterLink",{attrs:{to:"/ElectrumX/"}},[e._v("ElectrumX")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("EPS can be integrated into BTCPay Server")]),e._v(" using the optional docker fragment "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrum-ps.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("opt-add-electrum-ps.yml"),t("OutboundLink")],1),e._v(". Use EPS when you want to use your own full node (included in BTCPay Server) to verify your own transactions privately when using Electrum Wallet.")]),e._v(" "),t("p",[e._v("The biggest difference with public Electrum servers (eg. ElectrumX), is that "),t("strong",[e._v("EPS is for monitoring only your own wallet(s)")]),e._v('. The "XPUB" (extended public key) of the wallet you use in Electrum must be shared with EPS in order for it to function all all. Other than this, it functions (from an end user perspective) in the same way as ElectrumX etc. It is '),t("strong",[e._v("easy to integrate into BTCPay")]),e._v(" just follow the instructions below.")]),e._v(" "),t("p",[e._v("EPS does not require "),t("code",[e._v("txindex")]),e._v(" and works on a pruned node.")]),e._v(" "),t("h2",{attrs:{id:"about-tor-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#about-tor-support"}},[e._v("#")]),e._v(" About Tor support")]),e._v(" "),t("p",[e._v("By default your EPS is accessible over Tor. You can run the following command line via SSH on your server to get your Tor address:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("cat")]),e._v(" /var/lib/docker/volumes/generated_tor_servicesdir/_data/btc-electrum-ps/hostname\n")])])]),t("p",[e._v("You can can also go to your BTCPay Server > Server Settings > Services and find the tor link in "),t("code",[e._v("Other TOR hidden services")]),e._v(".")]),e._v(" "),t("p",[e._v("On the Electrum wallet machine, if you want to connect to your server via Tor, we assume in this tutorial that you run the Tor Browser locally, and thus you will use SOCKS5 port "),t("code",[e._v("9150")]),e._v(". If you run Tor through the command line instead, the local SOCKS5 port is "),t("code",[e._v("9050")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-enable-electrum-personal-server-eps-in-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-enable-electrum-personal-server-eps-in-btcpay"}},[e._v("#")]),e._v(" How to enable Electrum Personal Server (EPS) in BTCPay:")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("If you do not use Tor")]),e._v(", EPS is accessible for Electrum Wallets via TCP port 50002. You need to open this port up fully at least to be available within your own network to any PC or Android device running Electrum Wallet, and turn on port forwarding. If you use Tor, you can skip this step.")])]),e._v(" "),t("li",[t("p",[e._v('As EPS is for a single wallet (single user), you must specify the XPUB/YPUB/ZPUB of your wallet as an environment varable before you enable the EPS docker-fragment. In Electrum Wallet go to the "Wallet" menu then select "Information" to copy and paste yours. Set ENV variable for your wallet XPUB and enable the Docker Additional Fragment on your BTCPay node by running the following steps:')])])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-electrum-ps"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("EPS_XPUB")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"XPUB_ADD_YOUR_XPUB_YPUB_OR_ZPUB_HERE"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("ol",{attrs:{start:"3"}},[t("li",[e._v("WAIT for your Bitcoin full node and EPS server to fully sync:\nYou can check the status of bitcoin core sync by going to your domain for BTCPay server, and it will show you on the front page. Or, you can check from the command line as well, using these commands:\n"),t("code",[e._v("docker logs btcpayserver_bitcoind")]),e._v(" - this will show you the bitcoin core blockchain sync status (and ALL other info about your node, including any errors)\n"),t("code",[e._v("docker logs generated_electrum_ps_1")]),e._v(" - this will show you the EPS sync status. Note: EPS will NOT start syncing until bitcoin full node has finished syncing, you will see errors until that is finished and these can be ignored.")])]),e._v(" "),t("p",[e._v("Once all syncing for both bitcoin and EPS have finished synching, you can proceed to the next step. (Note: Electrum wallets will not connect to an EPS server that has not finished synching)")]),e._v(" "),t("h2",{attrs:{id:"how-to-connect-electrum-wallet-to-eps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-connect-electrum-wallet-to-eps"}},[e._v("#")]),e._v(" How to connect Electrum Wallet to EPS")]),e._v(" "),t("p",[e._v("There are three ways to use your server from Electrum Wallet:")]),e._v(" "),t("ol",[t("li",[e._v("By editing the configuration file")]),e._v(" "),t("li",[e._v("By running Electrum by the command line")]),e._v(" "),t("li",[e._v("Via the user interface (not recommended, bad privacy)")])]),e._v(" "),t("h4",{attrs:{id:"option-1-connect-to-your-eps-server-by-directly-editing-electrum-wallet-config-file-before-even-opening-the-electrum-wallet-gui-recommended-for-full-privacy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#option-1-connect-to-your-eps-server-by-directly-editing-electrum-wallet-config-file-before-even-opening-the-electrum-wallet-gui-recommended-for-full-privacy"}},[e._v("#")]),e._v(" Option 1: Connect to your EPS Server by directly editing Electrum Wallet config file (before even opening the Electrum wallet GUI - recommended for full privacy):")]),e._v(" "),t("p",[e._v("You can "),t("strong",[e._v("setup your Electrum server")]),e._v(" by editing the configuration file.")]),e._v(" "),t("p",[e._v("In the "),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Wallet folder"),t("OutboundLink")],1),e._v(", open and edit the "),t("code",[e._v("config")]),e._v(" file like this:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"auto_connect": true,')]),e._v(" and switch it to: "),t("code",[e._v('"auto_connect": false,')]),e._v(" - this will prevent your Electrum Wallet from auto-connecting to other 3rd party Electrum Servers at launch time (to obtain block headers and transaction information).")])]),e._v(" "),t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"oneserver": false,')]),e._v(" and switch it to: "),t("code",[e._v('"oneserver": true,')]),e._v(" - ensures that all data is obtained from just one server.")])]),e._v(" "),t("li",[t("p",[e._v("Find or add line: "),t("code",[e._v('"server": "yourserver:50002:s",')]),e._v("and switch it to your own EPS Server's IP address, in the example above this would be: "),t("code",[e._v('"server": "192.168.1.3:50002:s",')]),e._v("- hard code your IP address as the default upon opening the Wallet.")])])]),e._v(" "),t("p",[e._v("These 3 steps strongly recommended for full privacy by locking down Electrum Wallet to one single connection with your private server only ("),t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server#how-to",target:"_blank",rel:"noopener noreferrer"}},[e._v("Reference"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("("),t("strong",[e._v("If you use Tor")]),e._v(") If you run Tor Browser, you can use it as SOCK5 proxy by adding "),t("code",[e._v('"proxy": "socks5:127.0.0.1:9150::",')]),e._v(" to the configuration file.")])]),e._v(" "),t("h4",{attrs:{id:"option-3-connect-to-your-eps-server-by-command-line"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#option-3-connect-to-your-eps-server-by-command-line"}},[e._v("#")]),e._v(" Option 3: Connect to your EPS Server by command line")]),e._v(" "),t("p",[e._v("You can run electrum via command line "),t("code",[e._v("electrum --oneserver --server yourserver:50002:s")]),e._v(".")]),e._v(" "),t("p",[e._v("If you use Tor, add "),t("code",[e._v("-p socks5:localhost:9150")]),e._v(".")]),e._v(" "),t("h4",{attrs:{id:"option-4-connect-to-your-eps-server-from-electrum-wallet-gui-not-recommended-as-this-will-momentarily-connects-with-other-random-public-electrum-servers-if-you-are-online"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#option-4-connect-to-your-eps-server-from-electrum-wallet-gui-not-recommended-as-this-will-momentarily-connects-with-other-random-public-electrum-servers-if-you-are-online"}},[e._v("#")]),e._v(" Option 4: Connect to your EPS Server from Electrum Wallet GUI (not recommended as this will momentarily connects with other random public Electrum servers if you are online):")]),e._v(" "),t("ol",[t("li",[e._v("Open Electrum Wallet. When you click the traffic light (green or red) at the bottom of your Electrum Wallet, you will see a screen with a list of all the available Electrum servers that your wallet can connect to, normally with the "),t("code",[e._v("Select Server Automatically")]),e._v(" box already checked:")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437521-8a5eb580-01c1-11ea-9ece-0666353a6742.png",alt:"ElectrumWalletServerList",title:"ElectrumWalletServerList"}})]),e._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[e._v("Now is the time to UNCHECK that "),t("code",[e._v("Select Server Automatically")]),e._v(" setting, which will enable you to enter the IP address or domain or hostname of your EPS Server. In the case below, the EPS server is on the local network at "),t("code",[e._v("192.168.1.3")]),e._v(" so we enter that manually (leave port as 50002) and press "),t("code",[e._v("close")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68496320-4e276580-0252-11ea-8caf-facc8a246d70.png",alt:"EnterElectrumServerIP",title:"EnterElectrumServerIP"}})]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[t("p",[e._v("("),t("strong",[e._v("If you use Tor")]),e._v(") Go to proxy, then click on "),t("code",[e._v("Use Tor Proxy at port 9150")]),e._v(".")])]),e._v(" "),t("li",[t("p",[e._v("If all of the above worked well, and your node is healthy and synched, you will get a green traffic light down the bottom right of the wallet screen - that means success!")])])]),e._v(" "),t("h3",{attrs:{id:"reflection-on-what-has-been-achieved"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reflection-on-what-has-been-achieved"}},[e._v("#")]),e._v(" Reflection on what has been achieved:")]),e._v(" "),t("p",[e._v("You are now running your very "),t("strong",[e._v("own private EPS Server")]),e._v(". All Electrum Wallet related data transfer happens directly between your EPS Server and the bitcoin blockchain, without going over any other 3rd party servers. You have attained full bitcoin transaction privacy (at least from the perspective of your blockchain queries and transactions, payment/receive addresses etc - nobody except you and the blockchain can see what you are doing).")]),e._v(" "),t("h3",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting:")]),e._v(" "),t("p",[e._v("So there is one thing you may encounter, where even after you did everything correctly, you still get a red traffic light (which means not connected to any server) in the steps above. Any other troubleshooting tips that people encounter can be added, I would suggest to make a PR to this document directly.")]),e._v(" "),t("ul",[t("li",[e._v("If you get a red traffic light, shutdown Electrum Wallet completely, then go to your Electrum Wallet folder ("),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("see here"),t("OutboundLink")],1),e._v(" if you don't know where that is).")])]),e._v(" "),t("p",[e._v("Inside the Electrum Wallet folder (in this case below, it is what it looks like on a Mac) locate the "),t("code",[e._v("certs")]),e._v(" directory and delete the certificate for the server you are trying to connect to, in this case "),t("code",[e._v("192.168.1.3")]),e._v(", by dragging it to the Trash.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68497330-9a73a500-0254-11ea-9349-71bdb3bd9511.png",alt:"Certs",title:"Certs"}})]),e._v(" "),t("p",[e._v("Start up Electrum Wallet again, and connect to your "),t("strong",[e._v("EPS server")]),e._v(". If it is fully synched, it will now likely show a green traffic light, and you are good to go.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/144.84dce42a.js b/assets/js/144.49d3e7d3.js similarity index 99% rename from assets/js/144.84dce42a.js rename to assets/js/144.49d3e7d3.js index cc8f468b36..3a76466a76 100644 --- a/assets/js/144.84dce42a.js +++ b/assets/js/144.49d3e7d3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[144],{837:function(e,t,r){"use strict";r.r(t);var a=r(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"electrumx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#electrumx"}},[e._v("#")]),e._v(" ElectrumX")]),e._v(" "),t("p",[e._v("This document explains how to "),t("strong",[e._v("connect Electrum Wallet to an ElectrumX Server")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Note:")]),e._v(" the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("docker version of BTCPay Server"),t("OutboundLink")],1),e._v(" (since Nov 7th 2019, version 1.0.3.137) supports full integration with "),t("a",{attrs:{href:"https://electrumx.readthedocs.io/en/latest/features.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("ElectrumX"),t("OutboundLink")],1),e._v(" is the most widely implemented software used for Electrum public servers that your local Electrum wallet relies upon to get all the details of, or broadcast transactions to the bitcoin blockchain. Skip to Section 2 below, to read more on what this all means, and how to set it up on your BTCPay stack.")]),e._v(" "),t("h2",{attrs:{id:"how-to-integrate-electrumx-into-your-btcpay-server-and-connect-your-electrum-wallet-to-it-for-your-complete-privacy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-integrate-electrumx-into-your-btcpay-server-and-connect-your-electrum-wallet-to-it-for-your-complete-privacy"}},[e._v("#")]),e._v(" How to integrate ElectrumX into your BTCPay Server and connect your Electrum Wallet to it for your complete privacy")]),e._v(" "),t("h3",{attrs:{id:"only-available-in-btcpay-docker-version"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#only-available-in-btcpay-docker-version"}},[e._v("#")]),e._v(" (only available in BTCPay docker version)")]),e._v(" "),t("p",[e._v("Before we proceed, it is important to understand how your Electrum wallet on your PC/Mac functions so well/fast, without having its own bitcoin full node. In actual fact, Electrum Wallet relies on a community effort to maintain a bunch of servers all around the world with a bitcoin full node that do this job for you! They are called Electrum Servers, and you can be a part of that community to make that network even stronger, lets see how.")]),e._v(" "),t("p",[e._v("When you click the little traffic light at the bottom of your Electrum Wallet here:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437133-5636c500-01c0-11ea-822c-6e72bd6d60ea.png",alt:"ElectrumWalletMainScreenLight",title:"ElectrumWalletMainScreenLight"}})]),e._v(" "),t("p",[e._v('You will see this screen with a list of all the available Electrum servers that your wallet can connect to, normally with "Select Server Automatically" already checked:')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437521-8a5eb580-01c1-11ea-9ece-0666353a6742.png",alt:"ElectrumWalletServerList",title:"ElectrumWalletServerList"}})]),e._v(" "),t("p",[e._v('While using Electrum Wallet with "Select Server Automatically" on is the easiest, every transaction that you make/browse/broadcast in your Electrum Wallet will be done via someone else\'s server - this is a privacy risk, that will be mitigated by setting up and using your own ElectrumX Server.')]),e._v(" "),t("h2",{attrs:{id:"section-21-enable-your-own-electrumx-server-fully-integrated-with-your-btcpay-servers-full-bitcoin-node"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-21-enable-your-own-electrumx-server-fully-integrated-with-your-btcpay-servers-full-bitcoin-node"}},[e._v("#")]),e._v(" Section 2.1 Enable Your Own ElectrumX Server (fully integrated with your BTCPay Server's full bitcoin node)")]),e._v(" "),t("h3",{attrs:{id:"prerequisites-mandatory"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites-mandatory"}},[e._v("#")]),e._v(" Prerequisites (mandatory):")]),e._v(" "),t("ol",[t("li",[e._v("Docker only: Only the "),t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("Docker version of BTCPay Server")]),e._v(" is supported.")],1),e._v(" "),t("li",[e._v("Unpruned BTCPay node: Make sure your BTCPay implementation is NOT "),t("RouterLink",{attrs:{to:"/FAQ/Synchronization/#can-i-skip-the-synchronization"}},[e._v("pruned")]),e._v(" (i.e. you have synched and stored from genesis block. Check that you do NOT use the opt-save-storage "),t("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("Environment Variable")]),e._v(")")],1),e._v(" "),t("li",[e._v("Drive space: At least 400GB of drive space on the device where your docker volumes are stored is required (as at the writing of this documentation on 9th Nov 2019, the total hard drive space used is 333GB - with full node and ElectrumX enabled - and of course this will grow further over time).")]),e._v(" "),t("li",[e._v("Additional Fragments: You are familiar with how to use BTCPay's "),t("RouterLink",{attrs:{to:"/Docker/#environment-variables"}},[e._v("Additional Fragment")]),e._v(" feature as part of your environment variable setup.")],1),e._v(" "),t("li",[e._v("Server architecture: The (official) "),t("a",{attrs:{href:"https://github.com/lukechilds/docker-electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("ElectrumX docker"),t("OutboundLink")],1),e._v(" used here is only tested on a BTCPay Server running on x86_64 architecture. So far it is tested extensively on Ubuntu 18.04 and Debian Buster. Unless it is overhauled and tested well on Raspberry Pi (and other architectures) it likely will not work.")]),e._v(" "),t("li",[e._v("Basic Linux command line knowledge: is assumed.")])]),e._v(" "),t("h3",{attrs:{id:"how-will-enabling-electrumx-server-affect-an-existing-btcpay-implementation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-will-enabling-electrumx-server-affect-an-existing-btcpay-implementation"}},[e._v("#")]),e._v(" How will enabling ElectrumX Server affect an existing BTCPay implementation?:")]),e._v(" "),t("p",[e._v("Fundamentally, setting up ElectrumX in BTCPay server is simple, and will not affect the rest of your implementation. The only pre-requisites are as above. The "),t("a",{attrs:{href:"https://github.com/lukechilds/docker-electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("ElectrumX official docker release"),t("OutboundLink")],1),e._v(" is enabled in BTCPay by activating the "),t("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("additional fragment")]),e._v(" called "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrumx.yml",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("opt-add-electumx")]),t("OutboundLink")],1),e._v(". This fragment will not only enable and start the ElectrumX server, it will also enable "),t("code",[e._v("txindex=1")]),e._v(" in your bitcoin full node. "),t("code",[e._v("txindex=1")]),e._v(" (Transaction Index=ON) is a bitcoin core feature required for ElectrumX to be able to serve your Electrum Wallet detailed transaction data for any transaction, directly from the blockchain, without getting it from any third party server.")],1),e._v(" "),t("p",[e._v("If you have been running your BTCPay Server for a while but haven't had "),t("code",[e._v("txindex=1")]),e._v(" set until now, then it might take a few hours to build the index, this is no issue and it should not involve downtime of more than a few hours - better to set this to run overnight though when nobody will be using your node. Note: If you want to rebuild the index from scratch, launch bitcoind once with the "),t("code",[e._v("reindex=1")]),e._v(" option (warning: this reindex option may take a VERY long time, and is not enabled out of the box as you likely dont need it, and hence is not in scope of this document).")]),e._v(" "),t("h3",{attrs:{id:"steps-to-enable-electrumx-server-in-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#steps-to-enable-electrumx-server-in-btcpay"}},[e._v("#")]),e._v(" Steps to enable ElectrumX Server in BTCPay:")]),e._v(" "),t("p",[e._v("Here are all the steps to "),t("strong",[e._v("enable ElectrumX Server in your BTCPay node")]),e._v(' (read carefully as you may need to adjust for your specific setup, especially if you use other custom or conflicting "fragments" (pruning, less-memory etc. To reiterate, you should NOT proceed further here if you run a pruned BTCPay node.')]),e._v(" "),t("ol",[t("li",[t("p",[e._v("ElectrumX Server is accessible for Electrum Wallets via TCP port 50002. You need to open this port up fully at least to be available within your own network to any PC or Android device running Electrum Wallet, and turn on port forwarding (you can also port forward 50002 from your Internet/WAN, to enable other Electrum Wallet users from the Internet to query your server).")])]),e._v(" "),t("li",[t("p",[e._v("Enable the Docker Additional Fragment on your BTCPay node by running the following commands (this is assuming a brand new BTCPay installation with LND and ElectrumX, please tweak accordingly using the "),t("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("relevant documentation")]),e._v(":")],1)]),e._v(" "),t("li",[t("p",[e._v("Follow the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker#full-installation-for-technical-users",target:"_blank",rel:"noopener noreferrer"}},[e._v("normal setup and install of BTCPay Server"),t("OutboundLink")],1),e._v(", then after this command "),t("code",[e._v("cd btcpayserver-docker")]),e._v(", follow the below instructions instead of those in the link. If you already have a BTCPay Server running, then just follow from the next step.")])]),e._v(" "),t("li",[t("p",[e._v("Set your environment variables:")])])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"YOURHOST.com"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("NBITCOIN_NETWORK")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mainnet"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"lnd"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("LIGHTNING_ALIAS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"MY_LN"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("LETSENCRYPT_EMAIL")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"you@example.com"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-add-electrumx;opt-more-memory"')]),e._v("\n")])])]),t("p",[e._v("You can run all of that as one command after you tweak it to your needs. The main part for our purposes in this guide of course is "),t("code",[e._v('BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-add-electrumx"')]),e._v(". Note: "),t("code",[e._v("opt-more-memory")]),e._v(" can be removed if you like, but I really recommend it if your system has more than 1GB of RAM/memory that you can assign to BTCPay server, it will speed synching your node and the general performance of ElectrumX up drastically.")]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[t("p",[e._v("Set up or reconfigure BTCPay Server with ElectrumX:")]),e._v(" "),t("p",[t("code",[e._v("cd ~/BTCPayServer/btcpayserver-docker && . ./btcpay-setup.sh -i")])]),e._v(" "),t("p",[e._v('This will setup (or re-setup) your server with everything needed including ElectrumX, and it all should "just work". But, it will trigger at least a couple of hours of syncing the '),t("code",[e._v("txindex")]),e._v(", and if it is a new server, could be a couple of days depending on your hardware.")])]),e._v(" "),t("li",[t("p",[e._v("WAIT for your node to fully sync:\nYou can check the status of bitcoin core sync by going to your domain for BTCPay server, and it will show you on the front page. Or, you can check from the command line as well, using these commands:")]),e._v(" "),t("p",[t("code",[e._v("docker logs btcpayserver_bitcoind")]),e._v(" - this will show you the bitcoin core blockchain sync status (and ALL other info about your node, including any errors)")]),e._v(" "),t("p",[t("code",[e._v("docker logs generated_electrumx_1")]),e._v(" - this will show you the ElectrumX sync status. Note: ElectrumX will NOT start syncing until bitcoin full node has finished syncing, you will see errors until that is finished and these can be ignored.")])])]),e._v(" "),t("p",[e._v("Once all syncing for both bitcoin and ElectrumX has finished you can proceed to the next step. (Note: Electrum wallets will not connect to an Electrum server that has not finished synching)")]),e._v(" "),t("h2",{attrs:{id:"section-22-connect-your-electrum-wallet-desktop-or-android-to-your-electrumx-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-22-connect-your-electrum-wallet-desktop-or-android-to-your-electrumx-server"}},[e._v("#")]),e._v(" Section 2.2 Connect your Electrum Wallet (Desktop or Android) to your ElectrumX Server")]),e._v(" "),t("h3",{attrs:{id:"connect-to-electrumx-from-electrum-wallet-on-your-macpclinux-machine"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connect-to-electrumx-from-electrum-wallet-on-your-macpclinux-machine"}},[e._v("#")]),e._v(" Connect to ElectrumX from Electrum Wallet on your Mac/PC/Linux Machine:")]),e._v(" "),t("p",[e._v('Read all of this first before proceeding. You may wish to do just the "Protip" below instead of the manual steps in the Electrum Wallet GUI.')]),e._v(" "),t("p",[e._v("Open Electrum Wallet. When you click the traffic light at the bottom of your Electrum Wallet:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437133-5636c500-01c0-11ea-822c-6e72bd6d60ea.png",alt:"ElectrumWalletMainScreenLight",title:"ElectrumWalletMainScreenLight"}})]),e._v(" "),t("p",[e._v("You will see this screen with a list of all the available Electrum servers that your wallet can connect to, normally with "),t("code",[e._v("Select Server Automatically")]),e._v(" already checked:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437521-8a5eb580-01c1-11ea-9ece-0666353a6742.png",alt:"ElectrumWalletServerList",title:"ElectrumWalletServerList"}})]),e._v(" "),t("p",[e._v("Now is the time to UNCHECK that "),t("code",[e._v("Select Server Automatically")]),e._v(" setting, which will enable you to enter the IP address or domain or hostname of your ElectrumX Server. In the case below, the ElectrumX server is on the local network at "),t("code",[e._v("192.168.1.3")]),e._v(" so we enter that manually (leave port as 50002) and press "),t("code",[e._v("close")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68496320-4e276580-0252-11ea-8caf-facc8a246d70.png",alt:"EnterElectrumXServerIP",title:"EnterElectrumXServerIP"}})]),e._v(" "),t("p",[e._v("If all of the above worked well, and your node is healthy, you will get a green traffic light down the bottom right of the wallet interface as pictured here - that means success!:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437133-5636c500-01c0-11ea-822c-6e72bd6d60ea.png",alt:"ElectrumWalletMainScreenLight",title:"ElectrumWalletMainScreenLight"}})]),e._v(" "),t("h4",{attrs:{id:"protip-optionally-perform-the-above-steps-directly-in-electrum-wallet-config-file-before-even-opening-the-wallet-gui"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#protip-optionally-perform-the-above-steps-directly-in-electrum-wallet-config-file-before-even-opening-the-wallet-gui"}},[e._v("#")]),e._v(" Protip - optionally perform the above steps directly in Electrum Wallet config file before even opening the wallet GUI:")]),e._v(" "),t("p",[e._v("If you prefer to avoid connecting to other servers from the outset when you open Electrum Wallet, do the following before you open Electrum Wallet GUI.")]),e._v(" "),t("p",[e._v("In the Electrum Wallet folder ("),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("see here"),t("OutboundLink")],1),e._v(" if you don't know where that is), open and edit the "),t("code",[e._v("config")]),e._v(" file like this:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"auto_connect": true,')]),e._v(" and switch it to: "),t("code",[e._v('"auto_connect": false,')]),e._v(" - this will prevent your Electrum Wallet from auto-connecting to other 3rd party Electrum Servers at launch time (to obtain block headers and transaction information).")])]),e._v(" "),t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"oneserver": false,')]),e._v(" and switch it to: "),t("code",[e._v('"oneserver": true,')]),e._v(" - ensures that all data is obtained from just one server.")])]),e._v(" "),t("li",[t("p",[e._v("Find or add line: "),t("code",[e._v('"server": "SOMEIPADDRESS:50002:s",')]),e._v("and switch it to your own ElectrumX Server's IP address, in the example above this would be: "),t("code",[e._v('"server": "192.168.1.3:50002:s",')]),e._v("- hard code your IP address as the default upon opening the Wallet.")])])]),e._v(" "),t("p",[e._v("These 3 steps optional but recommended for full privacy by locking down Electrum Wallet to one single connection with your private server ("),t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server#how-to",target:"_blank",rel:"noopener noreferrer"}},[e._v("Reference"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("h3",{attrs:{id:"reflection-on-what-has-been-achieved"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reflection-on-what-has-been-achieved"}},[e._v("#")]),e._v(" Reflection on what has been achieved:")]),e._v(" "),t("p",[e._v("You are now running your very "),t("strong",[e._v("own private ElectrumX Server")]),e._v(". All Electrum Wallet related data transfer happens directly between your ElectrumX Server and the bitcoin blockchain, without going over any other 3rd party servers. You have attained full bitcoin transaction privacy (at least from the perspective of your blockchain queries and transactions, payment/receive addresses etc - nobody except you and the blockchain can see what you are doing).")]),e._v(" "),t("h3",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting:")]),e._v(" "),t("p",[e._v("So there is one thing you may encounter, where even after you did everything correctly, you still get a red traffic light (which means not connected to any server) in the steps above. Any other troubleshooting tips that people encounter can be added, I would suggest to make a PR to this document directly.")]),e._v(" "),t("ul",[t("li",[e._v("If you get a red traffic light, shutdown Electrum Wallet completely, then go to your Electrum Wallet folder ("),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("see here"),t("OutboundLink")],1),e._v(" if you don't know where that is).")])]),e._v(" "),t("p",[e._v("Inside the Electrum Wallet folder (in this case below, it is what it looks like on a Mac) locate the "),t("code",[e._v("certs")]),e._v(" directory and delete the certificate for the server you are trying to connect to, in this case "),t("code",[e._v("192.168.1.3")]),e._v(", by dragging it to the Trash.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68497330-9a73a500-0254-11ea-9349-71bdb3bd9511.png",alt:"Certs",title:"Certs"}})]),e._v(" "),t("p",[e._v("Start up Electrum Wallet again, and connect to your ElectrumX server. If it is fully synched, it will now likely show a green traffic light, and you are good to go.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[144],{838:function(e,t,r){"use strict";r.r(t);var a=r(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"electrumx"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#electrumx"}},[e._v("#")]),e._v(" ElectrumX")]),e._v(" "),t("p",[e._v("This document explains how to "),t("strong",[e._v("connect Electrum Wallet to an ElectrumX Server")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Note:")]),e._v(" the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("docker version of BTCPay Server"),t("OutboundLink")],1),e._v(" (since Nov 7th 2019, version 1.0.3.137) supports full integration with "),t("a",{attrs:{href:"https://electrumx.readthedocs.io/en/latest/features.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("ElectrumX"),t("OutboundLink")],1),e._v(" is the most widely implemented software used for Electrum public servers that your local Electrum wallet relies upon to get all the details of, or broadcast transactions to the bitcoin blockchain. Skip to Section 2 below, to read more on what this all means, and how to set it up on your BTCPay stack.")]),e._v(" "),t("h2",{attrs:{id:"how-to-integrate-electrumx-into-your-btcpay-server-and-connect-your-electrum-wallet-to-it-for-your-complete-privacy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-integrate-electrumx-into-your-btcpay-server-and-connect-your-electrum-wallet-to-it-for-your-complete-privacy"}},[e._v("#")]),e._v(" How to integrate ElectrumX into your BTCPay Server and connect your Electrum Wallet to it for your complete privacy")]),e._v(" "),t("h3",{attrs:{id:"only-available-in-btcpay-docker-version"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#only-available-in-btcpay-docker-version"}},[e._v("#")]),e._v(" (only available in BTCPay docker version)")]),e._v(" "),t("p",[e._v("Before we proceed, it is important to understand how your Electrum wallet on your PC/Mac functions so well/fast, without having its own bitcoin full node. In actual fact, Electrum Wallet relies on a community effort to maintain a bunch of servers all around the world with a bitcoin full node that do this job for you! They are called Electrum Servers, and you can be a part of that community to make that network even stronger, lets see how.")]),e._v(" "),t("p",[e._v("When you click the little traffic light at the bottom of your Electrum Wallet here:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437133-5636c500-01c0-11ea-822c-6e72bd6d60ea.png",alt:"ElectrumWalletMainScreenLight",title:"ElectrumWalletMainScreenLight"}})]),e._v(" "),t("p",[e._v('You will see this screen with a list of all the available Electrum servers that your wallet can connect to, normally with "Select Server Automatically" already checked:')]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437521-8a5eb580-01c1-11ea-9ece-0666353a6742.png",alt:"ElectrumWalletServerList",title:"ElectrumWalletServerList"}})]),e._v(" "),t("p",[e._v('While using Electrum Wallet with "Select Server Automatically" on is the easiest, every transaction that you make/browse/broadcast in your Electrum Wallet will be done via someone else\'s server - this is a privacy risk, that will be mitigated by setting up and using your own ElectrumX Server.')]),e._v(" "),t("h2",{attrs:{id:"section-21-enable-your-own-electrumx-server-fully-integrated-with-your-btcpay-servers-full-bitcoin-node"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-21-enable-your-own-electrumx-server-fully-integrated-with-your-btcpay-servers-full-bitcoin-node"}},[e._v("#")]),e._v(" Section 2.1 Enable Your Own ElectrumX Server (fully integrated with your BTCPay Server's full bitcoin node)")]),e._v(" "),t("h3",{attrs:{id:"prerequisites-mandatory"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites-mandatory"}},[e._v("#")]),e._v(" Prerequisites (mandatory):")]),e._v(" "),t("ol",[t("li",[e._v("Docker only: Only the "),t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("Docker version of BTCPay Server")]),e._v(" is supported.")],1),e._v(" "),t("li",[e._v("Unpruned BTCPay node: Make sure your BTCPay implementation is NOT "),t("RouterLink",{attrs:{to:"/FAQ/Synchronization/#can-i-skip-the-synchronization"}},[e._v("pruned")]),e._v(" (i.e. you have synched and stored from genesis block. Check that you do NOT use the opt-save-storage "),t("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("Environment Variable")]),e._v(")")],1),e._v(" "),t("li",[e._v("Drive space: At least 400GB of drive space on the device where your docker volumes are stored is required (as at the writing of this documentation on 9th Nov 2019, the total hard drive space used is 333GB - with full node and ElectrumX enabled - and of course this will grow further over time).")]),e._v(" "),t("li",[e._v("Additional Fragments: You are familiar with how to use BTCPay's "),t("RouterLink",{attrs:{to:"/Docker/#environment-variables"}},[e._v("Additional Fragment")]),e._v(" feature as part of your environment variable setup.")],1),e._v(" "),t("li",[e._v("Server architecture: The (official) "),t("a",{attrs:{href:"https://github.com/lukechilds/docker-electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("ElectrumX docker"),t("OutboundLink")],1),e._v(" used here is only tested on a BTCPay Server running on x86_64 architecture. So far it is tested extensively on Ubuntu 18.04 and Debian Buster. Unless it is overhauled and tested well on Raspberry Pi (and other architectures) it likely will not work.")]),e._v(" "),t("li",[e._v("Basic Linux command line knowledge: is assumed.")])]),e._v(" "),t("h3",{attrs:{id:"how-will-enabling-electrumx-server-affect-an-existing-btcpay-implementation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-will-enabling-electrumx-server-affect-an-existing-btcpay-implementation"}},[e._v("#")]),e._v(" How will enabling ElectrumX Server affect an existing BTCPay implementation?:")]),e._v(" "),t("p",[e._v("Fundamentally, setting up ElectrumX in BTCPay server is simple, and will not affect the rest of your implementation. The only pre-requisites are as above. The "),t("a",{attrs:{href:"https://github.com/lukechilds/docker-electrumx",target:"_blank",rel:"noopener noreferrer"}},[e._v("ElectrumX official docker release"),t("OutboundLink")],1),e._v(" is enabled in BTCPay by activating the "),t("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("additional fragment")]),e._v(" called "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-electrumx.yml",target:"_blank",rel:"noopener noreferrer"}},[t("code",[e._v("opt-add-electumx")]),t("OutboundLink")],1),e._v(". This fragment will not only enable and start the ElectrumX server, it will also enable "),t("code",[e._v("txindex=1")]),e._v(" in your bitcoin full node. "),t("code",[e._v("txindex=1")]),e._v(" (Transaction Index=ON) is a bitcoin core feature required for ElectrumX to be able to serve your Electrum Wallet detailed transaction data for any transaction, directly from the blockchain, without getting it from any third party server.")],1),e._v(" "),t("p",[e._v("If you have been running your BTCPay Server for a while but haven't had "),t("code",[e._v("txindex=1")]),e._v(" set until now, then it might take a few hours to build the index, this is no issue and it should not involve downtime of more than a few hours - better to set this to run overnight though when nobody will be using your node. Note: If you want to rebuild the index from scratch, launch bitcoind once with the "),t("code",[e._v("reindex=1")]),e._v(" option (warning: this reindex option may take a VERY long time, and is not enabled out of the box as you likely dont need it, and hence is not in scope of this document).")]),e._v(" "),t("h3",{attrs:{id:"steps-to-enable-electrumx-server-in-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#steps-to-enable-electrumx-server-in-btcpay"}},[e._v("#")]),e._v(" Steps to enable ElectrumX Server in BTCPay:")]),e._v(" "),t("p",[e._v("Here are all the steps to "),t("strong",[e._v("enable ElectrumX Server in your BTCPay node")]),e._v(' (read carefully as you may need to adjust for your specific setup, especially if you use other custom or conflicting "fragments" (pruning, less-memory etc. To reiterate, you should NOT proceed further here if you run a pruned BTCPay node.')]),e._v(" "),t("ol",[t("li",[t("p",[e._v("ElectrumX Server is accessible for Electrum Wallets via TCP port 50002. You need to open this port up fully at least to be available within your own network to any PC or Android device running Electrum Wallet, and turn on port forwarding (you can also port forward 50002 from your Internet/WAN, to enable other Electrum Wallet users from the Internet to query your server).")])]),e._v(" "),t("li",[t("p",[e._v("Enable the Docker Additional Fragment on your BTCPay node by running the following commands (this is assuming a brand new BTCPay installation with LND and ElectrumX, please tweak accordingly using the "),t("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("relevant documentation")]),e._v(":")],1)]),e._v(" "),t("li",[t("p",[e._v("Follow the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker#full-installation-for-technical-users",target:"_blank",rel:"noopener noreferrer"}},[e._v("normal setup and install of BTCPay Server"),t("OutboundLink")],1),e._v(", then after this command "),t("code",[e._v("cd btcpayserver-docker")]),e._v(", follow the below instructions instead of those in the link. If you already have a BTCPay Server running, then just follow from the next step.")])]),e._v(" "),t("li",[t("p",[e._v("Set your environment variables:")])])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"YOURHOST.com"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("NBITCOIN_NETWORK")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"mainnet"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_CRYPTO1")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"btc"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_REVERSEPROXY")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"nginx"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_LIGHTNING")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"lnd"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("LIGHTNING_ALIAS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"MY_LN"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("LETSENCRYPT_EMAIL")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"you@example.com"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-add-electrumx;opt-more-memory"')]),e._v("\n")])])]),t("p",[e._v("You can run all of that as one command after you tweak it to your needs. The main part for our purposes in this guide of course is "),t("code",[e._v('BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-add-electrumx"')]),e._v(". Note: "),t("code",[e._v("opt-more-memory")]),e._v(" can be removed if you like, but I really recommend it if your system has more than 1GB of RAM/memory that you can assign to BTCPay server, it will speed synching your node and the general performance of ElectrumX up drastically.")]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[t("p",[e._v("Set up or reconfigure BTCPay Server with ElectrumX:")]),e._v(" "),t("p",[t("code",[e._v("cd ~/BTCPayServer/btcpayserver-docker && . ./btcpay-setup.sh -i")])]),e._v(" "),t("p",[e._v('This will setup (or re-setup) your server with everything needed including ElectrumX, and it all should "just work". But, it will trigger at least a couple of hours of syncing the '),t("code",[e._v("txindex")]),e._v(", and if it is a new server, could be a couple of days depending on your hardware.")])]),e._v(" "),t("li",[t("p",[e._v("WAIT for your node to fully sync:\nYou can check the status of bitcoin core sync by going to your domain for BTCPay server, and it will show you on the front page. Or, you can check from the command line as well, using these commands:")]),e._v(" "),t("p",[t("code",[e._v("docker logs btcpayserver_bitcoind")]),e._v(" - this will show you the bitcoin core blockchain sync status (and ALL other info about your node, including any errors)")]),e._v(" "),t("p",[t("code",[e._v("docker logs generated_electrumx_1")]),e._v(" - this will show you the ElectrumX sync status. Note: ElectrumX will NOT start syncing until bitcoin full node has finished syncing, you will see errors until that is finished and these can be ignored.")])])]),e._v(" "),t("p",[e._v("Once all syncing for both bitcoin and ElectrumX has finished you can proceed to the next step. (Note: Electrum wallets will not connect to an Electrum server that has not finished synching)")]),e._v(" "),t("h2",{attrs:{id:"section-22-connect-your-electrum-wallet-desktop-or-android-to-your-electrumx-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#section-22-connect-your-electrum-wallet-desktop-or-android-to-your-electrumx-server"}},[e._v("#")]),e._v(" Section 2.2 Connect your Electrum Wallet (Desktop or Android) to your ElectrumX Server")]),e._v(" "),t("h3",{attrs:{id:"connect-to-electrumx-from-electrum-wallet-on-your-macpclinux-machine"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connect-to-electrumx-from-electrum-wallet-on-your-macpclinux-machine"}},[e._v("#")]),e._v(" Connect to ElectrumX from Electrum Wallet on your Mac/PC/Linux Machine:")]),e._v(" "),t("p",[e._v('Read all of this first before proceeding. You may wish to do just the "Protip" below instead of the manual steps in the Electrum Wallet GUI.')]),e._v(" "),t("p",[e._v("Open Electrum Wallet. When you click the traffic light at the bottom of your Electrum Wallet:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437133-5636c500-01c0-11ea-822c-6e72bd6d60ea.png",alt:"ElectrumWalletMainScreenLight",title:"ElectrumWalletMainScreenLight"}})]),e._v(" "),t("p",[e._v("You will see this screen with a list of all the available Electrum servers that your wallet can connect to, normally with "),t("code",[e._v("Select Server Automatically")]),e._v(" already checked:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437521-8a5eb580-01c1-11ea-9ece-0666353a6742.png",alt:"ElectrumWalletServerList",title:"ElectrumWalletServerList"}})]),e._v(" "),t("p",[e._v("Now is the time to UNCHECK that "),t("code",[e._v("Select Server Automatically")]),e._v(" setting, which will enable you to enter the IP address or domain or hostname of your ElectrumX Server. In the case below, the ElectrumX server is on the local network at "),t("code",[e._v("192.168.1.3")]),e._v(" so we enter that manually (leave port as 50002) and press "),t("code",[e._v("close")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68496320-4e276580-0252-11ea-8caf-facc8a246d70.png",alt:"EnterElectrumXServerIP",title:"EnterElectrumXServerIP"}})]),e._v(" "),t("p",[e._v("If all of the above worked well, and your node is healthy, you will get a green traffic light down the bottom right of the wallet interface as pictured here - that means success!:")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68437133-5636c500-01c0-11ea-822c-6e72bd6d60ea.png",alt:"ElectrumWalletMainScreenLight",title:"ElectrumWalletMainScreenLight"}})]),e._v(" "),t("h4",{attrs:{id:"protip-optionally-perform-the-above-steps-directly-in-electrum-wallet-config-file-before-even-opening-the-wallet-gui"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#protip-optionally-perform-the-above-steps-directly-in-electrum-wallet-config-file-before-even-opening-the-wallet-gui"}},[e._v("#")]),e._v(" Protip - optionally perform the above steps directly in Electrum Wallet config file before even opening the wallet GUI:")]),e._v(" "),t("p",[e._v("If you prefer to avoid connecting to other servers from the outset when you open Electrum Wallet, do the following before you open Electrum Wallet GUI.")]),e._v(" "),t("p",[e._v("In the Electrum Wallet folder ("),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("see here"),t("OutboundLink")],1),e._v(" if you don't know where that is), open and edit the "),t("code",[e._v("config")]),e._v(" file like this:")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"auto_connect": true,')]),e._v(" and switch it to: "),t("code",[e._v('"auto_connect": false,')]),e._v(" - this will prevent your Electrum Wallet from auto-connecting to other 3rd party Electrum Servers at launch time (to obtain block headers and transaction information).")])]),e._v(" "),t("li",[t("p",[e._v("Find line: "),t("code",[e._v('"oneserver": false,')]),e._v(" and switch it to: "),t("code",[e._v('"oneserver": true,')]),e._v(" - ensures that all data is obtained from just one server.")])]),e._v(" "),t("li",[t("p",[e._v("Find or add line: "),t("code",[e._v('"server": "SOMEIPADDRESS:50002:s",')]),e._v("and switch it to your own ElectrumX Server's IP address, in the example above this would be: "),t("code",[e._v('"server": "192.168.1.3:50002:s",')]),e._v("- hard code your IP address as the default upon opening the Wallet.")])])]),e._v(" "),t("p",[e._v("These 3 steps optional but recommended for full privacy by locking down Electrum Wallet to one single connection with your private server ("),t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server#how-to",target:"_blank",rel:"noopener noreferrer"}},[e._v("Reference"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("h3",{attrs:{id:"reflection-on-what-has-been-achieved"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#reflection-on-what-has-been-achieved"}},[e._v("#")]),e._v(" Reflection on what has been achieved:")]),e._v(" "),t("p",[e._v("You are now running your very "),t("strong",[e._v("own private ElectrumX Server")]),e._v(". All Electrum Wallet related data transfer happens directly between your ElectrumX Server and the bitcoin blockchain, without going over any other 3rd party servers. You have attained full bitcoin transaction privacy (at least from the perspective of your blockchain queries and transactions, payment/receive addresses etc - nobody except you and the blockchain can see what you are doing).")]),e._v(" "),t("h3",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting:")]),e._v(" "),t("p",[e._v("So there is one thing you may encounter, where even after you did everything correctly, you still get a red traffic light (which means not connected to any server) in the steps above. Any other troubleshooting tips that people encounter can be added, I would suggest to make a PR to this document directly.")]),e._v(" "),t("ul",[t("li",[e._v("If you get a red traffic light, shutdown Electrum Wallet completely, then go to your Electrum Wallet folder ("),t("a",{attrs:{href:"https://electrum.readthedocs.io/en/latest/faq.html#where-is-my-wallet-file-located",target:"_blank",rel:"noopener noreferrer"}},[e._v("see here"),t("OutboundLink")],1),e._v(" if you don't know where that is).")])]),e._v(" "),t("p",[e._v("Inside the Electrum Wallet folder (in this case below, it is what it looks like on a Mac) locate the "),t("code",[e._v("certs")]),e._v(" directory and delete the certificate for the server you are trying to connect to, in this case "),t("code",[e._v("192.168.1.3")]),e._v(", by dragging it to the Trash.")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://user-images.githubusercontent.com/1388507/68497330-9a73a500-0254-11ea-9349-71bdb3bd9511.png",alt:"Certs",title:"Certs"}})]),e._v(" "),t("p",[e._v("Start up Electrum Wallet again, and connect to your ElectrumX server. If it is fully synched, it will now likely show a green traffic light, and you are good to go.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/145.09d8e3b9.js b/assets/js/145.4c1826fa.js similarity index 99% rename from assets/js/145.09d8e3b9.js rename to assets/js/145.4c1826fa.js index df85d949e1..6c21c302df 100644 --- a/assets/js/145.09d8e3b9.js +++ b/assets/js/145.4c1826fa.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[145],{838:function(t,a,e){"use strict";e.r(a);var o=e(17),n=Object(o.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"altcoins-faq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#altcoins-faq"}},[t._v("#")]),t._v(" Altcoins FAQ")]),t._v(" "),a("p",[t._v("This page answers some of the common questions about alternative cryptocurrencies - altcoins.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#which-coins-does-btcpay-server-support"}},[t._v("Which coins does BTCPay Server support?")])]),a("li",[a("a",{attrs:{href:"#can-an-xyz-coin-be-added-in-btcpay"}},[t._v("Can an XYZ coin be added in BTCPay?")])]),a("li",[a("a",{attrs:{href:"#how-to-add-an-altcoin-in-btcpay"}},[t._v("How to add an altcoin in BTCPay?")])]),a("li",[a("a",{attrs:{href:"#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("How to add an altcoin to an existing BTCPay deployment?")])]),a("li",[a("a",{attrs:{href:"#how-to-remove-a-coin-from-btcpay"}},[t._v("How to remove a coin from BTCPay?")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"which-coins-does-btcpay-server-support"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#which-coins-does-btcpay-server-support"}},[t._v("#")]),t._v(" Which coins does BTCPay Server support?")]),t._v(" "),a("p",[t._v("Bitcoin is the only focus of the project and its core developers. However, opt in integrations are present for several altcoins:")]),t._v(" "),a("ul",[a("li",[t._v("BGold (BTG) (also known as Bitcoin Gold)")]),t._v(" "),a("li",[t._v("BPlus (XBC) (also known as Bitcoin Plus)")]),t._v(" "),a("li",[t._v("Bitcore (BTX)")]),t._v(" "),a("li",[t._v("Dash (DASH)")]),t._v(" "),a("li",[t._v("Dogecoin (DOGE)")]),t._v(" "),a("li",[t._v("Feathercoin (FTC)")]),t._v(" "),a("li",[t._v("Groestlcoin (GRS)")]),t._v(" "),a("li",[t._v("Htmlcoin (HTML) (also known as Althash)")]),t._v(" "),a("li",[t._v("Liquid Bitcoin (LBTC) (comes with Liquid Tether support USDt) "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/1282",target:"_blank",rel:"noopener noreferrer"}},[t._v("(notes on deployment & usage)"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Litecoin (LTC)")]),t._v(" "),a("li",[t._v("Monacoin (MONA)")]),t._v(" "),a("li",[t._v("Monero (XMR) "),a("a",{attrs:{href:"https://sethforprivacy.com/guides/accepting-monero-via-btcpay-server/",target:"_blank",rel:"noopener noreferrer"}},[t._v("(guide on deployment and usage)"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Polis (POLIS)")]),t._v(" "),a("li",[t._v("Viacoin (VIA)")])]),t._v(" "),a("p",[t._v("Altcoins are maintained by their respective communities and are listed here only for convenience. For support regarding Altcoin deployment, functionalities or issues, please contact the Altcoin maintainer or community directly.")]),t._v(" "),a("h2",{attrs:{id:"can-an-xyz-coin-be-added-in-btcpay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#can-an-xyz-coin-be-added-in-btcpay"}},[t._v("#")]),t._v(" Can an XYZ coin be added in BTCPay?")]),t._v(" "),a("p",[t._v("No. BTCPay developers don't add alternative coins on request. Adding a new coin explicitly depends on the community and developers of those coins. Furthermore, BTCPay developers do not spend excessive time testing nor maintaining the altcoins. If you're submitting a PR for a new coin, make sure that it works. If the altcoin integration is not actively maintained it will be removed from BTCPay.")]),t._v(" "),a("h2",{attrs:{id:"how-to-add-an-altcoin-in-btcpay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-an-altcoin-in-btcpay"}},[t._v("#")]),t._v(" How to add an altcoin in BTCPay?")]),t._v(" "),a("p",[t._v("To add a new coin to BTCPay, please "),a("RouterLink",{attrs:{to:"/Development/Altcoins/#how-can-i-add-an-altcoin-to-btcpayserver"}},[t._v("follow the instructions here")]),t._v(".")],1),t._v(" "),a("h2",{attrs:{id:"how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("#")]),t._v(" How to add an altcoin to an existing BTCPay deployment?")]),t._v(" "),a("p",[t._v("If you want to expand the number of coins in your existing BTCPay Server installation, make sure that you have enough storage space on your machine.")]),t._v(" "),a("p",[t._v("In this example, we only have Bitcoin, and we're adding Litecoin to our docker deployment.")]),t._v(" "),a("p",[t._v("The coin structure:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("BTCPAYGEN_CRYPTO1: First supported cryptocurrency (e.g., BTC, LTC. Default: btc)\nBTCPAYGEN_CRYPTO2: Second supported crypto currency (e.g. btc, ltc. Default: (empty))\nBTCPAYGEN_CRYPTON: N'th supported crypto currency where N is 9 at maximum. (eg. btc, ltc. Default: (empty))\n")])])]),a("p",[t._v("To add Litecoin, as your second coin (CRYPTO2) do this :")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_CRYPTO2")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ltc"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),a("h2",{attrs:{id:"how-to-remove-a-coin-from-btcpay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-remove-a-coin-from-btcpay"}},[t._v("#")]),t._v(" How to remove a coin from BTCPay?")]),t._v(" "),a("p",[t._v("In the "),a("a",{attrs:{href:"#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("example above")]),t._v(" we've added Litecoin as the second coin. To remove a particular coin, use the following command:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_CRYPTO2")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),a("p",[t._v("Where CRYPTO"),a("strong",[t._v("2")]),t._v(" should be replaced with a coin number you wish to remove. If you have an XYZ coin as "),a("code",[t._v("BTCPAYGEN_CRYPTO3")]),t._v(", and you want to remove it, you should use CRYPTO"),a("strong",[t._v("3")]),t._v(".")])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[145],{837:function(t,a,e){"use strict";e.r(a);var o=e(17),n=Object(o.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"altcoins-faq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#altcoins-faq"}},[t._v("#")]),t._v(" Altcoins FAQ")]),t._v(" "),a("p",[t._v("This page answers some of the common questions about alternative cryptocurrencies - altcoins.")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#which-coins-does-btcpay-server-support"}},[t._v("Which coins does BTCPay Server support?")])]),a("li",[a("a",{attrs:{href:"#can-an-xyz-coin-be-added-in-btcpay"}},[t._v("Can an XYZ coin be added in BTCPay?")])]),a("li",[a("a",{attrs:{href:"#how-to-add-an-altcoin-in-btcpay"}},[t._v("How to add an altcoin in BTCPay?")])]),a("li",[a("a",{attrs:{href:"#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("How to add an altcoin to an existing BTCPay deployment?")])]),a("li",[a("a",{attrs:{href:"#how-to-remove-a-coin-from-btcpay"}},[t._v("How to remove a coin from BTCPay?")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"which-coins-does-btcpay-server-support"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#which-coins-does-btcpay-server-support"}},[t._v("#")]),t._v(" Which coins does BTCPay Server support?")]),t._v(" "),a("p",[t._v("Bitcoin is the only focus of the project and its core developers. However, opt in integrations are present for several altcoins:")]),t._v(" "),a("ul",[a("li",[t._v("BGold (BTG) (also known as Bitcoin Gold)")]),t._v(" "),a("li",[t._v("BPlus (XBC) (also known as Bitcoin Plus)")]),t._v(" "),a("li",[t._v("Bitcore (BTX)")]),t._v(" "),a("li",[t._v("Dash (DASH)")]),t._v(" "),a("li",[t._v("Dogecoin (DOGE)")]),t._v(" "),a("li",[t._v("Feathercoin (FTC)")]),t._v(" "),a("li",[t._v("Groestlcoin (GRS)")]),t._v(" "),a("li",[t._v("Htmlcoin (HTML) (also known as Althash)")]),t._v(" "),a("li",[t._v("Liquid Bitcoin (LBTC) (comes with Liquid Tether support USDt) "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/1282",target:"_blank",rel:"noopener noreferrer"}},[t._v("(notes on deployment & usage)"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Litecoin (LTC)")]),t._v(" "),a("li",[t._v("Monacoin (MONA)")]),t._v(" "),a("li",[t._v("Monero (XMR) "),a("a",{attrs:{href:"https://sethforprivacy.com/guides/accepting-monero-via-btcpay-server/",target:"_blank",rel:"noopener noreferrer"}},[t._v("(guide on deployment and usage)"),a("OutboundLink")],1)]),t._v(" "),a("li",[t._v("Polis (POLIS)")]),t._v(" "),a("li",[t._v("Viacoin (VIA)")])]),t._v(" "),a("p",[t._v("Altcoins are maintained by their respective communities and are listed here only for convenience. For support regarding Altcoin deployment, functionalities or issues, please contact the Altcoin maintainer or community directly.")]),t._v(" "),a("h2",{attrs:{id:"can-an-xyz-coin-be-added-in-btcpay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#can-an-xyz-coin-be-added-in-btcpay"}},[t._v("#")]),t._v(" Can an XYZ coin be added in BTCPay?")]),t._v(" "),a("p",[t._v("No. BTCPay developers don't add alternative coins on request. Adding a new coin explicitly depends on the community and developers of those coins. Furthermore, BTCPay developers do not spend excessive time testing nor maintaining the altcoins. If you're submitting a PR for a new coin, make sure that it works. If the altcoin integration is not actively maintained it will be removed from BTCPay.")]),t._v(" "),a("h2",{attrs:{id:"how-to-add-an-altcoin-in-btcpay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-an-altcoin-in-btcpay"}},[t._v("#")]),t._v(" How to add an altcoin in BTCPay?")]),t._v(" "),a("p",[t._v("To add a new coin to BTCPay, please "),a("RouterLink",{attrs:{to:"/Development/Altcoins/#how-can-i-add-an-altcoin-to-btcpayserver"}},[t._v("follow the instructions here")]),t._v(".")],1),t._v(" "),a("h2",{attrs:{id:"how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("#")]),t._v(" How to add an altcoin to an existing BTCPay deployment?")]),t._v(" "),a("p",[t._v("If you want to expand the number of coins in your existing BTCPay Server installation, make sure that you have enough storage space on your machine.")]),t._v(" "),a("p",[t._v("In this example, we only have Bitcoin, and we're adding Litecoin to our docker deployment.")]),t._v(" "),a("p",[t._v("The coin structure:")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("BTCPAYGEN_CRYPTO1: First supported cryptocurrency (e.g., BTC, LTC. Default: btc)\nBTCPAYGEN_CRYPTO2: Second supported crypto currency (e.g. btc, ltc. Default: (empty))\nBTCPAYGEN_CRYPTON: N'th supported crypto currency where N is 9 at maximum. (eg. btc, ltc. Default: (empty))\n")])])]),a("p",[t._v("To add Litecoin, as your second coin (CRYPTO2) do this :")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_CRYPTO2")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"ltc"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),a("h2",{attrs:{id:"how-to-remove-a-coin-from-btcpay"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-remove-a-coin-from-btcpay"}},[t._v("#")]),t._v(" How to remove a coin from BTCPay?")]),t._v(" "),a("p",[t._v("In the "),a("a",{attrs:{href:"#how-to-add-an-altcoin-to-an-existing-btcpay-deployment"}},[t._v("example above")]),t._v(" we've added Litecoin as the second coin. To remove a particular coin, use the following command:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_CRYPTO2")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),a("p",[t._v("Where CRYPTO"),a("strong",[t._v("2")]),t._v(" should be replaced with a coin number you wish to remove. If you have an XYZ coin as "),a("code",[t._v("BTCPAYGEN_CRYPTO3")]),t._v(", and you want to remove it, you should use CRYPTO"),a("strong",[t._v("3")]),t._v(".")])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/147.80b09c45.js b/assets/js/147.d87e4bb1.js similarity index 99% rename from assets/js/147.80b09c45.js rename to assets/js/147.d87e4bb1.js index 75b7c6c835..0d7aaf4d16 100644 --- a/assets/js/147.80b09c45.js +++ b/assets/js/147.d87e4bb1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[147],{847:function(e,a,t){"use strict";t.r(a);var s=t(17),n=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"synchronization-faq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#synchronization-faq"}},[e._v("#")]),e._v(" Synchronization FAQ")]),e._v(" "),a("p",[e._v("This document covers the most common questions and issues that may occur during BTCPay sync.")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#why-does-btcpay-sync"}},[e._v("Why does BTCPay sync?")])]),a("li",[a("a",{attrs:{href:"#can-i-skip-the-synchronization"}},[e._v("Can I skip the synchronization?")])]),a("li",[a("a",{attrs:{href:"#how-do-i-know-that-btcpay-synced-completely"}},[e._v("How do I know that BTCPay synced completely?")])]),a("li",[a("a",{attrs:{href:"#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[e._v("How can I check the block height of my bitcoin node?")])]),a("li",[a("a",{attrs:{href:"#btcpay-server-takes-forever-to-synchronize"}},[e._v("BTCPay Server takes forever to synchronize")]),a("ul",[a("li",[a("a",{attrs:{href:"#cause-1-not-enough-cpu"}},[e._v("Cause 1: Not enough CPU")])]),a("li",[a("a",{attrs:{href:"#cause-2-using-swap-memory"}},[e._v("Cause 2: Using swap memory")])])])]),a("li",[a("a",{attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("BTCPay Server keeps showing that my node is always starting")]),a("ul",[a("li",[a("a",{attrs:{href:"#cause-1-you-do-not-have-enough-ram"}},[e._v("Cause 1: You do not have enough RAM")])]),a("li",[a("a",{attrs:{href:"#cause-2-you-do-not-have-enough-storage"}},[e._v("Cause 2: You do not have enough storage")])]),a("li",[a("a",{attrs:{href:"#cause-3-you-accidentally-disabled-pruning"}},[e._v("Cause 3: You accidentally disabled pruning")])]),a("li",[a("a",{attrs:{href:"#cause-4-your-bitcoin-data-directory-is-corrupted"}},[e._v("Cause 4: Your bitcoin data directory is corrupted")])]),a("li",[a("a",{attrs:{href:"#cause-5-your-last-wallet-synchronisation-goes-beyond-pruned-data"}},[e._v("Cause 5: Your last wallet synchronisation goes beyond pruned data")])])])]),a("li",[a("a",{attrs:{href:"#im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[e._v("I'm running a full node and have a synched blockchain, can BTCPay use it so that it doesn't have to do a full sync?")])]),a("li",[a("a",{attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("How to enable Bitcoin node pruning?")])]),a("li",[a("a",{attrs:{href:"#how-to-disable-bitcoin-node-pruning"}},[e._v("How to disable Bitcoin node pruning?")])])])]),a("p"),e._v(" "),a("h2",{attrs:{id:"why-does-btcpay-sync"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#why-does-btcpay-sync"}},[e._v("#")]),e._v(" Why does BTCPay sync?")]),e._v(" "),a("p",[e._v("After deployment, your BTCPay Server needs to sync the entire blockchain and validate all the consensus rules. Depending on your machine specifications, bandwidth and number of altcoins you added, this process may take between 1-5 days.")]),e._v(" "),a("p",[e._v("It may seem tedious, but it's a critical step of running your own full node and not having to trust or rely on anyone. Your node will not only download ~300GB of data (less if you're using a pruned node) but also validate all the rules of the consensus. You can find more information about the importance of blockchain synchronization in "),a("a",{attrs:{href:"https://www.youtube.com/watch?v=OrYDehC-8TU",target:"_blank",rel:"noopener noreferrer"}},[e._v("this video"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("If you are only interested in learning about BTCPay Server i.e. simply "),a("RouterLink",{attrs:{to:"/TryItOut/"}},[e._v("trying it out")]),e._v(" without deploying your own instance, you can avoid sync by using a "),a("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("Third-Party host")]),e._v(".")],1),e._v(" "),a("h2",{attrs:{id:"can-i-skip-the-synchronization"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#can-i-skip-the-synchronization"}},[e._v("#")]),e._v(" Can I skip the synchronization?")]),e._v(" "),a("p",[e._v("You can't skip synchronization if you are deploying a BTCPay Server, but you can drastically decrease the time it takes. If you're comfortable with using the command line, you can use FastSync to synchronize your node faster. Be sure to "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/tree/master/contrib/FastSync",target:"_blank",rel:"noopener noreferrer"}},[e._v("read this FastSync document"),a("OutboundLink")],1),e._v(" to understand the potential trust issues involved with this feature.")]),e._v(" "),a("p",[e._v("To use FastSync, make sure your deployment has a "),a("a",{attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("pruning option enabled")]),e._v(" by using an "),a("code",[e._v("opt-save-storage")]),e._v(" environment variable, otherwise bitcoind will not be able to sync. First step is to "),a("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[e._v("ssh into")]),e._v(" your BTCPayServer instance and run the following commands:")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker/\nbtcpay-down.sh\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" contrib/FastSync\n./load-utxo-set.sh\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Once FastSync has completed")]),e._v("\nbtcpay-up.sh\n")])])]),a("p",[e._v("After FastSync is complete and you have brought back up your instance, refresh your BTCPay domain and wait for remaining blockchain synchronization. You can also follow "),a("a",{attrs:{href:"https://youtube.com/watch?v=VNMnd-dX9Q8?t=1730",target:"_blank",rel:"noopener noreferrer"}},[e._v("this video"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("If your FastSync returns "),a("code",[e._v("You need to delete your Bitcoin Core wallet")]),e._v(" after you load the uxto set, or you find this error: "),a("code",[e._v("Last wallet synchronisation goes beyond pruned data")]),e._v(", see the cause of "),a("a",{attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("BTCPay Server keeps showing that my node is always starting")]),e._v(".")]),e._v(" "),a("h2",{attrs:{id:"how-do-i-know-that-btcpay-synced-completely"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-know-that-btcpay-synced-completely"}},[e._v("#")]),e._v(" How do I know that BTCPay synced completely?")]),e._v(" "),a("p",[e._v("When you do not see a pop-up message in the bottom right corner, which shows the sync progress, that means that your server is fully synced and you can "),a("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("begin using it")]),e._v(".")],1),e._v(" "),a("p",[e._v("If you want to check that your BTCPay Server Bitcoin node is synchronized with the most recent block in the Bitcoin blockchain, "),a("a",{attrs:{href:"#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[e._v("check your node height")]),e._v(" matches the current block height using any blockchain explorer.")]),e._v(" "),a("h2",{attrs:{id:"how-can-i-check-the-block-height-of-my-bitcoin-node"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[e._v("#")]),e._v(" How can I check the block height of my bitcoin node?")]),e._v(" "),a("p",[e._v("To verify the sync status of your Bitcoin node, you can use bitcoin-cli commands inside your server's Bitcoin container. SSH into your server and navigate to the directory where you "),a("RouterLink",{attrs:{to:"/Troubleshooting/#23-bitcoin-node-logs"}},[e._v("view Bitcoin logs")]),e._v(" run the command: "),a("code",[e._v("bitcoin-cli.sh getblockcount")]),e._v(" to view the current block of your server's Bitcoin node.")],1),e._v(" "),a("h2",{attrs:{id:"btcpay-server-takes-forever-to-synchronize"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-takes-forever-to-synchronize"}},[e._v("#")]),e._v(" BTCPay Server takes forever to synchronize")]),e._v(" "),a("p",[e._v("Synchronizing a Full Bitcoin node should take between 1 and 5 days. It should sync quickly at first and more slowly at the end.")]),e._v(" "),a("p",[e._v("If the node appears to not be syncing, verify:")]),e._v(" "),a("ul",[a("li",[e._v("Not enough CPU")]),e._v(" "),a("li",[e._v("Using swap memory")])]),e._v(" "),a("h3",{attrs:{id:"cause-1-not-enough-cpu"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-1-not-enough-cpu"}},[e._v("#")]),e._v(" Cause 1: Not enough CPU")]),e._v(" "),a("p",[e._v("We recommend 2 CPU while synchronizing; however some hosting providers throttle your CPU if you use too much.")]),e._v(" "),a("p",[e._v("Check with")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" stats\n")])])]),a("p",[e._v("If you see more than 100% CPU usage, while being very slow to sync:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("8e7ac41e6e2a btcpayserver_bitcoind 100% 560.5MiB / 3.853GiB 14.20% 4.17\n")])])]),a("p",[e._v("Then you need to scale up your machine specification.")]),e._v(" "),a("p",[e._v("If you see very low CPU usage (less than 10%) during synchronization:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("8e7ac41e6e2a btcpayserver_bitcoind 10% 560.5MiB / 3.853GiB 14.20% 4.17\n")])])]),a("p",[e._v("Your hosting provider might throttle your CPU. Please make sure your host supports the high use of CPU for an extended period.")]),e._v(" "),a("p",[e._v("If they don't allow it, shut down your server until they stop throttling you. Then you can limit the CPU via docker, and restart the server:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" update btcpayserver_bitcoind "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--cpus")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('".8"')]),e._v("\n")])])]),a("h3",{attrs:{id:"cause-2-using-swap-memory"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-2-using-swap-memory"}},[e._v("#")]),e._v(" Cause 2: Using swap memory")]),e._v(" "),a("p",[e._v("If you are synching and don't have enough memory, your server may use swap memory to continue operating:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-h")]),e._v("\n")])])]),a("p",[e._v("If you see swap memory usage:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v(" total used "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" shared buff/cache available\nMem: "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G 0M 66M 0G 0M\nSwap: "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(".0G 200M 800M\n")])])]),a("p",[e._v("Then it means you need to scale up your server by adding more memory.")]),e._v(" "),a("h2",{attrs:{id:"btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("#")]),e._v(" BTCPay Server keeps showing that my node is always starting")]),e._v(" "),a("p",[e._v("Possible cause:")]),e._v(" "),a("ul",[a("li",[e._v("You do not have enough RAM")]),e._v(" "),a("li",[e._v("You do not have enough storage")]),e._v(" "),a("li",[e._v("You accidentally disabled pruning")]),e._v(" "),a("li",[e._v("Your bitcoin data directory is corrupted")]),e._v(" "),a("li",[e._v("Your last wallet synchronisation goes beyond pruned data")])]),e._v(" "),a("h3",{attrs:{id:"cause-1-you-do-not-have-enough-ram"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-1-you-do-not-have-enough-ram"}},[e._v("#")]),e._v(" Cause 1: You do not have enough RAM")]),e._v(" "),a("p",[e._v("Check your RAM:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-h")]),e._v("\n")])])]),a("p",[e._v("If you see that you have no "),a("code",[e._v("free")]),e._v(" or very little "),a("code",[e._v("available")]),e._v(" memory:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v(" total used "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" shared buff/cache available\nMem: "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G 0M 66M 0G 0M\nSwap: 0B 0B 0B\n")])])]),a("p",[e._v("Then you need more memory. If you have already synched your node, you can add some swap memory. If you haven't, your server specs are too limited.")]),e._v(" "),a("p",[e._v("If you have already synched, you can add 2G of swap memory with:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("fallocate "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-l")]),e._v(" 2G /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("600")]),e._v(" /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkswap")]),e._v(" /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("swapon")]),e._v(" /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/mnt/swapfile none swap sw 0 0"')]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">>")]),e._v(" /etc/fstab\n")])])]),a("h3",{attrs:{id:"cause-2-you-do-not-have-enough-storage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-2-you-do-not-have-enough-storage"}},[e._v("#")]),e._v(" Cause 2: You do not have enough storage")]),e._v(" "),a("p",[e._v("Check the storage of your machine:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("df")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-h")]),e._v("\n")])])]),a("p",[e._v("If you see you don't have any storage left (/dev/sda1 in my case)")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Filesystem Size Used Avail Use% Mounted on\nudev "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /dev\ntmpfs 395M 41M 354M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("11")]),e._v("% /run\n/dev/sda1 125G 125G 0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v("% /\ntmpfs "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /dev/shm\ntmpfs "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v(".0M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v(".0M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /run/lock\ntmpfs "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /sys/fs/cgroup\n/dev/sdb1 "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("7")]),e._v(".8G 18M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("7")]),e._v(".4G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v("% /mnt\n")])])]),a("p",[a("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("Choose the docker fragment")]),e._v(" for the amount of storage you aim to keep. Then "),a("RouterLink",{attrs:{to:"/Docker/#how-i-can-prune-my-nodes"}},[e._v("prune your node")]),e._v(".")],1),e._v(" "),a("h3",{attrs:{id:"cause-3-you-accidentally-disabled-pruning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-3-you-accidentally-disabled-pruning"}},[e._v("#")]),e._v(" Cause 3: You accidentally disabled pruning")]),e._v(" "),a("p",[e._v("If you have recently tried to modify your environment variables using the "),a("code",[e._v('export BTCPAYGEN_ADDITIONAL_FRAGMENTS="xyz"')]),e._v(" command to add an additional fragment, but forgot to include your current ones, you may have disabled pruning.")]),e._v(" "),a("p",[e._v("If you don't have enough memory to store the entire Bitcoin blockchain and you don't have an "),a("code",[e._v("opt-save-storage")]),e._v(" listed when you "),a("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("print the complete list of options")]),e._v(" that you are running, it is very likely you have disabled pruning.")],1),e._v(" "),a("p",[e._v("You can verify by checking your Bitcoind logs:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" btcpayserver_bitcoind\n")])])]),a("p",[e._v("If you see:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Block files have previously been pruned.\nYou need to rebuild the database using "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" to go back to unpruned mode.\nThis will redownload the entire blockchain.\nPlease restart with "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" or -reindex-chainstate to recover.\n")])])]),a("p",[e._v("You can simply "),a("a",{attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("re-enable pruning")]),e._v(" to solve the issue.")]),e._v(" "),a("h3",{attrs:{id:"cause-4-your-bitcoin-data-directory-is-corrupted"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-4-your-bitcoin-data-directory-is-corrupted"}},[e._v("#")]),e._v(" Cause 4: Your bitcoin data directory is corrupted")]),e._v(" "),a("p",[e._v("Check the logs of your node:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("10")]),e._v(" btcpayserver_bitcoind\n")])])]),a("p",[e._v("If you see:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Please restart with "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" or -reindex-chainstate to recover.\n")])])]),a("p",[e._v("Then your bitcoin data directory has been corrupted. It may be physical damage or failure of the hard drive.\nTo reindex your node:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("btcpay-down.sh\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Delete 'blocks' and 'chainstate' folders")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/blocks\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/chainstate\nbtcpay-up.sh\n")])])]),a("h3",{attrs:{id:"cause-5-your-last-wallet-synchronisation-goes-beyond-pruned-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-5-your-last-wallet-synchronisation-goes-beyond-pruned-data"}},[e._v("#")]),e._v(" Cause 5: Your last wallet synchronisation goes beyond pruned data")]),e._v(" "),a("p",[e._v("This can happen if you use FastSync or import an already synched blockchain. It means that the bitcoin core wallet needs to be removed because it was created before the utxoset, likely because BTCPay Server started without the utxoset at the first boot. To verify this case, "),a("RouterLink",{attrs:{to:"/Troubleshooting/#21-btcpay-logs"}},[e._v("check the bitcoind log")]),e._v(" for this:")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Error: Prune: last wallet synchronisation goes beyond pruned data. You need to "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("download the whole blockchain again "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("in")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("case")]),e._v(" of pruned "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("node")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),a("p",[e._v("If you see this error and agree to remove the wallet to finish syncing, use "),a("code",[e._v("docker volume rm generated_bitcoin_wallet_datadir")]),e._v(" after you run "),a("code",[e._v("btcpay-down.sh")]),e._v(" and before you run "),a("code",[e._v("btcpay-up.sh")]),e._v("\nWARNING: Do not delete this wallet if you have any funds on it.")]),e._v(" "),a("h2",{attrs:{id:"im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[e._v("#")]),e._v(" I'm running a full node and have a synched blockchain, can BTCPay use it so that it doesn't have to do a full sync?")]),e._v(" "),a("p",[e._v("Yes you can! However, before you do that, you'll want to stop bitcoind from updating docker's volume for it, as that job will be taken over by BTCPay Server.")]),e._v(" "),a("p",[e._v("If you want to run BTCPay Server inside a docker-compose, and that you have the data directory ("),a("code",[e._v(".bitcoin")]),e._v(") of a fully synched node on your docker host, then you can reuse it easily for BTCPay Server.")]),e._v(" "),a("p",[e._v("To do that, follow the following steps :")]),e._v(" "),a("ul",[a("li",[e._v("Do the normal setup according to "),a("RouterLink",{attrs:{to:"/Docker/"}},[e._v("this instruction")]),e._v(". Note the "),a("code",[e._v("opt-save-storage")]),e._v(" environment variable, which is used to enable various pruning levels. If you do not want to prune your exiting data directory, then omit the following line in your BTCPay docker deployment: "),a("code",[e._v('export BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-save-storage-s"')]),e._v(".")],1),e._v(" "),a("li",[e._v("Once "),a("code",[e._v("btcpay-setup.sh")]),e._v(" is over, turn down the docker compose with "),a("code",[e._v("btcpay-down.sh")]),e._v(".")]),e._v(" "),a("li",[e._v("Login as root with "),a("code",[e._v("sudo su -")]),e._v(".")]),e._v(" "),a("li",[e._v("Open the docker's volume for bitcoind : "),a("code",[e._v("cd /var/lib/docker/volumes/generated_bitcoin_datadir/")]),e._v(", and check its content with "),a("code",[e._v("ls -la")]),e._v(". You should see only one directory named "),a("code",[e._v("_data")]),e._v(".")]),e._v(" "),a("li",[e._v("Now remove the "),a("code",[e._v("_data")]),e._v("directory : "),a("code",[e._v("rm -r _data")]),e._v(". If for any reason you want to keep this directory and its content you can also rename it instead : "),a("code",[e._v("mv _data/ _data.old/")])]),e._v(" "),a("li",[e._v("Now create a "),a("a",{attrs:{href:"https://www.cyberciti.biz/faq/creating-soft-link-or-symbolic-link/",target:"_blank",rel:"noopener noreferrer"}},[e._v("symbolic link"),a("OutboundLink")],1),e._v(" between "),a("code",[e._v("/var/lib/docker/volumes/generated_bitcoin_datadir/_data")]),e._v(" and your data directory ("),a("code",[e._v(".bitcoin")]),e._v(") on your host: "),a("code",[e._v("ln -s path/to/.bitcoin /var/lib/docker/volumes/generated_bitcoin_datadir/_data")])]),e._v(" "),a("li",[e._v("Check that the link has been done with a "),a("code",[e._v("ls -la")])]),e._v(" "),a("li",[e._v("Start your docker-compose again with "),a("code",[e._v("btcpay-up.sh")])])]),e._v(" "),a("p",[e._v("Your BTCPay Server should now be fully synched.")]),e._v(" "),a("p",[e._v("If after this BTCPay Server keeps showing that your node is always starting, see the cause of "),a("a",{attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("BTCPay Server keeps showing that my node is always starting")]),e._v(".")]),e._v(" "),a("h2",{attrs:{id:"how-to-enable-bitcoin-node-pruning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("#")]),e._v(" How to enable Bitcoin node pruning?")]),e._v(" "),a("p",[e._v("This will prune your Bitcoin full node to a maximum of 100GB (of blocks):")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-save-storage"')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),a("p",[e._v("Other pruning options are "),a("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("documented here")]),e._v(". See "),a("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("this example")]),e._v(" for use with other additional fragments.")],1),e._v(" "),a("h2",{attrs:{id:"how-to-disable-bitcoin-node-pruning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-disable-bitcoin-node-pruning"}},[e._v("#")]),e._v(" How to disable Bitcoin node pruning?")]),e._v(" "),a("p",[e._v("To disable pruning of your Bitcoin node in BTCPay, first ensure you have enough memory to store the entire blockchain and BTCPayServer on your system. Then disable the "),a("code",[e._v("opt-save-storage")]),e._v(" environment variable. See "),a("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("this example")]),e._v(" to view your fragment list and select only one for removal. The following example will remove "),a("strong",[e._v("all")]),e._v(" additional fragments:")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),a("p",[e._v("Then run the following commands to recreate a non-pruned Bitcoin node:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("btcpay-down.sh\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Delete 'blocks' and 'chainstate' folders")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/blocks\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/chainstate\nbtcpay-up.sh\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[147],{848:function(e,a,t){"use strict";t.r(a);var s=t(17),n=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"synchronization-faq"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#synchronization-faq"}},[e._v("#")]),e._v(" Synchronization FAQ")]),e._v(" "),a("p",[e._v("This document covers the most common questions and issues that may occur during BTCPay sync.")]),e._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#why-does-btcpay-sync"}},[e._v("Why does BTCPay sync?")])]),a("li",[a("a",{attrs:{href:"#can-i-skip-the-synchronization"}},[e._v("Can I skip the synchronization?")])]),a("li",[a("a",{attrs:{href:"#how-do-i-know-that-btcpay-synced-completely"}},[e._v("How do I know that BTCPay synced completely?")])]),a("li",[a("a",{attrs:{href:"#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[e._v("How can I check the block height of my bitcoin node?")])]),a("li",[a("a",{attrs:{href:"#btcpay-server-takes-forever-to-synchronize"}},[e._v("BTCPay Server takes forever to synchronize")]),a("ul",[a("li",[a("a",{attrs:{href:"#cause-1-not-enough-cpu"}},[e._v("Cause 1: Not enough CPU")])]),a("li",[a("a",{attrs:{href:"#cause-2-using-swap-memory"}},[e._v("Cause 2: Using swap memory")])])])]),a("li",[a("a",{attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("BTCPay Server keeps showing that my node is always starting")]),a("ul",[a("li",[a("a",{attrs:{href:"#cause-1-you-do-not-have-enough-ram"}},[e._v("Cause 1: You do not have enough RAM")])]),a("li",[a("a",{attrs:{href:"#cause-2-you-do-not-have-enough-storage"}},[e._v("Cause 2: You do not have enough storage")])]),a("li",[a("a",{attrs:{href:"#cause-3-you-accidentally-disabled-pruning"}},[e._v("Cause 3: You accidentally disabled pruning")])]),a("li",[a("a",{attrs:{href:"#cause-4-your-bitcoin-data-directory-is-corrupted"}},[e._v("Cause 4: Your bitcoin data directory is corrupted")])]),a("li",[a("a",{attrs:{href:"#cause-5-your-last-wallet-synchronisation-goes-beyond-pruned-data"}},[e._v("Cause 5: Your last wallet synchronisation goes beyond pruned data")])])])]),a("li",[a("a",{attrs:{href:"#im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[e._v("I'm running a full node and have a synched blockchain, can BTCPay use it so that it doesn't have to do a full sync?")])]),a("li",[a("a",{attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("How to enable Bitcoin node pruning?")])]),a("li",[a("a",{attrs:{href:"#how-to-disable-bitcoin-node-pruning"}},[e._v("How to disable Bitcoin node pruning?")])])])]),a("p"),e._v(" "),a("h2",{attrs:{id:"why-does-btcpay-sync"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#why-does-btcpay-sync"}},[e._v("#")]),e._v(" Why does BTCPay sync?")]),e._v(" "),a("p",[e._v("After deployment, your BTCPay Server needs to sync the entire blockchain and validate all the consensus rules. Depending on your machine specifications, bandwidth and number of altcoins you added, this process may take between 1-5 days.")]),e._v(" "),a("p",[e._v("It may seem tedious, but it's a critical step of running your own full node and not having to trust or rely on anyone. Your node will not only download ~300GB of data (less if you're using a pruned node) but also validate all the rules of the consensus. You can find more information about the importance of blockchain synchronization in "),a("a",{attrs:{href:"https://www.youtube.com/watch?v=OrYDehC-8TU",target:"_blank",rel:"noopener noreferrer"}},[e._v("this video"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("If you are only interested in learning about BTCPay Server i.e. simply "),a("RouterLink",{attrs:{to:"/TryItOut/"}},[e._v("trying it out")]),e._v(" without deploying your own instance, you can avoid sync by using a "),a("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("Third-Party host")]),e._v(".")],1),e._v(" "),a("h2",{attrs:{id:"can-i-skip-the-synchronization"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#can-i-skip-the-synchronization"}},[e._v("#")]),e._v(" Can I skip the synchronization?")]),e._v(" "),a("p",[e._v("You can't skip synchronization if you are deploying a BTCPay Server, but you can drastically decrease the time it takes. If you're comfortable with using the command line, you can use FastSync to synchronize your node faster. Be sure to "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/tree/master/contrib/FastSync",target:"_blank",rel:"noopener noreferrer"}},[e._v("read this FastSync document"),a("OutboundLink")],1),e._v(" to understand the potential trust issues involved with this feature.")]),e._v(" "),a("p",[e._v("To use FastSync, make sure your deployment has a "),a("a",{attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("pruning option enabled")]),e._v(" by using an "),a("code",[e._v("opt-save-storage")]),e._v(" environment variable, otherwise bitcoind will not be able to sync. First step is to "),a("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[e._v("ssh into")]),e._v(" your BTCPayServer instance and run the following commands:")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker/\nbtcpay-down.sh\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" contrib/FastSync\n./load-utxo-set.sh\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Once FastSync has completed")]),e._v("\nbtcpay-up.sh\n")])])]),a("p",[e._v("After FastSync is complete and you have brought back up your instance, refresh your BTCPay domain and wait for remaining blockchain synchronization. You can also follow "),a("a",{attrs:{href:"https://youtube.com/watch?v=VNMnd-dX9Q8?t=1730",target:"_blank",rel:"noopener noreferrer"}},[e._v("this video"),a("OutboundLink")],1),e._v(".")]),e._v(" "),a("p",[e._v("If your FastSync returns "),a("code",[e._v("You need to delete your Bitcoin Core wallet")]),e._v(" after you load the uxto set, or you find this error: "),a("code",[e._v("Last wallet synchronisation goes beyond pruned data")]),e._v(", see the cause of "),a("a",{attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("BTCPay Server keeps showing that my node is always starting")]),e._v(".")]),e._v(" "),a("h2",{attrs:{id:"how-do-i-know-that-btcpay-synced-completely"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-know-that-btcpay-synced-completely"}},[e._v("#")]),e._v(" How do I know that BTCPay synced completely?")]),e._v(" "),a("p",[e._v("When you do not see a pop-up message in the bottom right corner, which shows the sync progress, that means that your server is fully synced and you can "),a("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("begin using it")]),e._v(".")],1),e._v(" "),a("p",[e._v("If you want to check that your BTCPay Server Bitcoin node is synchronized with the most recent block in the Bitcoin blockchain, "),a("a",{attrs:{href:"#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[e._v("check your node height")]),e._v(" matches the current block height using any blockchain explorer.")]),e._v(" "),a("h2",{attrs:{id:"how-can-i-check-the-block-height-of-my-bitcoin-node"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-check-the-block-height-of-my-bitcoin-node"}},[e._v("#")]),e._v(" How can I check the block height of my bitcoin node?")]),e._v(" "),a("p",[e._v("To verify the sync status of your Bitcoin node, you can use bitcoin-cli commands inside your server's Bitcoin container. SSH into your server and navigate to the directory where you "),a("RouterLink",{attrs:{to:"/Troubleshooting/#23-bitcoin-node-logs"}},[e._v("view Bitcoin logs")]),e._v(" run the command: "),a("code",[e._v("bitcoin-cli.sh getblockcount")]),e._v(" to view the current block of your server's Bitcoin node.")],1),e._v(" "),a("h2",{attrs:{id:"btcpay-server-takes-forever-to-synchronize"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-takes-forever-to-synchronize"}},[e._v("#")]),e._v(" BTCPay Server takes forever to synchronize")]),e._v(" "),a("p",[e._v("Synchronizing a Full Bitcoin node should take between 1 and 5 days. It should sync quickly at first and more slowly at the end.")]),e._v(" "),a("p",[e._v("If the node appears to not be syncing, verify:")]),e._v(" "),a("ul",[a("li",[e._v("Not enough CPU")]),e._v(" "),a("li",[e._v("Using swap memory")])]),e._v(" "),a("h3",{attrs:{id:"cause-1-not-enough-cpu"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-1-not-enough-cpu"}},[e._v("#")]),e._v(" Cause 1: Not enough CPU")]),e._v(" "),a("p",[e._v("We recommend 2 CPU while synchronizing; however some hosting providers throttle your CPU if you use too much.")]),e._v(" "),a("p",[e._v("Check with")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" stats\n")])])]),a("p",[e._v("If you see more than 100% CPU usage, while being very slow to sync:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("8e7ac41e6e2a btcpayserver_bitcoind 100% 560.5MiB / 3.853GiB 14.20% 4.17\n")])])]),a("p",[e._v("Then you need to scale up your machine specification.")]),e._v(" "),a("p",[e._v("If you see very low CPU usage (less than 10%) during synchronization:")]),e._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("8e7ac41e6e2a btcpayserver_bitcoind 10% 560.5MiB / 3.853GiB 14.20% 4.17\n")])])]),a("p",[e._v("Your hosting provider might throttle your CPU. Please make sure your host supports the high use of CPU for an extended period.")]),e._v(" "),a("p",[e._v("If they don't allow it, shut down your server until they stop throttling you. Then you can limit the CPU via docker, and restart the server:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" update btcpayserver_bitcoind "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--cpus")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('".8"')]),e._v("\n")])])]),a("h3",{attrs:{id:"cause-2-using-swap-memory"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-2-using-swap-memory"}},[e._v("#")]),e._v(" Cause 2: Using swap memory")]),e._v(" "),a("p",[e._v("If you are synching and don't have enough memory, your server may use swap memory to continue operating:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-h")]),e._v("\n")])])]),a("p",[e._v("If you see swap memory usage:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v(" total used "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" shared buff/cache available\nMem: "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G 0M 66M 0G 0M\nSwap: "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v(".0G 200M 800M\n")])])]),a("p",[e._v("Then it means you need to scale up your server by adding more memory.")]),e._v(" "),a("h2",{attrs:{id:"btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("#")]),e._v(" BTCPay Server keeps showing that my node is always starting")]),e._v(" "),a("p",[e._v("Possible cause:")]),e._v(" "),a("ul",[a("li",[e._v("You do not have enough RAM")]),e._v(" "),a("li",[e._v("You do not have enough storage")]),e._v(" "),a("li",[e._v("You accidentally disabled pruning")]),e._v(" "),a("li",[e._v("Your bitcoin data directory is corrupted")]),e._v(" "),a("li",[e._v("Your last wallet synchronisation goes beyond pruned data")])]),e._v(" "),a("h3",{attrs:{id:"cause-1-you-do-not-have-enough-ram"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-1-you-do-not-have-enough-ram"}},[e._v("#")]),e._v(" Cause 1: You do not have enough RAM")]),e._v(" "),a("p",[e._v("Check your RAM:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-h")]),e._v("\n")])])]),a("p",[e._v("If you see that you have no "),a("code",[e._v("free")]),e._v(" or very little "),a("code",[e._v("available")]),e._v(" memory:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v(" total used "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("free")]),e._v(" shared buff/cache available\nMem: "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G 0M 66M 0G 0M\nSwap: 0B 0B 0B\n")])])]),a("p",[e._v("Then you need more memory. If you have already synched your node, you can add some swap memory. If you haven't, your server specs are too limited.")]),e._v(" "),a("p",[e._v("If you have already synched, you can add 2G of swap memory with:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("fallocate "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-l")]),e._v(" 2G /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("chmod")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("600")]),e._v(" /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("mkswap")]),e._v(" /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("swapon")]),e._v(" /mnt/swapfile\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("echo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"/mnt/swapfile none swap sw 0 0"')]),e._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">>")]),e._v(" /etc/fstab\n")])])]),a("h3",{attrs:{id:"cause-2-you-do-not-have-enough-storage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-2-you-do-not-have-enough-storage"}},[e._v("#")]),e._v(" Cause 2: You do not have enough storage")]),e._v(" "),a("p",[e._v("Check the storage of your machine:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("df")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-h")]),e._v("\n")])])]),a("p",[e._v("If you see you don't have any storage left (/dev/sda1 in my case)")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Filesystem Size Used Avail Use% Mounted on\nudev "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /dev\ntmpfs 395M 41M 354M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("11")]),e._v("% /run\n/dev/sda1 125G 125G 0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v("% /\ntmpfs "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /dev/shm\ntmpfs "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v(".0M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("5")]),e._v(".0M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /run/lock\ntmpfs "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("2")]),e._v(".0G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("0")]),e._v("% /sys/fs/cgroup\n/dev/sdb1 "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("7")]),e._v(".8G 18M "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("7")]),e._v(".4G "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("1")]),e._v("% /mnt\n")])])]),a("p",[a("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("Choose the docker fragment")]),e._v(" for the amount of storage you aim to keep. Then "),a("RouterLink",{attrs:{to:"/Docker/#how-i-can-prune-my-nodes"}},[e._v("prune your node")]),e._v(".")],1),e._v(" "),a("h3",{attrs:{id:"cause-3-you-accidentally-disabled-pruning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-3-you-accidentally-disabled-pruning"}},[e._v("#")]),e._v(" Cause 3: You accidentally disabled pruning")]),e._v(" "),a("p",[e._v("If you have recently tried to modify your environment variables using the "),a("code",[e._v('export BTCPAYGEN_ADDITIONAL_FRAGMENTS="xyz"')]),e._v(" command to add an additional fragment, but forgot to include your current ones, you may have disabled pruning.")]),e._v(" "),a("p",[e._v("If you don't have enough memory to store the entire Bitcoin blockchain and you don't have an "),a("code",[e._v("opt-save-storage")]),e._v(" listed when you "),a("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("print the complete list of options")]),e._v(" that you are running, it is very likely you have disabled pruning.")],1),e._v(" "),a("p",[e._v("You can verify by checking your Bitcoind logs:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" btcpayserver_bitcoind\n")])])]),a("p",[e._v("If you see:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Block files have previously been pruned.\nYou need to rebuild the database using "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" to go back to unpruned mode.\nThis will redownload the entire blockchain.\nPlease restart with "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" or -reindex-chainstate to recover.\n")])])]),a("p",[e._v("You can simply "),a("a",{attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("re-enable pruning")]),e._v(" to solve the issue.")]),e._v(" "),a("h3",{attrs:{id:"cause-4-your-bitcoin-data-directory-is-corrupted"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-4-your-bitcoin-data-directory-is-corrupted"}},[e._v("#")]),e._v(" Cause 4: Your bitcoin data directory is corrupted")]),e._v(" "),a("p",[e._v("Check the logs of your node:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("10")]),e._v(" btcpayserver_bitcoind\n")])])]),a("p",[e._v("If you see:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Please restart with "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" or -reindex-chainstate to recover.\n")])])]),a("p",[e._v("Then your bitcoin data directory has been corrupted. It may be physical damage or failure of the hard drive.\nTo reindex your node:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("btcpay-down.sh\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Delete 'blocks' and 'chainstate' folders")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/blocks\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/chainstate\nbtcpay-up.sh\n")])])]),a("h3",{attrs:{id:"cause-5-your-last-wallet-synchronisation-goes-beyond-pruned-data"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#cause-5-your-last-wallet-synchronisation-goes-beyond-pruned-data"}},[e._v("#")]),e._v(" Cause 5: Your last wallet synchronisation goes beyond pruned data")]),e._v(" "),a("p",[e._v("This can happen if you use FastSync or import an already synched blockchain. It means that the bitcoin core wallet needs to be removed because it was created before the utxoset, likely because BTCPay Server started without the utxoset at the first boot. To verify this case, "),a("RouterLink",{attrs:{to:"/Troubleshooting/#21-btcpay-logs"}},[e._v("check the bitcoind log")]),e._v(" for this:")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("Error: Prune: last wallet synchronisation goes beyond pruned data. You need to "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-reindex")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("download the whole blockchain again "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("in")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("case")]),e._v(" of pruned "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("node")]),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),a("p",[e._v("If you see this error and agree to remove the wallet to finish syncing, use "),a("code",[e._v("docker volume rm generated_bitcoin_wallet_datadir")]),e._v(" after you run "),a("code",[e._v("btcpay-down.sh")]),e._v(" and before you run "),a("code",[e._v("btcpay-up.sh")]),e._v("\nWARNING: Do not delete this wallet if you have any funds on it.")]),e._v(" "),a("h2",{attrs:{id:"im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#im-running-a-full-node-and-have-a-synched-blockchain-can-btcpay-use-it-so-that-it-doesnt-have-to-do-a-full-sync"}},[e._v("#")]),e._v(" I'm running a full node and have a synched blockchain, can BTCPay use it so that it doesn't have to do a full sync?")]),e._v(" "),a("p",[e._v("Yes you can! However, before you do that, you'll want to stop bitcoind from updating docker's volume for it, as that job will be taken over by BTCPay Server.")]),e._v(" "),a("p",[e._v("If you want to run BTCPay Server inside a docker-compose, and that you have the data directory ("),a("code",[e._v(".bitcoin")]),e._v(") of a fully synched node on your docker host, then you can reuse it easily for BTCPay Server.")]),e._v(" "),a("p",[e._v("To do that, follow the following steps :")]),e._v(" "),a("ul",[a("li",[e._v("Do the normal setup according to "),a("RouterLink",{attrs:{to:"/Docker/"}},[e._v("this instruction")]),e._v(". Note the "),a("code",[e._v("opt-save-storage")]),e._v(" environment variable, which is used to enable various pruning levels. If you do not want to prune your exiting data directory, then omit the following line in your BTCPay docker deployment: "),a("code",[e._v('export BTCPAYGEN_ADDITIONAL_FRAGMENTS="opt-save-storage-s"')]),e._v(".")],1),e._v(" "),a("li",[e._v("Once "),a("code",[e._v("btcpay-setup.sh")]),e._v(" is over, turn down the docker compose with "),a("code",[e._v("btcpay-down.sh")]),e._v(".")]),e._v(" "),a("li",[e._v("Login as root with "),a("code",[e._v("sudo su -")]),e._v(".")]),e._v(" "),a("li",[e._v("Open the docker's volume for bitcoind : "),a("code",[e._v("cd /var/lib/docker/volumes/generated_bitcoin_datadir/")]),e._v(", and check its content with "),a("code",[e._v("ls -la")]),e._v(". You should see only one directory named "),a("code",[e._v("_data")]),e._v(".")]),e._v(" "),a("li",[e._v("Now remove the "),a("code",[e._v("_data")]),e._v("directory : "),a("code",[e._v("rm -r _data")]),e._v(". If for any reason you want to keep this directory and its content you can also rename it instead : "),a("code",[e._v("mv _data/ _data.old/")])]),e._v(" "),a("li",[e._v("Now create a "),a("a",{attrs:{href:"https://www.cyberciti.biz/faq/creating-soft-link-or-symbolic-link/",target:"_blank",rel:"noopener noreferrer"}},[e._v("symbolic link"),a("OutboundLink")],1),e._v(" between "),a("code",[e._v("/var/lib/docker/volumes/generated_bitcoin_datadir/_data")]),e._v(" and your data directory ("),a("code",[e._v(".bitcoin")]),e._v(") on your host: "),a("code",[e._v("ln -s path/to/.bitcoin /var/lib/docker/volumes/generated_bitcoin_datadir/_data")])]),e._v(" "),a("li",[e._v("Check that the link has been done with a "),a("code",[e._v("ls -la")])]),e._v(" "),a("li",[e._v("Start your docker-compose again with "),a("code",[e._v("btcpay-up.sh")])])]),e._v(" "),a("p",[e._v("Your BTCPay Server should now be fully synched.")]),e._v(" "),a("p",[e._v("If after this BTCPay Server keeps showing that your node is always starting, see the cause of "),a("a",{attrs:{href:"#btcpay-server-keeps-showing-that-my-node-is-always-starting"}},[e._v("BTCPay Server keeps showing that my node is always starting")]),e._v(".")]),e._v(" "),a("h2",{attrs:{id:"how-to-enable-bitcoin-node-pruning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-enable-bitcoin-node-pruning"}},[e._v("#")]),e._v(" How to enable Bitcoin node pruning?")]),e._v(" "),a("p",[e._v("This will prune your Bitcoin full node to a maximum of 100GB (of blocks):")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('"opt-save-storage"')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),a("p",[e._v("Other pruning options are "),a("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[e._v("documented here")]),e._v(". See "),a("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("this example")]),e._v(" for use with other additional fragments.")],1),e._v(" "),a("h2",{attrs:{id:"how-to-disable-bitcoin-node-pruning"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-disable-bitcoin-node-pruning"}},[e._v("#")]),e._v(" How to disable Bitcoin node pruning?")]),e._v(" "),a("p",[e._v("To disable pruning of your Bitcoin node in BTCPay, first ensure you have enough memory to store the entire blockchain and BTCPayServer on your system. Then disable the "),a("code",[e._v("opt-save-storage")]),e._v(" environment variable. See "),a("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("this example")]),e._v(" to view your fragment list and select only one for removal. The following example will remove "),a("strong",[e._v("all")]),e._v(" additional fragments:")],1),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),a("p",[e._v("Then run the following commands to recreate a non-pruned Bitcoin node:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("btcpay-down.sh\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Delete 'blocks' and 'chainstate' folders")]),e._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/blocks\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-rf")]),e._v(" /var/lib/docker/volumes/generated_bitcoin_datadir/_data/chainstate\nbtcpay-up.sh\n")])])])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/151.95095468.js b/assets/js/151.4db629a2.js similarity index 99% rename from assets/js/151.95095468.js rename to assets/js/151.4db629a2.js index 61a12650c4..da6a45c62e 100644 --- a/assets/js/151.95095468.js +++ b/assets/js/151.4db629a2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[151],{860:function(e,t,a){"use strict";a.r(t);var r=a(17),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"api-specification"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-specification"}},[e._v("#")]),e._v(" API Specification")]),e._v(" "),t("p",[e._v("NBXplorer is a multi crypto currency lightweight block explorer.")]),e._v(" "),t("p",[e._v("NBXplorer does not index the whole blockchain, rather, it listens transactions and blocks from a trusted full node and index only addresses and transactions which belongs to a "),t("code",[e._v("DerivationScheme")]),e._v(" that you decide to track.")]),e._v(" "),t("p",[e._v("This document describes the concepts, while the "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API endpoints are documented here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"table-of-content"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#table-of-content"}},[e._v("#")]),e._v(" Table of content")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#configuration"}},[e._v("Configuration")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#tracked-sources"}},[e._v("Tracked Sources")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#derivation-scheme"}},[e._v("Derivation schemes")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#groups"}},[e._v("Groups")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#addresses"}},[e._v("Addresses")])])])]),e._v(" "),t("li",[t("a",{attrs:{href:"#authentication"}},[e._v("Authentication")])])]),e._v(" "),t("h2",{attrs:{id:"configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[e._v("#")]),e._v(" Configuration")]),e._v(" "),t("p",[e._v("You can check the available settings with "),t("code",[e._v("--help")]),e._v(".")]),e._v(" "),t("p",[e._v("NBXplorer can be configured in three way:")]),e._v(" "),t("ul",[t("li",[e._v("Through command line arguments (eg. "),t("code",[e._v("--chains btc")]),e._v(")")]),e._v(" "),t("li",[e._v("Through environment variables (eg. "),t("code",[e._v("NBXPLORER_CHAINS=btc")]),e._v(")")]),e._v(" "),t("li",[e._v("Through configuration file (eg. "),t("code",[e._v("chains=btc")]),e._v(")")])]),e._v(" "),t("p",[e._v("If you use configuration file, you can find it on windows in:")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("C:\\Users\\\\AppData\\Roaming\\NBXplorer\\\\settings.config\n")])])]),t("p",[e._v("On linux or mac:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("~/.nbxplorer/"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("network"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("/settings.config\n")])])]),t("p",[e._v("Be careful, if you run NBXplorer with "),t("code",[e._v("dotnet run")]),e._v(", you should do it this way, with settings after the "),t("code",[e._v("--")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run --no-launch-profile --no-build "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-p")]),e._v(" ."),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("NBXplorer"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("NBXplorer.csproj -- "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--chains")]),e._v(" btc\n")])])]),t("p",[e._v("Else, launch profiles, which are settings meant to be used only for debugging time, might be taken into account.")]),e._v(" "),t("h2",{attrs:{id:"tracked-sources"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tracked-sources"}},[e._v("#")]),e._v(" "),t("a",{attrs:{name:"tracked-source"}}),e._v("Tracked Sources")]),e._v(" "),t("p",[e._v("A tracked source is a generic way to track a set of scripts (addresses) and its UTXOs, transactions, and balances.")]),e._v(" "),t("h3",{attrs:{id:"derivation-scheme"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#derivation-scheme"}},[e._v("#")]),e._v(" "),t("a",{attrs:{name:"derivationScheme"}}),e._v("Derivation scheme")]),e._v(" "),t("p",[e._v("A derivation scheme, also called "),t("code",[e._v("derivationStrategy")]),e._v(" in the code, is a flexible way to define how to generate deterministic addresses for a wallet.\nNBXplorer will track any addresses on the "),t("code",[e._v("0/x")]),e._v(", "),t("code",[e._v("1/x")]),e._v(" and "),t("code",[e._v("x")]),e._v(" path.")]),e._v(" "),t("p",[e._v("Here a documentation of the different derivation scheme supported:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Address type")]),e._v(" "),t("th",[e._v("Format")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("P2WPKH")]),e._v(" "),t("td",[e._v("xpub1")])]),e._v(" "),t("tr",[t("td",[e._v("P2SH-P2WPKH")]),e._v(" "),t("td",[e._v("xpub1-[p2sh]")])]),e._v(" "),t("tr",[t("td",[e._v("P2PKH")]),e._v(" "),t("td",[e._v("xpub-[legacy]")])]),e._v(" "),t("tr",[t("td",[e._v("Multi-sig P2WSH")]),e._v(" "),t("td",[e._v("2-of-xpub1-xpub2")])]),e._v(" "),t("tr",[t("td",[e._v("Multi-sig P2SH-P2WSH")]),e._v(" "),t("td",[e._v("2-of-xpub1-xpub2-[p2sh]")])]),e._v(" "),t("tr",[t("td",[e._v("Multi-sig P2SH")]),e._v(" "),t("td",[e._v("2-of-xpub1-xpub2-[legacy]")])]),e._v(" "),t("tr",[t("td",[e._v("P2TR")]),e._v(" "),t("td",[e._v("xpub1-[taproot]")])])])]),e._v(" "),t("p",[e._v("For multisig, the public keys are ordered before generating the address by default for privacy reason, use "),t("code",[e._v("-[keeporder]")]),e._v(" to disable it.")]),e._v(" "),t("p",[e._v("You can use more than one options at same time, example: "),t("code",[e._v("2-of-xpub1-xpub2-[legacy]-[keeporder]")])]),e._v(" "),t("p",[e._v("Most of routes asks for a "),t("code",[e._v("cryptoCode")]),e._v(". This identify the crypto currency to request data from. (eg. "),t("code",[e._v("BTC")]),e._v(", "),t("code",[e._v("LTC")]),e._v("...)")]),e._v(" "),t("p",[e._v("Note: Taproot is incompatible with all other options.")]),e._v(" "),t("p",[e._v("A derivation scheme tracked source's format is "),t("code",[e._v("DERIVATIONSCHEME:derivationScheme")]),e._v(" (eg. "),t("code",[e._v("DERIVATIONSCHEME:xpub1")]),e._v(").")]),e._v(" "),t("p",[e._v("You can create one by calling "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/Track",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tracking derivation scheme"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"groups"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#groups"}},[e._v("#")]),e._v(" "),t("a",{attrs:{name:"groups"}}),e._v("Groups")]),e._v(" "),t("p",[e._v("A group is a tracked source which serves as a logical method for grouping several tracked sources into a single entity. You can add or remove tracked sources to and from a group.")]),e._v(" "),t("p",[e._v("Additionally, specific addresses can be tracked through the group.")]),e._v(" "),t("p",[e._v("Every address attached by a child tracked source will be added to the group, including all related UTXOs and transactions.")]),e._v(" "),t("p",[e._v("A group can have any number of children, and a group can also be a child of another group.\nPlease note that all the children are returned by "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Groups/operation/Get",target:"_blank",rel:"noopener noreferrer"}},[e._v("Get a group"),t("OutboundLink")],1),e._v(". As such, it is advised not to add too many children to avoid slowing down this call.")]),e._v(" "),t("p",[e._v("A group tracked source's format is "),t("code",[e._v("GROUP:groupid")]),e._v(".")]),e._v(" "),t("p",[e._v("You can create a new group by calling "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Groups/operation/Create",target:"_blank",rel:"noopener noreferrer"}},[e._v("Create a group"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"addresses"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#addresses"}},[e._v("#")]),e._v(" "),t("a",{attrs:{name:"addresses"}}),e._v("Addresses")]),e._v(" "),t("p",[e._v("This refers to a tracked source that monitors a single address. It functions similarly to a group, but with only one specific address to it.")]),e._v(" "),t("p",[e._v("The address tracked source's format is "),t("code",[e._v("ADDRESS:bc1...")]),e._v(".")]),e._v(" "),t("p",[e._v("You can create one by calling "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Legacy/operation/TrackSingleAddress",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tracking an address"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"authentication"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[e._v("#")]),e._v(" Authentication")]),e._v(" "),t("p",[e._v("By default a cookie file is generated when NBXplorer is starting, for windows in:")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("C:\\Users\\\\AppData\\Roaming\\NBXplorer\\\\.cookie\n")])])]),t("p",[e._v("On linux or mac:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("~/.nbxplorer/"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("network"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("/.cookie\n")])])]),t("p",[e._v("The content of this cookie must be used is used as HTTP BASIC authentication to use the API.")]),e._v(" "),t("p",[e._v("This can be disabled with "),t("code",[e._v("--noauth")]),e._v(" or "),t("code",[e._v("NBXPLORER_NOAUTH=1")]),e._v(".")]),e._v(" "),t("p",[e._v("Also, NBXPlorer listen by default on "),t("code",[e._v("127.0.0.1")]),e._v(", if you want to access it from another machine, run "),t("code",[e._v('--bind "0.0.0.0"')]),e._v(".")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[151],{872:function(e,t,a){"use strict";a.r(t);var r=a(17),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"api-specification"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-specification"}},[e._v("#")]),e._v(" API Specification")]),e._v(" "),t("p",[e._v("NBXplorer is a multi crypto currency lightweight block explorer.")]),e._v(" "),t("p",[e._v("NBXplorer does not index the whole blockchain, rather, it listens transactions and blocks from a trusted full node and index only addresses and transactions which belongs to a "),t("code",[e._v("DerivationScheme")]),e._v(" that you decide to track.")]),e._v(" "),t("p",[e._v("This document describes the concepts, while the "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API endpoints are documented here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"table-of-content"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#table-of-content"}},[e._v("#")]),e._v(" Table of content")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#configuration"}},[e._v("Configuration")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#tracked-sources"}},[e._v("Tracked Sources")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#derivation-scheme"}},[e._v("Derivation schemes")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#groups"}},[e._v("Groups")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#addresses"}},[e._v("Addresses")])])])]),e._v(" "),t("li",[t("a",{attrs:{href:"#authentication"}},[e._v("Authentication")])])]),e._v(" "),t("h2",{attrs:{id:"configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[e._v("#")]),e._v(" Configuration")]),e._v(" "),t("p",[e._v("You can check the available settings with "),t("code",[e._v("--help")]),e._v(".")]),e._v(" "),t("p",[e._v("NBXplorer can be configured in three way:")]),e._v(" "),t("ul",[t("li",[e._v("Through command line arguments (eg. "),t("code",[e._v("--chains btc")]),e._v(")")]),e._v(" "),t("li",[e._v("Through environment variables (eg. "),t("code",[e._v("NBXPLORER_CHAINS=btc")]),e._v(")")]),e._v(" "),t("li",[e._v("Through configuration file (eg. "),t("code",[e._v("chains=btc")]),e._v(")")])]),e._v(" "),t("p",[e._v("If you use configuration file, you can find it on windows in:")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("C:\\Users\\\\AppData\\Roaming\\NBXplorer\\\\settings.config\n")])])]),t("p",[e._v("On linux or mac:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("~/.nbxplorer/"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("network"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("/settings.config\n")])])]),t("p",[e._v("Be careful, if you run NBXplorer with "),t("code",[e._v("dotnet run")]),e._v(", you should do it this way, with settings after the "),t("code",[e._v("--")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("dotnet run --no-launch-profile --no-build "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" Release "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-p")]),e._v(" ."),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("NBXplorer"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("NBXplorer.csproj -- "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--chains")]),e._v(" btc\n")])])]),t("p",[e._v("Else, launch profiles, which are settings meant to be used only for debugging time, might be taken into account.")]),e._v(" "),t("h2",{attrs:{id:"tracked-sources"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tracked-sources"}},[e._v("#")]),e._v(" "),t("a",{attrs:{name:"tracked-source"}}),e._v("Tracked Sources")]),e._v(" "),t("p",[e._v("A tracked source is a generic way to track a set of scripts (addresses) and its UTXOs, transactions, and balances.")]),e._v(" "),t("h3",{attrs:{id:"derivation-scheme"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#derivation-scheme"}},[e._v("#")]),e._v(" "),t("a",{attrs:{name:"derivationScheme"}}),e._v("Derivation scheme")]),e._v(" "),t("p",[e._v("A derivation scheme, also called "),t("code",[e._v("derivationStrategy")]),e._v(" in the code, is a flexible way to define how to generate deterministic addresses for a wallet.\nNBXplorer will track any addresses on the "),t("code",[e._v("0/x")]),e._v(", "),t("code",[e._v("1/x")]),e._v(" and "),t("code",[e._v("x")]),e._v(" path.")]),e._v(" "),t("p",[e._v("Here a documentation of the different derivation scheme supported:")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Address type")]),e._v(" "),t("th",[e._v("Format")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("P2WPKH")]),e._v(" "),t("td",[e._v("xpub1")])]),e._v(" "),t("tr",[t("td",[e._v("P2SH-P2WPKH")]),e._v(" "),t("td",[e._v("xpub1-[p2sh]")])]),e._v(" "),t("tr",[t("td",[e._v("P2PKH")]),e._v(" "),t("td",[e._v("xpub-[legacy]")])]),e._v(" "),t("tr",[t("td",[e._v("Multi-sig P2WSH")]),e._v(" "),t("td",[e._v("2-of-xpub1-xpub2")])]),e._v(" "),t("tr",[t("td",[e._v("Multi-sig P2SH-P2WSH")]),e._v(" "),t("td",[e._v("2-of-xpub1-xpub2-[p2sh]")])]),e._v(" "),t("tr",[t("td",[e._v("Multi-sig P2SH")]),e._v(" "),t("td",[e._v("2-of-xpub1-xpub2-[legacy]")])]),e._v(" "),t("tr",[t("td",[e._v("P2TR")]),e._v(" "),t("td",[e._v("xpub1-[taproot]")])])])]),e._v(" "),t("p",[e._v("For multisig, the public keys are ordered before generating the address by default for privacy reason, use "),t("code",[e._v("-[keeporder]")]),e._v(" to disable it.")]),e._v(" "),t("p",[e._v("You can use more than one options at same time, example: "),t("code",[e._v("2-of-xpub1-xpub2-[legacy]-[keeporder]")])]),e._v(" "),t("p",[e._v("Most of routes asks for a "),t("code",[e._v("cryptoCode")]),e._v(". This identify the crypto currency to request data from. (eg. "),t("code",[e._v("BTC")]),e._v(", "),t("code",[e._v("LTC")]),e._v("...)")]),e._v(" "),t("p",[e._v("Note: Taproot is incompatible with all other options.")]),e._v(" "),t("p",[e._v("A derivation scheme tracked source's format is "),t("code",[e._v("DERIVATIONSCHEME:derivationScheme")]),e._v(" (eg. "),t("code",[e._v("DERIVATIONSCHEME:xpub1")]),e._v(").")]),e._v(" "),t("p",[e._v("You can create one by calling "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/Track",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tracking derivation scheme"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"groups"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#groups"}},[e._v("#")]),e._v(" "),t("a",{attrs:{name:"groups"}}),e._v("Groups")]),e._v(" "),t("p",[e._v("A group is a tracked source which serves as a logical method for grouping several tracked sources into a single entity. You can add or remove tracked sources to and from a group.")]),e._v(" "),t("p",[e._v("Additionally, specific addresses can be tracked through the group.")]),e._v(" "),t("p",[e._v("Every address attached by a child tracked source will be added to the group, including all related UTXOs and transactions.")]),e._v(" "),t("p",[e._v("A group can have any number of children, and a group can also be a child of another group.\nPlease note that all the children are returned by "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Groups/operation/Get",target:"_blank",rel:"noopener noreferrer"}},[e._v("Get a group"),t("OutboundLink")],1),e._v(". As such, it is advised not to add too many children to avoid slowing down this call.")]),e._v(" "),t("p",[e._v("A group tracked source's format is "),t("code",[e._v("GROUP:groupid")]),e._v(".")]),e._v(" "),t("p",[e._v("You can create a new group by calling "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Groups/operation/Create",target:"_blank",rel:"noopener noreferrer"}},[e._v("Create a group"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"addresses"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#addresses"}},[e._v("#")]),e._v(" "),t("a",{attrs:{name:"addresses"}}),e._v("Addresses")]),e._v(" "),t("p",[e._v("This refers to a tracked source that monitors a single address. It functions similarly to a group, but with only one specific address to it.")]),e._v(" "),t("p",[e._v("The address tracked source's format is "),t("code",[e._v("ADDRESS:bc1...")]),e._v(".")]),e._v(" "),t("p",[e._v("You can create one by calling "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Legacy/operation/TrackSingleAddress",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tracking an address"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"authentication"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[e._v("#")]),e._v(" Authentication")]),e._v(" "),t("p",[e._v("By default a cookie file is generated when NBXplorer is starting, for windows in:")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("C:\\Users\\\\AppData\\Roaming\\NBXplorer\\\\.cookie\n")])])]),t("p",[e._v("On linux or mac:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("~/.nbxplorer/"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("network"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("/.cookie\n")])])]),t("p",[e._v("The content of this cookie must be used is used as HTTP BASIC authentication to use the API.")]),e._v(" "),t("p",[e._v("This can be disabled with "),t("code",[e._v("--noauth")]),e._v(" or "),t("code",[e._v("NBXPLORER_NOAUTH=1")]),e._v(".")]),e._v(" "),t("p",[e._v("Also, NBXPlorer listen by default on "),t("code",[e._v("127.0.0.1")]),e._v(", if you want to access it from another machine, run "),t("code",[e._v('--bind "0.0.0.0"')]),e._v(".")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/152.a29cef95.js b/assets/js/152.e0b71af1.js similarity index 98% rename from assets/js/152.a29cef95.js rename to assets/js/152.e0b71af1.js index 202d047b31..010c090c46 100644 --- a/assets/js/152.a29cef95.js +++ b/assets/js/152.e0b71af1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[152],{861:function(e,t,r){"use strict";r.r(t);var a=r(17),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"migration-from-dbtrie-backend-to-postgres-backend"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#migration-from-dbtrie-backend-to-postgres-backend"}},[e._v("#")]),e._v(" Migration from DBTrie backend to Postgres backend")]),e._v(" "),t("blockquote",[t("p",[e._v("[!WARNING]"),t("br"),e._v("\nThe last version to support the migration is "),t("code",[e._v("2.5.2")]),e._v(". If you are running a version newer than this and need to migrate, please upgrade to "),t("code",[e._v("2.5.2")]),e._v(" first.")])]),e._v(" "),t("p",[e._v("For an extended period, NBXplorer depended on an embedded database dubbed DBTrie. This internal database imposed limitations for various reasons, prompting us to upgrade NBXplorer to employ a Postgres backend rather than DBTrie.")]),e._v(" "),t("p",[e._v("Although we continue to support DBTrie, it is now deemed obsolete. We offer a migration pathway for existing deployments.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Command line argument")]),e._v(" "),t("th",[e._v("Environment variable")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("--deleteaftermigration")]),e._v(" "),t("td",[e._v("NBXPLORER_DELETEAFTERMIGRATION=1")]),e._v(" "),t("td",[e._v("Once migration succeed, delete the original DBTrie database (default: false)")])]),e._v(" "),t("tr",[t("td",[e._v("--postgres")]),e._v(" "),t("td",[e._v('NBXPLORER_POSTGRES="..."')]),e._v(" "),t("td",[e._v("The connection string to postgres")])]),e._v(" "),t("tr",[t("td",[e._v("--automigrate")]),e._v(" "),t("td",[e._v("NBXPLORER_AUTOMIGRATE=1")]),e._v(" "),t("td",[e._v("If DBTrie database exists, migrate it (default: false)")])]),e._v(" "),t("tr",[t("td",[e._v("--nomigrateevts")]),e._v(" "),t("td",[e._v("NBXPLORER_NOMIGRATEEVTS=1")]),e._v(" "),t("td",[e._v("Do not migrate the events table (default: false)")])]),e._v(" "),t("tr",[t("td",[e._v("--nomigraterawtxs")]),e._v(" "),t("td",[e._v("NBXPLORER_NOMIGRATERAWTXS=1")]),e._v(" "),t("td",[e._v("Do not migrate the raw bytes of transactions (default: false)")])])])]),e._v(" "),t("p",[t("code",[e._v("automigrate")]),e._v(": will seamlessly determine if a DBTrie database necessitates migration, disregarding the flag if migration is unnecessary or already executed.")]),e._v(" "),t("p",[t("code",[e._v("nomigrateevts")]),e._v(": may be employed for services reliant on NBXplorer that do not query past events, thereby hastening the migration process. (BTCPay Server, for example, does not utilize past events)")]),e._v(" "),t("p",[t("code",[e._v("nomigraterawtxs")]),e._v(": may be utilized if preserving raw transaction bytes is nonessential, consequently expediting migration. Raw transactions are typically crucial for signing with a non-segwit wallet.")]),e._v(" "),t("p",[e._v("The majority of instances will complete migration in under five minutes.")]),e._v(" "),t("p",[e._v("For larger instances, our BTCPay Server's mainnet demo server with 800,000 addresses and 44,000 transactions and the DBTrie database approximating 5GB took roughly 40 minutes.")]),e._v(" "),t("p",[e._v("If you use BTCPay Server, ensure that its environment variable "),t("code",[e._v("BTCPAY_EXPLORERPOSTGRES")]),e._v(" is assigned the same connection string as NBXplorer.")]),e._v(" "),t("p",[e._v("You can find more information in this "),t("a",{attrs:{href:"https://blog.btcpayserver.org/nbxplorer-postgres/",target:"_blank",rel:"noopener noreferrer"}},[e._v("blog post"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[152],{860:function(e,t,r){"use strict";r.r(t);var a=r(17),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"migration-from-dbtrie-backend-to-postgres-backend"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#migration-from-dbtrie-backend-to-postgres-backend"}},[e._v("#")]),e._v(" Migration from DBTrie backend to Postgres backend")]),e._v(" "),t("blockquote",[t("p",[e._v("[!WARNING]"),t("br"),e._v("\nThe last version to support the migration is "),t("code",[e._v("2.5.2")]),e._v(". If you are running a version newer than this and need to migrate, please upgrade to "),t("code",[e._v("2.5.2")]),e._v(" first.")])]),e._v(" "),t("p",[e._v("For an extended period, NBXplorer depended on an embedded database dubbed DBTrie. This internal database imposed limitations for various reasons, prompting us to upgrade NBXplorer to employ a Postgres backend rather than DBTrie.")]),e._v(" "),t("p",[e._v("Although we continue to support DBTrie, it is now deemed obsolete. We offer a migration pathway for existing deployments.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Command line argument")]),e._v(" "),t("th",[e._v("Environment variable")]),e._v(" "),t("th",[e._v("Description")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("--deleteaftermigration")]),e._v(" "),t("td",[e._v("NBXPLORER_DELETEAFTERMIGRATION=1")]),e._v(" "),t("td",[e._v("Once migration succeed, delete the original DBTrie database (default: false)")])]),e._v(" "),t("tr",[t("td",[e._v("--postgres")]),e._v(" "),t("td",[e._v('NBXPLORER_POSTGRES="..."')]),e._v(" "),t("td",[e._v("The connection string to postgres")])]),e._v(" "),t("tr",[t("td",[e._v("--automigrate")]),e._v(" "),t("td",[e._v("NBXPLORER_AUTOMIGRATE=1")]),e._v(" "),t("td",[e._v("If DBTrie database exists, migrate it (default: false)")])]),e._v(" "),t("tr",[t("td",[e._v("--nomigrateevts")]),e._v(" "),t("td",[e._v("NBXPLORER_NOMIGRATEEVTS=1")]),e._v(" "),t("td",[e._v("Do not migrate the events table (default: false)")])]),e._v(" "),t("tr",[t("td",[e._v("--nomigraterawtxs")]),e._v(" "),t("td",[e._v("NBXPLORER_NOMIGRATERAWTXS=1")]),e._v(" "),t("td",[e._v("Do not migrate the raw bytes of transactions (default: false)")])])])]),e._v(" "),t("p",[t("code",[e._v("automigrate")]),e._v(": will seamlessly determine if a DBTrie database necessitates migration, disregarding the flag if migration is unnecessary or already executed.")]),e._v(" "),t("p",[t("code",[e._v("nomigrateevts")]),e._v(": may be employed for services reliant on NBXplorer that do not query past events, thereby hastening the migration process. (BTCPay Server, for example, does not utilize past events)")]),e._v(" "),t("p",[t("code",[e._v("nomigraterawtxs")]),e._v(": may be utilized if preserving raw transaction bytes is nonessential, consequently expediting migration. Raw transactions are typically crucial for signing with a non-segwit wallet.")]),e._v(" "),t("p",[e._v("The majority of instances will complete migration in under five minutes.")]),e._v(" "),t("p",[e._v("For larger instances, our BTCPay Server's mainnet demo server with 800,000 addresses and 44,000 transactions and the DBTrie database approximating 5GB took roughly 40 minutes.")]),e._v(" "),t("p",[e._v("If you use BTCPay Server, ensure that its environment variable "),t("code",[e._v("BTCPAY_EXPLORERPOSTGRES")]),e._v(" is assigned the same connection string as NBXplorer.")]),e._v(" "),t("p",[e._v("You can find more information in this "),t("a",{attrs:{href:"https://blog.btcpayserver.org/nbxplorer-postgres/",target:"_blank",rel:"noopener noreferrer"}},[e._v("blog post"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/153.067e2612.js b/assets/js/153.067e2612.js new file mode 100644 index 0000000000..5b541a6bdc --- /dev/null +++ b/assets/js/153.067e2612.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[153],{862:function(e,t,r){"use strict";r.r(t);var a=r(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"nbxplorer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#nbxplorer"}},[e._v("#")]),e._v(" NBXplorer")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.nuget.org/packages/NBxplorer.Client",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/nuget/v/NBxplorer.Client.svg",alt:"NuGet",title:"NuGet"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/nbxplorer/",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/docker/automated/jrottenberg/ffmpeg.svg",alt:"Docker Automated buil",title:"Docker Automated buil"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://circleci.com/gh/dgarage/NBXplorer",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://circleci.com/gh/dgarage/NBXplorer.svg?style=svg",alt:"CircleCI",title:"CircleCI"}}),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("A minimalist UTXO tracker for HD wallets.\nThe goal is to provide a flexible, .NET-based UTXO tracker for HD wallets.\nThe explorer supports P2SH, P2PKH, P2WPKH, P2WSH, Taproot and multi-signature derivations.")]),e._v(" "),t("p",[e._v("It works on a pruned node and indexes only what you track.")]),e._v(" "),t("p",[e._v("This explorer is not intended to be exposed to the internet; it should be used as an infrastructure tool for tracking the UTXOs of your own service.")]),e._v(" "),t("h2",{attrs:{id:"what-about-alternatives-to-nbxplorer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-about-alternatives-to-nbxplorer"}},[e._v("#")]),e._v(" What about alternatives to NBXplorer?")]),e._v(" "),t("ol",[t("li",[t("code",[e._v("Electrum wallet")]),e._v(" requires an unpruned node with indexing, which is space-intensive and may be difficult to sync.")]),e._v(" "),t("li",[t("code",[e._v("Electrum wallet")]),e._v(" only supports a single cryptocurrency on a single server. If you are an exchange, you would end up running multiple versions of barely maintained Electrum instances.")]),e._v(" "),t("li",[t("code",[e._v("Personal Electrum Server")]),e._v(" supports only a single wallet.")]),e._v(" "),t("li",[t("code",[e._v("Electrum protocol")]),e._v(" is cumbersome for HD wallets.")]),e._v(" "),t("li",[t("code",[e._v("Bitcoin Core RPC")]),e._v(" is inflexible and difficult to use. It also scales poorly when a wallet has too many addresses or UTXOs.")]),e._v(" "),t("li",[t("code",[e._v("Bitcoin Core RPC")]),e._v(" supports multiple wallets but isn't designed to handle thousands of them. Having too many wallets will not scale.")]),e._v(" "),t("li",[e._v("While NBXplorer exposes an "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API"),t("OutboundLink")],1),e._v(", it also allows you to query the data using the most expressive and flexible language designed for this purpose: "),t("RouterLink",{attrs:{to:"/NBXplorer/docs/Postgres-Schema/"}},[e._v("SQL")]),e._v(".")],1),e._v(" "),t("li",[e._v("Alternative SaaS infrastructure providers depend on third parties, forcing you to compromise your privacy by sharing financial information while relinquishing control over API changes and service level agreements (SLAs).")])]),e._v(" "),t("h2",{attrs:{id:"typical-usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#typical-usage"}},[e._v("#")]),e._v(" Typical usage")]),e._v(" "),t("p",[e._v("You start by "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/GenerateWallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Creating a wallet (hot wallet)"),t("OutboundLink")],1),e._v(", or "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/Track",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tracking a derivation scheme (cold wallet)"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Second, "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/GetUnused",target:"_blank",rel:"noopener noreferrer"}},[e._v("Get the next unused address"),t("OutboundLink")],1),e._v(" to get paid.")]),e._v(" "),t("p",[e._v("Listen to events through "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Events/operation/GetLatest",target:"_blank",rel:"noopener noreferrer"}},[e._v("Polling"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Events/operation/EventStream",target:"_blank",rel:"noopener noreferrer"}},[e._v("Long Polling"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Events/operation/WebSocket",target:"_blank",rel:"noopener noreferrer"}},[e._v("Web Sockets"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("You can then "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/ListTransactionDerivationScheme",target:"_blank",rel:"noopener noreferrer"}},[e._v("List transactions"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/ListUTXOsDerivationScheme",target:"_blank",rel:"noopener noreferrer"}},[e._v("List UTXOs"),t("OutboundLink")],1),e._v(", or "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/CreatePSBT",target:"_blank",rel:"noopener noreferrer"}},[e._v("Create a PSBT"),t("OutboundLink")],1),e._v(" for your app to sign.")]),e._v(" "),t("p",[e._v("When the transaction is signed, "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Transactions/operation/Broadcast",target:"_blank",rel:"noopener noreferrer"}},[e._v("Broadcast it"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("You can also track multiple derivation schemes or individual addresses by "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Groups/operation/Create",target:"_blank",rel:"noopener noreferrer"}},[e._v("Creating a group"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"general-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general-features"}},[e._v("#")]),e._v(" General features")]),e._v(" "),t("ul",[t("li",[e._v("Can pass arguments via environment variable, command line or configuration file")]),e._v(" "),t("li",[e._v("Automatically reconnect to your node if the connection goes temporarily down")]),e._v(" "),t("li",[e._v("An easy to use "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("REST API"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Persistence via "),t("RouterLink",{attrs:{to:"/NBXplorer/docs/Postgres-Schema/"}},[e._v("Postgres")])],1),e._v(" "),t("li",[e._v("Connect via RPC to broadcast transaction instead of using the P2P protocol like this example")]),e._v(" "),t("li",[e._v("Connect via RPC to your trusted node to get the proper fee rate.")]),e._v(" "),t("li",[e._v("Altcoin support")]),e._v(" "),t("li",[e._v("Huge test suite")]),e._v(" "),t("li",[e._v("Pruning of transaction data (in practice, we don't need to save the whole transaction, only the spent outpoint and received coin for the wallet)")]),e._v(" "),t("li",[e._v("Multi-wallet")]),e._v(" "),t("li",[e._v("Flexible address generation schemes (multisig, segwit, legacy etc...)")]),e._v(" "),t("li",[e._v("Pruning for big wallets (Removal of tracked transaction which do not impact the resulting UTXO set)")])]),e._v(" "),t("p",[e._v("It currently supports the following altcoins:")]),e._v(" "),t("ul",[t("li",[e._v("Althash")]),e._v(" "),t("li",[e._v("Argoneum")]),e._v(" "),t("li",[e._v("BCash (also known as Bitcoin Cash)")]),e._v(" "),t("li",[e._v("BGold (also known as Bitcoin Gold)")]),e._v(" "),t("li",[e._v("BitCore")]),e._v(" "),t("li",[e._v("Chaincoin")]),e._v(" "),t("li",[e._v("ColossusXT")]),e._v(" "),t("li",[e._v("Dash")]),e._v(" "),t("li",[e._v("Dogecoin")]),e._v(" "),t("li",[e._v("Feathercoin")]),e._v(" "),t("li",[e._v("Gobyte")]),e._v(" "),t("li",[e._v("Groestlcoin")]),e._v(" "),t("li",[e._v("Litecoin")]),e._v(" "),t("li",[e._v("Monacoin")]),e._v(" "),t("li",[e._v("MonetaryUnit")]),e._v(" "),t("li",[e._v("Monoeci")]),e._v(" "),t("li",[e._v("Polis")]),e._v(" "),t("li",[e._v("Qtum")]),e._v(" "),t("li",[e._v("Terracoin")]),e._v(" "),t("li",[e._v("Ufo")]),e._v(" "),t("li",[e._v("Viacoin")])]),e._v(" "),t("p",[e._v("Read our "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API Specification"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"prerequisite"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisite"}},[e._v("#")]),e._v(" Prerequisite")]),e._v(" "),t("ul",[t("li",[e._v("Install "),t("a",{attrs:{href:"https://www.microsoft.com/net/download",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET Core SDK v8.0 or above"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Bitcoin Core instance synched and running (at least 24.0).")]),e._v(" "),t("li",[e._v("PostgresSQL v13+")])]),e._v(" "),t("p",[e._v("Use "),t("code",[e._v("--postgres")]),e._v(" flag to setup the connection string. See "),t("RouterLink",{attrs:{to:"/NBXplorer/Postgres-Schema/"}},[e._v("schema documentation")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"api-specification"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-specification"}},[e._v("#")]),e._v(" API Specification")]),e._v(" "),t("p",[e._v("Read our "),t("RouterLink",{attrs:{to:"/NBXplorer/API/"}},[e._v("API Specification")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"how-to-build-and-run"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-build-and-run"}},[e._v("#")]),e._v(" How to build and run?")]),e._v(" "),t("p",[e._v("If you are using Bitcoin core default settings:")]),e._v(" "),t("p",[e._v("On Powershell:")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".\\build.ps1\n")])])]),t("p",[e._v("On Linux:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("./build.sh\n")])])]),t("p",[e._v("Then to run:")]),e._v(" "),t("p",[e._v("On Powershell:")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".\\run.ps1 --help\n")])])]),t("p",[e._v("On Linux:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("./run.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--help")]),e._v("\n")])])]),t("p",[e._v("Example, if you have ltc node and btc node on regtest (default configuration), and want to connect to them: (see documentation for other options in the "),t("a",{attrs:{href:"https://www.npgsql.org/doc/connection-string-parameters.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("postgres connection string"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("./run.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--chains")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("btc,ltc "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--network")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("regtest "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--postgres")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"User ID=postgres;Host=127.0.0.1;Port=5432;Database=nbxplorer"')]),e._v("\n")])])]),t("h2",{attrs:{id:"how-to-use-the-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use-the-api"}},[e._v("#")]),e._v(" How to use the API?")]),e._v(" "),t("p",[e._v("Check "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("the API documentation"),t("OutboundLink")],1),e._v(", you can then use any client library:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/junderw/NBXplorer.NodeJS",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBXplorer.NodeJS"),t("OutboundLink")],1),e._v(" for NodeJS clients.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.nuget.org/packages/NBxplorer.Client",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBXplorer.Client"),t("OutboundLink")],1),e._v(" for .NET clients.")])]),e._v(" "),t("p",[e._v("Here is "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/Examples/MultiSig/Program.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("a small C# example"),t("OutboundLink")],1),e._v(" showing a 2-2 multisig with Alice and Bob that you can run on regtest.")]),e._v(" "),t("h2",{attrs:{id:"with-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#with-docker"}},[e._v("#")]),e._v(" With Docker")]),e._v(" "),t("p",[e._v("Use "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/nbxplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("our image"),t("OutboundLink")],1),e._v(".\nYou can check "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/docker-compose.regtest.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("the sample"),t("OutboundLink")],1),e._v(" for configuring and composing it bitcoin core.")]),e._v(" "),t("h2",{attrs:{id:"how-to-develop-on-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-develop-on-it"}},[e._v("#")]),e._v(" How to develop on it?")]),e._v(" "),t("p",[e._v("If you are on Windows, I recommend Visual Studio 2022 (17.8.0).\nIf you are on other platform and want lightweight environment, use "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Visual Studio Code"),t("OutboundLink")],1),e._v(".\nIf you are hardcore, you can code on vim.")]),e._v(" "),t("p",[e._v("I like Visual Studio Code and Visual Studio 2022 as it allows me to debug in step by step.")]),e._v(" "),t("h2",{attrs:{id:"how-to-configure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-configure"}},[e._v("#")]),e._v(" How to configure?")]),e._v(" "),t("p",[e._v("NBXplorer supports configuration through command line arguments, configuration file, or environment variables.")]),e._v(" "),t("h3",{attrs:{id:"configuration-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration-file"}},[e._v("#")]),e._v(" Configuration file")]),e._v(" "),t("p",[e._v("If you are not using standard install for bitcoind, you will have to change the configuration file:\nIn Windows it is located in")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("C:\\Users\\\\AppData\\Roaming\\NBXplorer\\\\settings.config\n")])])]),t("p",[e._v("On linux or mac:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("~/.nbxplorer/"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("network"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("/settings.config\n")])])]),t("p",[e._v("The default configuration assumes "),t("code",[e._v("mainnet")]),e._v(" with only "),t("code",[e._v("btc")]),e._v(" chain supported, and uses the default settings of bitcoind.")]),e._v(" "),t("p",[e._v("You can change the location of the configuration file with the "),t("code",[e._v("--conf=pathToConf")]),e._v(" command line argument.")]),e._v(" "),t("h3",{attrs:{id:"command-line-parameters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#command-line-parameters"}},[e._v("#")]),e._v(" Command line parameters")]),e._v(" "),t("p",[e._v("Please note that NBXplorer uses cookie authentication by default. If you run your Bitcoin/Litecoin/Dash nodes using their daemon (like "),t("code",[e._v("bitcoind")]),e._v(", "),t("code",[e._v("litecoind")]),e._v(" or "),t("code",[e._v("dashd")]),e._v("), they generate a new cookie every time you start them, and that should work without any extra configuration.\nIf you run the node(s) using the GUI versions, like Bitcoin\\Litecoin\\Dash Core Qt with the "),t("code",[e._v("-server")]),e._v(" parameter while you set the rpcusername and rpcpassword in their "),t("code",[e._v(".conf")]),e._v(" files, you must set those values for every crypto you are planning to support.\nSee samples below.")]),e._v(" "),t("h4",{attrs:{id:"run-from-source-requires-net-core-sdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-from-source-requires-net-core-sdk"}},[e._v("#")]),e._v(" Run from source (requires .NET Core SDK)")]),e._v(" "),t("p",[e._v("You should use "),t("code",[e._v("run.ps1")]),e._v(" (Windows) or "),t("code",[e._v("run.sh")]),e._v(" (Linux) to execute NBXplorer, but you can also execute it manually with the following command:\n"),t("code",[e._v("dotnet run --no-launch-profile -p .\\NBXplorer\\NBXplorer.csproj -- ")])]),e._v(" "),t("h4",{attrs:{id:"run-using-built-dll-requires-net-core-runtime-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-using-built-dll-requires-net-core-runtime-only"}},[e._v("#")]),e._v(" Run using built DLL (requires .NET Core Runtime only)")]),e._v(" "),t("p",[e._v("If you already have a compiled DLL, you can run the executable with the following command:\n"),t("code",[e._v("dotnet NBXplorer.dll ")])]),e._v(" "),t("h4",{attrs:{id:"sample-parameters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sample-parameters"}},[e._v("#")]),e._v(" Sample parameters")]),e._v(" "),t("p",[e._v("Running NBXplorer HTTP server on port 20300, connecting to the BTC mainnet node locally.\n"),t("code",[e._v("--port=20300 --network=mainnet --btcnodeendpoint=127.0.0.1:32939")])]),e._v(" "),t("p",[e._v("Running NBXplorer on testnet, supporting Bitcoin, Litecoin and Dash, using cookie authentication for BTC and LTC, and RPC username and password for Dash, connecting to all of them locally.\n"),t("code",[e._v("--chains=btc,ltc,dash --network=testnet --dashrpcuser=myuser --dashrpcpassword=mypassword")])]),e._v(" "),t("h3",{attrs:{id:"environment-variables"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environment-variables"}},[e._v("#")]),e._v(" Environment variables")]),e._v(" "),t("p",[e._v("The same settings as above, for example "),t("code",[e._v("export NBXPLORER_PORT=20300")]),e._v(". This is usefull for configuring docker.")]),e._v(" "),t("h2",{attrs:{id:"how-to-run"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run"}},[e._v("#")]),e._v(" How to Run")]),e._v(" "),t("h3",{attrs:{id:"command-line"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#command-line"}},[e._v("#")]),e._v(" Command Line")]),e._v(" "),t("p",[e._v("You can use the "),t("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet",target:"_blank",rel:"noopener noreferrer"}},[e._v("dotnet"),t("OutboundLink")],1),e._v(" command which is part of .NET Core to run NBXplorer. To run from source you must have the .NET Core SDK installed e.g.\n"),t("code",[e._v("dotnet run NBXplorer.dll")]),e._v("\nAs described above you may add configuration parameters if desired.")]),e._v(" "),t("p",[e._v("If you have a compiled version of NBXplorer you should have a file in your build folder named NBXplorer.dll. This cannot itself be directly executed on the command line as it is not an executable file. Instead we can use the "),t("code",[e._v("dotnet")]),e._v(" runtime to execute the dll file.")]),e._v(" "),t("p",[e._v("e.g. "),t("code",[e._v("dotnet NBXplorer.dll")])]),e._v(" "),t("h2",{attrs:{id:"important-note"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#important-note"}},[e._v("#")]),e._v(" Important Note")]),e._v(" "),t("p",[e._v("This tool will only start scanning from the configured "),t("code",[e._v("startheight")]),e._v(". (By default, the height of the blockchain during your first run)\nThis means that you might not see old payments from your HD key.")]),e._v(" "),t("p",[e._v("If you need to see old payments, you need to configure "),t("code",[e._v("--[crypto]startheight")]),e._v(" to a specific height of your choice, then run it again with "),t("code",[e._v("--[crypto]rescan")]),e._v(", e.g.\n"),t("code",[e._v("./run.sh --chains=ltc --ltcrescan --ltcstartheight=101")])]),e._v(" "),t("h2",{attrs:{id:"how-to-query"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-query"}},[e._v("#")]),e._v(" How to query?")]),e._v(" "),t("h3",{attrs:{id:"using-postman"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-postman"}},[e._v("#")]),e._v(" Using Postman")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.getpostman.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Postman"),t("OutboundLink")],1),e._v(" is a useful tool for testing and experimenting with REST API's.")]),e._v(" "),t("p",[e._v("You can test the "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBXplorer API"),t("OutboundLink")],1),e._v(" quickly and easily using Postman.")]),e._v(" "),t("p",[e._v("If you use cookie authentication (enabled by default) in your locally run NBXplorer, you need to set that up in Postman:")]),e._v(" "),t("ul",[t("li",[e._v("Run NBXplorer and locate you cookie file (NBXplorer will generate a new Cookie file each time it runs in "),t("RouterLink",{attrs:{to:"/NBXplorer/API/#authentication"}},[e._v("its default data folder")]),e._v(")")],1),e._v(" "),t("li",[e._v("In Postman create a new GET API test")]),e._v(" "),t("li",[e._v("In Authorization select "),t("em",[e._v("Basic Auth")]),e._v(", you should see 2 input boxes for username and password")]),e._v(" "),t("li",[e._v("Open your cookie file with a text editor e.g. Notepad on windows . You should see a cookie string e.g. "),t("code",[e._v("__cookie__:0ff9cd83a5ac7c19a6b56a3d1e7a5c96e113d42dba7720a1f72a3a5e8c4b6c66")])]),e._v(" "),t("li",[e._v("Back in Postman paste the "),t("code",[e._v("__cookie__")]),e._v(" part of your cookie file into username (whatever comes before the 😃")]),e._v(" "),t("li",[e._v("Paste the Hex string (after the : ) into the password box")]),e._v(" "),t("li",[e._v("Click the Update Request button in Postman - this will force Postman to generate the correct HTTP headers based on your cookie details")]),e._v(" "),t("li",[e._v("You should now see a new entry in the Headers section with a Key of "),t("em",[e._v("Authorization")]),e._v(" and Value of "),t("em",[e._v("Basic xxxxxxxxx")]),e._v(" where the string after "),t("code",[e._v("Basic")]),e._v(" will be your Base64 encoded username and password.")]),e._v(" "),t("li",[e._v("Enter the API URL you are going to test")])]),e._v(" "),t("p",[e._v("You can also disable authentication in NBXplorer for testing with the "),t("code",[e._v("--noauth")]),e._v(" parameter. This makes testing quicker:")]),e._v(" "),t("ul",[t("li",[e._v("Run NBXplorer with the "),t("code",[e._v("--noauth")]),e._v(" command line argument or the environment variable "),t("code",[e._v("NBXPLORER_NOAUTH=1")])]),e._v(" "),t("li",[e._v("In Postman create a new GET API test")]),e._v(" "),t("li",[e._v("In Authorization select "),t("em",[e._v("No Auth")])]),e._v(" "),t("li",[e._v("Enter the API URL you are going to test")])]),e._v(" "),t("p",[e._v("You are now ready to test the API - it is easiest to start with something simple such as the fees endpoint e.g.")]),e._v(" "),t("p",[t("code",[e._v("http://localhost:24444/v1/cryptos/btc/fees/3")])]),e._v(" "),t("p",[e._v("this should return a JSON payload e.g.")]),e._v(" "),t("p",[e._v('{\n"feeRate": 9,\n"blockCount": 3\n}')]),e._v(" "),t("h2",{attrs:{id:"message-brokers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#message-brokers"}},[e._v("#")]),e._v(" Message Brokers")]),e._v(" "),t("h3",{attrs:{id:"azure-service-bus"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#azure-service-bus"}},[e._v("#")]),e._v(" Azure Service Bus")]),e._v(" "),t("p",[e._v("Support has been added for Azure Service Bus as a message broker. Currently 2 Queues and 2 Topics are supported")]),e._v(" "),t("h3",{attrs:{id:"queues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#queues"}},[e._v("#")]),e._v(" Queues")]),e._v(" "),t("ul",[t("li",[e._v("New Block")]),e._v(" "),t("li",[e._v("New Transaction")])]),e._v(" "),t("h3",{attrs:{id:"topics"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#topics"}},[e._v("#")]),e._v(" Topics")]),e._v(" "),t("ul",[t("li",[e._v("New Block")]),e._v(" "),t("li",[e._v("New Transaction")])]),e._v(" "),t("p",[e._v("Filters should be applied on the client, if required.")]),e._v(" "),t("p",[e._v("To activate Azure Service Bus Mesages you should add an Azure Service Bus Connection string to your config file or on the command line.")]),e._v(" "),t("ul",[t("li",[e._v("To use queues you should specify the queue names you wish to use")]),e._v(" "),t("li",[e._v("To use topics you should specify the topic names you wish to use")])]),e._v(" "),t("p",[e._v("You can use both queues and topics at the same time.")]),e._v(" "),t("h4",{attrs:{id:"config-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#config-settings"}},[e._v("#")]),e._v(" Config Settings")]),e._v(" "),t("p",[e._v("If you use the Configuration file to setup your NBXplorer options:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbcnstr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Your Azure Service Bus Connection string")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbblockq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of queue to send New Block message to")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbtranq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of queue to send New Transaction message to")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbblockt")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of topic to send New Block message to")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbtrant")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of queue to send New Transaction message to")]),e._v("\n")])])]),t("h3",{attrs:{id:"rabbitmq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rabbitmq"}},[e._v("#")]),e._v(" RabbitMq")]),e._v(" "),t("p",[e._v("Support has been added for RabbitMq as a message broker. Currently 2 exchanges supported;")]),e._v(" "),t("ul",[t("li",[e._v("New Block")]),e._v(" "),t("li",[e._v("New Transaction")])]),e._v(" "),t("p",[e._v("Filters can be applied on the client by defining routing keys;")]),e._v(" "),t("p",[e._v("For transactions;")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("transactions.#")]),e._v(" to get all transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.[BTC].#")]),e._v(" to get all [Bitcoin] transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.[BTC].confirmed")]),e._v(" to get only confirmed [Bitcoin] transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.[BTC].unconfirmed")]),e._v(" to get only unconfirmed [Bitcoin] transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.*.confirmed")]),e._v(" to get all confirmed transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.*.unconfirmed")]),e._v(" to get all unconfirmed transactions.")])]),e._v(" "),t("p",[e._v("For blocks;")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("blocks.#")]),e._v(" to get all blocks.")]),e._v(" "),t("li",[t("code",[e._v("blocks.[BTC]")]),e._v(" to get all [Bitcoin] blocks.")])]),e._v(" "),t("p",[e._v("To activate RabbitMq mesages you should add following settings to your config file or on the command line.")]),e._v(" "),t("ul",[t("li",[e._v("rmqhost, rmquser, rmqpass")])]),e._v(" "),t("h4",{attrs:{id:"config-settings-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#config-settings-2"}},[e._v("#")]),e._v(" Config Settings")]),e._v(" "),t("p",[e._v("If you use the Configuration file to setup your NBXplorer options:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqhost")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq host name")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqvirtual")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq virtual host")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmquser")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq username")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqpass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq password")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqtranex")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of exchange to send transaction messages")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqblockex")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of exchange to send block messages")]),e._v("\n")])])]),t("p",[e._v("Payloads are JSON and map to "),t("code",[e._v("NewBlockEvent")]),e._v(", "),t("code",[e._v("NewTransactionEvent")]),e._v(" in the "),t("code",[e._v("NBXplorer.Models")]),e._v(" namespace. There is no support in NBXplorer client for message borkers at the current time. You will need to use the "),t("code",[e._v("Serializer")]),e._v(" in "),t("code",[e._v("NBXplorer.Client")]),e._v(" to de-serialize the objects or then implement your own JSON de-serializers for the custom types used in the payload.")]),e._v(" "),t("p",[e._v("For configuring serializers you can get crypto code info from "),t("code",[e._v("BasicProperties.Headers[CryptoCode]")]),e._v(" of RabbitMq messages or "),t("code",[e._v("UserProperties[CryptoCode]")]),e._v(" of Azure Service Bus messages.\nExamples can be found in unit tests.")]),e._v(" "),t("h4",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("p",[e._v("If you receive a 401 Unauthorized then your cookie data is not working. Check you are using the current cookie by opening the cookie file again - also check the date/time of the cookie file to ensure it is the latest cookie (generated when you launched NBXplorer).")]),e._v(" "),t("p",[e._v("If you receive a 404 or timeout then Postman cannot see the endpoint")]),e._v(" "),t("ul",[t("li",[e._v("are you using the correct Port ?")]),e._v(" "),t("li",[e._v("are you running postman on localhost ?")])]),e._v(" "),t("h2",{attrs:{id:"client-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#client-api"}},[e._v("#")]),e._v(" Client API")]),e._v(" "),t("p",[e._v("A better documentation is on the way, for now the only documentation is the client API in C# on "),t("a",{attrs:{href:"https://www.nuget.org/packages/NBxplorer.Client",target:"_blank",rel:"noopener noreferrer"}},[e._v("nuget"),t("OutboundLink")],1),e._v(".\nThe "),t("code",[e._v("ExplorerClient")]),e._v(" classes allows you to query unused addresses, and the UTXO of an HD PubKey.\nYou can take a look at "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer.Tests/UnitTest1.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("the tests"),t("OutboundLink")],1),e._v(" to see how it works.")]),e._v(" "),t("p",[e._v("There is a simple use case documented on "),t("a",{attrs:{href:"https://programmingblockchain.gitbooks.io/programmingblockchain/content/wallet/web-api.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Blockchain Programming in C#"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-run-the-tests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-tests"}},[e._v("#")]),e._v(" How to run the tests?")]),e._v(" "),t("p",[e._v("This is easy, from repo directory:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" NBXplorer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[e._v("The tests can take long the first time, as it download Bitcoin Core binaries. (Between 5 and 10 minutes)")]),e._v(" "),t("h2",{attrs:{id:"how-to-add-support-to-my-altcoin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-support-to-my-altcoin"}},[e._v("#")]),e._v(" How to add support to my altcoin")]),e._v(" "),t("p",[e._v("First you need to add support for your altcoin to "),t("code",[e._v("NBitcoin.Altcoins")]),e._v(". (See "),t("a",{attrs:{href:"https://github.com/MetacoSA/NBitcoin/tree/master/NBitcoin.Altcoins",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("p",[e._v("Once this is done and "),t("code",[e._v("NBXplorer")]),e._v(" updated to use the last version of "),t("code",[e._v("NBitcoin.Altcoins")]),e._v(", follow "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer.Client/NBXplorerNetworkProvider.Litecoin.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Litecoin example"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If you want to test if everything is working, modify "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer.Tests/ServerTester.Environment.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("ServerTester.Environment.cs"),t("OutboundLink")],1),e._v(" to match your altcoin.")]),e._v(" "),t("p",[e._v("Then run the tests.")]),e._v(" "),t("h2",{attrs:{id:"licence"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#licence"}},[e._v("#")]),e._v(" Licence")]),e._v(" "),t("p",[e._v("This project is under MIT License.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/153.4418bed1.js b/assets/js/153.4418bed1.js deleted file mode 100644 index 16cf343a03..0000000000 --- a/assets/js/153.4418bed1.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[153],{863:function(e,t,r){"use strict";r.r(t);var a=r(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"nbxplorer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#nbxplorer"}},[e._v("#")]),e._v(" NBXplorer")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.nuget.org/packages/NBxplorer.Client",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/nuget/v/NBxplorer.Client.svg",alt:"NuGet",title:"NuGet"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/nbxplorer/",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/docker/automated/jrottenberg/ffmpeg.svg",alt:"Docker Automated buil",title:"Docker Automated buil"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://circleci.com/gh/dgarage/NBXplorer",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://circleci.com/gh/dgarage/NBXplorer.svg?style=svg",alt:"CircleCI",title:"CircleCI"}}),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("A minimalist UTXO tracker for HD wallets.\nThe goal is to provide a flexible, .NET-based UTXO tracker for HD wallets.\nThe explorer supports P2SH, P2PKH, P2WPKH, P2WSH, Taproot and multi-signature derivations.")]),e._v(" "),t("p",[e._v("It works on a pruned node and indexes only what you track.")]),e._v(" "),t("p",[e._v("This explorer is not intended to be exposed to the internet; it should be used as an infrastructure tool for tracking the UTXOs of your own service.")]),e._v(" "),t("h2",{attrs:{id:"what-about-alternatives-to-nbxplorer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-about-alternatives-to-nbxplorer"}},[e._v("#")]),e._v(" What about alternatives to NBXplorer?")]),e._v(" "),t("ol",[t("li",[t("code",[e._v("Electrum wallet")]),e._v(" requires an unpruned node with indexing, which is space-intensive and may be difficult to sync.")]),e._v(" "),t("li",[t("code",[e._v("Electrum wallet")]),e._v(" only supports a single cryptocurrency on a single server. If you are an exchange, you would end up running multiple versions of barely maintained Electrum instances.")]),e._v(" "),t("li",[t("code",[e._v("Personal Electrum Server")]),e._v(" supports only a single wallet.")]),e._v(" "),t("li",[t("code",[e._v("Electrum protocol")]),e._v(" is cumbersome for HD wallets.")]),e._v(" "),t("li",[t("code",[e._v("Bitcoin Core RPC")]),e._v(" is inflexible and difficult to use. It also scales poorly when a wallet has too many addresses or UTXOs.")]),e._v(" "),t("li",[t("code",[e._v("Bitcoin Core RPC")]),e._v(" supports multiple wallets but isn't designed to handle thousands of them. Having too many wallets will not scale.")]),e._v(" "),t("li",[e._v("While NBXplorer exposes an "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API"),t("OutboundLink")],1),e._v(", it also allows you to query the data using the most expressive and flexible language designed for this purpose: "),t("RouterLink",{attrs:{to:"/NBXplorer/docs/Postgres-Schema/"}},[e._v("SQL")]),e._v(".")],1),e._v(" "),t("li",[e._v("Alternative SaaS infrastructure providers depend on third parties, forcing you to compromise your privacy by sharing financial information while relinquishing control over API changes and service level agreements (SLAs).")])]),e._v(" "),t("h2",{attrs:{id:"typical-usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#typical-usage"}},[e._v("#")]),e._v(" Typical usage")]),e._v(" "),t("p",[e._v("You start by "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/GenerateWallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("Creating a wallet (hot wallet)"),t("OutboundLink")],1),e._v(", or "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/Track",target:"_blank",rel:"noopener noreferrer"}},[e._v("Tracking a derivation scheme (cold wallet)"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Second, "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/GetUnused",target:"_blank",rel:"noopener noreferrer"}},[e._v("Get the next unused address"),t("OutboundLink")],1),e._v(" to get paid.")]),e._v(" "),t("p",[e._v("Listen to events through "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Events/operation/GetLatest",target:"_blank",rel:"noopener noreferrer"}},[e._v("Polling"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Events/operation/EventStream",target:"_blank",rel:"noopener noreferrer"}},[e._v("Long Polling"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Events/operation/WebSocket",target:"_blank",rel:"noopener noreferrer"}},[e._v("Web Sockets"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("You can then "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/ListTransactionDerivationScheme",target:"_blank",rel:"noopener noreferrer"}},[e._v("List transactions"),t("OutboundLink")],1),e._v(", "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/ListUTXOsDerivationScheme",target:"_blank",rel:"noopener noreferrer"}},[e._v("List UTXOs"),t("OutboundLink")],1),e._v(", or "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Derivations/operation/CreatePSBT",target:"_blank",rel:"noopener noreferrer"}},[e._v("Create a PSBT"),t("OutboundLink")],1),e._v(" for your app to sign.")]),e._v(" "),t("p",[e._v("When the transaction is signed, "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Transactions/operation/Broadcast",target:"_blank",rel:"noopener noreferrer"}},[e._v("Broadcast it"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("You can also track multiple derivation schemes or individual addresses by "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/#tag/Groups/operation/Create",target:"_blank",rel:"noopener noreferrer"}},[e._v("Creating a group"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"general-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general-features"}},[e._v("#")]),e._v(" General features")]),e._v(" "),t("ul",[t("li",[e._v("Can pass arguments via environment variable, command line or configuration file")]),e._v(" "),t("li",[e._v("Automatically reconnect to your node if the connection goes temporarily down")]),e._v(" "),t("li",[e._v("An easy to use "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("REST API"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Persistence via "),t("RouterLink",{attrs:{to:"/NBXplorer/docs/Postgres-Schema/"}},[e._v("Postgres")])],1),e._v(" "),t("li",[e._v("Connect via RPC to broadcast transaction instead of using the P2P protocol like this example")]),e._v(" "),t("li",[e._v("Connect via RPC to your trusted node to get the proper fee rate.")]),e._v(" "),t("li",[e._v("Altcoin support")]),e._v(" "),t("li",[e._v("Huge test suite")]),e._v(" "),t("li",[e._v("Pruning of transaction data (in practice, we don't need to save the whole transaction, only the spent outpoint and received coin for the wallet)")]),e._v(" "),t("li",[e._v("Multi-wallet")]),e._v(" "),t("li",[e._v("Flexible address generation schemes (multisig, segwit, legacy etc...)")]),e._v(" "),t("li",[e._v("Pruning for big wallets (Removal of tracked transaction which do not impact the resulting UTXO set)")])]),e._v(" "),t("p",[e._v("It currently supports the following altcoins:")]),e._v(" "),t("ul",[t("li",[e._v("Althash")]),e._v(" "),t("li",[e._v("Argoneum")]),e._v(" "),t("li",[e._v("BCash (also known as Bitcoin Cash)")]),e._v(" "),t("li",[e._v("BGold (also known as Bitcoin Gold)")]),e._v(" "),t("li",[e._v("BitCore")]),e._v(" "),t("li",[e._v("Chaincoin")]),e._v(" "),t("li",[e._v("ColossusXT")]),e._v(" "),t("li",[e._v("Dash")]),e._v(" "),t("li",[e._v("Dogecoin")]),e._v(" "),t("li",[e._v("Feathercoin")]),e._v(" "),t("li",[e._v("Gobyte")]),e._v(" "),t("li",[e._v("Groestlcoin")]),e._v(" "),t("li",[e._v("Litecoin")]),e._v(" "),t("li",[e._v("Monacoin")]),e._v(" "),t("li",[e._v("MonetaryUnit")]),e._v(" "),t("li",[e._v("Monoeci")]),e._v(" "),t("li",[e._v("Polis")]),e._v(" "),t("li",[e._v("Qtum")]),e._v(" "),t("li",[e._v("Terracoin")]),e._v(" "),t("li",[e._v("Ufo")]),e._v(" "),t("li",[e._v("Viacoin")])]),e._v(" "),t("p",[e._v("Read our "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API Specification"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"prerequisite"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#prerequisite"}},[e._v("#")]),e._v(" Prerequisite")]),e._v(" "),t("ul",[t("li",[e._v("Install "),t("a",{attrs:{href:"https://www.microsoft.com/net/download",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET Core SDK v8.0 or above"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Bitcoin Core instance synched and running (at least 24.0).")]),e._v(" "),t("li",[e._v("PostgresSQL v13+")])]),e._v(" "),t("p",[e._v("Use "),t("code",[e._v("--postgres")]),e._v(" flag to setup the connection string. See "),t("RouterLink",{attrs:{to:"/NBXplorer/Postgres-Schema/"}},[e._v("schema documentation")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"api-specification"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-specification"}},[e._v("#")]),e._v(" API Specification")]),e._v(" "),t("p",[e._v("Read our "),t("RouterLink",{attrs:{to:"/NBXplorer/API/"}},[e._v("API Specification")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"how-to-build-and-run"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-build-and-run"}},[e._v("#")]),e._v(" How to build and run?")]),e._v(" "),t("p",[e._v("If you are using Bitcoin core default settings:")]),e._v(" "),t("p",[e._v("On Powershell:")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".\\build.ps1\n")])])]),t("p",[e._v("On Linux:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("./build.sh\n")])])]),t("p",[e._v("Then to run:")]),e._v(" "),t("p",[e._v("On Powershell:")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".\\run.ps1 --help\n")])])]),t("p",[e._v("On Linux:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("./run.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--help")]),e._v("\n")])])]),t("p",[e._v("Example, if you have ltc node and btc node on regtest (default configuration), and want to connect to them: (see documentation for other options in the "),t("a",{attrs:{href:"https://www.npgsql.org/doc/connection-string-parameters.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("postgres connection string"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("./run.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--chains")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("btc,ltc "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--network")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v("regtest "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--postgres")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"User ID=postgres;Host=127.0.0.1;Port=39382;Database=nbxplorer"')]),e._v("\n")])])]),t("h2",{attrs:{id:"how-to-use-the-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use-the-api"}},[e._v("#")]),e._v(" How to use the API?")]),e._v(" "),t("p",[e._v("Check "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("the API documentation"),t("OutboundLink")],1),e._v(", you can then use any client library:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/junderw/NBXplorer.NodeJS",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBXplorer.NodeJS"),t("OutboundLink")],1),e._v(" for NodeJS clients.")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.nuget.org/packages/NBxplorer.Client",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBXplorer.Client"),t("OutboundLink")],1),e._v(" for .NET clients.")])]),e._v(" "),t("p",[e._v("Here is "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/Examples/MultiSig/Program.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("a small C# example"),t("OutboundLink")],1),e._v(" showing a 2-2 multisig with Alice and Bob that you can run on regtest.")]),e._v(" "),t("h2",{attrs:{id:"with-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#with-docker"}},[e._v("#")]),e._v(" With Docker")]),e._v(" "),t("p",[e._v("Use "),t("a",{attrs:{href:"https://hub.docker.com/r/nicolasdorier/nbxplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("our image"),t("OutboundLink")],1),e._v(".\nYou can check "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/docker-compose.regtest.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("the sample"),t("OutboundLink")],1),e._v(" for configuring and composing it bitcoin core.")]),e._v(" "),t("h2",{attrs:{id:"how-to-develop-on-it"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-develop-on-it"}},[e._v("#")]),e._v(" How to develop on it?")]),e._v(" "),t("p",[e._v("If you are on Windows, I recommend Visual Studio 2022 (17.8.0).\nIf you are on other platform and want lightweight environment, use "),t("a",{attrs:{href:"https://code.visualstudio.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Visual Studio Code"),t("OutboundLink")],1),e._v(".\nIf you are hardcore, you can code on vim.")]),e._v(" "),t("p",[e._v("I like Visual Studio Code and Visual Studio 2022 as it allows me to debug in step by step.")]),e._v(" "),t("h2",{attrs:{id:"how-to-configure"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-configure"}},[e._v("#")]),e._v(" How to configure?")]),e._v(" "),t("p",[e._v("NBXplorer supports configuration through command line arguments, configuration file, or environment variables.")]),e._v(" "),t("h3",{attrs:{id:"configuration-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration-file"}},[e._v("#")]),e._v(" Configuration file")]),e._v(" "),t("p",[e._v("If you are not using standard install for bitcoind, you will have to change the configuration file:\nIn Windows it is located in")]),e._v(" "),t("div",{staticClass:"language-pwsh extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("C:\\Users\\\\AppData\\Roaming\\NBXplorer\\\\settings.config\n")])])]),t("p",[e._v("On linux or mac:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("~/.nbxplorer/"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("network"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("/settings.config\n")])])]),t("p",[e._v("The default configuration assumes "),t("code",[e._v("mainnet")]),e._v(" with only "),t("code",[e._v("btc")]),e._v(" chain supported, and uses the default settings of bitcoind.")]),e._v(" "),t("p",[e._v("You can change the location of the configuration file with the "),t("code",[e._v("--conf=pathToConf")]),e._v(" command line argument.")]),e._v(" "),t("h3",{attrs:{id:"command-line-parameters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#command-line-parameters"}},[e._v("#")]),e._v(" Command line parameters")]),e._v(" "),t("p",[e._v("Please note that NBXplorer uses cookie authentication by default. If you run your Bitcoin/Litecoin/Dash nodes using their daemon (like "),t("code",[e._v("bitcoind")]),e._v(", "),t("code",[e._v("litecoind")]),e._v(" or "),t("code",[e._v("dashd")]),e._v("), they generate a new cookie every time you start them, and that should work without any extra configuration.\nIf you run the node(s) using the GUI versions, like Bitcoin\\Litecoin\\Dash Core Qt with the "),t("code",[e._v("-server")]),e._v(" parameter while you set the rpcusername and rpcpassword in their "),t("code",[e._v(".conf")]),e._v(" files, you must set those values for every crypto you are planning to support.\nSee samples below.")]),e._v(" "),t("h4",{attrs:{id:"run-from-source-requires-net-core-sdk"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-from-source-requires-net-core-sdk"}},[e._v("#")]),e._v(" Run from source (requires .NET Core SDK)")]),e._v(" "),t("p",[e._v("You should use "),t("code",[e._v("run.ps1")]),e._v(" (Windows) or "),t("code",[e._v("run.sh")]),e._v(" (Linux) to execute NBXplorer, but you can also execute it manually with the following command:\n"),t("code",[e._v("dotnet run --no-launch-profile -p .\\NBXplorer\\NBXplorer.csproj -- ")])]),e._v(" "),t("h4",{attrs:{id:"run-using-built-dll-requires-net-core-runtime-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#run-using-built-dll-requires-net-core-runtime-only"}},[e._v("#")]),e._v(" Run using built DLL (requires .NET Core Runtime only)")]),e._v(" "),t("p",[e._v("If you already have a compiled DLL, you can run the executable with the following command:\n"),t("code",[e._v("dotnet NBXplorer.dll ")])]),e._v(" "),t("h4",{attrs:{id:"sample-parameters"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sample-parameters"}},[e._v("#")]),e._v(" Sample parameters")]),e._v(" "),t("p",[e._v("Running NBXplorer HTTP server on port 20300, connecting to the BTC mainnet node locally.\n"),t("code",[e._v("--port=20300 --network=mainnet --btcnodeendpoint=127.0.0.1:32939")])]),e._v(" "),t("p",[e._v("Running NBXplorer on testnet, supporting Bitcoin, Litecoin and Dash, using cookie authentication for BTC and LTC, and RPC username and password for Dash, connecting to all of them locally.\n"),t("code",[e._v("--chains=btc,ltc,dash --network=testnet --dashrpcuser=myuser --dashrpcpassword=mypassword")])]),e._v(" "),t("h3",{attrs:{id:"environment-variables"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#environment-variables"}},[e._v("#")]),e._v(" Environment variables")]),e._v(" "),t("p",[e._v("The same settings as above, for example "),t("code",[e._v("export NBXPLORER_PORT=20300")]),e._v(". This is usefull for configuring docker.")]),e._v(" "),t("h2",{attrs:{id:"how-to-run"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run"}},[e._v("#")]),e._v(" How to Run")]),e._v(" "),t("h3",{attrs:{id:"command-line"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#command-line"}},[e._v("#")]),e._v(" Command Line")]),e._v(" "),t("p",[e._v("You can use the "),t("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/core/tools/dotnet",target:"_blank",rel:"noopener noreferrer"}},[e._v("dotnet"),t("OutboundLink")],1),e._v(" command which is part of .NET Core to run NBXplorer. To run from source you must have the .NET Core SDK installed e.g.\n"),t("code",[e._v("dotnet run NBXplorer.dll")]),e._v("\nAs described above you may add configuration parameters if desired.")]),e._v(" "),t("p",[e._v("If you have a compiled version of NBXplorer you should have a file in your build folder named NBXplorer.dll. This cannot itself be directly executed on the command line as it is not an executable file. Instead we can use the "),t("code",[e._v("dotnet")]),e._v(" runtime to execute the dll file.")]),e._v(" "),t("p",[e._v("e.g. "),t("code",[e._v("dotnet NBXplorer.dll")])]),e._v(" "),t("h2",{attrs:{id:"important-note"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#important-note"}},[e._v("#")]),e._v(" Important Note")]),e._v(" "),t("p",[e._v("This tool will only start scanning from the configured "),t("code",[e._v("startheight")]),e._v(". (By default, the height of the blockchain during your first run)\nThis means that you might not see old payments from your HD key.")]),e._v(" "),t("p",[e._v("If you need to see old payments, you need to configure "),t("code",[e._v("--[crypto]startheight")]),e._v(" to a specific height of your choice, then run it again with "),t("code",[e._v("--[crypto]rescan")]),e._v(", e.g.\n"),t("code",[e._v("./run.sh --chains=ltc --ltcrescan --ltcstartheight=101")])]),e._v(" "),t("h2",{attrs:{id:"how-to-query"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-query"}},[e._v("#")]),e._v(" How to query?")]),e._v(" "),t("h3",{attrs:{id:"using-postman"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-postman"}},[e._v("#")]),e._v(" Using Postman")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://www.getpostman.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Postman"),t("OutboundLink")],1),e._v(" is a useful tool for testing and experimenting with REST API's.")]),e._v(" "),t("p",[e._v("You can test the "),t("a",{attrs:{href:"https://dgarage.github.io/NBXplorer/",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBXplorer API"),t("OutboundLink")],1),e._v(" quickly and easily using Postman.")]),e._v(" "),t("p",[e._v("If you use cookie authentication (enabled by default) in your locally run NBXplorer, you need to set that up in Postman:")]),e._v(" "),t("ul",[t("li",[e._v("Run NBXplorer and locate you cookie file (NBXplorer will generate a new Cookie file each time it runs in "),t("RouterLink",{attrs:{to:"/NBXplorer/API/#authentication"}},[e._v("its default data folder")]),e._v(")")],1),e._v(" "),t("li",[e._v("In Postman create a new GET API test")]),e._v(" "),t("li",[e._v("In Authorization select "),t("em",[e._v("Basic Auth")]),e._v(", you should see 2 input boxes for username and password")]),e._v(" "),t("li",[e._v("Open your cookie file with a text editor e.g. Notepad on windows . You should see a cookie string e.g. "),t("code",[e._v("__cookie__:0ff9cd83a5ac7c19a6b56a3d1e7a5c96e113d42dba7720a1f72a3a5e8c4b6c66")])]),e._v(" "),t("li",[e._v("Back in Postman paste the "),t("code",[e._v("__cookie__")]),e._v(" part of your cookie file into username (whatever comes before the 😃")]),e._v(" "),t("li",[e._v("Paste the Hex string (after the : ) into the password box")]),e._v(" "),t("li",[e._v("Click the Update Request button in Postman - this will force Postman to generate the correct HTTP headers based on your cookie details")]),e._v(" "),t("li",[e._v("You should now see a new entry in the Headers section with a Key of "),t("em",[e._v("Authorization")]),e._v(" and Value of "),t("em",[e._v("Basic xxxxxxxxx")]),e._v(" where the string after "),t("code",[e._v("Basic")]),e._v(" will be your Base64 encoded username and password.")]),e._v(" "),t("li",[e._v("Enter the API URL you are going to test")])]),e._v(" "),t("p",[e._v("You can also disable authentication in NBXplorer for testing with the "),t("code",[e._v("--noauth")]),e._v(" parameter. This makes testing quicker:")]),e._v(" "),t("ul",[t("li",[e._v("Run NBXplorer with the "),t("code",[e._v("--noauth")]),e._v(" command line argument or the environment variable "),t("code",[e._v("NBXPLORER_NOAUTH=1")])]),e._v(" "),t("li",[e._v("In Postman create a new GET API test")]),e._v(" "),t("li",[e._v("In Authorization select "),t("em",[e._v("No Auth")])]),e._v(" "),t("li",[e._v("Enter the API URL you are going to test")])]),e._v(" "),t("p",[e._v("You are now ready to test the API - it is easiest to start with something simple such as the fees endpoint e.g.")]),e._v(" "),t("p",[t("code",[e._v("http://localhost:24444/v1/cryptos/btc/fees/3")])]),e._v(" "),t("p",[e._v("this should return a JSON payload e.g.")]),e._v(" "),t("p",[e._v('{\n"feeRate": 9,\n"blockCount": 3\n}')]),e._v(" "),t("h2",{attrs:{id:"message-brokers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#message-brokers"}},[e._v("#")]),e._v(" Message Brokers")]),e._v(" "),t("h3",{attrs:{id:"azure-service-bus"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#azure-service-bus"}},[e._v("#")]),e._v(" Azure Service Bus")]),e._v(" "),t("p",[e._v("Support has been added for Azure Service Bus as a message broker. Currently 2 Queues and 2 Topics are supported")]),e._v(" "),t("h3",{attrs:{id:"queues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#queues"}},[e._v("#")]),e._v(" Queues")]),e._v(" "),t("ul",[t("li",[e._v("New Block")]),e._v(" "),t("li",[e._v("New Transaction")])]),e._v(" "),t("h3",{attrs:{id:"topics"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#topics"}},[e._v("#")]),e._v(" Topics")]),e._v(" "),t("ul",[t("li",[e._v("New Block")]),e._v(" "),t("li",[e._v("New Transaction")])]),e._v(" "),t("p",[e._v("Filters should be applied on the client, if required.")]),e._v(" "),t("p",[e._v("To activate Azure Service Bus Mesages you should add an Azure Service Bus Connection string to your config file or on the command line.")]),e._v(" "),t("ul",[t("li",[e._v("To use queues you should specify the queue names you wish to use")]),e._v(" "),t("li",[e._v("To use topics you should specify the topic names you wish to use")])]),e._v(" "),t("p",[e._v("You can use both queues and topics at the same time.")]),e._v(" "),t("h4",{attrs:{id:"config-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#config-settings"}},[e._v("#")]),e._v(" Config Settings")]),e._v(" "),t("p",[e._v("If you use the Configuration file to setup your NBXplorer options:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbcnstr")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Your Azure Service Bus Connection string")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbblockq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of queue to send New Block message to")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbtranq")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of queue to send New Transaction message to")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbblockt")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of topic to send New Block message to")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("asbtrant")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of queue to send New Transaction message to")]),e._v("\n")])])]),t("h3",{attrs:{id:"rabbitmq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#rabbitmq"}},[e._v("#")]),e._v(" RabbitMq")]),e._v(" "),t("p",[e._v("Support has been added for RabbitMq as a message broker. Currently 2 exchanges supported;")]),e._v(" "),t("ul",[t("li",[e._v("New Block")]),e._v(" "),t("li",[e._v("New Transaction")])]),e._v(" "),t("p",[e._v("Filters can be applied on the client by defining routing keys;")]),e._v(" "),t("p",[e._v("For transactions;")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("transactions.#")]),e._v(" to get all transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.[BTC].#")]),e._v(" to get all [Bitcoin] transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.[BTC].confirmed")]),e._v(" to get only confirmed [Bitcoin] transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.[BTC].unconfirmed")]),e._v(" to get only unconfirmed [Bitcoin] transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.*.confirmed")]),e._v(" to get all confirmed transactions.")]),e._v(" "),t("li",[t("code",[e._v("transactions.*.unconfirmed")]),e._v(" to get all unconfirmed transactions.")])]),e._v(" "),t("p",[e._v("For blocks;")]),e._v(" "),t("ul",[t("li",[t("code",[e._v("blocks.#")]),e._v(" to get all blocks.")]),e._v(" "),t("li",[t("code",[e._v("blocks.[BTC]")]),e._v(" to get all [Bitcoin] blocks.")])]),e._v(" "),t("p",[e._v("To activate RabbitMq mesages you should add following settings to your config file or on the command line.")]),e._v(" "),t("ul",[t("li",[e._v("rmqhost, rmquser, rmqpass")])]),e._v(" "),t("h4",{attrs:{id:"config-settings-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#config-settings-2"}},[e._v("#")]),e._v(" Config Settings")]),e._v(" "),t("p",[e._v("If you use the Configuration file to setup your NBXplorer options:")]),e._v(" "),t("div",{staticClass:"language-ini extra-class"},[t("pre",{pre:!0,attrs:{class:"language-ini"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqhost")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq host name")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqvirtual")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq virtual host")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmquser")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq username")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqpass")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("RabbitMq password")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqtranex")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of exchange to send transaction messages")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token key attr-name"}},[e._v("rmqblockex")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token value attr-value"}},[e._v("Name of exchange to send block messages")]),e._v("\n")])])]),t("p",[e._v("Payloads are JSON and map to "),t("code",[e._v("NewBlockEvent")]),e._v(", "),t("code",[e._v("NewTransactionEvent")]),e._v(" in the "),t("code",[e._v("NBXplorer.Models")]),e._v(" namespace. There is no support in NBXplorer client for message borkers at the current time. You will need to use the "),t("code",[e._v("Serializer")]),e._v(" in "),t("code",[e._v("NBXplorer.Client")]),e._v(" to de-serialize the objects or then implement your own JSON de-serializers for the custom types used in the payload.")]),e._v(" "),t("p",[e._v("For configuring serializers you can get crypto code info from "),t("code",[e._v("BasicProperties.Headers[CryptoCode]")]),e._v(" of RabbitMq messages or "),t("code",[e._v("UserProperties[CryptoCode]")]),e._v(" of Azure Service Bus messages.\nExamples can be found in unit tests.")]),e._v(" "),t("h4",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("p",[e._v("If you receive a 401 Unauthorized then your cookie data is not working. Check you are using the current cookie by opening the cookie file again - also check the date/time of the cookie file to ensure it is the latest cookie (generated when you launched NBXplorer).")]),e._v(" "),t("p",[e._v("If you receive a 404 or timeout then Postman cannot see the endpoint")]),e._v(" "),t("ul",[t("li",[e._v("are you using the correct Port ?")]),e._v(" "),t("li",[e._v("are you running postman on localhost ?")])]),e._v(" "),t("h2",{attrs:{id:"client-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#client-api"}},[e._v("#")]),e._v(" Client API")]),e._v(" "),t("p",[e._v("A better documentation is on the way, for now the only documentation is the client API in C# on "),t("a",{attrs:{href:"https://www.nuget.org/packages/NBxplorer.Client",target:"_blank",rel:"noopener noreferrer"}},[e._v("nuget"),t("OutboundLink")],1),e._v(".\nThe "),t("code",[e._v("ExplorerClient")]),e._v(" classes allows you to query unused addresses, and the UTXO of an HD PubKey.\nYou can take a look at "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer.Tests/UnitTest1.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("the tests"),t("OutboundLink")],1),e._v(" to see how it works.")]),e._v(" "),t("p",[e._v("There is a simple use case documented on "),t("a",{attrs:{href:"https://programmingblockchain.gitbooks.io/programmingblockchain/content/wallet/web-api.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Blockchain Programming in C#"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-run-the-tests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-tests"}},[e._v("#")]),e._v(" How to run the tests?")]),e._v(" "),t("p",[e._v("This is easy, from repo directory:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" NBXplorer.Tests\ndotnet "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("test")]),e._v("\n")])])]),t("p",[e._v("The tests can take long the first time, as it download Bitcoin Core binaries. (Between 5 and 10 minutes)")]),e._v(" "),t("h2",{attrs:{id:"how-to-add-support-to-my-altcoin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-support-to-my-altcoin"}},[e._v("#")]),e._v(" How to add support to my altcoin")]),e._v(" "),t("p",[e._v("First you need to add support for your altcoin to "),t("code",[e._v("NBitcoin.Altcoins")]),e._v(". (See "),t("a",{attrs:{href:"https://github.com/MetacoSA/NBitcoin/tree/master/NBitcoin.Altcoins",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("p",[e._v("Once this is done and "),t("code",[e._v("NBXplorer")]),e._v(" updated to use the last version of "),t("code",[e._v("NBitcoin.Altcoins")]),e._v(", follow "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer.Client/NBXplorerNetworkProvider.Litecoin.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Litecoin example"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("If you want to test if everything is working, modify "),t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer.Tests/ServerTester.Environment.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("ServerTester.Environment.cs"),t("OutboundLink")],1),e._v(" to match your altcoin.")]),e._v(" "),t("p",[e._v("Then run the tests.")]),e._v(" "),t("h2",{attrs:{id:"licence"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#licence"}},[e._v("#")]),e._v(" Licence")]),e._v(" "),t("p",[e._v("This project is under MIT License.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/154.8153ff79.js b/assets/js/154.856c6a00.js similarity index 99% rename from assets/js/154.8153ff79.js rename to assets/js/154.856c6a00.js index 8abce715fa..2f137ec626 100644 --- a/assets/js/154.8153ff79.js +++ b/assets/js/154.856c6a00.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[154],{864:function(e,t,o){"use strict";o.r(t);var r=o(17),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btcpay-server-accept-bitcoin-payments-in-nopcommerce"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-accept-bitcoin-payments-in-nopcommerce"}},[e._v("#")]),e._v(" BTCPay Server Accept Bitcoin payments in nopCommerce")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/nopcommerce/main/nopCommerceAcceptBitcoin.png",alt:"BTCPay nopCommerce Banner",title:"BTCPay nopCommerce Banner"}})]),e._v(" "),t("h2",{attrs:{id:"plugin-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-overview"}},[e._v("#")]),e._v(" Plugin Overview")]),e._v(" "),t("p",[e._v("This plugin allows you to easily start accepting Bitcoin payments in your nopCommerce e-commerce store using BTCPay Server a free, self-hosted and open-source Bitcoin payment gateway.")]),e._v(" "),t("h2",{attrs:{id:"features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#features"}},[e._v("#")]),e._v(" Features")]),e._v(" "),t("ul",[t("li",[e._v("0% Fees: Enjoy a payment gateway with no fees. Yes, really!")]),e._v(" "),t("li",[e._v("No complicated KYC needed, you're your own self-hosted payment gateway")]),e._v(" "),t("li",[e._v("Automated invoice management and refunds")]),e._v(" "),t("li",[e._v("Simple and customizable checkout UX, available in 30+ languages")]),e._v(" "),t("li",[e._v("Direct payments to your wallet, no intermediary")]),e._v(" "),t("li",[e._v("Reporting and accounting CSV exports")]),e._v(" "),t("li",[e._v("Real-time exchange price tracking for correct payment amounts")]),e._v(" "),t("li",[e._v("Community-driven support")]),e._v(" "),t("li",[e._v("Extensive documentation and video tutorials")])]),e._v(" "),t("h2",{attrs:{id:"getting-started"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[e._v("#")]),e._v(" Getting Started")]),e._v(" "),t("h3",{attrs:{id:"download-and-installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#download-and-installation"}},[e._v("#")]),e._v(" Download and installation")]),e._v(" "),t("p",[e._v("The plugins can be downloaded through "),t("a",{attrs:{href:"https://www.nopcommerce.com/marketplace/",target:"_blank",rel:"noopener noreferrer"}},[e._v("nopCommerce Marketplace"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://github.com/btcpayserver/nopcommerce",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("For installing the plugin through nopCommerce, upload the plugin directly from nopCommerce "),t("code",[e._v("Configuration > Local plugins > Upload plugin or a theme")]),e._v('. Ensure the plugin file is in ZIP format for successful upload. After uploading, find the plugin in the list, click "Install" next to it, and enable it if needed.')]),e._v(" "),t("p",[e._v("Alternatively you can manually upload the plugin to the "),t("code",[e._v("/plugins")]),e._v(" folder in your nopCommerce directory and restart the application.")]),e._v(" "),t("p",[e._v("Once the plugin is uploaded, make sure to click "),t("code",[e._v("Install")]),e._v(" button and "),t("code",[e._v("Restart application")]),e._v(" to apply the changes.")]),e._v(" "),t("h2",{attrs:{id:"plugin-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-configuration"}},[e._v("#")]),e._v(" Plugin configuration")]),e._v(" "),t("p",[e._v("You can configure the plugin either automatically or manually. Automatic setup is much faster and recommended. To begin configuring the plugin, click on the "),t("code",[e._v("Configure")]),e._v(" button in the")]),e._v(" "),t("h3",{attrs:{id:"automatic-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automatic-configuration"}},[e._v("#")]),e._v(" Automatic Configuration")]),e._v(" "),t("ol",[t("li",[e._v("Enter the URL to your BTCPay Server into the "),t("strong",[e._v("BTCPay URL")]),e._v(" field. (e.g. https://mainnet.demo.btcpayserver.org)")]),e._v(" "),t("li",[e._v("Click on the "),t("strong",[e._v("Configure automatically")]),e._v(" button to be redirected to the API authorization page of your BTCPay Server")]),e._v(" "),t("li",[e._v("On the authorization page: Select the store you want to connect to your nopCommerce (you might need to login first)")]),e._v(" "),t("li",[e._v('Click on "Authorize App" button and you will be redirected back to your nopCommerce')]),e._v(" "),t("li",[e._v('The "API Key", "BTCPay Store ID" and "Webhook Secret" fields will be automatically filled and a webhook created')]),e._v(" "),t("li",[e._v("Click "),t("strong",[e._v("Save")]),e._v(" button at the bottom to persist the configuration.")]),e._v(" "),t("li",[e._v("Click "),t("strong",[e._v("Activate")]),e._v(" to enable the plugin. Congrats, the configuration is now complete!")])]),e._v(" "),t("p",[t("em",[e._v("Note: given the architecture of nopCommerce, it is possible that malfunctions in redirections may occur. Particularly if https is disabled or incorrectly configured. In this case, please opt for manual configuration.")])]),e._v(" "),t("h3",{attrs:{id:"manual-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manual-configuration"}},[e._v("#")]),e._v(" Manual Configuration")]),e._v(" "),t("p",[e._v("Ensure that the following fields are filled out:")]),e._v(" "),t("ul",[t("li",[e._v("BTCPay Url")]),e._v(" "),t("li",[e._v("BTCPay Store ID")]),e._v(" "),t("li",[e._v("API Key")]),e._v(" "),t("li",[e._v("WebHook Secret")])]),e._v(" "),t("h4",{attrs:{id:"btcpay-url"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-url"}},[e._v("#")]),e._v(" BTCPay URL")]),e._v(" "),t("p",[e._v("In the BTCPay URL field of your nopCommerce, simply input the link to your self-hosted server or the one hosted by a "),t("a",{attrs:{href:"https://directory.btcpayserver.org/filter/hosts",target:"_blank",rel:"noopener noreferrer"}},[e._v("third-party provider"),t("OutboundLink")],1),e._v(". For example; https://mainnet.demo.btcpayserver.org")]),e._v(" "),t("h4",{attrs:{id:"btcpay-store-id"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-store-id"}},[e._v("#")]),e._v(" BTCPay Store ID")]),e._v(" "),t("p",[e._v("BTCPay "),t("strong",[e._v("Store ID")]),e._v(" can be obtained from your BTCPay Server, in Store Settings > General > Store ID field. Copy it and paste it over in the "),t("code",[e._v("BTCPay Store ID")]),e._v(" field.")]),e._v(" "),t("h4",{attrs:{id:"generating-the-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generating-the-api-key"}},[e._v("#")]),e._v(" Generating the API key")]),e._v(" "),t("ol",[t("li",[e._v("To create the "),t("strong",[e._v("BTCPay API key")]),e._v(", click on the "),t("code",[e._v("Account")]),e._v(" located at the bottom of the sidebar of your BTCPay Server.")]),e._v(" "),t("li",[e._v("Click on the "),t("code",[e._v("Manage Account > API Key")]),e._v(".")]),e._v(" "),t("li",[e._v("Click on the "),t("code",[e._v("Generate API key")]),e._v(" button")]),e._v(" "),t("li",[e._v("Click on the checkboxes and enable the following permissions:")])]),e._v(" "),t("ul",[t("li",[e._v("View invoices")]),e._v(" "),t("li",[e._v("Create an invoice")]),e._v(" "),t("li",[e._v("Modify invoices")]),e._v(" "),t("li",[e._v("Modify selected stores' webhooks")]),e._v(" "),t("li",[e._v("View your stores")]),e._v(" "),t("li",[e._v("Create non-approved pull payments in selected stores (optional)")])]),e._v(" "),t("p",[t("em",[e._v("Note: To use the "),t("RouterLink",{attrs:{to:"/Refund/#refunds"}},[e._v("refund feature")]),e._v(', you must also add the "Create non-approved pull payments" permission. After a refund, an order note is created where you can copy the pull payments link and send to your customer to claim it (this order note is also visible by the customer). The customer can request the refund on that page by filling out refund address.')],1)]),e._v(" "),t("h4",{attrs:{id:"generating-the-webhook"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generating-the-webhook"}},[e._v("#")]),e._v(" Generating the webhook")]),e._v(" "),t("ol",[t("li",[e._v('In your nopCommerce, copy the "Webhook Url" shown on the bottom of the BTCPay plugin configuration screen.')]),e._v(" "),t("li",[e._v("Next, go to your BTCPay Server "),t("code",[e._v("Store Settings > Webhooks")])]),e._v(" "),t("li",[e._v("Click on the "),t("code",[e._v("Create Webhook")]),e._v(" button")]),e._v(" "),t("li",[e._v("Paste the "),t("code",[e._v("Webhook Url")]),e._v(" you copied from nopCommerce (step 1) into the"),t("code",[e._v("Payload URL")]),e._v(" field")]),e._v(" "),t("li",[e._v('Click on the "Eye" icon next to the '),t("code",[e._v("Secret")]),e._v(" field to reveal the secret key and "),t("code",[e._v("Copy")]),e._v(" it.")]),e._v(" "),t("li",[e._v("Don't forget to click on the "),t("code",[e._v("Add webhook")]),e._v(" to apply all the changes.")]),e._v(" "),t("li",[e._v("Go back nopCommerce and paste the Secret Key into the "),t("code",[e._v("WebHook Secret")]),e._v(" field")]),e._v(" "),t("li",[e._v("Click "),t("code",[e._v("Save")]),e._v(" to apply all the changes")]),e._v(" "),t("li",[e._v("Click "),t("code",[e._v("Activate")]),e._v(" to enable the plugin. Congrats, the configuration is now complete!")])]),e._v(" "),t("p",[e._v("Now your BTCPay Server is connected to your nopCommerce successfully.")]),e._v(" "),t("h2",{attrs:{id:"support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[e._v("#")]),e._v(" Support")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")]),e._v(" "),t("p",[e._v("If you experience a bug please "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpay-nopCommerce-plugin/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("open a bug report"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"license"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[e._v("#")]),e._v(" License")]),e._v(" "),t("p",[e._v("This plugin is released under the "),t("a",{attrs:{href:"https://github.com/btcpayserver/nopcommerce/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[e._v("MIT License"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("The non-profit "),t("a",{attrs:{href:"https://btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Foundation"),t("OutboundLink")],1),e._v(" is committed to keeping this powerful payment plugin free forever. Our mission is to enable anyone to accept bitcoin regardless of financial, technical, social or political barriers.")]),e._v(" "),t("hr")])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[154],{863:function(e,t,o){"use strict";o.r(t);var r=o(17),a=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btcpay-server-accept-bitcoin-payments-in-nopcommerce"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-accept-bitcoin-payments-in-nopcommerce"}},[e._v("#")]),e._v(" BTCPay Server Accept Bitcoin payments in nopCommerce")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/nopcommerce/main/nopCommerceAcceptBitcoin.png",alt:"BTCPay nopCommerce Banner",title:"BTCPay nopCommerce Banner"}})]),e._v(" "),t("h2",{attrs:{id:"plugin-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-overview"}},[e._v("#")]),e._v(" Plugin Overview")]),e._v(" "),t("p",[e._v("This plugin allows you to easily start accepting Bitcoin payments in your nopCommerce e-commerce store using BTCPay Server a free, self-hosted and open-source Bitcoin payment gateway.")]),e._v(" "),t("h2",{attrs:{id:"features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#features"}},[e._v("#")]),e._v(" Features")]),e._v(" "),t("ul",[t("li",[e._v("0% Fees: Enjoy a payment gateway with no fees. Yes, really!")]),e._v(" "),t("li",[e._v("No complicated KYC needed, you're your own self-hosted payment gateway")]),e._v(" "),t("li",[e._v("Automated invoice management and refunds")]),e._v(" "),t("li",[e._v("Simple and customizable checkout UX, available in 30+ languages")]),e._v(" "),t("li",[e._v("Direct payments to your wallet, no intermediary")]),e._v(" "),t("li",[e._v("Reporting and accounting CSV exports")]),e._v(" "),t("li",[e._v("Real-time exchange price tracking for correct payment amounts")]),e._v(" "),t("li",[e._v("Community-driven support")]),e._v(" "),t("li",[e._v("Extensive documentation and video tutorials")])]),e._v(" "),t("h2",{attrs:{id:"getting-started"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[e._v("#")]),e._v(" Getting Started")]),e._v(" "),t("h3",{attrs:{id:"download-and-installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#download-and-installation"}},[e._v("#")]),e._v(" Download and installation")]),e._v(" "),t("p",[e._v("The plugins can be downloaded through "),t("a",{attrs:{href:"https://www.nopcommerce.com/marketplace/",target:"_blank",rel:"noopener noreferrer"}},[e._v("nopCommerce Marketplace"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://github.com/btcpayserver/nopcommerce",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("For installing the plugin through nopCommerce, upload the plugin directly from nopCommerce "),t("code",[e._v("Configuration > Local plugins > Upload plugin or a theme")]),e._v('. Ensure the plugin file is in ZIP format for successful upload. After uploading, find the plugin in the list, click "Install" next to it, and enable it if needed.')]),e._v(" "),t("p",[e._v("Alternatively you can manually upload the plugin to the "),t("code",[e._v("/plugins")]),e._v(" folder in your nopCommerce directory and restart the application.")]),e._v(" "),t("p",[e._v("Once the plugin is uploaded, make sure to click "),t("code",[e._v("Install")]),e._v(" button and "),t("code",[e._v("Restart application")]),e._v(" to apply the changes.")]),e._v(" "),t("h2",{attrs:{id:"plugin-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-configuration"}},[e._v("#")]),e._v(" Plugin configuration")]),e._v(" "),t("p",[e._v("You can configure the plugin either automatically or manually. Automatic setup is much faster and recommended. To begin configuring the plugin, click on the "),t("code",[e._v("Configure")]),e._v(" button in the")]),e._v(" "),t("h3",{attrs:{id:"automatic-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automatic-configuration"}},[e._v("#")]),e._v(" Automatic Configuration")]),e._v(" "),t("ol",[t("li",[e._v("Enter the URL to your BTCPay Server into the "),t("strong",[e._v("BTCPay URL")]),e._v(" field. (e.g. https://mainnet.demo.btcpayserver.org)")]),e._v(" "),t("li",[e._v("Click on the "),t("strong",[e._v("Configure automatically")]),e._v(" button to be redirected to the API authorization page of your BTCPay Server")]),e._v(" "),t("li",[e._v("On the authorization page: Select the store you want to connect to your nopCommerce (you might need to login first)")]),e._v(" "),t("li",[e._v('Click on "Authorize App" button and you will be redirected back to your nopCommerce')]),e._v(" "),t("li",[e._v('The "API Key", "BTCPay Store ID" and "Webhook Secret" fields will be automatically filled and a webhook created')]),e._v(" "),t("li",[e._v("Click "),t("strong",[e._v("Save")]),e._v(" button at the bottom to persist the configuration.")]),e._v(" "),t("li",[e._v("Click "),t("strong",[e._v("Activate")]),e._v(" to enable the plugin. Congrats, the configuration is now complete!")])]),e._v(" "),t("p",[t("em",[e._v("Note: given the architecture of nopCommerce, it is possible that malfunctions in redirections may occur. Particularly if https is disabled or incorrectly configured. In this case, please opt for manual configuration.")])]),e._v(" "),t("h3",{attrs:{id:"manual-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manual-configuration"}},[e._v("#")]),e._v(" Manual Configuration")]),e._v(" "),t("p",[e._v("Ensure that the following fields are filled out:")]),e._v(" "),t("ul",[t("li",[e._v("BTCPay Url")]),e._v(" "),t("li",[e._v("BTCPay Store ID")]),e._v(" "),t("li",[e._v("API Key")]),e._v(" "),t("li",[e._v("WebHook Secret")])]),e._v(" "),t("h4",{attrs:{id:"btcpay-url"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-url"}},[e._v("#")]),e._v(" BTCPay URL")]),e._v(" "),t("p",[e._v("In the BTCPay URL field of your nopCommerce, simply input the link to your self-hosted server or the one hosted by a "),t("a",{attrs:{href:"https://directory.btcpayserver.org/filter/hosts",target:"_blank",rel:"noopener noreferrer"}},[e._v("third-party provider"),t("OutboundLink")],1),e._v(". For example; https://mainnet.demo.btcpayserver.org")]),e._v(" "),t("h4",{attrs:{id:"btcpay-store-id"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-store-id"}},[e._v("#")]),e._v(" BTCPay Store ID")]),e._v(" "),t("p",[e._v("BTCPay "),t("strong",[e._v("Store ID")]),e._v(" can be obtained from your BTCPay Server, in Store Settings > General > Store ID field. Copy it and paste it over in the "),t("code",[e._v("BTCPay Store ID")]),e._v(" field.")]),e._v(" "),t("h4",{attrs:{id:"generating-the-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generating-the-api-key"}},[e._v("#")]),e._v(" Generating the API key")]),e._v(" "),t("ol",[t("li",[e._v("To create the "),t("strong",[e._v("BTCPay API key")]),e._v(", click on the "),t("code",[e._v("Account")]),e._v(" located at the bottom of the sidebar of your BTCPay Server.")]),e._v(" "),t("li",[e._v("Click on the "),t("code",[e._v("Manage Account > API Key")]),e._v(".")]),e._v(" "),t("li",[e._v("Click on the "),t("code",[e._v("Generate API key")]),e._v(" button")]),e._v(" "),t("li",[e._v("Click on the checkboxes and enable the following permissions:")])]),e._v(" "),t("ul",[t("li",[e._v("View invoices")]),e._v(" "),t("li",[e._v("Create an invoice")]),e._v(" "),t("li",[e._v("Modify invoices")]),e._v(" "),t("li",[e._v("Modify selected stores' webhooks")]),e._v(" "),t("li",[e._v("View your stores")]),e._v(" "),t("li",[e._v("Create non-approved pull payments in selected stores (optional)")])]),e._v(" "),t("p",[t("em",[e._v("Note: To use the "),t("RouterLink",{attrs:{to:"/Refund/#refunds"}},[e._v("refund feature")]),e._v(', you must also add the "Create non-approved pull payments" permission. After a refund, an order note is created where you can copy the pull payments link and send to your customer to claim it (this order note is also visible by the customer). The customer can request the refund on that page by filling out refund address.')],1)]),e._v(" "),t("h4",{attrs:{id:"generating-the-webhook"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#generating-the-webhook"}},[e._v("#")]),e._v(" Generating the webhook")]),e._v(" "),t("ol",[t("li",[e._v('In your nopCommerce, copy the "Webhook Url" shown on the bottom of the BTCPay plugin configuration screen.')]),e._v(" "),t("li",[e._v("Next, go to your BTCPay Server "),t("code",[e._v("Store Settings > Webhooks")])]),e._v(" "),t("li",[e._v("Click on the "),t("code",[e._v("Create Webhook")]),e._v(" button")]),e._v(" "),t("li",[e._v("Paste the "),t("code",[e._v("Webhook Url")]),e._v(" you copied from nopCommerce (step 1) into the"),t("code",[e._v("Payload URL")]),e._v(" field")]),e._v(" "),t("li",[e._v('Click on the "Eye" icon next to the '),t("code",[e._v("Secret")]),e._v(" field to reveal the secret key and "),t("code",[e._v("Copy")]),e._v(" it.")]),e._v(" "),t("li",[e._v("Don't forget to click on the "),t("code",[e._v("Add webhook")]),e._v(" to apply all the changes.")]),e._v(" "),t("li",[e._v("Go back nopCommerce and paste the Secret Key into the "),t("code",[e._v("WebHook Secret")]),e._v(" field")]),e._v(" "),t("li",[e._v("Click "),t("code",[e._v("Save")]),e._v(" to apply all the changes")]),e._v(" "),t("li",[e._v("Click "),t("code",[e._v("Activate")]),e._v(" to enable the plugin. Congrats, the configuration is now complete!")])]),e._v(" "),t("p",[e._v("Now your BTCPay Server is connected to your nopCommerce successfully.")]),e._v(" "),t("h2",{attrs:{id:"support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[e._v("#")]),e._v(" Support")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")]),e._v(" "),t("p",[e._v("If you experience a bug please "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpay-nopCommerce-plugin/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("open a bug report"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"license"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[e._v("#")]),e._v(" License")]),e._v(" "),t("p",[e._v("This plugin is released under the "),t("a",{attrs:{href:"https://github.com/btcpayserver/nopcommerce/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[e._v("MIT License"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("The non-profit "),t("a",{attrs:{href:"https://btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Foundation"),t("OutboundLink")],1),e._v(" is committed to keeping this powerful payment plugin free forever. Our mission is to enable anyone to accept bitcoin regardless of financial, technical, social or political barriers.")]),e._v(" "),t("hr")])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/155.76bdfde2.js b/assets/js/155.82d8cd18.js similarity index 97% rename from assets/js/155.76bdfde2.js rename to assets/js/155.82d8cd18.js index aadcf530cb..86a2597681 100644 --- a/assets/js/155.76bdfde2.js +++ b/assets/js/155.82d8cd18.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[155],{865:function(t,e,r){"use strict";r.r(e);var o=r(17),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-server-nip05-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-nip05-support"}},[t._v("#")]),t._v(" BTCPay Server NIP05 Support")]),t._v(" "),e("p",[t._v("This plugin allows your BTCPay Server to support")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://github.com/nostr-protocol/nostr",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nostr"),e("OutboundLink")],1),e("a",{attrs:{href:"https://github.com/nostr-protocol/nips/blob/master/05.md",target:"_blank",rel:"noopener noreferrer"}},[t._v(" NIP05 protocol"),e("OutboundLink")],1),t._v(" to verify accounts.")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/nostr-protocol/nostr",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nostr"),e("OutboundLink")],1),e("a",{attrs:{href:"https://github.com/nostr-protocol/nips/blob/master/57.md",target:"_blank",rel:"noopener noreferrer"}},[t._v(" NIP57 protocol"),e("OutboundLink")],1),t._v(" to support Zaps.")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/nostr-protocol/nostr",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nostr"),e("OutboundLink")],1),e("a",{attrs:{href:"https://github.com/nostr-protocol/nips/blob/master/47.md",target:"_blank",rel:"noopener noreferrer"}},[t._v(" NIP47 protocol"),e("OutboundLink")],1),t._v(" to accept payments to your NWC enabled lightning wallet.")])]),t._v(" "),e("h2",{attrs:{id:"usage"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("Install the plugin")])]),t._v(" "),e("li",[e("p",[t._v('On a store you have owner access to, click on the new "Nostr" side navigation menu item')])]),t._v(" "),e("li",[e("p",[t._v("Specify a name and public key.\nNOTE: You will not be able to select the same name across different stores. The public key is in hex format and not "),e("code",[t._v("npub...")]),t._v(" ("),e("a",{attrs:{href:"https://nostrcheck.me/converter/",target:"_blank",rel:"noopener noreferrer"}},[t._v("convert here"),e("OutboundLink")],1),t._v(")")])]),t._v(" "),e("li",[e("p",[t._v("Optionally include a set of relays that you primarily use so that client can discover your events more easily.")])]),t._v(" "),e("li",[e("p",[t._v("Alternatively, you can import this data by using one of the Nostr browser extensions such as Alby or Nos2x")])])]),t._v(" "),e("p",[t._v("Your NIP5 handle will be "),e("code",[t._v("name@yourbtcpayserver.domain")]),t._v(". If you have multiple domains mapped to the same btcpayserver, they will all be valid.")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[155],{864:function(t,e,r){"use strict";r.r(e);var o=r(17),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-server-nip05-support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-nip05-support"}},[t._v("#")]),t._v(" BTCPay Server NIP05 Support")]),t._v(" "),e("p",[t._v("This plugin allows your BTCPay Server to support")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://github.com/nostr-protocol/nostr",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nostr"),e("OutboundLink")],1),e("a",{attrs:{href:"https://github.com/nostr-protocol/nips/blob/master/05.md",target:"_blank",rel:"noopener noreferrer"}},[t._v(" NIP05 protocol"),e("OutboundLink")],1),t._v(" to verify accounts.")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/nostr-protocol/nostr",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nostr"),e("OutboundLink")],1),e("a",{attrs:{href:"https://github.com/nostr-protocol/nips/blob/master/57.md",target:"_blank",rel:"noopener noreferrer"}},[t._v(" NIP57 protocol"),e("OutboundLink")],1),t._v(" to support Zaps.")]),t._v(" "),e("li",[e("a",{attrs:{href:"https://github.com/nostr-protocol/nostr",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nostr"),e("OutboundLink")],1),e("a",{attrs:{href:"https://github.com/nostr-protocol/nips/blob/master/47.md",target:"_blank",rel:"noopener noreferrer"}},[t._v(" NIP47 protocol"),e("OutboundLink")],1),t._v(" to accept payments to your NWC enabled lightning wallet.")])]),t._v(" "),e("h2",{attrs:{id:"usage"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),e("ul",[e("li",[e("p",[t._v("Install the plugin")])]),t._v(" "),e("li",[e("p",[t._v('On a store you have owner access to, click on the new "Nostr" side navigation menu item')])]),t._v(" "),e("li",[e("p",[t._v("Specify a name and public key.\nNOTE: You will not be able to select the same name across different stores. The public key is in hex format and not "),e("code",[t._v("npub...")]),t._v(" ("),e("a",{attrs:{href:"https://nostrcheck.me/converter/",target:"_blank",rel:"noopener noreferrer"}},[t._v("convert here"),e("OutboundLink")],1),t._v(")")])]),t._v(" "),e("li",[e("p",[t._v("Optionally include a set of relays that you primarily use so that client can discover your events more easily.")])]),t._v(" "),e("li",[e("p",[t._v("Alternatively, you can import this data by using one of the Nostr browser extensions such as Alby or Nos2x")])])]),t._v(" "),e("p",[t._v("Your NIP5 handle will be "),e("code",[t._v("name@yourbtcpayserver.domain")]),t._v(". If you have multiple domains mapped to the same btcpayserver, they will all be valid.")])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/156.5360e1f0.js b/assets/js/156.a35a7351.js similarity index 99% rename from assets/js/156.5360e1f0.js rename to assets/js/156.a35a7351.js index f605405f3d..96ea6f72fe 100644 --- a/assets/js/156.5360e1f0.js +++ b/assets/js/156.a35a7351.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[156],{867:function(t,e,o){"use strict";o.r(e);var a=o(17),r=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-server-payment-gateway-for-odoo-17"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-payment-gateway-for-odoo-17"}},[t._v("#")]),t._v(" BTCPay Server payment gateway for Odoo 17")]),t._v(" "),e("h2",{attrs:{id:"this-is-the-module-to-connect-odoo-17-and-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#this-is-the-module-to-connect-odoo-17-and-btcpay-server"}},[t._v("#")]),t._v(" This is the module to connect Odoo 17 and BTCPay Server")]),t._v(" "),e("p",[t._v("This module allows you to accept bitcoin (and other cryptocurrency) payments in your Odoo e-commerce store."),e("br"),t._v(" "),e("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/odoo/17.0/payment_btcpayserver/static/description/BTCPay-Odoo-17-featured.png",alt:"BTCPay Server Banner",title:"BTCPay Server Banner"}})]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you use Odoo 16 you can find the documentation "),e("a",{attrs:{href:"https://github.com/btcpayserver/odoo/blob/16.0/payment_btcpayserver/README.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("h2",{attrs:{id:"install-the-module"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-the-module"}},[t._v("#")]),t._v(" Install the module")]),t._v(" "),e("ul",[e("li",[t._v("Clone our "),e("a",{attrs:{href:"https://github.com/btcpayserver/odoo",target:"_blank",rel:"noopener noreferrer"}},[t._v("repository"),e("OutboundLink")],1),t._v(" or download the .zip from the "),e("a",{attrs:{href:"https://github.com/btcpayserver/odoo/releases",target:"_blank",rel:"noopener noreferrer"}},[t._v("releases page"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Make sure you are on branch "),e("code",[t._v("17.0")]),t._v(" or downloaded a release tagged with version v17.x")]),t._v(" "),e("li",[t._v("Place the "),e("code",[t._v("payment_btcpayserver")]),t._v(" directory in your Odoo addons directory")]),t._v(" "),e("li",[t._v("Install dependencies by running "),e("code",[t._v("pip install -r requirements.txt")]),t._v(" (from inside the "),e("code",[t._v("payment_btcpayserver")]),t._v(" directory)")]),t._v(" "),e("li",[t._v("Restart Odoo")]),t._v(" "),e("li",[t._v("Go to Apps -> Update Apps List")]),t._v(" "),e("li",[t._v('Remove the "Apps" filter and search for "btcpay"')]),t._v(" "),e("li",[t._v("Click "),e("strong",[t._v("Activate")]),t._v(" button")])]),t._v(" "),e("h2",{attrs:{id:"configure-btcpay-as-payment-provider"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configure-btcpay-as-payment-provider"}},[t._v("#")]),t._v(" Configure BTCPay as payment provider")]),t._v(" "),e("ul",[e("li",[t._v("Go to "),e("strong",[t._v("Website")]),t._v(" -> "),e("strong",[t._v("Configuration")]),t._v(" -> "),e("strong",[t._v("Payment Providers")])]),t._v(" "),e("li",[t._v("Search for BTCPay and click on button "),e("strong",[t._v("Activate")])])]),t._v(" "),e("p",[t._v('In the BTCPay settings form, tab "Credentials":')]),t._v(" "),e("ul",[e("li",[t._v('Set field "State" to enabled')]),t._v(" "),e("li",[t._v('Set field "BTCPay Server URL" as test or live URL including https://. Example URL: https://testnet.demo.btcpayserver.org')]),t._v(" "),e("li",[t._v("Get a pairing code from your BTCPay Server store: Settings -> Access Tokens\n"),e("ul",[e("li",[t._v('Click on "Create Token" button')]),t._v(" "),e("li",[t._v('Label: enter e.g. "My odoo store"')]),t._v(" "),e("li",[t._v("Public Key: leave empty")]),t._v(" "),e("li",[t._v('Click on "Request Pairing" button, on next page click "Approve" button')]),t._v(" "),e("li",[t._v('At the top copy the code next to "Server initiated pairing code", e.g. "hg7z8wN"')])])]),t._v(" "),e("li",[t._v('Back in Odoo, paste the code into "Pairing Code" field')]),t._v(" "),e("li",[t._v("Hit Tab key on your keyboard (or click on another field) and the pairing process will start automatically")]),t._v(" "),e("li",[t._v('When the pairing is successful the "Token" and "Private Key" field will be filled automatically')]),t._v(" "),e("li",[t._v("Field Facade, keep default 'merchant'.")])]),t._v(" "),e("p",[t._v('On the tab "Configuration":')]),t._v(" "),e("ul",[e("li",[t._v('Make sure field "Payment Journal" is set to "Bank", otherwise you can click the dropdown and click on the suggestion "Bank"')]),t._v(" "),e("li",[t._v("Now you can "),e("strong",[t._v("save")]),t._v(" the settings")])]),t._v(" "),e("p",[t._v("Check the payment method is enabled:")]),t._v(" "),e("ul",[e("li",[t._v("Go to "),e("strong",[t._v("Website")]),t._v(" -> "),e("strong",[t._v("Configuration")]),t._v(" -> "),e("strong",[t._v("Payment Methods")])]),t._v(" "),e("li",[t._v('Make sure "Pay with Bitcoin / Lightning Network" is active')])]),t._v(" "),e("p",[t._v("Congrats, all done. Do some testing to be sure all works.")]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/odoo/17.0/payment_btcpayserver/static/description/BTCPayPaymentSettings.png",alt:"Payment Provider Settings",title:"Payment Provider Settings"}})]),t._v(" "),e("h2",{attrs:{id:"how-does-the-payment-page-look"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-does-the-payment-page-look"}},[t._v("#")]),t._v(" How does the payment page look?")]),t._v(" "),e("p",[t._v('During the checkout the customers will have the option to select the payment method "Pay with Bitcoin / Lightning Network". After selecting they will be redirected to the BTCPay checkout page as shown below.')]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/odoo/17.0/payment_btcpayserver/static/description/BTCPayLooksLike.png",alt:"Checkout page example",title:"Checkout page example"}})]),t._v(" "),e("h2",{attrs:{id:"transaction-btcpay-details"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transaction-btcpay-details"}},[t._v("#")]),t._v(" Transaction BTCPay Details")]),t._v(" "),e("p",[t._v("In transaction object, you will find more technical information about this method of payment:")]),t._v(" "),e("ul",[e("li",[t._v("Transaction Id: cryptocurrency transaction hash for the executed payout")]),t._v(" "),e("li",[t._v("Invoice Id: the id of the invoice for which you want to fetch an event token")]),t._v(" "),e("li",[t._v("Transaction Status: That indicates state of transaction")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/odoo/17.0/payment_btcpayserver/static/description/BtcpayTxDetails.png",alt:"Transaction details of BTCPay",title:"Transaction details of BTCPay"}})]),t._v(" "),e("h2",{attrs:{id:"troubleshooting"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[t._v("#")]),t._v(" Troubleshooting")]),t._v(" "),e("h3",{attrs:{id:"the-order-and-transaction-status-does-not-get-updated-to-paid-"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-order-and-transaction-status-does-not-get-updated-to-paid-"}},[t._v("#")]),t._v(' The order and transaction status does not get updated to "paid"')]),t._v(" "),e("p",[t._v("If the BTCPay connection generally works, like redirect to BTCPay checkout page (QR-code) then check your odoo logs and make sure PDF generation generally works. If there are errors mentioning wkhtmltopdf then you need to install "),e("code",[t._v("wkhtmltopdf")]),t._v(" on your server.")])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[156],{866:function(t,e,o){"use strict";o.r(e);var a=o(17),r=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-server-payment-gateway-for-odoo-17"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-payment-gateway-for-odoo-17"}},[t._v("#")]),t._v(" BTCPay Server payment gateway for Odoo 17")]),t._v(" "),e("h2",{attrs:{id:"this-is-the-module-to-connect-odoo-17-and-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#this-is-the-module-to-connect-odoo-17-and-btcpay-server"}},[t._v("#")]),t._v(" This is the module to connect Odoo 17 and BTCPay Server")]),t._v(" "),e("p",[t._v("This module allows you to accept bitcoin (and other cryptocurrency) payments in your Odoo e-commerce store."),e("br"),t._v(" "),e("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/odoo/17.0/payment_btcpayserver/static/description/BTCPay-Odoo-17-featured.png",alt:"BTCPay Server Banner",title:"BTCPay Server Banner"}})]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you use Odoo 16 you can find the documentation "),e("a",{attrs:{href:"https://github.com/btcpayserver/odoo/blob/16.0/payment_btcpayserver/README.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(".")])]),t._v(" "),e("h2",{attrs:{id:"install-the-module"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#install-the-module"}},[t._v("#")]),t._v(" Install the module")]),t._v(" "),e("ul",[e("li",[t._v("Clone our "),e("a",{attrs:{href:"https://github.com/btcpayserver/odoo",target:"_blank",rel:"noopener noreferrer"}},[t._v("repository"),e("OutboundLink")],1),t._v(" or download the .zip from the "),e("a",{attrs:{href:"https://github.com/btcpayserver/odoo/releases",target:"_blank",rel:"noopener noreferrer"}},[t._v("releases page"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Make sure you are on branch "),e("code",[t._v("17.0")]),t._v(" or downloaded a release tagged with version v17.x")]),t._v(" "),e("li",[t._v("Place the "),e("code",[t._v("payment_btcpayserver")]),t._v(" directory in your Odoo addons directory")]),t._v(" "),e("li",[t._v("Install dependencies by running "),e("code",[t._v("pip install -r requirements.txt")]),t._v(" (from inside the "),e("code",[t._v("payment_btcpayserver")]),t._v(" directory)")]),t._v(" "),e("li",[t._v("Restart Odoo")]),t._v(" "),e("li",[t._v("Go to Apps -> Update Apps List")]),t._v(" "),e("li",[t._v('Remove the "Apps" filter and search for "btcpay"')]),t._v(" "),e("li",[t._v("Click "),e("strong",[t._v("Activate")]),t._v(" button")])]),t._v(" "),e("h2",{attrs:{id:"configure-btcpay-as-payment-provider"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configure-btcpay-as-payment-provider"}},[t._v("#")]),t._v(" Configure BTCPay as payment provider")]),t._v(" "),e("ul",[e("li",[t._v("Go to "),e("strong",[t._v("Website")]),t._v(" -> "),e("strong",[t._v("Configuration")]),t._v(" -> "),e("strong",[t._v("Payment Providers")])]),t._v(" "),e("li",[t._v("Search for BTCPay and click on button "),e("strong",[t._v("Activate")])])]),t._v(" "),e("p",[t._v('In the BTCPay settings form, tab "Credentials":')]),t._v(" "),e("ul",[e("li",[t._v('Set field "State" to enabled')]),t._v(" "),e("li",[t._v('Set field "BTCPay Server URL" as test or live URL including https://. Example URL: https://testnet.demo.btcpayserver.org')]),t._v(" "),e("li",[t._v("Get a pairing code from your BTCPay Server store: Settings -> Access Tokens\n"),e("ul",[e("li",[t._v('Click on "Create Token" button')]),t._v(" "),e("li",[t._v('Label: enter e.g. "My odoo store"')]),t._v(" "),e("li",[t._v("Public Key: leave empty")]),t._v(" "),e("li",[t._v('Click on "Request Pairing" button, on next page click "Approve" button')]),t._v(" "),e("li",[t._v('At the top copy the code next to "Server initiated pairing code", e.g. "hg7z8wN"')])])]),t._v(" "),e("li",[t._v('Back in Odoo, paste the code into "Pairing Code" field')]),t._v(" "),e("li",[t._v("Hit Tab key on your keyboard (or click on another field) and the pairing process will start automatically")]),t._v(" "),e("li",[t._v('When the pairing is successful the "Token" and "Private Key" field will be filled automatically')]),t._v(" "),e("li",[t._v("Field Facade, keep default 'merchant'.")])]),t._v(" "),e("p",[t._v('On the tab "Configuration":')]),t._v(" "),e("ul",[e("li",[t._v('Make sure field "Payment Journal" is set to "Bank", otherwise you can click the dropdown and click on the suggestion "Bank"')]),t._v(" "),e("li",[t._v("Now you can "),e("strong",[t._v("save")]),t._v(" the settings")])]),t._v(" "),e("p",[t._v("Check the payment method is enabled:")]),t._v(" "),e("ul",[e("li",[t._v("Go to "),e("strong",[t._v("Website")]),t._v(" -> "),e("strong",[t._v("Configuration")]),t._v(" -> "),e("strong",[t._v("Payment Methods")])]),t._v(" "),e("li",[t._v('Make sure "Pay with Bitcoin / Lightning Network" is active')])]),t._v(" "),e("p",[t._v("Congrats, all done. Do some testing to be sure all works.")]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/odoo/17.0/payment_btcpayserver/static/description/BTCPayPaymentSettings.png",alt:"Payment Provider Settings",title:"Payment Provider Settings"}})]),t._v(" "),e("h2",{attrs:{id:"how-does-the-payment-page-look"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-does-the-payment-page-look"}},[t._v("#")]),t._v(" How does the payment page look?")]),t._v(" "),e("p",[t._v('During the checkout the customers will have the option to select the payment method "Pay with Bitcoin / Lightning Network". After selecting they will be redirected to the BTCPay checkout page as shown below.')]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/odoo/17.0/payment_btcpayserver/static/description/BTCPayLooksLike.png",alt:"Checkout page example",title:"Checkout page example"}})]),t._v(" "),e("h2",{attrs:{id:"transaction-btcpay-details"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transaction-btcpay-details"}},[t._v("#")]),t._v(" Transaction BTCPay Details")]),t._v(" "),e("p",[t._v("In transaction object, you will find more technical information about this method of payment:")]),t._v(" "),e("ul",[e("li",[t._v("Transaction Id: cryptocurrency transaction hash for the executed payout")]),t._v(" "),e("li",[t._v("Invoice Id: the id of the invoice for which you want to fetch an event token")]),t._v(" "),e("li",[t._v("Transaction Status: That indicates state of transaction")])]),t._v(" "),e("figure",[e("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/odoo/17.0/payment_btcpayserver/static/description/BtcpayTxDetails.png",alt:"Transaction details of BTCPay",title:"Transaction details of BTCPay"}})]),t._v(" "),e("h2",{attrs:{id:"troubleshooting"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[t._v("#")]),t._v(" Troubleshooting")]),t._v(" "),e("h3",{attrs:{id:"the-order-and-transaction-status-does-not-get-updated-to-paid-"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#the-order-and-transaction-status-does-not-get-updated-to-paid-"}},[t._v("#")]),t._v(' The order and transaction status does not get updated to "paid"')]),t._v(" "),e("p",[t._v("If the BTCPay connection generally works, like redirect to BTCPay checkout page (QR-code) then check your odoo logs and make sure PDF generation generally works. If there are errors mentioning wkhtmltopdf then you need to install "),e("code",[t._v("wkhtmltopdf")]),t._v(" on your server.")])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/157.9452af5e.js b/assets/js/157.9452af5e.js new file mode 100644 index 0000000000..b2d995511b --- /dev/null +++ b/assets/js/157.9452af5e.js @@ -0,0 +1 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[157],{871:function(e,a,t){"use strict";t.r(a);var i=t(17),n=Object(i.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"payroll-plugin-for-btcpay-server"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#payroll-plugin-for-btcpay-server"}},[e._v("#")]),e._v(" Payroll Plugin for BTCPay Server")]),e._v(" "),a("p",[e._v("The Payroll Plugin for BTCPay Server aims to streamline the payroll process by providing an easy-to-use interface for uploading invoices and facilitating payments.\nThis plugin enables administrators to manage payroll users, inspect invoices, and initiate payments seamlessly within the BTCPay Server.")]),e._v(" "),a("h2",{attrs:{id:"usage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),a("ul",[a("li",[e._v("Install the plugin from the BTCPay Server > Settings > Plugin > Available Plugins, and restart")])]),e._v(" "),a("figure",[a("img",{attrs:{src:"https://github.com/btcpayserver/btcpayserver/assets/47084273/a918ff08-7444-4b69-a2ca-b75e38f19bcc",alt:"Payroll Plugin",title:"Payroll Plugin"}})]),e._v(" "),a("ul",[a("li",[e._v("Once done, you'll see the Payroll plugin listed under plugins in the left sidebar of BTCPay Server")]),e._v(" "),a("li",[e._v("You can create a payroll user for each person that needs access to the system. It is recommended that you generate strong passwords and share the Invoice Upload Link (under the Options button) with the respective users")]),e._v(" "),a("li",[e._v("To do that click on the manage users button on the top right, then click on the create user button.")])]),e._v(" "),a("figure",[a("img",{attrs:{src:"https://github.com/btcpayserver/btcpayserver/assets/47084273/629e0d3d-db67-489a-baa1-c7b2eb11932a",alt:"Manage User",title:"Manage User"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:"https://github.com/btcpayserver/btcpayserver/assets/47084273/9d27aa5e-f187-4b58-b758-320125be277f",alt:"Create User",title:"Create User"}})]),e._v(" "),a("ul",[a("li",[e._v("In addition to Name and Email, be sure to supply a strong password.")]),e._v(" "),a("li",[e._v("As an admin, you can upload invoices manually on behalf of users by going to the Payroll Invoice section and clicking on admin upload invoice.")]),e._v(" "),a("li",[e._v("To allow users to log in and upload their own invoice, the admin MUST supply the Invoice Upload Link. Users do NOT receive automated emails, and CANNOT log into the main BTCPay site (only to the aforementioned plugin link).")])]),e._v(" "),a("figure",[a("img",{attrs:{src:"https://github.com/btcpayserver/btcpayserver/assets/47084273/f654d1f7-4114-4b46-8f3e-b9410cec95ed",alt:"Share Invoice upload link",title:"Share Invoice upload link"}})]),e._v(" "),a("ul",[a("li",[e._v("Once invoices are uploaded, the admin has the ability to pay the invoice(s), download invoice(s), and also mark an invoice as paid, if it has been initially signed off my the admin.")]),e._v(" "),a("li",[e._v("When an admin clicks on pay invoice, it takes them to a Bitcoin wallet with a prepopulated Send dialog (the amount of Bitcoin is calculated automatically, based on current conversion rates)")]),e._v(" "),a("li",[e._v("The admin can then sign the generated transaction and broadcast it.")]),e._v(" "),a("li",[e._v("Once the transaction is confirmed on the blockchain, the payroll invoice state will be updated to Completed")]),e._v(" "),a("li",[e._v("The admin can also manage payroll users. The admin can do all of the following:\n"),a("ul",[a("li",[e._v("An admin can reset passwords for users")]),e._v(" "),a("li",[e._v("An admin can disable/activate payroll users")]),e._v(" "),a("li",[e._v("An admin can edit payroll users")]),e._v(" "),a("li",[e._v("An admin can also download invoices belonging to a particular user")])])])]),e._v(" "),a("h2",{attrs:{id:"contributing-to-plugin-development"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#contributing-to-plugin-development"}},[e._v("#")]),e._v(" Contributing to plugin development")]),e._v(" "),a("p",[e._v("This documentation is a work in progress. You can contribute by improving it.")]),e._v(" "),a("p",[e._v("Also, a list of open issues is maintained on: https://github.com/rockstardev/BTCPayServerPlugins.RockstarDev/issues?q=is%3Aissue+is%3Aopen+label%3Apayroll")]),e._v(" "),a("p",[e._v("If the issue is not assigned to anyone, feel free to pick it up and open a PR")]),e._v(" "),a("h2",{attrs:{id:"license"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[e._v("#")]),e._v(" License")]),e._v(" "),a("p",[e._v("https://github.com/rockstardev/BTCPayServerPlugins.RockstarDev/blob/master/LICENSE")])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/157.cd5cf560.js b/assets/js/157.cd5cf560.js deleted file mode 100644 index efd14f55eb..0000000000 --- a/assets/js/157.cd5cf560.js +++ /dev/null @@ -1 +0,0 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[157],{873:function(e,a,t){"use strict";t.r(a);var i=t(17),n=Object(i.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"payroll-plugin-for-btcpay-server"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#payroll-plugin-for-btcpay-server"}},[e._v("#")]),e._v(" Payroll Plugin for BTCPay Server")]),e._v(" "),a("p",[e._v("The Payroll Plugin for BTCPay Server aims to streamline the payroll process by providing an easy-to-use interface for uploading invoices and facilitating payments.\nThis plugin enables administrators to manage payroll users, inspect invoices, and initiate payments seamlessly within the BTCPay Server.")]),e._v(" "),a("h2",{attrs:{id:"usage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),a("ul",[a("li",[e._v("Install the plugin from the BTCPay Server > Settings > Plugin > Available Plugins, and restart")])]),e._v(" "),a("figure",[a("img",{attrs:{src:"https://github.com/btcpayserver/btcpayserver/assets/47084273/a918ff08-7444-4b69-a2ca-b75e38f19bcc",alt:"Payroll Plugin",title:"Payroll Plugin"}})]),e._v(" "),a("ul",[a("li",[a("p",[e._v("Once done, you'll see the Payroll plugin listed under plugins in the left sidebar of BTCPay Server")])]),e._v(" "),a("li",[a("p",[e._v("You can create a payroll user for each person that needs access to the system. It is recommended that you generate strong passwords and share the login link with the respective users")])]),e._v(" "),a("li",[a("p",[e._v("To do that click on the manage users button on the top right, then click on the create user button.")])])]),e._v(" "),a("figure",[a("img",{attrs:{src:"https://github.com/btcpayserver/btcpayserver/assets/47084273/629e0d3d-db67-489a-baa1-c7b2eb11932a",alt:"Manage User",title:"Manage User"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:"https://github.com/btcpayserver/btcpayserver/assets/47084273/9d27aa5e-f187-4b58-b758-320125be277f",alt:"Create User",title:"Create User"}})]),e._v(" "),a("ul",[a("li",[e._v("Do well to fill in the form with the appropriate information, and also with a strong password.")]),e._v(" "),a("li",[e._v("As an admin, you can go ahead and upload invoices manually for users by going to the Payroll Invoice section and clicking on admin upload invoice.")]),e._v(" "),a("li",[e._v("The admin can share links to the invoice page with users, allowing users to log in and manually upload their invoice.")])]),e._v(" "),a("figure",[a("img",{attrs:{src:"https://github.com/btcpayserver/btcpayserver/assets/47084273/f654d1f7-4114-4b46-8f3e-b9410cec95ed",alt:"Share Invoice upload link",title:"Share Invoice upload link"}})]),e._v(" "),a("ul",[a("li",[e._v("Once invoices are uploaded, the admin has the ability to pay the invoice(s), download invoice(s), and also mark an invoice as paid, if it has been initially signed off my the admin.")]),e._v(" "),a("li",[e._v("When an admin clicks on pay invoice, it takes them to a Bitcoin wallet with a prepopulated Send dialog (the amount of Bitcoin is calculated automatically, based on current conversion rates)")]),e._v(" "),a("li",[e._v("The admin can then sign the generated transaction and broadcast it.")]),e._v(" "),a("li",[e._v("Once the transaction is confirmed on the blockchain, the payroll invoice state will be updated to Completed")]),e._v(" "),a("li",[e._v("The admin can also manage payroll users. The admin can do all of the following:\n"),a("ul",[a("li",[e._v("An admin can reset passwords for users")]),e._v(" "),a("li",[e._v("An admin can disable/activate payroll users")]),e._v(" "),a("li",[e._v("An admin can edit payroll users")]),e._v(" "),a("li",[e._v("An admin can also download invoices belonging to a particular user")])])])]),e._v(" "),a("h2",{attrs:{id:"contributing-to-plugin-development"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#contributing-to-plugin-development"}},[e._v("#")]),e._v(" Contributing to plugin development")]),e._v(" "),a("p",[e._v("This documentation is a work in progress. You can contribute by improving it.\nAlso, a list of open issues is maintained on: https://github.com/rockstardev/BTCPayServerPlugins.RockstarDev/issues?q=is%3Aissue+is%3Aopen+label%3Apayroll\nIf the issue is not assigned to anyone, feel free to pick it up and open a PR")]),e._v(" "),a("h2",{attrs:{id:"license"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[e._v("#")]),e._v(" License")]),e._v(" "),a("p",[e._v("https://github.com/rockstardev/BTCPayServerPlugins.RockstarDev/blob/master/LICENSE")])])}),[],!1,null,null,null);a.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/158.5a547443.js b/assets/js/158.e52a4150.js similarity index 96% rename from assets/js/158.5a547443.js rename to assets/js/158.e52a4150.js index 26de88d93c..f4fb260f9a 100644 --- a/assets/js/158.5a547443.js +++ b/assets/js/158.e52a4150.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[158],{872:function(t,a,o){"use strict";o.r(a);var n=o(17),r=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"phoca-cart-integration-for-joomla-4-and-5"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#phoca-cart-integration-for-joomla-4-and-5"}},[t._v("#")]),t._v(" Phoca Cart integration for Joomla 4 and 5")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Please be aware that this integration is not maintained by the BTCPay Server team. If you have any questions, please go to their "),a("a",{attrs:{href:"https://github.com/Jacquesvw/PhocaCart-BtcpayServer-Plugin/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub issues"),a("OutboundLink")],1),t._v(" to report a problem or get support.")])]),t._v(" "),a("h2",{attrs:{id:"installation-instructions-and-download"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-instructions-and-download"}},[t._v("#")]),t._v(" Installation instructions and download")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/Jacquesvw/PhocaCart-BtcpayServer-Plugin/blob/main/docs/INSTRUCTIONS.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Installation instructions on GitHub"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/Jacquesvw/PhocaCart-BtcpayServer-Plugin",target:"_blank",rel:"noopener noreferrer"}},[t._v("Download from GitHub"),a("OutboundLink")],1),t._v(" or")]),t._v(" "),a("li",[t._v("Install via "),a("a",{attrs:{href:"https://extensions.joomla.org/extension/phoca-cart-btcpay/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Joomla Extension Manager"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[158],{873:function(t,a,o){"use strict";o.r(a);var n=o(17),r=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"phoca-cart-integration-for-joomla-4-and-5"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#phoca-cart-integration-for-joomla-4-and-5"}},[t._v("#")]),t._v(" Phoca Cart integration for Joomla 4 and 5")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Please be aware that this integration is not maintained by the BTCPay Server team. If you have any questions, please go to their "),a("a",{attrs:{href:"https://github.com/Jacquesvw/PhocaCart-BtcpayServer-Plugin/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub issues"),a("OutboundLink")],1),t._v(" to report a problem or get support.")])]),t._v(" "),a("h2",{attrs:{id:"installation-instructions-and-download"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#installation-instructions-and-download"}},[t._v("#")]),t._v(" Installation instructions and download")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://github.com/Jacquesvw/PhocaCart-BtcpayServer-Plugin/blob/main/docs/INSTRUCTIONS.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("Installation instructions on GitHub"),a("OutboundLink")],1)]),t._v(" "),a("li",[a("a",{attrs:{href:"https://github.com/Jacquesvw/PhocaCart-BtcpayServer-Plugin",target:"_blank",rel:"noopener noreferrer"}},[t._v("Download from GitHub"),a("OutboundLink")],1),t._v(" or")]),t._v(" "),a("li",[t._v("Install via "),a("a",{attrs:{href:"https://extensions.joomla.org/extension/phoca-cart-btcpay/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Joomla Extension Manager"),a("OutboundLink")],1)])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/159.a6c444d9.js b/assets/js/159.39a96ad8.js similarity index 90% rename from assets/js/159.a6c444d9.js rename to assets/js/159.39a96ad8.js index b6831c1ac3..af64b2ed4b 100644 --- a/assets/js/159.a6c444d9.js +++ b/assets/js/159.39a96ad8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[159],{877:function(t,a,r){"use strict";r.r(a);var l=r(17),e=Object(l.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("div",{staticClass:"topics"},[a("h3",[t._v("Explore by topic")]),t._v(" "),a("ul",[a("li",[a("RouterLink",{attrs:{to:"/Guide/"}},[t._v("What is BTCPay Server")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/UseCase/"}},[t._v("Why BTCPay Server")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/TryItOut/"}},[t._v("How to deploy BTCPay Server")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/WalletSetup/"}},[t._v("Wallet Setup")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/Conference-PoS-guide/"}},[t._v("How to setup POS")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[t._v("Greenfield API")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/FAQ/"}},[t._v("Frequently Asked Questions"),a("br"),t._v("and Common Issues")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/Contribute/"}},[t._v("How to contribute to BTCPay Server")])],1)])]),t._v(" "),a("svg",{attrs:{width:"0",height:"0",xmlns:"http://www.w3.org/2000/svg"}},[a("defs",[a("linearGradient",{attrs:{id:"spiral-gradient",x1:"81.36",y1:"311.35",x2:"541.35",y2:"311.35",gradientUnits:"userSpaceOnUse"}},[a("stop",{attrs:{offset:".18","stop-color":"#00f"}}),a("stop",{attrs:{offset:"1","stop-color":"#f0f"}})],1),t._v(" "),a("radialGradient",{attrs:{id:"acinq-a",cx:"47.833",cy:"51.834",r:"56.832"}},[a("stop",{attrs:{offset:"0","stop-color":"#fff"}}),a("stop",{attrs:{offset:"1","stop-color":"#fff","stop-opacity":"0"}})],1)],1),t._v(" "),a("symbol",{attrs:{id:"supporter-spiral",viewBox:"0 0 629 629"}},[a("path",{attrs:{d:"M326.4 572.09C201.2 572.09 141 503 112.48 445c-28.22-57.53-30.59-114.56-30.79-122.69-4.85-77 41-231.78 249.58-271.2a28.05 28.05 0 0 1 10.41 55.13c-213.12 40.28-204.44 206-204 213 0 .53.06 1.06.07 1.6.15 7.9 5.1 195.16 188.65 195.16 68.34 0 116.6-29.4 143.6-87.37 24.48-52.74 19.29-112.45-13.52-155.83-22.89-30.27-52.46-45-90.38-45-34.46 0-63.47 9.88-86.21 29.37A91.5 91.5 0 0 0 248 322.3c-1.41 25.4 7.14 49.36 24.07 67.49C287.27 406 305 413.9 326.4 413.9c27.46 0 45.52-9 53.66-26.81 8.38-18.3 3.61-38.93-.19-43.33-9.11-10-18.69-13.68-22.48-13-2.53.43-5.78 4.61-8.48 10.92a28 28 0 0 1-51.58-22c14.28-33.44 37.94-42 50.76-44.2 24.78-4.18 52.17 7.3 73.34 30.65s25.51 68.55 10.15 103.22C421.54 432 394.52 470 326.4 470c-36.72 0-69.67-14.49-95.29-41.92-27.47-29.4-41.34-68.08-39.11-108.89a149.1 149.1 0 0 1 51.31-104.6c33.19-28.45 74.48-42.87 122.71-42.87 55.12 0 101.85 23.25 135.12 67.23 45.36 60 52.9 141.71 19.66 213.3-25.35 54.67-79.68 119.84-194.4 119.84Z",fill:"url(#spiral-gradient)"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-bailliegifford",viewBox:"0 0 252.875 70.249"}},[a("path",{staticStyle:{fill:"var(--btcpay-body-text)","fill-opacity":"1",stroke:"var(--btcpay-body-text)","stroke-opacity":"1"},attrs:{d:"M366.764 291.907h4.554l-5.046 12.789h-4.553zM377.541 302.546h4.675l-.849 2.15h-9.229l5.046-12.789h4.554zM389.988 302.546h4.676l-.849 2.15h-9.229l5.045-12.789h4.554zM403.079 291.907h4.554l-5.046 12.789h-4.553zM418.795 302.487l-.871 2.209h-9.471l5.046-12.789h9.397l-.871 2.209h-4.844l-1.139 2.887h4.457l-.826 2.093h-4.457l-1.338 3.391zM445.115 294.349a6.207 6.207 0 0 0-2.213-.407c-3.344 0-4.898 3.391-5.35 4.535-.682 1.725-1.15 3.469.277 4.147.49.232 1.135.252 1.402.252l1.186-3.004h-1.648l.795-2.015h5.766l-2.4 6.084c-1.66.523-3.16.95-5.268.95-4.748 0-6.602-2.732-5.109-6.511 1.566-3.973 5.77-6.647 10.566-6.647 1.842 0 2.971.33 3.777.62l-1.781 1.996zM453.309 291.907h4.554l-5.045 12.789h-4.554zM458.684 304.696l5.045-12.789h9.398l-.871 2.209h-4.844l-1.269 3.217h4.457l-.871 2.209h-4.458l-2.033 5.154zM472.639 304.696l5.047-12.789h9.398l-.871 2.209h-4.846l-1.269 3.217h4.459l-.873 2.209h-4.457l-2.034 5.154z",transform:"translate(-293.5 -262.775)"}}),a("path",{staticStyle:{fill:"var(--btcpay-body-text)","fill-opacity":"1","fill-rule":"evenodd",stroke:"var(--btcpay-body-text)","stroke-opacity":"1"},attrs:{d:"M335.139 302.643c.557 0 1.187 0 1.747-.252.576-.232 1.106-.717 1.489-1.686.336-.854.189-1.279-.211-1.492-.376-.213-1.006-.213-1.612-.213h-.63l-1.438 3.643h.655zm2.154-5.523c.46 0 .993 0 1.521-.232.496-.213.986-.659 1.33-1.531.283-.717.162-1.085-.181-1.259-.319-.175-.852-.175-1.409-.175h-.63l-1.262 3.198h.631v-.001zm2.832-5.213c1.187 0 2.578.097 3.531.504.954.407 1.47 1.124.966 2.403-.727 1.841-2.749 2.732-4.501 3.12.502.077 1.378.252 2.05.698.647.445 1.06 1.182.578 2.403-.443 1.124-1.742 2.636-4.352 3.294-.995.252-2.107.368-4.481.368h-4.651l5.045-12.79h5.815zM350.689 300.201h2.833l.017-3.605-2.85 3.605zm6.664-8.294.792 12.79h-4.651l-.017-2.597h-4.288l-2.066 2.597h-3.149l10.714-12.79h2.665zM492.998 302.875c.922 0 2.209-.504 3.793-4.515 1.451-3.682 1.238-4.612-.047-4.612-1.283 0-2.363.775-3.955 4.806-1.07 2.713-1.316 4.321.209 4.321zm4.59-11.143c3.561 0 6.08 1.841 4.299 6.356-1.482 3.759-4.936 6.802-9.707 6.802-4.555 0-5.779-2.791-4.295-6.55 1.65-4.185 5.635-6.608 9.703-6.608zM512.328 293.922l-1.469 3.721h.484c1.502 0 2.234-.445 2.793-1.86.582-1.473.25-1.86-1.324-1.86h-.484v-.001zm1.254-2.015c2.398 0 3.312.078 4.168.426.814.33 1.785 1.124 1.166 2.694-.58 1.473-2.047 2.732-4.277 3.353l1.916 6.317h-4.893l-.965-5.29h-.533l-2.088 5.29h-4.408l5.047-12.79h4.867zM528.418 293.961l-3.424 8.682h.387c1.115 0 2.955.368 4.906-4.573 1.619-4.108.264-4.108-1.385-4.108h-.484v-.001zm.811-2.054c2.254 0 4.336 0 5.549 1.163 1.461 1.396.748 3.818.334 4.864-.727 1.841-2.406 4.748-6.227 6.143-1.24.446-2.498.62-5.09.62h-4.166l5.047-12.79h4.553z","clip-rule":"evenodd",transform:"translate(-293.5 -262.775)"}}),a("path",{staticStyle:{fill:"var(--btcpay-body-text)","fill-opacity":"1",stroke:"var(--btcpay-body-text)","stroke-opacity":"1"},attrs:{d:"M294 297.4c0-19.399 57.138-35.125 127.624-35.125 62.064 0 113.781 12.192 125.251 28.35-13.078-12.792-58.92-22.238-113.465-22.238-64.731 0-117.206 13.303-117.206 29.714 0 16.411 52.474 29.715 117.206 29.715 47.799 0 88.914-7.254 107.154-17.656-18.555 13.09-64.812 22.364-118.941 22.364C351.138 332.524 294 316.799 294 297.4z",transform:"translate(-293.5 -262.775)"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-coincards",viewBox:"0 0 64 32"}},[a("g",{attrs:{fill:"none"}},[a("path",{attrs:{d:"M32.7 5.9c-.2-1-1.3-1.7-2.3-1.4L7.7 9.9c-1 .2-1.7 1.3-1.4 2.3l3.1 12.9c.2 1 1.3 1.7 2.3 1.4l22.7-5.4c1-.2 1.7-1.3 1.4-2.3L32.7 5.9Z",fill:"#EF8022"}}),a("path",{attrs:{d:"M12.6 30.3c-.2.2-.5.3-.7.3l.8.5c.9.6 2.1.4 2.7-.5l3.1-4.4-5.9 4.1ZM2.3 19.5l-1 1.4c-.6.9-.4 2.1.5 2.7L8.1 28l-5.8-8.5ZM12.9 8.1l7.2-5-2.7-1.9c-.9-.6-2.1-.4-2.7.5l-5 7.2 3.2-.8Z",fill:"#F9F185"}}),a("path",{attrs:{d:"M9.7 29.4c.6.9 1.8 1.1 2.7.5l6.7-4.6-7.4 1.8c-1.3.3-2.6-.5-2.9-1.8L6 13.5l-3.3 2.3c-.9.6-1.1 1.8-.5 2.7l7.5 10.9Zm4.5-21.6L25.9 5l-1.3-2c-.6-.9-1.8-1.1-2.7-.5l-7.7 5.3Z",fill:"#FFC214"}}),a("path",{attrs:{d:"M11.9 24.8c-.7 0-1.4-.5-1.7-1.1l-1.5-3.2 1.1 4.6c.2.6.7 1.1 1.4 1.1h.3l17-4.1-16.2 2.7h-.4Z",fill:"#FFC214"}}),a("path",{attrs:{d:"M16 17.5s-1.1 1.2-2.5 1.2c-1.7 0-2.6-1.4-2.6-2.8 0-1.3.9-2.7 2.6-2.7 1.3 0 2.3 1 2.3 1l1.1-1.7s-.6-.7-1.9-1.1v-1.2h-1.1v1h-.6v-1h-1.1v1.1c-2.2.5-3.7 2.4-3.7 4.7 0 2.4 1.5 4.2 3.7 4.7v1.2h1.1v-1h.6V22H15v-1.3c1.4-.4 2.1-1.3 2.1-1.3L16 17.5ZM21 13.7c2.1 0 3.8 1.4 3.8 3.6 0 2.1-1.7 3.5-3.8 3.5-2.1 0-3.8-1.4-3.8-3.5s1.7-3.6 3.8-3.6Zm0 5.2c.8 0 1.5-.6 1.5-1.6s-.7-1.7-1.5-1.7-1.5.6-1.5 1.7c0 1 .7 1.6 1.5 1.6Zm4.3-5h2.3v6.7h-2.3v-6.7Zm0-2.6h2.2v1.8h-2.2v-1.8Zm3.2 2.6h2.2v1c.3-.5 1-1.2 2.1-1.2 1.4 0 2.4.6 2.4 2.5v4.4h-2.3v-4c0-.6-.2-.9-.7-.9-.7 0-1.1.4-1.3 1-.1.3-.1.6-.1.9v3h-2.3v-6.7Z",fill:"#FFF"}}),a("path",{attrs:{d:"M39.3 13.9c1.7 0 2.5 1 2.5 1l-.6.9s-.7-.8-1.8-.8c-1.3 0-2.3 1-2.3 2.4 0 1.3 1 2.4 2.3 2.4 1.2 0 2-.9 2-.9l.5.9s-.9 1.1-2.6 1.1c-2.1 0-3.5-1.5-3.5-3.5-.1-2 1.4-3.5 3.5-3.5Zm6.8 2.6h.3v-.1c0-1.1-.6-1.5-1.5-1.5-1 0-1.8.6-1.8.6l-.5-.9s1-.8 2.5-.8c1.7 0 2.6.9 2.6 2.6v4.2h-1.2v-1.1s-.5 1.3-2.1 1.3c-1.1 0-2.3-.7-2.3-2 0-2.2 2.9-2.3 4-2.3Zm-1.4 3.3c1.1 0 1.8-1.1 1.8-2.1v-.2h-.3c-1 0-2.7.1-2.7 1.3-.1.5.3 1 1.2 1Zm3.8-5.8h1.2v1.7c.3-1 1.1-1.7 2.1-1.7h.3v1.3h-.4c-.8 0-1.6.6-1.9 1.6-.1.4-.2.8-.2 1.2v2.7h-1.3V14h.2Zm6.8-.1c1.5 0 2 1 2 1v-3.5h1.3v9.2h-1.2v-1s-.5 1.2-2.2 1.2c-1.8 0-2.9-1.4-2.9-3.5s1.3-3.4 3-3.4Zm.2 5.8c1 0 1.9-.7 1.9-2.4 0-1.2-.6-2.4-1.9-2.4-1 0-1.9.9-1.9 2.4s.8 2.4 1.9 2.4Zm4.2-.8s.7.8 1.9.8c.5 0 1.1-.3 1.1-.8 0-1.2-3.4-1-3.4-3.1 0-1.2 1.1-1.9 2.4-1.9 1.5 0 2.1.7 2.1.7l-.5 1s-.6-.6-1.6-.6c-.5 0-1.1.2-1.1.8 0 1.2 3.4.9 3.4 3.1 0 1.1-.9 1.9-2.4 1.9-1.6 0-2.5-1-2.5-1l.6-.9Z",fill:"#EF8022"}})])]),t._v(" "),a("symbol",{attrs:{id:"supporter-lunanode",viewBox:"0 0 194.219 193.977"}},[a("path",{staticStyle:{fill:"#004581","fill-opacity":"1","fill-rule":"evenodd",stroke:"none"},attrs:{d:"M3185.89 2995.8c-1.77 21.49-2.76 43.2-2.76 65.16 0 411.03 319.09 747.36 723.13 774.95l-618.54-641.7c-54.62-56.68-88.55-126.08-101.83-198.41M3960 2284.09c-270.37 0-508.4 138.15-647.57 347.65l23.25-22.42c76.82-74.06 176.93-109.95 276.2-108.13 99 1.77 197.53 41.2 271.5 117.59l-177.95 171.52c-26.66-27.31-62.22-41.38-98.02-42.14-36.12-.65-72.43 12.41-100.16 39.15l-37.98 36.6c-27.69 26.66-42.04 62.45-42.7 98.57-.65 36.07 12.36 72.48 39.11 100.21l745.68 773.56c305.71-104.45 525.52-394.17 525.52-735.29 0-29.89-1.73-59.34-5.04-88.32-19.44 54.57-51.41 105.56-95.79 148.35l-37.93 36.58c-76.86 74.07-176.93 110.05-276.16 108.18-99.32-1.77-198.13-41.38-272.19-118.25l-290.74-301.59 177.95-171.53 290.74 301.61c26.71 27.73 62.64 42.04 98.72 42.74 36.12.69 72.38-12.35 100.16-39.1l37.89-36.59c27.69-26.66 42.09-62.45 42.74-98.58.61-36.03-12.4-72.48-39.1-100.21l-440.73-457.23c-22.23-1.9-44.69-2.93-67.4-2.93",transform:"matrix(.125 0 0 -.125 -397.891 479.489)"}}),a("path",{staticStyle:{fill:"#3384b9","fill-opacity":"1","fill-rule":"evenodd",stroke:"none"},attrs:{d:"M4376.22 2292.8h360.66v433.41c-17.35-55.88-47.59-108.64-90.81-153.48l-269.85-279.93",transform:"matrix(.125 0 0 -.125 -397.891 479.489)"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-walletofsatoshi",viewBox:"0 0 313.1 76.32"}},[a("path",{attrs:{d:"M110.47 44.8H121c.84 0 1.22-.64.9-1.48l-17.6-42A2 2 0 0 0 102.22 0H87.63a2 2 0 0 0-2 1.34L66 48.11c-.32.84.06 1.48.83 1.48h13.7a1.42 1.42 0 0 1 1.32 1.93l-9.7 24.8 30.55-32.63A1 1 0 0 0 102 42H84.73a1.42 1.42 0 0 1-1.32-2l5.06-12.91 6.86-17.47 6.78 17.51h-7.54a1.42 1.42 0 0 0-1.32.9l-2.83 7.22a1.42 1.42 0 0 0 1.32 1.93H105a1.42 1.42 0 0 1 1.33.91l2.08 5.36a1.92 1.92 0 0 0 2.06 1.35Zm62.65 0h37.42a1.3 1.3 0 0 0 1.46-1.41V35.9a1.3 1.3 0 0 0-1.47-1.41h-26V1.41A1.35 1.35 0 0 0 183 0h-9.92a1.3 1.3 0 0 0-1.47 1.41v42a1.3 1.3 0 0 0 1.51 1.39Zm45.36 0h42a1.3 1.3 0 0 0 1.52-1.41V35.9a1.31 1.31 0 0 0-1.47-1.41h-30.59v-7.36h25.59a1.33 1.33 0 0 0 1.48-1.4v-7a1.33 1.33 0 0 0-1.48-1.41h-25.59v-7h30.59A1.3 1.3 0 0 0 262 8.89V1.41A1.3 1.3 0 0 0 260.53 0h-42A1.3 1.3 0 0 0 217 1.41v42a1.3 1.3 0 0 0 1.48 1.39ZM71.79 0H61.61a1.71 1.71 0 0 0-1.85 1.41L52.08 34.3 44.91 1.41A1.65 1.65 0 0 0 43.12 0H30.38a1.71 1.71 0 0 0-1.85 1.41L21.36 34.3 13.68 1.41A1.65 1.65 0 0 0 11.89 0H1.14C.24 0-.14.51.05 1.41l10.88 42a1.68 1.68 0 0 0 1.79 1.41H28.4a1.65 1.65 0 0 0 1.79-1.41l6.27-28.31 6.34 28.29a1.65 1.65 0 0 0 1.79 1.41H60.2a1.66 1.66 0 0 0 1.8-1.41l10.87-42C73.07.51 72.68 0 71.79 0Zm239.84 0h-43.52a1.3 1.3 0 0 0-1.47 1.41v7.48a1.3 1.3 0 0 0 1.47 1.41h15.29v33.09a1.3 1.3 0 0 0 1.48 1.41h10a1.33 1.33 0 0 0 1.47-1.41V10.3h15.3a1.3 1.3 0 0 0 1.47-1.41V1.41A1.3 1.3 0 0 0 311.63 0ZM127.76 44.8h37.42a1.3 1.3 0 0 0 1.47-1.41V35.9a1.3 1.3 0 0 0-1.47-1.41h-26V1.41a1.35 1.35 0 0 0-1.5-1.41h-9.92a1.3 1.3 0 0 0-1.47 1.41v42a1.3 1.3 0 0 0 1.47 1.39Zm-3.84 9.6h-11.53c-3.13 0-4.53 1.31-4.53 4.36v10.37c0 3.05 1.4 4.36 4.53 4.36h11.53c3.16 0 4.51-1.31 4.51-4.36V58.76c0-3.05-1.35-4.36-4.51-4.36Zm-1 12.95c0 1.48-.29 1.75-2.07 1.75h-5.51c-1.76 0-2.08-.27-2.08-1.75v-6.81c0-1.47.32-1.75 2.08-1.75h5.51c1.78 0 2.07.28 2.07 1.75Zm51.87-5.59h-8.75c-.89 0-1.16-.27-1.16-.95v-1.06c0-.68.27-1 1.16-1h6.7c.65 0 .89.28.89.85v.16a.55.55 0 0 0 .62.6h4a.55.55 0 0 0 .62-.6v-1.08c0-3.21-1.11-4.28-4.4-4.28H164c-3.19 0-4.51 1.31-4.51 4.36v2.84c0 3.06 1.32 4.36 4.51 4.36h8.74c.9 0 1.17.28 1.17 1v1.23c0 .68-.27.95-1.17.95h-7.34c-.62 0-.86-.27-.86-.85v-.16a.56.56 0 0 0-.62-.6h-4a.55.55 0 0 0-.62.6v1.12c0 3.22 1.08 4.28 4.4 4.28h11.2c3.19 0 4.51-1.31 4.51-4.36v-3c-.06-3.1-1.41-4.41-4.57-4.41Zm85.43 0h-8.75c-.89 0-1.16-.27-1.16-.95v-1.06c0-.68.27-1 1.16-1h6.7c.64 0 .89.28.89.85v.16a.55.55 0 0 0 .62.6h4a.55.55 0 0 0 .62-.6v-1.08c0-3.21-1.11-4.28-4.4-4.28h-10.48c-3.19 0-4.51 1.31-4.51 4.36v2.84c0 3.06 1.32 4.36 4.51 4.36h8.74c.89 0 1.16.28 1.16 1v1.23c0 .68-.27.95-1.16.95h-7.34c-.62 0-.86-.27-.86-.85v-.16a.57.57 0 0 0-.62-.6h-4.05a.55.55 0 0 0-.62.6v1.12c0 3.22 1.08 4.28 4.4 4.28h11.2c3.18 0 4.51-1.31 4.51-4.36v-3c0-3.1-1.33-4.41-4.51-4.41Zm26.65-7.36h-4.21a.56.56 0 0 0-.63.6v6.66h-9.2V55a.57.57 0 0 0-.65-.6H268a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.18a.57.57 0 0 0 .65-.6v-6.84h9.2v6.84a.56.56 0 0 0 .63.6h4.21a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.57-.6Zm-137.62 0h-17.07a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.19a.58.58 0 0 0 .65-.6v-6.52h10.15a.57.57 0 0 0 .64-.6v-3.19a.57.57 0 0 0-.64-.6H137v-3.19h12.3a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.62-.6Zm146.47 0h-4.18a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.18a.57.57 0 0 0 .65-.6V55a.57.57 0 0 0-.6-.6Zm-100.28.6a.83.83 0 0 0-.86-.57h-6.16a.83.83 0 0 0-.89.57l-7.42 17.89c-.14.36 0 .63.38.63h4.45a.8.8 0 0 0 .86-.57l1-2.68h9.1l1 2.68a.8.8 0 0 0 .87.57h4.69c.33 0 .49-.27.35-.63Zm-7 11 2.89-7.52 2.92 7.52Zm30.9-11.6H201a.55.55 0 0 0-.62.6v3.19a.55.55 0 0 0 .62.6h6.45v14.1a.55.55 0 0 0 .62.6h4.21a.56.56 0 0 0 .62-.6v-14.1h6.46a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.64-.6Zm18.46 0h-11.52c-3.13 0-4.54 1.31-4.54 4.36v10.37c0 3.05 1.41 4.36 4.54 4.36h11.52c3.16 0 4.51-1.31 4.51-4.36V58.76c0-3.05-1.31-4.36-4.51-4.36Zm-.94 12.95c0 1.48-.3 1.75-2.08 1.75h-5.51c-1.75 0-2.07-.27-2.07-1.75v-6.81c0-1.47.32-1.75 2.07-1.75h5.51c1.78 0 2.08.28 2.08 1.75Z",fill:"#fad228",stroke:"#1e2127","stroke-width":"2"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-ivpn",viewBox:"0 0 84 29"}},[a("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M6.75 0h6.03c.07 0 .15.03.2.1.04.05.06.13.05.2L8.6 27.43a.26.26 0 0 1-.24.22l-6.63.38H1.7a.25.25 0 0 1-.19-.08.26.26 0 0 1-.06-.22L5.2 5.05C5.12 1.67 1 .85.49.73-.06.59 0 0 0 0h6.75Zm32.32.12a.25.25 0 0 0-.22-.12h-6.5c-.1 0-.18.05-.23.14l-8.98 17.4L20.08.2a.25.25 0 0 0-.24-.21h-6.55a.25.25 0 0 0-.2.1.26.26 0 0 0-.05.2l4.85 26.05a.25.25 0 0 0 .26.2l7.57-.43c.08 0 .16-.06.2-.14L39.08.38a.26.26 0 0 0-.01-.26Zm20.27 5.5a6.8 6.8 0 0 0-.53-2.08c-.27-.6-.61-1.1-1.01-1.5-.4-.41-.8-.75-1.23-1A8.23 8.23 0 0 0 52.9 0H40.47a.25.25 0 0 0-.25.2l-4.01 24.6c-.01.07.01.14.06.2.05.05.11.08.18.08h.02l6.25-.36c.11 0 .2-.1.22-.21l.75-4.63h6.08c1.39-.09 2.7-.43 3.89-1.03a9.75 9.75 0 0 0 2.99-2.46 9.9 9.9 0 0 0 2-4.76l.56-3.3c.17-1.02.21-1.93.13-2.71Zm-7.21 5.87a2.53 2.53 0 0 1-1.1 1.66c-.27.18-.64.27-1.1.27H44.7l1.1-7h5.3c.45 0 .78.09.97.27.22.2.38.41.47.65.1.27.13.6.1.95l-.52 3.2ZM83.75 0h-6.32c-.12 0-.23.1-.25.22l-2.25 14.34L70.04.17a.25.25 0 0 0-.23-.17H63.5c-.12 0-.23.1-.25.22l-3.86 24.56c-.01.07.01.16.06.22.05.05.12.08.19.08l6.43-.39c.12 0 .21-.1.23-.22l1.62-10.36 3.4 10.08c.04.1.14.17.25.17l8.58-.52c.11 0 .2-.1.23-.22L84 .3a.27.27 0 0 0-.06-.22.24.24 0 0 0-.19-.09Z",fill:"#F34"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-hrf",viewBox:"0 0 3000 987.6"}},[a("path",{attrs:{d:"M1137.09 103.9v773.45h-51.44V515.96h-953.6v361.38H80.62V103.9h51.44v361.2h953.6V103.9h51.43zm-102.77 0h-51.44v258.19H234.94V103.9H183.5v309.05h850.82V103.9zm-696.29 0h-50.87v205.84h50.87V103.9zm593.05 0h-51.44v205.84h51.44V103.9zM183.5 877.34h51.44V619.16h747.94v258.19h51.44V567.72H183.5v309.62zm695.72 0h51.44V670.93h-51.44v206.41zm-592.47 0h51.44V670.93h-51.44v206.41z",fill:"#e12991"}}),a("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M1422.94 103.88V331.3h-44.51v-94.22h-92.2v94.22h-44.83V103.88h44.83v90.32h92.2v-90.32h44.51zM1605.81 168.85V331.3h-41.91v-18.19c-9.75 14.62-26.64 22.74-48.41 22.74-34.44 0-61.4-24.04-61.4-67.25v-99.74H1496v94.54c0 22.1 13.32 33.47 32.16 33.47 20.47 0 35.74-12.02 35.74-40.29v-87.72h41.91zM1885.19 231.23V331.3h-41.91v-97.14c0-19.17-9.75-30.86-27.29-30.86-18.52 0-30.22 12.35-30.22 36.71v91.29h-41.91v-97.14c0-19.17-9.75-30.86-27.29-30.86-17.87 0-30.54 12.35-30.54 36.71v91.29h-41.91V168.85h41.91v17.22c9.1-13.64 24.37-21.77 45.16-21.77 20.14 0 35.09 8.45 44.18 23.39 10.07-14.62 26.32-23.39 48.41-23.39 37.04.01 61.41 26.32 61.41 66.93zM2086.24 168.85V331.3h-41.91v-19.17c-11.7 14.62-29.24 23.72-52.96 23.72-43.21 0-78.95-37.36-78.95-85.77s35.74-85.77 78.95-85.77c23.72 0 41.26 9.1 52.96 23.72v-19.17h41.91zm-41.91 81.23c0-27.29-19.17-45.81-45.16-45.81-25.66 0-44.83 18.52-44.83 45.81 0 27.29 19.17 45.81 44.83 45.81 25.99 0 45.16-18.52 45.16-45.81zM2275.93 231.56v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V168.85h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44.01 61.4 24.05 61.4 67.26zM1316.47 525.36h-30.25v78.95h-44.83V376.89h94.84c41.91 0 75.7 33.79 75.7 75.37 0 28.59-17.87 54.26-43.86 66.28l50.36 85.77h-48.41l-53.55-78.95zm-30.25-39.31h50c16.89 0 30.86-14.95 30.86-33.79s-13.97-33.46-30.86-33.46h-50v67.25zM1437.88 396.71c0-13.97 15.57-25.99 29.54-25.99 14.29 0 22.12 12.02 22.12 25.99s-11.7 25.67-25.99 25.67c-13.97 0-25.67-11.7-25.67-25.67zm4.88 45.16h41.91v162.45h-41.91V441.87zM1681.86 441.87v154.65c0 53.28-41.91 77.33-84.8 77.33-34.77 0-62.7-13.32-77-39.64l35.74-20.47c6.82 12.67 17.54 22.74 42.56 22.74 26.31 0 42.56-14.29 42.56-39.96v-17.54c-11.37 15.27-28.92 24.69-51.98 24.69-46.14 0-80.9-37.36-80.9-83.17 0-45.48 34.76-83.17 80.9-83.17 23.07 0 40.61 9.42 51.98 24.69v-20.14h40.94zm-40.94 78.62c0-25.67-19.17-44.18-45.49-44.18-26.31 0-45.48 18.52-45.48 44.18 0 25.99 19.17 44.51 45.48 44.51 26.32 0 45.49-18.52 45.49-44.51zM1871.55 504.57v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V376.89h41.91v83.17c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25zM1963.46 482.15v67.58c0 17.54 12.67 17.87 36.71 16.57v38.01c-58.81 6.5-78.62-10.72-78.62-54.58v-67.58h-28.27v-40.29h28.27v-32.81l41.91-12.67v45.48h36.71v40.29h-36.71zM2148.63 556.88c0 35.09-30.54 51.98-65.31 51.98-32.49 0-56.53-13.64-68.22-38.66l36.39-20.47c4.55 13.32 15.6 21.12 31.84 21.12 13.32 0 22.42-4.55 22.42-13.97 0-23.72-83.82-10.72-83.82-67.9 0-33.14 28.27-51.66 61.73-51.66 26.32 0 49.06 12.02 61.73 34.44l-35.74 19.49c-4.88-10.4-13.97-16.57-25.99-16.57-10.4 0-18.84 4.55-18.84 13.32-.01 24.04 83.81 9.1 83.81 68.88zM1286.22 692.79v53.93h96.11v42.89h-96.11v87.72h-44.83V649.9h143.54v42.88h-98.71zM1400.82 796.1c0-48.41 38.01-85.77 85.77-85.77s86.1 37.36 86.1 85.77-38.34 85.77-86.1 85.77c-47.76 0-85.77-37.36-85.77-85.77zm129.96 0c0-26.31-19.17-44.83-44.19-44.83-24.69 0-43.86 18.52-43.86 44.83 0 26.32 19.17 44.83 43.86 44.83 25.02.01 44.19-18.51 44.19-44.83zM1744.84 714.88v162.45h-41.91v-18.19c-9.75 14.62-26.64 22.74-48.41 22.74-34.44 0-61.4-24.04-61.4-67.25v-99.74h41.91v94.54c0 22.1 13.32 33.47 32.16 33.47 20.47 0 35.74-12.02 35.74-40.29v-87.72h41.91zM1934.86 777.58v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V714.88h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25zM2135.61 649.9v227.42h-41.91v-19.17c-11.7 14.95-28.92 23.72-52.63 23.72-43.54 0-79.27-37.36-79.27-85.77s35.74-85.77 79.27-85.77c23.72 0 40.94 8.77 52.63 23.72V649.9h41.91zm-41.91 146.2c0-27.29-19.17-45.81-44.84-45.81-25.99 0-45.16 18.52-45.16 45.81 0 27.29 19.17 45.81 45.16 45.81 25.67.01 44.84-18.51 44.84-45.81zM2337.35 714.88v162.45h-41.91v-19.17c-11.7 14.62-29.24 23.72-52.96 23.72-43.21 0-78.95-37.36-78.95-85.77s35.74-85.77 78.95-85.77c23.72 0 41.26 9.1 52.96 23.72v-19.17h41.91zm-41.91 81.22c0-27.29-19.17-45.81-45.16-45.81-25.66 0-44.83 18.52-44.83 45.81 0 27.29 19.17 45.81 44.83 45.81 25.99.01 45.16-18.51 45.16-45.81zM2433.46 755.17v67.58c0 17.54 12.67 17.87 36.71 16.57v38.01c-58.81 6.5-78.62-10.72-78.62-54.58v-67.58h-28.26v-40.29h28.26v-32.81l41.91-12.67v45.48h36.71v40.29h-36.71zM2494.84 669.72c0-13.97 11.7-25.99 25.67-25.99 14.29 0 25.99 12.02 25.99 25.99s-11.7 25.66-25.99 25.66c-13.97.01-25.67-11.69-25.67-25.66zm4.87 45.16h41.91v162.45h-41.91V714.88zM2565 796.1c0-48.41 38.01-85.77 85.77-85.77s86.1 37.36 86.1 85.77-38.34 85.77-86.1 85.77c-47.76 0-85.77-37.36-85.77-85.77zm129.96 0c0-26.31-19.17-44.83-44.19-44.83-24.69 0-43.86 18.52-43.86 44.83 0 26.32 19.17 44.83 43.86 44.83 25.02.01 44.19-18.51 44.19-44.83zM2911.62 777.58v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V714.88h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25z"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-opensats",viewBox:"0 0 5220 720"}},[a("path",{attrs:{d:"M0 435.197L229.609 291.597V288.121L0 144.259V29.0508L334.901 245.894V333.824L0 550.798V435.197Z",fill:"#FF3300"}}),a("path",{attrs:{d:"M486.969 623.844H902.627V719.643H486.969V623.844Z",fill:"#FF3300"}}),a("path",{attrs:{d:"M993.879 291.2C993.879 106.422 1084.61 0 1214.37 0C1344.13 0 1434.86 106.422 1434.86 291.2C1434.86 479.061 1344.13 587.581 1214.37 587.581C1084.61 587.581 993.879 479.061 993.879 291.2ZM1345.12 291.2C1345.12 155.01 1293.16 75.9967 1214.37 75.9967C1135.58 75.9967 1083.62 155.01 1083.62 291.2C1083.62 430.473 1135.58 511.584 1214.37 511.584C1293.16 511.584 1344.85 430.473 1344.85 291.2H1345.12Z",fill:"#FF3300"}}),a("path",{attrs:{d:"M1593.29 154.29H1663.81L1670.37 205.37H1673.13C1711.31 169.634 1764.71 144.258 1814.44 144.258C1925.96 144.258 1988.02 228.713 1988.02 359.855C1988.02 504.111 1897.95 587.911 1797.77 587.911C1759.13 587.911 1713.54 568.829 1677.39 535.454H1675.29L1679.43 612.237V749.936H1593.29V154.29ZM1899.65 359.855C1899.65 271.269 1867.44 215.599 1791.21 215.599C1756.57 215.599 1717.93 232.713 1679.69 272.121V472.112C1714.79 503.914 1754.61 515.455 1781.57 515.455C1848.75 515.717 1899.65 459.851 1899.65 359.855Z",fill:"#FF3300"}}),a("path",{attrs:{d:"M2118.96 365.035C2118.96 227.336 2222.75 143.93 2335.98 143.93C2460.16 143.93 2530.82 225.434 2530.82 343.527C2530.67 359.209 2529.35 374.858 2526.88 390.345H2178.73V327.2H2473.22L2454.52 348.249C2454.52 256.449 2410.17 210.55 2338.47 210.55C2264.41 210.55 2203.66 265.17 2203.66 364.904C2203.66 468.833 2268.8 520.044 2359.79 520.044C2407.09 520.044 2445.08 505.75 2483.39 482.8L2513.56 537.29C2464.7 569.886 2407.32 587.378 2348.57 587.582C2220.39 587.582 2118.96 505.947 2118.96 365.035Z",fill:"#FF3300"}}),a("path",{attrs:{d:"M2658.41 154.29H2729.07L2735.63 221.697H2739.04C2781.55 178.289 2829.83 144.258 2895.17 144.258C2994.1 144.258 3039.17 205.042 3039.17 315.201V577.026H2952.9V326.152C2952.9 252.319 2928.11 218.222 2865.39 218.222C2819.47 218.222 2788.31 240.844 2744.68 285.563V577.026H2658.41V154.29Z",fill:"#FF3300"}}),a("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M3208.36 504.308L3259.46 444.376C3303 486.486 3360.93 510.468 3421.5 511.455C3493.27 511.455 3533.03 478.669 3533.03 432.77C3533.03 377.362 3491.63 361.953 3435.41 338.217L3355.57 303.333C3297.64 280.514 3234.21 238.614 3234.21 155.143C3234.21 66.8186 3313.65 0.001814 3425.64 0.001814C3492.01 -0.442962 3555.93 25.0654 3603.75 71.0807L3558.87 126.554C3521.22 93.051 3472.3 74.9951 3421.9 75.9985C3362.2 75.9985 3322.11 103.604 3322.11 150.028C3322.11 199.206 3371.05 217.173 3420.98 236.516L3497.93 270.416C3569.04 298.087 3622.18 339.528 3622.18 422.344C3622.18 513.356 3545.36 587.583 3416.78 587.583C3339.11 587.998 3264.34 558.123 3208.36 504.308V504.308Z"}}),a("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M3762.96 465.557C3762.96 370.741 3849.04 324.055 4062.7 308.186C4059.62 255.73 4031.54 213.896 3956.3 213.896C3905.13 213.896 3854.68 237.304 3813.28 261.5L3780.48 203.994C3827.98 174.684 3898.57 144.062 3971.78 144.062C4088.42 144.062 4148.91 210.945 4148.91 322.678V577.027H4077.73L4070.84 522.144H4068.08C4022.82 557.553 3963.97 587.715 3906.04 587.715C3825.16 587.584 3762.96 540.045 3762.96 465.557ZM4062.7 462.278V363.266C3896.79 375.134 3847.26 408.576 3847.26 459C3847.26 501.489 3885.38 519.063 3930.65 519.063C3975.91 519.063 4018.88 497.883 4062.7 462.278Z"}}),a("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M4388.81 409.884V222.941H4272.17V158.813L4392.16 154.289L4403.44 20.2617H4475.02V154.289H4674.64V222.941H4475.02V410.146C4475.02 482.864 4500.73 518.076 4577.29 518.076C4610.27 517.981 4642.96 511.847 4673.73 499.979L4691.24 562.992C4648.39 578.951 4603.07 587.274 4557.35 587.581C4430.86 587.581 4388.81 516.043 4388.81 409.884Z"}}),a("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M4818.71 521.815L4857.09 466.014C4909.9 502.948 4972.98 522.353 5037.43 521.487C5102.31 521.487 5133.34 495.259 5133.34 463.85C5133.34 433.95 5115.76 415 5009.22 393.034C4897.7 369.887 4845.21 331.2 4845.21 267.203C4845.21 196.518 4908.85 143.93 5025.95 143.93C5093.26 143.93 5157.55 170.158 5199.93 198.878L5159.45 252.646C5117.79 224.668 5068.79 209.592 5018.6 209.304C4955.62 209.304 4931.28 234.155 4931.28 263.138C4931.28 295.923 4965.07 309.037 5048.12 326.938C5185.89 357.101 5220.33 392.509 5220.33 458.736C5220.33 529.487 5151.71 587.582 5026.8 587.582C4952.47 586.641 4880.07 563.76 4818.71 521.815V521.815Z"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-tether",viewBox:"0 0 111 90"}},[a("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M24.4825 0.862305H88.0496C89.5663 0.862305 90.9675 1.64827 91.7239 2.92338L110.244 34.1419C111.204 35.7609 110.919 37.8043 109.549 39.1171L58.5729 87.9703C56.9216 89.5528 54.2652 89.5528 52.6139 87.9703L1.70699 39.1831C0.305262 37.8398 0.0427812 35.7367 1.07354 34.1077L20.8696 2.82322C21.6406 1.60483 23.0087 0.862305 24.4825 0.862305ZM79.8419 14.8003V23.5597H61.7343V29.6329C74.4518 30.2819 83.9934 32.9475 84.0642 36.1425L84.0638 42.803C83.993 45.998 74.4518 48.6635 61.7343 49.3125V64.2168H49.7105V49.3125C36.9929 48.6635 27.4513 45.998 27.3805 42.803L27.381 36.1425C27.4517 32.9475 36.9929 30.2819 49.7105 29.6329V23.5597H31.6028V14.8003H79.8419ZM55.7224 44.7367C69.2943 44.7367 80.6382 42.4827 83.4143 39.4727C81.0601 36.9202 72.5448 34.9114 61.7343 34.3597V40.7183C59.7966 40.8172 57.7852 40.8693 55.7224 40.8693C53.6595 40.8693 51.6481 40.8172 49.7105 40.7183V34.3597C38.8999 34.9114 30.3846 36.9202 28.0304 39.4727C30.8066 42.4827 42.1504 44.7367 55.7224 44.7367Z",fill:"#009393"}}),t._v(" "),a("symbol",{attrs:{id:"supporter-unbank",viewBox:"0 0 766 132",fill:"none"}},[a("path",{attrs:{d:"M133.125 66.24v41.145c-.03 10.77-7.051 19.926-17.376 22.792-2.053.571-4.156.831-6.279.831-27.55 0-55.09.03-82.641-.01-13.209-.02-23.625-10.429-23.645-23.623v-82.52c0-13.194 10.425-23.593 23.635-23.613h82.641c13.209.02 23.605 10.429 23.645 23.623l.01 41.385.01-.01zM68.38 33.16H31.987c-.361 0-.721-.02-1.082 0-2.694.17-4.657 2.044-4.717 4.508-.07 2.805 1.662 4.779 4.517 5.019.711.06.851.321.851.952v34.904c0 .661-.19.952-.871 1.162-2.183.661-2.694 3.206-1.042 4.769.751.711 1.632.731 2.574.731h72.316.721c1.472-.05 2.594-1.012 2.844-2.434a2.77 2.77 0 0 0-1.853-3.016c-.641-.21-.771-.501-.771-1.092V43.76c0-.741.19-.972.982-1.082 3.595-.491 5.347-4.348 3.385-7.363-1.062-1.633-2.704-2.154-4.557-2.154H68.41h-.03zm-.12 53.026H28.261c-.881 0-1.763-.04-2.644.01-3.245.19-5.208 3.446-3.715 6.171.701 1.272 1.933 1.853 3.175 2.435l27.37 12.824 12.478 5.88c1.703.822 3.325.972 5.037.081 1.352-.692 2.754-1.293 4.136-1.914l23.144-10.519 14.952-6.822c1.542-.701 2.564-1.783 2.684-3.516.2-2.755-1.672-4.638-4.577-4.638H68.26v.01zm-.13-65.329H26.218c-1.933 0-2.574.631-2.604 2.585-.02 1.122 0 2.234 0 3.356 0 2.615.561 3.176 3.155 3.176h82.741c.281 0 .561.01.841 0 1.432-.08 2.133-.761 2.153-2.174v-4.198c0-2.294-.45-2.755-2.713-2.755H68.12l.01.01zM593.247 49.67c-.27 1.703-.11 3.426-.1 5.129l.13 13.665.241 25.777.23 16.18c.18 5.169-4.006 8.155-7.321 8.145-4.696 0-7.911-3.156-7.971-7.995l-.15-17.261-.261-25.777-.22-22.18-.231-19.415c-.03-3.827 1.903-6.622 5.248-7.714s6.58.05 8.813 3.136l46.859 64.517c.29.401.5.892 1.131 1.262v-1.473-59.849c0-4.378 2.524-7.463 6.61-8.125 4.356-.711 8.542 2.755 8.693 7.183.01.321 0 .641 0 .962v84.554c0 3.897-1.933 6.792-5.248 7.864-3.355 1.082-6.64-.11-8.913-3.246l-46.708-64.327c-.251-.351-.421-.782-.832-.992-.04-.05-.08-.09-.12-.14 0 .03-.01.06-.02.1.05 0 .11.01.16.02h-.02zm-288.231-.21v12.383l.17 12.823.321 31.768c.02 1.753.22 3.526.03 5.269-.481 4.368-3.936 7.113-8.453 6.833-3.715-.231-6.739-3.637-6.79-7.704l-.14-15.589-.24-26.017-.24-22.18-.231-21.218c-.03-3.737 1.933-6.562 5.218-7.624 3.325-1.082 6.61.07 8.833 3.126l47.069 64.808c.25.351.51.691.971 1.292v-1.523-60.45c0-4.087 2.584-7.123 6.56-7.774 4.156-.671 8.182 2.394 8.622 6.572a12.05 12.05 0 0 1 .06 1.192v85.396c0 6.071-6.239 9.697-11.476 6.702-1.062-.611-1.863-1.483-2.574-2.465l-47.009-64.707-.681-.912h-.02zm97.402 22.421l-.02-37.178.02-8.626c.141-2.585.641-5.019 2.855-6.702 1.522-1.162 3.334-1.573 5.197-1.583l20.66.01c11.617.26 21.502 7.153 25.257 17.602 2.955 8.225 1.703 16.109-2.413 23.653-1.102 2.004-1.122 2.004.591 3.436 5.287 4.428 9.504 9.608 11.376 16.37 4.317 15.628-4.026 35.375-24.355 38.861-3.636.621-7.341.471-11.016.511-5.759.06-11.527 0-17.296-.05-1.442-.01-2.894 0-4.306-.21-3.946-.592-6.129-3.246-6.469-7.725a27.22 27.22 0 0 1-.061-2.033V71.871l-.02.01zm15.864 15.598v14.156c0 .491-.171 1.062.701 1.052 6.119-.1 12.258.32 18.366-.171 10.806-.871 17.206-11.921 12.619-21.729-2.163-4.628-5.718-7.634-11.026-8.135a86.36 86.36 0 0 0-9.104-.361l-10.675.17c-.801 0-.891.321-.891.982l.01 14.035zm0-42.537l-.02 10.78c0 .731.19.942.941.942l11.156-.03c7.461-.15 12.619-5.891 11.988-13.274-.431-5.009-4.006-8.796-8.903-9.537-4.767-.721-9.564-.571-14.351-.701-.751-.02-.831.311-.831.922v10.9h.02zM704.27 68.014c.581-.17.811-.571 1.111-.872l21.692-21.76 24.676-24.875c3.165-3.196 7.992-3.286 11.076-.21 3.015 3.005 2.915 7.814-.22 10.97l-24.886 25.016-6.259 6.301c-.601.581-.551.942-.071 1.563l31.026 40.153 1.462 1.903c2.604 3.456 2.073 8.095-1.212 10.72-3.315 2.644-8.072 2.123-10.796-1.323l-11.016-14.226-20.299-26.307c-.431-.561-.691-.822-1.332-.16l-14.281 14.406c-.541.541-.681 1.092-.681 1.813v18.954c-.02 3.166-1.492 5.53-4.347 6.893-2.764 1.312-5.468 1.002-7.921-.832-1.893-1.412-2.935-3.366-2.935-5.77V25.446c0-3.997 3.305-7.273 7.341-7.384 4.086-.12 7.631 3.026 7.812 7.033.1 2.194.05 4.398.05 6.592v36.336l.01-.01zM258.548 50.873l-.03 24.955c-.361 19.586-13.54 37.278-32.838 41.355-16.464 3.486-30.154-1.823-40.83-14.687-5.688-6.852-8.642-14.927-9.484-23.793-.17-1.803-.13-3.587-.13-5.38V24.745c0-3.807 2.063-6.682 5.488-7.674 4.978-1.443 9.765 2.254 9.765 7.584v33.591l.06 17.872c.33 12.232 8.843 23.423 20.66 26.228 10.045 2.374 20.64-1.803 26.879-10.86 3.275-4.749 5.068-10.028 5.078-15.839l.07-50.852c0-3.787 2.083-6.702 5.478-7.704 4.937-1.463 9.784 2.184 9.794 7.413v26.388l.04-.02zm292.788 67.683c-3.295 0-5.898-1.824-7.15-5.04l-7.131-18.413c-.35-.922-.811-1.152-1.742-1.152h-33.75c-.871 0-1.312.19-1.642 1.092l-7.01 18.584c-1.322 3.436-4.297 5.199-8.072 4.909-3.105-.241-5.859-2.786-6.56-6.102-.33-1.572-.07-3.075.501-4.568l11.657-30.906 20.37-53.968c1.272-3.386 3.996-5.4 7.301-5.41 3.254-.01 5.998 1.963 7.28 5.28l32.948 84.904c1.853 4.789-.45 9.447-5.207 10.639-.591.151-1.192.131-1.783.151h-.01zm-20.66-39.843l-12.438-32.068-.271.611-11.547 30.546c-.39 1.032.151.912.802.912h21.842 1.612z",fill:"#3cce49"}}),a("path",{attrs:{d:"M68.38 33.16h36.874c1.863 0 3.495.511 4.557 2.154 1.962 3.005.21 6.873-3.385 7.363-.792.11-.982.341-.982 1.082v34.903c0 .591.13.892.771 1.092a2.76 2.76 0 0 1 1.853 3.016c-.24 1.423-1.372 2.384-2.844 2.434h-.721-72.316c-.931 0-1.823-.02-2.574-.731-1.652-1.563-1.142-4.118 1.042-4.769.681-.21.881-.501.871-1.162V43.639c0-.631-.14-.892-.851-.952-2.854-.24-4.587-2.214-4.517-5.019.06-2.455 2.023-4.338 4.717-4.508.361-.02.721 0 1.082 0H68.35h.03zM52.647 61.201l.02-17.271c0-.892-.16-1.252-1.172-1.232h-9.724c-.891-.01-1.152.23-1.152 1.132v34.543c0 .932.31 1.132 1.172 1.122h9.604c1.002.02 1.282-.27 1.272-1.272l-.02-17.031v.01zm42.973-.19l.02-17.141c0-.862-.18-1.192-1.122-1.172a249.45 249.45 0 0 1-9.484 0c-.921-.02-1.132.291-1.132 1.162v34.403c0 .902.18 1.262 1.182 1.242h9.364c.991.02 1.192-.321 1.192-1.232l-.02-17.261zm-21.561.08l.02-17.131c0-1.012-.29-1.282-1.282-1.262h-9.244c-.841-.01-1.082.24-1.082 1.082v34.633c0 .832.24 1.092 1.082 1.082h9.244c1.001.02 1.282-.281 1.272-1.272l-.02-17.131h.01zM68.26 86.187h42.041c2.905 0 4.777 1.883 4.577 4.638-.12 1.733-1.152 2.815-2.684 3.516l-14.952 6.823-23.144 10.519-4.136 1.914c-1.722.881-3.335.741-5.037-.081l-12.478-5.88-27.37-12.824c-1.242-.581-2.474-1.162-3.175-2.434-1.482-2.725.471-5.981 3.715-6.171.881-.05 1.762-.01 2.644-.01H68.26v-.01zm-.13-65.329h41.671c2.263 0 2.714.461 2.714 2.755v4.198c-.021 1.412-.722 2.094-2.154 2.174h-.841-82.741c-2.594 0-3.155-.561-3.155-3.176v-3.356c.03-1.954.661-2.585 2.604-2.585H68.14l-.01-.01z",fill:"#0e4160"}}),a("path",{attrs:{d:"M593.247 49.67c-.05 0-.11-.01-.16-.02 0-.03.01-.06.02-.1l.12.14.02-.02z",fill:"#fefefe"}}),a("path",{attrs:{d:"M52.647 61.201l.02 17.031c0 1.002-.27 1.292-1.272 1.272-3.205-.06-6.409-.05-9.604 0-.861.01-1.172-.18-1.172-1.122V43.84c0-.902.26-1.152 1.152-1.132h9.724c1.001-.02 1.172.341 1.172 1.232l-.02 17.271v-.01zm42.973-.19l.02 17.261c0 .912-.2 1.252-1.192 1.232a243.59 243.59 0 0 0-9.364 0c-1.002.02-1.182-.351-1.182-1.242V43.86c0-.871.21-1.182 1.132-1.162a249.45 249.45 0 0 0 9.484 0c.941-.02 1.122.311 1.122 1.172l-.02 17.141zm-21.562.08l.02 17.131c0 .992-.27 1.292-1.272 1.272-3.074-.06-6.159-.05-9.243 0-.841.01-1.081-.25-1.081-1.082V43.78c0-.842.24-1.092 1.081-1.082h9.243c.992-.02 1.292.25 1.282 1.262l-.02 17.131h-.01z",fill:"#3cce49"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-acinq",viewBox:"0 0 103 107"}},[a("circle",{attrs:{fill:"url(#acinq-a)",cx:"47.833",cy:"51.833",r:"56.832"}}),a("g",[a("g",{attrs:{fill:"none","stroke-width":"6","stroke-linejoin":"round"}},[a("path",{attrs:{stroke:"#47BF94",d:"M4.493 79.67c-6.778-11.574 21.882-35.135 41.646-39.636 16.598-3.78 55.176 4.066 53.752 17.433"}}),a("path",{attrs:{stroke:"#359F7E",d:"M10.125 18.133c8.624-9.988 41.797 13.701 51.001 30.018 9.723 17.237 12.87 55.271-1.103 55.351"}}),a("path",{attrs:{stroke:"#49DAAA",d:"M69.826 4.107c12.025 5.964 3.838 38.632-11.184 57.28C47.846 74.79 11.659 91.904 4.493 79.67"}}),a("path",{attrs:{stroke:"#49DAAA",d:"M99.891 57.467C98.471 70.799 62.529 72.9 43.83 64.781c-17.92-7.783-42.47-36.5-33.706-46.648"}}),a("path",{attrs:{stroke:"#AAF0D3",d:"M60.023 103.502c-14.291.08-24.609-29.721-23.918-51.916.758-24.377 20.678-53.948 33.721-47.479"}})])])]),t._v(" "),a("symbol",{attrs:{id:"supporter-nomics",viewBox:"0 0 600 600"}},[a("path",{attrs:{d:"M273.56 133A136.81 136.81 0 0 0 0 136.86v326.28a136.8 136.8 0 0 0 233.57 96.75L326.44 467A136.81 136.81 0 0 0 600 463.14V136.86a136.8 136.8 0 0 0-233.57-96.75L273.56 133",fill:"#a0f"}}),a("ellipse",{attrs:{cx:"302.18",cy:"300.04",rx:"136.81",ry:"136.86",fill:"#fff"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-strike",viewBox:"0 0 155 120"}},[a("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M7.06565 43.2477C1.90963 41.2685 -0.665684 35.4843 1.31353 30.3283C3.29274 25.1722 9.07699 22.5969 14.233 24.5761L51.4526 38.8634C51.4937 38.8798 51.535 38.896 51.5765 38.9119L70.2481 46.0792C75.4041 48.0584 81.1883 45.4831 83.1675 40.3271C85.1468 35.1711 82.5714 29.3868 77.4154 27.4076L77.4132 27.4068C77.4139 27.4064 77.4145 27.406 77.4151 27.4056L58.7436 20.2383C53.5876 18.2591 51.0123 12.4749 52.9915 7.31885C54.9707 2.16283 60.755 -0.412485 65.911 1.56673L120.828 22.6473C120.959 22.6977 121.089 22.7506 121.217 22.8059C121.453 22.8928 121.69 22.9815 121.926 23.0721C147.706 32.9681 160.583 61.8894 150.686 87.6695C140.79 113.45 111.869 126.326 86.089 116.43C85.5927 116.24 85.1011 116.042 84.6144 115.838C84.3783 115.766 84.1431 115.686 83.9091 115.596L30.0742 94.9308C24.9182 92.9516 22.3428 87.1673 24.3221 82.0113C26.3013 76.8553 32.0855 74.2799 37.2415 76.2592L55.9106 83.4256C55.9103 83.4242 55.9099 83.4229 55.9095 83.4215L55.9133 83.423C61.0694 85.4022 66.8536 82.8269 68.8328 77.6709C70.812 72.5148 68.2367 66.7306 63.0807 64.7514L54.6786 61.5261C54.6787 61.5257 54.6788 61.5252 54.6789 61.5247L7.06565 43.2477Z"}})])])]),t._v(" "),a("div",{staticClass:"supporters"},[a("h3",[t._v("Our Supporters")]),t._v(" "),a("p",[t._v("\n The BTCPay Server Project is proudly supported by these entities through the\n "),a("a",{attrs:{href:"https://foundation.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server Foundation")]),t._v(".\n ")]),t._v(" "),a("div",{staticClass:"logos"},[a("a",{attrs:{href:"https://spiral.xyz",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"100",height:"100"}},[a("use",{attrs:{href:"#supporter-spiral"}})]),t._v("\n Spiral\n ")]),t._v(" "),a("a",{attrs:{href:"https://opensats.org",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"120",height:"100"}},[a("use",{attrs:{href:"#supporter-opensats"}})]),t._v("\n OpenSats\n ")]),t._v(" "),a("a",{attrs:{href:"https://www.bailliegifford.com",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"110",height:"100"}},[a("use",{attrs:{href:"#supporter-bailliegifford"}})]),t._v("\n Baillie Gifford\n ")]),t._v(" "),a("a",{attrs:{href:"https://tether.to",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"100",height:"60"}},[a("use",{attrs:{href:"#supporter-tether"}})]),t._v("\n Tether\n ")]),t._v(" "),a("a",{attrs:{href:"https://hrf.org",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"110",height:"60"}},[a("use",{attrs:{href:"#supporter-hrf"}})]),t._v("\n HRF\n ")]),t._v(" "),a("a",{attrs:{href:"https://www.lunanode.com/",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"80",height:"60"}},[a("use",{attrs:{href:"#supporter-lunanode"}})]),t._v("\n LunaNode\n ")]),t._v(" "),a("a",{attrs:{href:"https://walletofsatoshi.com/",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"80",height:"80"}},[a("use",{attrs:{href:"#supporter-walletofsatoshi"}})]),t._v("\n Wallet of Satoshi\n ")]),t._v(" "),a("a",{attrs:{href:"https://coincards.com/",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"80",height:"80"}},[a("use",{attrs:{href:"#supporter-coincards"}})]),t._v("\n Coincards\n ")]),t._v(" "),a("a",{attrs:{href:"https://www.ivpn.net/",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"80",height:"80"}},[a("use",{attrs:{href:"#supporter-ivpn"}})]),t._v("\n IVPN\n ")]),t._v(" "),a("a",{attrs:{href:"https://www.unbank.com/",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"80",height:"80"}},[a("use",{attrs:{href:"#supporter-unbank"}})]),t._v("\n Unbank\n ")])]),t._v(" "),a("p",[t._v("If you'd like to support the project, please visit the "),a("a",{attrs:{href:"https://btcpayserver.org/donate/"}},[t._v("donation page")]),t._v(".")])])])}),[],!1,null,null,null);a.default=e.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[159],{877:function(t,a,r){"use strict";r.r(a);var e=r(17),l=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("div",{staticClass:"topics"},[a("h3",[t._v("Explore by topic")]),t._v(" "),a("ul",[a("li",[a("RouterLink",{attrs:{to:"/Guide/"}},[t._v("What is BTCPay Server")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/UseCase/"}},[t._v("Why BTCPay Server")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/TryItOut/"}},[t._v("How to deploy BTCPay Server")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/WalletSetup/"}},[t._v("Wallet Setup")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/Conference-PoS-guide/"}},[t._v("How to setup POS")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[t._v("Greenfield API")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/FAQ/"}},[t._v("Frequently Asked Questions"),a("br"),t._v("and Common Issues")])],1),t._v(" "),a("li",[a("RouterLink",{attrs:{to:"/Contribute/"}},[t._v("How to contribute to BTCPay Server")])],1)])]),t._v(" "),a("svg",{attrs:{width:"0",height:"0",xmlns:"http://www.w3.org/2000/svg"}},[a("defs",[a("linearGradient",{attrs:{id:"spiral-gradient",x1:"81.36",y1:"311.35",x2:"541.35",y2:"311.35",gradientUnits:"userSpaceOnUse"}},[a("stop",{attrs:{offset:".18","stop-color":"#00f"}}),a("stop",{attrs:{offset:"1","stop-color":"#f0f"}})],1),t._v(" "),a("radialGradient",{attrs:{id:"acinq-a",cx:"47.833",cy:"51.834",r:"56.832"}},[a("stop",{attrs:{offset:"0","stop-color":"#fff"}}),a("stop",{attrs:{offset:"1","stop-color":"#fff","stop-opacity":"0"}})],1)],1),t._v(" "),a("symbol",{attrs:{id:"supporter-spiral",viewBox:"0 0 629 629"}},[a("path",{attrs:{d:"M326.4 572.09C201.2 572.09 141 503 112.48 445c-28.22-57.53-30.59-114.56-30.79-122.69-4.85-77 41-231.78 249.58-271.2a28.05 28.05 0 0 1 10.41 55.13c-213.12 40.28-204.44 206-204 213 0 .53.06 1.06.07 1.6.15 7.9 5.1 195.16 188.65 195.16 68.34 0 116.6-29.4 143.6-87.37 24.48-52.74 19.29-112.45-13.52-155.83-22.89-30.27-52.46-45-90.38-45-34.46 0-63.47 9.88-86.21 29.37A91.5 91.5 0 0 0 248 322.3c-1.41 25.4 7.14 49.36 24.07 67.49C287.27 406 305 413.9 326.4 413.9c27.46 0 45.52-9 53.66-26.81 8.38-18.3 3.61-38.93-.19-43.33-9.11-10-18.69-13.68-22.48-13-2.53.43-5.78 4.61-8.48 10.92a28 28 0 0 1-51.58-22c14.28-33.44 37.94-42 50.76-44.2 24.78-4.18 52.17 7.3 73.34 30.65s25.51 68.55 10.15 103.22C421.54 432 394.52 470 326.4 470c-36.72 0-69.67-14.49-95.29-41.92-27.47-29.4-41.34-68.08-39.11-108.89a149.1 149.1 0 0 1 51.31-104.6c33.19-28.45 74.48-42.87 122.71-42.87 55.12 0 101.85 23.25 135.12 67.23 45.36 60 52.9 141.71 19.66 213.3-25.35 54.67-79.68 119.84-194.4 119.84Z",fill:"url(#spiral-gradient)"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-coincards",viewBox:"0 0 64 32"}},[a("g",{attrs:{fill:"none"}},[a("path",{attrs:{d:"M32.7 5.9c-.2-1-1.3-1.7-2.3-1.4L7.7 9.9c-1 .2-1.7 1.3-1.4 2.3l3.1 12.9c.2 1 1.3 1.7 2.3 1.4l22.7-5.4c1-.2 1.7-1.3 1.4-2.3L32.7 5.9Z",fill:"#EF8022"}}),a("path",{attrs:{d:"M12.6 30.3c-.2.2-.5.3-.7.3l.8.5c.9.6 2.1.4 2.7-.5l3.1-4.4-5.9 4.1ZM2.3 19.5l-1 1.4c-.6.9-.4 2.1.5 2.7L8.1 28l-5.8-8.5ZM12.9 8.1l7.2-5-2.7-1.9c-.9-.6-2.1-.4-2.7.5l-5 7.2 3.2-.8Z",fill:"#F9F185"}}),a("path",{attrs:{d:"M9.7 29.4c.6.9 1.8 1.1 2.7.5l6.7-4.6-7.4 1.8c-1.3.3-2.6-.5-2.9-1.8L6 13.5l-3.3 2.3c-.9.6-1.1 1.8-.5 2.7l7.5 10.9Zm4.5-21.6L25.9 5l-1.3-2c-.6-.9-1.8-1.1-2.7-.5l-7.7 5.3Z",fill:"#FFC214"}}),a("path",{attrs:{d:"M11.9 24.8c-.7 0-1.4-.5-1.7-1.1l-1.5-3.2 1.1 4.6c.2.6.7 1.1 1.4 1.1h.3l17-4.1-16.2 2.7h-.4Z",fill:"#FFC214"}}),a("path",{attrs:{d:"M16 17.5s-1.1 1.2-2.5 1.2c-1.7 0-2.6-1.4-2.6-2.8 0-1.3.9-2.7 2.6-2.7 1.3 0 2.3 1 2.3 1l1.1-1.7s-.6-.7-1.9-1.1v-1.2h-1.1v1h-.6v-1h-1.1v1.1c-2.2.5-3.7 2.4-3.7 4.7 0 2.4 1.5 4.2 3.7 4.7v1.2h1.1v-1h.6V22H15v-1.3c1.4-.4 2.1-1.3 2.1-1.3L16 17.5ZM21 13.7c2.1 0 3.8 1.4 3.8 3.6 0 2.1-1.7 3.5-3.8 3.5-2.1 0-3.8-1.4-3.8-3.5s1.7-3.6 3.8-3.6Zm0 5.2c.8 0 1.5-.6 1.5-1.6s-.7-1.7-1.5-1.7-1.5.6-1.5 1.7c0 1 .7 1.6 1.5 1.6Zm4.3-5h2.3v6.7h-2.3v-6.7Zm0-2.6h2.2v1.8h-2.2v-1.8Zm3.2 2.6h2.2v1c.3-.5 1-1.2 2.1-1.2 1.4 0 2.4.6 2.4 2.5v4.4h-2.3v-4c0-.6-.2-.9-.7-.9-.7 0-1.1.4-1.3 1-.1.3-.1.6-.1.9v3h-2.3v-6.7Z",fill:"#FFF"}}),a("path",{attrs:{d:"M39.3 13.9c1.7 0 2.5 1 2.5 1l-.6.9s-.7-.8-1.8-.8c-1.3 0-2.3 1-2.3 2.4 0 1.3 1 2.4 2.3 2.4 1.2 0 2-.9 2-.9l.5.9s-.9 1.1-2.6 1.1c-2.1 0-3.5-1.5-3.5-3.5-.1-2 1.4-3.5 3.5-3.5Zm6.8 2.6h.3v-.1c0-1.1-.6-1.5-1.5-1.5-1 0-1.8.6-1.8.6l-.5-.9s1-.8 2.5-.8c1.7 0 2.6.9 2.6 2.6v4.2h-1.2v-1.1s-.5 1.3-2.1 1.3c-1.1 0-2.3-.7-2.3-2 0-2.2 2.9-2.3 4-2.3Zm-1.4 3.3c1.1 0 1.8-1.1 1.8-2.1v-.2h-.3c-1 0-2.7.1-2.7 1.3-.1.5.3 1 1.2 1Zm3.8-5.8h1.2v1.7c.3-1 1.1-1.7 2.1-1.7h.3v1.3h-.4c-.8 0-1.6.6-1.9 1.6-.1.4-.2.8-.2 1.2v2.7h-1.3V14h.2Zm6.8-.1c1.5 0 2 1 2 1v-3.5h1.3v9.2h-1.2v-1s-.5 1.2-2.2 1.2c-1.8 0-2.9-1.4-2.9-3.5s1.3-3.4 3-3.4Zm.2 5.8c1 0 1.9-.7 1.9-2.4 0-1.2-.6-2.4-1.9-2.4-1 0-1.9.9-1.9 2.4s.8 2.4 1.9 2.4Zm4.2-.8s.7.8 1.9.8c.5 0 1.1-.3 1.1-.8 0-1.2-3.4-1-3.4-3.1 0-1.2 1.1-1.9 2.4-1.9 1.5 0 2.1.7 2.1.7l-.5 1s-.6-.6-1.6-.6c-.5 0-1.1.2-1.1.8 0 1.2 3.4.9 3.4 3.1 0 1.1-.9 1.9-2.4 1.9-1.6 0-2.5-1-2.5-1l.6-.9Z",fill:"#EF8022"}})])]),t._v(" "),a("symbol",{attrs:{id:"supporter-lunanode",viewBox:"0 0 194.219 193.977"}},[a("path",{staticStyle:{fill:"#004581","fill-opacity":"1","fill-rule":"evenodd",stroke:"none"},attrs:{d:"M3185.89 2995.8c-1.77 21.49-2.76 43.2-2.76 65.16 0 411.03 319.09 747.36 723.13 774.95l-618.54-641.7c-54.62-56.68-88.55-126.08-101.83-198.41M3960 2284.09c-270.37 0-508.4 138.15-647.57 347.65l23.25-22.42c76.82-74.06 176.93-109.95 276.2-108.13 99 1.77 197.53 41.2 271.5 117.59l-177.95 171.52c-26.66-27.31-62.22-41.38-98.02-42.14-36.12-.65-72.43 12.41-100.16 39.15l-37.98 36.6c-27.69 26.66-42.04 62.45-42.7 98.57-.65 36.07 12.36 72.48 39.11 100.21l745.68 773.56c305.71-104.45 525.52-394.17 525.52-735.29 0-29.89-1.73-59.34-5.04-88.32-19.44 54.57-51.41 105.56-95.79 148.35l-37.93 36.58c-76.86 74.07-176.93 110.05-276.16 108.18-99.32-1.77-198.13-41.38-272.19-118.25l-290.74-301.59 177.95-171.53 290.74 301.61c26.71 27.73 62.64 42.04 98.72 42.74 36.12.69 72.38-12.35 100.16-39.1l37.89-36.59c27.69-26.66 42.09-62.45 42.74-98.58.61-36.03-12.4-72.48-39.1-100.21l-440.73-457.23c-22.23-1.9-44.69-2.93-67.4-2.93",transform:"matrix(.125 0 0 -.125 -397.891 479.489)"}}),a("path",{staticStyle:{fill:"#3384b9","fill-opacity":"1","fill-rule":"evenodd",stroke:"none"},attrs:{d:"M4376.22 2292.8h360.66v433.41c-17.35-55.88-47.59-108.64-90.81-153.48l-269.85-279.93",transform:"matrix(.125 0 0 -.125 -397.891 479.489)"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-walletofsatoshi",viewBox:"0 0 313.1 76.32"}},[a("path",{attrs:{d:"M110.47 44.8H121c.84 0 1.22-.64.9-1.48l-17.6-42A2 2 0 0 0 102.22 0H87.63a2 2 0 0 0-2 1.34L66 48.11c-.32.84.06 1.48.83 1.48h13.7a1.42 1.42 0 0 1 1.32 1.93l-9.7 24.8 30.55-32.63A1 1 0 0 0 102 42H84.73a1.42 1.42 0 0 1-1.32-2l5.06-12.91 6.86-17.47 6.78 17.51h-7.54a1.42 1.42 0 0 0-1.32.9l-2.83 7.22a1.42 1.42 0 0 0 1.32 1.93H105a1.42 1.42 0 0 1 1.33.91l2.08 5.36a1.92 1.92 0 0 0 2.06 1.35Zm62.65 0h37.42a1.3 1.3 0 0 0 1.46-1.41V35.9a1.3 1.3 0 0 0-1.47-1.41h-26V1.41A1.35 1.35 0 0 0 183 0h-9.92a1.3 1.3 0 0 0-1.47 1.41v42a1.3 1.3 0 0 0 1.51 1.39Zm45.36 0h42a1.3 1.3 0 0 0 1.52-1.41V35.9a1.31 1.31 0 0 0-1.47-1.41h-30.59v-7.36h25.59a1.33 1.33 0 0 0 1.48-1.4v-7a1.33 1.33 0 0 0-1.48-1.41h-25.59v-7h30.59A1.3 1.3 0 0 0 262 8.89V1.41A1.3 1.3 0 0 0 260.53 0h-42A1.3 1.3 0 0 0 217 1.41v42a1.3 1.3 0 0 0 1.48 1.39ZM71.79 0H61.61a1.71 1.71 0 0 0-1.85 1.41L52.08 34.3 44.91 1.41A1.65 1.65 0 0 0 43.12 0H30.38a1.71 1.71 0 0 0-1.85 1.41L21.36 34.3 13.68 1.41A1.65 1.65 0 0 0 11.89 0H1.14C.24 0-.14.51.05 1.41l10.88 42a1.68 1.68 0 0 0 1.79 1.41H28.4a1.65 1.65 0 0 0 1.79-1.41l6.27-28.31 6.34 28.29a1.65 1.65 0 0 0 1.79 1.41H60.2a1.66 1.66 0 0 0 1.8-1.41l10.87-42C73.07.51 72.68 0 71.79 0Zm239.84 0h-43.52a1.3 1.3 0 0 0-1.47 1.41v7.48a1.3 1.3 0 0 0 1.47 1.41h15.29v33.09a1.3 1.3 0 0 0 1.48 1.41h10a1.33 1.33 0 0 0 1.47-1.41V10.3h15.3a1.3 1.3 0 0 0 1.47-1.41V1.41A1.3 1.3 0 0 0 311.63 0ZM127.76 44.8h37.42a1.3 1.3 0 0 0 1.47-1.41V35.9a1.3 1.3 0 0 0-1.47-1.41h-26V1.41a1.35 1.35 0 0 0-1.5-1.41h-9.92a1.3 1.3 0 0 0-1.47 1.41v42a1.3 1.3 0 0 0 1.47 1.39Zm-3.84 9.6h-11.53c-3.13 0-4.53 1.31-4.53 4.36v10.37c0 3.05 1.4 4.36 4.53 4.36h11.53c3.16 0 4.51-1.31 4.51-4.36V58.76c0-3.05-1.35-4.36-4.51-4.36Zm-1 12.95c0 1.48-.29 1.75-2.07 1.75h-5.51c-1.76 0-2.08-.27-2.08-1.75v-6.81c0-1.47.32-1.75 2.08-1.75h5.51c1.78 0 2.07.28 2.07 1.75Zm51.87-5.59h-8.75c-.89 0-1.16-.27-1.16-.95v-1.06c0-.68.27-1 1.16-1h6.7c.65 0 .89.28.89.85v.16a.55.55 0 0 0 .62.6h4a.55.55 0 0 0 .62-.6v-1.08c0-3.21-1.11-4.28-4.4-4.28H164c-3.19 0-4.51 1.31-4.51 4.36v2.84c0 3.06 1.32 4.36 4.51 4.36h8.74c.9 0 1.17.28 1.17 1v1.23c0 .68-.27.95-1.17.95h-7.34c-.62 0-.86-.27-.86-.85v-.16a.56.56 0 0 0-.62-.6h-4a.55.55 0 0 0-.62.6v1.12c0 3.22 1.08 4.28 4.4 4.28h11.2c3.19 0 4.51-1.31 4.51-4.36v-3c-.06-3.1-1.41-4.41-4.57-4.41Zm85.43 0h-8.75c-.89 0-1.16-.27-1.16-.95v-1.06c0-.68.27-1 1.16-1h6.7c.64 0 .89.28.89.85v.16a.55.55 0 0 0 .62.6h4a.55.55 0 0 0 .62-.6v-1.08c0-3.21-1.11-4.28-4.4-4.28h-10.48c-3.19 0-4.51 1.31-4.51 4.36v2.84c0 3.06 1.32 4.36 4.51 4.36h8.74c.89 0 1.16.28 1.16 1v1.23c0 .68-.27.95-1.16.95h-7.34c-.62 0-.86-.27-.86-.85v-.16a.57.57 0 0 0-.62-.6h-4.05a.55.55 0 0 0-.62.6v1.12c0 3.22 1.08 4.28 4.4 4.28h11.2c3.18 0 4.51-1.31 4.51-4.36v-3c0-3.1-1.33-4.41-4.51-4.41Zm26.65-7.36h-4.21a.56.56 0 0 0-.63.6v6.66h-9.2V55a.57.57 0 0 0-.65-.6H268a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.18a.57.57 0 0 0 .65-.6v-6.84h9.2v6.84a.56.56 0 0 0 .63.6h4.21a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.57-.6Zm-137.62 0h-17.07a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.19a.58.58 0 0 0 .65-.6v-6.52h10.15a.57.57 0 0 0 .64-.6v-3.19a.57.57 0 0 0-.64-.6H137v-3.19h12.3a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.62-.6Zm146.47 0h-4.18a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.18a.57.57 0 0 0 .65-.6V55a.57.57 0 0 0-.6-.6Zm-100.28.6a.83.83 0 0 0-.86-.57h-6.16a.83.83 0 0 0-.89.57l-7.42 17.89c-.14.36 0 .63.38.63h4.45a.8.8 0 0 0 .86-.57l1-2.68h9.1l1 2.68a.8.8 0 0 0 .87.57h4.69c.33 0 .49-.27.35-.63Zm-7 11 2.89-7.52 2.92 7.52Zm30.9-11.6H201a.55.55 0 0 0-.62.6v3.19a.55.55 0 0 0 .62.6h6.45v14.1a.55.55 0 0 0 .62.6h4.21a.56.56 0 0 0 .62-.6v-14.1h6.46a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.64-.6Zm18.46 0h-11.52c-3.13 0-4.54 1.31-4.54 4.36v10.37c0 3.05 1.41 4.36 4.54 4.36h11.52c3.16 0 4.51-1.31 4.51-4.36V58.76c0-3.05-1.31-4.36-4.51-4.36Zm-.94 12.95c0 1.48-.3 1.75-2.08 1.75h-5.51c-1.75 0-2.07-.27-2.07-1.75v-6.81c0-1.47.32-1.75 2.07-1.75h5.51c1.78 0 2.08.28 2.08 1.75Z",fill:"#fad228",stroke:"#1e2127","stroke-width":"2"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-ivpn",viewBox:"0 0 84 29"}},[a("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M6.75 0h6.03c.07 0 .15.03.2.1.04.05.06.13.05.2L8.6 27.43a.26.26 0 0 1-.24.22l-6.63.38H1.7a.25.25 0 0 1-.19-.08.26.26 0 0 1-.06-.22L5.2 5.05C5.12 1.67 1 .85.49.73-.06.59 0 0 0 0h6.75Zm32.32.12a.25.25 0 0 0-.22-.12h-6.5c-.1 0-.18.05-.23.14l-8.98 17.4L20.08.2a.25.25 0 0 0-.24-.21h-6.55a.25.25 0 0 0-.2.1.26.26 0 0 0-.05.2l4.85 26.05a.25.25 0 0 0 .26.2l7.57-.43c.08 0 .16-.06.2-.14L39.08.38a.26.26 0 0 0-.01-.26Zm20.27 5.5a6.8 6.8 0 0 0-.53-2.08c-.27-.6-.61-1.1-1.01-1.5-.4-.41-.8-.75-1.23-1A8.23 8.23 0 0 0 52.9 0H40.47a.25.25 0 0 0-.25.2l-4.01 24.6c-.01.07.01.14.06.2.05.05.11.08.18.08h.02l6.25-.36c.11 0 .2-.1.22-.21l.75-4.63h6.08c1.39-.09 2.7-.43 3.89-1.03a9.75 9.75 0 0 0 2.99-2.46 9.9 9.9 0 0 0 2-4.76l.56-3.3c.17-1.02.21-1.93.13-2.71Zm-7.21 5.87a2.53 2.53 0 0 1-1.1 1.66c-.27.18-.64.27-1.1.27H44.7l1.1-7h5.3c.45 0 .78.09.97.27.22.2.38.41.47.65.1.27.13.6.1.95l-.52 3.2ZM83.75 0h-6.32c-.12 0-.23.1-.25.22l-2.25 14.34L70.04.17a.25.25 0 0 0-.23-.17H63.5c-.12 0-.23.1-.25.22l-3.86 24.56c-.01.07.01.16.06.22.05.05.12.08.19.08l6.43-.39c.12 0 .21-.1.23-.22l1.62-10.36 3.4 10.08c.04.1.14.17.25.17l8.58-.52c.11 0 .2-.1.23-.22L84 .3a.27.27 0 0 0-.06-.22.24.24 0 0 0-.19-.09Z",fill:"#F34"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-hrf",viewBox:"0 0 3000 987.6"}},[a("path",{attrs:{d:"M1137.09 103.9v773.45h-51.44V515.96h-953.6v361.38H80.62V103.9h51.44v361.2h953.6V103.9h51.43zm-102.77 0h-51.44v258.19H234.94V103.9H183.5v309.05h850.82V103.9zm-696.29 0h-50.87v205.84h50.87V103.9zm593.05 0h-51.44v205.84h51.44V103.9zM183.5 877.34h51.44V619.16h747.94v258.19h51.44V567.72H183.5v309.62zm695.72 0h51.44V670.93h-51.44v206.41zm-592.47 0h51.44V670.93h-51.44v206.41z",fill:"#e12991"}}),a("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M1422.94 103.88V331.3h-44.51v-94.22h-92.2v94.22h-44.83V103.88h44.83v90.32h92.2v-90.32h44.51zM1605.81 168.85V331.3h-41.91v-18.19c-9.75 14.62-26.64 22.74-48.41 22.74-34.44 0-61.4-24.04-61.4-67.25v-99.74H1496v94.54c0 22.1 13.32 33.47 32.16 33.47 20.47 0 35.74-12.02 35.74-40.29v-87.72h41.91zM1885.19 231.23V331.3h-41.91v-97.14c0-19.17-9.75-30.86-27.29-30.86-18.52 0-30.22 12.35-30.22 36.71v91.29h-41.91v-97.14c0-19.17-9.75-30.86-27.29-30.86-17.87 0-30.54 12.35-30.54 36.71v91.29h-41.91V168.85h41.91v17.22c9.1-13.64 24.37-21.77 45.16-21.77 20.14 0 35.09 8.45 44.18 23.39 10.07-14.62 26.32-23.39 48.41-23.39 37.04.01 61.41 26.32 61.41 66.93zM2086.24 168.85V331.3h-41.91v-19.17c-11.7 14.62-29.24 23.72-52.96 23.72-43.21 0-78.95-37.36-78.95-85.77s35.74-85.77 78.95-85.77c23.72 0 41.26 9.1 52.96 23.72v-19.17h41.91zm-41.91 81.23c0-27.29-19.17-45.81-45.16-45.81-25.66 0-44.83 18.52-44.83 45.81 0 27.29 19.17 45.81 44.83 45.81 25.99 0 45.16-18.52 45.16-45.81zM2275.93 231.56v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V168.85h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44.01 61.4 24.05 61.4 67.26zM1316.47 525.36h-30.25v78.95h-44.83V376.89h94.84c41.91 0 75.7 33.79 75.7 75.37 0 28.59-17.87 54.26-43.86 66.28l50.36 85.77h-48.41l-53.55-78.95zm-30.25-39.31h50c16.89 0 30.86-14.95 30.86-33.79s-13.97-33.46-30.86-33.46h-50v67.25zM1437.88 396.71c0-13.97 15.57-25.99 29.54-25.99 14.29 0 22.12 12.02 22.12 25.99s-11.7 25.67-25.99 25.67c-13.97 0-25.67-11.7-25.67-25.67zm4.88 45.16h41.91v162.45h-41.91V441.87zM1681.86 441.87v154.65c0 53.28-41.91 77.33-84.8 77.33-34.77 0-62.7-13.32-77-39.64l35.74-20.47c6.82 12.67 17.54 22.74 42.56 22.74 26.31 0 42.56-14.29 42.56-39.96v-17.54c-11.37 15.27-28.92 24.69-51.98 24.69-46.14 0-80.9-37.36-80.9-83.17 0-45.48 34.76-83.17 80.9-83.17 23.07 0 40.61 9.42 51.98 24.69v-20.14h40.94zm-40.94 78.62c0-25.67-19.17-44.18-45.49-44.18-26.31 0-45.48 18.52-45.48 44.18 0 25.99 19.17 44.51 45.48 44.51 26.32 0 45.49-18.52 45.49-44.51zM1871.55 504.57v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V376.89h41.91v83.17c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25zM1963.46 482.15v67.58c0 17.54 12.67 17.87 36.71 16.57v38.01c-58.81 6.5-78.62-10.72-78.62-54.58v-67.58h-28.27v-40.29h28.27v-32.81l41.91-12.67v45.48h36.71v40.29h-36.71zM2148.63 556.88c0 35.09-30.54 51.98-65.31 51.98-32.49 0-56.53-13.64-68.22-38.66l36.39-20.47c4.55 13.32 15.6 21.12 31.84 21.12 13.32 0 22.42-4.55 22.42-13.97 0-23.72-83.82-10.72-83.82-67.9 0-33.14 28.27-51.66 61.73-51.66 26.32 0 49.06 12.02 61.73 34.44l-35.74 19.49c-4.88-10.4-13.97-16.57-25.99-16.57-10.4 0-18.84 4.55-18.84 13.32-.01 24.04 83.81 9.1 83.81 68.88zM1286.22 692.79v53.93h96.11v42.89h-96.11v87.72h-44.83V649.9h143.54v42.88h-98.71zM1400.82 796.1c0-48.41 38.01-85.77 85.77-85.77s86.1 37.36 86.1 85.77-38.34 85.77-86.1 85.77c-47.76 0-85.77-37.36-85.77-85.77zm129.96 0c0-26.31-19.17-44.83-44.19-44.83-24.69 0-43.86 18.52-43.86 44.83 0 26.32 19.17 44.83 43.86 44.83 25.02.01 44.19-18.51 44.19-44.83zM1744.84 714.88v162.45h-41.91v-18.19c-9.75 14.62-26.64 22.74-48.41 22.74-34.44 0-61.4-24.04-61.4-67.25v-99.74h41.91v94.54c0 22.1 13.32 33.47 32.16 33.47 20.47 0 35.74-12.02 35.74-40.29v-87.72h41.91zM1934.86 777.58v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V714.88h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25zM2135.61 649.9v227.42h-41.91v-19.17c-11.7 14.95-28.92 23.72-52.63 23.72-43.54 0-79.27-37.36-79.27-85.77s35.74-85.77 79.27-85.77c23.72 0 40.94 8.77 52.63 23.72V649.9h41.91zm-41.91 146.2c0-27.29-19.17-45.81-44.84-45.81-25.99 0-45.16 18.52-45.16 45.81 0 27.29 19.17 45.81 45.16 45.81 25.67.01 44.84-18.51 44.84-45.81zM2337.35 714.88v162.45h-41.91v-19.17c-11.7 14.62-29.24 23.72-52.96 23.72-43.21 0-78.95-37.36-78.95-85.77s35.74-85.77 78.95-85.77c23.72 0 41.26 9.1 52.96 23.72v-19.17h41.91zm-41.91 81.22c0-27.29-19.17-45.81-45.16-45.81-25.66 0-44.83 18.52-44.83 45.81 0 27.29 19.17 45.81 44.83 45.81 25.99.01 45.16-18.51 45.16-45.81zM2433.46 755.17v67.58c0 17.54 12.67 17.87 36.71 16.57v38.01c-58.81 6.5-78.62-10.72-78.62-54.58v-67.58h-28.26v-40.29h28.26v-32.81l41.91-12.67v45.48h36.71v40.29h-36.71zM2494.84 669.72c0-13.97 11.7-25.99 25.67-25.99 14.29 0 25.99 12.02 25.99 25.99s-11.7 25.66-25.99 25.66c-13.97.01-25.67-11.69-25.67-25.66zm4.87 45.16h41.91v162.45h-41.91V714.88zM2565 796.1c0-48.41 38.01-85.77 85.77-85.77s86.1 37.36 86.1 85.77-38.34 85.77-86.1 85.77c-47.76 0-85.77-37.36-85.77-85.77zm129.96 0c0-26.31-19.17-44.83-44.19-44.83-24.69 0-43.86 18.52-43.86 44.83 0 26.32 19.17 44.83 43.86 44.83 25.02.01 44.19-18.51 44.19-44.83zM2911.62 777.58v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V714.88h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25z"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-opensats",viewBox:"0 0 5220 720"}},[a("path",{attrs:{d:"M0 435.197L229.609 291.597V288.121L0 144.259V29.0508L334.901 245.894V333.824L0 550.798V435.197Z",fill:"#FF3300"}}),a("path",{attrs:{d:"M486.969 623.844H902.627V719.643H486.969V623.844Z",fill:"#FF3300"}}),a("path",{attrs:{d:"M993.879 291.2C993.879 106.422 1084.61 0 1214.37 0C1344.13 0 1434.86 106.422 1434.86 291.2C1434.86 479.061 1344.13 587.581 1214.37 587.581C1084.61 587.581 993.879 479.061 993.879 291.2ZM1345.12 291.2C1345.12 155.01 1293.16 75.9967 1214.37 75.9967C1135.58 75.9967 1083.62 155.01 1083.62 291.2C1083.62 430.473 1135.58 511.584 1214.37 511.584C1293.16 511.584 1344.85 430.473 1344.85 291.2H1345.12Z",fill:"#FF3300"}}),a("path",{attrs:{d:"M1593.29 154.29H1663.81L1670.37 205.37H1673.13C1711.31 169.634 1764.71 144.258 1814.44 144.258C1925.96 144.258 1988.02 228.713 1988.02 359.855C1988.02 504.111 1897.95 587.911 1797.77 587.911C1759.13 587.911 1713.54 568.829 1677.39 535.454H1675.29L1679.43 612.237V749.936H1593.29V154.29ZM1899.65 359.855C1899.65 271.269 1867.44 215.599 1791.21 215.599C1756.57 215.599 1717.93 232.713 1679.69 272.121V472.112C1714.79 503.914 1754.61 515.455 1781.57 515.455C1848.75 515.717 1899.65 459.851 1899.65 359.855Z",fill:"#FF3300"}}),a("path",{attrs:{d:"M2118.96 365.035C2118.96 227.336 2222.75 143.93 2335.98 143.93C2460.16 143.93 2530.82 225.434 2530.82 343.527C2530.67 359.209 2529.35 374.858 2526.88 390.345H2178.73V327.2H2473.22L2454.52 348.249C2454.52 256.449 2410.17 210.55 2338.47 210.55C2264.41 210.55 2203.66 265.17 2203.66 364.904C2203.66 468.833 2268.8 520.044 2359.79 520.044C2407.09 520.044 2445.08 505.75 2483.39 482.8L2513.56 537.29C2464.7 569.886 2407.32 587.378 2348.57 587.582C2220.39 587.582 2118.96 505.947 2118.96 365.035Z",fill:"#FF3300"}}),a("path",{attrs:{d:"M2658.41 154.29H2729.07L2735.63 221.697H2739.04C2781.55 178.289 2829.83 144.258 2895.17 144.258C2994.1 144.258 3039.17 205.042 3039.17 315.201V577.026H2952.9V326.152C2952.9 252.319 2928.11 218.222 2865.39 218.222C2819.47 218.222 2788.31 240.844 2744.68 285.563V577.026H2658.41V154.29Z",fill:"#FF3300"}}),a("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M3208.36 504.308L3259.46 444.376C3303 486.486 3360.93 510.468 3421.5 511.455C3493.27 511.455 3533.03 478.669 3533.03 432.77C3533.03 377.362 3491.63 361.953 3435.41 338.217L3355.57 303.333C3297.64 280.514 3234.21 238.614 3234.21 155.143C3234.21 66.8186 3313.65 0.001814 3425.64 0.001814C3492.01 -0.442962 3555.93 25.0654 3603.75 71.0807L3558.87 126.554C3521.22 93.051 3472.3 74.9951 3421.9 75.9985C3362.2 75.9985 3322.11 103.604 3322.11 150.028C3322.11 199.206 3371.05 217.173 3420.98 236.516L3497.93 270.416C3569.04 298.087 3622.18 339.528 3622.18 422.344C3622.18 513.356 3545.36 587.583 3416.78 587.583C3339.11 587.998 3264.34 558.123 3208.36 504.308V504.308Z"}}),a("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M3762.96 465.557C3762.96 370.741 3849.04 324.055 4062.7 308.186C4059.62 255.73 4031.54 213.896 3956.3 213.896C3905.13 213.896 3854.68 237.304 3813.28 261.5L3780.48 203.994C3827.98 174.684 3898.57 144.062 3971.78 144.062C4088.42 144.062 4148.91 210.945 4148.91 322.678V577.027H4077.73L4070.84 522.144H4068.08C4022.82 557.553 3963.97 587.715 3906.04 587.715C3825.16 587.584 3762.96 540.045 3762.96 465.557ZM4062.7 462.278V363.266C3896.79 375.134 3847.26 408.576 3847.26 459C3847.26 501.489 3885.38 519.063 3930.65 519.063C3975.91 519.063 4018.88 497.883 4062.7 462.278Z"}}),a("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M4388.81 409.884V222.941H4272.17V158.813L4392.16 154.289L4403.44 20.2617H4475.02V154.289H4674.64V222.941H4475.02V410.146C4475.02 482.864 4500.73 518.076 4577.29 518.076C4610.27 517.981 4642.96 511.847 4673.73 499.979L4691.24 562.992C4648.39 578.951 4603.07 587.274 4557.35 587.581C4430.86 587.581 4388.81 516.043 4388.81 409.884Z"}}),a("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M4818.71 521.815L4857.09 466.014C4909.9 502.948 4972.98 522.353 5037.43 521.487C5102.31 521.487 5133.34 495.259 5133.34 463.85C5133.34 433.95 5115.76 415 5009.22 393.034C4897.7 369.887 4845.21 331.2 4845.21 267.203C4845.21 196.518 4908.85 143.93 5025.95 143.93C5093.26 143.93 5157.55 170.158 5199.93 198.878L5159.45 252.646C5117.79 224.668 5068.79 209.592 5018.6 209.304C4955.62 209.304 4931.28 234.155 4931.28 263.138C4931.28 295.923 4965.07 309.037 5048.12 326.938C5185.89 357.101 5220.33 392.509 5220.33 458.736C5220.33 529.487 5151.71 587.582 5026.8 587.582C4952.47 586.641 4880.07 563.76 4818.71 521.815V521.815Z"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-tether",viewBox:"0 0 111 90"}},[a("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M24.4825 0.862305H88.0496C89.5663 0.862305 90.9675 1.64827 91.7239 2.92338L110.244 34.1419C111.204 35.7609 110.919 37.8043 109.549 39.1171L58.5729 87.9703C56.9216 89.5528 54.2652 89.5528 52.6139 87.9703L1.70699 39.1831C0.305262 37.8398 0.0427812 35.7367 1.07354 34.1077L20.8696 2.82322C21.6406 1.60483 23.0087 0.862305 24.4825 0.862305ZM79.8419 14.8003V23.5597H61.7343V29.6329C74.4518 30.2819 83.9934 32.9475 84.0642 36.1425L84.0638 42.803C83.993 45.998 74.4518 48.6635 61.7343 49.3125V64.2168H49.7105V49.3125C36.9929 48.6635 27.4513 45.998 27.3805 42.803L27.381 36.1425C27.4517 32.9475 36.9929 30.2819 49.7105 29.6329V23.5597H31.6028V14.8003H79.8419ZM55.7224 44.7367C69.2943 44.7367 80.6382 42.4827 83.4143 39.4727C81.0601 36.9202 72.5448 34.9114 61.7343 34.3597V40.7183C59.7966 40.8172 57.7852 40.8693 55.7224 40.8693C53.6595 40.8693 51.6481 40.8172 49.7105 40.7183V34.3597C38.8999 34.9114 30.3846 36.9202 28.0304 39.4727C30.8066 42.4827 42.1504 44.7367 55.7224 44.7367Z",fill:"#009393"}}),t._v(" "),a("symbol",{attrs:{id:"supporter-unbank",viewBox:"0 0 766 132",fill:"none"}},[a("path",{attrs:{d:"M133.125 66.24v41.145c-.03 10.77-7.051 19.926-17.376 22.792-2.053.571-4.156.831-6.279.831-27.55 0-55.09.03-82.641-.01-13.209-.02-23.625-10.429-23.645-23.623v-82.52c0-13.194 10.425-23.593 23.635-23.613h82.641c13.209.02 23.605 10.429 23.645 23.623l.01 41.385.01-.01zM68.38 33.16H31.987c-.361 0-.721-.02-1.082 0-2.694.17-4.657 2.044-4.717 4.508-.07 2.805 1.662 4.779 4.517 5.019.711.06.851.321.851.952v34.904c0 .661-.19.952-.871 1.162-2.183.661-2.694 3.206-1.042 4.769.751.711 1.632.731 2.574.731h72.316.721c1.472-.05 2.594-1.012 2.844-2.434a2.77 2.77 0 0 0-1.853-3.016c-.641-.21-.771-.501-.771-1.092V43.76c0-.741.19-.972.982-1.082 3.595-.491 5.347-4.348 3.385-7.363-1.062-1.633-2.704-2.154-4.557-2.154H68.41h-.03zm-.12 53.026H28.261c-.881 0-1.763-.04-2.644.01-3.245.19-5.208 3.446-3.715 6.171.701 1.272 1.933 1.853 3.175 2.435l27.37 12.824 12.478 5.88c1.703.822 3.325.972 5.037.081 1.352-.692 2.754-1.293 4.136-1.914l23.144-10.519 14.952-6.822c1.542-.701 2.564-1.783 2.684-3.516.2-2.755-1.672-4.638-4.577-4.638H68.26v.01zm-.13-65.329H26.218c-1.933 0-2.574.631-2.604 2.585-.02 1.122 0 2.234 0 3.356 0 2.615.561 3.176 3.155 3.176h82.741c.281 0 .561.01.841 0 1.432-.08 2.133-.761 2.153-2.174v-4.198c0-2.294-.45-2.755-2.713-2.755H68.12l.01.01zM593.247 49.67c-.27 1.703-.11 3.426-.1 5.129l.13 13.665.241 25.777.23 16.18c.18 5.169-4.006 8.155-7.321 8.145-4.696 0-7.911-3.156-7.971-7.995l-.15-17.261-.261-25.777-.22-22.18-.231-19.415c-.03-3.827 1.903-6.622 5.248-7.714s6.58.05 8.813 3.136l46.859 64.517c.29.401.5.892 1.131 1.262v-1.473-59.849c0-4.378 2.524-7.463 6.61-8.125 4.356-.711 8.542 2.755 8.693 7.183.01.321 0 .641 0 .962v84.554c0 3.897-1.933 6.792-5.248 7.864-3.355 1.082-6.64-.11-8.913-3.246l-46.708-64.327c-.251-.351-.421-.782-.832-.992-.04-.05-.08-.09-.12-.14 0 .03-.01.06-.02.1.05 0 .11.01.16.02h-.02zm-288.231-.21v12.383l.17 12.823.321 31.768c.02 1.753.22 3.526.03 5.269-.481 4.368-3.936 7.113-8.453 6.833-3.715-.231-6.739-3.637-6.79-7.704l-.14-15.589-.24-26.017-.24-22.18-.231-21.218c-.03-3.737 1.933-6.562 5.218-7.624 3.325-1.082 6.61.07 8.833 3.126l47.069 64.808c.25.351.51.691.971 1.292v-1.523-60.45c0-4.087 2.584-7.123 6.56-7.774 4.156-.671 8.182 2.394 8.622 6.572a12.05 12.05 0 0 1 .06 1.192v85.396c0 6.071-6.239 9.697-11.476 6.702-1.062-.611-1.863-1.483-2.574-2.465l-47.009-64.707-.681-.912h-.02zm97.402 22.421l-.02-37.178.02-8.626c.141-2.585.641-5.019 2.855-6.702 1.522-1.162 3.334-1.573 5.197-1.583l20.66.01c11.617.26 21.502 7.153 25.257 17.602 2.955 8.225 1.703 16.109-2.413 23.653-1.102 2.004-1.122 2.004.591 3.436 5.287 4.428 9.504 9.608 11.376 16.37 4.317 15.628-4.026 35.375-24.355 38.861-3.636.621-7.341.471-11.016.511-5.759.06-11.527 0-17.296-.05-1.442-.01-2.894 0-4.306-.21-3.946-.592-6.129-3.246-6.469-7.725a27.22 27.22 0 0 1-.061-2.033V71.871l-.02.01zm15.864 15.598v14.156c0 .491-.171 1.062.701 1.052 6.119-.1 12.258.32 18.366-.171 10.806-.871 17.206-11.921 12.619-21.729-2.163-4.628-5.718-7.634-11.026-8.135a86.36 86.36 0 0 0-9.104-.361l-10.675.17c-.801 0-.891.321-.891.982l.01 14.035zm0-42.537l-.02 10.78c0 .731.19.942.941.942l11.156-.03c7.461-.15 12.619-5.891 11.988-13.274-.431-5.009-4.006-8.796-8.903-9.537-4.767-.721-9.564-.571-14.351-.701-.751-.02-.831.311-.831.922v10.9h.02zM704.27 68.014c.581-.17.811-.571 1.111-.872l21.692-21.76 24.676-24.875c3.165-3.196 7.992-3.286 11.076-.21 3.015 3.005 2.915 7.814-.22 10.97l-24.886 25.016-6.259 6.301c-.601.581-.551.942-.071 1.563l31.026 40.153 1.462 1.903c2.604 3.456 2.073 8.095-1.212 10.72-3.315 2.644-8.072 2.123-10.796-1.323l-11.016-14.226-20.299-26.307c-.431-.561-.691-.822-1.332-.16l-14.281 14.406c-.541.541-.681 1.092-.681 1.813v18.954c-.02 3.166-1.492 5.53-4.347 6.893-2.764 1.312-5.468 1.002-7.921-.832-1.893-1.412-2.935-3.366-2.935-5.77V25.446c0-3.997 3.305-7.273 7.341-7.384 4.086-.12 7.631 3.026 7.812 7.033.1 2.194.05 4.398.05 6.592v36.336l.01-.01zM258.548 50.873l-.03 24.955c-.361 19.586-13.54 37.278-32.838 41.355-16.464 3.486-30.154-1.823-40.83-14.687-5.688-6.852-8.642-14.927-9.484-23.793-.17-1.803-.13-3.587-.13-5.38V24.745c0-3.807 2.063-6.682 5.488-7.674 4.978-1.443 9.765 2.254 9.765 7.584v33.591l.06 17.872c.33 12.232 8.843 23.423 20.66 26.228 10.045 2.374 20.64-1.803 26.879-10.86 3.275-4.749 5.068-10.028 5.078-15.839l.07-50.852c0-3.787 2.083-6.702 5.478-7.704 4.937-1.463 9.784 2.184 9.794 7.413v26.388l.04-.02zm292.788 67.683c-3.295 0-5.898-1.824-7.15-5.04l-7.131-18.413c-.35-.922-.811-1.152-1.742-1.152h-33.75c-.871 0-1.312.19-1.642 1.092l-7.01 18.584c-1.322 3.436-4.297 5.199-8.072 4.909-3.105-.241-5.859-2.786-6.56-6.102-.33-1.572-.07-3.075.501-4.568l11.657-30.906 20.37-53.968c1.272-3.386 3.996-5.4 7.301-5.41 3.254-.01 5.998 1.963 7.28 5.28l32.948 84.904c1.853 4.789-.45 9.447-5.207 10.639-.591.151-1.192.131-1.783.151h-.01zm-20.66-39.843l-12.438-32.068-.271.611-11.547 30.546c-.39 1.032.151.912.802.912h21.842 1.612z",fill:"#3cce49"}}),a("path",{attrs:{d:"M68.38 33.16h36.874c1.863 0 3.495.511 4.557 2.154 1.962 3.005.21 6.873-3.385 7.363-.792.11-.982.341-.982 1.082v34.903c0 .591.13.892.771 1.092a2.76 2.76 0 0 1 1.853 3.016c-.24 1.423-1.372 2.384-2.844 2.434h-.721-72.316c-.931 0-1.823-.02-2.574-.731-1.652-1.563-1.142-4.118 1.042-4.769.681-.21.881-.501.871-1.162V43.639c0-.631-.14-.892-.851-.952-2.854-.24-4.587-2.214-4.517-5.019.06-2.455 2.023-4.338 4.717-4.508.361-.02.721 0 1.082 0H68.35h.03zM52.647 61.201l.02-17.271c0-.892-.16-1.252-1.172-1.232h-9.724c-.891-.01-1.152.23-1.152 1.132v34.543c0 .932.31 1.132 1.172 1.122h9.604c1.002.02 1.282-.27 1.272-1.272l-.02-17.031v.01zm42.973-.19l.02-17.141c0-.862-.18-1.192-1.122-1.172a249.45 249.45 0 0 1-9.484 0c-.921-.02-1.132.291-1.132 1.162v34.403c0 .902.18 1.262 1.182 1.242h9.364c.991.02 1.192-.321 1.192-1.232l-.02-17.261zm-21.561.08l.02-17.131c0-1.012-.29-1.282-1.282-1.262h-9.244c-.841-.01-1.082.24-1.082 1.082v34.633c0 .832.24 1.092 1.082 1.082h9.244c1.001.02 1.282-.281 1.272-1.272l-.02-17.131h.01zM68.26 86.187h42.041c2.905 0 4.777 1.883 4.577 4.638-.12 1.733-1.152 2.815-2.684 3.516l-14.952 6.823-23.144 10.519-4.136 1.914c-1.722.881-3.335.741-5.037-.081l-12.478-5.88-27.37-12.824c-1.242-.581-2.474-1.162-3.175-2.434-1.482-2.725.471-5.981 3.715-6.171.881-.05 1.762-.01 2.644-.01H68.26v-.01zm-.13-65.329h41.671c2.263 0 2.714.461 2.714 2.755v4.198c-.021 1.412-.722 2.094-2.154 2.174h-.841-82.741c-2.594 0-3.155-.561-3.155-3.176v-3.356c.03-1.954.661-2.585 2.604-2.585H68.14l-.01-.01z",fill:"#0e4160"}}),a("path",{attrs:{d:"M593.247 49.67c-.05 0-.11-.01-.16-.02 0-.03.01-.06.02-.1l.12.14.02-.02z",fill:"#fefefe"}}),a("path",{attrs:{d:"M52.647 61.201l.02 17.031c0 1.002-.27 1.292-1.272 1.272-3.205-.06-6.409-.05-9.604 0-.861.01-1.172-.18-1.172-1.122V43.84c0-.902.26-1.152 1.152-1.132h9.724c1.001-.02 1.172.341 1.172 1.232l-.02 17.271v-.01zm42.973-.19l.02 17.261c0 .912-.2 1.252-1.192 1.232a243.59 243.59 0 0 0-9.364 0c-1.002.02-1.182-.351-1.182-1.242V43.86c0-.871.21-1.182 1.132-1.162a249.45 249.45 0 0 0 9.484 0c.941-.02 1.122.311 1.122 1.172l-.02 17.141zm-21.562.08l.02 17.131c0 .992-.27 1.292-1.272 1.272-3.074-.06-6.159-.05-9.243 0-.841.01-1.081-.25-1.081-1.082V43.78c0-.842.24-1.092 1.081-1.082h9.243c.992-.02 1.292.25 1.282 1.262l-.02 17.131h-.01z",fill:"#3cce49"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-acinq",viewBox:"0 0 103 107"}},[a("circle",{attrs:{fill:"url(#acinq-a)",cx:"47.833",cy:"51.833",r:"56.832"}}),a("g",[a("g",{attrs:{fill:"none","stroke-width":"6","stroke-linejoin":"round"}},[a("path",{attrs:{stroke:"#47BF94",d:"M4.493 79.67c-6.778-11.574 21.882-35.135 41.646-39.636 16.598-3.78 55.176 4.066 53.752 17.433"}}),a("path",{attrs:{stroke:"#359F7E",d:"M10.125 18.133c8.624-9.988 41.797 13.701 51.001 30.018 9.723 17.237 12.87 55.271-1.103 55.351"}}),a("path",{attrs:{stroke:"#49DAAA",d:"M69.826 4.107c12.025 5.964 3.838 38.632-11.184 57.28C47.846 74.79 11.659 91.904 4.493 79.67"}}),a("path",{attrs:{stroke:"#49DAAA",d:"M99.891 57.467C98.471 70.799 62.529 72.9 43.83 64.781c-17.92-7.783-42.47-36.5-33.706-46.648"}}),a("path",{attrs:{stroke:"#AAF0D3",d:"M60.023 103.502c-14.291.08-24.609-29.721-23.918-51.916.758-24.377 20.678-53.948 33.721-47.479"}})])])]),t._v(" "),a("symbol",{attrs:{id:"supporter-nomics",viewBox:"0 0 600 600"}},[a("path",{attrs:{d:"M273.56 133A136.81 136.81 0 0 0 0 136.86v326.28a136.8 136.8 0 0 0 233.57 96.75L326.44 467A136.81 136.81 0 0 0 600 463.14V136.86a136.8 136.8 0 0 0-233.57-96.75L273.56 133",fill:"#a0f"}}),a("ellipse",{attrs:{cx:"302.18",cy:"300.04",rx:"136.81",ry:"136.86",fill:"#fff"}})]),t._v(" "),a("symbol",{attrs:{id:"supporter-strike",viewBox:"0 0 155 120"}},[a("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M7.06565 43.2477C1.90963 41.2685 -0.665684 35.4843 1.31353 30.3283C3.29274 25.1722 9.07699 22.5969 14.233 24.5761L51.4526 38.8634C51.4937 38.8798 51.535 38.896 51.5765 38.9119L70.2481 46.0792C75.4041 48.0584 81.1883 45.4831 83.1675 40.3271C85.1468 35.1711 82.5714 29.3868 77.4154 27.4076L77.4132 27.4068C77.4139 27.4064 77.4145 27.406 77.4151 27.4056L58.7436 20.2383C53.5876 18.2591 51.0123 12.4749 52.9915 7.31885C54.9707 2.16283 60.755 -0.412485 65.911 1.56673L120.828 22.6473C120.959 22.6977 121.089 22.7506 121.217 22.8059C121.453 22.8928 121.69 22.9815 121.926 23.0721C147.706 32.9681 160.583 61.8894 150.686 87.6695C140.79 113.45 111.869 126.326 86.089 116.43C85.5927 116.24 85.1011 116.042 84.6144 115.838C84.3783 115.766 84.1431 115.686 83.9091 115.596L30.0742 94.9308C24.9182 92.9516 22.3428 87.1673 24.3221 82.0113C26.3013 76.8553 32.0855 74.2799 37.2415 76.2592L55.9106 83.4256C55.9103 83.4242 55.9099 83.4229 55.9095 83.4215L55.9133 83.423C61.0694 85.4022 66.8536 82.8269 68.8328 77.6709C70.812 72.5148 68.2367 66.7306 63.0807 64.7514L54.6786 61.5261C54.6787 61.5257 54.6788 61.5252 54.6789 61.5247L7.06565 43.2477Z"}})])])]),t._v(" "),a("div",{staticClass:"supporters"},[a("h3",[t._v("Our Supporters")]),t._v(" "),a("p",[t._v("\n The BTCPay Server Project is proudly supported by these entities through the\n "),a("a",{attrs:{href:"https://foundation.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server Foundation")]),t._v(".\n ")]),t._v(" "),a("div",{staticClass:"logos"},[a("a",{attrs:{href:"https://spiral.xyz",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"100",height:"100"}},[a("use",{attrs:{href:"#supporter-spiral"}})]),t._v("\n Spiral\n ")]),t._v(" "),a("a",{attrs:{href:"https://opensats.org",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"120",height:"100"}},[a("use",{attrs:{href:"#supporter-opensats"}})]),t._v("\n OpenSats\n ")]),t._v(" "),a("a",{attrs:{href:"https://tether.to",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"100",height:"60"}},[a("use",{attrs:{href:"#supporter-tether"}})]),t._v("\n Tether\n ")]),t._v(" "),a("a",{attrs:{href:"https://hrf.org",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"110",height:"60"}},[a("use",{attrs:{href:"#supporter-hrf"}})]),t._v("\n HRF\n ")]),t._v(" "),a("a",{attrs:{href:"https://www.lunanode.com/",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"80",height:"60"}},[a("use",{attrs:{href:"#supporter-lunanode"}})]),t._v("\n LunaNode\n ")]),t._v(" "),a("a",{attrs:{href:"https://walletofsatoshi.com/",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"80",height:"80"}},[a("use",{attrs:{href:"#supporter-walletofsatoshi"}})]),t._v("\n Wallet of Satoshi\n ")]),t._v(" "),a("a",{attrs:{href:"https://coincards.com/",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"80",height:"80"}},[a("use",{attrs:{href:"#supporter-coincards"}})]),t._v("\n Coincards\n ")]),t._v(" "),a("a",{attrs:{href:"https://www.ivpn.net/",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"80",height:"80"}},[a("use",{attrs:{href:"#supporter-ivpn"}})]),t._v("\n IVPN\n ")]),t._v(" "),a("a",{attrs:{href:"https://www.unbank.com/",target:"_blank",rel:"noopener noreferrer"}},[a("svg",{attrs:{role:"img",width:"80",height:"80"}},[a("use",{attrs:{href:"#supporter-unbank"}})]),t._v("\n Unbank\n ")])]),t._v(" "),a("p",[t._v("If you'd like to support the project, please visit the "),a("a",{attrs:{href:"https://btcpayserver.org/donate/"}},[t._v("donation page")]),t._v(".")])])])}),[],!1,null,null,null);a.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/16.a83ce535.js b/assets/js/16.1cce81fb.js similarity index 93% rename from assets/js/16.a83ce535.js rename to assets/js/16.1cce81fb.js index 8e216f8398..ce1dc4ac0f 100644 --- a/assets/js/16.a83ce535.js +++ b/assets/js/16.1cce81fb.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{732:function(e,t,o){e.exports=o.p+"assets/img/BTCPayInfographic.93db91b4.png"},733:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--01-plugin-search.d542b753.png"},734:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--02-activated-configure.3054c6da.png"},735:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--03-settings--api-key-redirect.dee3eb63.png"},736:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode1.30c2a467.jpg"},737:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--05-api-auth-select-store.8765a27a.png"},738:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--06-api-auth-authorize-button.7ba04186.png"},739:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--07-api-auth-after-redirect-prefilled.70d8472c.png"},740:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--08-api-auth-save-webhook-created.53d476f0.png"},741:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode2.6ceb841e.jpg"},742:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode3.967e4347.jpg"},743:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode4.4cb74b80.jpg"},744:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode5.a35ab95d.jpg"},745:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode6.fa94aa2e.jpg"},746:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--7-man-api--copy-store-id.6c1943ea.png"},747:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--15-man-api--btcpay-settings-fill.298e9de1.png"},748:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--15-man-api--btcpay-settings-save.1f329e19.png"},749:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--reqbin-403-test.62547f5f.png"},906:function(e,t,o){"use strict";o.r(t);var a=o(17),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"woocommerce-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#woocommerce-integration"}},[e._v("#")]),e._v(" WooCommerce integration")]),e._v(" "),t("p",[e._v("This document explains how to "),t("strong",[e._v("integrate BTCPay Server into your WooCommerce store")]),e._v(".\nIf you do not have a store yet, follow "),t("a",{attrs:{href:"https://web.archive.org/web/20221003083329/https://bitcoinshirt.co/how-to-create-store-accept-bitcoin/5/",target:"_blank",rel:"noopener noreferrer"}},[e._v("this step by step article"),t("OutboundLink")],1),e._v(" to create one from scratch.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("This guide refers to the BTCPay for WooCommerce V2 plugin. You can find instructions for the now unmaintained legacy plugin (based on BitPay API) "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/blob/cba96292ceea9483711ab53c479a98357383f857/docs/WooCommerce.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#requirements"}},[e._v("Requirements")])]),t("li",[t("a",{attrs:{href:"#1-install-btcpay-plugin"}},[e._v("1. Install BTCPay Plugin")]),t("ul",[t("li",[t("a",{attrs:{href:"#11-install-plugin-from-wordpress-admin-dashboard-recommended"}},[e._v("1.1 Install plugin from WordPress Admin Dashboard (recommended)")])]),t("li",[t("a",{attrs:{href:"#12-download-and-install-plugin-from-github"}},[e._v("1.2 Download and install plugin from GitHub")])])])]),t("li",[t("a",{attrs:{href:"#2-connecting-woocommerce-and-btcpay-server"}},[e._v("2. Connecting WooCommerce and BTCPay Server")]),t("ul",[t("li",[t("a",{attrs:{href:"#21-connect-using-the-api-key-wizard-recommended"}},[e._v("2.1 Connect using the API key wizard (recommended)")])]),t("li",[t("a",{attrs:{href:"#22-connect-by-manually-creating-the-api-key-and-permissions"}},[e._v("2.2 Connect by manually creating the API key and permissions")])])])]),t("li",[t("a",{attrs:{href:"#3-testing-the-checkout"}},[e._v("3. Testing the checkout")])]),t("li",[t("a",{attrs:{href:"#4-customizing-btcpay-woocommerce-v2"}},[e._v("4. Customizing BTCPay WooCommerce V2")]),t("ul",[t("li",[t("a",{attrs:{href:"#41-global-settings"}},[e._v("4.1 Global Settings")])]),t("li",[t("a",{attrs:{href:"#42-payment-gateway-specific"}},[e._v("4.2 Payment Gateway specific")])])])]),t("li",[t("a",{attrs:{href:"#troubleshooting"}},[e._v("Troubleshooting")]),t("ul",[t("li",[t("a",{attrs:{href:"#error-call-to-undefined-function-btcpayserver-http-curl-init"}},[e._v("Error: Call to undefined function BTCPayServer\\Http\\curl_init()")])]),t("li",[t("a",{attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("The order states do not update although the invoice has been paid")])]),t("li",[t("a",{attrs:{href:"#i-get-an-error-during-checkout-but-not-sure-what-the-problem-is"}},[e._v("I get an error during checkout but not sure what the problem is.")])]),t("li",[t("a",{attrs:{href:"#i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[e._v("I have troubles with using the plugin or some other related questions")])]),t("li",[t("a",{attrs:{href:"#create-a-new-api-key"}},[e._v("Create a new API key")])]),t("li",[t("a",{attrs:{href:"#i-messed-around-with-the-webhook-how-to-fix"}},[e._v("I messed around with the webhook, how to fix")])])])]),t("li",[t("a",{attrs:{href:"#deploying-woocommerce-from-btcpay-server"}},[e._v("Deploying WooCommerce from BTCPay Server")])])])]),t("p"),e._v(" "),t("figure",[t("img",{attrs:{src:o(732),alt:"BTCPay - WooCommerce Infographic",title:"BTCPay - WooCommerce Infographic"}})]),e._v(" "),t("p",[e._v("To integrate BTCPay Server into an existing WooCommerce store, follow the steps below and/or watch this video:")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/ULcocDKZ1Mw/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=ULcocDKZ1Mw",title:"BTCPay - WooCommerce","data-id":"ULcocDKZ1Mw"}},[t("iframe",{attrs:{title:"BTCPay - WooCommerce","data-src":"https://www.youtube-nocookie.com/embed/ULcocDKZ1Mw?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Please ensure that you meet the following requirements before installing this plugin.")]),e._v(" "),t("ul",[t("li",[e._v("PHP version 8.0 or newer")]),e._v(" "),t("li",[e._v("The cURL, gd, intl, json, and mbstring PHP extensions are available")]),e._v(" "),t("li",[e._v("A WooCommerce website ("),t("a",{attrs:{href:"https://woocommerce.com/document/installing-uninstalling-woocommerce/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Installation instructions"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"#deploying-woocommerce-from-btcpay-server"}},[e._v("directly on BTCPay Server")]),e._v(")")]),e._v(" "),t("li",[e._v("You have a BTCPay Server version 1.3.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've a wallet connected to your store")])],1)]),e._v(" "),t("h2",{attrs:{id:"1-install-btcpay-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-install-btcpay-plugin"}},[e._v("#")]),e._v(" 1. Install BTCPay Plugin")]),e._v(" "),t("p",[e._v("There are three ways to "),t("strong",[e._v("download BTCPay for WooCommerce V2 plugin")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("From within WordPress via the Admin Dashboard (recommended, see below)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://wordpress.org/plugins/btcpay-greenfield-for-woocommerce/",target:"_blank",rel:"noopener noreferrer"}},[e._v("WordPress Repository"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/woocommerce-greenfield-plugin/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Repository"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"11-install-plugin-from-wordpress-admin-dashboard-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-install-plugin-from-wordpress-admin-dashboard-recommended"}},[e._v("#")]),e._v(" 1.1 Install plugin from WordPress Admin Dashboard (recommended)")]),e._v(" "),t("ol",[t("li",[e._v("WordPress > Plugins > Add New.")]),e._v(" "),t("li",[e._v('In Search, type "BTCPay V2".')]),e._v(" "),t("li",[e._v("Install and activate.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(733),alt:"BTCPay WordPress V2: Plugin installation",title:"BTCPay WordPress V2: Plugin installation"}})]),e._v(" "),t("h3",{attrs:{id:"12-download-and-install-plugin-from-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-download-and-install-plugin-from-github"}},[e._v("#")]),e._v(" 1.2 Download and install plugin from GitHub")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/btcpayserver/woocommerce-greenfield-plugin/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download the latest BTCPay plugin"),t("OutboundLink")],1),e._v(", upload it in .zip format to your WordPress site and activate it.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/6QcTWHRKZag/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=6QcTWHRKZag",title:"BTCPay Server Woo Plugin","data-id":"6QcTWHRKZag"}},[t("iframe",{attrs:{title:"BTCPay Server Woo Plugin","data-src":"https://www.youtube-nocookie.com/embed/6QcTWHRKZag?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"2-connecting-woocommerce-and-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-connecting-woocommerce-and-btcpay-server"}},[e._v("#")]),e._v(" 2. Connecting WooCommerce and BTCPay Server")]),e._v(" "),t("p",[e._v("BTCPay for WooCommerce V2 plugin is a "),t("strong",[e._v("bridge between your BTCPay Server (payment processor) and your e-commerce store")]),e._v(".\nNo matter if you're using a self-hosted or third-party solution, the connection process is identical.")]),e._v(" "),t("p",[e._v('You can either click on the notifications link saying "'),t("strong",[e._v("please configure the plugin here")]),e._v('" (see screenshot below), or:')]),e._v(" "),t("ul",[t("li",[e._v("Go to your store dashboard.")]),e._v(" "),t("li",[e._v("WooCommerce > Settings.")]),e._v(" "),t("li",[e._v("Click [BTCPay Settings] tab.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(734),alt:"BTCPay WordPress V2: Link to BTCPay Settings",title:"BTCPay WordPress V2: Link to BTCPay Settings"}})]),e._v(" "),t("h3",{attrs:{id:"21-connect-using-the-api-key-wizard-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-connect-using-the-api-key-wizard-recommended"}},[e._v("#")]),e._v(" 2.1 Connect using the API key wizard (recommended)")]),e._v(" "),t("ol",[t("li",[t("p",[e._v('In the field "'),t("strong",[e._v("BTCPay Server URL")]),e._v('", enter the full URL of your host (including the https) – https://btcpay.mydomain.com')])]),e._v(" "),t("li",[t("p",[e._v('Click on the button [Generate API key] (you will be redirected to BTCPay Server "Authorization request" page.\n'),t("img",{attrs:{src:o(735),alt:"BTCPay WordPress V2: Link to BTCPay Settings",title:"BTCPay WordPress V2: Link to BTCPay Settings"}})])]),e._v(" "),t("li",[t("p",[e._v("If you are not logged in to your BTCPay Server instance, do so now. (optional)\n"),t("img",{attrs:{src:o(736),alt:"BTCPay WordPress V2: Login to BTCPay Server",title:"BTCPay WordPress V2: Login to BTCPay Server"}})])]),e._v(" "),t("li",[t("p",[e._v("Select the store you want to connect to (if you only have one store it will get autoselected).\n"),t("img",{attrs:{src:o(737),alt:"BTCPay WordPress V2: Select store",title:"BTCPay WordPress V2: Select store"}})])]),e._v(" "),t("li",[t("p",[e._v("All required permissions are prefilled already, you just need to click [Authorize app]\n"),t("img",{attrs:{src:o(738),alt:"BTCPay WordPress V2: Click on authorize app",title:"BTCPay WordPress V2: Click on authorize app"}})])]),e._v(" "),t("li",[t("p",[e._v('You will get redirected back to your WooCommerce store and the API key and Store ID will be prefilled. Additionally, the webhook will have been created automatically for you. Check the "Webhook status" field to show "Webhook setup automatically." followed by an ID.\n'),t("img",{attrs:{src:o(739),alt:"BTCPay WordPress V2: Redirected back to plugin settings",title:"BTCPay WordPress V2: Redirected back to plugin settings"}})])]),e._v(" "),t("li",[t("p",[e._v("Before doing any further configuration click on "),t("strong",[e._v("[Save]")]),e._v(" to be sure all is set.\n"),t("img",{attrs:{src:o(740),alt:"BTCPay WordPress V2: Webhook created",title:"BTCPay WordPress V2: Webhook created"}})])])]),e._v(" "),t("p",[e._v('Congratulations, you are almost set. To make the Bitcoin payment gateway show up on your checkout. In the sidebar go to "WooCommerce" -> "Settings", click on the "Payments" tab and enable the "BTCPay (default)" payment gateway.')]),e._v(" "),t("p",[e._v('Continue with "3. Testing the checkout" below to make sure all works as expected.')]),e._v(" "),t("h3",{attrs:{id:"22-connect-by-manually-creating-the-api-key-and-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-connect-by-manually-creating-the-api-key-and-permissions"}},[e._v("#")]),e._v(" 2.2 Connect by manually creating the API key and permissions")]),e._v(" "),t("p",[e._v("If you can't use the wizard mentioned in the previous section you can also generate the API key manually.")]),e._v(" "),t("ol",[t("li",[e._v("Click on "),t("em",[e._v("[Account]")]),e._v(" -> "),t("em",[e._v("Manage Account")]),e._v(" on the bottom left\n"),t("img",{attrs:{src:o(741),alt:"BTCPay WordPress V2: Manage Account",title:"BTCPay WordPress V2: Manage Account"}})]),e._v(" "),t("li",[e._v("Go to the tab "),t("em",[e._v('"API Keys"')])]),e._v(" "),t("li",[e._v("Click "),t("em",[e._v("[Generate Key]")]),e._v(" to select permissions.\n"),t("img",{attrs:{src:o(742),alt:"BTCPay WordPress V2: API Keys overview",title:"BTCPay WordPress V2: API Keys overview"}})]),e._v(" "),t("li",[e._v("Click on the "),t("em",[e._v('"Select specific stores"')]),e._v(" link for the following permissions: "),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(", "),t("code",[e._v("Create non-approved pull payments")]),e._v(" (used for refunds)\n"),t("img",{attrs:{src:o(743),alt:"BTCPay WordPress V2: API Keys Permissions",title:"BTCPay WordPress V2: API Keys Permissions"}})]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Generate API Key]")]),e._v(" "),t("img",{attrs:{src:o(744),alt:"BTCPay WordPress V2: API Keys Save",title:"BTCPay WordPress V2: API Keys Save"}})]),e._v(" "),t("li",[e._v("Copy the generated API Key to your WordPress "),t("em",[e._v("BTCPay Settings")]),e._v(" form (Advanced settings)\n"),t("img",{attrs:{src:o(745),alt:"BTCPay WordPress V2: Copy API Key",title:"BTCPay WordPress V2: Copy API Key"}})]),e._v(" "),t("li",[e._v("Copy the store ID to your WordPress "),t("em",[e._v("BTCPay Settings")]),e._v(" form (Advanced settings)\n"),t("img",{attrs:{src:o(746),alt:"BTCPay WordPress V2: Copy Store ID",title:"BTCPay WordPress V2: Copy Store ID"}})]),e._v(" "),t("li",[e._v("On the BTCPay Settings form:")])]),e._v(" "),t("ul",[t("li",[e._v("Enter "),t("em",[e._v("BTCPay Server URL")]),e._v(" (URL of your BTCPay Server instance, where you just created the API key)")]),e._v(" "),t("li",[e._v('Click the "Advanced settings" checkbox to enter '),t("em",[e._v("BTCPay Server API Key")]),e._v(" and "),t("em",[e._v("Store ID")]),e._v(" (leave "),t("em",[e._v("Webhook secret")]),e._v(" empty)")]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Save]")]),e._v(" at the bottom of the page\n"),t("img",{attrs:{src:o(747),alt:"BTCPay WordPress V2: Save BTCPay Settings form",title:"BTCPay WordPress V2: Save BTCPay Settings form"}})])]),e._v(" "),t("ol",{attrs:{start:"9"}},[t("li",[e._v('Make sure you see the notification "'),t("em",[e._v("BTCPay Server: Successfully registered a new webhook on BTCPay Server")]),e._v('" and '),t("em",[e._v("Setup status")]),e._v(" and "),t("em",[e._v("Webhook status")]),e._v(" are green.\n"),t("img",{attrs:{src:o(748),alt:"BTCPay WordPress V2: Save BTCPay Settings form saved",title:"BTCPay WordPress V2: Save BTCPay Settings form saved"}})])]),e._v(" "),t("p",[e._v('Congratulations, you are almost set. To make the Bitcoin payment gateway show up on your checkout. In the sidebar go to "WooCommerce" -> "Settings", click on the "Payments" tab and enable the "BTCPay (default)" payment gateway.')]),e._v(" "),t("p",[e._v('Continue with "3. Testing the checkout" below to make sure all works as expected.')]),e._v(" "),t("h2",{attrs:{id:"3-testing-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-testing-the-checkout"}},[e._v("#")]),e._v(" 3. Testing the checkout")]),e._v(" "),t("p",[e._v("Making a small test-purchase from your store will give you peace of mind.\nAlways make sure that everything is set up correctly before going live.\nThe final video guides you through the steps of setting a gap limit in your Electrum wallet and testing the checkout process.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Fi3pYpzGmmo/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Fi3pYpzGmmo",title:"BTCPay Server Checkout","data-id":"Fi3pYpzGmmo"}},[t("iframe",{attrs:{title:"BTCPay Server Checkout","data-src":"https://www.youtube-nocookie.com/embed/Fi3pYpzGmmo?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"4-customizing-btcpay-woocommerce-v2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#4-customizing-btcpay-woocommerce-v2"}},[e._v("#")]),e._v(" 4. Customizing BTCPay WooCommerce V2")]),e._v(" "),t("h3",{attrs:{id:"41-global-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#41-global-settings"}},[e._v("#")]),e._v(" 4.1 Global Settings")]),e._v(" "),t("p",[e._v("Can be found at "),t("em",[e._v("WooCommerce -> Settings -> Tab [BTCPay Settings]")])]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Server URL")])]),e._v(" "),t("p",[e._v("URL to your BTCPay Server instance, including protocol e.g. "),t("code",[e._v("https://btcpay.yourdomain.com")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay API Key")])]),e._v(" "),t("p",[e._v("Your API Key. (Was auto-generated in the steps before).")]),e._v(" "),t("p",[t("strong",[e._v("Store ID")])]),e._v(" "),t("p",[e._v("The store ID of your BTCPay Server store. Can be found on the store settings page.")]),e._v(" "),t("p",[t("strong",[e._v("Default Customer Message")])]),e._v(" "),t("p",[e._v('Here you can customize the customer message shown after selecting BTCPay payment gateway on checkout. This can be overwritten on the payment gateway settings for each gateway if you use the "Separate payment gateways" option.')]),e._v(" "),t("p",[t("strong",[e._v('Invoice pass to "Settled" state after')])]),e._v(" "),t("p",[e._v("Set after how many confirmations a payment is considered fully paid and settled. Defaults to what is configured on BTCPay store settings.")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Order Statuses")])]),e._v(" "),t("p",[e._v("Depending on your business model and store settings, you may want to configure your order statuses.\nYou can set BTCPay to trigger certain order status in WooCommerce automatically.")]),e._v(" "),t("ul",[t("li",[t("em",[e._v("New")]),e._v(" - order placed, not paid yet.")]),e._v(" "),t("li",[t("em",[e._v("Paid")]),e._v(" - order paid, not enough confirmations on the blockchain, yet.")]),e._v(" "),t("li",[t("em",[e._v("Settled")]),e._v(" - order paid, confirmed on the blockchain.")]),e._v(" "),t("li",[t("em",[e._v("Settled (paid over)")]),e._v(" - order paid, confirmed on the blockchain but paid over.")]),e._v(" "),t("li",[t("em",[e._v("Invalid")]),e._v(" - order paid, did not get a sufficient number of confirmations in a pre-defined time-frame set in BTCPay store settings, or manually marked invalid.")]),e._v(" "),t("li",[t("em",[e._v("Expired")]),e._v(" - invoice expired, order not paid.")]),e._v(" "),t("li",[t("em",[e._v("Expired with partial payment")]),e._v(" - invoice expired and paid partially")])]),e._v(" "),t("p",[e._v('Take time to think about how you wish to automate these statuses.\nIf you do not wish certain BTCPay status to trigger WooCommerce order status, you can leave it as default "- no mapping / defaults -".')]),e._v(" "),t("p",[e._v('Note: you should keep the "Settled" order status to "- no mapping / defaults-" if you sell digital and physical products. For digital products WooCommerce will automatically skip the "Processing" status and go directly to "Completed" for those orders only containing digital products.')]),e._v(" "),t("p",[e._v('Another example, if a merchant wants to send an email notifying the customer that the payment has been received, but the order will be processed upon confirmation, the merchant would have to set order status for "Paid" to "On hold". Then, the merchant would have to customize and trigger email for "On hold" status of the order in WooCommerce.')]),e._v(" "),t("p",[e._v("It takes some time to find a perfect formula, so users should test things out before going live.")]),e._v(" "),t("p",[t("strong",[e._v("Modal checkout")])]),e._v(" "),t("p",[e._v("Enable this option if you want the BTCPay Server invoice to be shown directly on the checkout page (and do not redirect customers to your BTCPay Server instance).")]),e._v(" "),t("p",[t("strong",[e._v("Separate Payment Gateways")])]),e._v(" "),t("p",[e._v("If this option is enabled the plugin will generate one separate payment gateway per supported payment method on BTCPay Server. E.g. if you have BTC, LightningNetwork and maybe Liquid Assets enabled on your BTCPay Server store, then you will have a separate gateway available for each. This allows many new use cases like discount per gateway or country based restrictions. More details "),t("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-additional-token-support"}},[e._v("here")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("Send customer data to BTCPayServer")])]),e._v(" "),t("p",[e._v("By default "),t("em",[e._v("no")]),e._v(" customer data beside email is sent to BTCPay Server. If you want to send customer address data to BTCPay Server you can enable it here.")]),e._v(" "),t("p",[t("strong",[e._v("Debug Log")])]),e._v(" "),t("p",[e._v("This option is helpful in case you have a problem and need more information on what is going on. The logs can be then found under WooCommerce -> Status -> Log. Make sure you disable this again after debugging as it will fill up your filesystem with logs.")]),e._v(" "),t("h3",{attrs:{id:"42-payment-gateway-specific"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#42-payment-gateway-specific"}},[e._v("#")]),e._v(" 4.2 Payment Gateway specific")]),e._v(" "),t("p",[e._v('Depending on wheter you have above mentioned "Separate Payment Gateways" enabled you will have one or more Payment Gateways available to configure in the payment gateway settings via '),t("em",[e._v("WooCommerce -> Settings -> Tab [Payments]")])]),e._v(" "),t("p",[e._v("On all payment gateways you can set the following options:")]),e._v(" "),t("p",[t("strong",[e._v("Title")]),e._v('\nThe shown payment gateway text on the checkout page. Defaults to "BTCPay (Bitcoin, Lightning Network, ...)".')]),e._v(" "),t("p",[t("strong",[e._v("Customer Message")])]),e._v(" "),t("p",[e._v("Here you can customize message shown after selecting BTCPay payment gateway.")]),e._v(" "),t("p",[t("strong",[e._v("Gateway Icon")])]),e._v(" "),t("p",[e._v("Upload or select a custom icon to be shown next to the payment gateway during checkout. Defaults to BTCPay logo.")]),e._v(" "),t("h4",{attrs:{id:"421-btcpay-default"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#421-btcpay-default"}},[e._v("#")]),e._v(" 4.2.1 BTCPay (default)")]),e._v(" "),t("p",[e._v("Additional options only available for the default payment gateway:")]),e._v(" "),t("p",[t("strong",[e._v("Enforce payment tokens")])]),e._v(" "),t("p",[e._v('With "Separate Payment Gateways" feature enabled in BTCPay Settings you can use this option to enforce only payment tokens. This means that the created invoice will '),t("em",[e._v("only")]),e._v(' include tokens of type "payment" and '),t("em",[e._v("not any")]),e._v(' of type "promotion". See difference of token types '),t("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-additional-token-support#token-types"}},[e._v("here")])],1),e._v(" "),t("h4",{attrs:{id:"422-separate-payment-gateways"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#422-separate-payment-gateways"}},[e._v("#")]),e._v(" 4.2.2 Separate Payment Gateways")]),e._v(" "),t("p",[e._v("Additional options only available for the separate payment gateways (if that feature is enabled):")]),e._v(" "),t("p",[t("strong",[e._v("Token Type")])]),e._v(" "),t("p",[e._v('By default type "payment" is selected. But if you have Liquid Assets with your own issued asset/token (e.g. used as voucher) you can select "promotion" here. Those are processed differently than normal payment tokens. Details can be found '),t("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-additional-token-support#promotional-tokens-100-discount"}},[e._v("here")])],1),e._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h3",{attrs:{id:"error-call-to-undefined-function-btcpayserver-http-curl-init"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#error-call-to-undefined-function-btcpayserver-http-curl-init"}},[e._v("#")]),e._v(" Error: Call to undefined function BTCPayServer\\Http\\curl_init()")]),e._v(" "),t("p",[e._v("Please make sure your PHP version supports the cURL extension (as written in the requirements above). You can install it on Debian/Ubuntu by running the command "),t("code",[e._v("sudo apt install php-curl")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("#")]),e._v(" The order states do not update although the invoice has been paid")]),e._v(" "),t("p",[e._v("Please check first if the webhook is created under the BTCPay Server store settings. If there is no webhook created you can visit on your WooCommerce store BTCPay Settings tab under WooCommerce settings and hit the save button. This will create the webhook.")]),e._v(" "),t("p",[e._v('You may also check the details of your invoice if there were any errors on sending the webhook request. Some hosting providers, firewall setups or WordPress security plugins (like Wordfence) block POST requests to your WordPress site which lead to a http status of "403 Forbidden" or "503 Service Unavailable".')]),e._v(" "),t("p",[e._v("You can check and verify yourself if there is something blocking requests to your site in one of these two ways:")]),e._v(" "),t("p",[t("strong",[e._v("Check using a command line (Linux or MacOS):")]),e._v("\n(replace EXAMPLE.COM with your WordPress site URL)")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -vX POST -H "Content-Type: application/json" \\\n -d \'{"data": "test"}\' https://EXAMPLE.COM/?wc-api=btcpaygf_default\n')])])]),t("p",[e._v('On the response, if you see that line "HTTP/1.1 500" or "HTTP/2 500" and the message "Webhook request validation failed" that means that your site is not blocking the request with a "403 Forbidden".')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('.... snip ....\n* We are completely uploaded and fine\n< HTTP/2 500\n< server: nginx\n< date: Sun, 05 Jun 2022 16:55:08 GMT\n< content-type: application/json; charset=UTF-8\n< x-powered-by: PHP/8.1.6\n< expires: Wed, 11 Jan 1984 05:00:00 GMT\n< cache-control: no-cache, must-revalidate, max-age=0\n<\n* Connection #0 to host example.com left intact\n{"code":"wp_die","message":"Webhook request validation failed.","data":{"status":500},"additional_errors":[]}\n')])])]),t("p",[e._v('On the other side, if you see that line "HTTP/1.1 403 Forbidden" or "HTTP/2 403" then something is blocking data sent to your WordPress site. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests.')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".... snip ....\n* upload completely sent off: 16 out of 16 bytes\n< HTTP/1.1 403 Forbidden\n< access-control-allow-origin: *\n< Content-Type: application/json; charset=UTF-8\n< X-Cloud-Trace-Context: 4f07d5b2e5c2f05949d04421a8e2dd6a\n< Date: Thu, 17 Feb 2022 10:06:50 GMT\n< Server: Google Frontend\n< Content-Length: 26\n")])])]),t("p",[t("strong",[e._v("Check using an online service (if you do not have a command line available:")])]),e._v(" "),t("ul",[t("li",[e._v("Go to "),t("a",{attrs:{href:"https://reqbin.com/post-online",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://reqbin.com/post-online"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Enter your domain: "),t("code",[e._v("https://EXAMPLE.COM/?wc-api=btcpaygf_default")]),e._v("\n(replace EXAMPLE.COM with your WordPress site URL)")]),e._v(" "),t("li",[e._v('Make sure "POST" is selected')]),e._v(" "),t("li",[e._v("Click [Send]")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(749),alt:"BTCPay WordPress V2: Debug 403 error with reqbin.com",title:"BTCPay WordPress V2: Debug 403 error with reqbin.com"}})]),e._v(" "),t("p",[e._v('If you see "Status 403 (Forbidden)" then POST requests to your site are blocked for some reason. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests.')]),e._v(" "),t("h3",{attrs:{id:"i-get-an-error-during-checkout-but-not-sure-what-the-problem-is"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-get-an-error-during-checkout-but-not-sure-what-the-problem-is"}},[e._v("#")]),e._v(" I get an error during checkout but not sure what the problem is.")]),e._v(" "),t("p",[e._v("In your BTCPay Settings in your admin dashboard: "),t("em",[e._v("WooCommerce -> Settings: Tab [BTCPay Settings]")]),e._v(" you can enable debug mode by setting the checkbox on that option.")]),e._v(" "),t("p",[e._v("You can now find more detailed Logs when you click the [View Logs] button or you go to "),t("em",[e._v("WooCommerce -> Status: Tab [Logs]")]),e._v(" and select the most recent btcpay logs.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Warning")]),e._v(" "),t("p",[e._v("Please make sure that you disable the debugging mode again after you finished investigating, otherwise your site performance may be impacted and also write lots of logging data in your filesystem for no reason.")])]),e._v(" "),t("p",[e._v("Additionally you can also look into your webservers error logs if you find any error that is related to BTCPay plugin.")]),e._v(" "),t("h3",{attrs:{id:"i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[e._v("#")]),e._v(" I have troubles with using the plugin or some other related questions")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")]),e._v(" "),t("h3",{attrs:{id:"create-a-new-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-api-key"}},[e._v("#")]),e._v(" Create a new API key")]),e._v(" "),t("p",[e._v("If you have been using the WooCommerce V2 plugin prior to version 2.0.0, your API key won't have the required permissions to issue refunds via pull-payments. If you want to use that feature, you can create a new API key (editing an API key is not currently supported). You can use the above described "),t("a",{attrs:{href:"#21-connect-using-the-api-key-wizard--recommended-"}},[e._v("2.1 Connect using API key wizard")]),e._v(" or the "),t("a",{attrs:{href:"#22-connect-by-manually-creating-the-api-key-and-permissions"}},[e._v("manual API key generation")]),e._v(". The configured webhook will continue to work, and no change is needed.")]),e._v(" "),t("h3",{attrs:{id:"i-messed-around-with-the-webhook-how-to-fix"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-messed-around-with-the-webhook-how-to-fix"}},[e._v("#")]),e._v(" I messed around with the webhook, how to fix")]),e._v(" "),t("p",[e._v("Suppose you accidentally changed the WooCommerce webhook, and it is not working anymore. In that case, you can quickly force a re-creation of it when you delete the API key on BTCPay Server and then go to the BTCPay Server Settings (on your WordPress site) and hit save again. You should see a message that the webhook was successfully created.")]),e._v(" "),t("h2",{attrs:{id:"deploying-woocommerce-from-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#deploying-woocommerce-from-btcpay-server"}},[e._v("#")]),e._v(" Deploying WooCommerce from BTCPay Server")]),e._v(" "),t("p",[e._v("If you already have BTCPay Server, you can very easily start WooCommerce from your existing environment.")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Point the external IP of the virtual machine where your BTCPay is hosted to your store domain, for example store.yourdomain.com.")])]),e._v(" "),t("li",[t("p",[e._v("Log into your BTCPay server as root.")])])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n")])])]),t("ol",{attrs:{start:"3"}},[t("li",[e._v("Set up WooCommerce variables. You can add "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-woocommerce.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("optional variables"),t("OutboundLink")],1),e._v(" as well.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-woocommerce"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("WOOCOMMERCE_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"yourstoredomain.com"')]),e._v("\n")])])]),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Lastly, just run BTCPay Setup script which will add the set up variables.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("ol",{attrs:{start:"5"}},[t("li",[e._v("Go to your store's domain name, in our example that's store.yourdomain.com and follow the WordPress installation wizard.")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[16],{713:function(e,t,o){e.exports=o.p+"assets/img/BTCPayInfographic.93db91b4.png"},714:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--01-plugin-search.d542b753.png"},715:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--02-activated-configure.3054c6da.png"},716:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--03-settings--api-key-redirect.dee3eb63.png"},717:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode1.30c2a467.jpg"},718:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--05-api-auth-select-store.8765a27a.png"},719:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--06-api-auth-authorize-button.7ba04186.png"},720:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--07-api-auth-after-redirect-prefilled.70d8472c.png"},721:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--08-api-auth-save-webhook-created.53d476f0.png"},722:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode2.6ceb841e.jpg"},723:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode3.967e4347.jpg"},724:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode4.4cb74b80.jpg"},725:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode5.a35ab95d.jpg"},726:function(e,t,o){e.exports=o.p+"assets/img/btcpayWooLmode6.fa94aa2e.jpg"},727:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--7-man-api--copy-store-id.6c1943ea.png"},728:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--15-man-api--btcpay-settings-fill.298e9de1.png"},729:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--15-man-api--btcpay-settings-save.1f329e19.png"},730:function(e,t,o){e.exports=o.p+"assets/img/btcpay-wc-2--reqbin-403-test.62547f5f.png"},904:function(e,t,o){"use strict";o.r(t);var a=o(17),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"woocommerce-integration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#woocommerce-integration"}},[e._v("#")]),e._v(" WooCommerce integration")]),e._v(" "),t("p",[e._v("This document explains how to "),t("strong",[e._v("integrate BTCPay Server into your WooCommerce store")]),e._v(".\nIf you do not have a store yet, follow "),t("a",{attrs:{href:"https://web.archive.org/web/20221003083329/https://bitcoinshirt.co/how-to-create-store-accept-bitcoin/5/",target:"_blank",rel:"noopener noreferrer"}},[e._v("this step by step article"),t("OutboundLink")],1),e._v(" to create one from scratch.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("Note")]),e._v(" "),t("p",[e._v("This guide refers to the BTCPay for WooCommerce V2 plugin. You can find instructions for the now unmaintained legacy plugin (based on BitPay API) "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/blob/cba96292ceea9483711ab53c479a98357383f857/docs/WooCommerce.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#requirements"}},[e._v("Requirements")])]),t("li",[t("a",{attrs:{href:"#1-install-btcpay-plugin"}},[e._v("1. Install BTCPay Plugin")]),t("ul",[t("li",[t("a",{attrs:{href:"#11-install-plugin-from-wordpress-admin-dashboard-recommended"}},[e._v("1.1 Install plugin from WordPress Admin Dashboard (recommended)")])]),t("li",[t("a",{attrs:{href:"#12-download-and-install-plugin-from-github"}},[e._v("1.2 Download and install plugin from GitHub")])])])]),t("li",[t("a",{attrs:{href:"#2-connecting-woocommerce-and-btcpay-server"}},[e._v("2. Connecting WooCommerce and BTCPay Server")]),t("ul",[t("li",[t("a",{attrs:{href:"#21-connect-using-the-api-key-wizard-recommended"}},[e._v("2.1 Connect using the API key wizard (recommended)")])]),t("li",[t("a",{attrs:{href:"#22-connect-by-manually-creating-the-api-key-and-permissions"}},[e._v("2.2 Connect by manually creating the API key and permissions")])])])]),t("li",[t("a",{attrs:{href:"#3-testing-the-checkout"}},[e._v("3. Testing the checkout")])]),t("li",[t("a",{attrs:{href:"#4-customizing-btcpay-woocommerce-v2"}},[e._v("4. Customizing BTCPay WooCommerce V2")]),t("ul",[t("li",[t("a",{attrs:{href:"#41-global-settings"}},[e._v("4.1 Global Settings")])]),t("li",[t("a",{attrs:{href:"#42-payment-gateway-specific"}},[e._v("4.2 Payment Gateway specific")])])])]),t("li",[t("a",{attrs:{href:"#troubleshooting"}},[e._v("Troubleshooting")]),t("ul",[t("li",[t("a",{attrs:{href:"#error-call-to-undefined-function-btcpayserver-http-curl-init"}},[e._v("Error: Call to undefined function BTCPayServer\\Http\\curl_init()")])]),t("li",[t("a",{attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("The order states do not update although the invoice has been paid")])]),t("li",[t("a",{attrs:{href:"#i-get-an-error-during-checkout-but-not-sure-what-the-problem-is"}},[e._v("I get an error during checkout but not sure what the problem is.")])]),t("li",[t("a",{attrs:{href:"#i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[e._v("I have troubles with using the plugin or some other related questions")])]),t("li",[t("a",{attrs:{href:"#create-a-new-api-key"}},[e._v("Create a new API key")])]),t("li",[t("a",{attrs:{href:"#i-messed-around-with-the-webhook-how-to-fix"}},[e._v("I messed around with the webhook, how to fix")])])])]),t("li",[t("a",{attrs:{href:"#deploying-woocommerce-from-btcpay-server"}},[e._v("Deploying WooCommerce from BTCPay Server")])])])]),t("p"),e._v(" "),t("figure",[t("img",{attrs:{src:o(713),alt:"BTCPay - WooCommerce Infographic",title:"BTCPay - WooCommerce Infographic"}})]),e._v(" "),t("p",[e._v("To integrate BTCPay Server into an existing WooCommerce store, follow the steps below and/or watch this video:")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/ULcocDKZ1Mw/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=ULcocDKZ1Mw",title:"BTCPay - WooCommerce","data-id":"ULcocDKZ1Mw"}},[t("iframe",{attrs:{title:"BTCPay - WooCommerce","data-src":"https://www.youtube-nocookie.com/embed/ULcocDKZ1Mw?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Please ensure that you meet the following requirements before installing this plugin.")]),e._v(" "),t("ul",[t("li",[e._v("PHP version 8.0 or newer")]),e._v(" "),t("li",[e._v("The cURL, gd, intl, json, and mbstring PHP extensions are available")]),e._v(" "),t("li",[e._v("A WooCommerce website ("),t("a",{attrs:{href:"https://woocommerce.com/document/installing-uninstalling-woocommerce/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Installation instructions"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"#deploying-woocommerce-from-btcpay-server"}},[e._v("directly on BTCPay Server")]),e._v(")")]),e._v(" "),t("li",[e._v("You have a BTCPay Server version 1.3.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've a wallet connected to your store")])],1)]),e._v(" "),t("h2",{attrs:{id:"1-install-btcpay-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-install-btcpay-plugin"}},[e._v("#")]),e._v(" 1. Install BTCPay Plugin")]),e._v(" "),t("p",[e._v("There are three ways to "),t("strong",[e._v("download BTCPay for WooCommerce V2 plugin")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("From within WordPress via the Admin Dashboard (recommended, see below)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://wordpress.org/plugins/btcpay-greenfield-for-woocommerce/",target:"_blank",rel:"noopener noreferrer"}},[e._v("WordPress Repository"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/woocommerce-greenfield-plugin/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Repository"),t("OutboundLink")],1)])]),e._v(" "),t("h3",{attrs:{id:"11-install-plugin-from-wordpress-admin-dashboard-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-install-plugin-from-wordpress-admin-dashboard-recommended"}},[e._v("#")]),e._v(" 1.1 Install plugin from WordPress Admin Dashboard (recommended)")]),e._v(" "),t("ol",[t("li",[e._v("WordPress > Plugins > Add New.")]),e._v(" "),t("li",[e._v('In Search, type "BTCPay V2".')]),e._v(" "),t("li",[e._v("Install and activate.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(714),alt:"BTCPay WordPress V2: Plugin installation",title:"BTCPay WordPress V2: Plugin installation"}})]),e._v(" "),t("h3",{attrs:{id:"12-download-and-install-plugin-from-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-download-and-install-plugin-from-github"}},[e._v("#")]),e._v(" 1.2 Download and install plugin from GitHub")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/btcpayserver/woocommerce-greenfield-plugin/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download the latest BTCPay plugin"),t("OutboundLink")],1),e._v(", upload it in .zip format to your WordPress site and activate it.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/6QcTWHRKZag/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=6QcTWHRKZag",title:"BTCPay Server Woo Plugin","data-id":"6QcTWHRKZag"}},[t("iframe",{attrs:{title:"BTCPay Server Woo Plugin","data-src":"https://www.youtube-nocookie.com/embed/6QcTWHRKZag?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"2-connecting-woocommerce-and-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-connecting-woocommerce-and-btcpay-server"}},[e._v("#")]),e._v(" 2. Connecting WooCommerce and BTCPay Server")]),e._v(" "),t("p",[e._v("BTCPay for WooCommerce V2 plugin is a "),t("strong",[e._v("bridge between your BTCPay Server (payment processor) and your e-commerce store")]),e._v(".\nNo matter if you're using a self-hosted or third-party solution, the connection process is identical.")]),e._v(" "),t("p",[e._v('You can either click on the notifications link saying "'),t("strong",[e._v("please configure the plugin here")]),e._v('" (see screenshot below), or:')]),e._v(" "),t("ul",[t("li",[e._v("Go to your store dashboard.")]),e._v(" "),t("li",[e._v("WooCommerce > Settings.")]),e._v(" "),t("li",[e._v("Click [BTCPay Settings] tab.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(715),alt:"BTCPay WordPress V2: Link to BTCPay Settings",title:"BTCPay WordPress V2: Link to BTCPay Settings"}})]),e._v(" "),t("h3",{attrs:{id:"21-connect-using-the-api-key-wizard-recommended"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-connect-using-the-api-key-wizard-recommended"}},[e._v("#")]),e._v(" 2.1 Connect using the API key wizard (recommended)")]),e._v(" "),t("ol",[t("li",[t("p",[e._v('In the field "'),t("strong",[e._v("BTCPay Server URL")]),e._v('", enter the full URL of your host (including the https) – https://btcpay.mydomain.com')])]),e._v(" "),t("li",[t("p",[e._v('Click on the button [Generate API key] (you will be redirected to BTCPay Server "Authorization request" page.\n'),t("img",{attrs:{src:o(716),alt:"BTCPay WordPress V2: Link to BTCPay Settings",title:"BTCPay WordPress V2: Link to BTCPay Settings"}})])]),e._v(" "),t("li",[t("p",[e._v("If you are not logged in to your BTCPay Server instance, do so now. (optional)\n"),t("img",{attrs:{src:o(717),alt:"BTCPay WordPress V2: Login to BTCPay Server",title:"BTCPay WordPress V2: Login to BTCPay Server"}})])]),e._v(" "),t("li",[t("p",[e._v("Select the store you want to connect to (if you only have one store it will get autoselected).\n"),t("img",{attrs:{src:o(718),alt:"BTCPay WordPress V2: Select store",title:"BTCPay WordPress V2: Select store"}})])]),e._v(" "),t("li",[t("p",[e._v("All required permissions are prefilled already, you just need to click [Authorize app]\n"),t("img",{attrs:{src:o(719),alt:"BTCPay WordPress V2: Click on authorize app",title:"BTCPay WordPress V2: Click on authorize app"}})])]),e._v(" "),t("li",[t("p",[e._v('You will get redirected back to your WooCommerce store and the API key and Store ID will be prefilled. Additionally, the webhook will have been created automatically for you. Check the "Webhook status" field to show "Webhook setup automatically." followed by an ID.\n'),t("img",{attrs:{src:o(720),alt:"BTCPay WordPress V2: Redirected back to plugin settings",title:"BTCPay WordPress V2: Redirected back to plugin settings"}})])]),e._v(" "),t("li",[t("p",[e._v("Before doing any further configuration click on "),t("strong",[e._v("[Save]")]),e._v(" to be sure all is set.\n"),t("img",{attrs:{src:o(721),alt:"BTCPay WordPress V2: Webhook created",title:"BTCPay WordPress V2: Webhook created"}})])])]),e._v(" "),t("p",[e._v('Congratulations, you are almost set. To make the Bitcoin payment gateway show up on your checkout. In the sidebar go to "WooCommerce" -> "Settings", click on the "Payments" tab and enable the "BTCPay (default)" payment gateway.')]),e._v(" "),t("p",[e._v('Continue with "3. Testing the checkout" below to make sure all works as expected.')]),e._v(" "),t("h3",{attrs:{id:"22-connect-by-manually-creating-the-api-key-and-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-connect-by-manually-creating-the-api-key-and-permissions"}},[e._v("#")]),e._v(" 2.2 Connect by manually creating the API key and permissions")]),e._v(" "),t("p",[e._v("If you can't use the wizard mentioned in the previous section you can also generate the API key manually.")]),e._v(" "),t("ol",[t("li",[e._v("Click on "),t("em",[e._v("[Account]")]),e._v(" -> "),t("em",[e._v("Manage Account")]),e._v(" on the bottom left\n"),t("img",{attrs:{src:o(722),alt:"BTCPay WordPress V2: Manage Account",title:"BTCPay WordPress V2: Manage Account"}})]),e._v(" "),t("li",[e._v("Go to the tab "),t("em",[e._v('"API Keys"')])]),e._v(" "),t("li",[e._v("Click "),t("em",[e._v("[Generate Key]")]),e._v(" to select permissions.\n"),t("img",{attrs:{src:o(723),alt:"BTCPay WordPress V2: API Keys overview",title:"BTCPay WordPress V2: API Keys overview"}})]),e._v(" "),t("li",[e._v("Click on the "),t("em",[e._v('"Select specific stores"')]),e._v(" link for the following permissions: "),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(", "),t("code",[e._v("Create non-approved pull payments")]),e._v(" (used for refunds)\n"),t("img",{attrs:{src:o(724),alt:"BTCPay WordPress V2: API Keys Permissions",title:"BTCPay WordPress V2: API Keys Permissions"}})]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Generate API Key]")]),e._v(" "),t("img",{attrs:{src:o(725),alt:"BTCPay WordPress V2: API Keys Save",title:"BTCPay WordPress V2: API Keys Save"}})]),e._v(" "),t("li",[e._v("Copy the generated API Key to your WordPress "),t("em",[e._v("BTCPay Settings")]),e._v(" form (Advanced settings)\n"),t("img",{attrs:{src:o(726),alt:"BTCPay WordPress V2: Copy API Key",title:"BTCPay WordPress V2: Copy API Key"}})]),e._v(" "),t("li",[e._v("Copy the store ID to your WordPress "),t("em",[e._v("BTCPay Settings")]),e._v(" form (Advanced settings)\n"),t("img",{attrs:{src:o(727),alt:"BTCPay WordPress V2: Copy Store ID",title:"BTCPay WordPress V2: Copy Store ID"}})]),e._v(" "),t("li",[e._v("On the BTCPay Settings form:")])]),e._v(" "),t("ul",[t("li",[e._v("Enter "),t("em",[e._v("BTCPay Server URL")]),e._v(" (URL of your BTCPay Server instance, where you just created the API key)")]),e._v(" "),t("li",[e._v('Click the "Advanced settings" checkbox to enter '),t("em",[e._v("BTCPay Server API Key")]),e._v(" and "),t("em",[e._v("Store ID")]),e._v(" (leave "),t("em",[e._v("Webhook secret")]),e._v(" empty)")]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Save]")]),e._v(" at the bottom of the page\n"),t("img",{attrs:{src:o(728),alt:"BTCPay WordPress V2: Save BTCPay Settings form",title:"BTCPay WordPress V2: Save BTCPay Settings form"}})])]),e._v(" "),t("ol",{attrs:{start:"9"}},[t("li",[e._v('Make sure you see the notification "'),t("em",[e._v("BTCPay Server: Successfully registered a new webhook on BTCPay Server")]),e._v('" and '),t("em",[e._v("Setup status")]),e._v(" and "),t("em",[e._v("Webhook status")]),e._v(" are green.\n"),t("img",{attrs:{src:o(729),alt:"BTCPay WordPress V2: Save BTCPay Settings form saved",title:"BTCPay WordPress V2: Save BTCPay Settings form saved"}})])]),e._v(" "),t("p",[e._v('Congratulations, you are almost set. To make the Bitcoin payment gateway show up on your checkout. In the sidebar go to "WooCommerce" -> "Settings", click on the "Payments" tab and enable the "BTCPay (default)" payment gateway.')]),e._v(" "),t("p",[e._v('Continue with "3. Testing the checkout" below to make sure all works as expected.')]),e._v(" "),t("h2",{attrs:{id:"3-testing-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-testing-the-checkout"}},[e._v("#")]),e._v(" 3. Testing the checkout")]),e._v(" "),t("p",[e._v("Making a small test-purchase from your store will give you peace of mind.\nAlways make sure that everything is set up correctly before going live.\nThe final video guides you through the steps of setting a gap limit in your Electrum wallet and testing the checkout process.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Fi3pYpzGmmo/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Fi3pYpzGmmo",title:"BTCPay Server Checkout","data-id":"Fi3pYpzGmmo"}},[t("iframe",{attrs:{title:"BTCPay Server Checkout","data-src":"https://www.youtube-nocookie.com/embed/Fi3pYpzGmmo?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"4-customizing-btcpay-woocommerce-v2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#4-customizing-btcpay-woocommerce-v2"}},[e._v("#")]),e._v(" 4. Customizing BTCPay WooCommerce V2")]),e._v(" "),t("h3",{attrs:{id:"41-global-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#41-global-settings"}},[e._v("#")]),e._v(" 4.1 Global Settings")]),e._v(" "),t("p",[e._v("Can be found at "),t("em",[e._v("WooCommerce -> Settings -> Tab [BTCPay Settings]")])]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Server URL")])]),e._v(" "),t("p",[e._v("URL to your BTCPay Server instance, including protocol e.g. "),t("code",[e._v("https://btcpay.yourdomain.com")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay API Key")])]),e._v(" "),t("p",[e._v("Your API Key. (Was auto-generated in the steps before).")]),e._v(" "),t("p",[t("strong",[e._v("Store ID")])]),e._v(" "),t("p",[e._v("The store ID of your BTCPay Server store. Can be found on the store settings page.")]),e._v(" "),t("p",[t("strong",[e._v("Default Customer Message")])]),e._v(" "),t("p",[e._v('Here you can customize the customer message shown after selecting BTCPay payment gateway on checkout. This can be overwritten on the payment gateway settings for each gateway if you use the "Separate payment gateways" option.')]),e._v(" "),t("p",[t("strong",[e._v('Invoice pass to "Settled" state after')])]),e._v(" "),t("p",[e._v("Set after how many confirmations a payment is considered fully paid and settled. Defaults to what is configured on BTCPay store settings.")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Order Statuses")])]),e._v(" "),t("p",[e._v("Depending on your business model and store settings, you may want to configure your order statuses.\nYou can set BTCPay to trigger certain order status in WooCommerce automatically.")]),e._v(" "),t("ul",[t("li",[t("em",[e._v("New")]),e._v(" - order placed, not paid yet.")]),e._v(" "),t("li",[t("em",[e._v("Paid")]),e._v(" - order paid, not enough confirmations on the blockchain, yet.")]),e._v(" "),t("li",[t("em",[e._v("Settled")]),e._v(" - order paid, confirmed on the blockchain.")]),e._v(" "),t("li",[t("em",[e._v("Settled (paid over)")]),e._v(" - order paid, confirmed on the blockchain but paid over.")]),e._v(" "),t("li",[t("em",[e._v("Invalid")]),e._v(" - order paid, did not get a sufficient number of confirmations in a pre-defined time-frame set in BTCPay store settings, or manually marked invalid.")]),e._v(" "),t("li",[t("em",[e._v("Expired")]),e._v(" - invoice expired, order not paid.")]),e._v(" "),t("li",[t("em",[e._v("Expired with partial payment")]),e._v(" - invoice expired and paid partially")])]),e._v(" "),t("p",[e._v('Take time to think about how you wish to automate these statuses.\nIf you do not wish certain BTCPay status to trigger WooCommerce order status, you can leave it as default "- no mapping / defaults -".')]),e._v(" "),t("p",[e._v('Note: you should keep the "Settled" order status to "- no mapping / defaults-" if you sell digital and physical products. For digital products WooCommerce will automatically skip the "Processing" status and go directly to "Completed" for those orders only containing digital products.')]),e._v(" "),t("p",[e._v('Another example, if a merchant wants to send an email notifying the customer that the payment has been received, but the order will be processed upon confirmation, the merchant would have to set order status for "Paid" to "On hold". Then, the merchant would have to customize and trigger email for "On hold" status of the order in WooCommerce.')]),e._v(" "),t("p",[e._v("It takes some time to find a perfect formula, so users should test things out before going live.")]),e._v(" "),t("p",[t("strong",[e._v("Modal checkout")])]),e._v(" "),t("p",[e._v("Enable this option if you want the BTCPay Server invoice to be shown directly on the checkout page (and do not redirect customers to your BTCPay Server instance).")]),e._v(" "),t("p",[t("strong",[e._v("Separate Payment Gateways")])]),e._v(" "),t("p",[e._v("If this option is enabled the plugin will generate one separate payment gateway per supported payment method on BTCPay Server. E.g. if you have BTC, LightningNetwork and maybe Liquid Assets enabled on your BTCPay Server store, then you will have a separate gateway available for each. This allows many new use cases like discount per gateway or country based restrictions. More details "),t("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-additional-token-support"}},[e._v("here")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("Send customer data to BTCPayServer")])]),e._v(" "),t("p",[e._v("By default "),t("em",[e._v("no")]),e._v(" customer data beside email is sent to BTCPay Server. If you want to send customer address data to BTCPay Server you can enable it here.")]),e._v(" "),t("p",[t("strong",[e._v("Debug Log")])]),e._v(" "),t("p",[e._v("This option is helpful in case you have a problem and need more information on what is going on. The logs can be then found under WooCommerce -> Status -> Log. Make sure you disable this again after debugging as it will fill up your filesystem with logs.")]),e._v(" "),t("h3",{attrs:{id:"42-payment-gateway-specific"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#42-payment-gateway-specific"}},[e._v("#")]),e._v(" 4.2 Payment Gateway specific")]),e._v(" "),t("p",[e._v('Depending on wheter you have above mentioned "Separate Payment Gateways" enabled you will have one or more Payment Gateways available to configure in the payment gateway settings via '),t("em",[e._v("WooCommerce -> Settings -> Tab [Payments]")])]),e._v(" "),t("p",[e._v("On all payment gateways you can set the following options:")]),e._v(" "),t("p",[t("strong",[e._v("Title")]),e._v('\nThe shown payment gateway text on the checkout page. Defaults to "BTCPay (Bitcoin, Lightning Network, ...)".')]),e._v(" "),t("p",[t("strong",[e._v("Customer Message")])]),e._v(" "),t("p",[e._v("Here you can customize message shown after selecting BTCPay payment gateway.")]),e._v(" "),t("p",[t("strong",[e._v("Gateway Icon")])]),e._v(" "),t("p",[e._v("Upload or select a custom icon to be shown next to the payment gateway during checkout. Defaults to BTCPay logo.")]),e._v(" "),t("h4",{attrs:{id:"421-btcpay-default"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#421-btcpay-default"}},[e._v("#")]),e._v(" 4.2.1 BTCPay (default)")]),e._v(" "),t("p",[e._v("Additional options only available for the default payment gateway:")]),e._v(" "),t("p",[t("strong",[e._v("Enforce payment tokens")])]),e._v(" "),t("p",[e._v('With "Separate Payment Gateways" feature enabled in BTCPay Settings you can use this option to enforce only payment tokens. This means that the created invoice will '),t("em",[e._v("only")]),e._v(' include tokens of type "payment" and '),t("em",[e._v("not any")]),e._v(' of type "promotion". See difference of token types '),t("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-additional-token-support#token-types"}},[e._v("here")])],1),e._v(" "),t("h4",{attrs:{id:"422-separate-payment-gateways"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#422-separate-payment-gateways"}},[e._v("#")]),e._v(" 4.2.2 Separate Payment Gateways")]),e._v(" "),t("p",[e._v("Additional options only available for the separate payment gateways (if that feature is enabled):")]),e._v(" "),t("p",[t("strong",[e._v("Token Type")])]),e._v(" "),t("p",[e._v('By default type "payment" is selected. But if you have Liquid Assets with your own issued asset/token (e.g. used as voucher) you can select "promotion" here. Those are processed differently than normal payment tokens. Details can be found '),t("RouterLink",{attrs:{to:"/FAQ/Integrations/#how-to-configure-additional-token-support#promotional-tokens-100-discount"}},[e._v("here")])],1),e._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h3",{attrs:{id:"error-call-to-undefined-function-btcpayserver-http-curl-init"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#error-call-to-undefined-function-btcpayserver-http-curl-init"}},[e._v("#")]),e._v(" Error: Call to undefined function BTCPayServer\\Http\\curl_init()")]),e._v(" "),t("p",[e._v("Please make sure your PHP version supports the cURL extension (as written in the requirements above). You can install it on Debian/Ubuntu by running the command "),t("code",[e._v("sudo apt install php-curl")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("#")]),e._v(" The order states do not update although the invoice has been paid")]),e._v(" "),t("p",[e._v("Please check first if the webhook is created under the BTCPay Server store settings. If there is no webhook created you can visit on your WooCommerce store BTCPay Settings tab under WooCommerce settings and hit the save button. This will create the webhook.")]),e._v(" "),t("p",[e._v('You may also check the details of your invoice if there were any errors on sending the webhook request. Some hosting providers, firewall setups or WordPress security plugins (like Wordfence) block POST requests to your WordPress site which lead to a http status of "403 Forbidden" or "503 Service Unavailable".')]),e._v(" "),t("p",[e._v("You can check and verify yourself if there is something blocking requests to your site in one of these two ways:")]),e._v(" "),t("p",[t("strong",[e._v("Check using a command line (Linux or MacOS):")]),e._v("\n(replace EXAMPLE.COM with your WordPress site URL)")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -vX POST -H "Content-Type: application/json" \\\n -d \'{"data": "test"}\' https://EXAMPLE.COM/?wc-api=btcpaygf_default\n')])])]),t("p",[e._v('On the response, if you see that line "HTTP/1.1 500" or "HTTP/2 500" and the message "Webhook request validation failed" that means that your site is not blocking the request with a "403 Forbidden".')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('.... snip ....\n* We are completely uploaded and fine\n< HTTP/2 500\n< server: nginx\n< date: Sun, 05 Jun 2022 16:55:08 GMT\n< content-type: application/json; charset=UTF-8\n< x-powered-by: PHP/8.1.6\n< expires: Wed, 11 Jan 1984 05:00:00 GMT\n< cache-control: no-cache, must-revalidate, max-age=0\n<\n* Connection #0 to host example.com left intact\n{"code":"wp_die","message":"Webhook request validation failed.","data":{"status":500},"additional_errors":[]}\n')])])]),t("p",[e._v('On the other side, if you see that line "HTTP/1.1 403 Forbidden" or "HTTP/2 403" then something is blocking data sent to your WordPress site. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests.')]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".... snip ....\n* upload completely sent off: 16 out of 16 bytes\n< HTTP/1.1 403 Forbidden\n< access-control-allow-origin: *\n< Content-Type: application/json; charset=UTF-8\n< X-Cloud-Trace-Context: 4f07d5b2e5c2f05949d04421a8e2dd6a\n< Date: Thu, 17 Feb 2022 10:06:50 GMT\n< Server: Google Frontend\n< Content-Length: 26\n")])])]),t("p",[t("strong",[e._v("Check using an online service (if you do not have a command line available:")])]),e._v(" "),t("ul",[t("li",[e._v("Go to "),t("a",{attrs:{href:"https://reqbin.com/post-online",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://reqbin.com/post-online"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Enter your domain: "),t("code",[e._v("https://EXAMPLE.COM/?wc-api=btcpaygf_default")]),e._v("\n(replace EXAMPLE.COM with your WordPress site URL)")]),e._v(" "),t("li",[e._v('Make sure "POST" is selected')]),e._v(" "),t("li",[e._v("Click [Send]")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(730),alt:"BTCPay WordPress V2: Debug 403 error with reqbin.com",title:"BTCPay WordPress V2: Debug 403 error with reqbin.com"}})]),e._v(" "),t("p",[e._v('If you see "Status 403 (Forbidden)" then POST requests to your site are blocked for some reason. You should ask your hosting provider or make sure no firewall or plugin is blocking the requests.')]),e._v(" "),t("h3",{attrs:{id:"i-get-an-error-during-checkout-but-not-sure-what-the-problem-is"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-get-an-error-during-checkout-but-not-sure-what-the-problem-is"}},[e._v("#")]),e._v(" I get an error during checkout but not sure what the problem is.")]),e._v(" "),t("p",[e._v("In your BTCPay Settings in your admin dashboard: "),t("em",[e._v("WooCommerce -> Settings: Tab [BTCPay Settings]")]),e._v(" you can enable debug mode by setting the checkbox on that option.")]),e._v(" "),t("p",[e._v("You can now find more detailed Logs when you click the [View Logs] button or you go to "),t("em",[e._v("WooCommerce -> Status: Tab [Logs]")]),e._v(" and select the most recent btcpay logs.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Warning")]),e._v(" "),t("p",[e._v("Please make sure that you disable the debugging mode again after you finished investigating, otherwise your site performance may be impacted and also write lots of logging data in your filesystem for no reason.")])]),e._v(" "),t("p",[e._v("Additionally you can also look into your webservers error logs if you find any error that is related to BTCPay plugin.")]),e._v(" "),t("h3",{attrs:{id:"i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-have-troubles-with-using-the-plugin-or-some-other-related-questions"}},[e._v("#")]),e._v(" I have troubles with using the plugin or some other related questions")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")]),e._v(" "),t("h3",{attrs:{id:"create-a-new-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-new-api-key"}},[e._v("#")]),e._v(" Create a new API key")]),e._v(" "),t("p",[e._v("If you have been using the WooCommerce V2 plugin prior to version 2.0.0, your API key won't have the required permissions to issue refunds via pull-payments. If you want to use that feature, you can create a new API key (editing an API key is not currently supported). You can use the above described "),t("a",{attrs:{href:"#21-connect-using-the-api-key-wizard--recommended-"}},[e._v("2.1 Connect using API key wizard")]),e._v(" or the "),t("a",{attrs:{href:"#22-connect-by-manually-creating-the-api-key-and-permissions"}},[e._v("manual API key generation")]),e._v(". The configured webhook will continue to work, and no change is needed.")]),e._v(" "),t("h3",{attrs:{id:"i-messed-around-with-the-webhook-how-to-fix"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-messed-around-with-the-webhook-how-to-fix"}},[e._v("#")]),e._v(" I messed around with the webhook, how to fix")]),e._v(" "),t("p",[e._v("Suppose you accidentally changed the WooCommerce webhook, and it is not working anymore. In that case, you can quickly force a re-creation of it when you delete the API key on BTCPay Server and then go to the BTCPay Server Settings (on your WordPress site) and hit save again. You should see a message that the webhook was successfully created.")]),e._v(" "),t("h2",{attrs:{id:"deploying-woocommerce-from-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#deploying-woocommerce-from-btcpay-server"}},[e._v("#")]),e._v(" Deploying WooCommerce from BTCPay Server")]),e._v(" "),t("p",[e._v("If you already have BTCPay Server, you can very easily start WooCommerce from your existing environment.")]),e._v(" "),t("ol",[t("li",[t("p",[e._v("Point the external IP of the virtual machine where your BTCPay is hosted to your store domain, for example store.yourdomain.com.")])]),e._v(" "),t("li",[t("p",[e._v("Log into your BTCPay server as root.")])])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n")])])]),t("ol",{attrs:{start:"3"}},[t("li",[e._v("Set up WooCommerce variables. You can add "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/docker-compose-generator/docker-fragments/opt-add-woocommerce.yml",target:"_blank",rel:"noopener noreferrer"}},[e._v("optional variables"),t("OutboundLink")],1),e._v(" as well.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-woocommerce"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("WOOCOMMERCE_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"yourstoredomain.com"')]),e._v("\n")])])]),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Lastly, just run BTCPay Setup script which will add the set up variables.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("ol",{attrs:{start:"5"}},[t("li",[e._v("Go to your store's domain name, in our example that's store.yourdomain.com and follow the WordPress installation wizard.")])])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/161.7ede444c.js b/assets/js/161.675f22a2.js similarity index 95% rename from assets/js/161.7ede444c.js rename to assets/js/161.675f22a2.js index 608ecf6a83..514cbd4399 100644 --- a/assets/js/161.7ede444c.js +++ b/assets/js/161.675f22a2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[161],{882:function(t,a,e){"use strict";e.r(a);var r=e(17),o=Object(r.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"shopware-integration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#shopware-integration"}},[t._v("#")]),t._v(" Shopware integration")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Please be aware that those two integrations are not maintained by the BTCPay Server team. If you have any questions, please go to their GitHub issues and contact them directly.")])]),t._v(" "),a("h2",{attrs:{id:"plugin-for-shopware-6"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#plugin-for-shopware-6"}},[t._v("#")]),t._v(" Plugin for Shopware 6")]),t._v(" "),a("p",[t._v("Download it on "),a("a",{attrs:{href:"https://github.com/coincharge-io/CoinchargeBTCPayShopware",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"plugin-for-shopware-5"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#plugin-for-shopware-5"}},[t._v("#")]),t._v(" Plugin for Shopware 5")]),t._v(" "),a("p",[t._v("Download it on "),a("a",{attrs:{href:"https://github.com/lampsolutions/LampSBtcPayShopware",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),a("OutboundLink")],1)])])}),[],!1,null,null,null);a.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[161],{908:function(t,a,e){"use strict";e.r(a);var r=e(17),o=Object(r.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"shopware-integration"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#shopware-integration"}},[t._v("#")]),t._v(" Shopware integration")]),t._v(" "),a("div",{staticClass:"custom-block warning"},[a("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),a("p",[t._v("Please be aware that those two integrations are not maintained by the BTCPay Server team. If you have any questions, please go to their GitHub issues and contact them directly.")])]),t._v(" "),a("h2",{attrs:{id:"plugin-for-shopware-6"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#plugin-for-shopware-6"}},[t._v("#")]),t._v(" Plugin for Shopware 6")]),t._v(" "),a("p",[t._v("Download it on "),a("a",{attrs:{href:"https://github.com/coincharge-io/CoinchargeBTCPayShopware",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),a("OutboundLink")],1)]),t._v(" "),a("h2",{attrs:{id:"plugin-for-shopware-5"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#plugin-for-shopware-5"}},[t._v("#")]),t._v(" Plugin for Shopware 5")]),t._v(" "),a("p",[t._v("Download it on "),a("a",{attrs:{href:"https://github.com/lampsolutions/LampSBtcPayShopware",target:"_blank",rel:"noopener noreferrer"}},[t._v("GitHub"),a("OutboundLink")],1)])])}),[],!1,null,null,null);a.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/162.87d1962e.js b/assets/js/162.33382585.js similarity index 98% rename from assets/js/162.87d1962e.js rename to assets/js/162.33382585.js index 26c3c9a0a7..902a3590e3 100644 --- a/assets/js/162.87d1962e.js +++ b/assets/js/162.33382585.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[162],{883:function(t,e,s){"use strict";s.r(e);var n=s(17),a=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"sideshift-for-btcpay-server-plugin"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#sideshift-for-btcpay-server-plugin"}},[t._v("#")]),t._v(" Sideshift for BTCPay Server plugin")]),t._v(" "),e("p",[t._v("This plugin integrates the no-kyc Sideshift exchanges into various parts of BTCPay Server.")]),t._v(" "),e("ul",[e("li",[t._v("Invoice checkout - Let your customers pay with any coin supported by Sideshift. The settings allow you to show a payment method that loads sideshift with its various options as dropwdown, or you can explicitly show each option as a payment method on its own, or you can have both.")]),t._v(" "),e("li",[t._v("Pull payments - Let your customers claim their payouts in any option supported by Sideshift.")]),t._v(" "),e("li",[t._v("Prism Plugin - Allows you to use Sideshift as a destination in the Prism plugin, so that you can automatically convert incoming Bitcoin to any option Sideshift supports.")])]),t._v(" "),e("h2",{attrs:{id:"usage"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),e("p",[t._v("For both invoices and pull payments, you will need to enable sideshift through its settings located in the plugins navigation under your store. The prism plugin integration does not require this to be on.")]),t._v(" "),e("h2",{attrs:{id:"configuring-on-individual-invoices"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-on-individual-invoices"}},[t._v("#")]),t._v(" Configuring on individual invoices")]),t._v(" "),e("p",[t._v("You can configure the sideshift options on individual invoices when creating them through the API by setting a json object under the Metadata property of the invoice. This will merge on top of your existing sideshift settings in your store. The json object should be in the following format, and any property not included, will use the ones on your store:")]),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"sideshift"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"enabled"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//whether it should be enabled/disabled for this invoice")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"explicitMethods"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"USDT_liquid"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//if you want to explicitly show certain options, you can list them here. The format is currencyCode_network. You can look at the html in the sideshift settings page to see the full list of values.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"onlyShowExplicitMethods"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// if you want to only show the explicit methods, and not the dropdown variant of the plugin")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"preferredTargetPaymentMethodId"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BTC_LightningLike"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//if you want to set a preferred payment method that you would receive the funds from sideshift on. This is the payment method format as used in the BTCPay Server Greenfield API. ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"amountMarkupPercentage"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//if you want to add a markup in case you dont think that sideshift is reliable in convertint into the exact amount.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[162],{882:function(t,e,s){"use strict";s.r(e);var n=s(17),a=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"sideshift-for-btcpay-server-plugin"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#sideshift-for-btcpay-server-plugin"}},[t._v("#")]),t._v(" Sideshift for BTCPay Server plugin")]),t._v(" "),e("p",[t._v("This plugin integrates the no-kyc Sideshift exchanges into various parts of BTCPay Server.")]),t._v(" "),e("ul",[e("li",[t._v("Invoice checkout - Let your customers pay with any coin supported by Sideshift. The settings allow you to show a payment method that loads sideshift with its various options as dropwdown, or you can explicitly show each option as a payment method on its own, or you can have both.")]),t._v(" "),e("li",[t._v("Pull payments - Let your customers claim their payouts in any option supported by Sideshift.")]),t._v(" "),e("li",[t._v("Prism Plugin - Allows you to use Sideshift as a destination in the Prism plugin, so that you can automatically convert incoming Bitcoin to any option Sideshift supports.")])]),t._v(" "),e("h2",{attrs:{id:"usage"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[t._v("#")]),t._v(" Usage")]),t._v(" "),e("p",[t._v("For both invoices and pull payments, you will need to enable sideshift through its settings located in the plugins navigation under your store. The prism plugin integration does not require this to be on.")]),t._v(" "),e("h2",{attrs:{id:"configuring-on-individual-invoices"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#configuring-on-individual-invoices"}},[t._v("#")]),t._v(" Configuring on individual invoices")]),t._v(" "),e("p",[t._v("You can configure the sideshift options on individual invoices when creating them through the API by setting a json object under the Metadata property of the invoice. This will merge on top of your existing sideshift settings in your store. The json object should be in the following format, and any property not included, will use the ones on your store:")]),t._v(" "),e("div",{staticClass:"language-json extra-class"},[e("pre",{pre:!0,attrs:{class:"language-json"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"sideshift"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"enabled"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//whether it should be enabled/disabled for this invoice")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"explicitMethods"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"USDT_liquid"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//if you want to explicitly show certain options, you can list them here. The format is currencyCode_network. You can look at the html in the sideshift settings page to see the full list of values.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"onlyShowExplicitMethods"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// if you want to only show the explicit methods, and not the dropdown variant of the plugin")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"preferredTargetPaymentMethodId"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BTC_LightningLike"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//if you want to set a preferred payment method that you would receive the funds from sideshift on. This is the payment method format as used in the BTCPay Server Greenfield API. ")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"amountMarkupPercentage"')]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.5")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("//if you want to add a markup in case you dont think that sideshift is reliable in convertint into the exact amount.")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/163.a18f8c13.js b/assets/js/163.fd44193d.js similarity index 98% rename from assets/js/163.a18f8c13.js rename to assets/js/163.fd44193d.js index ffbad19bc9..e5816d7340 100644 --- a/assets/js/163.a18f8c13.js +++ b/assets/js/163.fd44193d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[163],{885:function(e,t,r){"use strict";r.r(t);var a=r(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btcpay-plugin-for-smartstore-accept-bitcoin-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-plugin-for-smartstore-accept-bitcoin-payments"}},[e._v("#")]),e._v(" BTCPay plugin for SmartStore - accept Bitcoin payments")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/Smartstore.BTCPayServer/main/src/Smartstore.Modules/Smartstore.BTCPayServer/wwwroot/banner.png",alt:"BTCPay Server SmartStore banner",title:"BTCPay Server SmartStore banner"}})]),e._v(" "),t("h2",{attrs:{id:"plugin-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-overview"}},[e._v("#")]),e._v(" Plugin Overview")]),e._v(" "),t("p",[e._v("This plugin allows you to easily integrate Bitcoin payments into your SmartStore website using BTCPay Server a free, self-hosted and open-source payment gateway solution designed to revolutionize Bitcoin payments. Our seamless integration with SmartStore ensures a hassle-free connection to your self-hosted BTCPay Server.")]),e._v(" "),t("p",[e._v("Experience the simplicity of accepting Bitcoin payments with just a few straightforward steps. You can configure the plugin either automatically or manually, depending on your preferences and requirements.")]),e._v(" "),t("h2",{attrs:{id:"automatic-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automatic-configuration"}},[e._v("#")]),e._v(" Automatic Configuration")]),e._v(" "),t("ol",[t("li",[e._v('Enter Url to your BTCPay Server into "BTCPay Url" field. (e.g. https://mainnet.demo.btcpayserver.org)')]),e._v(" "),t("li",[e._v('Click on the "Configure automatically" button to be redirected to the API authorization page on your BTCPay server')]),e._v(" "),t("li",[e._v("On BTCPay authorization page: Select the store you want to connect to your Smartstore (you might need to login first)")]),e._v(" "),t("li",[e._v('Click on "Authorize App" button and you will be redirected back to your Smartstore')]),e._v(" "),t("li",[e._v('The "API Key", "BTCPay Store ID" and "Webhook Secret" fields will be automatically filled and a webhook created')]),e._v(" "),t("li",[e._v('Click "Save" button at the top right to persist the configuration')]),e._v(" "),t("li",[e._v("Congrats, the configuration is now done.")])]),e._v(" "),t("h2",{attrs:{id:"manual-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manual-configuration"}},[e._v("#")]),e._v(" Manual Configuration")]),e._v(" "),t("p",[e._v('Ensure that the following fields are filled out: "BTCPay Url," "API Key," "BTCPay Store ID," and "WebHook Secret."')]),e._v(" "),t("p",[e._v("To create the BTCPay API key, "),t("RouterLink",{attrs:{to:"/VirtueMart/#22-create-an-api-key-and-configure-permissions"}},[e._v("read this")]),e._v(".")],1),e._v(" "),t("ul",[t("li",[e._v('Note: If you want to use the Refund feature, you must also add the "Create non-approved pull payments" permission. After a refund, an order note is created where you can copy the pull payments link and send to your customer. The customer can request the refund on that page.')])]),e._v(" "),t("p",[e._v("To create the BTCPay WebHook, "),t("RouterLink",{attrs:{to:"/VirtueMart/#23-create-a-webhook-on-btcpay-server"}},[e._v("read this")]),e._v(" and use the default secret code generated by BTCPay.")],1),e._v(" "),t("ul",[t("li",[e._v('Note: Other than in the guide you need to copy the Url shown in field "Webhook Url" from your configuration screen on Smartstore.')])]),e._v(" "),t("h2",{attrs:{id:"support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[e._v("#")]),e._v(" Support")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost Chat"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")]),e._v(" "),t("p",[e._v("If experience a bug please open an issue in our repository "),t("a",{attrs:{href:"https://github.com/btcpayserver/Smartstore.BTCPayServer/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"license"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[e._v("#")]),e._v(" License")]),e._v(" "),t("p",[e._v("This plugin is released under the "),t("a",{attrs:{href:"https://github.com/btcpayserver/Smartstore.BTCPayServer/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[e._v("MIT License"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("hr"),e._v(" "),t("p",[e._v("Find our latest releases on the "),t("a",{attrs:{href:"https://community.smartstore.com/index.php?/files/file/246-btcpay-server-for-smartstore/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Smartstore marketplace"),t("OutboundLink")],1),e._v(" or on our "),t("a",{attrs:{href:"https://github.com/btcpayserver/Smartstore.BTCPayServer/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("release page"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[163],{883:function(e,t,r){"use strict";r.r(t);var a=r(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btcpay-plugin-for-smartstore-accept-bitcoin-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-plugin-for-smartstore-accept-bitcoin-payments"}},[e._v("#")]),e._v(" BTCPay plugin for SmartStore - accept Bitcoin payments")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/Smartstore.BTCPayServer/main/src/Smartstore.Modules/Smartstore.BTCPayServer/wwwroot/banner.png",alt:"BTCPay Server SmartStore banner",title:"BTCPay Server SmartStore banner"}})]),e._v(" "),t("h2",{attrs:{id:"plugin-overview"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugin-overview"}},[e._v("#")]),e._v(" Plugin Overview")]),e._v(" "),t("p",[e._v("This plugin allows you to easily integrate Bitcoin payments into your SmartStore website using BTCPay Server a free, self-hosted and open-source payment gateway solution designed to revolutionize Bitcoin payments. Our seamless integration with SmartStore ensures a hassle-free connection to your self-hosted BTCPay Server.")]),e._v(" "),t("p",[e._v("Experience the simplicity of accepting Bitcoin payments with just a few straightforward steps. You can configure the plugin either automatically or manually, depending on your preferences and requirements.")]),e._v(" "),t("h2",{attrs:{id:"automatic-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automatic-configuration"}},[e._v("#")]),e._v(" Automatic Configuration")]),e._v(" "),t("ol",[t("li",[e._v('Enter Url to your BTCPay Server into "BTCPay Url" field. (e.g. https://mainnet.demo.btcpayserver.org)')]),e._v(" "),t("li",[e._v('Click on the "Configure automatically" button to be redirected to the API authorization page on your BTCPay server')]),e._v(" "),t("li",[e._v("On BTCPay authorization page: Select the store you want to connect to your Smartstore (you might need to login first)")]),e._v(" "),t("li",[e._v('Click on "Authorize App" button and you will be redirected back to your Smartstore')]),e._v(" "),t("li",[e._v('The "API Key", "BTCPay Store ID" and "Webhook Secret" fields will be automatically filled and a webhook created')]),e._v(" "),t("li",[e._v('Click "Save" button at the top right to persist the configuration')]),e._v(" "),t("li",[e._v("Congrats, the configuration is now done.")])]),e._v(" "),t("h2",{attrs:{id:"manual-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manual-configuration"}},[e._v("#")]),e._v(" Manual Configuration")]),e._v(" "),t("p",[e._v('Ensure that the following fields are filled out: "BTCPay Url," "API Key," "BTCPay Store ID," and "WebHook Secret."')]),e._v(" "),t("p",[e._v("To create the BTCPay API key, "),t("RouterLink",{attrs:{to:"/VirtueMart/#22-create-an-api-key-and-configure-permissions"}},[e._v("read this")]),e._v(".")],1),e._v(" "),t("ul",[t("li",[e._v('Note: If you want to use the Refund feature, you must also add the "Create non-approved pull payments" permission. After a refund, an order note is created where you can copy the pull payments link and send to your customer. The customer can request the refund on that page.')])]),e._v(" "),t("p",[e._v("To create the BTCPay WebHook, "),t("RouterLink",{attrs:{to:"/VirtueMart/#23-create-a-webhook-on-btcpay-server"}},[e._v("read this")]),e._v(" and use the default secret code generated by BTCPay.")],1),e._v(" "),t("ul",[t("li",[e._v('Note: Other than in the guide you need to copy the Url shown in field "Webhook Url" from your configuration screen on Smartstore.')])]),e._v(" "),t("h2",{attrs:{id:"support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[e._v("#")]),e._v(" Support")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost Chat"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")]),e._v(" "),t("p",[e._v("If experience a bug please open an issue in our repository "),t("a",{attrs:{href:"https://github.com/btcpayserver/Smartstore.BTCPayServer/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"license"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#license"}},[e._v("#")]),e._v(" License")]),e._v(" "),t("p",[e._v("This plugin is released under the "),t("a",{attrs:{href:"https://github.com/btcpayserver/Smartstore.BTCPayServer/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[e._v("MIT License"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("hr"),e._v(" "),t("p",[e._v("Find our latest releases on the "),t("a",{attrs:{href:"https://community.smartstore.com/index.php?/files/file/246-btcpay-server-for-smartstore/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Smartstore marketplace"),t("OutboundLink")],1),e._v(" or on our "),t("a",{attrs:{href:"https://github.com/btcpayserver/Smartstore.BTCPayServer/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("release page"),t("OutboundLink")],1)])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/164.86969602.js b/assets/js/164.29b7de06.js similarity index 97% rename from assets/js/164.86969602.js rename to assets/js/164.29b7de06.js index 18af1096a5..f6c1a3062c 100644 --- a/assets/js/164.86969602.js +++ b/assets/js/164.29b7de06.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[164],{890:function(e,t,r){"use strict";r.r(t);var o=r(17),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[e._v("#")]),e._v(" Support")]),e._v(" "),t("p",[e._v("This project is open source and is not a company. Instead "),t("strong",[e._v("we rely on a network of contributors and users to provide support")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"free-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#free-support"}},[e._v("#")]),e._v(" Free support")]),e._v(" "),t("p",[e._v("Problem? Don't worry. Someone else has probably been through that before you.")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("First have a look at our "),t("RouterLink",{attrs:{to:"/"}},[e._v("user documentation")]),e._v(" and "),t("RouterLink",{attrs:{to:"/FAQ/"}},[e._v("Frequently Asked Questions")]),e._v(".")],1)]),e._v(" "),t("li",[t("p",[e._v("If your issue is not referenced there, or you want to request a new feature, please open a "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("github issue"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("li",[t("p",[e._v("If you have more general questions about BTCPay, the way it works and why you should use it, you're welcome on our "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost Chat"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1)])])]),e._v(" "),t("p",[e._v("Getting proper support also depends on how you formulate your questions. Read our "),t("RouterLink",{attrs:{to:"/Troubleshooting/"}},[e._v("troubleshooting guidelines")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"paid-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#paid-support"}},[e._v("#")]),e._v(" Paid support")]),e._v(" "),t("p",[e._v("As we are an Open Source project, someone in the community might want to help.\nTherefore we've facilitated a channel on our Mattermost to find these talents.")]),e._v(" "),t("p",[e._v("Check out our "),t("code",[e._v("Freelance")]),e._v(" channel on Mattermost.\n"),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/freelance-jobs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost Chat"),t("OutboundLink")],1)]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Server is and will not guarantee or vouch for any support.")])])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[164],{884:function(e,t,r){"use strict";r.r(t);var o=r(17),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[e._v("#")]),e._v(" Support")]),e._v(" "),t("p",[e._v("This project is open source and is not a company. Instead "),t("strong",[e._v("we rely on a network of contributors and users to provide support")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"free-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#free-support"}},[e._v("#")]),e._v(" Free support")]),e._v(" "),t("p",[e._v("Problem? Don't worry. Someone else has probably been through that before you.")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("First have a look at our "),t("RouterLink",{attrs:{to:"/"}},[e._v("user documentation")]),e._v(" and "),t("RouterLink",{attrs:{to:"/FAQ/"}},[e._v("Frequently Asked Questions")]),e._v(".")],1)]),e._v(" "),t("li",[t("p",[e._v("If your issue is not referenced there, or you want to request a new feature, please open a "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("github issue"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("li",[t("p",[e._v("If you have more general questions about BTCPay, the way it works and why you should use it, you're welcome on our "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost Chat"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1)])])]),e._v(" "),t("p",[e._v("Getting proper support also depends on how you formulate your questions. Read our "),t("RouterLink",{attrs:{to:"/Troubleshooting/"}},[e._v("troubleshooting guidelines")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"paid-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#paid-support"}},[e._v("#")]),e._v(" Paid support")]),e._v(" "),t("p",[e._v("As we are an Open Source project, someone in the community might want to help.\nTherefore we've facilitated a channel on our Mattermost to find these talents.")]),e._v(" "),t("p",[e._v("Check out our "),t("code",[e._v("Freelance")]),e._v(" channel on Mattermost.\n"),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/freelance-jobs",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost Chat"),t("OutboundLink")],1)]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("DANGER")]),e._v(" "),t("p",[t("strong",[e._v("BTCPay Server is and will not guarantee or vouch for any support.")])])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/165.25950d0a.js b/assets/js/165.522921b7.js similarity index 98% rename from assets/js/165.25950d0a.js rename to assets/js/165.522921b7.js index f5c16a9f3c..41a5ef3d85 100644 --- a/assets/js/165.25950d0a.js +++ b/assets/js/165.522921b7.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[165],{887:function(e,t,a){"use strict";a.r(t);var r=a(17),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"tickettailor-plugin-for-btcpayserver"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tickettailor-plugin-for-btcpayserver"}},[e._v("#")]),e._v(" TicketTailor plugin for BTCPayServer")]),e._v(" "),t("p",[e._v("This plugin allows you to integrate "),t("a",{attrs:{href:"https://www.tickettailor.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("TicketTailor"),t("OutboundLink")],1),e._v(" with BTCPay Server.\nIt allows you to sell tickets for your events and accept payments in Bitcoin.")]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("ol",[t("li",[e._v("Install the plugin from Plugins=>Add New=> TicketTailor")]),e._v(" "),t("li",[e._v("Restart BTCPay Server")]),e._v(" "),t("li",[e._v("Go to your Ticket Tailor account and add a "),t("a",{attrs:{href:"https://app.tickettailor.com/box-office/api#dpop=/box-office/api-key/add",target:"_blank",rel:"noopener noreferrer"}},[e._v("new API key"),t("OutboundLink")],1),e._v(" with "),t("code",[e._v("Admin")]),e._v(' role and "hide personal data from responses" unchecked.')]),e._v(" "),t("li",[e._v("Go back to your BTCPay Server, choose the store to integrate with and click on Ticket Tailor in the navigation. This will create a ticket tailor app in your current store.")]),e._v(" "),t("li",[e._v("Enter the API Key and save.")]),e._v(" "),t("li",[e._v("Now you should be able to select your Ticket tailor events in the dropdown. One selected, click save.")]),e._v(" "),t("li",[e._v('You should now have a "ticket purchase" button on your store\'s page. Clicking it will take you to the btcpayserver event purchase page.')])]),e._v(" "),t("h2",{attrs:{id:"flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#flow"}},[e._v("#")]),e._v(" Flow")]),e._v(" "),t("p",[e._v("When a customer goes to the ticket purchase page, they can enter a name and must enter an email. Ticket Tailor requires a full name, so we generate one if not specified.\nAfter the tickets are selected, the customer is redirected to the BTCPay Server checkout page, and a hold for the selected tickets is created to reserve the tickets for this customer. After the payment is sent, the customer is redirected to a custom receipt page where they can see their tickets. Tickets are only issued AFTER an invoice is settled. If an invoice is set to invalid or expired, the hold is deleted and the tickets are released for sale again.")]),e._v(" "),t("h2",{attrs:{id:"additional-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-configuration"}},[e._v("#")]),e._v(" Additional Configuration")]),e._v(" "),t("p",[e._v("You should configure the "),t("RouterLink",{attrs:{to:"/Notifications/#store-emails"}},[e._v("SMTP email settings in the store")]),e._v(" so that users receive the ticket link by email after an invoice is settled.\nYou're also able to override ticket names, prices and description on the BTCPay Server side.")],1),e._v(" "),t("h2",{attrs:{id:"secret-tickets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#secret-tickets"}},[e._v("#")]),e._v(" Secret Tickets")]),e._v(" "),t("p",[e._v("You can configure a ticket on ticket tailor to require an access code. BTCPay Server allows you to add "),t("code",[e._v("?accessCode=XXXX")]),e._v(" to the ticket purchase page url to allow customers to view and purchase these secret tickets.")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[165],{885:function(e,t,a){"use strict";a.r(t);var r=a(17),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"tickettailor-plugin-for-btcpayserver"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#tickettailor-plugin-for-btcpayserver"}},[e._v("#")]),e._v(" TicketTailor plugin for BTCPayServer")]),e._v(" "),t("p",[e._v("This plugin allows you to integrate "),t("a",{attrs:{href:"https://www.tickettailor.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("TicketTailor"),t("OutboundLink")],1),e._v(" with BTCPay Server.\nIt allows you to sell tickets for your events and accept payments in Bitcoin.")]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("ol",[t("li",[e._v("Install the plugin from Plugins=>Add New=> TicketTailor")]),e._v(" "),t("li",[e._v("Restart BTCPay Server")]),e._v(" "),t("li",[e._v("Go to your Ticket Tailor account and add a "),t("a",{attrs:{href:"https://app.tickettailor.com/box-office/api#dpop=/box-office/api-key/add",target:"_blank",rel:"noopener noreferrer"}},[e._v("new API key"),t("OutboundLink")],1),e._v(" with "),t("code",[e._v("Admin")]),e._v(' role and "hide personal data from responses" unchecked.')]),e._v(" "),t("li",[e._v("Go back to your BTCPay Server, choose the store to integrate with and click on Ticket Tailor in the navigation. This will create a ticket tailor app in your current store.")]),e._v(" "),t("li",[e._v("Enter the API Key and save.")]),e._v(" "),t("li",[e._v("Now you should be able to select your Ticket tailor events in the dropdown. One selected, click save.")]),e._v(" "),t("li",[e._v('You should now have a "ticket purchase" button on your store\'s page. Clicking it will take you to the btcpayserver event purchase page.')])]),e._v(" "),t("h2",{attrs:{id:"flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#flow"}},[e._v("#")]),e._v(" Flow")]),e._v(" "),t("p",[e._v("When a customer goes to the ticket purchase page, they can enter a name and must enter an email. Ticket Tailor requires a full name, so we generate one if not specified.\nAfter the tickets are selected, the customer is redirected to the BTCPay Server checkout page, and a hold for the selected tickets is created to reserve the tickets for this customer. After the payment is sent, the customer is redirected to a custom receipt page where they can see their tickets. Tickets are only issued AFTER an invoice is settled. If an invoice is set to invalid or expired, the hold is deleted and the tickets are released for sale again.")]),e._v(" "),t("h2",{attrs:{id:"additional-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-configuration"}},[e._v("#")]),e._v(" Additional Configuration")]),e._v(" "),t("p",[e._v("You should configure the "),t("RouterLink",{attrs:{to:"/Notifications/#store-emails"}},[e._v("SMTP email settings in the store")]),e._v(" so that users receive the ticket link by email after an invoice is settled.\nYou're also able to override ticket names, prices and description on the BTCPay Server side.")],1),e._v(" "),t("h2",{attrs:{id:"secret-tickets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#secret-tickets"}},[e._v("#")]),e._v(" Secret Tickets")]),e._v(" "),t("p",[e._v("You can configure a ticket on ticket tailor to require an access code. BTCPay Server allows you to add "),t("code",[e._v("?accessCode=XXXX")]),e._v(" to the ticket purchase page url to allow customers to view and purchase these secret tickets.")])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/166.952eff9e.js b/assets/js/166.f92af150.js similarity index 99% rename from assets/js/166.952eff9e.js rename to assets/js/166.f92af150.js index 4a6c902e35..1b57d17895 100644 --- a/assets/js/166.952eff9e.js +++ b/assets/js/166.f92af150.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[166],{891:function(e,t,a){"use strict";a.r(t);var r=a(17),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btctransmuter-docs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btctransmuter-docs"}},[e._v("#")]),e._v(" BtcTransmuter Docs")]),e._v(" "),t("h2",{attrs:{id:"note-this-project-is-not-maintained"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#note-this-project-is-not-maintained"}},[e._v("#")]),e._v(" Note: This project is not maintained")]),e._v(" "),t("p",[e._v("Btctransmuter is no longer maintained and will not be updated with new features. Avoid using it, if you can.")]),e._v(" "),t("h2",{attrs:{id:"introduction-what-is-btctransmuter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction-what-is-btctransmuter"}},[e._v("#")]),e._v(" Introduction - What is BtcTransmuter?")]),e._v(" "),t("p",[e._v("BtcTransmuter is a free, open-source & self-hosted tool that allows you to configure actions that execute automatically upon specified conditions. Its primary focus is the integration of cryptocurrency services to help users manage their funds and business workflow.")]),e._v(" "),t("h2",{attrs:{id:"how-does-it-work"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-it-work"}},[e._v("#")]),e._v(" How does it work?")]),e._v(" "),t("p",[e._v("There are 3 main components in BtcTransmuter - External Services, Recipes and Extensions.")]),e._v(" "),t("ul",[t("li",[e._v("External services integrated with third parties, such as a BTCPayServer instance or a Cryptocurrency Exchange.")]),e._v(" "),t("li",[e._v("Recipes is a set of instructions created by the user: What to execute and when. The execution part is called a Recipe Action while the condition is called a Recipe Trigger. An action could be "),t("code",[e._v("Send an Email using the SMTP External Service")]),e._v(" and the trigger being "),t("code",[e._v("If a new invoice was created on my BtcPay External Service")])]),e._v(" "),t("li",[e._v("Extensions provide a way to add more external service types, actions and triggers without needing to modify the original code.")])]),e._v(" "),t("h2",{attrs:{id:"can-i-use-this-in-production"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-use-this-in-production"}},[e._v("#")]),e._v(" Can I use this in production")]),e._v(" "),t("p",[e._v("This project is still in early development and most likely has some bugs and quirks that need to be ironed out. The project is considered to be in ALPHA state, meaning not all desired functionality has been implemented and there can be breaking changes.")]),e._v(" "),t("h2",{attrs:{id:"how-do-i-deploy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-deploy"}},[e._v("#")]),e._v(" How do I deploy?")]),e._v(" "),t("p",[e._v("If you set up BTCPay using any "),t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("dockerized install method")]),e._v(", you can enable BTC Transmuter easily.")],1),e._v(" "),t("p",[e._v("First, "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron/blob/master/SSH.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("SSH"),t("OutboundLink")],1),e._v(" into your server.\nThen run the following commands:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-btctransmuter"')]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("If you have trouble starting your server after running the setup command, verify you have "),t("RouterLink",{attrs:{to:"/FAQ/FAQ-Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("added the environment variable")]),e._v(" correctly to enable Transmuter.")],1),e._v(" "),t("p",[e._v("Once completed, your Transmuter will be available at your configured BTCPay website under "),t("code",[e._v("/btctransmuter/")]),e._v(", where the first account to register becomes the Transmuter admin. Open that link in your browser and youll see the homepage.")]),e._v(" "),t("h2",{attrs:{id:"what-extensions-are-provided"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-extensions-are-provided"}},[e._v("#")]),e._v(" What extensions are provided?")]),e._v(" "),t("p",[e._v("You can see a list of built-in extensions once you log into your transmuter application under "),t("code",[e._v("/extensions")]),e._v(".")]),e._v(" "),t("p",[e._v("Currently there are 12 extensions that come bundled with the main application:")]),e._v(" "),t("ul",[t("li",[e._v("Tor - Provides TOR access to your Transmuter app")]),e._v(" "),t("li",[e._v("Presets - Provides one page wizards for quick setups of common scenarios")]),e._v(" "),t("li",[e._v("BtcPayServer - Provides you a way to interact with BTCPayServer stores")]),e._v(" "),t("li",[e._v("Email - Provides you with a way to check a POP3 for incoming emails and a way to send Email via SMTP")]),e._v(" "),t("li",[e._v("Exchange - Provides you a way to connect to a variety of exchanges and place orders on them")]),e._v(" "),t("li",[e._v("Lightning - Provides you interoperability with lightning nodes to be able to do basic channel and invoice management")]),e._v(" "),t("li",[e._v("NBXplorer - Provides you ways to detect incoming funds, send funds, and generate addresses.")]),e._v(" "),t("li",[e._v("Operators - Lets you create conditional workflows")]),e._v(" "),t("li",[e._v("Recipe - Lets you manage existing or create recipes with your workflows")]),e._v(" "),t("li",[e._v("Timer - Run X every Y")]),e._v(" "),t("li",[e._v("WebHook - Trigger Recipes with an http call or execute external web hooks with a recipe")])]),e._v(" "),t("h2",{attrs:{id:"what-preset-recipes-are-provided"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-preset-recipes-are-provided"}},[e._v("#")]),e._v(" What preset recipes are provided?")]),e._v(" "),t("p",[e._v("Currently there are three preset recipes that you can enable easily. In addition to the list below, you can create your own recipes for automating other tasks.")]),e._v(" "),t("ol",[t("li",[e._v("On-chain Forwarder - Forward funds from a wallet elsewhere")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Transmuter/EmailReceiptsPreset/"}},[e._v("BTCPay Email Receipts")]),e._v(" - Send an email when a BTCPay invoice gets paid")],1),e._v(" "),t("li",[e._v("Fiat Conversion - Convert incoming money to fiat on an exchange by market selling when BTCPay invoice statuses change.")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Transmuter/DCA/"}},[e._v("Dollar Cost Average")]),e._v(" - Schedule daily purchases of Bitcoin")],1)]),e._v(" "),t("h2",{attrs:{id:"how-do-i-write-an-extension"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-write-an-extension"}},[e._v("#")]),e._v(" How do I write an extension?")]),e._v(" "),t("p",[e._v("An extension must be its own .net core class library project that references "),t("code",[e._v("BtcTransmuter.Abstractions")]),e._v("\nThere must be a class implementing "),t("code",[e._v("BtcTransmuterExtension")]),e._v(" in this library. This file bootstraps the plugin name and adds all the services to system on startup.")]),e._v(" "),t("h3",{attrs:{id:"adding-a-trigger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-a-trigger"}},[e._v("#")]),e._v(" Adding a Trigger")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Implement "),t("code",[e._v("BaseTrigger")]),e._v(" This class will be used to transport the event data")])]),e._v(" "),t("li",[t("p",[e._v("Implement "),t("code",[e._v("BaseTriggerHandler")]),e._v(" This handles:")]),e._v(" "),t("ul",[t("li",[e._v("Describing the trigger to the main system.")]),e._v(" "),t("li",[e._v("Telling the main UI how to create/edit a recipe trigger using it.")]),e._v(" "),t("li",[e._v("The logic needed to see if a trigger is...triggered.")])]),e._v(" "),t("p",[e._v("You will see that "),t("code",[e._v("BaseTriggerHandler")]),e._v(" has 2 generic arguments, a "),t("code",[e._v("Data")]),e._v(" and "),t("code",[e._v("Parameters")]),e._v(" "),t("code",[e._v("Data")]),e._v(" is the trigger that that was detected, while "),t("code",[e._v("Parameters")]),e._v(" is the data from a Recipe to see if it triggers its actions.")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Partial View (named as the same value as the property "),t("code",[e._v("ViewPartial")]),e._v(" in the "),t("code",[e._v("BaseTriggerHandler")]),e._v(" implementation)\nThis handles displaying the trigger settings in a recipe")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Controller that allows a user to create/edit the necessary data to set the trigger on a recipe.")])])]),e._v(" "),t("h3",{attrs:{id:"adding-an-action"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-an-action"}},[e._v("#")]),e._v(" Adding an Action")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Implement "),t("code",[e._v("BaseActionHandler")]),e._v(" This handles:")]),e._v(" "),t("ul",[t("li",[e._v("Describing the action to the main system.")]),e._v(" "),t("li",[e._v("Telling the main UI how to create/edit a recipe action using it.")]),e._v(" "),t("li",[e._v("The logic needed to execute the action")])]),e._v(" "),t("p",[e._v("You will see that "),t("code",[e._v("BaseActionHandler")]),e._v(" has a generic argument, "),t("code",[e._v("Data")]),e._v(" "),t("code",[e._v("Data")]),e._v(" is the type of the action that holds the payload needed to exeucte the action through the instructions of recipe action")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Partial View (named as the same value as the property "),t("code",[e._v("ViewPartial")]),e._v(" in the "),t("code",[e._v("BaseActionHandler")]),e._v(" implementation)\nThis handles displaying the action settings in a recipe")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Controller that allows a user to create/edit the necessary data to set the action on a recipe.")])])]),e._v(" "),t("h3",{attrs:{id:"adding-an-external-service"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-an-external-service"}},[e._v("#")]),e._v(" Adding an External Service")]),e._v(" "),t("ul",[t("li",[e._v("Implement "),t("code",[e._v("BaseExternalService")]),e._v(" & "),t("code",[e._v("IExternalServiceDescriptor")])]),e._v(" "),t("li",[e._v("Implement a Partial View (named as the same value as the property "),t("code",[e._v("ViewPartial")]),e._v(" in the "),t("code",[e._v("IExternalServiceDescriptor")]),e._v(" implementation)")]),e._v(" "),t("li",[e._v("Implement a Controller that allows a user to create/edit the necessary data for an external service.")])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[166],{892:function(e,t,a){"use strict";a.r(t);var r=a(17),i=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btctransmuter-docs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btctransmuter-docs"}},[e._v("#")]),e._v(" BtcTransmuter Docs")]),e._v(" "),t("h2",{attrs:{id:"note-this-project-is-not-maintained"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#note-this-project-is-not-maintained"}},[e._v("#")]),e._v(" Note: This project is not maintained")]),e._v(" "),t("p",[e._v("Btctransmuter is no longer maintained and will not be updated with new features. Avoid using it, if you can.")]),e._v(" "),t("h2",{attrs:{id:"introduction-what-is-btctransmuter"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#introduction-what-is-btctransmuter"}},[e._v("#")]),e._v(" Introduction - What is BtcTransmuter?")]),e._v(" "),t("p",[e._v("BtcTransmuter is a free, open-source & self-hosted tool that allows you to configure actions that execute automatically upon specified conditions. Its primary focus is the integration of cryptocurrency services to help users manage their funds and business workflow.")]),e._v(" "),t("h2",{attrs:{id:"how-does-it-work"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-it-work"}},[e._v("#")]),e._v(" How does it work?")]),e._v(" "),t("p",[e._v("There are 3 main components in BtcTransmuter - External Services, Recipes and Extensions.")]),e._v(" "),t("ul",[t("li",[e._v("External services integrated with third parties, such as a BTCPayServer instance or a Cryptocurrency Exchange.")]),e._v(" "),t("li",[e._v("Recipes is a set of instructions created by the user: What to execute and when. The execution part is called a Recipe Action while the condition is called a Recipe Trigger. An action could be "),t("code",[e._v("Send an Email using the SMTP External Service")]),e._v(" and the trigger being "),t("code",[e._v("If a new invoice was created on my BtcPay External Service")])]),e._v(" "),t("li",[e._v("Extensions provide a way to add more external service types, actions and triggers without needing to modify the original code.")])]),e._v(" "),t("h2",{attrs:{id:"can-i-use-this-in-production"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-use-this-in-production"}},[e._v("#")]),e._v(" Can I use this in production")]),e._v(" "),t("p",[e._v("This project is still in early development and most likely has some bugs and quirks that need to be ironed out. The project is considered to be in ALPHA state, meaning not all desired functionality has been implemented and there can be breaking changes.")]),e._v(" "),t("h2",{attrs:{id:"how-do-i-deploy"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-deploy"}},[e._v("#")]),e._v(" How do I deploy?")]),e._v(" "),t("p",[e._v("If you set up BTCPay using any "),t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("dockerized install method")]),e._v(", you can enable BTC Transmuter easily.")],1),e._v(" "),t("p",[e._v("First, "),t("a",{attrs:{href:"https://github.com/JeffVandrewJr/patron/blob/master/SSH.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("SSH"),t("OutboundLink")],1),e._v(" into your server.\nThen run the following commands:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("export")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-btctransmuter"')]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" ./btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("If you have trouble starting your server after running the setup command, verify you have "),t("RouterLink",{attrs:{to:"/FAQ/FAQ-Deployment/#how-can-i-modify-or-deactivate-environment-variables"}},[e._v("added the environment variable")]),e._v(" correctly to enable Transmuter.")],1),e._v(" "),t("p",[e._v("Once completed, your Transmuter will be available at your configured BTCPay website under "),t("code",[e._v("/btctransmuter/")]),e._v(", where the first account to register becomes the Transmuter admin. Open that link in your browser and youll see the homepage.")]),e._v(" "),t("h2",{attrs:{id:"what-extensions-are-provided"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-extensions-are-provided"}},[e._v("#")]),e._v(" What extensions are provided?")]),e._v(" "),t("p",[e._v("You can see a list of built-in extensions once you log into your transmuter application under "),t("code",[e._v("/extensions")]),e._v(".")]),e._v(" "),t("p",[e._v("Currently there are 12 extensions that come bundled with the main application:")]),e._v(" "),t("ul",[t("li",[e._v("Tor - Provides TOR access to your Transmuter app")]),e._v(" "),t("li",[e._v("Presets - Provides one page wizards for quick setups of common scenarios")]),e._v(" "),t("li",[e._v("BtcPayServer - Provides you a way to interact with BTCPayServer stores")]),e._v(" "),t("li",[e._v("Email - Provides you with a way to check a POP3 for incoming emails and a way to send Email via SMTP")]),e._v(" "),t("li",[e._v("Exchange - Provides you a way to connect to a variety of exchanges and place orders on them")]),e._v(" "),t("li",[e._v("Lightning - Provides you interoperability with lightning nodes to be able to do basic channel and invoice management")]),e._v(" "),t("li",[e._v("NBXplorer - Provides you ways to detect incoming funds, send funds, and generate addresses.")]),e._v(" "),t("li",[e._v("Operators - Lets you create conditional workflows")]),e._v(" "),t("li",[e._v("Recipe - Lets you manage existing or create recipes with your workflows")]),e._v(" "),t("li",[e._v("Timer - Run X every Y")]),e._v(" "),t("li",[e._v("WebHook - Trigger Recipes with an http call or execute external web hooks with a recipe")])]),e._v(" "),t("h2",{attrs:{id:"what-preset-recipes-are-provided"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-preset-recipes-are-provided"}},[e._v("#")]),e._v(" What preset recipes are provided?")]),e._v(" "),t("p",[e._v("Currently there are three preset recipes that you can enable easily. In addition to the list below, you can create your own recipes for automating other tasks.")]),e._v(" "),t("ol",[t("li",[e._v("On-chain Forwarder - Forward funds from a wallet elsewhere")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Transmuter/EmailReceiptsPreset/"}},[e._v("BTCPay Email Receipts")]),e._v(" - Send an email when a BTCPay invoice gets paid")],1),e._v(" "),t("li",[e._v("Fiat Conversion - Convert incoming money to fiat on an exchange by market selling when BTCPay invoice statuses change.")]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Transmuter/DCA/"}},[e._v("Dollar Cost Average")]),e._v(" - Schedule daily purchases of Bitcoin")],1)]),e._v(" "),t("h2",{attrs:{id:"how-do-i-write-an-extension"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-write-an-extension"}},[e._v("#")]),e._v(" How do I write an extension?")]),e._v(" "),t("p",[e._v("An extension must be its own .net core class library project that references "),t("code",[e._v("BtcTransmuter.Abstractions")]),e._v("\nThere must be a class implementing "),t("code",[e._v("BtcTransmuterExtension")]),e._v(" in this library. This file bootstraps the plugin name and adds all the services to system on startup.")]),e._v(" "),t("h3",{attrs:{id:"adding-a-trigger"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-a-trigger"}},[e._v("#")]),e._v(" Adding a Trigger")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Implement "),t("code",[e._v("BaseTrigger")]),e._v(" This class will be used to transport the event data")])]),e._v(" "),t("li",[t("p",[e._v("Implement "),t("code",[e._v("BaseTriggerHandler")]),e._v(" This handles:")]),e._v(" "),t("ul",[t("li",[e._v("Describing the trigger to the main system.")]),e._v(" "),t("li",[e._v("Telling the main UI how to create/edit a recipe trigger using it.")]),e._v(" "),t("li",[e._v("The logic needed to see if a trigger is...triggered.")])]),e._v(" "),t("p",[e._v("You will see that "),t("code",[e._v("BaseTriggerHandler")]),e._v(" has 2 generic arguments, a "),t("code",[e._v("Data")]),e._v(" and "),t("code",[e._v("Parameters")]),e._v(" "),t("code",[e._v("Data")]),e._v(" is the trigger that that was detected, while "),t("code",[e._v("Parameters")]),e._v(" is the data from a Recipe to see if it triggers its actions.")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Partial View (named as the same value as the property "),t("code",[e._v("ViewPartial")]),e._v(" in the "),t("code",[e._v("BaseTriggerHandler")]),e._v(" implementation)\nThis handles displaying the trigger settings in a recipe")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Controller that allows a user to create/edit the necessary data to set the trigger on a recipe.")])])]),e._v(" "),t("h3",{attrs:{id:"adding-an-action"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-an-action"}},[e._v("#")]),e._v(" Adding an Action")]),e._v(" "),t("ul",[t("li",[t("p",[e._v("Implement "),t("code",[e._v("BaseActionHandler")]),e._v(" This handles:")]),e._v(" "),t("ul",[t("li",[e._v("Describing the action to the main system.")]),e._v(" "),t("li",[e._v("Telling the main UI how to create/edit a recipe action using it.")]),e._v(" "),t("li",[e._v("The logic needed to execute the action")])]),e._v(" "),t("p",[e._v("You will see that "),t("code",[e._v("BaseActionHandler")]),e._v(" has a generic argument, "),t("code",[e._v("Data")]),e._v(" "),t("code",[e._v("Data")]),e._v(" is the type of the action that holds the payload needed to exeucte the action through the instructions of recipe action")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Partial View (named as the same value as the property "),t("code",[e._v("ViewPartial")]),e._v(" in the "),t("code",[e._v("BaseActionHandler")]),e._v(" implementation)\nThis handles displaying the action settings in a recipe")])]),e._v(" "),t("li",[t("p",[e._v("Implement a Controller that allows a user to create/edit the necessary data to set the action on a recipe.")])])]),e._v(" "),t("h3",{attrs:{id:"adding-an-external-service"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adding-an-external-service"}},[e._v("#")]),e._v(" Adding an External Service")]),e._v(" "),t("ul",[t("li",[e._v("Implement "),t("code",[e._v("BaseExternalService")]),e._v(" & "),t("code",[e._v("IExternalServiceDescriptor")])]),e._v(" "),t("li",[e._v("Implement a Partial View (named as the same value as the property "),t("code",[e._v("ViewPartial")]),e._v(" in the "),t("code",[e._v("IExternalServiceDescriptor")]),e._v(" implementation)")]),e._v(" "),t("li",[e._v("Implement a Controller that allows a user to create/edit the necessary data for an external service.")])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/167.8325632a.js b/assets/js/167.ada0f246.js similarity index 97% rename from assets/js/167.8325632a.js rename to assets/js/167.ada0f246.js index 94c0bf723b..2b2d149f91 100644 --- a/assets/js/167.8325632a.js +++ b/assets/js/167.ada0f246.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[167],{892:function(e,t,a){"use strict";a.r(t);var o=a(17),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"trocador"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#trocador"}},[e._v("#")]),e._v(" Trocador")]),e._v(" "),t("p",[e._v("A plugin for BTCPay Server for users to pay invoices at checkout using a different cryptocurrency. Trocador is an exchange aggregator that offers excellent rates to users while providing them strong privacy.")]),e._v(" "),t("h2",{attrs:{id:"use-cases-and-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-cases-and-features"}},[e._v("#")]),e._v(" Use Cases and Features")]),e._v(" "),t("ul",[t("li",[e._v("Allow customers to pay with whichever asset they prefer.")]),e._v(" "),t("li",[e._v("Settle these purchases in your wallet of choice (Bitcoin, Monero, etc).")]),e._v(" "),t("li",[e._v('Choose a custom plugin name that is displayed to the user (default is "Altcoins Trocador").')]),e._v(" "),t("li",[e._v("Choose a default payment currency that is shown to the user (eg: Ethereum), and the user can choose a different one.")]),e._v(" "),t("li",[e._v("Optionally show Trocador to the customer first in the invoice by default.")]),e._v(" "),t("li",[e._v("Optionally provide a referral code to earn a portion of the volume.")])]),e._v(" "),t("h2",{attrs:{id:"caveats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#caveats"}},[e._v("#")]),e._v(" Caveats")]),e._v(" "),t("p",[t("strong",[e._v("We recommend setting the invoice expiry timer to at least 120 minutes.")]),e._v(' This can be done by clicking on "Settings", and then editing the value in General for "Invoice expires if the full amount has not been paid after " to 120 or larger. Most exchanges complete in about 10 minutes but the slowest may take up to a day, depending on network congestion and/or exchange delays.')]),e._v(" "),t("p",[e._v("We recommend not selecting lightning network as the default wallet to receive payments from Trocador, as this may worsen conversion rates and reduce the number of coins accepted.")]),e._v(" "),t("h2",{attrs:{id:"compatibility"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#compatibility"}},[e._v("#")]),e._v(" Compatibility")]),e._v(" "),t("p",[e._v("We recommend only enabling one checkout plugin (eg: only enabling Trocador, not also enabling SideShift and/or FixedFloat).")]),e._v(" "),t("h2",{attrs:{id:"how-to-activate"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-activate"}},[e._v("#")]),e._v(" How to activate")]),e._v(" "),t("p",[e._v('In the server dashboard, click on "Manage Plugins", then click the "Install" button after Trocador.')])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[167],{895:function(e,t,a){"use strict";a.r(t);var o=a(17),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"trocador"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#trocador"}},[e._v("#")]),e._v(" Trocador")]),e._v(" "),t("p",[e._v("A plugin for BTCPay Server for users to pay invoices at checkout using a different cryptocurrency. Trocador is an exchange aggregator that offers excellent rates to users while providing them strong privacy.")]),e._v(" "),t("h2",{attrs:{id:"use-cases-and-features"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#use-cases-and-features"}},[e._v("#")]),e._v(" Use Cases and Features")]),e._v(" "),t("ul",[t("li",[e._v("Allow customers to pay with whichever asset they prefer.")]),e._v(" "),t("li",[e._v("Settle these purchases in your wallet of choice (Bitcoin, Monero, etc).")]),e._v(" "),t("li",[e._v('Choose a custom plugin name that is displayed to the user (default is "Altcoins Trocador").')]),e._v(" "),t("li",[e._v("Choose a default payment currency that is shown to the user (eg: Ethereum), and the user can choose a different one.")]),e._v(" "),t("li",[e._v("Optionally show Trocador to the customer first in the invoice by default.")]),e._v(" "),t("li",[e._v("Optionally provide a referral code to earn a portion of the volume.")])]),e._v(" "),t("h2",{attrs:{id:"caveats"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#caveats"}},[e._v("#")]),e._v(" Caveats")]),e._v(" "),t("p",[t("strong",[e._v("We recommend setting the invoice expiry timer to at least 120 minutes.")]),e._v(' This can be done by clicking on "Settings", and then editing the value in General for "Invoice expires if the full amount has not been paid after " to 120 or larger. Most exchanges complete in about 10 minutes but the slowest may take up to a day, depending on network congestion and/or exchange delays.')]),e._v(" "),t("p",[e._v("We recommend not selecting lightning network as the default wallet to receive payments from Trocador, as this may worsen conversion rates and reduce the number of coins accepted.")]),e._v(" "),t("h2",{attrs:{id:"compatibility"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#compatibility"}},[e._v("#")]),e._v(" Compatibility")]),e._v(" "),t("p",[e._v("We recommend only enabling one checkout plugin (eg: only enabling Trocador, not also enabling SideShift and/or FixedFloat).")]),e._v(" "),t("h2",{attrs:{id:"how-to-activate"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-activate"}},[e._v("#")]),e._v(" How to activate")]),e._v(" "),t("p",[e._v('In the server dashboard, click on "Manage Plugins", then click the "Install" button after Trocador.')])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/168.bc090dde.js b/assets/js/168.fe7b823f.js similarity index 99% rename from assets/js/168.bc090dde.js rename to assets/js/168.fe7b823f.js index fd60278899..5dfd7fb5f4 100644 --- a/assets/js/168.bc090dde.js +++ b/assets/js/168.fe7b823f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[168],{893:function(e,t,r){"use strict";r.r(t);var o=r(17),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"troubleshooting-an-issue-in-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting-an-issue-in-btcpay-server"}},[e._v("#")]),e._v(" Troubleshooting an issue in BTCPay Server")]),e._v(" "),t("p",[e._v("Facing a problem is never fun. This document explains the most common workflow and steps you should take to "),t("strong",[e._v("identify the issue")]),e._v(" you're having more easily and hopefully solve it yourself or with community help.")]),e._v(" "),t("p",[e._v("Identifying the problem is crucial.")]),e._v(" "),t("h2",{attrs:{id:"1-replicating-the-issue"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-replicating-the-issue"}},[e._v("#")]),e._v(" 1. Replicating the issue")]),e._v(" "),t("p",[e._v("First and foremost, try to determine when the issue happens.\nTry to replicate the problem.\nTry to update and restart your server to verify you can reproduce your issue.\nIf you think it will describe your issue better, take a screenshot.")]),e._v(" "),t("h3",{attrs:{id:"11-updating-the-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-updating-the-server"}},[e._v("#")]),e._v(" 1.1 Updating the server")]),e._v(" "),t("p",[e._v("Check "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-can-i-see-my-btcpay-version"}},[e._v("your version of BTCPay")]),e._v(".\nIf it is much older than the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("latest version"),t("OutboundLink")],1),e._v(" of BTCPay, "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-update-btcpay-server"}},[e._v("updating your server")]),e._v(" may resolve the issue.")],1),e._v(" "),t("h3",{attrs:{id:"12-restarting-the-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-restarting-the-server"}},[e._v("#")]),e._v(" 1.2 Restarting the server")]),e._v(" "),t("p",[e._v("Restarting your server is an easy way to solve many of the most common BTCPay Server issues.\nYou may need to "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[e._v("SSH into your server")]),e._v(" to restart it.")],1),e._v(" "),t("h3",{attrs:{id:"13-restarting-a-service"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#13-restarting-a-service"}},[e._v("#")]),e._v(" 1.3 Restarting a service")]),e._v(" "),t("p",[e._v("Some issues you may only need to restart a particular service in your BTCPay Server deployment.\nSuch as restarting the letsencrypt container to renew the SSL certificate.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" restart letsencrypt-nginx-proxy-companion\n")])])]),t("p",[e._v("Use "),t("code",[e._v("docker ps")]),e._v(" to find the name of a different service you would like to restart.")]),e._v(" "),t("h2",{attrs:{id:"2-looking-through-the-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-looking-through-the-logs"}},[e._v("#")]),e._v(" 2. Looking through the logs")]),e._v(" "),t("p",[e._v("Logs can provide an essential piece of information.\nIn the next few paragraphs, we will describe how to get the "),t("strong",[e._v("log information for various parts of BTCPay")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"21-btcpay-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-btcpay-logs"}},[e._v("#")]),e._v(" 2.1 BTCPay Logs")]),e._v(" "),t("p",[e._v("Since the v1.0.3.8, you can easily access BTCPay Server logs from the front-end.\nIf you are a server admin, go to "),t("strong",[e._v("Server Settings > Logs")]),e._v(" and open the logs file.\nIf you don't know what a particular error in the logs means, make sure to mention it when troubleshooting.")]),e._v(" "),t("p",[e._v("If you would like more detailed logs and you're using a Docker deployment, you can view logs of specific Docker containers using the command line.\nSee these "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[e._v("instructions to ssh")]),e._v(" into an instance of BTCPay running on a VPS.")],1),e._v(" "),t("p",[e._v("Below is a general list of the container names used for BTCPay.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("LOGS FOR")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("CONTAINER NAME")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("BTCPayServer")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_btcpayserver_1")])]),e._v(" "),t("tr",[t("td",[e._v("NBXplorer")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_nbxplorer_1")])]),e._v(" "),t("tr",[t("td",[e._v("Bitcoind")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("btcpayserver_bitcoind")])]),e._v(" "),t("tr",[t("td",[e._v("Postgres")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_postgres_1")])]),e._v(" "),t("tr",[t("td",[e._v("proxy")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("letsencrypt-nginx-proxy-companion")])]),e._v(" "),t("tr",[t("td",[e._v("Nginx")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("nginx-gen")])]),e._v(" "),t("tr",[t("td",[e._v("Nginx")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("nginx")])]),e._v(" "),t("tr",[t("td",[e._v("Core Lightning (CLN)")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("btcpayserver_clightning_bitcoin")])]),e._v(" "),t("tr",[t("td",[e._v("LND")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("btcpayserver_lnd_bitcoin")])]),e._v(" "),t("tr",[t("td",[e._v("RTL")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_lnd_bitcoin_rtl_1")])]),e._v(" "),t("tr",[t("td",[e._v("Thunderhub")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_bitcoin_thub_1")])]),e._v(" "),t("tr",[t("td",[e._v("LibrePatron")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("librepatron")])]),e._v(" "),t("tr",[t("td",[e._v("Tor")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("tor-gen")])]),e._v(" "),t("tr",[t("td",[e._v("Tor")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("tor")])])])]),e._v(" "),t("p",[e._v("Run the commands below to print logs by container name.\nReplace the container name to view other container logs.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ps")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" generated_btcpayserver_1\n")])])]),t("h3",{attrs:{id:"22-lightning-network-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-lightning-network-logs"}},[e._v("#")]),e._v(" 2.2 Lightning Network Logs")]),e._v(" "),t("p",[e._v("Use the following if you're having a problem with the Lightning Network.")]),e._v(" "),t("h3",{attrs:{id:"221-lightning-network-lnd-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#221-lightning-network-lnd-docker"}},[e._v("#")]),e._v(" 2.2.1 - Lightning Network LND - Docker")]),e._v(" "),t("p",[e._v("There are a few ways to access your LND logs when using Docker.\nFirst log in as root:")]),e._v(" "),t("p",[t("code",[e._v("sudo su -")])]),e._v(" "),t("p",[e._v("Navigate to the correct directory:")]),e._v(" "),t("p",[t("code",[e._v("cd btcpayserver-docker")])]),e._v(" "),t("p",[e._v("Find container name:")]),e._v(" "),t("p",[t("code",[e._v("docker ps")])]),e._v(" "),t("p",[e._v("Print logs by container name:")]),e._v(" "),t("p",[t("code",[e._v("docker logs --tail 100 btcpayserver_lnd_bitcoin")])]),e._v(" "),t("p",[e._v("Alternatively, you can quickly print logs by using container ID (only the first unique ID characters are needed, such as the two furthest left characters):")]),e._v(" "),t("p",[t("code",[e._v("docker logs 'add your container ID '")])]),e._v(" "),t("p",[e._v("If for any reason you need more logs")]),e._v(" "),t("p",[t("code",[e._v("sudo su -")])]),e._v(" "),t("p",[t("code",[e._v("cd /var/lib/docker/volumes/generated_lnd_bitcoin_datadir/_data/logs/bitcoin/mainnet/")])]),e._v(" "),t("p",[e._v("inside that directory do "),t("code",[e._v("ls")])]),e._v(" "),t("p",[e._v("You will see something like "),t("code",[e._v("lnd.log lnd.log.13 lnd.log.15 lnd.log.16.gz lnd.log.17.gz")])]),e._v(" "),t("p",[e._v("To access uncompressed logs of those logs do "),t("code",[e._v("cat lnd.log")]),e._v(" or if you want another one, use "),t("code",[e._v("cat lnd.log.15")])]),e._v(" "),t("p",[e._v("To access compressed logs in .gzip use "),t("code",[e._v("gzip -d lnd.log.16.gz")]),e._v(" (in this case we're accessing lnd.log.16.gz)")]),e._v(" "),t("p",[e._v("This should give you a new file, where you can do "),t("code",[e._v("cat lnd.log.16")])]),e._v(" "),t("p",[e._v("In case the above does not work, you may need to use install gzip first "),t("code",[e._v("sudo apt-get install gzip")])]),e._v(" "),t("h3",{attrs:{id:"222-lightning-network-core-lightning-cln-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#222-lightning-network-core-lightning-cln-docker"}},[e._v("#")]),e._v(" 2.2.2 - Lightning Network Core Lightning (CLN) - Docker")]),e._v(" "),t("p",[t("code",[e._v("sudo su -")])]),e._v(" "),t("p",[t("code",[e._v("docker ps")])]),e._v(" "),t("p",[e._v("Find the Core Lightning (CLN) container ID.")]),e._v(" "),t("p",[e._v("docker logs 'add your container ID here'")]),e._v(" "),t("p",[e._v("alternatively, use this")]),e._v(" "),t("p",[t("code",[e._v("docker logs --tail 100 btcpayserver_clightning_bitcoin")])]),e._v(" "),t("p",[e._v("You can also get log information with Core Lightning (CLN) cli command.")]),e._v(" "),t("p",[t("code",[e._v("bitcoin-lightning-cli.sh getlog")])]),e._v(" "),t("h2",{attrs:{id:"23-bitcoin-node-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#23-bitcoin-node-logs"}},[e._v("#")]),e._v(" 2.3 - Bitcoin Node Logs")]),e._v(" "),t("p",[e._v("In addition to "),t("a",{attrs:{href:"#2-looking-through-the-logs"}},[e._v("looking at logs")]),e._v(" of your Bitcoind container, you can also use any of the "),t("a",{attrs:{href:"https://developer.bitcoin.org/reference/rpc/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin-cli commands"),t("OutboundLink")],1),e._v(" to obtain information from your bitcoin node.\nBTCPay includes a script to allow you to communicate with your Bitcoin node easily.")]),e._v(" "),t("p",[e._v("Inside the "),t("code",[e._v("btcpayserver-docker")]),e._v(" folder, get the blockchain information using your node:")]),e._v(" "),t("p",[t("code",[e._v("bitcoin-cli.sh getblockchaininfo")])]),e._v(" "),t("h2",{attrs:{id:"3-finding-a-solution-yourself-google-faq-github-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-finding-a-solution-yourself-google-faq-github-issues"}},[e._v("#")]),e._v(" 3. Finding a solution yourself (Google, FAQ, GitHub issues)")]),e._v(" "),t("p",[e._v("Even though setups differ, the chances that someone else experienced the same issue as yours are pretty high.\nTake a few moments, Google around and see if you can solve it yourself.")]),e._v(" "),t("h3",{attrs:{id:"31-btcpay-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#31-btcpay-faq"}},[e._v("#")]),e._v(" 3.1 BTCPay FAQ")]),e._v(" "),t("p",[e._v("We try to document the most common issues on the "),t("RouterLink",{attrs:{to:"/FAQ/"}},[e._v("Frequently Asked Questions page")]),e._v(".\nTake a look there and see if your question is recorded.")],1),e._v(" "),t("h3",{attrs:{id:"32-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#32-github"}},[e._v("#")]),e._v(" 3.2 GitHub")]),e._v(" "),t("p",[e._v("When there's an advanced technical issue, users usually open an issue on GitHub.\nTake a look at the BTCPay GitHub repository and browse "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues?q=is%3Aissue+is%3Aclosed",target:"_blank",rel:"noopener noreferrer"}},[e._v("search the closed issues"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"33-mattermost"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#33-mattermost"}},[e._v("#")]),e._v(" 3.3 Mattermost")]),e._v(" "),t("p",[e._v("Mattermost chat platform is great for similar issues, other users experienced before you.\nOn the top right-hand corner, click on the search and enter your query.")]),e._v(" "),t("h2",{attrs:{id:"4-asking-for-help"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#4-asking-for-help"}},[e._v("#")]),e._v(" 4. Asking for help")]),e._v(" "),t("p",[e._v("If you're unable to solve the problem yourself, do not worry.\nThere's an amid community ready to help you.")]),e._v(" "),t("p",[e._v("The better you describe the problem, the higher are the chances of getting a timely fix.\nBe concise and provide as much relevant information as possible.\nBe sure to include the "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-can-i-see-my-btcpay-version"}},[e._v("version you're using")]),e._v(" and describe your BTCPay Deployment Setup.\nTry to explain what you're trying to do and what's the issue.\nIf you can provide the logs.\nIf you think it's relevant, feel free to include a screenshot.")],1),e._v(" "),t("p",[e._v("Here's a good example of how to ask a question.")]),e._v(" "),t("blockquote",[t("p",[e._v("I'm having a problem with XYZ. I can replicate the problem. My BTCPay version is 0.100.31, and I deployed my server on Digital Ocean by following Docker deployment guide. I've searched through the FAQ and closed GitHub issues, but there's no solution to my problem. My BTCPay Setup is XYZ, and the issue is occurring when I do XYZ. Here are the logs I was able to get from my BTCPay instance. You can see the error in the image I attached.")])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Please note:")]),e._v(" "),t("p",[e._v("The community will not provide extensive support for custom deployments.\nI.e. variations of "),t("RouterLink",{attrs:{to:"/Deployment/ManualDeployment/"}},[e._v("Manual Deployments")]),e._v(" are expected to be used only for development purposes and by users with technical literacy with the ability to "),t("strong",[e._v("resolve deployment and maintenance issues on their own")]),e._v(". This includes "),t("RouterLink",{attrs:{to:"/Deployment/HardwareAsAService/"}},[e._v("Hardware-As-A-Service")]),e._v(" products (Nodl, RaspiBlitz, Umbrel, etc ...)")],1)]),e._v(" "),t("h3",{attrs:{id:"41-asking-the-community-general-problems"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#41-asking-the-community-general-problems"}},[e._v("#")]),e._v(" 4.1 Asking the community (general problems)")]),e._v(" "),t("p",[e._v("For quick answers to fundamental problems, it's best to post a question in #support channel on "),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/support",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Mattermost"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"42-opening-an-issue-on-github-advanced-problems"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#42-opening-an-issue-on-github-advanced-problems"}},[e._v("#")]),e._v(" 4.2 Opening an Issue on GitHub (advanced problems)")]),e._v(" "),t("p",[e._v("If you have a custom build setup and are facing a complex problem, "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("open an issue on GitHub"),t("OutboundLink")],1),e._v(" so that developers can help you out.")]),e._v(" "),t("h3",{attrs:{id:"43-premium-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#43-premium-support"}},[e._v("#")]),e._v(" 4.3 Premium Support")]),e._v(" "),t("p",[e._v("Some community members provide paid support.\nIf you want a quicker help, check out the list of "),t("RouterLink",{attrs:{to:"/Support/"}},[e._v("members providing premium support")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"44-lightning-network-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#44-lightning-network-support"}},[e._v("#")]),e._v(" 4.4 Lightning Network Support")]),e._v(" "),t("p",[e._v("If you're facing a technical problem with your Lightning Network implementation, you may want to ask questions in their respective communities.")]),e._v(" "),t("h4",{attrs:{id:"441-lnd-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#441-lnd-support"}},[e._v("#")]),e._v(" 4.4.1 LND Support")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/lightningnetwork/lnd/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("LND GitHub"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://lightningcommunity.slack.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning Community on Slack"),t("OutboundLink")],1)])]),e._v(" "),t("h4",{attrs:{id:"442-core-lightning-cln-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#442-core-lightning-cln-support"}},[e._v("#")]),e._v(" 4.4.2 Core Lightning (CLN) Support")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/ElementsProject/lightning/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN GitHub"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://t.me/lightningd",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN Telegram Group"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://lightning.readthedocs.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN docs"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[168],{890:function(e,t,r){"use strict";r.r(t);var o=r(17),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"troubleshooting-an-issue-in-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting-an-issue-in-btcpay-server"}},[e._v("#")]),e._v(" Troubleshooting an issue in BTCPay Server")]),e._v(" "),t("p",[e._v("Facing a problem is never fun. This document explains the most common workflow and steps you should take to "),t("strong",[e._v("identify the issue")]),e._v(" you're having more easily and hopefully solve it yourself or with community help.")]),e._v(" "),t("p",[e._v("Identifying the problem is crucial.")]),e._v(" "),t("h2",{attrs:{id:"1-replicating-the-issue"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-replicating-the-issue"}},[e._v("#")]),e._v(" 1. Replicating the issue")]),e._v(" "),t("p",[e._v("First and foremost, try to determine when the issue happens.\nTry to replicate the problem.\nTry to update and restart your server to verify you can reproduce your issue.\nIf you think it will describe your issue better, take a screenshot.")]),e._v(" "),t("h3",{attrs:{id:"11-updating-the-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-updating-the-server"}},[e._v("#")]),e._v(" 1.1 Updating the server")]),e._v(" "),t("p",[e._v("Check "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-can-i-see-my-btcpay-version"}},[e._v("your version of BTCPay")]),e._v(".\nIf it is much older than the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("latest version"),t("OutboundLink")],1),e._v(" of BTCPay, "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-update-btcpay-server"}},[e._v("updating your server")]),e._v(" may resolve the issue.")],1),e._v(" "),t("h3",{attrs:{id:"12-restarting-the-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-restarting-the-server"}},[e._v("#")]),e._v(" 1.2 Restarting the server")]),e._v(" "),t("p",[e._v("Restarting your server is an easy way to solve many of the most common BTCPay Server issues.\nYou may need to "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[e._v("SSH into your server")]),e._v(" to restart it.")],1),e._v(" "),t("h3",{attrs:{id:"13-restarting-a-service"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#13-restarting-a-service"}},[e._v("#")]),e._v(" 1.3 Restarting a service")]),e._v(" "),t("p",[e._v("Some issues you may only need to restart a particular service in your BTCPay Server deployment.\nSuch as restarting the letsencrypt container to renew the SSL certificate.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" restart letsencrypt-nginx-proxy-companion\n")])])]),t("p",[e._v("Use "),t("code",[e._v("docker ps")]),e._v(" to find the name of a different service you would like to restart.")]),e._v(" "),t("h2",{attrs:{id:"2-looking-through-the-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-looking-through-the-logs"}},[e._v("#")]),e._v(" 2. Looking through the logs")]),e._v(" "),t("p",[e._v("Logs can provide an essential piece of information.\nIn the next few paragraphs, we will describe how to get the "),t("strong",[e._v("log information for various parts of BTCPay")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"21-btcpay-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-btcpay-logs"}},[e._v("#")]),e._v(" 2.1 BTCPay Logs")]),e._v(" "),t("p",[e._v("Since the v1.0.3.8, you can easily access BTCPay Server logs from the front-end.\nIf you are a server admin, go to "),t("strong",[e._v("Server Settings > Logs")]),e._v(" and open the logs file.\nIf you don't know what a particular error in the logs means, make sure to mention it when troubleshooting.")]),e._v(" "),t("p",[e._v("If you would like more detailed logs and you're using a Docker deployment, you can view logs of specific Docker containers using the command line.\nSee these "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-ssh-into-my-btcpay-running-on-vps"}},[e._v("instructions to ssh")]),e._v(" into an instance of BTCPay running on a VPS.")],1),e._v(" "),t("p",[e._v("Below is a general list of the container names used for BTCPay.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("LOGS FOR")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("CONTAINER NAME")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[e._v("BTCPayServer")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_btcpayserver_1")])]),e._v(" "),t("tr",[t("td",[e._v("NBXplorer")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_nbxplorer_1")])]),e._v(" "),t("tr",[t("td",[e._v("Bitcoind")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("btcpayserver_bitcoind")])]),e._v(" "),t("tr",[t("td",[e._v("Postgres")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_postgres_1")])]),e._v(" "),t("tr",[t("td",[e._v("proxy")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("letsencrypt-nginx-proxy-companion")])]),e._v(" "),t("tr",[t("td",[e._v("Nginx")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("nginx-gen")])]),e._v(" "),t("tr",[t("td",[e._v("Nginx")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("nginx")])]),e._v(" "),t("tr",[t("td",[e._v("Core Lightning (CLN)")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("btcpayserver_clightning_bitcoin")])]),e._v(" "),t("tr",[t("td",[e._v("LND")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("btcpayserver_lnd_bitcoin")])]),e._v(" "),t("tr",[t("td",[e._v("RTL")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_lnd_bitcoin_rtl_1")])]),e._v(" "),t("tr",[t("td",[e._v("Thunderhub")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("generated_bitcoin_thub_1")])]),e._v(" "),t("tr",[t("td",[e._v("LibrePatron")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("librepatron")])]),e._v(" "),t("tr",[t("td",[e._v("Tor")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("tor-gen")])]),e._v(" "),t("tr",[t("td",[e._v("Tor")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("tor")])])])]),e._v(" "),t("p",[e._v("Run the commands below to print logs by container name.\nReplace the container name to view other container logs.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-docker\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ps")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token number"}},[e._v("100")]),e._v(" generated_btcpayserver_1\n")])])]),t("h3",{attrs:{id:"22-lightning-network-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-lightning-network-logs"}},[e._v("#")]),e._v(" 2.2 Lightning Network Logs")]),e._v(" "),t("p",[e._v("Use the following if you're having a problem with the Lightning Network.")]),e._v(" "),t("h3",{attrs:{id:"221-lightning-network-lnd-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#221-lightning-network-lnd-docker"}},[e._v("#")]),e._v(" 2.2.1 - Lightning Network LND - Docker")]),e._v(" "),t("p",[e._v("There are a few ways to access your LND logs when using Docker.\nFirst log in as root:")]),e._v(" "),t("p",[t("code",[e._v("sudo su -")])]),e._v(" "),t("p",[e._v("Navigate to the correct directory:")]),e._v(" "),t("p",[t("code",[e._v("cd btcpayserver-docker")])]),e._v(" "),t("p",[e._v("Find container name:")]),e._v(" "),t("p",[t("code",[e._v("docker ps")])]),e._v(" "),t("p",[e._v("Print logs by container name:")]),e._v(" "),t("p",[t("code",[e._v("docker logs --tail 100 btcpayserver_lnd_bitcoin")])]),e._v(" "),t("p",[e._v("Alternatively, you can quickly print logs by using container ID (only the first unique ID characters are needed, such as the two furthest left characters):")]),e._v(" "),t("p",[t("code",[e._v("docker logs 'add your container ID '")])]),e._v(" "),t("p",[e._v("If for any reason you need more logs")]),e._v(" "),t("p",[t("code",[e._v("sudo su -")])]),e._v(" "),t("p",[t("code",[e._v("cd /var/lib/docker/volumes/generated_lnd_bitcoin_datadir/_data/logs/bitcoin/mainnet/")])]),e._v(" "),t("p",[e._v("inside that directory do "),t("code",[e._v("ls")])]),e._v(" "),t("p",[e._v("You will see something like "),t("code",[e._v("lnd.log lnd.log.13 lnd.log.15 lnd.log.16.gz lnd.log.17.gz")])]),e._v(" "),t("p",[e._v("To access uncompressed logs of those logs do "),t("code",[e._v("cat lnd.log")]),e._v(" or if you want another one, use "),t("code",[e._v("cat lnd.log.15")])]),e._v(" "),t("p",[e._v("To access compressed logs in .gzip use "),t("code",[e._v("gzip -d lnd.log.16.gz")]),e._v(" (in this case we're accessing lnd.log.16.gz)")]),e._v(" "),t("p",[e._v("This should give you a new file, where you can do "),t("code",[e._v("cat lnd.log.16")])]),e._v(" "),t("p",[e._v("In case the above does not work, you may need to use install gzip first "),t("code",[e._v("sudo apt-get install gzip")])]),e._v(" "),t("h3",{attrs:{id:"222-lightning-network-core-lightning-cln-docker"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#222-lightning-network-core-lightning-cln-docker"}},[e._v("#")]),e._v(" 2.2.2 - Lightning Network Core Lightning (CLN) - Docker")]),e._v(" "),t("p",[t("code",[e._v("sudo su -")])]),e._v(" "),t("p",[t("code",[e._v("docker ps")])]),e._v(" "),t("p",[e._v("Find the Core Lightning (CLN) container ID.")]),e._v(" "),t("p",[e._v("docker logs 'add your container ID here'")]),e._v(" "),t("p",[e._v("alternatively, use this")]),e._v(" "),t("p",[t("code",[e._v("docker logs --tail 100 btcpayserver_clightning_bitcoin")])]),e._v(" "),t("p",[e._v("You can also get log information with Core Lightning (CLN) cli command.")]),e._v(" "),t("p",[t("code",[e._v("bitcoin-lightning-cli.sh getlog")])]),e._v(" "),t("h2",{attrs:{id:"23-bitcoin-node-logs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#23-bitcoin-node-logs"}},[e._v("#")]),e._v(" 2.3 - Bitcoin Node Logs")]),e._v(" "),t("p",[e._v("In addition to "),t("a",{attrs:{href:"#2-looking-through-the-logs"}},[e._v("looking at logs")]),e._v(" of your Bitcoind container, you can also use any of the "),t("a",{attrs:{href:"https://developer.bitcoin.org/reference/rpc/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("bitcoin-cli commands"),t("OutboundLink")],1),e._v(" to obtain information from your bitcoin node.\nBTCPay includes a script to allow you to communicate with your Bitcoin node easily.")]),e._v(" "),t("p",[e._v("Inside the "),t("code",[e._v("btcpayserver-docker")]),e._v(" folder, get the blockchain information using your node:")]),e._v(" "),t("p",[t("code",[e._v("bitcoin-cli.sh getblockchaininfo")])]),e._v(" "),t("h2",{attrs:{id:"3-finding-a-solution-yourself-google-faq-github-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-finding-a-solution-yourself-google-faq-github-issues"}},[e._v("#")]),e._v(" 3. Finding a solution yourself (Google, FAQ, GitHub issues)")]),e._v(" "),t("p",[e._v("Even though setups differ, the chances that someone else experienced the same issue as yours are pretty high.\nTake a few moments, Google around and see if you can solve it yourself.")]),e._v(" "),t("h3",{attrs:{id:"31-btcpay-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#31-btcpay-faq"}},[e._v("#")]),e._v(" 3.1 BTCPay FAQ")]),e._v(" "),t("p",[e._v("We try to document the most common issues on the "),t("RouterLink",{attrs:{to:"/FAQ/"}},[e._v("Frequently Asked Questions page")]),e._v(".\nTake a look there and see if your question is recorded.")],1),e._v(" "),t("h3",{attrs:{id:"32-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#32-github"}},[e._v("#")]),e._v(" 3.2 GitHub")]),e._v(" "),t("p",[e._v("When there's an advanced technical issue, users usually open an issue on GitHub.\nTake a look at the BTCPay GitHub repository and browse "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues?q=is%3Aissue+is%3Aclosed",target:"_blank",rel:"noopener noreferrer"}},[e._v("search the closed issues"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"33-mattermost"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#33-mattermost"}},[e._v("#")]),e._v(" 3.3 Mattermost")]),e._v(" "),t("p",[e._v("Mattermost chat platform is great for similar issues, other users experienced before you.\nOn the top right-hand corner, click on the search and enter your query.")]),e._v(" "),t("h2",{attrs:{id:"4-asking-for-help"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#4-asking-for-help"}},[e._v("#")]),e._v(" 4. Asking for help")]),e._v(" "),t("p",[e._v("If you're unable to solve the problem yourself, do not worry.\nThere's an amid community ready to help you.")]),e._v(" "),t("p",[e._v("The better you describe the problem, the higher are the chances of getting a timely fix.\nBe concise and provide as much relevant information as possible.\nBe sure to include the "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-can-i-see-my-btcpay-version"}},[e._v("version you're using")]),e._v(" and describe your BTCPay Deployment Setup.\nTry to explain what you're trying to do and what's the issue.\nIf you can provide the logs.\nIf you think it's relevant, feel free to include a screenshot.")],1),e._v(" "),t("p",[e._v("Here's a good example of how to ask a question.")]),e._v(" "),t("blockquote",[t("p",[e._v("I'm having a problem with XYZ. I can replicate the problem. My BTCPay version is 0.100.31, and I deployed my server on Digital Ocean by following Docker deployment guide. I've searched through the FAQ and closed GitHub issues, but there's no solution to my problem. My BTCPay Setup is XYZ, and the issue is occurring when I do XYZ. Here are the logs I was able to get from my BTCPay instance. You can see the error in the image I attached.")])]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("Please note:")]),e._v(" "),t("p",[e._v("The community will not provide extensive support for custom deployments.\nI.e. variations of "),t("RouterLink",{attrs:{to:"/Deployment/ManualDeployment/"}},[e._v("Manual Deployments")]),e._v(" are expected to be used only for development purposes and by users with technical literacy with the ability to "),t("strong",[e._v("resolve deployment and maintenance issues on their own")]),e._v(". This includes "),t("RouterLink",{attrs:{to:"/Deployment/HardwareAsAService/"}},[e._v("Hardware-As-A-Service")]),e._v(" products (Nodl, RaspiBlitz, Umbrel, etc ...)")],1)]),e._v(" "),t("h3",{attrs:{id:"41-asking-the-community-general-problems"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#41-asking-the-community-general-problems"}},[e._v("#")]),e._v(" 4.1 Asking the community (general problems)")]),e._v(" "),t("p",[e._v("For quick answers to fundamental problems, it's best to post a question in #support channel on "),t("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/support",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Mattermost"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"42-opening-an-issue-on-github-advanced-problems"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#42-opening-an-issue-on-github-advanced-problems"}},[e._v("#")]),e._v(" 4.2 Opening an Issue on GitHub (advanced problems)")]),e._v(" "),t("p",[e._v("If you have a custom build setup and are facing a complex problem, "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("open an issue on GitHub"),t("OutboundLink")],1),e._v(" so that developers can help you out.")]),e._v(" "),t("h3",{attrs:{id:"43-premium-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#43-premium-support"}},[e._v("#")]),e._v(" 4.3 Premium Support")]),e._v(" "),t("p",[e._v("Some community members provide paid support.\nIf you want a quicker help, check out the list of "),t("RouterLink",{attrs:{to:"/Support/"}},[e._v("members providing premium support")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"44-lightning-network-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#44-lightning-network-support"}},[e._v("#")]),e._v(" 4.4 Lightning Network Support")]),e._v(" "),t("p",[e._v("If you're facing a technical problem with your Lightning Network implementation, you may want to ask questions in their respective communities.")]),e._v(" "),t("h4",{attrs:{id:"441-lnd-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#441-lnd-support"}},[e._v("#")]),e._v(" 4.4.1 LND Support")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/lightningnetwork/lnd/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("LND GitHub"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://lightningcommunity.slack.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Lightning Community on Slack"),t("OutboundLink")],1)])]),e._v(" "),t("h4",{attrs:{id:"442-core-lightning-cln-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#442-core-lightning-cln-support"}},[e._v("#")]),e._v(" 4.4.2 Core Lightning (CLN) Support")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/ElementsProject/lightning/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN GitHub"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://t.me/lightningd",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN Telegram Group"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://lightning.readthedocs.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("CLN docs"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/169.940b4060.js b/assets/js/169.b46bec4c.js similarity index 98% rename from assets/js/169.940b4060.js rename to assets/js/169.b46bec4c.js index 356a86f066..aa78d6ac93 100644 --- a/assets/js/169.940b4060.js +++ b/assets/js/169.b46bec4c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[169],{894:function(t,e,r){"use strict";r.r(e);var o=r(17),a=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"try-out-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#try-out-btcpay-server"}},[t._v("#")]),t._v(" Try out BTCPay server")]),t._v(" "),e("p",[t._v("Before you start using BTCPay Server in production, you can try it and see if it fits your needs.")]),t._v(" "),e("p",[t._v("On this page you will see various ways to test out the software on mainnet and testnet.")]),t._v(" "),e("h2",{attrs:{id:"our-mainnet-demo-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#our-mainnet-demo-server"}},[t._v("#")]),t._v(" Our mainnet demo server")]),t._v(" "),e("p",[t._v("We host our server on "),e("a",{attrs:{href:"https://mainnet.demo.btcpayserver.org/login",target:"_blank",rel:"noopener noreferrer"}},[t._v("mainnet.demo.btcpayserver.org"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("Feel free to register to it, create a store and a wallet and play around.")]),t._v(" "),e("p",[t._v("This instance should only be used for testing things out. We do not guarantee uptime.")]),t._v(" "),e("h2",{attrs:{id:"our-testnet-demo-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#our-testnet-demo-server"}},[t._v("#")]),t._v(" Our Testnet demo server")]),t._v(" "),e("p",[t._v("If you're familiar with testnet and want to test BTCPay through it, check "),e("a",{attrs:{href:"https://testnet.demo.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("testnet.demo.btcpayserver.org"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("For more information see "),e("RouterLink",{attrs:{to:"/Development/TestnetDemo/"}},[t._v("testnet documentation")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"third-party-hosts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#third-party-hosts"}},[t._v("#")]),t._v(" Third-party hosts")]),t._v(" "),e("p",[e("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[t._v("Third-party hosts")]),t._v(" provide hosted solutions, in most cases free of charge, in case you don't want to self-host a server.")],1),t._v(" "),e("p",[t._v("While most of them can be used in-production, you can also use them to try things out. They're similar to our demo server, but provide better uptime and reliability.")]),t._v(" "),e("p",[t._v("For full lists of third-party hosts to pick from, "),e("a",{attrs:{href:"https://directory.btcpayserver.org/filter/hosts",target:"_blank",rel:"noopener noreferrer"}},[t._v("see our hosts directory"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"start-testing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#start-testing"}},[t._v("#")]),t._v(" Start testing")]),t._v(" "),e("p",[t._v("Once you pick up a server to use, the steps are the same, regardless of which option you've opted for.")]),t._v(" "),e("p",[t._v("Click on the following links for detailed instructions on how to:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/RegisterAccount/"}},[t._v("Register an account")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/CreateStore/"}},[t._v("Create a store")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/WalletSetup/"}},[t._v("Create a wallet")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/WhatsNext/"}},[t._v("Start exploring")])],1)]),t._v(" "),e("h3",{attrs:{id:"btcpay-server-in-action"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-in-action"}},[t._v("#")]),t._v(" BTCPay Server in action")]),t._v(" "),e("p",[t._v("Below, you will find options to see the BTCPay server in action. Through our own POS on our demo or through the eyes of actual merchants in the wild!")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://mainnet.demo.btcpayserver.org/apps/87kj5yKay8mB4UUZcJhZH5TqDKMD3CznjwLjiu1oYZXe/pos",target:"_blank",rel:"noopener noreferrer"}},[t._v("Point of Sale Demo"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://directory.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("In-production stores"),e("OutboundLink")],1)])]),t._v(" "),e("h2",{attrs:{id:"questions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#questions"}},[t._v("#")]),t._v(" Questions")]),t._v(" "),e("p",[t._v("If you have questions about BTCPay Server, check our documentation, "),e("RouterLink",{attrs:{to:"/FAQ/"}},[t._v("Frequently asked questions page")]),t._v(".")],1),t._v(" "),e("p",[t._v("Join the "),e("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("community chat"),e("OutboundLink")],1),t._v(" on Mattermost by downloading "),e("a",{attrs:{href:"https://mattermost.com/download/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mattermost app"),e("OutboundLink")],1),t._v(", or on "),e("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("Telegram"),e("OutboundLink")],1),t._v(" in case you need further help or help or want to hang around with like-minded people.")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[169],{891:function(t,e,r){"use strict";r.r(e);var o=r(17),a=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"try-out-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#try-out-btcpay-server"}},[t._v("#")]),t._v(" Try out BTCPay server")]),t._v(" "),e("p",[t._v("Before you start using BTCPay Server in production, you can try it and see if it fits your needs.")]),t._v(" "),e("p",[t._v("On this page you will see various ways to test out the software on mainnet and testnet.")]),t._v(" "),e("h2",{attrs:{id:"our-mainnet-demo-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#our-mainnet-demo-server"}},[t._v("#")]),t._v(" Our mainnet demo server")]),t._v(" "),e("p",[t._v("We host our server on "),e("a",{attrs:{href:"https://mainnet.demo.btcpayserver.org/login",target:"_blank",rel:"noopener noreferrer"}},[t._v("mainnet.demo.btcpayserver.org"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("Feel free to register to it, create a store and a wallet and play around.")]),t._v(" "),e("p",[t._v("This instance should only be used for testing things out. We do not guarantee uptime.")]),t._v(" "),e("h2",{attrs:{id:"our-testnet-demo-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#our-testnet-demo-server"}},[t._v("#")]),t._v(" Our Testnet demo server")]),t._v(" "),e("p",[t._v("If you're familiar with testnet and want to test BTCPay through it, check "),e("a",{attrs:{href:"https://testnet.demo.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("testnet.demo.btcpayserver.org"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("For more information see "),e("RouterLink",{attrs:{to:"/Development/TestnetDemo/"}},[t._v("testnet documentation")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"third-party-hosts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#third-party-hosts"}},[t._v("#")]),t._v(" Third-party hosts")]),t._v(" "),e("p",[e("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[t._v("Third-party hosts")]),t._v(" provide hosted solutions, in most cases free of charge, in case you don't want to self-host a server.")],1),t._v(" "),e("p",[t._v("While most of them can be used in-production, you can also use them to try things out. They're similar to our demo server, but provide better uptime and reliability.")]),t._v(" "),e("p",[t._v("For full lists of third-party hosts to pick from, "),e("a",{attrs:{href:"https://directory.btcpayserver.org/filter/hosts",target:"_blank",rel:"noopener noreferrer"}},[t._v("see our hosts directory"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"start-testing"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#start-testing"}},[t._v("#")]),t._v(" Start testing")]),t._v(" "),e("p",[t._v("Once you pick up a server to use, the steps are the same, regardless of which option you've opted for.")]),t._v(" "),e("p",[t._v("Click on the following links for detailed instructions on how to:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/RegisterAccount/"}},[t._v("Register an account")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/CreateStore/"}},[t._v("Create a store")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/WalletSetup/"}},[t._v("Create a wallet")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/WhatsNext/"}},[t._v("Start exploring")])],1)]),t._v(" "),e("h3",{attrs:{id:"btcpay-server-in-action"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-in-action"}},[t._v("#")]),t._v(" BTCPay Server in action")]),t._v(" "),e("p",[t._v("Below, you will find options to see the BTCPay server in action. Through our own POS on our demo or through the eyes of actual merchants in the wild!")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://mainnet.demo.btcpayserver.org/apps/87kj5yKay8mB4UUZcJhZH5TqDKMD3CznjwLjiu1oYZXe/pos",target:"_blank",rel:"noopener noreferrer"}},[t._v("Point of Sale Demo"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://directory.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("In-production stores"),e("OutboundLink")],1)])]),t._v(" "),e("h2",{attrs:{id:"questions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#questions"}},[t._v("#")]),t._v(" Questions")]),t._v(" "),e("p",[t._v("If you have questions about BTCPay Server, check our documentation, "),e("RouterLink",{attrs:{to:"/FAQ/"}},[t._v("Frequently asked questions page")]),t._v(".")],1),t._v(" "),e("p",[t._v("Join the "),e("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("community chat"),e("OutboundLink")],1),t._v(" on Mattermost by downloading "),e("a",{attrs:{href:"https://mattermost.com/download/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mattermost app"),e("OutboundLink")],1),t._v(", or on "),e("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("Telegram"),e("OutboundLink")],1),t._v(" in case you need further help or help or want to hang around with like-minded people.")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/17.aa77e5f2.js b/assets/js/17.5b836fdd.js similarity index 82% rename from assets/js/17.aa77e5f2.js rename to assets/js/17.5b836fdd.js index 40d1373ba4..63b3af2100 100644 --- a/assets/js/17.aa77e5f2.js +++ b/assets/js/17.5b836fdd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{692:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWallet.cf4e2496.png"},693:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletWalletName.30589d48.png"},694:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletRecoveryWords.f6439a9a.png"},695:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletConfirmRecoveryWords.57de256b.png"},696:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletAddPassword.8d118edd.png"},697:function(e,t,a){e.exports=a.p+"assets/img/WasabiCoinjoinStrategy.ff19005a.png"},698:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletSuccess.6d0a141d.png"},699:function(e,t,a){e.exports=a.p+"assets/img/WasabiOpenWallet.89e9b6c6.png"},700:function(e,t,a){e.exports=a.p+"assets/img/WasabiFindWalletInfo.31e473b0.png"},701:function(e,t,a){e.exports=a.p+"assets/img/WasabiExtendedAccountPublicKey.ba483e11.png"},702:function(e,t,a){e.exports=a.p+"assets/img/storedashboard-create.dd17384e.jpg"},703:function(e,t,a){e.exports=a.p+"assets/img/storedashboard-connect.2cb6ddd6.jpg"},704:function(e,t,a){e.exports=a.p+"assets/img/select-xpub.934e885a.jpg"},705:function(e,t,a){e.exports=a.p+"assets/img/xpub-form.bcf062f7.jpg"},706:function(e,t,a){e.exports=a.p+"assets/img/WasabiReceive.8cba4d4a.png"},707:function(e,t,a){e.exports=a.p+"assets/img/compare-address.4fd6e815.jpg"},708:function(e,t,a){e.exports=a.p+"assets/img/wallet-connected.41bdc209.jpg"},903:function(e,t,a){"use strict";a.r(t);var s=a(17),o=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"connecting-wasabi-wallet-to-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting-wasabi-wallet-to-btcpay-server"}},[e._v("#")]),e._v(" Connecting Wasabi Wallet to BTCPay Server")]),e._v(" "),t("p",[e._v("This document shows how to "),t("strong",[e._v("connect "),t("a",{attrs:{href:"https://wasabiwallet.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Wallet"),t("OutboundLink")],1),e._v(" to BTCPay Server")]),e._v(".")]),e._v(" "),t("ol",[t("li",[e._v("Create a Store in BTCPay Server")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://wasabiwallet.io/#download",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download Wasabi Wallet"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://docs.wasabiwallet.io/using-wasabi/InstallPackage.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Install Wasabi Wallet"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"wasabi-wallet-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wasabi-wallet-setup"}},[e._v("#")]),e._v(" Wasabi Wallet Setup")]),e._v(" "),t("p",[e._v("After installation, open the Wasabi Wallet by clicking on the icon on your desktop.")]),e._v(" "),t("h2",{attrs:{id:"quick-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-setup"}},[e._v("#")]),e._v(" Quick Setup")]),e._v(" "),t("ol",[t("li",[e._v("Create a new wallet in Wasabi")]),e._v(" "),t("li",[e._v("In Wasabi, copy the "),t("strong",[e._v("Extended Account Public Key")]),e._v(" at "),t("code",[e._v("Wallet Info")]),e._v(".")]),e._v(" "),t("li",[e._v("In BTCPay Server, Store > Settings > Wallet > Setup > Connect an existing wallet > Enter extended public key")]),e._v(" "),t("li",[e._v("In Wasabi, generate a new address at "),t("code",[e._v("Receive")]),e._v(".")]),e._v(" "),t("li",[e._v("Confirm that the addresses in Wasabi and BTCPay Server match.")])]),e._v(" "),t("h2",{attrs:{id:"step-by-step"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step"}},[e._v("#")]),e._v(" Step by Step")]),e._v(" "),t("p",[e._v("At the first launch of Wasabi, the "),t("code",[e._v("Add wallet")]),e._v(" dialog will be opened automatically.\nSelect "),t("code",[e._v("Create new wallet")]),e._v(" to generate a new wallet.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(692),alt:"Wasabi Add Wallet",title:"Wasabi Add Wallet"}})]),e._v(" "),t("p",[e._v("Give your wallet a name, for example "),t("code",[e._v("BTCPay Server Wallet")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(693),alt:"Wasabi Add Wallet Name",title:"Wasabi Add Wallet Name"}})]),e._v(" "),t("p",[e._v("Write down the Recovery Words in the correct order.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(694),alt:"Wasabi Add Wallet Recovery Words",title:"Wasabi Add Wallet Recovery Words"}})]),e._v(" "),t("p",[e._v("Confirm 3 of the 12 recovery words.\nThis is a quick test to make sure that you have written them down.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(695),alt:"Wasabi Add Wallet Confirm Recovery Words",title:"Wasabi Add Wallet Confirm Recovery Words"}})]),e._v(" "),t("p",[e._v("Add a password.\nThe password is used as a passphrase and it cannot be changed later on.")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("Both The Recovery words AND the password are needed to recover this wallet")]),e._v(" "),t("p",[e._v("Make sure to have a backup of the recovery words and the password.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(696),alt:"Wasabi Add Wallet Add Password",title:"Wasabi Add Wallet Add Password"}})]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT NOTE:")]),e._v(" Write down your recovery words in the order you see them on the screen. Write them down a piece of paper and store them somewhere secure. Take your time and triple-check each word. Do not store your seed in a digital format (photograph, text document). Whoever has access to your seed and your password can access your funds. Make sure you have a proper backup of the Recovery Words and the Password.")]),e._v(" "),t("p",[e._v("Select a Coinjoin Strategy.\nWasabi automatically coinjoins all your funds.\nIf you don't want to coinjoin your funds, you can disable coinjoin later by disabling "),t("code",[e._v("Automatically start coinjoin")]),e._v(" in the Coinjoin Settings.\nFor more info about coinjoins and the related settings, please refer to the "),t("a",{attrs:{href:"https://docs.wasabiwallet.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Documentation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(697),alt:"Wasabi Coinjoin Strategy",title:"Wasabi Coinjoin Strategy"}})]),e._v(" "),t("p",[e._v("The wallet has been successfully created!")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(698),alt:"Wasabi Add Wallet Success",title:"Wasabi Add Wallet Success"}})]),e._v(" "),t("p",[e._v("Open the new wallet by entering the password.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(699),alt:"Wasabi Open Wallet",title:"Wasabi Open Wallet"}})]),e._v(" "),t("p",[e._v("The wallet will load (it might take some time).\nAfter the loading is done and the wallet is opened, click on the 3 dots at the top right corner to go to "),t("code",[e._v("Wallet Info")]),e._v(" .")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(700),alt:"Wasabi Find Wallet Info",title:"Wasabi Find Wallet Info"}})]),e._v(" "),t("p",[e._v("Select and "),t("strong",[e._v("copy")]),e._v(" the "),t("code",[e._v("Extended Account Public Key")]),e._v(". This is the "),t("strong",[e._v("public")]),e._v(" key from which BTCPay will derive addresses. This cannot be used to derive private keys and spend the bitcoin.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(701),alt:"Wasabi Extended Account Public Key",title:"Wasabi Extended Account Public Key"}})]),e._v(" "),t("h2",{attrs:{id:"setup-store-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-store-wallet"}},[e._v("#")]),e._v(" Setup store wallet")]),e._v(" "),t("ol",[t("li",[e._v("Assuming you created a store and are now in the Dashboard. Click on "),t("code",[e._v("Set up a wallet")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(702),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[e._v("As you did the above steps in wasabi, Click "),t("code",[e._v("Connect an existing wallet")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(703),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"3"}},[t("li",[e._v("Choose "),t("code",[e._v("Enter extended public key")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(704),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Paste the "),t("code",[e._v("Extended Account Public Key")]),e._v(" into derivation scheme field as it is, without adding anything else and click "),t("code",[e._v("Continue")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(705),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[e._v("Return to the Wasabi Wallet. Click the "),t("code",[e._v("Receive")]),e._v(" button and generate a new address.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(706),alt:"Wasabi Receive",title:"Wasabi Receive"}})]),e._v(" "),t("ol",{attrs:{start:"6"}},[t("li",[e._v("Compare the address you see in Wasabi Wallet to addresses shown in BTCPay Server. Find a match, "),t("code",[e._v("continue")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(707),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"7"}},[t("li",[e._v("When you found a match, your wallet is now connected to the store.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(708),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("h3",{attrs:{id:"connecting-wasabi-to-btcpay-server-full-node-if-youre-self-hosting-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting-wasabi-to-btcpay-server-full-node-if-youre-self-hosting-btcpay"}},[e._v("#")]),e._v(" Connecting Wasabi to BTCPay Server Full Node (If you're self-hosting BTCPay)")]),e._v(" "),t("p",[e._v("After the wallets are connected, it is highly recommended to "),t("strong",[e._v("connect Wasabi Wallet to your full node in BTCPay")]),e._v(". The process is easy but can only be done if you self-host BTCPay and are logged in as "),t("code",[e._v("Admin")]),e._v(". Tor has to be enabled in BTCPay (it is enabled by default). This process enhances privacy even further.")]),e._v(" "),t("p",[e._v("In BTCPay, go Server Settings > Services > "),t("strong",[e._v("Full node P2P > See Information")]),e._v(".\nOn the BTCP-P2P page, click on the "),t("code",[e._v("Show Confidential QR Code")]),e._v(". Bellow the QR Code, there's a link "),t("code",[e._v("See QR Code information by clicking here")]),e._v(", so click on the link to reveal your string. Copy the string but remove "),t("code",[e._v("bitcoin-p2p://")]),e._v(" part.")]),e._v(" "),t("p",[e._v("In Wasabi, go to the Bitcoin tab at "),t("code",[e._v("Settings")]),e._v(" and paste the endpoint in "),t("code",[e._v("Bitcoin P2P Endpoint")]),e._v(".")]),e._v(" "),t("p",[e._v("Restart Wasabi to apply the changes.")]),e._v(" "),t("h3",{attrs:{id:"configuring-the-gap-limit-in-wasabi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-gap-limit-in-wasabi"}},[e._v("#")]),e._v(" Configuring the Gap Limit in Wasabi")]),e._v(" "),t("p",[e._v("At the search bar on top, click on "),t("code",[e._v("Wallet Folder")]),e._v(". Shortly the "),t("code",[e._v("json")]),e._v(" file will be shown in a sub-folder. Open that file with a text editor like notepad.\nFind the line "),t("code",[e._v('"MinGapLimit": 21,')]),e._v(" and change it to "),t("code",[e._v('"MinGapLimit": 100,')]),e._v(" and save the file.")]),e._v(" "),t("p",[e._v("There's no good answer to how much you should set the gap limit to. Most merchants set 100-200. If you're a big merchant with high transaction volume, you can try with even a higher gap limit.")]),e._v(" "),t("p",[e._v("For more details about the "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("Gap Limit, check the FAQ")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("Wasabi Wallet and BTCPay Server are now connected")]),e._v(". Any payments received to your BTCPay will be visible in Wasabi, where you can further spend or mix them.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[17],{673:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWallet.cf4e2496.png"},674:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletWalletName.30589d48.png"},675:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletRecoveryWords.f6439a9a.png"},676:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletConfirmRecoveryWords.57de256b.png"},677:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletAddPassword.8d118edd.png"},678:function(e,t,a){e.exports=a.p+"assets/img/WasabiCoinjoinStrategy.ff19005a.png"},679:function(e,t,a){e.exports=a.p+"assets/img/WasabiAddWalletSuccess.6d0a141d.png"},680:function(e,t,a){e.exports=a.p+"assets/img/WasabiOpenWallet.89e9b6c6.png"},681:function(e,t,a){e.exports=a.p+"assets/img/WasabiFindWalletInfo.31e473b0.png"},682:function(e,t,a){e.exports=a.p+"assets/img/WasabiExtendedAccountPublicKey.ba483e11.png"},683:function(e,t,a){e.exports=a.p+"assets/img/storedashboard-create.dd17384e.jpg"},684:function(e,t,a){e.exports=a.p+"assets/img/storedashboard-connect.2cb6ddd6.jpg"},685:function(e,t,a){e.exports=a.p+"assets/img/select-xpub.934e885a.jpg"},686:function(e,t,a){e.exports=a.p+"assets/img/xpub-form.bcf062f7.jpg"},687:function(e,t,a){e.exports=a.p+"assets/img/WasabiReceive.8cba4d4a.png"},688:function(e,t,a){e.exports=a.p+"assets/img/compare-address.4fd6e815.jpg"},689:function(e,t,a){e.exports=a.p+"assets/img/wallet-connected.41bdc209.jpg"},901:function(e,t,a){"use strict";a.r(t);var s=a(17),o=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"connecting-wasabi-wallet-to-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting-wasabi-wallet-to-btcpay-server"}},[e._v("#")]),e._v(" Connecting Wasabi Wallet to BTCPay Server")]),e._v(" "),t("p",[e._v("This document shows how to "),t("strong",[e._v("connect "),t("a",{attrs:{href:"https://wasabiwallet.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Wallet"),t("OutboundLink")],1),e._v(" to BTCPay Server")]),e._v(".")]),e._v(" "),t("ol",[t("li",[e._v("Create a Store in BTCPay Server")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://wasabiwallet.io/#download",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download Wasabi Wallet"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://docs.wasabiwallet.io/using-wasabi/InstallPackage.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Install Wasabi Wallet"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"wasabi-wallet-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wasabi-wallet-setup"}},[e._v("#")]),e._v(" Wasabi Wallet Setup")]),e._v(" "),t("p",[e._v("After installation, open the Wasabi Wallet by clicking on the icon on your desktop.")]),e._v(" "),t("h2",{attrs:{id:"quick-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-setup"}},[e._v("#")]),e._v(" Quick Setup")]),e._v(" "),t("ol",[t("li",[e._v("Create a new wallet in Wasabi")]),e._v(" "),t("li",[e._v("In Wasabi, copy the "),t("strong",[e._v("Extended Account Public Key")]),e._v(" at "),t("code",[e._v("Wallet Info")]),e._v(".")]),e._v(" "),t("li",[e._v("In BTCPay Server, Store > Settings > Wallet > Setup > Connect an existing wallet > Enter extended public key")]),e._v(" "),t("li",[e._v("In Wasabi, generate a new address at "),t("code",[e._v("Receive")]),e._v(".")]),e._v(" "),t("li",[e._v("Confirm that the addresses in Wasabi and BTCPay Server match.")])]),e._v(" "),t("h2",{attrs:{id:"step-by-step"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step"}},[e._v("#")]),e._v(" Step by Step")]),e._v(" "),t("p",[e._v("At the first launch of Wasabi, the "),t("code",[e._v("Add wallet")]),e._v(" dialog will be opened automatically.\nSelect "),t("code",[e._v("Create new wallet")]),e._v(" to generate a new wallet.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(673),alt:"Wasabi Add Wallet",title:"Wasabi Add Wallet"}})]),e._v(" "),t("p",[e._v("Give your wallet a name, for example "),t("code",[e._v("BTCPay Server Wallet")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(674),alt:"Wasabi Add Wallet Name",title:"Wasabi Add Wallet Name"}})]),e._v(" "),t("p",[e._v("Write down the Recovery Words in the correct order.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(675),alt:"Wasabi Add Wallet Recovery Words",title:"Wasabi Add Wallet Recovery Words"}})]),e._v(" "),t("p",[e._v("Confirm 3 of the 12 recovery words.\nThis is a quick test to make sure that you have written them down.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(676),alt:"Wasabi Add Wallet Confirm Recovery Words",title:"Wasabi Add Wallet Confirm Recovery Words"}})]),e._v(" "),t("p",[e._v("Add a password.\nThe password is used as a passphrase and it cannot be changed later on.")]),e._v(" "),t("div",{staticClass:"custom-block danger"},[t("p",{staticClass:"custom-block-title"},[e._v("Both The Recovery words AND the password are needed to recover this wallet")]),e._v(" "),t("p",[e._v("Make sure to have a backup of the recovery words and the password.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(677),alt:"Wasabi Add Wallet Add Password",title:"Wasabi Add Wallet Add Password"}})]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT NOTE:")]),e._v(" Write down your recovery words in the order you see them on the screen. Write them down a piece of paper and store them somewhere secure. Take your time and triple-check each word. Do not store your seed in a digital format (photograph, text document). Whoever has access to your seed and your password can access your funds. Make sure you have a proper backup of the Recovery Words and the Password.")]),e._v(" "),t("p",[e._v("Select a Coinjoin Strategy.\nWasabi automatically coinjoins all your funds.\nIf you don't want to coinjoin your funds, you can disable coinjoin later by disabling "),t("code",[e._v("Automatically start coinjoin")]),e._v(" in the Coinjoin Settings.\nFor more info about coinjoins and the related settings, please refer to the "),t("a",{attrs:{href:"https://docs.wasabiwallet.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Documentation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(678),alt:"Wasabi Coinjoin Strategy",title:"Wasabi Coinjoin Strategy"}})]),e._v(" "),t("p",[e._v("The wallet has been successfully created!")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(679),alt:"Wasabi Add Wallet Success",title:"Wasabi Add Wallet Success"}})]),e._v(" "),t("p",[e._v("Open the new wallet by entering the password.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(680),alt:"Wasabi Open Wallet",title:"Wasabi Open Wallet"}})]),e._v(" "),t("p",[e._v("The wallet will load (it might take some time).\nAfter the loading is done and the wallet is opened, click on the 3 dots at the top right corner to go to "),t("code",[e._v("Wallet Info")]),e._v(" .")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(681),alt:"Wasabi Find Wallet Info",title:"Wasabi Find Wallet Info"}})]),e._v(" "),t("p",[e._v("Select and "),t("strong",[e._v("copy")]),e._v(" the "),t("code",[e._v("Extended Account Public Key")]),e._v(". This is the "),t("strong",[e._v("public")]),e._v(" key from which BTCPay will derive addresses. This cannot be used to derive private keys and spend the bitcoin.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(682),alt:"Wasabi Extended Account Public Key",title:"Wasabi Extended Account Public Key"}})]),e._v(" "),t("h2",{attrs:{id:"setup-store-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-store-wallet"}},[e._v("#")]),e._v(" Setup store wallet")]),e._v(" "),t("ol",[t("li",[e._v("Assuming you created a store and are now in the Dashboard. Click on "),t("code",[e._v("Set up a wallet")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(683),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[e._v("As you did the above steps in wasabi, Click "),t("code",[e._v("Connect an existing wallet")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(684),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"3"}},[t("li",[e._v("Choose "),t("code",[e._v("Enter extended public key")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(685),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Paste the "),t("code",[e._v("Extended Account Public Key")]),e._v(" into derivation scheme field as it is, without adding anything else and click "),t("code",[e._v("Continue")])])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(686),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[e._v("Return to the Wasabi Wallet. Click the "),t("code",[e._v("Receive")]),e._v(" button and generate a new address.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(687),alt:"Wasabi Receive",title:"Wasabi Receive"}})]),e._v(" "),t("ol",{attrs:{start:"6"}},[t("li",[e._v("Compare the address you see in Wasabi Wallet to addresses shown in BTCPay Server. Find a match, "),t("code",[e._v("continue")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(688),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("ol",{attrs:{start:"7"}},[t("li",[e._v("When you found a match, your wallet is now connected to the store.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(689),alt:"Connect Wasabi Wallet to BTCPay Server",title:"Connect Wasabi Wallet to BTCPay Server"}})]),e._v(" "),t("h3",{attrs:{id:"connecting-wasabi-to-btcpay-server-full-node-if-youre-self-hosting-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting-wasabi-to-btcpay-server-full-node-if-youre-self-hosting-btcpay"}},[e._v("#")]),e._v(" Connecting Wasabi to BTCPay Server Full Node (If you're self-hosting BTCPay)")]),e._v(" "),t("p",[e._v("After the wallets are connected, it is highly recommended to "),t("strong",[e._v("connect Wasabi Wallet to your full node in BTCPay")]),e._v(". The process is easy but can only be done if you self-host BTCPay and are logged in as "),t("code",[e._v("Admin")]),e._v(". Tor has to be enabled in BTCPay (it is enabled by default). This process enhances privacy even further.")]),e._v(" "),t("p",[e._v("In BTCPay, go Server Settings > Services > "),t("strong",[e._v("Full node P2P > See Information")]),e._v(".\nOn the BTCP-P2P page, click on the "),t("code",[e._v("Show Confidential QR Code")]),e._v(". Bellow the QR Code, there's a link "),t("code",[e._v("See QR Code information by clicking here")]),e._v(", so click on the link to reveal your string. Copy the string but remove "),t("code",[e._v("bitcoin-p2p://")]),e._v(" part.")]),e._v(" "),t("p",[e._v("In Wasabi, go to the Bitcoin tab at "),t("code",[e._v("Settings")]),e._v(" and paste the endpoint in "),t("code",[e._v("Bitcoin P2P Endpoint")]),e._v(".")]),e._v(" "),t("p",[e._v("Restart Wasabi to apply the changes.")]),e._v(" "),t("h3",{attrs:{id:"configuring-the-gap-limit-in-wasabi"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-gap-limit-in-wasabi"}},[e._v("#")]),e._v(" Configuring the Gap Limit in Wasabi")]),e._v(" "),t("p",[e._v("At the search bar on top, click on "),t("code",[e._v("Wallet Folder")]),e._v(". Shortly the "),t("code",[e._v("json")]),e._v(" file will be shown in a sub-folder. Open that file with a text editor like notepad.\nFind the line "),t("code",[e._v('"MinGapLimit": 21,')]),e._v(" and change it to "),t("code",[e._v('"MinGapLimit": 100,')]),e._v(" and save the file.")]),e._v(" "),t("p",[e._v("There's no good answer to how much you should set the gap limit to. Most merchants set 100-200. If you're a big merchant with high transaction volume, you can try with even a higher gap limit.")]),e._v(" "),t("p",[e._v("For more details about the "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("Gap Limit, check the FAQ")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("Wasabi Wallet and BTCPay Server are now connected")]),e._v(". Any payments received to your BTCPay will be visible in Wasabi, where you can further spend or mix them.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/170.14da59b4.js b/assets/js/170.f8636740.js similarity index 99% rename from assets/js/170.14da59b4.js rename to assets/js/170.f8636740.js index 16d4576d90..c713887b7f 100644 --- a/assets/js/170.14da59b4.js +++ b/assets/js/170.f8636740.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[170],{896:function(e,a,t){"use strict";t.r(a);var s=t(17),r=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"how-to-verify-release-signatures"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-verify-release-signatures"}},[e._v("#")]),e._v(" How to verify release signatures")]),e._v(" "),a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),a("p",[e._v("Downloading binaries from the internet might be dangerous. When you download a release of BTCPayServer Vault on our "),a("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub releases page"),a("OutboundLink")],1),e._v(", you only ensure that the uploader had access to our GitHub repository.")]),e._v(" "),a("p",[e._v("This might be fine, but sometimes you download the same binaries from a different source, or you want additional assurance that those binaries are signed by the developers of the project. (In this case, Nicolas Dorier)")]),e._v(" "),a("p",[e._v("If you do not care about who signed the executable and verifying the integrity of the files you downloaded, you don't have to read this document.")]),e._v(" "),a("h2",{attrs:{id:"checking-pgp-signatures"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#checking-pgp-signatures"}},[e._v("#")]),e._v(" Checking PGP signatures"),a("a",{attrs:{name:"pgp"}})]),e._v(" "),a("p",[e._v("For this you need the "),a("code",[e._v("gpg")]),e._v(" tool, make sure it is installed on your machine.")]),e._v(" "),a("p",[e._v("On the "),a("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[e._v("release page"),a("OutboundLink")],1),e._v(", download:")]),e._v(" "),a("ol",[a("li",[e._v("The release binary of your choice.")]),e._v(" "),a("li",[e._v("The "),a("code",[e._v("SHA256SUMS.asc")]),e._v(" file")])]),e._v(" "),a("h3",{attrs:{id:"importing-nicolas-dorier-pgp-keys-only-first-time"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#importing-nicolas-dorier-pgp-keys-only-first-time"}},[e._v("#")]),e._v(" Importing Nicolas Dorier pgp keys (only first time)")]),e._v(" "),a("p",[e._v("This step should be done only one time. It ensures your system knows Nicolas Dorier's PGP keys.")]),e._v(" "),a("p",[e._v("Nicolas Dorier has a "),a("a",{attrs:{href:"https://keybase.io/NicolasDorier",target:"_blank",rel:"noopener noreferrer"}},[e._v("keybase"),a("OutboundLink")],1),e._v(" account that allow you to verify that his identity is linked to several well-known social media accounts.\nAnd as you can see on his profile page, the PGP key "),a("code",[e._v("62FE 8564 7DED DA2E")]),e._v(" is linked to his keybase identity.")]),e._v(" "),a("p",[e._v("You can import this key from keybase:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" https://keybase.io/nicolasdorier/pgp_keys.asc "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--import")]),e._v("\n")])])]),a("p",[e._v("or")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("keybase pgp pull nicolasdorier\n")])])]),a("p",[e._v("Alternatively, you can just download the file via the browser and run:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--import")]),e._v(" pgp_keys.asc\n")])])]),a("p",[e._v("This step won't have to be repeated the next time you need to check a signature.")]),e._v(" "),a("h3",{attrs:{id:"checking-the-actual-pgp-signature"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#checking-the-actual-pgp-signature"}},[e._v("#")]),e._v(" Checking the actual PGP signature")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("sha256sum "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--check")]),e._v(" SHA256SUMS.asc --ignore-missing\n")])])]),a("p",[e._v("You should see that the file you downloaded has the right hash:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("BTCPayServerVault-1.0.7-setup.exe: OK\n")])])]),a("p",[e._v("If you are on Windows you can check the hashes are identical manually:")]),e._v(" "),a("div",{staticClass:"language-powershell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-powershell"}},[a("code",[e._v("certUtil "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("hashfile BTCPayServerVault-1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("0"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("7-setup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("exe SHA256\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("type")]),e._v(" SHA256SUMS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("asc\n")])])]),a("p",[e._v("If you are on macOS:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("shasum "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-a")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("256")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--check")]),e._v(" SHA256SUMS.asc\n")])])]),a("p",[e._v("You should see that the file you downloaded has the right hash:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("BTCPayServerVault-osx-x64-1.0.7.dmg: OK\n")])])]),a("p",[e._v("Then check the actual signature:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--verify")]),e._v(" SHA256SUMS.asc\n")])])]),a("p",[e._v("Which should output something like:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v('gpg: Signature made Thu Dec 5 20:40:47 2019 JST\ngpg: using RSA key 62FE85647DEDDA2E\ngpg: Good signature from "BTCPayServer Vault <nicolas.dorier@gmail.com>" [unknown]\ngpg: WARNING: This key is not certified with a trusted signature!\ngpg: There is no indication that the signature belongs to the owner.\nPrimary key fingerprint: 7121 BDE3 555D 9BE0 6BDD C681 62FE 8564 7DED DA2E\n')])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[170],{894:function(e,a,t){"use strict";t.r(a);var s=t(17),r=Object(s.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"how-to-verify-release-signatures"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#how-to-verify-release-signatures"}},[e._v("#")]),e._v(" How to verify release signatures")]),e._v(" "),a("h2",{attrs:{id:"introduction"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#introduction"}},[e._v("#")]),e._v(" Introduction")]),e._v(" "),a("p",[e._v("Downloading binaries from the internet might be dangerous. When you download a release of BTCPayServer Vault on our "),a("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub releases page"),a("OutboundLink")],1),e._v(", you only ensure that the uploader had access to our GitHub repository.")]),e._v(" "),a("p",[e._v("This might be fine, but sometimes you download the same binaries from a different source, or you want additional assurance that those binaries are signed by the developers of the project. (In this case, Nicolas Dorier)")]),e._v(" "),a("p",[e._v("If you do not care about who signed the executable and verifying the integrity of the files you downloaded, you don't have to read this document.")]),e._v(" "),a("h2",{attrs:{id:"checking-pgp-signatures"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#checking-pgp-signatures"}},[e._v("#")]),e._v(" Checking PGP signatures"),a("a",{attrs:{name:"pgp"}})]),e._v(" "),a("p",[e._v("For this you need the "),a("code",[e._v("gpg")]),e._v(" tool, make sure it is installed on your machine.")]),e._v(" "),a("p",[e._v("On the "),a("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[e._v("release page"),a("OutboundLink")],1),e._v(", download:")]),e._v(" "),a("ol",[a("li",[e._v("The release binary of your choice.")]),e._v(" "),a("li",[e._v("The "),a("code",[e._v("SHA256SUMS.asc")]),e._v(" file")])]),e._v(" "),a("h3",{attrs:{id:"importing-nicolas-dorier-pgp-keys-only-first-time"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#importing-nicolas-dorier-pgp-keys-only-first-time"}},[e._v("#")]),e._v(" Importing Nicolas Dorier pgp keys (only first time)")]),e._v(" "),a("p",[e._v("This step should be done only one time. It ensures your system knows Nicolas Dorier's PGP keys.")]),e._v(" "),a("p",[e._v("Nicolas Dorier has a "),a("a",{attrs:{href:"https://keybase.io/NicolasDorier",target:"_blank",rel:"noopener noreferrer"}},[e._v("keybase"),a("OutboundLink")],1),e._v(" account that allow you to verify that his identity is linked to several well-known social media accounts.\nAnd as you can see on his profile page, the PGP key "),a("code",[e._v("62FE 8564 7DED DA2E")]),e._v(" is linked to his keybase identity.")]),e._v(" "),a("p",[e._v("You can import this key from keybase:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" https://keybase.io/nicolasdorier/pgp_keys.asc "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--import")]),e._v("\n")])])]),a("p",[e._v("or")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("keybase pgp pull nicolasdorier\n")])])]),a("p",[e._v("Alternatively, you can just download the file via the browser and run:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--import")]),e._v(" pgp_keys.asc\n")])])]),a("p",[e._v("This step won't have to be repeated the next time you need to check a signature.")]),e._v(" "),a("h3",{attrs:{id:"checking-the-actual-pgp-signature"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#checking-the-actual-pgp-signature"}},[e._v("#")]),e._v(" Checking the actual PGP signature")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("sha256sum "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--check")]),e._v(" SHA256SUMS.asc --ignore-missing\n")])])]),a("p",[e._v("You should see that the file you downloaded has the right hash:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("BTCPayServerVault-1.0.7-setup.exe: OK\n")])])]),a("p",[e._v("If you are on Windows you can check the hashes are identical manually:")]),e._v(" "),a("div",{staticClass:"language-powershell extra-class"},[a("pre",{pre:!0,attrs:{class:"language-powershell"}},[a("code",[e._v("certUtil "),a("span",{pre:!0,attrs:{class:"token operator"}},[e._v("-")]),e._v("hashfile BTCPayServerVault-1"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("0"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("7-setup"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("exe SHA256\n"),a("span",{pre:!0,attrs:{class:"token function"}},[e._v("type")]),e._v(" SHA256SUMS"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("asc\n")])])]),a("p",[e._v("If you are on macOS:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("shasum "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-a")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token number"}},[e._v("256")]),e._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--check")]),e._v(" SHA256SUMS.asc\n")])])]),a("p",[e._v("You should see that the file you downloaded has the right hash:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v("BTCPayServerVault-osx-x64-1.0.7.dmg: OK\n")])])]),a("p",[e._v("Then check the actual signature:")]),e._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[e._v("gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--verify")]),e._v(" SHA256SUMS.asc\n")])])]),a("p",[e._v("Which should output something like:")]),e._v(" "),a("div",{staticClass:"language-text extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[e._v('gpg: Signature made Thu Dec 5 20:40:47 2019 JST\ngpg: using RSA key 62FE85647DEDDA2E\ngpg: Good signature from "BTCPayServer Vault <nicolas.dorier@gmail.com>" [unknown]\ngpg: WARNING: This key is not certified with a trusted signature!\ngpg: There is no indication that the signature belongs to the owner.\nPrimary key fingerprint: 7121 BDE3 555D 9BE0 6BDD C681 62FE 8564 7DED DA2E\n')])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/171.712fd1e0.js b/assets/js/171.e808340f.js similarity index 95% rename from assets/js/171.712fd1e0.js rename to assets/js/171.e808340f.js index 2aa625f66e..164b13cd00 100644 --- a/assets/js/171.712fd1e0.js +++ b/assets/js/171.e808340f.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[171],{902:function(t,e,a){"use strict";a.r(e);var r=a(17),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"3-wallet-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#3-wallet-setup"}},[t._v("#")]),t._v(" (3) Wallet Setup")]),t._v(" "),e("p",[t._v("After "),e("RouterLink",{attrs:{to:"/RegisterAccount/"}},[t._v("account registration")]),t._v(" and "),e("RouterLink",{attrs:{to:"/CreateStore/"}},[t._v("store creation")]),t._v(", it's time to configure a wallet in your BTCPay Server, so that you can start receiving payments into it.")],1),t._v(" "),e("p",[t._v("There are two ways to set up a wallet in BTCPay Server:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/ConnectWallet/"}},[t._v("Connect an existing wallet")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/CreateWallet/"}},[t._v("Create a new wallet")])],1)]),t._v(" "),e("p",[t._v("There are many options on how set up a wallet with your BTCPay Server. It's up to you to decide what works best for your use-case. Once you configure a wallet, you're all set. The next step, is to "),e("RouterLink",{attrs:{to:"/WhatsNext/"}},[t._v("start exploring the features")]),t._v(".")],1),t._v(" "),e("p",[e("strong",[e("em",[t._v("Proceed to the next step - "),e("RouterLink",{attrs:{to:"/WhatsNext/"}},[t._v("What's Next?")]),t._v(".")],1)])])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[171],{900:function(t,e,a){"use strict";a.r(e);var r=a(17),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"3-wallet-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#3-wallet-setup"}},[t._v("#")]),t._v(" (3) Wallet Setup")]),t._v(" "),e("p",[t._v("After "),e("RouterLink",{attrs:{to:"/RegisterAccount/"}},[t._v("account registration")]),t._v(" and "),e("RouterLink",{attrs:{to:"/CreateStore/"}},[t._v("store creation")]),t._v(", it's time to configure a wallet in your BTCPay Server, so that you can start receiving payments into it.")],1),t._v(" "),e("p",[t._v("There are two ways to set up a wallet in BTCPay Server:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/ConnectWallet/"}},[t._v("Connect an existing wallet")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/CreateWallet/"}},[t._v("Create a new wallet")])],1)]),t._v(" "),e("p",[t._v("There are many options on how set up a wallet with your BTCPay Server. It's up to you to decide what works best for your use-case. Once you configure a wallet, you're all set. The next step, is to "),e("RouterLink",{attrs:{to:"/WhatsNext/"}},[t._v("start exploring the features")]),t._v(".")],1),t._v(" "),e("p",[e("strong",[e("em",[t._v("Proceed to the next step - "),e("RouterLink",{attrs:{to:"/WhatsNext/"}},[t._v("What's Next?")]),t._v(".")],1)])])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/172.c8542fb2.js b/assets/js/172.062cbc74.js similarity index 98% rename from assets/js/172.c8542fb2.js rename to assets/js/172.062cbc74.js index 85db9af8c7..621d3cdf60 100644 --- a/assets/js/172.c8542fb2.js +++ b/assets/js/172.062cbc74.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[172],{904:function(t,e,o){"use strict";o.r(e);var a=o(17),r=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"4-whats-next"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#4-whats-next"}},[t._v("#")]),t._v(" (4) What's Next?")]),t._v(" "),e("p",[t._v("After you've connected your wallet to your BTCPay, you can explore various built in tools in the software. See the full list of Use Cases "),e("RouterLink",{attrs:{to:"/UseCase/"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-point-of-sale-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-point-of-sale-app"}},[t._v("#")]),t._v(" Creating the Point of Sale App")]),t._v(" "),e("p",[t._v("BTCPay has a PoS app which you can use to receive payments from your customers directly or to receive donations. To "),e("strong",[t._v("create the POS app")]),t._v(", you need to have a store created in BTCPay. View PoS instructions "),e("RouterLink",{attrs:{to:"/Apps/#point-of-sale-app"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-crowdfund-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-crowdfund-app"}},[t._v("#")]),t._v(" Creating the Crowdfund App")]),t._v(" "),e("p",[t._v("Create a "),e("strong",[t._v("crowdfunding campaign using BTCPay")]),t._v(". Unlike traditional crowdfunding platforms, the creator of the campaign is the owner of the platform. Funds go directly to the creator’s wallet without any fees. View Crowdfund instructions "),e("RouterLink",{attrs:{to:"/Apps/#crowdfunding-app"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-payment-request"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-payment-request"}},[t._v("#")]),t._v(" Creating the Payment Request")]),t._v(" "),e("p",[t._v("Create "),e("strong",[t._v("custom invoices which can be shared with others")]),t._v(", by sending a link to your payment request. Users can pay the request at any time. BTCPay automatically updates the BTC exchange rate at the time of payment. View Payment Request instructions "),e("RouterLink",{attrs:{to:"/PaymentRequests/"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-pay-button"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-pay-button"}},[t._v("#")]),t._v(" Creating the Pay Button")]),t._v(" "),e("p",[e("strong",[t._v("Pay buttons")]),t._v(" are great when you have a fixed amount for a product or a donation. You can easily embed the button into HTML. When the customer or a visitor clicks on the button, BTCPay displays a checkout page and an invoice for them. View Pay Button instructions "),e("RouterLink",{attrs:{to:"/Apps/#payment-button"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"connecting-your-btcpay-store-to-your-e-commerce-platform"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connecting-your-btcpay-store-to-your-e-commerce-platform"}},[t._v("#")]),t._v(" Connecting your BTCPay store to your e-commerce platform")]),t._v(" "),e("p",[t._v("Depending on the CMS you're using, you can easily connect BTCPay to your online store. Currently, BTCPay offers following integrations :")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/WooCommerce/"}},[t._v("WooCommerce")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Shopify/"}},[t._v("Shopify")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Drupal/"}},[t._v("Drupal")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Magento/"}},[t._v("Magneto")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/PrestaShop/"}},[t._v("PrestaShop")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/CustomIntegration/"}},[t._v("Custom integration")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Wix/"}},[t._v("Wix")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Odoo/"}},[t._v("Odoo")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/BigCommerce/"}},[t._v("Big Commerce")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/InvoiceNinja/"}},[t._v("Invoice Ninja")]),t._v("\ne.t.c")],1)]),t._v(" "),e("h2",{attrs:{id:"extending-btcpay-server-plugins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#extending-btcpay-server-plugins"}},[t._v("#")]),t._v(" Extending BTCPay Server: Plugins")]),t._v(" "),e("p",[t._v("BTCPay Server is more than just a payment processor - It can be personalized to your preference. Plugins allows you customize your BTCPay Server application,and tailor your instance to suit your specific needs.")]),t._v(" "),e("p",[t._v("Every project is unique. Whether you're a freelancer, running a physical store, an online store, managing a creative project, or building, there's a good chance a plugin exists to solve your specific workflow challenge.")]),t._v(" "),e("p",[t._v("Need something custom? Click on the "),e("code",[t._v("Manage Plugin")]),t._v(" section on your BTCPay instance and find what plugin works for you.")]),t._v(" "),e("h2",{attrs:{id:"join-the-btcpay-community"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#join-the-btcpay-community"}},[t._v("#")]),t._v(" Join The BTCPay Community")]),t._v(" "),e("p",[t._v("BTCPay Server is an open-source project, not a company. We rely on a network of diverse contributors and users to provide support for numerous use-cases. Join us in improving, learning, and building BTCPay.")]),t._v(" "),e("p",[t._v("If you have questions, try searching our "),e("RouterLink",{attrs:{to:"/FAQ/"}},[t._v("FAQ Section")]),t._v(" or join the "),e("RouterLink",{attrs:{to:"/Community/"}},[t._v("BTCPay Community")]),t._v(" and share questions and ideas for improvement.")],1),t._v(" "),e("p",[t._v("If you are a developer take a look at the "),e("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[t._v("Local Development")]),t._v(" guide and help us with any "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("open issues"),e("OutboundLink")],1),t._v(" on Github. If you would like to contribute to BTCPay in other ways, check out the "),e("RouterLink",{attrs:{to:"/Contribute/"}},[t._v("Contribution Guide")]),t._v(" for ideas.")],1)])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[172],{902:function(t,e,o){"use strict";o.r(e);var a=o(17),r=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"4-whats-next"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#4-whats-next"}},[t._v("#")]),t._v(" (4) What's Next?")]),t._v(" "),e("p",[t._v("After you've connected your wallet to your BTCPay, you can explore various built in tools in the software. See the full list of Use Cases "),e("RouterLink",{attrs:{to:"/UseCase/"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-point-of-sale-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-point-of-sale-app"}},[t._v("#")]),t._v(" Creating the Point of Sale App")]),t._v(" "),e("p",[t._v("BTCPay has a PoS app which you can use to receive payments from your customers directly or to receive donations. To "),e("strong",[t._v("create the POS app")]),t._v(", you need to have a store created in BTCPay. View PoS instructions "),e("RouterLink",{attrs:{to:"/Apps/#point-of-sale-app"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-crowdfund-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-crowdfund-app"}},[t._v("#")]),t._v(" Creating the Crowdfund App")]),t._v(" "),e("p",[t._v("Create a "),e("strong",[t._v("crowdfunding campaign using BTCPay")]),t._v(". Unlike traditional crowdfunding platforms, the creator of the campaign is the owner of the platform. Funds go directly to the creator’s wallet without any fees. View Crowdfund instructions "),e("RouterLink",{attrs:{to:"/Apps/#crowdfunding-app"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-payment-request"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-payment-request"}},[t._v("#")]),t._v(" Creating the Payment Request")]),t._v(" "),e("p",[t._v("Create "),e("strong",[t._v("custom invoices which can be shared with others")]),t._v(", by sending a link to your payment request. Users can pay the request at any time. BTCPay automatically updates the BTC exchange rate at the time of payment. View Payment Request instructions "),e("RouterLink",{attrs:{to:"/PaymentRequests/"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"creating-the-pay-button"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-the-pay-button"}},[t._v("#")]),t._v(" Creating the Pay Button")]),t._v(" "),e("p",[e("strong",[t._v("Pay buttons")]),t._v(" are great when you have a fixed amount for a product or a donation. You can easily embed the button into HTML. When the customer or a visitor clicks on the button, BTCPay displays a checkout page and an invoice for them. View Pay Button instructions "),e("RouterLink",{attrs:{to:"/Apps/#payment-button"}},[t._v("here")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"connecting-your-btcpay-store-to-your-e-commerce-platform"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connecting-your-btcpay-store-to-your-e-commerce-platform"}},[t._v("#")]),t._v(" Connecting your BTCPay store to your e-commerce platform")]),t._v(" "),e("p",[t._v("Depending on the CMS you're using, you can easily connect BTCPay to your online store. Currently, BTCPay offers following integrations :")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/WooCommerce/"}},[t._v("WooCommerce")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Shopify/"}},[t._v("Shopify")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Drupal/"}},[t._v("Drupal")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Magento/"}},[t._v("Magneto")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/PrestaShop/"}},[t._v("PrestaShop")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/CustomIntegration/"}},[t._v("Custom integration")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Wix/"}},[t._v("Wix")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Odoo/"}},[t._v("Odoo")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/BigCommerce/"}},[t._v("Big Commerce")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/InvoiceNinja/"}},[t._v("Invoice Ninja")]),t._v("\ne.t.c")],1)]),t._v(" "),e("h2",{attrs:{id:"extending-btcpay-server-plugins"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#extending-btcpay-server-plugins"}},[t._v("#")]),t._v(" Extending BTCPay Server: Plugins")]),t._v(" "),e("p",[t._v("BTCPay Server is more than just a payment processor - It can be personalized to your preference. Plugins allows you customize your BTCPay Server application,and tailor your instance to suit your specific needs.")]),t._v(" "),e("p",[t._v("Every project is unique. Whether you're a freelancer, running a physical store, an online store, managing a creative project, or building, there's a good chance a plugin exists to solve your specific workflow challenge.")]),t._v(" "),e("p",[t._v("Need something custom? Click on the "),e("code",[t._v("Manage Plugin")]),t._v(" section on your BTCPay instance and find what plugin works for you.")]),t._v(" "),e("h2",{attrs:{id:"join-the-btcpay-community"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#join-the-btcpay-community"}},[t._v("#")]),t._v(" Join The BTCPay Community")]),t._v(" "),e("p",[t._v("BTCPay Server is an open-source project, not a company. We rely on a network of diverse contributors and users to provide support for numerous use-cases. Join us in improving, learning, and building BTCPay.")]),t._v(" "),e("p",[t._v("If you have questions, try searching our "),e("RouterLink",{attrs:{to:"/FAQ/"}},[t._v("FAQ Section")]),t._v(" or join the "),e("RouterLink",{attrs:{to:"/Community/"}},[t._v("BTCPay Community")]),t._v(" and share questions and ideas for improvement.")],1),t._v(" "),e("p",[t._v("If you are a developer take a look at the "),e("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[t._v("Local Development")]),t._v(" guide and help us with any "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("open issues"),e("OutboundLink")],1),t._v(" on Github. If you would like to contribute to BTCPay in other ways, check out the "),e("RouterLink",{attrs:{to:"/Contribute/"}},[t._v("Contribution Guide")]),t._v(" for ideas.")],1)])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/173.fabfe7bf.js b/assets/js/173.c5fa937c.js similarity index 99% rename from assets/js/173.fabfe7bf.js rename to assets/js/173.c5fa937c.js index 215185de5d..edc9a995d2 100644 --- a/assets/js/173.fabfe7bf.js +++ b/assets/js/173.c5fa937c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[173],{907:function(e,t,r){"use strict";r.r(t);var o=r(17),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btcpay-server-payment-provider-accept-bitcoin-payments-in-xenforo-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-payment-provider-accept-bitcoin-payments-in-xenforo-2"}},[e._v("#")]),e._v(" BTCPay Server Payment Provider Accept Bitcoin payments in XenForo 2")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/xenforo/main/src/addons/BS/BtcPayProvider/btcpay-xenforo-banner.png",alt:"BTCPay XenForo Banner",title:"BTCPay XenForo Banner"}})]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/021-projects/xf2-btcpay/pulse",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/maintenance/yes/2024?style=flat-square",alt:"Maintained",title:"Maintained"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://github.com/021-projects/xf2-btcpay/blob/main/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/github/license/021-projects/xf2-btcpay?color=brightgreen&style=flat-square",alt:"GitHub License",title:"GitHub License"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://github.com/021-projects/xf2-btcpay/graphs/contributors",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/github/contributors-anon/021-projects/xf2-btcpay?style=flat-square",alt:"GitHub contributors",title:"GitHub contributors"}}),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/021-projects/xf2-btcpay/releases",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/github/v/release/021-projects/xf2-btcpay?sort=semver&style=flat-square",alt:"GitHub release (latest SemVer)",title:"GitHub release (latest SemVer)"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://github.com/021-projects/xf2-btcpay/releases",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/github/downloads/021-projects/xf2-btcpay/total?style=flat-square",alt:"GitHub all releases",title:"GitHub all releases"}}),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("PHP 8.0+")]),e._v(" "),t("li",[e._v("XenForo 2.2+")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" / "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third party")]),e._v(")")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("Store On BTCPay Server")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("Connected Wallet on BTCPay Server")])],1)]),e._v(" "),t("h3",{attrs:{id:"notes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notes"}},[e._v("#")]),e._v(" Notes")]),e._v(" "),t("ul",[t("li",[e._v("The add-on does not support recurring payments")]),e._v(" "),t("li",[e._v("The add-on does not support refunds")])]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("ol",[t("li",[e._v("Download the add-on from the "),t("a",{attrs:{href:"https://github.com/btcpayserver/xenforo/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("releases page"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Install the add-on via "),t("a",{attrs:{href:"https://xenforo.com/docs/xf2/add-ons/#control-panel-installation-21",target:"_blank",rel:"noopener noreferrer"}},[e._v("control panel"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://xenforo.com/docs/xf2/add-ons/#manual-installation",target:"_blank",rel:"noopener noreferrer"}},[e._v("manually"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[e._v("#")]),e._v(" Configuration")]),e._v(" "),t("h3",{attrs:{id:"payment-profile"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payment-profile"}},[e._v("#")]),e._v(" Payment Profile")]),e._v(" "),t("ol",[t("li",[e._v("Go to XenForo Admin Panel (/admin.php)")]),e._v(" "),t("li",[e._v("Click on [Setup] -> [Payment Profiles]")]),e._v(" "),t("li",[e._v("Click on [Add Payment Profile]")]),e._v(" "),t("li",[e._v('Choose "BTCPay Server" in the "Provider" dropdown')]),e._v(" "),t("li",[e._v('Click on "Proceed..."')]),e._v(" "),t("li",[e._v('In the field "Host", enter the full URL of your host (including the https) https://btcpay.mydomain.com')])]),e._v(" "),t("h3",{attrs:{id:"create-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-api-key"}},[e._v("#")]),e._v(" Create API Key")]),e._v(" "),t("ol",[t("li",[e._v("Go to your BTCPay Server")]),e._v(" "),t("li",[e._v("Click on [Account] -> Manage Account on the bottom left")]),e._v(" "),t("li",[e._v('Go to the tab "API Keys"')]),e._v(" "),t("li",[e._v("Click [Generate Key]")]),e._v(" "),t("li",[e._v("Check the following permissions:\n"),t("ul",[t("li",[e._v("Create an invoice (btcpay.store.cancreateinvoice)")]),e._v(" "),t("li",[e._v("View your stores (btcpay.store.canviewstoresettings)")])])]),e._v(" "),t("li",[e._v("Below the permissions click on [Select specific stores] and select the store created already (this ensures the API key is restricted to this single store)")]),e._v(" "),t("li",[e._v("Click on [Generate API Key]")]),e._v(" "),t("li",[e._v("Copy the generated API Key to your BTCPay Server payment profile settings form")])]),e._v(" "),t("h3",{attrs:{id:"setup-webhook"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-webhook"}},[e._v("#")]),e._v(" Setup Webhook")]),e._v(" "),t("ol",[t("li",[e._v("Go to your BTCPay Server")]),e._v(" "),t("li",[e._v("Click on [Settings]")]),e._v(" "),t("li",[e._v('Go to the tab "Webhooks"')]),e._v(" "),t("li",[e._v("Click [Create Webhook]")]),e._v(" "),t("li",[e._v('Enter the following URL, replacing "https://mydomain.com" with your forum URL, in the "Payload URL" field: https://mydomain.com/payment_callback.php?_xfProvider=btcPayServer')]),e._v(" "),t("li",[e._v('Below "Which events would you like to trigger this webhook?" choose "Send me specific events" and select "An invoice has been settled"')]),e._v(" "),t("li",[e._v('Click on the eye icon near the "Secret" field and copy the secret to your BTCPay Server payment profile settings form')]),e._v(" "),t("li",[e._v("Click on [Add Webhook]")])]),e._v(" "),t("p",[e._v("Note: When testing a webhook, it may produce a 403 error - this is normal.")]),e._v(" "),t("h3",{attrs:{id:"payment-profile-continued"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payment-profile-continued"}},[e._v("#")]),e._v(" Payment Profile (continued)")]),e._v(" "),t("ol",[t("li",[e._v("Go to your BTCPay Server")]),e._v(" "),t("li",[e._v("Click on [Settings]")]),e._v(" "),t("li",[e._v('Copy the "Store ID" to your BTCPay Server payment profile settings form')]),e._v(" "),t("li",[e._v("Click on [Save]")])]),e._v(" "),t("h2",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("p",[e._v("You can use this integration wherever payment goes through XenForo payment profiles.")]),e._v(" "),t("p",[e._v("In most cases, a newly created payment profile requires activation in certain contexts.\nLet's look at an example of activating a newly created profile for user upgrades:")]),e._v(" "),t("ol",[t("li",[e._v("Go to XenForo Admin Panel (/admin.php)")]),e._v(" "),t("li",[e._v("Click on [Setup] -> [Users] -> [Users customization]-> [User upgrades]")]),e._v(" "),t("li",[e._v("Click on the user upgrade you want to activate the payment profile for")]),e._v(" "),t("li",[e._v('Select the payment profile you created in the "Payment profile" select box')]),e._v(" "),t("li",[e._v("Click on [Save]")])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[173],{905:function(e,t,r){"use strict";r.r(t);var o=r(17),a=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btcpay-server-payment-provider-accept-bitcoin-payments-in-xenforo-2"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-payment-provider-accept-bitcoin-payments-in-xenforo-2"}},[e._v("#")]),e._v(" BTCPay Server Payment Provider Accept Bitcoin payments in XenForo 2")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/xenforo/main/src/addons/BS/BtcPayProvider/btcpay-xenforo-banner.png",alt:"BTCPay XenForo Banner",title:"BTCPay XenForo Banner"}})]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/021-projects/xf2-btcpay/pulse",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/maintenance/yes/2024?style=flat-square",alt:"Maintained",title:"Maintained"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://github.com/021-projects/xf2-btcpay/blob/main/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/github/license/021-projects/xf2-btcpay?color=brightgreen&style=flat-square",alt:"GitHub License",title:"GitHub License"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://github.com/021-projects/xf2-btcpay/graphs/contributors",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/github/contributors-anon/021-projects/xf2-btcpay?style=flat-square",alt:"GitHub contributors",title:"GitHub contributors"}}),t("OutboundLink")],1)]),e._v(" "),t("p",[t("a",{attrs:{href:"https://github.com/021-projects/xf2-btcpay/releases",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/github/v/release/021-projects/xf2-btcpay?sort=semver&style=flat-square",alt:"GitHub release (latest SemVer)",title:"GitHub release (latest SemVer)"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://github.com/021-projects/xf2-btcpay/releases",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/github/downloads/021-projects/xf2-btcpay/total?style=flat-square",alt:"GitHub all releases",title:"GitHub all releases"}}),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("PHP 8.0+")]),e._v(" "),t("li",[e._v("XenForo 2.2+")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server"),t("OutboundLink")],1),e._v(" ("),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" / "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third party")]),e._v(")")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("Store On BTCPay Server")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("Connected Wallet on BTCPay Server")])],1)]),e._v(" "),t("h3",{attrs:{id:"notes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notes"}},[e._v("#")]),e._v(" Notes")]),e._v(" "),t("ul",[t("li",[e._v("The add-on does not support recurring payments")]),e._v(" "),t("li",[e._v("The add-on does not support refunds")])]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("ol",[t("li",[e._v("Download the add-on from the "),t("a",{attrs:{href:"https://github.com/btcpayserver/xenforo/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("releases page"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Install the add-on via "),t("a",{attrs:{href:"https://xenforo.com/docs/xf2/add-ons/#control-panel-installation-21",target:"_blank",rel:"noopener noreferrer"}},[e._v("control panel"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://xenforo.com/docs/xf2/add-ons/#manual-installation",target:"_blank",rel:"noopener noreferrer"}},[e._v("manually"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[e._v("#")]),e._v(" Configuration")]),e._v(" "),t("h3",{attrs:{id:"payment-profile"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payment-profile"}},[e._v("#")]),e._v(" Payment Profile")]),e._v(" "),t("ol",[t("li",[e._v("Go to XenForo Admin Panel (/admin.php)")]),e._v(" "),t("li",[e._v("Click on [Setup] -> [Payment Profiles]")]),e._v(" "),t("li",[e._v("Click on [Add Payment Profile]")]),e._v(" "),t("li",[e._v('Choose "BTCPay Server" in the "Provider" dropdown')]),e._v(" "),t("li",[e._v('Click on "Proceed..."')]),e._v(" "),t("li",[e._v('In the field "Host", enter the full URL of your host (including the https) https://btcpay.mydomain.com')])]),e._v(" "),t("h3",{attrs:{id:"create-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-api-key"}},[e._v("#")]),e._v(" Create API Key")]),e._v(" "),t("ol",[t("li",[e._v("Go to your BTCPay Server")]),e._v(" "),t("li",[e._v("Click on [Account] -> Manage Account on the bottom left")]),e._v(" "),t("li",[e._v('Go to the tab "API Keys"')]),e._v(" "),t("li",[e._v("Click [Generate Key]")]),e._v(" "),t("li",[e._v("Check the following permissions:\n"),t("ul",[t("li",[e._v("Create an invoice (btcpay.store.cancreateinvoice)")]),e._v(" "),t("li",[e._v("View your stores (btcpay.store.canviewstoresettings)")])])]),e._v(" "),t("li",[e._v("Below the permissions click on [Select specific stores] and select the store created already (this ensures the API key is restricted to this single store)")]),e._v(" "),t("li",[e._v("Click on [Generate API Key]")]),e._v(" "),t("li",[e._v("Copy the generated API Key to your BTCPay Server payment profile settings form")])]),e._v(" "),t("h3",{attrs:{id:"setup-webhook"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-webhook"}},[e._v("#")]),e._v(" Setup Webhook")]),e._v(" "),t("ol",[t("li",[e._v("Go to your BTCPay Server")]),e._v(" "),t("li",[e._v("Click on [Settings]")]),e._v(" "),t("li",[e._v('Go to the tab "Webhooks"')]),e._v(" "),t("li",[e._v("Click [Create Webhook]")]),e._v(" "),t("li",[e._v('Enter the following URL, replacing "https://mydomain.com" with your forum URL, in the "Payload URL" field: https://mydomain.com/payment_callback.php?_xfProvider=btcPayServer')]),e._v(" "),t("li",[e._v('Below "Which events would you like to trigger this webhook?" choose "Send me specific events" and select "An invoice has been settled"')]),e._v(" "),t("li",[e._v('Click on the eye icon near the "Secret" field and copy the secret to your BTCPay Server payment profile settings form')]),e._v(" "),t("li",[e._v("Click on [Add Webhook]")])]),e._v(" "),t("p",[e._v("Note: When testing a webhook, it may produce a 403 error - this is normal.")]),e._v(" "),t("h3",{attrs:{id:"payment-profile-continued"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payment-profile-continued"}},[e._v("#")]),e._v(" Payment Profile (continued)")]),e._v(" "),t("ol",[t("li",[e._v("Go to your BTCPay Server")]),e._v(" "),t("li",[e._v("Click on [Settings]")]),e._v(" "),t("li",[e._v('Copy the "Store ID" to your BTCPay Server payment profile settings form')]),e._v(" "),t("li",[e._v("Click on [Save]")])]),e._v(" "),t("h2",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("p",[e._v("You can use this integration wherever payment goes through XenForo payment profiles.")]),e._v(" "),t("p",[e._v("In most cases, a newly created payment profile requires activation in certain contexts.\nLet's look at an example of activating a newly created profile for user upgrades:")]),e._v(" "),t("ol",[t("li",[e._v("Go to XenForo Admin Panel (/admin.php)")]),e._v(" "),t("li",[e._v("Click on [Setup] -> [Users] -> [Users customization]-> [User upgrades]")]),e._v(" "),t("li",[e._v("Click on the user upgrade you want to activate the payment profile for")]),e._v(" "),t("li",[e._v('Select the payment profile you created in the "Payment profile" select box')]),e._v(" "),t("li",[e._v("Click on [Save]")])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/18.d51024cf.js b/assets/js/18.dc3e9d95.js similarity index 99% rename from assets/js/18.d51024cf.js rename to assets/js/18.dc3e9d95.js index 61651627d6..a3aa7a5386 100644 --- a/assets/js/18.d51024cf.js +++ b/assets/js/18.dc3e9d95.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{332:function(e,t,n){e.exports=n.p+"assets/img/btcpay-vm--19-troubleshoot-403-callback.51193927.png"},338:function(e,t,n){e.exports=n.p+"assets/img/oc3--12--webhook-success.b5638028.png"},534:function(e,t,n){e.exports=n.p+"assets/img/oc3--01--upload-zip.a09f931a.png"},535:function(e,t,n){e.exports=n.p+"assets/img/oc3--02--install-btcpay.045a3912.png"},536:function(e,t,n){e.exports=n.p+"assets/img/oc3--03--configure-btcpay.f4329bcc.png"},537:function(e,t,n){e.exports=n.p+"assets/img/oc3--04--configure-btcpay-page.c7b27789.png"},538:function(e,t,n){e.exports=n.p+"assets/img/oc3--05--btcps-account-manage.d8f9b0b5.png"},539:function(e,t,n){e.exports=n.p+"assets/img/oc3--05--btcps-account-manage-add.f1d58bef.png"},540:function(e,t,n){e.exports=n.p+"assets/img/oc3--06--btcps-generate-api-key-permissions.e6be361e.png"},541:function(e,t,n){e.exports=n.p+"assets/img/oc3--07--btcps-generate-api-key-permissions-store.b5cc47ae.png"},542:function(e,t,n){e.exports=n.p+"assets/img/oc3--08--btcps-generate-api-key-result.3da35e17.png"},543:function(e,t,n){e.exports=n.p+"assets/img/oc3--09--btcps-store-id.59a07f51.png"},544:function(e,t,n){e.exports=n.p+"assets/img/oc3--10--save-settings.b1852b45.png"},545:function(e,t,n){e.exports=n.p+"assets/img/oc3--11--save-settings-success.c7a8ed3c.png"},546:function(e,t,n){e.exports=n.p+"assets/img/oc3--20--debug-mode-enable.952c68c8.png"},547:function(e,t,n){e.exports=n.p+"assets/img/oc3--21--error-logs.a324ae3f.png"},868:function(e,t,n){"use strict";n.r(t);var a=n(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"accept-bitcoin-payments-in-opencart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#accept-bitcoin-payments-in-opencart"}},[e._v("#")]),e._v(" Accept Bitcoin payments in OpenCart")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server"),t("OutboundLink")],1),e._v(" is a free and open-source Bitcoin payment processor. It allows you receive payments directly into your wallet with no fees, or middleman.")]),e._v(" "),t("p",[e._v("If you run an OpenCart store, expand your market reach today without any additional marketing cost by integrating it with BTCPay Server to offer Bitcoin as a payment option.")]),e._v(" "),t("h2",{attrs:{id:"benefits-of-using-btcpay-for-opencart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#benefits-of-using-btcpay-for-opencart"}},[e._v("#")]),e._v(" Benefits of using BTCPay for OpenCart")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("Fully Automated System:")]),e._v(" Let BTCPay handle everything for you—payments, invoice management, and refunds—automatically.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Zero Fees:")]),e._v(" BTCPay Server is free. That’s right—no transaction fees, no processing fees, ever.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Bitcoin QR Code at Checkout:")]),e._v(" Enhance your customer’s experience with a simple and secure payment process by displaying a Bitcoin QR code for payment at checkout.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Lightning Network Integration:")]),e._v(" Enjoy instant, low-cost payments and payouts.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Easy data exports:")]),e._v(" Easily manage your financial reports with CSV export options.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Versatile Plugin System:")]),e._v(" Extend BTCPay’s functionality with a flexible plugin system tailored to your needs.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Point-of-Sale Integration:")]),e._v(" Accept Bitcoin in physical stores with POS integration.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Multilingual Ready:")]),e._v(" Serve your global audience in a language they understand")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Self-Hosted Infrastructure:")]),e._v(" Choose self-hosting for full control or a third-party host for convenience. Both provide the complete BTCPay experience.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Community-Driven Support:")]),e._v(" Get help and advice from a dedicated community ("),t("a",{attrs:{href:"http://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1),e._v(").")])])]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Ensure that you meet the following requirements before installing this extension.")]),e._v(" "),t("ul",[t("li",[e._v("PHP version >= 7.4 for OpenCart 3; PHP >= 8.1 for OpenCart 4")]),e._v(" "),t("li",[e._v("The curl, gd, intl, json, and mbstring PHP extensions are available")]),e._v(" "),t("li",[e._v("A OpenCart 3/4 store ("),t("a",{attrs:{href:"https://www.opencart.com/index.php?route=cms/download",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download and installation instructions"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("IMPORTANT:")]),e._v(" You have a BTCPay Server version 1.3.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've got a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've got a wallet connected to your store")])],1)]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("The instructions are based on OpenCart 3, but the UI and steps are almost identical to OpenCart 4. Therefore we have no separate instructions.")])]),e._v(" "),t("h2",{attrs:{id:"step-by-step-guide-to-install-the-btcpay-extension-for-opencart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step-guide-to-install-the-btcpay-extension-for-opencart"}},[e._v("#")]),e._v(" Step-by-Step Guide to Install the BTCPay Extension for OpenCart")]),e._v(" "),t("h3",{attrs:{id:"1-install-btcpay-extension"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-install-btcpay-extension"}},[e._v("#")]),e._v(" 1. Install BTCPay extension")]),e._v(" "),t("p",[e._v("There are three ways to "),t("strong",[e._v("download the BTCPay for OpenCart extension")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Via the Admin Dashboard (recommended)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=44269",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenCart Marketplace"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/opencart",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Repository"),t("OutboundLink")],1)])]),e._v(" "),t("h4",{attrs:{id:"11-install-the-extension-from-opencart-admin-dashboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-install-the-extension-from-opencart-admin-dashboard"}},[e._v("#")]),e._v(" 1.1 Install the extension from OpenCart admin dashboard")]),e._v(" "),t("p",[e._v("Note: The extension is currently undergoing review and will be available soon.")]),e._v(" "),t("h4",{attrs:{id:"12-download-and-install-the-extension-from-marketplace-or-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-download-and-install-the-extension-from-marketplace-or-github"}},[e._v("#")]),e._v(" 1.2 Download and install the extension from Marketplace or GitHub")]),e._v(" "),t("ol",[t("li",[e._v("Download the latest BTCPay extension from the "),t("a",{attrs:{href:"https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=44269",target:"_blank",rel:"noopener noreferrer"}},[e._v("Marketplace"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://github.com/btcpayserver/opencart/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Navigate to Menu: Extensions -> Install")]),e._v(" "),t("li",[e._v("Click the button [Upload] and upload the downloaded "),t("code",[e._v("btcpay.ocmod.zip")]),e._v('\nAfter the upload completes, you should see a notification saying, "Success: You have modified extensions!"')])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(534),alt:"BTCPay OpenCart: Extension installation upload",title:"BTCPay OpenCart: Extension installation upload"}})]),e._v(" "),t("h4",{attrs:{id:"13-complete-the-extension-installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#13-complete-the-extension-installation"}},[e._v("#")]),e._v(" 1.3 Complete the Extension Installation")]),e._v(" "),t("ol",[t("li",[e._v("Go to Menu: Extensions -> Extensions")]),e._v(" "),t("li",[e._v('In the "Choose extension type" dropdown menu, select Payment.')]),e._v(" "),t("li",[e._v('Find the BTCPay extension in the list and click the green Install button in the "Action" column.')]),e._v(" "),t("li",[e._v('You will see a notification saying: "Success: You have modified payments!"')])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(535),alt:"BTCPay OpenCart: Install extension",title:"BTCPay OpenCart: Install extension"}})]),e._v(" "),t("h3",{attrs:{id:"2-connecting-opencart-and-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-connecting-opencart-and-btcpay-server"}},[e._v("#")]),e._v(" 2. Connecting OpenCart and BTCPay Server")]),e._v(" "),t("p",[e._v("Before proceeding, ensure you have a BTCPay Server instance set up as described in the "),t("a",{attrs:{href:"#requirements"}},[e._v("requirements section")]),e._v(".")]),e._v(" "),t("p",[e._v("The BTCPay for OpenCart extension acts as a "),t("strong",[e._v("bridge between your BTCPay Server (payment processor) and your e-commerce store")]),e._v(". Whether you're using a self-hosted or a third-party solution, the connection process remains the same.")]),e._v(" "),t("h4",{attrs:{id:"21-configure-btcpay-server-extension-in-opencart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-configure-btcpay-server-extension-in-opencart"}},[e._v("#")]),e._v(" 2.1 Configure BTCPay Server extension in OpenCart")]),e._v(" "),t("ol",[t("li",[e._v("In the OpenCart panel, navigate to Extensions -> Extensions.")]),e._v(" "),t("li",[e._v("Find the BTCPay extension in the list and click the blue Edit button.\n"),t("img",{attrs:{src:n(536),alt:"BTCPay OpenCart: Add new payment method",title:"BTCPay OpenCart: Add new payment method"}})]),e._v(" "),t("li",[e._v("Configure BTCPay extension. "),t("img",{attrs:{src:n(537),alt:"BTCPay OpenCart: Payment method details",title:"BTCPay OpenCart: Payment method details"}})]),e._v(" "),t("li",[e._v('Set the "Payment Method Enabled" field to Enabled.')]),e._v(" "),t("li",[e._v('In the "BTCPay Server URL" field, enter the URL where your BTCPay Server instance is accessible, e.g., https://mainnet.demo.btcpayserver.org/. Instructions for deploying your BTCPay Server instance can be found in '),t("a",{attrs:{href:"#requirements"}},[e._v("requirements section above")])])]),e._v(" "),t("p",[e._v("Before you can continue, you need to create the API key for your user and store, as described in the next section. Keep this browser tab open, as we will come back shortly.")]),e._v(" "),t("h4",{attrs:{id:"22-create-an-api-key-and-configure-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("#")]),e._v(" 2.2 Create an API key and configure permissions")]),e._v(" "),t("p",[e._v("On your BTCPay Server instance:")]),e._v(" "),t("ol",[t("li",[e._v("Click on "),t("em",[e._v("[Account]")])]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Manage Account]")]),e._v(" "),t("img",{attrs:{src:n(538),alt:"BTCPay OpenCart: Manage Account",title:"BTCPay OpenCart: Manage Account"}})]),e._v(" "),t("li",[e._v("Go to the tab "),t("em",[e._v('"API Keys"')])]),e._v(" "),t("li",[e._v("Click "),t("em",[e._v("[Generate Key]")]),e._v(" to select permissions."),t("br"),e._v(" "),t("img",{attrs:{src:n(539),alt:"BTCPay OpenCart: API Keys overview",title:"BTCPay OpenCart: API Keys overview"}})]),e._v(" "),t("li",[e._v('"Label": Add a label.')]),e._v(" "),t("li",[e._v('"Permissions": '),t("strong",[e._v("Important:")]),e._v(" click on the "),t("em",[e._v('"Select specific stores"')]),e._v(" link for the following permissions: "),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(" and select the store you created for your OpenCart site. This makes sure that the API key only has access to that specific store and can't drain any funds even if the key is lost.\n"),t("img",{attrs:{src:n(540),alt:"BTCPay OpenCart: API Keys Permissions",title:"BTCPay OpenCart: API Keys Permissions"}}),t("br"),e._v("\nIt should look like this:\n"),t("img",{attrs:{src:n(541),alt:"BTCPay OpenCart: API Keys Permissions",title:"BTCPay OpenCart: API Keys Permissions"}})]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Generate API Key]")]),e._v(" at the bottom")]),e._v(" "),t("li",[e._v("Copy the generated API Key to your "),t("em",[e._v("OpenCart BTCPay settings")]),e._v(' form field "BTCPay API Key"\n'),t("img",{attrs:{src:n(542),alt:"BTCPay OpenCart: Copy API Key",title:"BTCPay OpenCart: Copy API Key"}})]),e._v(" "),t("li",[e._v("Back on BTCPay Server instance, go to your store settings and copy the store ID to your "),t("em",[e._v("OpenCart BTCPay Settings")]),e._v(" form"),t("br"),e._v(" "),t("img",{attrs:{src:n(543),alt:"BTCPay OpenCart: Copy Store ID",title:"BTCPay OpenCart: Copy Store ID"}})]),e._v(" "),t("li",[e._v("Back on "),t("em",[e._v("OpenCart BTCPay settings")]),e._v(" form make sure "),t("strong",[e._v("BTPCay Server URL")]),e._v(", "),t("strong",[e._v("API Key")]),e._v(" and "),t("strong",[e._v("Store ID")]),e._v(" are set and click "),t("strong",[e._v("[Save]")]),e._v(" button (on the top right)"),t("br"),e._v(" "),t("img",{attrs:{src:n(544),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})])]),e._v(" "),t("p",[e._v('Return to the Extensions overview page, you should see a notification that says "BTCPay Server Payment details have been successfully updated.". If not, double-check that your URL, API Key, and Store ID are correctly entered.\n'),t("img",{attrs:{src:n(545),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})]),e._v(" "),t("p",[e._v('On successfully saving, the BTCPay extension automatically creates a webhook to notify OpenCart when payments are settled or failed. To double check it was successful. You can do that by editing the BTCPay extension settings again if you see the "Webhook Data" field filled out like this:\n'),t("img",{attrs:{src:n(338),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})]),e._v(" "),t("p",[e._v("As you can see on the BTCPay extension settings, you can customize the order statuses depending on the "),t("RouterLink",{attrs:{to:"/Invoices/#invoice-statuses"}},[e._v("invoice statuses")]),e._v(" and other common settings. The defaults should be a good starting point but feel free to adjust them to your specific needs.")],1),e._v(" "),t("h3",{attrs:{id:"3-test-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-test-the-checkout"}},[e._v("#")]),e._v(" 3. Test the checkout")]),e._v(" "),t("p",[e._v("Now everything is set up; it's time to perform a test transaction:")]),e._v(" "),t("p",[e._v("Make a Test Purchase: Place a small order through your OpenCart store to ensure the checkout process works as expected.\nVerify Order Status: Check that the order status in OpenCart updates according to the corresponding BTCPay invoice status.\nReview Webhook Events: In the BTCPay Server invoice details, confirm that the webhook events were successful.")]),e._v(" "),t("h3",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h4",{attrs:{id:"enable-debug-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enable-debug-mode"}},[e._v("#")]),e._v(" Enable debug mode")]),e._v(" "),t("p",[e._v('If you have an error during checkout, you can enable the debugging mode on the BTCPay extension settings. Menu: Go to "Extensions -> extensions" select "Payments" on the "Choose Extension Type" dropdown and edit BTCPay Server extension.')]),e._v(" "),t("figure",[t("img",{attrs:{src:n(546),alt:"BTCPay OpenCart: Enable debug mode",title:"BTCPay OpenCart: Enable debug mode"}})]),e._v(" "),t("p",[e._v("You can now find the debug output in the "),t("code",[e._v("error log")]),e._v(' in the menu "System -> Maintenence -> Error Logs".')]),e._v(" "),t("figure",[t("img",{attrs:{src:n(547),alt:"BTCPay OpenCart: Enable debug mode",title:"BTCPay OpenCart: Enable debug mode"}})]),e._v(" "),t("p",[e._v("*Please make sure to disable it after debugging is finished; otherwise, it will fill up your error logs.**")]),e._v(" "),t("p",[t("strong",[e._v("Example Error")]),e._v(":")]),e._v(" "),t("blockquote",[t("p",[e._v('2022-05-24 21:10:50 ERROR Error during POST to https://btcpay.example.com/api/v1/stores/4kD5bvAF5j8DokHqAzxb6MFDV4ikabcdefghijklm/invoices. Got response (401): {"code":"unauthenticated","message":"Authentication is required for accessing this endpoint"}')])]),e._v(" "),t("ul",[t("li",[t("p",[e._v("This means there is some authentication error. Likely your API key does not have permission to create invoices for that store. Make sure you give the API key the correct permissions, give it to the right store, and enter that in the OpenCart payment configuration form.")])]),e._v(" "),t("li",[t("p",[e._v('Another reason could be that you use a legacy API key. The legacy API keys are located in store settings -> Access Tokens. But you need to create an account API key located in Account -> Manage Account -> tab "API Keys". See section '),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("2.2 Create an API key and configure permissions")]),e._v(".")])])]),e._v(" "),t("h3",{attrs:{id:"the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("#")]),e._v(" The order states do not update, although the invoice has been paid.")]),e._v(" "),t("p",[e._v('Please check your invoice details to see if there were any errors on sending the webhook request. Some hosting providers, firewall setups, or security extensions may block POST requests to your site, which leads to an HTTP status of "403 forbidden".')]),e._v(" "),t("p",[e._v("You can check and verify yourself if there is something blocking requests to your site in one of these two ways:")]),e._v(" "),t("p",[t("strong",[e._v("1. Copy webhook callback URL")]),t("br"),e._v("\nGo to your "),t("em",[e._v("OpenCart BTCPay extension settings")]),e._v(' and copy the "URL" of the "Webhook Data" field. e.g., '),t("code",[e._v("https://YOURSTOREDOMAIN.TLD/index.php?route=extension/payment/btcpay/callback")])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(338),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})]),e._v(" "),t("p",[t("strong",[e._v("2.1 Check using a command line (Linux or MacOS):")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -vX POST -H "Content-Type: application/json" \\\n -d \'{"data": "test"}\' WEBHOOK_CALLBACK_URL\n')])])]),t("p",[e._v("(replace "),t("code",[e._v("WEBHOOK_CALLBACK_URL")]),e._v(" with the one copied above)")]),e._v(" "),t("p",[e._v("Result:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".... snip ....\n* upload completely sent off: 16 out of 16 bytes\n< HTTP/1.1 403 Forbidden\n< access-control-allow-origin: *\n< Content-Type: application/json; charset=UTF-8\n< X-Cloud-Trace-Context: 4f07d5b2e5c2f05949d04421a8e2dd6a\n< Date: Thu, 17 Feb 2022 10:06:50 GMT\n< Server: Google Frontend\n< Content-Length: 26\n")])])]),t("p",[e._v('If you see that line "HTTP/1.1 403 Forbidden" or "HTTP/2 403" something is blocking data sent to your OpenCart site. It would be best to ask your hosting provider or make sure no firewall or security extension is blocking the requests.')]),e._v(" "),t("p",[t("strong",[e._v("2.2 Check using an online service (if you do not have a command line available:")])]),e._v(" "),t("ul",[t("li",[e._v("Go to "),t("a",{attrs:{href:"https://reqbin.com/post-online",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://reqbin.com/post-online"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("ol",[t("li",[e._v("Enter your callback url (copied from step 1 above): "),t("code",[e._v("https://YOURSTOREDOMAIN.TLD/index.php?route=extension/payment/btcpay/callback")]),e._v("\n(replace this URL with the webhook callback url from step 1)")])])]),e._v(" "),t("li",[e._v('Make sure "POST" is selected')]),e._v(" "),t("li",[t("ol",{attrs:{start:"2"}},[t("li",[e._v("Click [Send]")])])])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(332),alt:"BTCPay OpenCart: Webhook payload URL forbidden",title:"BTCPay OpenCart: Webhook payload URL forbidden"}})]),e._v(" "),t("p",[e._v('If you see "'),t("strong",[e._v("Status 403 (Forbidden)")]),e._v('" then POST requests to your site are blocked for some reason. You should ask your hosting provider or ensure no firewall or security extension is blocking the requests. If you see any other status code (200, 500, ...) a firewall problem seems not to apply. You probably need to investigate further.')]),e._v(" "),t("h2",{attrs:{id:"i-have-trouble-with-using-the-extension-or-some-other-related-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-have-trouble-with-using-the-extension-or-some-other-related-questions"}},[e._v("#")]),e._v(" I have trouble with using the extension or some other related questions.")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://t.me/btcpayserver"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[18],{332:function(e,t,n){e.exports=n.p+"assets/img/btcpay-vm--19-troubleshoot-403-callback.51193927.png"},338:function(e,t,n){e.exports=n.p+"assets/img/oc3--12--webhook-success.b5638028.png"},534:function(e,t,n){e.exports=n.p+"assets/img/oc3--01--upload-zip.a09f931a.png"},535:function(e,t,n){e.exports=n.p+"assets/img/oc3--02--install-btcpay.045a3912.png"},536:function(e,t,n){e.exports=n.p+"assets/img/oc3--03--configure-btcpay.f4329bcc.png"},537:function(e,t,n){e.exports=n.p+"assets/img/oc3--04--configure-btcpay-page.c7b27789.png"},538:function(e,t,n){e.exports=n.p+"assets/img/oc3--05--btcps-account-manage.d8f9b0b5.png"},539:function(e,t,n){e.exports=n.p+"assets/img/oc3--05--btcps-account-manage-add.f1d58bef.png"},540:function(e,t,n){e.exports=n.p+"assets/img/oc3--06--btcps-generate-api-key-permissions.e6be361e.png"},541:function(e,t,n){e.exports=n.p+"assets/img/oc3--07--btcps-generate-api-key-permissions-store.b5cc47ae.png"},542:function(e,t,n){e.exports=n.p+"assets/img/oc3--08--btcps-generate-api-key-result.3da35e17.png"},543:function(e,t,n){e.exports=n.p+"assets/img/oc3--09--btcps-store-id.59a07f51.png"},544:function(e,t,n){e.exports=n.p+"assets/img/oc3--10--save-settings.b1852b45.png"},545:function(e,t,n){e.exports=n.p+"assets/img/oc3--11--save-settings-success.c7a8ed3c.png"},546:function(e,t,n){e.exports=n.p+"assets/img/oc3--20--debug-mode-enable.952c68c8.png"},547:function(e,t,n){e.exports=n.p+"assets/img/oc3--21--error-logs.a324ae3f.png"},867:function(e,t,n){"use strict";n.r(t);var a=n(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"accept-bitcoin-payments-in-opencart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#accept-bitcoin-payments-in-opencart"}},[e._v("#")]),e._v(" Accept Bitcoin payments in OpenCart")]),e._v(" "),t("p",[t("a",{attrs:{href:"https://btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server"),t("OutboundLink")],1),e._v(" is a free and open-source Bitcoin payment processor. It allows you receive payments directly into your wallet with no fees, or middleman.")]),e._v(" "),t("p",[e._v("If you run an OpenCart store, expand your market reach today without any additional marketing cost by integrating it with BTCPay Server to offer Bitcoin as a payment option.")]),e._v(" "),t("h2",{attrs:{id:"benefits-of-using-btcpay-for-opencart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#benefits-of-using-btcpay-for-opencart"}},[e._v("#")]),e._v(" Benefits of using BTCPay for OpenCart")]),e._v(" "),t("ol",[t("li",[t("p",[t("strong",[e._v("Fully Automated System:")]),e._v(" Let BTCPay handle everything for you—payments, invoice management, and refunds—automatically.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Zero Fees:")]),e._v(" BTCPay Server is free. That’s right—no transaction fees, no processing fees, ever.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Bitcoin QR Code at Checkout:")]),e._v(" Enhance your customer’s experience with a simple and secure payment process by displaying a Bitcoin QR code for payment at checkout.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Lightning Network Integration:")]),e._v(" Enjoy instant, low-cost payments and payouts.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Easy data exports:")]),e._v(" Easily manage your financial reports with CSV export options.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Versatile Plugin System:")]),e._v(" Extend BTCPay’s functionality with a flexible plugin system tailored to your needs.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Point-of-Sale Integration:")]),e._v(" Accept Bitcoin in physical stores with POS integration.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Multilingual Ready:")]),e._v(" Serve your global audience in a language they understand")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Self-Hosted Infrastructure:")]),e._v(" Choose self-hosting for full control or a third-party host for convenience. Both provide the complete BTCPay experience.")])]),e._v(" "),t("li",[t("p",[t("strong",[e._v("Community-Driven Support:")]),e._v(" Get help and advice from a dedicated community ("),t("a",{attrs:{href:"http://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Mattermost"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("Telegram"),t("OutboundLink")],1),e._v(").")])])]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("p",[e._v("Ensure that you meet the following requirements before installing this extension.")]),e._v(" "),t("ul",[t("li",[e._v("PHP version >= 7.4 for OpenCart 3; PHP >= 8.1 for OpenCart 4")]),e._v(" "),t("li",[e._v("The curl, gd, intl, json, and mbstring PHP extensions are available")]),e._v(" "),t("li",[e._v("A OpenCart 3/4 store ("),t("a",{attrs:{href:"https://www.opencart.com/index.php?route=cms/download",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download and installation instructions"),t("OutboundLink")],1),e._v(")")]),e._v(" "),t("li",[t("strong",[e._v("IMPORTANT:")]),e._v(" You have a BTCPay Server version 1.3.0 or later, either "),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("hosted by a third-party")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/RegisterAccount/"}},[e._v("You've a registered account on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("You've got a BTCPay store on the instance")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("You've got a wallet connected to your store")])],1)]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("The instructions are based on OpenCart 3, but the UI and steps are almost identical to OpenCart 4. Therefore we have no separate instructions.")])]),e._v(" "),t("h2",{attrs:{id:"step-by-step-guide-to-install-the-btcpay-extension-for-opencart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step-guide-to-install-the-btcpay-extension-for-opencart"}},[e._v("#")]),e._v(" Step-by-Step Guide to Install the BTCPay Extension for OpenCart")]),e._v(" "),t("h3",{attrs:{id:"1-install-btcpay-extension"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-install-btcpay-extension"}},[e._v("#")]),e._v(" 1. Install BTCPay extension")]),e._v(" "),t("p",[e._v("There are three ways to "),t("strong",[e._v("download the BTCPay for OpenCart extension")]),e._v(":")]),e._v(" "),t("ul",[t("li",[e._v("Via the Admin Dashboard (recommended)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=44269",target:"_blank",rel:"noopener noreferrer"}},[e._v("OpenCart Marketplace"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/opencart",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Repository"),t("OutboundLink")],1)])]),e._v(" "),t("h4",{attrs:{id:"11-install-the-extension-from-opencart-admin-dashboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#11-install-the-extension-from-opencart-admin-dashboard"}},[e._v("#")]),e._v(" 1.1 Install the extension from OpenCart admin dashboard")]),e._v(" "),t("p",[e._v("Note: The extension is currently undergoing review and will be available soon.")]),e._v(" "),t("h4",{attrs:{id:"12-download-and-install-the-extension-from-marketplace-or-github"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#12-download-and-install-the-extension-from-marketplace-or-github"}},[e._v("#")]),e._v(" 1.2 Download and install the extension from Marketplace or GitHub")]),e._v(" "),t("ol",[t("li",[e._v("Download the latest BTCPay extension from the "),t("a",{attrs:{href:"https://www.opencart.com/index.php?route=marketplace/extension/info&extension_id=44269",target:"_blank",rel:"noopener noreferrer"}},[e._v("Marketplace"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://github.com/btcpayserver/opencart/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Navigate to Menu: Extensions -> Install")]),e._v(" "),t("li",[e._v("Click the button [Upload] and upload the downloaded "),t("code",[e._v("btcpay.ocmod.zip")]),e._v('\nAfter the upload completes, you should see a notification saying, "Success: You have modified extensions!"')])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(534),alt:"BTCPay OpenCart: Extension installation upload",title:"BTCPay OpenCart: Extension installation upload"}})]),e._v(" "),t("h4",{attrs:{id:"13-complete-the-extension-installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#13-complete-the-extension-installation"}},[e._v("#")]),e._v(" 1.3 Complete the Extension Installation")]),e._v(" "),t("ol",[t("li",[e._v("Go to Menu: Extensions -> Extensions")]),e._v(" "),t("li",[e._v('In the "Choose extension type" dropdown menu, select Payment.')]),e._v(" "),t("li",[e._v('Find the BTCPay extension in the list and click the green Install button in the "Action" column.')]),e._v(" "),t("li",[e._v('You will see a notification saying: "Success: You have modified payments!"')])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(535),alt:"BTCPay OpenCart: Install extension",title:"BTCPay OpenCart: Install extension"}})]),e._v(" "),t("h3",{attrs:{id:"2-connecting-opencart-and-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-connecting-opencart-and-btcpay-server"}},[e._v("#")]),e._v(" 2. Connecting OpenCart and BTCPay Server")]),e._v(" "),t("p",[e._v("Before proceeding, ensure you have a BTCPay Server instance set up as described in the "),t("a",{attrs:{href:"#requirements"}},[e._v("requirements section")]),e._v(".")]),e._v(" "),t("p",[e._v("The BTCPay for OpenCart extension acts as a "),t("strong",[e._v("bridge between your BTCPay Server (payment processor) and your e-commerce store")]),e._v(". Whether you're using a self-hosted or a third-party solution, the connection process remains the same.")]),e._v(" "),t("h4",{attrs:{id:"21-configure-btcpay-server-extension-in-opencart"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-configure-btcpay-server-extension-in-opencart"}},[e._v("#")]),e._v(" 2.1 Configure BTCPay Server extension in OpenCart")]),e._v(" "),t("ol",[t("li",[e._v("In the OpenCart panel, navigate to Extensions -> Extensions.")]),e._v(" "),t("li",[e._v("Find the BTCPay extension in the list and click the blue Edit button.\n"),t("img",{attrs:{src:n(536),alt:"BTCPay OpenCart: Add new payment method",title:"BTCPay OpenCart: Add new payment method"}})]),e._v(" "),t("li",[e._v("Configure BTCPay extension. "),t("img",{attrs:{src:n(537),alt:"BTCPay OpenCart: Payment method details",title:"BTCPay OpenCart: Payment method details"}})]),e._v(" "),t("li",[e._v('Set the "Payment Method Enabled" field to Enabled.')]),e._v(" "),t("li",[e._v('In the "BTCPay Server URL" field, enter the URL where your BTCPay Server instance is accessible, e.g., https://mainnet.demo.btcpayserver.org/. Instructions for deploying your BTCPay Server instance can be found in '),t("a",{attrs:{href:"#requirements"}},[e._v("requirements section above")])])]),e._v(" "),t("p",[e._v("Before you can continue, you need to create the API key for your user and store, as described in the next section. Keep this browser tab open, as we will come back shortly.")]),e._v(" "),t("h4",{attrs:{id:"22-create-an-api-key-and-configure-permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("#")]),e._v(" 2.2 Create an API key and configure permissions")]),e._v(" "),t("p",[e._v("On your BTCPay Server instance:")]),e._v(" "),t("ol",[t("li",[e._v("Click on "),t("em",[e._v("[Account]")])]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Manage Account]")]),e._v(" "),t("img",{attrs:{src:n(538),alt:"BTCPay OpenCart: Manage Account",title:"BTCPay OpenCart: Manage Account"}})]),e._v(" "),t("li",[e._v("Go to the tab "),t("em",[e._v('"API Keys"')])]),e._v(" "),t("li",[e._v("Click "),t("em",[e._v("[Generate Key]")]),e._v(" to select permissions."),t("br"),e._v(" "),t("img",{attrs:{src:n(539),alt:"BTCPay OpenCart: API Keys overview",title:"BTCPay OpenCart: API Keys overview"}})]),e._v(" "),t("li",[e._v('"Label": Add a label.')]),e._v(" "),t("li",[e._v('"Permissions": '),t("strong",[e._v("Important:")]),e._v(" click on the "),t("em",[e._v('"Select specific stores"')]),e._v(" link for the following permissions: "),t("code",[e._v("View invoices")]),e._v(", "),t("code",[e._v("Create invoice")]),e._v(", "),t("code",[e._v("Modify invoices")]),e._v(", "),t("code",[e._v("Modify stores webhooks")]),e._v(", "),t("code",[e._v("View your stores")]),e._v(" and select the store you created for your OpenCart site. This makes sure that the API key only has access to that specific store and can't drain any funds even if the key is lost.\n"),t("img",{attrs:{src:n(540),alt:"BTCPay OpenCart: API Keys Permissions",title:"BTCPay OpenCart: API Keys Permissions"}}),t("br"),e._v("\nIt should look like this:\n"),t("img",{attrs:{src:n(541),alt:"BTCPay OpenCart: API Keys Permissions",title:"BTCPay OpenCart: API Keys Permissions"}})]),e._v(" "),t("li",[e._v("Click on "),t("em",[e._v("[Generate API Key]")]),e._v(" at the bottom")]),e._v(" "),t("li",[e._v("Copy the generated API Key to your "),t("em",[e._v("OpenCart BTCPay settings")]),e._v(' form field "BTCPay API Key"\n'),t("img",{attrs:{src:n(542),alt:"BTCPay OpenCart: Copy API Key",title:"BTCPay OpenCart: Copy API Key"}})]),e._v(" "),t("li",[e._v("Back on BTCPay Server instance, go to your store settings and copy the store ID to your "),t("em",[e._v("OpenCart BTCPay Settings")]),e._v(" form"),t("br"),e._v(" "),t("img",{attrs:{src:n(543),alt:"BTCPay OpenCart: Copy Store ID",title:"BTCPay OpenCart: Copy Store ID"}})]),e._v(" "),t("li",[e._v("Back on "),t("em",[e._v("OpenCart BTCPay settings")]),e._v(" form make sure "),t("strong",[e._v("BTPCay Server URL")]),e._v(", "),t("strong",[e._v("API Key")]),e._v(" and "),t("strong",[e._v("Store ID")]),e._v(" are set and click "),t("strong",[e._v("[Save]")]),e._v(" button (on the top right)"),t("br"),e._v(" "),t("img",{attrs:{src:n(544),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})])]),e._v(" "),t("p",[e._v('Return to the Extensions overview page, you should see a notification that says "BTCPay Server Payment details have been successfully updated.". If not, double-check that your URL, API Key, and Store ID are correctly entered.\n'),t("img",{attrs:{src:n(545),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})]),e._v(" "),t("p",[e._v('On successfully saving, the BTCPay extension automatically creates a webhook to notify OpenCart when payments are settled or failed. To double check it was successful. You can do that by editing the BTCPay extension settings again if you see the "Webhook Data" field filled out like this:\n'),t("img",{attrs:{src:n(338),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})]),e._v(" "),t("p",[e._v("As you can see on the BTCPay extension settings, you can customize the order statuses depending on the "),t("RouterLink",{attrs:{to:"/Invoices/#invoice-statuses"}},[e._v("invoice statuses")]),e._v(" and other common settings. The defaults should be a good starting point but feel free to adjust them to your specific needs.")],1),e._v(" "),t("h3",{attrs:{id:"3-test-the-checkout"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-test-the-checkout"}},[e._v("#")]),e._v(" 3. Test the checkout")]),e._v(" "),t("p",[e._v("Now everything is set up; it's time to perform a test transaction:")]),e._v(" "),t("p",[e._v("Make a Test Purchase: Place a small order through your OpenCart store to ensure the checkout process works as expected.\nVerify Order Status: Check that the order status in OpenCart updates according to the corresponding BTCPay invoice status.\nReview Webhook Events: In the BTCPay Server invoice details, confirm that the webhook events were successful.")]),e._v(" "),t("h3",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h4",{attrs:{id:"enable-debug-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enable-debug-mode"}},[e._v("#")]),e._v(" Enable debug mode")]),e._v(" "),t("p",[e._v('If you have an error during checkout, you can enable the debugging mode on the BTCPay extension settings. Menu: Go to "Extensions -> extensions" select "Payments" on the "Choose Extension Type" dropdown and edit BTCPay Server extension.')]),e._v(" "),t("figure",[t("img",{attrs:{src:n(546),alt:"BTCPay OpenCart: Enable debug mode",title:"BTCPay OpenCart: Enable debug mode"}})]),e._v(" "),t("p",[e._v("You can now find the debug output in the "),t("code",[e._v("error log")]),e._v(' in the menu "System -> Maintenence -> Error Logs".')]),e._v(" "),t("figure",[t("img",{attrs:{src:n(547),alt:"BTCPay OpenCart: Enable debug mode",title:"BTCPay OpenCart: Enable debug mode"}})]),e._v(" "),t("p",[e._v("*Please make sure to disable it after debugging is finished; otherwise, it will fill up your error logs.**")]),e._v(" "),t("p",[t("strong",[e._v("Example Error")]),e._v(":")]),e._v(" "),t("blockquote",[t("p",[e._v('2022-05-24 21:10:50 ERROR Error during POST to https://btcpay.example.com/api/v1/stores/4kD5bvAF5j8DokHqAzxb6MFDV4ikabcdefghijklm/invoices. Got response (401): {"code":"unauthenticated","message":"Authentication is required for accessing this endpoint"}')])]),e._v(" "),t("ul",[t("li",[t("p",[e._v("This means there is some authentication error. Likely your API key does not have permission to create invoices for that store. Make sure you give the API key the correct permissions, give it to the right store, and enter that in the OpenCart payment configuration form.")])]),e._v(" "),t("li",[t("p",[e._v('Another reason could be that you use a legacy API key. The legacy API keys are located in store settings -> Access Tokens. But you need to create an account API key located in Account -> Manage Account -> tab "API Keys". See section '),t("a",{attrs:{href:"#22-create-an-api-key-and-configure-permissions"}},[e._v("2.2 Create an API key and configure permissions")]),e._v(".")])])]),e._v(" "),t("h3",{attrs:{id:"the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-order-states-do-not-update-although-the-invoice-has-been-paid"}},[e._v("#")]),e._v(" The order states do not update, although the invoice has been paid.")]),e._v(" "),t("p",[e._v('Please check your invoice details to see if there were any errors on sending the webhook request. Some hosting providers, firewall setups, or security extensions may block POST requests to your site, which leads to an HTTP status of "403 forbidden".')]),e._v(" "),t("p",[e._v("You can check and verify yourself if there is something blocking requests to your site in one of these two ways:")]),e._v(" "),t("p",[t("strong",[e._v("1. Copy webhook callback URL")]),t("br"),e._v("\nGo to your "),t("em",[e._v("OpenCart BTCPay extension settings")]),e._v(' and copy the "URL" of the "Webhook Data" field. e.g., '),t("code",[e._v("https://YOURSTOREDOMAIN.TLD/index.php?route=extension/payment/btcpay/callback")])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(338),alt:"BTCPay OpenCart: Save OpenCart Settings form",title:"BTCPay OpenCart: Save OpenCart Settings form"}})]),e._v(" "),t("p",[t("strong",[e._v("2.1 Check using a command line (Linux or MacOS):")])]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('curl -vX POST -H "Content-Type: application/json" \\\n -d \'{"data": "test"}\' WEBHOOK_CALLBACK_URL\n')])])]),t("p",[e._v("(replace "),t("code",[e._v("WEBHOOK_CALLBACK_URL")]),e._v(" with the one copied above)")]),e._v(" "),t("p",[e._v("Result:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(".... snip ....\n* upload completely sent off: 16 out of 16 bytes\n< HTTP/1.1 403 Forbidden\n< access-control-allow-origin: *\n< Content-Type: application/json; charset=UTF-8\n< X-Cloud-Trace-Context: 4f07d5b2e5c2f05949d04421a8e2dd6a\n< Date: Thu, 17 Feb 2022 10:06:50 GMT\n< Server: Google Frontend\n< Content-Length: 26\n")])])]),t("p",[e._v('If you see that line "HTTP/1.1 403 Forbidden" or "HTTP/2 403" something is blocking data sent to your OpenCart site. It would be best to ask your hosting provider or make sure no firewall or security extension is blocking the requests.')]),e._v(" "),t("p",[t("strong",[e._v("2.2 Check using an online service (if you do not have a command line available:")])]),e._v(" "),t("ul",[t("li",[e._v("Go to "),t("a",{attrs:{href:"https://reqbin.com/post-online",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://reqbin.com/post-online"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("ol",[t("li",[e._v("Enter your callback url (copied from step 1 above): "),t("code",[e._v("https://YOURSTOREDOMAIN.TLD/index.php?route=extension/payment/btcpay/callback")]),e._v("\n(replace this URL with the webhook callback url from step 1)")])])]),e._v(" "),t("li",[e._v('Make sure "POST" is selected')]),e._v(" "),t("li",[t("ol",{attrs:{start:"2"}},[t("li",[e._v("Click [Send]")])])])]),e._v(" "),t("figure",[t("img",{attrs:{src:n(332),alt:"BTCPay OpenCart: Webhook payload URL forbidden",title:"BTCPay OpenCart: Webhook payload URL forbidden"}})]),e._v(" "),t("p",[e._v('If you see "'),t("strong",[e._v("Status 403 (Forbidden)")]),e._v('" then POST requests to your site are blocked for some reason. You should ask your hosting provider or ensure no firewall or security extension is blocking the requests. If you see any other status code (200, 500, ...) a firewall problem seems not to apply. You probably need to investigate further.')]),e._v(" "),t("h2",{attrs:{id:"i-have-trouble-with-using-the-extension-or-some-other-related-questions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-have-trouble-with-using-the-extension-or-some-other-related-questions"}},[e._v("#")]),e._v(" I have trouble with using the extension or some other related questions.")]),e._v(" "),t("p",[e._v("Feel free to join our support channel over at "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://chat.btcpayserver.org/"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://t.me/btcpayserver"),t("OutboundLink")],1),e._v(" if you need help or have any further questions.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/20.dc4d9383.js b/assets/js/20.84f9500b.js similarity index 99% rename from assets/js/20.dc4d9383.js rename to assets/js/20.84f9500b.js index c32fe4653e..1bf11b9340 100644 --- a/assets/js/20.dc4d9383.js +++ b/assets/js/20.84f9500b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{447:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet1.584fbbe1.png"},448:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet2.b93dd22b.png"},449:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet3.9838bf5a.png"},450:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet4.dec51a41.png"},451:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet9.474b2e7a.png"},452:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet10.6fd1db5f.png"},453:function(e,t,r){e.exports=r.p+"assets/img/btcpayWalletImport1.6c214d88.jpg"},454:function(e,t,r){e.exports=r.p+"assets/img/btcpayWalletImport2.d39a2fb0.jpg"},455:function(e,t,r){e.exports=r.p+"assets/img/btcpayWalletImport3.4ad4427f.jpg"},456:function(e,t,r){e.exports=r.p+"assets/img/SetupWalletXpub.195df229.png"},457:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet11.9ea45c82.png"},458:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet11a.05edcf6d.png"},459:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet12.139c7796.png"},836:function(e,t,r){"use strict";r.r(t);var a=r(17),l=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"connecting-electrum-wallet-to-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting-electrum-wallet-to-btcpay-server"}},[e._v("#")]),e._v(" Connecting Electrum Wallet to BTCPay Server")]),e._v(" "),t("p",[e._v("This document explains "),t("strong",[e._v("how to connect a desktop "),t("a",{attrs:{href:"https://electrum.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Wallet"),t("OutboundLink")],1),e._v(" to a BTCPay Server")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Word of caution")]),e._v(" Electrum wallet relies on Electrum servers that are controlled by third-parties. Information, like public addresses, balances and the transacted amount can "),t("em",[e._v("potentially")]),e._v(" be leaked.")]),e._v(" "),t("p",[e._v("To protect yourself against such leaks, set up "),t("RouterLink",{attrs:{to:"/ElectrumX/"}},[e._v("ElectrumX Server")]),e._v(" or "),t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Personal Server - EPS"),t("OutboundLink")],1),e._v(".")],1),e._v(" "),t("p",[e._v("You can read about the differences between EPS and ElectrumX "),t("a",{attrs:{href:"https://www.reddit.com/r/Electrum/comments/7xb0lz/whats_the_difference_between_electrumx_server_and/",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("ol",[t("li",[e._v("Create a Store in BTCPay Server")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://electrum.org/#download",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download"),t("OutboundLink")],1),e._v(" and install Electrum Wallet")])]),e._v(" "),t("h2",{attrs:{id:"electrum-wallet-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#electrum-wallet-setup"}},[e._v("#")]),e._v(" Electrum Wallet Setup")]),e._v(" "),t("p",[e._v("After the installation, open "),t("strong",[e._v("Electrum Wallet")]),e._v(" by clicking on the icon on your desktop.")]),e._v(" "),t("h3",{attrs:{id:"quick-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-setup"}},[e._v("#")]),e._v(" Quick Setup")]),e._v(" "),t("p",[e._v("The easiest way to setup your Electrum wallet with BTCPay is to import an a wallet file backup to your BTCPay Server.")]),e._v(" "),t("ol",[t("li",[e._v("Create a new Electrum Wallet")]),e._v(" "),t("li",[e._v("In Electrum, File > Save Backup > Save in folder")]),e._v(" "),t("li",[e._v("In BTCPay Server, Store > Settings > Setup > Import Wallet File > Choose File > Continue")]),e._v(" "),t("li",[e._v("Go to Receive tab in Electrum.")]),e._v(" "),t("li",[e._v("Compare the addresses in Electrum and BTCPay Server, they should match.")]),e._v(" "),t("li",[e._v("Confirm the address match in BTCPay.")])]),e._v(" "),t("h2",{attrs:{id:"step-by-step"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step"}},[e._v("#")]),e._v(" Step by Step")]),e._v(" "),t("p",[e._v("The following setup guides you through setting up an entirely new Bech32(SegWit) Wallet in Electrum. If you already have a wallet skip to the Extended Public Key copying.")]),e._v(" "),t("p",[e._v("Firstly, give your wallet a name, for example, "),t("code",[e._v("BTCPay Server Wallet")]),e._v(" and click "),t("code",[e._v("Next")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(447),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Choose "),t("code",[e._v("Standard wallet")]),e._v(" and proceed by clicking the "),t("code",[e._v("Next")]),e._v("button.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(448),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Since we're creating a brand-new wallet,choose "),t("code",[e._v("Create a new seed")]),e._v(" and "),t("code",[e._v("Next")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(449),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("From the multiple choice menu, select "),t("code",[e._v("SegWit")]),e._v(" and "),t("code",[e._v("Next")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(450),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT NOTE:")]),e._v(" If you're a merchant, instead of SegWit (Bech32), it's recommended to use SegWit wrapped (P2SH) format. "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=-1DBJWwA2Cw",target:"_blank",rel:"noopener noreferrer"}},[e._v("This guide"),t("OutboundLink")],1),e._v(" explains how to create P2SH wallet in Electrum that's more suited for merchants, due to compatability with legacy wallets customers use.")]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT NOTE 2:")]),e._v(" Write down your recovery words in the order you see them on the screen. Write them down a piece of paper and store it somewhere secure. Take your time and triple check each word. Do not store your seed in a digital format (photograph, text document). Whoever has the access to your seed can access your funds. Confirm that the seed has been properly backed up by re-entering it in the same order. Once the seed is validated, proceed to the next step.")]),e._v(" "),t("p",[e._v("Copy and paste your seed words to complete your wallet creation in Electrum. Your wallet must be unencrypted to import it into your BTCPay Server. Once you have completed the setup of your wallet in BTCPay you can always add password encryption later in Electrum.")]),e._v(" "),t("p",[e._v("Follow along in the video below on how to import into BTCPay Server.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/kf3BHaQWSAc/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=kf3BHaQWSAc",title:"BTCPay Server - How to import wallet file","data-id":"kf3BHaQWSAc"}},[t("iframe",{attrs:{title:"BTCPay Server - How to import wallet file","data-src":"https://www.youtube-nocookie.com/embed/kf3BHaQWSAc?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h3",{attrs:{id:"alternative-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#alternative-setup"}},[e._v("#")]),e._v(" Alternative Setup")]),e._v(" "),t("p",[e._v("Instead of importing a wallet file you can instead transfer the public key to your BTCPay Server. This can be useful if your wallet is encrypted and you do not want to unencrypt it.")]),e._v(" "),t("ol",[t("li",[e._v("Create a new Electrum Wallet")]),e._v(" "),t("li",[e._v("In Electrum, Wallet > Wallet Information - copy the "),t("strong",[e._v("Master Public Key")]),e._v(".")]),e._v(" "),t("li",[e._v("In BTCPay Server, Store > Settings > Setup > Connect an existing wallet > Enter extended public key")]),e._v(" "),t("li",[e._v("Go to Receive tab in Electrum.")]),e._v(" "),t("li",[e._v("Compare the addresses in Electrum and BTCPay Server, they should match.")]),e._v(" "),t("li",[e._v("Confirm the address match in BTCPay.")])]),e._v(" "),t("p",[e._v("When the wallet loads (it may take few moments), in the top menu, click on the "),t("code",[e._v("Wallet")]),e._v(" and then"),t("code",[e._v("Information")]),e._v(" .")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(451),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Select and "),t("strong",[e._v("copy")]),e._v(" the "),t("code",[e._v("Master Public Key")]),e._v(". This is the "),t("strong",[e._v("public")]),e._v(" key from which BTCPay will derive addresses.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(452),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Return to your BTCPay Server. Click on the "),t("code",[e._v("Bitcoin")]),e._v(" in the left menu or "),t("code",[e._v("Set up a wallet")]),e._v(" on your new dashboard.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(453),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Click "),t("code",[e._v("Connect an existing wallet")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(454),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Now click on the "),t("code",[e._v("Enter extended public key")]),e._v(" option to import your key.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(455),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Paste the "),t("code",[e._v("Master Public Key")]),e._v(" into derivation scheme field as it is, without adding anything else. Make sure that "),t("code",[e._v("Enabled")]),e._v(" checkbox is ticked and click "),t("code",[e._v("Continue")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(456),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Return to the "),t("strong",[e._v("Electrum Wallet")]),e._v(". Go to "),t("code",[e._v("Receive tab")]),e._v(" which shows your wallet receiving address.")]),e._v(" "),t("p",[t("strong",[e._v("Compare the address you see in Electrum Wallet to Addresses shown in BTCPay Server")]),e._v(". If there's a match, "),t("code",[e._v("continue")]),e._v(". If there is no match, double-check that you're actually pasting "),t("code",[e._v("Master Public Key")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(457),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("h3",{attrs:{id:"configuring-the-gap-limit-in-electrum"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-gap-limit-in-electrum"}},[e._v("#")]),e._v(" Configuring the Gap Limit in Electrum")]),e._v(" "),t("p",[e._v("In the top menu, click on the "),t("code",[e._v("View")]),e._v(" and then"),t("code",[e._v("Show Console")]),e._v(" .")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(458),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Enter following commands in Electrum console and press "),t("code",[e._v("enter")]),e._v("on your keyboard.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" wallet.change_gap_limit(100)\n")])])]),t("p",[e._v("If you are running a version older than Electrum 4, also enter the following command and press 'enter'")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("wallet.storage.write()\n")])])]),t("figure",[t("img",{attrs:{src:r(459),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Restart your Electrum and verify that the newly set gap limit is correct by entering in the console:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("wallet.gap_limit\n")])])]),t("p",[e._v("There's no good answer to how much you should set the gap limit to. Most merchants set 100-200. If you're a big merchants with high transaction volume, you can try with even higher gap limit.")]),e._v(" "),t("p",[e._v("For more details about the "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("Gap Limit, check the FAQ")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("Electrum and BTCPay Server are now connected")]),e._v(". Any payments received to your BTCPay will be visible in Electrum, where you can further spend them.")])])}),[],!1,null,null,null);t.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[20],{447:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet1.584fbbe1.png"},448:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet2.b93dd22b.png"},449:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet3.9838bf5a.png"},450:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet4.dec51a41.png"},451:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet9.474b2e7a.png"},452:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet10.6fd1db5f.png"},453:function(e,t,r){e.exports=r.p+"assets/img/btcpayWalletImport1.6c214d88.jpg"},454:function(e,t,r){e.exports=r.p+"assets/img/btcpayWalletImport2.d39a2fb0.jpg"},455:function(e,t,r){e.exports=r.p+"assets/img/btcpayWalletImport3.4ad4427f.jpg"},456:function(e,t,r){e.exports=r.p+"assets/img/SetupWalletXpub.195df229.png"},457:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet11.9ea45c82.png"},458:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet11a.05edcf6d.png"},459:function(e,t,r){e.exports=r.p+"assets/img/ElectrumWallet12.139c7796.png"},835:function(e,t,r){"use strict";r.r(t);var a=r(17),l=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"connecting-electrum-wallet-to-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connecting-electrum-wallet-to-btcpay-server"}},[e._v("#")]),e._v(" Connecting Electrum Wallet to BTCPay Server")]),e._v(" "),t("p",[e._v("This document explains "),t("strong",[e._v("how to connect a desktop "),t("a",{attrs:{href:"https://electrum.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Wallet"),t("OutboundLink")],1),e._v(" to a BTCPay Server")]),e._v(".")]),e._v(" "),t("p",[t("strong",[e._v("Word of caution")]),e._v(" Electrum wallet relies on Electrum servers that are controlled by third-parties. Information, like public addresses, balances and the transacted amount can "),t("em",[e._v("potentially")]),e._v(" be leaked.")]),e._v(" "),t("p",[e._v("To protect yourself against such leaks, set up "),t("RouterLink",{attrs:{to:"/ElectrumX/"}},[e._v("ElectrumX Server")]),e._v(" or "),t("a",{attrs:{href:"https://github.com/chris-belcher/electrum-personal-server",target:"_blank",rel:"noopener noreferrer"}},[e._v("Electrum Personal Server - EPS"),t("OutboundLink")],1),e._v(".")],1),e._v(" "),t("p",[e._v("You can read about the differences between EPS and ElectrumX "),t("a",{attrs:{href:"https://www.reddit.com/r/Electrum/comments/7xb0lz/whats_the_difference_between_electrumx_server_and/",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("ol",[t("li",[e._v("Create a Store in BTCPay Server")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://electrum.org/#download",target:"_blank",rel:"noopener noreferrer"}},[e._v("Download"),t("OutboundLink")],1),e._v(" and install Electrum Wallet")])]),e._v(" "),t("h2",{attrs:{id:"electrum-wallet-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#electrum-wallet-setup"}},[e._v("#")]),e._v(" Electrum Wallet Setup")]),e._v(" "),t("p",[e._v("After the installation, open "),t("strong",[e._v("Electrum Wallet")]),e._v(" by clicking on the icon on your desktop.")]),e._v(" "),t("h3",{attrs:{id:"quick-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#quick-setup"}},[e._v("#")]),e._v(" Quick Setup")]),e._v(" "),t("p",[e._v("The easiest way to setup your Electrum wallet with BTCPay is to import an a wallet file backup to your BTCPay Server.")]),e._v(" "),t("ol",[t("li",[e._v("Create a new Electrum Wallet")]),e._v(" "),t("li",[e._v("In Electrum, File > Save Backup > Save in folder")]),e._v(" "),t("li",[e._v("In BTCPay Server, Store > Settings > Setup > Import Wallet File > Choose File > Continue")]),e._v(" "),t("li",[e._v("Go to Receive tab in Electrum.")]),e._v(" "),t("li",[e._v("Compare the addresses in Electrum and BTCPay Server, they should match.")]),e._v(" "),t("li",[e._v("Confirm the address match in BTCPay.")])]),e._v(" "),t("h2",{attrs:{id:"step-by-step"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#step-by-step"}},[e._v("#")]),e._v(" Step by Step")]),e._v(" "),t("p",[e._v("The following setup guides you through setting up an entirely new Bech32(SegWit) Wallet in Electrum. If you already have a wallet skip to the Extended Public Key copying.")]),e._v(" "),t("p",[e._v("Firstly, give your wallet a name, for example, "),t("code",[e._v("BTCPay Server Wallet")]),e._v(" and click "),t("code",[e._v("Next")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(447),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Choose "),t("code",[e._v("Standard wallet")]),e._v(" and proceed by clicking the "),t("code",[e._v("Next")]),e._v("button.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(448),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Since we're creating a brand-new wallet,choose "),t("code",[e._v("Create a new seed")]),e._v(" and "),t("code",[e._v("Next")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(449),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("From the multiple choice menu, select "),t("code",[e._v("SegWit")]),e._v(" and "),t("code",[e._v("Next")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(450),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT NOTE:")]),e._v(" If you're a merchant, instead of SegWit (Bech32), it's recommended to use SegWit wrapped (P2SH) format. "),t("a",{attrs:{href:"https://www.youtube.com/watch?v=-1DBJWwA2Cw",target:"_blank",rel:"noopener noreferrer"}},[e._v("This guide"),t("OutboundLink")],1),e._v(" explains how to create P2SH wallet in Electrum that's more suited for merchants, due to compatability with legacy wallets customers use.")]),e._v(" "),t("p",[t("strong",[e._v("IMPORTANT NOTE 2:")]),e._v(" Write down your recovery words in the order you see them on the screen. Write them down a piece of paper and store it somewhere secure. Take your time and triple check each word. Do not store your seed in a digital format (photograph, text document). Whoever has the access to your seed can access your funds. Confirm that the seed has been properly backed up by re-entering it in the same order. Once the seed is validated, proceed to the next step.")]),e._v(" "),t("p",[e._v("Copy and paste your seed words to complete your wallet creation in Electrum. Your wallet must be unencrypted to import it into your BTCPay Server. Once you have completed the setup of your wallet in BTCPay you can always add password encryption later in Electrum.")]),e._v(" "),t("p",[e._v("Follow along in the video below on how to import into BTCPay Server.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/kf3BHaQWSAc/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=kf3BHaQWSAc",title:"BTCPay Server - How to import wallet file","data-id":"kf3BHaQWSAc"}},[t("iframe",{attrs:{title:"BTCPay Server - How to import wallet file","data-src":"https://www.youtube-nocookie.com/embed/kf3BHaQWSAc?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h3",{attrs:{id:"alternative-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#alternative-setup"}},[e._v("#")]),e._v(" Alternative Setup")]),e._v(" "),t("p",[e._v("Instead of importing a wallet file you can instead transfer the public key to your BTCPay Server. This can be useful if your wallet is encrypted and you do not want to unencrypt it.")]),e._v(" "),t("ol",[t("li",[e._v("Create a new Electrum Wallet")]),e._v(" "),t("li",[e._v("In Electrum, Wallet > Wallet Information - copy the "),t("strong",[e._v("Master Public Key")]),e._v(".")]),e._v(" "),t("li",[e._v("In BTCPay Server, Store > Settings > Setup > Connect an existing wallet > Enter extended public key")]),e._v(" "),t("li",[e._v("Go to Receive tab in Electrum.")]),e._v(" "),t("li",[e._v("Compare the addresses in Electrum and BTCPay Server, they should match.")]),e._v(" "),t("li",[e._v("Confirm the address match in BTCPay.")])]),e._v(" "),t("p",[e._v("When the wallet loads (it may take few moments), in the top menu, click on the "),t("code",[e._v("Wallet")]),e._v(" and then"),t("code",[e._v("Information")]),e._v(" .")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(451),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Select and "),t("strong",[e._v("copy")]),e._v(" the "),t("code",[e._v("Master Public Key")]),e._v(". This is the "),t("strong",[e._v("public")]),e._v(" key from which BTCPay will derive addresses.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(452),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Return to your BTCPay Server. Click on the "),t("code",[e._v("Bitcoin")]),e._v(" in the left menu or "),t("code",[e._v("Set up a wallet")]),e._v(" on your new dashboard.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(453),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Click "),t("code",[e._v("Connect an existing wallet")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(454),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Now click on the "),t("code",[e._v("Enter extended public key")]),e._v(" option to import your key.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(455),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Paste the "),t("code",[e._v("Master Public Key")]),e._v(" into derivation scheme field as it is, without adding anything else. Make sure that "),t("code",[e._v("Enabled")]),e._v(" checkbox is ticked and click "),t("code",[e._v("Continue")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(456),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Return to the "),t("strong",[e._v("Electrum Wallet")]),e._v(". Go to "),t("code",[e._v("Receive tab")]),e._v(" which shows your wallet receiving address.")]),e._v(" "),t("p",[t("strong",[e._v("Compare the address you see in Electrum Wallet to Addresses shown in BTCPay Server")]),e._v(". If there's a match, "),t("code",[e._v("continue")]),e._v(". If there is no match, double-check that you're actually pasting "),t("code",[e._v("Master Public Key")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(457),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("h3",{attrs:{id:"configuring-the-gap-limit-in-electrum"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-gap-limit-in-electrum"}},[e._v("#")]),e._v(" Configuring the Gap Limit in Electrum")]),e._v(" "),t("p",[e._v("In the top menu, click on the "),t("code",[e._v("View")]),e._v(" and then"),t("code",[e._v("Show Console")]),e._v(" .")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(458),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Enter following commands in Electrum console and press "),t("code",[e._v("enter")]),e._v("on your keyboard.")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" wallet.change_gap_limit(100)\n")])])]),t("p",[e._v("If you are running a version older than Electrum 4, also enter the following command and press 'enter'")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("wallet.storage.write()\n")])])]),t("figure",[t("img",{attrs:{src:r(459),alt:"ElectrumWallet",title:"ElectrumWallet"}})]),e._v(" "),t("p",[e._v("Restart your Electrum and verify that the newly set gap limit is correct by entering in the console:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v("wallet.gap_limit\n")])])]),t("p",[e._v("There's no good answer to how much you should set the gap limit to. Most merchants set 100-200. If you're a big merchants with high transaction volume, you can try with even higher gap limit.")]),e._v(" "),t("p",[e._v("For more details about the "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("Gap Limit, check the FAQ")]),e._v(".")],1),e._v(" "),t("p",[t("strong",[e._v("Electrum and BTCPay Server are now connected")]),e._v(". Any payments received to your BTCPay will be visible in Electrum, where you can further spend them.")])])}),[],!1,null,null,null);t.default=l.exports}}]); \ No newline at end of file diff --git a/assets/js/22.c13a7bf1.js b/assets/js/22.a1a495dd.js similarity index 81% rename from assets/js/22.c13a7bf1.js rename to assets/js/22.a1a495dd.js index 63164b1c89..8506c5a8b2 100644 --- a/assets/js/22.c13a7bf1.js +++ b/assets/js/22.a1a495dd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{331:function(t,e,a){t.exports=a.p+"assets/img/BroadcastConfirm.fde15efd.png"},515:function(t,e,a){t.exports=a.p+"assets/img/1-store-created.617b1965.png"},516:function(t,e,a){t.exports=a.p+"assets/img/2-connect-wallet.1ace2dcb.png"},517:function(t,e,a){t.exports=a.p+"assets/img/3-choose-import-method.d4dbc1cd.png"},518:function(t,e,a){t.exports=a.p+"assets/img/4-vault-notif.2c298f47.png"},519:function(t,e,a){t.exports=a.p+"assets/img/5-address-type.bebe1cf2.png"},520:function(t,e,a){t.exports=a.p+"assets/img/6-pubkey-hww.30a1cab5.png"},521:function(t,e,a){t.exports=a.p+"assets/img/7-confirm-addresses.8735ed56.png"},522:function(t,e,a){t.exports=a.p+"assets/img/8-wallet-setup-complete.d955c440.png"},523:function(t,e,a){t.exports=a.p+"assets/img/9-send-btc.58dad487.png"},524:function(t,e,a){t.exports=a.p+"assets/img/10-choose-signing-method.843569ac.png"},525:function(t,e,a){t.exports=a.p+"assets/img/11-sign-transaction.69390a6b.png"},855:function(t,e,a){"use strict";a.r(e);var r=a(17),i=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"hardware-wallet-integration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hardware-wallet-integration"}},[t._v("#")]),t._v(" Hardware Wallet Integration")]),t._v(" "),e("p",[t._v("For optimal balance between ease of use, security and privacy, it's recommended to use "),e("RouterLink",{attrs:{to:"/Wallet/"}},[t._v("BTCPay Server Wallet")]),t._v(" with a hardware wallet.")],1),t._v(" "),e("p",[t._v("The hardware wallet integration within BTCPay Server allows you to import your hardware wallet and spend the incoming funds with a simple confirmation on your device. Your private keys never leave the device and all funds are being validated against your own full node and no data leakage.")]),t._v(" "),e("h2",{attrs:{id:"getting-started"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[t._v("#")]),t._v(" Getting Started")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/s4qbGxef43A/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=s4qbGxef43A",title:"BTCPay Server Vault","data-id":"s4qbGxef43A"}},[e("iframe",{attrs:{title:"BTCPay Server Vault","data-src":"https://www.youtube-nocookie.com/embed/s4qbGxef43A?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("ol",[e("li",[e("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases",target:"_blank",rel:"noopener noreferrer"}},[t._v("Download the BTCPay Vault app"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Install the Vault on your PC (Windows, MacOS or Linux)")]),t._v(" "),e("li",[t._v("Open the BTCPay Vault app")]),t._v(" "),e("li",[t._v("Plug in the hardware wallet into your PC and make sure it’s in a wake up state")]),t._v(" "),e("li",[t._v("Do you have an existing store? Skip ahead to step 7.")]),t._v(" "),e("li",[t._v("Connect existing wallet and then click on the Connect a hardware wallet.")]),t._v(" "),e("li",[t._v("Now you will see BTCPay Server searching for your hardware wallet, this step requires you to run BTCPay Server Vault.")]),t._v(" "),e("li",[t._v("Click accept on your BTCPay Vault application. Vault is now searching for your device, it will now ask for your pin on the device.")]),t._v(" "),e("li",[t._v("After device was found and accepted, select your address type and click confirm. BTCPay Server will show your public key information from your hardware wallet.")]),t._v(" "),e("li",[t._v("Once you've confirmed the public key is correct, BTCPay Server now shows the address to validate on your device. If they are correct click confirm to complete the setup.")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(515),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(516),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(517),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(518),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(519),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(520),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(521),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(522),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("h3",{attrs:{id:"spending-funds"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#spending-funds"}},[t._v("#")]),t._v(" Spending funds")]),t._v(" "),e("p",[t._v("Once you’ve received funds to your wallet and you decide to spend them, you can sign the transaction with your hardware wallet, all inside BTCPay Server.")]),t._v(" "),e("ol",[e("li",[t._v("Open BTCPay Vault app on your PC")]),t._v(" "),e("li",[t._v("Plug in the hardware wallet and make sure it’s in wake up state")]),t._v(" "),e("li",[t._v("In BTCPay Server, go to your Bitcoin Wallet and click on send")]),t._v(" "),e("li",[t._v("Fill in the Destination address and the Amount")]),t._v(" "),e("li",[t._v("Select Sign with a hardware wallet")]),t._v(" "),e("li",[t._v("Verify the transaction on your hardware wallet and confirm it")]),t._v(" "),e("li",[t._v("Broadcast the transaction")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(523),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(524),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(525),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("h2",{attrs:{id:"advanced-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings"}},[t._v("#")]),t._v(" Advanced Settings")]),t._v(" "),e("p",[t._v("Additional transaction settings can be found by clicking on the "),e("RouterLink",{attrs:{to:"/Wallet/#advanced-settings"}},[t._v("Advanced Settings")]),t._v(" button. If you are not familiar with these types of settings, you may leave them as is to use the default settings.")],1),t._v(" "),e("p",[t._v("If you are experiencing issues sending transactions from a Trezor wallet, you may need to enable "),e("RouterLink",{attrs:{to:"/FAQ/Wallet/#why-is-sending-a-transaction-using-trezor-failing"}},[t._v("this advanced setting")]),t._v(".")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(331),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("h2",{attrs:{id:"supported-hardware-wallets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#supported-hardware-wallets"}},[t._v("#")]),t._v(" Supported Hardware Wallets")]),t._v(" "),e("p",[t._v("The list of supported hardware wallets is available at "),e("a",{attrs:{href:"https://github.com/bitcoin-core/HWI#device-support",target:"_blank",rel:"noopener noreferrer"}},[t._v("this link"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("The hardware wallet integration in BTCPay Server only supports Bitcoin. "),e("RouterLink",{attrs:{to:"/Development/Altcoins/"}},[t._v("Altcoin")]),t._v(" wallets enabled on your server won't work.")],1)])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{331:function(t,e,a){t.exports=a.p+"assets/img/BroadcastConfirm.fde15efd.png"},512:function(t,e,a){t.exports=a.p+"assets/img/1-store-created.617b1965.png"},513:function(t,e,a){t.exports=a.p+"assets/img/2-connect-wallet.1ace2dcb.png"},514:function(t,e,a){t.exports=a.p+"assets/img/3-choose-import-method.d4dbc1cd.png"},515:function(t,e,a){t.exports=a.p+"assets/img/4-vault-notif.2c298f47.png"},516:function(t,e,a){t.exports=a.p+"assets/img/5-address-type.bebe1cf2.png"},517:function(t,e,a){t.exports=a.p+"assets/img/6-pubkey-hww.30a1cab5.png"},518:function(t,e,a){t.exports=a.p+"assets/img/7-confirm-addresses.8735ed56.png"},519:function(t,e,a){t.exports=a.p+"assets/img/8-wallet-setup-complete.d955c440.png"},520:function(t,e,a){t.exports=a.p+"assets/img/9-send-btc.58dad487.png"},521:function(t,e,a){t.exports=a.p+"assets/img/10-choose-signing-method.843569ac.png"},522:function(t,e,a){t.exports=a.p+"assets/img/11-sign-transaction.69390a6b.png"},853:function(t,e,a){"use strict";a.r(e);var r=a(17),i=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"hardware-wallet-integration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#hardware-wallet-integration"}},[t._v("#")]),t._v(" Hardware Wallet Integration")]),t._v(" "),e("p",[t._v("For optimal balance between ease of use, security and privacy, it's recommended to use "),e("RouterLink",{attrs:{to:"/Wallet/"}},[t._v("BTCPay Server Wallet")]),t._v(" with a hardware wallet.")],1),t._v(" "),e("p",[t._v("The hardware wallet integration within BTCPay Server allows you to import your hardware wallet and spend the incoming funds with a simple confirmation on your device. Your private keys never leave the device and all funds are being validated against your own full node and no data leakage.")]),t._v(" "),e("h2",{attrs:{id:"getting-started"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[t._v("#")]),t._v(" Getting Started")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/s4qbGxef43A/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=s4qbGxef43A",title:"BTCPay Server Vault","data-id":"s4qbGxef43A"}},[e("iframe",{attrs:{title:"BTCPay Server Vault","data-src":"https://www.youtube-nocookie.com/embed/s4qbGxef43A?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("ol",[e("li",[e("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases",target:"_blank",rel:"noopener noreferrer"}},[t._v("Download the BTCPay Vault app"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Install the Vault on your PC (Windows, MacOS or Linux)")]),t._v(" "),e("li",[t._v("Open the BTCPay Vault app")]),t._v(" "),e("li",[t._v("Plug in the hardware wallet into your PC and make sure it’s in a wake up state")]),t._v(" "),e("li",[t._v("Do you have an existing store? Skip ahead to step 7.")]),t._v(" "),e("li",[t._v("Connect existing wallet and then click on the Connect a hardware wallet.")]),t._v(" "),e("li",[t._v("Now you will see BTCPay Server searching for your hardware wallet, this step requires you to run BTCPay Server Vault.")]),t._v(" "),e("li",[t._v("Click accept on your BTCPay Vault application. Vault is now searching for your device, it will now ask for your pin on the device.")]),t._v(" "),e("li",[t._v("After device was found and accepted, select your address type and click confirm. BTCPay Server will show your public key information from your hardware wallet.")]),t._v(" "),e("li",[t._v("Once you've confirmed the public key is correct, BTCPay Server now shows the address to validate on your device. If they are correct click confirm to complete the setup.")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(512),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(513),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(514),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(515),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(516),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(517),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(518),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(519),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("h3",{attrs:{id:"spending-funds"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#spending-funds"}},[t._v("#")]),t._v(" Spending funds")]),t._v(" "),e("p",[t._v("Once you’ve received funds to your wallet and you decide to spend them, you can sign the transaction with your hardware wallet, all inside BTCPay Server.")]),t._v(" "),e("ol",[e("li",[t._v("Open BTCPay Vault app on your PC")]),t._v(" "),e("li",[t._v("Plug in the hardware wallet and make sure it’s in wake up state")]),t._v(" "),e("li",[t._v("In BTCPay Server, go to your Bitcoin Wallet and click on send")]),t._v(" "),e("li",[t._v("Fill in the Destination address and the Amount")]),t._v(" "),e("li",[t._v("Select Sign with a hardware wallet")]),t._v(" "),e("li",[t._v("Verify the transaction on your hardware wallet and confirm it")]),t._v(" "),e("li",[t._v("Broadcast the transaction")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(520),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(521),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(522),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("h2",{attrs:{id:"advanced-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings"}},[t._v("#")]),t._v(" Advanced Settings")]),t._v(" "),e("p",[t._v("Additional transaction settings can be found by clicking on the "),e("RouterLink",{attrs:{to:"/Wallet/#advanced-settings"}},[t._v("Advanced Settings")]),t._v(" button. If you are not familiar with these types of settings, you may leave them as is to use the default settings.")],1),t._v(" "),e("p",[t._v("If you are experiencing issues sending transactions from a Trezor wallet, you may need to enable "),e("RouterLink",{attrs:{to:"/FAQ/Wallet/#why-is-sending-a-transaction-using-trezor-failing"}},[t._v("this advanced setting")]),t._v(".")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(331),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("h2",{attrs:{id:"supported-hardware-wallets"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#supported-hardware-wallets"}},[t._v("#")]),t._v(" Supported Hardware Wallets")]),t._v(" "),e("p",[t._v("The list of supported hardware wallets is available at "),e("a",{attrs:{href:"https://github.com/bitcoin-core/HWI#device-support",target:"_blank",rel:"noopener noreferrer"}},[t._v("this link"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("The hardware wallet integration in BTCPay Server only supports Bitcoin. "),e("RouterLink",{attrs:{to:"/Development/Altcoins/"}},[t._v("Altcoin")]),t._v(" wallets enabled on your server won't work.")],1)])])}),[],!1,null,null,null);e.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/23.fcea8aa8.js b/assets/js/23.8751bac3.js similarity index 86% rename from assets/js/23.fcea8aa8.js rename to assets/js/23.8751bac3.js index 9427f443c6..fa1760558e 100644 --- a/assets/js/23.fcea8aa8.js +++ b/assets/js/23.8751bac3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{619:function(A,t,e){A.exports=e.p+"assets/img/1.1317fcf2.png"},620:function(A,t,e){A.exports=e.p+"assets/img/2.00f4500f.png"},621:function(A,t,e){A.exports=e.p+"assets/img/3.3c4c0b97.png"},622:function(A,t,e){A.exports=e.p+"assets/img/4.21661a93.png"},623:function(A,t,e){A.exports=e.p+"assets/img/5.9bc4d4fd.png"},624:function(A,t,e){A.exports=e.p+"assets/img/6.05eb51af.png"},625:function(A,t,e){A.exports=e.p+"assets/img/7.683a8418.png"},626:function(A,t,e){A.exports=e.p+"assets/img/8.64846216.png"},627:function(A,t){A.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABIMAAACsCAYAAADovmwHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABduSURBVHhe7d3/c131fefx/VvAYL4lNgUMQTbbTTAE6hgxbLCWzYR13eCmS0qYsqEayMLWC2zDOIEW6MSZ0dpu49pJsedCvBNBih1PusIpI+8OmBaUDSsbvIpxI0DRjCbSzHvv59xzpXuvji6+krFsncdz5jEDusdX917pF73m3HP/1aWXXhoAAAAAlIMxCAAAAKBEjEEAAAAAJWIMAgAAACgRYxAAAABAiRiDAAAAAErEGAQAAABQIsYgAAAAgBIxBgEAAACUiDEIAAAAoESMQQAAAAAlYgwCAAAAKBFjEAAAAECJGIMAAAAASmReY9CnV6yMGz53S9y8/otxS/cGAAAAAAqk7SRtKGlLKdpYFkPHY1B68OmJXHn1tbFs2bK44IILAAAAACiQtpO0oaQt5VwZhDoeg9KalZ5E0RMEAAAAYLa0paRNpWhrOds6HoPSkuWMIAAAAIDTl7aUtKkUbS1nW8djUHq/W9GTAgAAAGBuaVMp2lrONmMQAAAAwFlgDAIAAAAoEWMQAAAAQIkYgwAAAABKxBgEAAAAUCLGIAAAAIASMQYBAAAAlIgxCAAAAKBEjEEAAAAAJWIMAgAAACgRYxAAAABAiRiDAAAAAErEGAQAAABQIsYgAAAAgBIxBgEAAACUiDEIAAAAoESMQQAAAAAlYgwCAAAAKBFjEAAAAECJGIMAAAAASsQYtGAPRP/JiDjZHw8U3g4Ftr1e/aWJeH1bwW0AAADwCTIGtbH2/u9G/+BwnBqfzP5wz5ocjw9PDMXBPQ9HT3acMei89UB/pB/dnH2SP1NjEAAAAIvEGFRobXyz/73IJqCpiRgdPhqv9u+O7ZWDMXh0OEYnpmLqrZ3RnR1rDDpv5WPQR0dfjO3bt8/2zIP5z/gTYAwCAABgkRiDCjywfySmqn+oT40ciifv7io4Zm2sXVv/b2PQeSsfg072P1B8+yfJGAQAAMAiMQa16t4Zb6UlaPxwbO0quH2WmTGo9+4no//t0ZhI/77a1MRoDA/0xb2F97M27t8xEMOjE9nwVD06JkaHY2DH/bF21rEdHt91dzxZeSNOjNWPTe9u+zBOvNEfT93TfGxX9TFX3jgR9XfCtX/MdZuj8m714InX4unC4x6JA6PV20cPxCPTX+vk+W6LbCp5fVvL12tqO8rrsW36a7WfwdSR57Ln/uzAzPNpO7ac7hjUsyuGqg966tje2NxyW9fWwzFevY/RQ1uiq/HrLa9rOsNs7MT/ju335cdMj0HpdRmME9MHTsb4iTei8kTP9H3N3OejsefgUMvP9UQMznoNa6/fsb0bY+39O2JgeOZ3Mh3/RuWJ/C2Ojbri3r7qz+fUeO2MuIIaX8v5/d4AAABwLjAGtdi491j2x+27lc2Ft8+Wj0EfjcRI9S/j94cORiV7m9Hu6H/z19kf7eNHnmt5u1FPbDsyVr1tKsaOD+THV2LgeP61I9ta/ljv5Piu2Hp4vPrX+VgcH6jkb3mqPpZXh6qP783Y2d1wv5v/Ot7KDj0eA5V03PaoDByPsTR8jOxve6ZT9863qt95Il57uuDMqUcORNqCZkaWTp/v/MageH1P9bbx7PkM9u+O3f0vxbbNzf+2SQdnBvX0Ha0+26k4trfh96Jra6SXOk6+HL0NI0hX7/54L40kkx/E8GB/7E6v68GjMXzq5/Fc/bh8DDo5MhKT+ePNflaVgXgv3efUSOx/YOY+s/t9+rUYnxiJoVdr95lew8H30zeaird2djccW3v9Jo69EyOTEzHyxuzjR/Y3P+ee6uOpvnLx6yN74rGvb4pNmx6K7/7P2lslR3/27dh059qZ4xfwewMAAMDiMwa1qP2NXv1DvH4Gx8fKh4j0B3Z/b9PZIWkE2ZVOKYmh2NUwwtTPJjn5cuvxXdH7crqz8Ti8dWZk6ez45+JI9Vv+9rWnG44rkj+2liEj6dk1VH02rQNDi/wMqplrJ83Ycuij6mN6Nyr5ENPp8533GDQ1FZMj/bOez5w6eptYTzY0xdSx2Js9r/roNhL9vY2PfXPsPZatIi1fb5GPQTFefR49zbd1bTmUjWkfHdrS9PX0Pbtan1v9TLahXQ0/h/z1i4k42tdyhlHXljhUu/PYMv31+2L/SPVrTWdyJT2x55etxy7w9wYAAIBFZwxqkv9R3DQ0fJz6GNQ8+NQ9kN14MvobzvJ4Lq01cxx/QVf1D/m0Jby+bXo46ez4/C1aJw/EN6eva1Rg495I50CltxLNuq17V/W7Ve8zve2q9bZpXfH0axPVg95qPtvogi2RbUHH9sbG/GudPt95j0ExGgceaT62rXwMmqtZbzHrqT6ubA/aG1/LBq6CATB/XWcPOS3yMaj4uPbPv1n+3JuuWZX/+6YRZ8bs12/u7zfr2AX/3gAAALDYjEFNFjAGnXo5egtunz0GFf3x3qj1/jo9Pr3l50j2lp3sbUoDe+KxP1rfckZOVf3MlHZ93BiRvx2saRjYejgmql8b2lU/O6Tzxz/vMWiO8WNO+Rg016eJPd5yfaWk+7kj2Qg0lQasordE5a/r0b42ZwUlbY/rZAzKX4+iMeho3+yfe9Wcr9+7lZZrInXHrrTuNL6u+eNu22k+bgAAABaHMahF7W/debxNbI6xo/MxqPWP9U6Pr8kuNjwwHB9kF/idiomRwdhxf8N1X/I/6o//bPYIMu3xe2aOL5SfhdQwImw93Hq20Hwe/zzHoDbfo1BHbxOr+1r86P+l7//bOPJswZCTv64f+ylhbY8rfv61C0inaw99OHNh6npNz73T1++C2Lz3WPYWr5FXvxsPbUrXDPp6fKf/nWz4arpOUv64F/Z7AwAAwGIyBrW4r3ZqUMOZLR9nnmPQHGcSzb690+NbdK2Pb+wYiOPZ1X3/JQ5syQeM/I/603+exTZnHyuWP7+upyN759jrjW/5ms/jbzdm5GerLMoY1BW9/SMxFeMxll7P8SPxXOtb3z6hMairtz9G0o8wv2jztx9Kg03yrfjpqeqxCxyD0qe9fePF4fhtuikr/7S3vnubzy46Q783AAAALB5jUKvNlUjzRtEFcou1HyKKrhmUnT3TwTV0Oj2+UM+eSNcCnji8tfb/9+2PNHsVXQC6I/kFjNOgkj7taqLgE8Y6f/ztxoz8mkSLMAbVB5ns0+E27410nejx6mNs+iS0/HU93WsGne4YVLvu0i9jT8vFpi+4oDdePhNjUE/15zg5EUd33N3+9+hM/d4AAACwaIxBs+SfElVt/K09cX+7izBnOh+D6tfaGT20peUP7/qna01U/45vOPOi0+OLdPXF0XRkfQyqf+pVjFf/bcsnTnWkO3bW1qDYm0afidfi6dYRrePHnw8+o4diS+snVmUf8Z46y2NQV2/UPvjscGzNH1PtrVWtr9/myE6WmhqKPXe3uW5Qh2NQ7fCj0dfyeqx94h+y13bBY1D2xY/i1Scb3kpY6Ez93gAAALBYjEFFuu6NXW+OVf/QrzY5HieGBuNgZXts390frw6ma7aMxbH99QFhHmPQ9NuNpmLs+EBUsmutVGLgeO17zjrbpKPjt8Xg+IkYerU/dtev4VJ93G+8Pxnp4873Nz6O/NOxqk8y3h86OH2/BweH4sT4ey2PeW71M4ImJuY6I6bT51t93fan46u3vVc/fnf0Dx6PscmReC+dnnMGx6C5LiC9/ZkH87NfumJL9nnsrR+Bn3/M+sTR6Gs4Y6d+BlFMvh9DByvZfe3ufzWGTvzfeKH+mnY4BtWGp8bXY3tUBtLrMRZj6We40DGoe2sM/Dp9h5bS7/8blXii8YykM/R7AwAAwOIwBs2pK+5+shKDw6eaLtY7NTEWH54Yiv+xtX4my3zGoKQr7n3mQLx9arz6J3V2z7VrtOy4P9Y2Hdfp8ffEtoHhODU2kY0HWdU/6E8NDzRfQLpu7f2xo3r86MTMEDA5fiqGB3bFg0Vv6yqUX0g62n20e6fPtyeeqLwRJ+ov/tREjJ2oXQS79pqeuTFozvL768o+Rr7ozKaqnl2R9qCpoV1Ng1bX3U9G/9sNvzvVxz86/Pextf6adjgGZa9H/9szP6eG1yO7ztVCxqCu3tj7i7GYHDseg/27Z8awNPAcPZ59Ml36OP2mTxo7I783AAAALAZjEGdA/tao0QPxSOHtnMseSUve1FDsmnU9opra+NbJJ+wBAABwLjMGsXD5NYHerTR8BDnnifsi+wC9NmdVbdx7LB3g7V8AAABLhDGIBeqJvqMTEVNvxU5vDzoP5R/V/9E/xBNFn57X1Rv92UeoDcSft94GAADAeckYxDx0x4PPpGvK7I7+N38d6cLQI/297T+SnHNW/ZpI2cWpv/1QbNq0KTZ9/bH4q8rBGMouPD4WR3xyGAAAwJJhDGIe7osX3qtdOHhqYjTe7n9i1qeBcX7peXhPDDRdLH0qJsZOxfBgJb5zz8d93DwAAADnE2MQAAAAQIkYgwAAAABKxBgEAAAAUCLGIAAAAIASMQYBAAAAlIgxCAAAAKBEjEEAAAAAJWIMAgAAACgRYxAAAABAiRiDAAAAAErEGAQAAABQIsYgAAAAgBIxBrW46aab4wd/ty/+aeid+OWxEwAAAABnVdok0jaRNoqi7WKhjEEN0oucXvCfvHIwPvjww5AkSZIkSZpvzz///LxUKpV48Uf7s43ikxiEjEEN0uqWhiBJkiRJkqSFload4eHheUuDUNoqijaMhTAGNUiLmzOCJEmSJEnSmWihY1A6QyhtFUUbxkIYgxqk9+VJkiRJkiSdiRY6BqV/n7aKog1jIYxBDYxBkiRJkiTpTGUMas8YJEmSJEmSllTGoPaMQZIkSZIkaUllDGrPGCRJkiRJkpZUxqD2jEGSJEmSJGlJZQxqzxgkSZIkSZKWVMag9oxBkiRJkiRpSWUMas8YJEmSJEmSllTGoPaW1Bj0i76vZY+v0fq7vhL3PLonXhud+5hmj8fL2ZGTcfIfd8YDv//lWJfftv6u/xj3PvHj+EV2e7v7qt+HJEmSJEk62xmD2lt6Y9BXvhuHf3UyRnJvHvhe/PFdG2Ld15+P96rHTP7mX6ZvG/nVYDz1lQ3x5WcHG772QUxUjxv76bfi33ZvjD/+q0PxZvb14Rj88c74s794OX6Vfbfi79d4H5IkSZIk6exnDGpv6Y1Bm3dOn7lTb/KlLdXH/Y3YdTL/wnTvxLbNG2Jj3zv5/8904LG74pY/3R9j+f8XNdf3kyRJkiRJi5cxqL1SjEHxyuPVx/3N2Ddr2TEGSZIkSZK01Godg1588cWm/29UdJsxqMX5NQZNxm/e/Xk89dUvxYb/9rOCYWfuMWjslcfj9u6N8Z/2Dc/5li9jkCRJkiRJ516NY9DRo0fjzjvvjO9973tNg0+SvpZuS8c0ft0Y1OKcH4Oqj6/JnV+N3r95PfLrR7c09xgUMRFHdz0UG+7YEOs23BcP9R2Kod9M5rfVKvx+yX85mB8hSZIkSZLOdq1nBhUNQnMNQYkxqEV64EVPaCHO6BjUekHnf34ptnzlS7H+a9+Pf27ecqq1G4NqTf7m/8Tf9z0WmzbcFbfcsSn+9IX3on43hd8v+cDloyVJkiRJWqxax6CkcRBqNwQlxqAW5/wYVPS2rdEX4r7uu+LhV1rXoI8fg6abPBWHn7kv1nX/SezMH+6c30+SJEmSJC1aRWNQUh+E2g1BiTGoxXk5BsXBeLj6uGePPh2MQanJn0Rv9X4efqX2v8YgSZIkSZLOveYag5I0ArUbghJjUIvzcgw6sSf+sPq4e19awJlBqfwMo0d/WvtfY5AkSZIkSede7cag02EManHOj0Et1/B553+9EI/+/l1xy11PxcBpXzPoeDz/rWfib37883iz4X7StYfWfXXn9LWHir5fzQdzfgKZJEmSJEn6ZDMGtbf0xqDq42vyxf8Q9zy6Jw6/P2sJqjbXGPR+vPIXD8aX7/rS9P2s2/CHce93XopfNqw8hd8v83i8nB8jSZIkSZLObsag9pbUGCRJkiRJkmQMas8YJEmSJEmSllTGoPaMQZIkSZIkaUllDGrPGCRJkiRJkpZUxqD2jEGSJEmSJGlJZQxqzxgkSZIkSZKWVMag9oxBkiRJkiRpSWUMas8YJEmSJEmSllTGoPaMQZIkSZIkaUllDGrvnBiD/mnonfjgww/zH5kkSZIkSdL8W+gYVKlUsq2iaMNYCGNQgx/83b74ySsH8x+ZJEmSJEnS/FvoGPTij/ZnW0XRhrEQxqAGN910c7a4pUHIGUKSJEmSJGkhpTFoPtIZQWkIShtF2iqKNoyFMAa1SC9yWt3SC57elwcAAABwNqVNIm0Tn8QQlBiDAAAAAErEGAQAAABQIsYgAAAAgBIxBgEAAACUiDEIAAAAoESMQQAAAAAlYgwCAAAAKBFjUJHLlsc1//Uzse6Ha+L2yg1x+7418YW+a+O6WwuOPVNWfjpu3nFlXF50GwAAAMAZYgxqdfUVceOeNbH+uSvjyn+9LC6sfu3CFRfHinuuiCuWFxx/hiz78qpYbwwCAAAAPmHGoBZX/vnquP3ZT8fFBbfVXBE3VlbFVVdfHr/732tnDt24sXbbxXdcGTd9/4ba2UQ/vD4++wcXZ2NS7d9dFFf9WcPZRg23X/rVVfF7P8jPQPrb1VVXx+/k/+6yP7gmfi//N93fvzZW37Esvz8AAACAzhmDmlwen9u3Oj7774tuq0tjUFes23l9rLmtduZQ9vU1K+Pze6tfW3dh9v/LblwRN/9wdfybnvq/WxaX33lpXHJZ7f+X3XF1rNu3Kq6qn220cVXc3nJm0IU918T6Pavimutq/7/8zqvj1n3XxXVrZo4BAAAA6IQxqNFNV8atletj9U0Ft01LY9ANcfO9zWfoXN57fXzh0UubvnbVk2tmfW1Gup+G71UwBl21dU3c/EeN3+fi6Oqrfu+mrwEAAACcPmNQo9Meg2Yfc9XW/O1hrbZeUTtm+UWx8oFVccvfronbfpDeCrYmutuOQZfE6h0F91d1a+8l+TEAAAAAnTEGNam9TWzmrV1F5h6D2o00K59YHeufXRGXr6h/7ePODKqNQfXrEQEAAACcCcagJsti1V+uifVPfepjLiA9ewz61H/uyi48fVHD12YUDDufWRmfbzsG1R7L3G8zAwAAAOicMajVTSvj1r1rYt2TK2LF9EfLXxSX3Lo8LsmOKR6DsgtI71sda+9dHhdlF4W+MC7+7KVxRXax52Vx7bM3xLotl8WydOxly+Pav1wdt+9ruJ90segfroprrs7/vyq7gHT1mBv+3UW1f7d8WSy/9dK4fOXMMQAAAACdMAYVuPC6y2L1M11x2978Oj3pI9/7roxPZbfPMQZVLVu3Im7MP27+9sqauO2vPxPXf6F224W3rGz52PnL4vptjfdzUaz6dld0p9v3XjP90fLLv/w78fn6v6u6re/quOoz9X8DAAAA0BljEAAAAECJGIMAAAAASsQYBAAAAFAixiAAAACAEjEGAQAAAJSIMQgAAACgRIxBAAAAACViDAIAAAAoEWMQAAAAQIkYgwAAAABKxBgEAAAAUCLGIAAAAIASMQYBAAAAlIgxCAAAAKBEjEEAAAAAJWIMAgAAACgRYxAAAABAiRiDAAAAAErEGAQAAABQIsYgAAAAgBIxBgEAAACUiDEIAAAAoESMQQAAAAAlYgwCAAAAKBFjEAAAAECJGIMAAAAASsQYBAAAAFAixiAAAACAEjEGAQAAAJSIMQgAAACgRIxBAAAAACViDAIAAAAoEWMQAAAAQIkYgwAAAABKxBgEAAAAUCLGIAAAAIASMQYBAAAAlIgxCAAAAKBEztsx6Ob1X4xly5YVPikAAAAAZktbStpUiraWs63jMeiGz90SV159beETAwAAAGC2tKWkTaVoaznbOh6DPr1iZbZkpSfhDCEAAACAuaXtJG0oaUtJm0rR1nK2dTwGJenBpzUrPZH0fjcAAAAAZkvbSdpQzpUhKJnXGAQAAADA+ckYBAAAAFAixiAAAACAEjEGAQAAAJTGpfH/AdqGpEfrZ7WBAAAAAElFTkSuQmCC"},628:function(A,t,e){A.exports=e.p+"assets/img/10.60d36a50.png"},629:function(A,t,e){A.exports=e.p+"assets/img/11.746ef9f1.png"},630:function(A,t,e){A.exports=e.p+"assets/img/12.761f7a03.png"},888:function(A,t,e){"use strict";e.r(t);var s=e(17),a=Object(s.a)({},(function(){var A=this,t=A._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[t("h2",{attrs:{id:"dollar-cost-averaging-automation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dollar-cost-averaging-automation"}},[A._v("#")]),A._v(" Dollar Cost Averaging Automation")]),A._v(" "),t("p",[A._v("This guide shows how to setup Transmuter to automate DCA Bitcoin purchases.")]),A._v(" "),t("h2",{attrs:{id:"why-use-transmuter-instead-of-dedicated-dca-services"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-use-transmuter-instead-of-dedicated-dca-services"}},[A._v("#")]),A._v(" Why use Transmuter instead of dedicated DCA services?")]),A._v(" "),t("p",[A._v("You get to configure everything specifically to your needs and there is no additional cost beyond the selected exchange's fees, which are usually lower than dedicated DCA providers.")]),A._v(" "),t("h2",{attrs:{id:"setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup"}},[A._v("#")]),A._v(" Setup")]),A._v(" "),t("ul",[t("li",[A._v('Create a new External Service of type "Exchange External Service"\n'),t("img",{attrs:{src:e(619),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(620),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(621),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Configure it with the API keys from your exchange account.\n"),t("img",{attrs:{src:e(622),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(623),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(624),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(625),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("In Transmuter, create a Preset > Dollar Cost Average.\n"),t("img",{attrs:{src:e(626),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Select the configured exchange account\n"),t("img",{attrs:{src:e(627),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Set how often to DCA\n"),t("img",{attrs:{src:e(628),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Set the exchange order book and the amount to DCA with on each trade\n"),t("img",{attrs:{src:e(629),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Create, confirm and enable the newly generated recipe!\n"),t("img",{attrs:{src:e(630),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[23],{611:function(A,t,e){A.exports=e.p+"assets/img/1.1317fcf2.png"},612:function(A,t,e){A.exports=e.p+"assets/img/2.00f4500f.png"},613:function(A,t,e){A.exports=e.p+"assets/img/3.3c4c0b97.png"},614:function(A,t,e){A.exports=e.p+"assets/img/4.21661a93.png"},615:function(A,t,e){A.exports=e.p+"assets/img/5.9bc4d4fd.png"},616:function(A,t,e){A.exports=e.p+"assets/img/6.05eb51af.png"},617:function(A,t,e){A.exports=e.p+"assets/img/7.683a8418.png"},618:function(A,t,e){A.exports=e.p+"assets/img/8.64846216.png"},619:function(A,t){A.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABIMAAACsCAYAAADovmwHAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAABduSURBVHhe7d3/c131fefx/VvAYL4lNgUMQTbbTTAE6hgxbLCWzYR13eCmS0qYsqEayMLWC2zDOIEW6MSZ0dpu49pJsedCvBNBih1PusIpI+8OmBaUDSsbvIpxI0DRjCbSzHvv59xzpXuvji6+krFsncdz5jEDusdX917pF73m3HP/1aWXXhoAAAAAlIMxCAAAAKBEjEEAAAAAJWIMAgAAACgRYxAAAABAiRiDAAAAAErEGAQAAABQIsYgAAAAgBIxBgEAAACUiDEIAAAAoESMQQAAAAAlYgwCAAAAKBFjEAAAAECJGIMAAAAASmReY9CnV6yMGz53S9y8/otxS/cGAAAAAAqk7SRtKGlLKdpYFkPHY1B68OmJXHn1tbFs2bK44IILAAAAACiQtpO0oaQt5VwZhDoeg9KalZ5E0RMEAAAAYLa0paRNpWhrOds6HoPSkuWMIAAAAIDTl7aUtKkUbS1nW8djUHq/W9GTAgAAAGBuaVMp2lrONmMQAAAAwFlgDAIAAAAoEWMQAAAAQIkYgwAAAABKxBgEAAAAUCLGIAAAAIASMQYBAAAAlIgxCAAAAKBEjEEAAAAAJWIMAgAAACgRYxAAAABAiRiDAAAAAErEGAQAAABQIsYgAAAAgBIxBgEAAACUiDEIAAAAoESMQQAAAAAlYgwCAAAAKBFjEAAAAECJGIMAAAAASsQYtGAPRP/JiDjZHw8U3g4Ftr1e/aWJeH1bwW0AAADwCTIGtbH2/u9G/+BwnBqfzP5wz5ocjw9PDMXBPQ9HT3acMei89UB/pB/dnH2SP1NjEAAAAIvEGFRobXyz/73IJqCpiRgdPhqv9u+O7ZWDMXh0OEYnpmLqrZ3RnR1rDDpv5WPQR0dfjO3bt8/2zIP5z/gTYAwCAABgkRiDCjywfySmqn+oT40ciifv7io4Zm2sXVv/b2PQeSsfg072P1B8+yfJGAQAAMAiMQa16t4Zb6UlaPxwbO0quH2WmTGo9+4no//t0ZhI/77a1MRoDA/0xb2F97M27t8xEMOjE9nwVD06JkaHY2DH/bF21rEdHt91dzxZeSNOjNWPTe9u+zBOvNEfT93TfGxX9TFX3jgR9XfCtX/MdZuj8m714InX4unC4x6JA6PV20cPxCPTX+vk+W6LbCp5fVvL12tqO8rrsW36a7WfwdSR57Ln/uzAzPNpO7ac7hjUsyuGqg966tje2NxyW9fWwzFevY/RQ1uiq/HrLa9rOsNs7MT/ju335cdMj0HpdRmME9MHTsb4iTei8kTP9H3N3OejsefgUMvP9UQMznoNa6/fsb0bY+39O2JgeOZ3Mh3/RuWJ/C2Ojbri3r7qz+fUeO2MuIIaX8v5/d4AAABwLjAGtdi491j2x+27lc2Ft8+Wj0EfjcRI9S/j94cORiV7m9Hu6H/z19kf7eNHnmt5u1FPbDsyVr1tKsaOD+THV2LgeP61I9ta/ljv5Piu2Hp4vPrX+VgcH6jkb3mqPpZXh6qP783Y2d1wv5v/Ot7KDj0eA5V03PaoDByPsTR8jOxve6ZT9863qt95Il57uuDMqUcORNqCZkaWTp/v/MageH1P9bbx7PkM9u+O3f0vxbbNzf+2SQdnBvX0Ha0+26k4trfh96Jra6SXOk6+HL0NI0hX7/54L40kkx/E8GB/7E6v68GjMXzq5/Fc/bh8DDo5MhKT+ePNflaVgXgv3efUSOx/YOY+s/t9+rUYnxiJoVdr95lew8H30zeaird2djccW3v9Jo69EyOTEzHyxuzjR/Y3P+ee6uOpvnLx6yN74rGvb4pNmx6K7/7P2lslR3/27dh059qZ4xfwewMAAMDiMwa1qP2NXv1DvH4Gx8fKh4j0B3Z/b9PZIWkE2ZVOKYmh2NUwwtTPJjn5cuvxXdH7crqz8Ti8dWZk6ez45+JI9Vv+9rWnG44rkj+2liEj6dk1VH02rQNDi/wMqplrJ83Ycuij6mN6Nyr5ENPp8533GDQ1FZMj/bOez5w6eptYTzY0xdSx2Js9r/roNhL9vY2PfXPsPZatIi1fb5GPQTFefR49zbd1bTmUjWkfHdrS9PX0Pbtan1v9TLahXQ0/h/z1i4k42tdyhlHXljhUu/PYMv31+2L/SPVrTWdyJT2x55etxy7w9wYAAIBFZwxqkv9R3DQ0fJz6GNQ8+NQ9kN14MvobzvJ4Lq01cxx/QVf1D/m0Jby+bXo46ez4/C1aJw/EN6eva1Rg495I50CltxLNuq17V/W7Ve8zve2q9bZpXfH0axPVg95qPtvogi2RbUHH9sbG/GudPt95j0ExGgceaT62rXwMmqtZbzHrqT6ubA/aG1/LBq6CATB/XWcPOS3yMaj4uPbPv1n+3JuuWZX/+6YRZ8bs12/u7zfr2AX/3gAAALDYjEFNFjAGnXo5egtunz0GFf3x3qj1/jo9Pr3l50j2lp3sbUoDe+KxP1rfckZOVf3MlHZ93BiRvx2saRjYejgmql8b2lU/O6Tzxz/vMWiO8WNO+Rg016eJPd5yfaWk+7kj2Qg0lQasordE5a/r0b42ZwUlbY/rZAzKX4+iMeho3+yfe9Wcr9+7lZZrInXHrrTuNL6u+eNu22k+bgAAABaHMahF7W/debxNbI6xo/MxqPWP9U6Pr8kuNjwwHB9kF/idiomRwdhxf8N1X/I/6o//bPYIMu3xe2aOL5SfhdQwImw93Hq20Hwe/zzHoDbfo1BHbxOr+1r86P+l7//bOPJswZCTv64f+ylhbY8rfv61C0inaw99OHNh6npNz73T1++C2Lz3WPYWr5FXvxsPbUrXDPp6fKf/nWz4arpOUv64F/Z7AwAAwGIyBrW4r3ZqUMOZLR9nnmPQHGcSzb690+NbdK2Pb+wYiOPZ1X3/JQ5syQeM/I/603+exTZnHyuWP7+upyN759jrjW/5ms/jbzdm5GerLMoY1BW9/SMxFeMxll7P8SPxXOtb3z6hMairtz9G0o8wv2jztx9Kg03yrfjpqeqxCxyD0qe9fePF4fhtuikr/7S3vnubzy46Q783AAAALB5jUKvNlUjzRtEFcou1HyKKrhmUnT3TwTV0Oj2+UM+eSNcCnji8tfb/9+2PNHsVXQC6I/kFjNOgkj7taqLgE8Y6f/ztxoz8mkSLMAbVB5ns0+E27410nejx6mNs+iS0/HU93WsGne4YVLvu0i9jT8vFpi+4oDdePhNjUE/15zg5EUd33N3+9+hM/d4AAACwaIxBs+SfElVt/K09cX+7izBnOh+D6tfaGT20peUP7/qna01U/45vOPOi0+OLdPXF0XRkfQyqf+pVjFf/bcsnTnWkO3bW1qDYm0afidfi6dYRrePHnw8+o4diS+snVmUf8Z46y2NQV2/UPvjscGzNH1PtrVWtr9/myE6WmhqKPXe3uW5Qh2NQ7fCj0dfyeqx94h+y13bBY1D2xY/i1Scb3kpY6Ez93gAAALBYjEFFuu6NXW+OVf/QrzY5HieGBuNgZXts390frw6ma7aMxbH99QFhHmPQ9NuNpmLs+EBUsmutVGLgeO17zjrbpKPjt8Xg+IkYerU/dtev4VJ93G+8Pxnp4873Nz6O/NOxqk8y3h86OH2/BweH4sT4ey2PeW71M4ImJuY6I6bT51t93fan46u3vVc/fnf0Dx6PscmReC+dnnMGx6C5LiC9/ZkH87NfumJL9nnsrR+Bn3/M+sTR6Gs4Y6d+BlFMvh9DByvZfe3ufzWGTvzfeKH+mnY4BtWGp8bXY3tUBtLrMRZj6We40DGoe2sM/Dp9h5bS7/8blXii8YykM/R7AwAAwOIwBs2pK+5+shKDw6eaLtY7NTEWH54Yiv+xtX4my3zGoKQr7n3mQLx9arz6J3V2z7VrtOy4P9Y2Hdfp8ffEtoHhODU2kY0HWdU/6E8NDzRfQLpu7f2xo3r86MTMEDA5fiqGB3bFg0Vv6yqUX0g62n20e6fPtyeeqLwRJ+ov/tREjJ2oXQS79pqeuTFozvL768o+Rr7ozKaqnl2R9qCpoV1Ng1bX3U9G/9sNvzvVxz86/Pextf6adjgGZa9H/9szP6eG1yO7ztVCxqCu3tj7i7GYHDseg/27Z8awNPAcPZ59Ml36OP2mTxo7I783AAAALAZjEGdA/tao0QPxSOHtnMseSUve1FDsmnU9opra+NbJJ+wBAABwLjMGsXD5NYHerTR8BDnnifsi+wC9NmdVbdx7LB3g7V8AAABLhDGIBeqJvqMTEVNvxU5vDzoP5R/V/9E/xBNFn57X1Rv92UeoDcSft94GAADAeckYxDx0x4PPpGvK7I7+N38d6cLQI/297T+SnHNW/ZpI2cWpv/1QbNq0KTZ9/bH4q8rBGMouPD4WR3xyGAAAwJJhDGIe7osX3qtdOHhqYjTe7n9i1qeBcX7peXhPDDRdLH0qJsZOxfBgJb5zz8d93DwAAADnE2MQAAAAQIkYgwAAAABKxBgEAAAAUCLGIAAAAIASMQYBAAAAlIgxCAAAAKBEjEEAAAAAJWIMAgAAACgRYxAAAABAiRiDAAAAAErEGAQAAABQIsYgAAAAgBIxBrW46aab4wd/ty/+aeid+OWxEwAAAABnVdok0jaRNoqi7WKhjEEN0oucXvCfvHIwPvjww5AkSZIkSZpvzz///LxUKpV48Uf7s43ikxiEjEEN0uqWhiBJkiRJkqSFload4eHheUuDUNoqijaMhTAGNUiLmzOCJEmSJEnSmWihY1A6QyhtFUUbxkIYgxqk9+VJkiRJkiSdiRY6BqV/n7aKog1jIYxBDYxBkiRJkiTpTGUMas8YJEmSJEmSllTGoPaMQZIkSZIkaUllDGrPGCRJkiRJkpZUxqD2jEGSJEmSJGlJZQxqzxgkSZIkSZKWVMag9oxBkiRJkiRpSWUMas8YJEmSJEmSllTGoPaW1Bj0i76vZY+v0fq7vhL3PLonXhud+5hmj8fL2ZGTcfIfd8YDv//lWJfftv6u/xj3PvHj+EV2e7v7qt+HJEmSJEk62xmD2lt6Y9BXvhuHf3UyRnJvHvhe/PFdG2Ld15+P96rHTP7mX6ZvG/nVYDz1lQ3x5WcHG772QUxUjxv76bfi33ZvjD/+q0PxZvb14Rj88c74s794OX6Vfbfi79d4H5IkSZIk6exnDGpv6Y1Bm3dOn7lTb/KlLdXH/Y3YdTL/wnTvxLbNG2Jj3zv5/8904LG74pY/3R9j+f8XNdf3kyRJkiRJi5cxqL1SjEHxyuPVx/3N2Ddr2TEGSZIkSZK01Godg1588cWm/29UdJsxqMX5NQZNxm/e/Xk89dUvxYb/9rOCYWfuMWjslcfj9u6N8Z/2Dc/5li9jkCRJkiRJ516NY9DRo0fjzjvvjO9973tNg0+SvpZuS8c0ft0Y1OKcH4Oqj6/JnV+N3r95PfLrR7c09xgUMRFHdz0UG+7YEOs23BcP9R2Kod9M5rfVKvx+yX85mB8hSZIkSZLOdq1nBhUNQnMNQYkxqEV64EVPaCHO6BjUekHnf34ptnzlS7H+a9+Pf27ecqq1G4NqTf7m/8Tf9z0WmzbcFbfcsSn+9IX3on43hd8v+cDloyVJkiRJWqxax6CkcRBqNwQlxqAW5/wYVPS2rdEX4r7uu+LhV1rXoI8fg6abPBWHn7kv1nX/SezMH+6c30+SJEmSJC1aRWNQUh+E2g1BiTGoxXk5BsXBeLj6uGePPh2MQanJn0Rv9X4efqX2v8YgSZIkSZLOveYag5I0ArUbghJjUIvzcgw6sSf+sPq4e19awJlBqfwMo0d/WvtfY5AkSZIkSede7cag02EManHOj0Et1/B553+9EI/+/l1xy11PxcBpXzPoeDz/rWfib37883iz4X7StYfWfXXn9LWHir5fzQdzfgKZJEmSJEn6ZDMGtbf0xqDq42vyxf8Q9zy6Jw6/P2sJqjbXGPR+vPIXD8aX7/rS9P2s2/CHce93XopfNqw8hd8v83i8nB8jSZIkSZLObsag9pbUGCRJkiRJkmQMas8YJEmSJEmSllTGoPaMQZIkSZIkaUllDGrPGCRJkiRJkpZUxqD2jEGSJEmSJGlJZQxqzxgkSZIkSZKWVMag9oxBkiRJkiRpSWUMas8YJEmSJEmSllTGoPaMQZIkSZIkaUllDGrvnBiD/mnonfjgww/zH5kkSZIkSdL8W+gYVKlUsq2iaMNYCGNQgx/83b74ySsH8x+ZJEmSJEnS/FvoGPTij/ZnW0XRhrEQxqAGN910c7a4pUHIGUKSJEmSJGkhpTFoPtIZQWkIShtF2iqKNoyFMAa1SC9yWt3SC57elwcAAABwNqVNIm0Tn8QQlBiDAAAAAErEGAQAAABQIsYgAAAAgBIxBgEAAACUiDEIAAAAoESMQQAAAAAlYgwCAAAAKBFjUJHLlsc1//Uzse6Ha+L2yg1x+7418YW+a+O6WwuOPVNWfjpu3nFlXF50GwAAAMAZYgxqdfUVceOeNbH+uSvjyn+9LC6sfu3CFRfHinuuiCuWFxx/hiz78qpYbwwCAAAAPmHGoBZX/vnquP3ZT8fFBbfVXBE3VlbFVVdfHr/732tnDt24sXbbxXdcGTd9/4ba2UQ/vD4++wcXZ2NS7d9dFFf9WcPZRg23X/rVVfF7P8jPQPrb1VVXx+/k/+6yP7gmfi//N93fvzZW37Esvz8AAACAzhmDmlwen9u3Oj7774tuq0tjUFes23l9rLmtduZQ9vU1K+Pze6tfW3dh9v/LblwRN/9wdfybnvq/WxaX33lpXHJZ7f+X3XF1rNu3Kq6qn220cVXc3nJm0IU918T6Pavimutq/7/8zqvj1n3XxXVrZo4BAAAA6IQxqNFNV8atletj9U0Ft01LY9ANcfO9zWfoXN57fXzh0UubvnbVk2tmfW1Gup+G71UwBl21dU3c/EeN3+fi6Oqrfu+mrwEAAACcPmNQo9Meg2Yfc9XW/O1hrbZeUTtm+UWx8oFVccvfronbfpDeCrYmutuOQZfE6h0F91d1a+8l+TEAAAAAnTEGNam9TWzmrV1F5h6D2o00K59YHeufXRGXr6h/7ePODKqNQfXrEQEAAACcCcagJsti1V+uifVPfepjLiA9ewz61H/uyi48fVHD12YUDDufWRmfbzsG1R7L3G8zAwAAAOicMajVTSvj1r1rYt2TK2LF9EfLXxSX3Lo8LsmOKR6DsgtI71sda+9dHhdlF4W+MC7+7KVxRXax52Vx7bM3xLotl8WydOxly+Pav1wdt+9ruJ90segfroprrs7/vyq7gHT1mBv+3UW1f7d8WSy/9dK4fOXMMQAAAACdMAYVuPC6y2L1M11x2978Oj3pI9/7roxPZbfPMQZVLVu3Im7MP27+9sqauO2vPxPXf6F224W3rGz52PnL4vptjfdzUaz6dld0p9v3XjP90fLLv/w78fn6v6u6re/quOoz9X8DAAAA0BljEAAAAECJGIMAAAAASsQYBAAAAFAixiAAAACAEjEGAQAAAJSIMQgAAACgRIxBAAAAACViDAIAAAAoEWMQAAAAQIkYgwAAAABKxBgEAAAAUCLGIAAAAIASMQYBAAAAlIgxCAAAAKBEjEEAAAAAJWIMAgAAACgRYxAAAABAiRiDAAAAAErEGAQAAABQIsYgAAAAgBIxBgEAAACUiDEIAAAAoESMQQAAAAAlYgwCAAAAKBFjEAAAAECJGIMAAAAASsQYBAAAAFAixiAAAACAEjEGAQAAAJSIMQgAAACgRIxBAAAAACViDAIAAAAoEWMQAAAAQIkYgwAAAABKxBgEAAAAUCLGIAAAAIASMQYBAAAAlIgxCAAAAKBEztsx6Ob1X4xly5YVPikAAAAAZktbStpUiraWs63jMeiGz90SV159beETAwAAAGC2tKWkTaVoaznbOh6DPr1iZbZkpSfhDCEAAACAuaXtJG0oaUtJm0rR1nK2dTwGJenBpzUrPZH0fjcAAAAAZkvbSdpQzpUhKJnXGAQAAADA+ckYBAAAAFAixiAAAACAEjEGAQAAAJTGpfH/AdqGpEfrZ7WBAAAAAElFTkSuQmCC"},620:function(A,t,e){A.exports=e.p+"assets/img/10.60d36a50.png"},621:function(A,t,e){A.exports=e.p+"assets/img/11.746ef9f1.png"},622:function(A,t,e){A.exports=e.p+"assets/img/12.761f7a03.png"},887:function(A,t,e){"use strict";e.r(t);var s=e(17),a=Object(s.a)({},(function(){var A=this,t=A._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[t("h2",{attrs:{id:"dollar-cost-averaging-automation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dollar-cost-averaging-automation"}},[A._v("#")]),A._v(" Dollar Cost Averaging Automation")]),A._v(" "),t("p",[A._v("This guide shows how to setup Transmuter to automate DCA Bitcoin purchases.")]),A._v(" "),t("h2",{attrs:{id:"why-use-transmuter-instead-of-dedicated-dca-services"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-use-transmuter-instead-of-dedicated-dca-services"}},[A._v("#")]),A._v(" Why use Transmuter instead of dedicated DCA services?")]),A._v(" "),t("p",[A._v("You get to configure everything specifically to your needs and there is no additional cost beyond the selected exchange's fees, which are usually lower than dedicated DCA providers.")]),A._v(" "),t("h2",{attrs:{id:"setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup"}},[A._v("#")]),A._v(" Setup")]),A._v(" "),t("ul",[t("li",[A._v('Create a new External Service of type "Exchange External Service"\n'),t("img",{attrs:{src:e(611),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(612),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(613),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Configure it with the API keys from your exchange account.\n"),t("img",{attrs:{src:e(614),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(615),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(616),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}}),A._v(" "),t("img",{attrs:{src:e(617),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("In Transmuter, create a Preset > Dollar Cost Average.\n"),t("img",{attrs:{src:e(618),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Select the configured exchange account\n"),t("img",{attrs:{src:e(619),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Set how often to DCA\n"),t("img",{attrs:{src:e(620),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Set the exchange order book and the amount to DCA with on each trade\n"),t("img",{attrs:{src:e(621),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})]),A._v(" "),t("li",[A._v("Create, confirm and enable the newly generated recipe!\n"),t("img",{attrs:{src:e(622),alt:"./DCA_assets/1.png",title:"./DCA_assets/1.png"}})])])])}),[],!1,null,null,null);t.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/24.3eabf55c.js b/assets/js/24.d26a9dd2.js similarity index 88% rename from assets/js/24.3eabf55c.js rename to assets/js/24.d26a9dd2.js index 68ac64b8bd..c647e123dc 100644 --- a/assets/js/24.3eabf55c.js +++ b/assets/js/24.d26a9dd2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{667:function(e,t,o){e.exports=o.p+"assets/img/img_1.6bc7d880.png"},668:function(e,t,o){e.exports=o.p+"assets/img/img_2.9f8b0cc3.png"},669:function(e,t,o){e.exports=o.p+"assets/img/img_3.2595db17.png"},670:function(e,t,o){e.exports=o.p+"assets/img/coinselection.4c853f71.png"},671:function(e,t,o){e.exports=o.p+"assets/img/img.9710314c.png"},672:function(e,t,o){e.exports=o.p+"assets/img/img_4.c8000fea.png"},673:function(e,t,o){e.exports=o.p+"assets/img/scientist_mode.66645705.png"},674:function(e,t,o){e.exports=o.p+"assets/img/img_5.a8ef891b.png"},675:function(e,t,o){e.exports=o.p+"assets/img/img_6.745de6b7.png"},676:function(e,t,o){e.exports=o.p+"assets/img/img_7.0d3fb434.png"},677:function(e,t,o){e.exports=o.p+"assets/img/img_8.34595a5a.png"},678:function(e,t,o){e.exports=o.p+"assets/img/img_9.6da23178.png"},899:function(e,t,o){"use strict";o.r(t);var i=o(17),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"the-btcpay-server-coinjoin-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-btcpay-server-coinjoin-plugin"}},[e._v("#")]),e._v(" The BTCPay Server Coinjoin plugin")]),e._v(" "),t("p",[e._v("This plugin allows every BTCPay Server instance to integrate with the Wabisabi coinjoin protocol developed by "),t("a",{attrs:{href:"https://zksnacks.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("zkSNACKS"),t("OutboundLink")],1),e._v(" ("),t("a",{attrs:{href:"https://wasabiwallet.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Wallet"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("p",{attrs:{align:"center"}},[t("a",{attrs:{href:"http://www.youtube.com/watch?feature=player_embedded&v=zGVCrwMKKn0\n",target:"_blank"}},[t("img",{attrs:{src:"http://img.youtube.com/vi/zGVCrwMKKn0/0.jpg",border:"10"}})])]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("p",[e._v("First ensure that your BTCPay Server instance is at least version 1.8.0 and that NBXplorer is at least 2.3.58. If you are using the recommended Docker deployment method, it is as simple as "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-update-btcpay-server"}},[e._v("one-click")]),e._v(".")],1),e._v(" "),t("p",[e._v('Then, you will need to log in as an admin, click on "Manage plugins" in the side navigation, and click on "Install" on the "Coinjoin" plugin in the list. BTCPay Server will then ask you to restart in order to load the plugin.')]),e._v(" "),t("p",[e._v('After the restart, there should be a new navigation item in the side navigation, "Coinjoin", and the dashboard should have additional elements related to coinjoins.\n'),t("img",{attrs:{src:o(667),alt:"./img_1.png",title:"./img_1.png"}})]),e._v(" "),t("h2",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("p",[e._v("Your store needs to have a Bitcoin wallet configured and it needs to be set up as a "),t("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[e._v("hot wallet")]),e._v(". Only native segwit (and potentially taproot) wallets will be able to join coinjoin rounds.")],1),e._v(" "),t("p",[e._v('The easiest way to get started is to click on "Coinjoin" in the side navigation, choose the default "zkSNACKS" coordinator and click "save". BTCPay Server will automatically join coinjoin rounds and progress to enhancing the privacy of your wallet.\n'),t("img",{attrs:{src:o(668),alt:"./img_2.png",title:"./img_2.png"}}),e._v('\nCoinjoin transactions will appear in the transactions list in your wallet as they happen, and will have at least 2 labels, "coinjoin", and the name of the coordinator.\n'),t("img",{attrs:{src:o(669),alt:"./img_3.png",title:"./img_3.png"}})]),e._v(" "),t("h2",{attrs:{id:"spending-privately"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#spending-privately"}},[e._v("#")]),e._v(" Spending privately")]),e._v(" "),t("p",[e._v('Coins which have gained some level of privacy will have an "anonset" label when using the BTCPay wallet coin selection feature. If you hover over the label, it will tell you the score it has gained.')]),e._v(" "),t("figure",[t("img",{attrs:{src:o(670),alt:"./coinselection.png",title:"./coinselection.png"}})]),e._v(" "),t("p",[e._v("It is up to you to use the coin selection feature correctly to make the best of your earned privacy on your coins.")]),e._v(" "),t("p",[e._v("Ideally you:")]),e._v(" "),t("ul",[t("li",[e._v("select the least amount of coins possible")]),e._v(" "),t("li",[e._v("select the highest level of privacy coins")]),e._v(" "),t("li",[e._v("ideally use coins from different transactions")]),e._v(" "),t("li",[e._v("spend entire coins to prevent change")])]),e._v(" "),t("p",[e._v("We realize this is a complex selection and are working on an easier UI to help with this. As an initial experiment, we have added an action to let us attempt to select coins based on your sending amounts.\n"),t("img",{attrs:{src:o(671),alt:"./img.png",title:"./img.png"}})]),e._v(" "),t("p",[e._v("But the best way to spend privately is to use our unique "),t("strong",[e._v("payment batching feature")]),e._v(", by utilizing BTCPay Server's "),t("RouterLink",{attrs:{to:"/Payouts/"}},[e._v("Payout")]),e._v(' system. Simply set the destination and amount and click on "Schedule transaction", and the payment will be embedded directly inside the next coinjoin that can fulfill it.\n'),t("img",{attrs:{src:o(672),alt:"./img_4.png",title:"./img_4.png"}})],1),e._v(" "),t("h2",{attrs:{id:"pleb-mode-vs-scientist-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pleb-mode-vs-scientist-mode"}},[e._v("#")]),e._v(" Pleb mode vs Scientist mode")]),e._v(" "),t("p",[e._v("Pleb mode comes with a curated set of configurations aimed to get you off the ground with coinjoining. Scientist mode is for those who want to experiment with different configurations and fine tune their coinjoin experience.")]),e._v(" "),t("p",[e._v("Scientist mode allows you to configure the following:")]),e._v(" "),t("ul",[t("li",[e._v("Anonscore target: What level of privacy you want to achieve. The higher the number, the more privacy you will gain, but the longer (and more expensive due to mining fees) it will take to achieve it. The pleb mode default is 5.")]),e._v(" "),t("li",[e._v("Coinsolidations: When this is turned on, the plugin will attempt to add many coins in comparison to usual. The maximum number of coins that can be added by this plugin is a random number computed for each round between 10 and 30. When coinsolidation mode is on, the likelihood to keep adding coins to the max number is probabilistic change of 90%, else it is current number of coins divided by the max number of coins. The pleb mode default is off.")]),e._v(" "),t("li",[e._v("Batched payments: When this is turned on, the plugin will attempt to batch BTC on-chain Payouts that are in the "),t("code",[e._v("AwaitingPayment")]),e._v(" state. Please note that if the coordinator you are connected to does not allow creating outputs of the payout's address format ( such as a non segwit or taproot address), these payments will not be processed. The pleb mode default is on.")]),e._v(" "),t("li",[e._v("Cross mixing: Cross mixing allows you to mix your coins across multiple coordinators in parallel, bringing you the privacy benefits of multiple coordinator liquidity pools. The default option is "),t("code",[e._v("When Free")]),e._v(" (pleb mode default), which means it will only remix coins on different coordinators if they are below the free threshold and will not be charged a coordinator fee. The other option is "),t("code",[e._v("Always")]),e._v(", which will mix coins across coordinators regardless of the fee. The last option is "),t("code",[e._v("Never")]),e._v(", which will not mix coins across coordinators.")]),e._v(" "),t("li",[e._v("Continuous coinjoins: When this is turned on, the plugin will attempt to join coinjoins even if all your coins are private. The chance to join is a random chance as defined by the value divided by 100 and then as a percentage. This means that if you enter "),t("code",[e._v("100")]),e._v(", there is a 1% chance of coinjoining every round. The pleb mode default is 0.")]),e._v(" "),t("li",[e._v("Send to other wallet: If you have other stores configured with an onchain wallet, with the same address format type, you can choose to send your coinjoin outputs to that wallet. This is useful if you want to keep your privacy gains separate from your main wallet, and can even send them directly to a hardware wallet! The pleb mode default is off.")]),e._v(" "),t("li",[e._v("Label coin selection: You are able to specify which labels will allow or disallow coins from joining coinjoins. If you exclude labels A,B, and C, then coins with those labels will not be used in coinjoins. If you include labels D, E, and F, then only coins with either of those labels will be used in coinjoins.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(673),alt:"./img_4.png",title:"./img_4.png"}})]),e._v(" "),t("h2",{attrs:{id:"additional-coordinators"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-coordinators"}},[e._v("#")]),e._v(" Additional Coordinators")]),e._v(" "),t("p",[e._v("We realize that the weakest link in these coinjoin protocols is the centralized coordinator aspect, and so have opted to support multiple coordinators, in parallel, from the get-go. You can discover additional coordinators over Nostr, or you can add a coordinator manually by using the link at the bottom.\n"),t("img",{attrs:{src:o(674),alt:"./img_5.png",title:"./img_5.png"}})]),e._v(" "),t("p",[e._v('Please be cautious as some coordinators may be malicious in nature. Once a coordinator has been added and a coinjoin round has been discovered, you can click on "Coordinator Config" to see what their fees and round requirements are set to, but be aware that a coordinator can change these at will. The plugin tracks if the minimum inputs per round, the coordination fee or the free threshold has changed and will not join rounds that are worse off than the one visible when you enabled the coordinator. You can accept the new terms by clicking on "Accept new terms" and the plugin will join rounds using the new parameters.')]),e._v(" "),t("figure",[t("img",{attrs:{src:o(675),alt:"./img_6.png",title:"./img_6.png"}})]),e._v(" "),t("p",[e._v("Ideally, the minimum number of inputs is 50 and the fee is below 1% (the default is 0.3%).")]),e._v(" "),t("h2",{attrs:{id:"running-a-coordinator"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#running-a-coordinator"}},[e._v("#")]),e._v(" Running a coordinator")]),e._v(" "),t("p",[e._v('In the spirit of "be the change you want to see in the world", this plugin ships with the ability to run your own coordinator (and publish it over Nostr for discoverability). This feature is still considered experimental, and may have '),t("a",{attrs:{href:"https://bitcoinmagazine.com/technical/is-bitcoin-next-after-tornado-cash",target:"_blank",rel:"noopener noreferrer"}},[e._v("legal repercussions for operating a coordinator"),t("OutboundLink")],1),e._v(".\n"),t("img",{attrs:{src:o(676),alt:"./img_7.png",title:"./img_7.png"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:o(677),alt:"./img_8.png",title:"./img_8.png"}})]),e._v(" "),t("p",[e._v("By default, the coordinator is configured to donate its generated fees to the "),t("a",{attrs:{href:"https://hrf.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("human rights foundation"),t("OutboundLink")],1),e._v(", and "),t("a",{attrs:{href:"https://opensats.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("opensats"),t("OutboundLink")],1),e._v(", along with a hardcoded plugin development fee split to continue expanding and maintaining the plugin. You can configure these using the "),t("code",[e._v("CoordinatorSplits")]),e._v(" json key.\nThe format is as follows:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('[\n {\n "Ratio": 1.0,\n "Type": "hrf"\n },\n {\n "Ratio": 1.0,\n "Type": "opensats",\n "Value": "btcpayserver"\n }\n]\n')])])]),t("ul",[t("li",[e._v("If Type is "),t("code",[e._v("hrf")]),e._v(", the value of the fee equivalent to its ratio will be donated to the human rights foundation.")]),e._v(" "),t("li",[e._v("If Type is "),t("code",[e._v("opensats")]),e._v(", you must specify which project on its website will receive the value of the fee equivalent to its ratio. Available projects values are the file names listed "),t("a",{attrs:{href:"https://github.com/OpenSats/website/tree/master/./projects",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("If Type is "),t("code",[e._v("btcpaybutton")]),e._v(", you must specify a url to a BTCPay Server instance store's "),t("RouterLink",{attrs:{to:"/Apps/#payment-button"}},[e._v("payment button")]),e._v(". This must be enabled. The value usually looks as follows: "),t("code",[e._v("https://yourbtcpayserver.com/api/v1/invoices?storeId=yourstoreId¤cy=BTC")])],1),e._v(" "),t("li",[e._v("If Type is "),t("code",[e._v("btcpaypos")]),e._v(", you must specify a url to a BTCPay Server instance store's "),t("RouterLink",{attrs:{to:"/Apps/#point-of-sale-app"}},[e._v("point of sale")]),e._v(". The "),t("code",[e._v("Custom payments")]),e._v(" option must be enabled. The value usually looks as follows: "),t("code",[e._v("https://yourbtcpayserver.com/apps/appid/pos")])],1)]),e._v(" "),t("p",[e._v("One enabled, the local coordinator appears in the coinjoin configuration of your store, and, if you configures the nostr settings, published to a relay so that others may discover the coordinator.\n"),t("img",{attrs:{src:o(678),alt:"./img_9.png",title:"./img_9.png"}})])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{647:function(e,t,o){e.exports=o.p+"assets/img/img_1.6bc7d880.png"},648:function(e,t,o){e.exports=o.p+"assets/img/img_2.9f8b0cc3.png"},649:function(e,t,o){e.exports=o.p+"assets/img/img_3.2595db17.png"},650:function(e,t,o){e.exports=o.p+"assets/img/coinselection.4c853f71.png"},651:function(e,t,o){e.exports=o.p+"assets/img/img.9710314c.png"},652:function(e,t,o){e.exports=o.p+"assets/img/img_4.c8000fea.png"},653:function(e,t,o){e.exports=o.p+"assets/img/scientist_mode.66645705.png"},654:function(e,t,o){e.exports=o.p+"assets/img/img_5.a8ef891b.png"},655:function(e,t,o){e.exports=o.p+"assets/img/img_6.745de6b7.png"},656:function(e,t,o){e.exports=o.p+"assets/img/img_7.0d3fb434.png"},657:function(e,t,o){e.exports=o.p+"assets/img/img_8.34595a5a.png"},658:function(e,t,o){e.exports=o.p+"assets/img/img_9.6da23178.png"},896:function(e,t,o){"use strict";o.r(t);var i=o(17),n=Object(i.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"the-btcpay-server-coinjoin-plugin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-btcpay-server-coinjoin-plugin"}},[e._v("#")]),e._v(" The BTCPay Server Coinjoin plugin")]),e._v(" "),t("p",[e._v("This plugin allows every BTCPay Server instance to integrate with the Wabisabi coinjoin protocol developed by "),t("a",{attrs:{href:"https://zksnacks.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("zkSNACKS"),t("OutboundLink")],1),e._v(" ("),t("a",{attrs:{href:"https://wasabiwallet.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Wallet"),t("OutboundLink")],1),e._v(").")]),e._v(" "),t("p",{attrs:{align:"center"}},[t("a",{attrs:{href:"http://www.youtube.com/watch?feature=player_embedded&v=zGVCrwMKKn0\n",target:"_blank"}},[t("img",{attrs:{src:"http://img.youtube.com/vi/zGVCrwMKKn0/0.jpg",border:"10"}})])]),e._v(" "),t("h2",{attrs:{id:"installation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#installation"}},[e._v("#")]),e._v(" Installation")]),e._v(" "),t("p",[e._v("First ensure that your BTCPay Server instance is at least version 1.8.0 and that NBXplorer is at least 2.3.58. If you are using the recommended Docker deployment method, it is as simple as "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-update-btcpay-server"}},[e._v("one-click")]),e._v(".")],1),e._v(" "),t("p",[e._v('Then, you will need to log in as an admin, click on "Manage plugins" in the side navigation, and click on "Install" on the "Coinjoin" plugin in the list. BTCPay Server will then ask you to restart in order to load the plugin.')]),e._v(" "),t("p",[e._v('After the restart, there should be a new navigation item in the side navigation, "Coinjoin", and the dashboard should have additional elements related to coinjoins.\n'),t("img",{attrs:{src:o(647),alt:"./img_1.png",title:"./img_1.png"}})]),e._v(" "),t("h2",{attrs:{id:"usage"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#usage"}},[e._v("#")]),e._v(" Usage")]),e._v(" "),t("p",[e._v("Your store needs to have a Bitcoin wallet configured and it needs to be set up as a "),t("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[e._v("hot wallet")]),e._v(". Only native segwit (and potentially taproot) wallets will be able to join coinjoin rounds.")],1),e._v(" "),t("p",[e._v('The easiest way to get started is to click on "Coinjoin" in the side navigation, choose the default "zkSNACKS" coordinator and click "save". BTCPay Server will automatically join coinjoin rounds and progress to enhancing the privacy of your wallet.\n'),t("img",{attrs:{src:o(648),alt:"./img_2.png",title:"./img_2.png"}}),e._v('\nCoinjoin transactions will appear in the transactions list in your wallet as they happen, and will have at least 2 labels, "coinjoin", and the name of the coordinator.\n'),t("img",{attrs:{src:o(649),alt:"./img_3.png",title:"./img_3.png"}})]),e._v(" "),t("h2",{attrs:{id:"spending-privately"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#spending-privately"}},[e._v("#")]),e._v(" Spending privately")]),e._v(" "),t("p",[e._v('Coins which have gained some level of privacy will have an "anonset" label when using the BTCPay wallet coin selection feature. If you hover over the label, it will tell you the score it has gained.')]),e._v(" "),t("figure",[t("img",{attrs:{src:o(650),alt:"./coinselection.png",title:"./coinselection.png"}})]),e._v(" "),t("p",[e._v("It is up to you to use the coin selection feature correctly to make the best of your earned privacy on your coins.")]),e._v(" "),t("p",[e._v("Ideally you:")]),e._v(" "),t("ul",[t("li",[e._v("select the least amount of coins possible")]),e._v(" "),t("li",[e._v("select the highest level of privacy coins")]),e._v(" "),t("li",[e._v("ideally use coins from different transactions")]),e._v(" "),t("li",[e._v("spend entire coins to prevent change")])]),e._v(" "),t("p",[e._v("We realize this is a complex selection and are working on an easier UI to help with this. As an initial experiment, we have added an action to let us attempt to select coins based on your sending amounts.\n"),t("img",{attrs:{src:o(651),alt:"./img.png",title:"./img.png"}})]),e._v(" "),t("p",[e._v("But the best way to spend privately is to use our unique "),t("strong",[e._v("payment batching feature")]),e._v(", by utilizing BTCPay Server's "),t("RouterLink",{attrs:{to:"/Payouts/"}},[e._v("Payout")]),e._v(' system. Simply set the destination and amount and click on "Schedule transaction", and the payment will be embedded directly inside the next coinjoin that can fulfill it.\n'),t("img",{attrs:{src:o(652),alt:"./img_4.png",title:"./img_4.png"}})],1),e._v(" "),t("h2",{attrs:{id:"pleb-mode-vs-scientist-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pleb-mode-vs-scientist-mode"}},[e._v("#")]),e._v(" Pleb mode vs Scientist mode")]),e._v(" "),t("p",[e._v("Pleb mode comes with a curated set of configurations aimed to get you off the ground with coinjoining. Scientist mode is for those who want to experiment with different configurations and fine tune their coinjoin experience.")]),e._v(" "),t("p",[e._v("Scientist mode allows you to configure the following:")]),e._v(" "),t("ul",[t("li",[e._v("Anonscore target: What level of privacy you want to achieve. The higher the number, the more privacy you will gain, but the longer (and more expensive due to mining fees) it will take to achieve it. The pleb mode default is 5.")]),e._v(" "),t("li",[e._v("Coinsolidations: When this is turned on, the plugin will attempt to add many coins in comparison to usual. The maximum number of coins that can be added by this plugin is a random number computed for each round between 10 and 30. When coinsolidation mode is on, the likelihood to keep adding coins to the max number is probabilistic change of 90%, else it is current number of coins divided by the max number of coins. The pleb mode default is off.")]),e._v(" "),t("li",[e._v("Batched payments: When this is turned on, the plugin will attempt to batch BTC on-chain Payouts that are in the "),t("code",[e._v("AwaitingPayment")]),e._v(" state. Please note that if the coordinator you are connected to does not allow creating outputs of the payout's address format ( such as a non segwit or taproot address), these payments will not be processed. The pleb mode default is on.")]),e._v(" "),t("li",[e._v("Cross mixing: Cross mixing allows you to mix your coins across multiple coordinators in parallel, bringing you the privacy benefits of multiple coordinator liquidity pools. The default option is "),t("code",[e._v("When Free")]),e._v(" (pleb mode default), which means it will only remix coins on different coordinators if they are below the free threshold and will not be charged a coordinator fee. The other option is "),t("code",[e._v("Always")]),e._v(", which will mix coins across coordinators regardless of the fee. The last option is "),t("code",[e._v("Never")]),e._v(", which will not mix coins across coordinators.")]),e._v(" "),t("li",[e._v("Continuous coinjoins: When this is turned on, the plugin will attempt to join coinjoins even if all your coins are private. The chance to join is a random chance as defined by the value divided by 100 and then as a percentage. This means that if you enter "),t("code",[e._v("100")]),e._v(", there is a 1% chance of coinjoining every round. The pleb mode default is 0.")]),e._v(" "),t("li",[e._v("Send to other wallet: If you have other stores configured with an onchain wallet, with the same address format type, you can choose to send your coinjoin outputs to that wallet. This is useful if you want to keep your privacy gains separate from your main wallet, and can even send them directly to a hardware wallet! The pleb mode default is off.")]),e._v(" "),t("li",[e._v("Label coin selection: You are able to specify which labels will allow or disallow coins from joining coinjoins. If you exclude labels A,B, and C, then coins with those labels will not be used in coinjoins. If you include labels D, E, and F, then only coins with either of those labels will be used in coinjoins.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(653),alt:"./img_4.png",title:"./img_4.png"}})]),e._v(" "),t("h2",{attrs:{id:"additional-coordinators"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#additional-coordinators"}},[e._v("#")]),e._v(" Additional Coordinators")]),e._v(" "),t("p",[e._v("We realize that the weakest link in these coinjoin protocols is the centralized coordinator aspect, and so have opted to support multiple coordinators, in parallel, from the get-go. You can discover additional coordinators over Nostr, or you can add a coordinator manually by using the link at the bottom.\n"),t("img",{attrs:{src:o(654),alt:"./img_5.png",title:"./img_5.png"}})]),e._v(" "),t("p",[e._v('Please be cautious as some coordinators may be malicious in nature. Once a coordinator has been added and a coinjoin round has been discovered, you can click on "Coordinator Config" to see what their fees and round requirements are set to, but be aware that a coordinator can change these at will. The plugin tracks if the minimum inputs per round, the coordination fee or the free threshold has changed and will not join rounds that are worse off than the one visible when you enabled the coordinator. You can accept the new terms by clicking on "Accept new terms" and the plugin will join rounds using the new parameters.')]),e._v(" "),t("figure",[t("img",{attrs:{src:o(655),alt:"./img_6.png",title:"./img_6.png"}})]),e._v(" "),t("p",[e._v("Ideally, the minimum number of inputs is 50 and the fee is below 1% (the default is 0.3%).")]),e._v(" "),t("h2",{attrs:{id:"running-a-coordinator"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#running-a-coordinator"}},[e._v("#")]),e._v(" Running a coordinator")]),e._v(" "),t("p",[e._v('In the spirit of "be the change you want to see in the world", this plugin ships with the ability to run your own coordinator (and publish it over Nostr for discoverability). This feature is still considered experimental, and may have '),t("a",{attrs:{href:"https://bitcoinmagazine.com/technical/is-bitcoin-next-after-tornado-cash",target:"_blank",rel:"noopener noreferrer"}},[e._v("legal repercussions for operating a coordinator"),t("OutboundLink")],1),e._v(".\n"),t("img",{attrs:{src:o(656),alt:"./img_7.png",title:"./img_7.png"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:o(657),alt:"./img_8.png",title:"./img_8.png"}})]),e._v(" "),t("p",[e._v("By default, the coordinator is configured to donate its generated fees to the "),t("a",{attrs:{href:"https://hrf.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("human rights foundation"),t("OutboundLink")],1),e._v(", and "),t("a",{attrs:{href:"https://opensats.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("opensats"),t("OutboundLink")],1),e._v(", along with a hardcoded plugin development fee split to continue expanding and maintaining the plugin. You can configure these using the "),t("code",[e._v("CoordinatorSplits")]),e._v(" json key.\nThe format is as follows:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v('[\n {\n "Ratio": 1.0,\n "Type": "hrf"\n },\n {\n "Ratio": 1.0,\n "Type": "opensats",\n "Value": "btcpayserver"\n }\n]\n')])])]),t("ul",[t("li",[e._v("If Type is "),t("code",[e._v("hrf")]),e._v(", the value of the fee equivalent to its ratio will be donated to the human rights foundation.")]),e._v(" "),t("li",[e._v("If Type is "),t("code",[e._v("opensats")]),e._v(", you must specify which project on its website will receive the value of the fee equivalent to its ratio. Available projects values are the file names listed "),t("a",{attrs:{href:"https://github.com/OpenSats/website/tree/master/./projects",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("If Type is "),t("code",[e._v("btcpaybutton")]),e._v(", you must specify a url to a BTCPay Server instance store's "),t("RouterLink",{attrs:{to:"/Apps/#payment-button"}},[e._v("payment button")]),e._v(". This must be enabled. The value usually looks as follows: "),t("code",[e._v("https://yourbtcpayserver.com/api/v1/invoices?storeId=yourstoreId¤cy=BTC")])],1),e._v(" "),t("li",[e._v("If Type is "),t("code",[e._v("btcpaypos")]),e._v(", you must specify a url to a BTCPay Server instance store's "),t("RouterLink",{attrs:{to:"/Apps/#point-of-sale-app"}},[e._v("point of sale")]),e._v(". The "),t("code",[e._v("Custom payments")]),e._v(" option must be enabled. The value usually looks as follows: "),t("code",[e._v("https://yourbtcpayserver.com/apps/appid/pos")])],1)]),e._v(" "),t("p",[e._v("One enabled, the local coordinator appears in the coinjoin configuration of your store, and, if you configures the nostr settings, published to a relay so that others may discover the coordinator.\n"),t("img",{attrs:{src:o(658),alt:"./img_9.png",title:"./img_9.png"}})])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/29.5a61b42a.js b/assets/js/29.4f814518.js similarity index 75% rename from assets/js/29.5a61b42a.js rename to assets/js/29.4f814518.js index 1b16aac016..d6d4d2ed26 100644 --- a/assets/js/29.5a61b42a.js +++ b/assets/js/29.4f814518.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{379:function(t,e,r){t.exports=r.p+"assets/img/ContributeCloneRepo.4df4c253.jpg"},380:function(t,e,r){t.exports=r.p+"assets/img/ContributeCloneRepo2.70d12ce3.jpg"},381:function(t,e,r){t.exports=r.p+"assets/img/ContributeCreateBranch.7d45e1e5.jpg"},382:function(t,e,r){t.exports=r.p+"assets/img/ContributeCreateBranch2.05759e70.jpg"},383:function(t,e,r){t.exports=r.p+"assets/img/ContributeFindFile.0bdf3b61.jpg"},384:function(t,e,r){t.exports=r.p+"assets/img/ContributeCommit.aadec825.jpg"},385:function(t,e,r){t.exports=r.p+"assets/img/ContributeCommit2.e2985a43.jpg"},386:function(t,e,r){t.exports=r.p+"assets/img/ContributeCreatePR.67d68a78.jpg"},387:function(t,e,r){t.exports=r.p+"assets/img/ContributeOpenPR.bacee510.jpg"},785:function(t,e,r){"use strict";r.r(e);var i=r(17),o=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"contribute-to-the-software-stack"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contribute-to-the-software-stack"}},[t._v("#")]),t._v(" Contribute to the software stack")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you have trouble finding a string or contributing to the software stack, ask the "),e("RouterLink",{attrs:{to:"/Community/"}},[t._v("community")])],1),t._v(" "),e("p",[t._v("If your textual change is significant "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[t._v("open an issue on GitHub"),e("OutboundLink")],1),t._v(" and explain what you'd like to change and why.")])]),t._v(" "),e("h2",{attrs:{id:"step-1"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-1"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 1")])]),t._v(" "),e("p",[t._v("Fork/Clone the main repository ("),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server"),e("OutboundLink")],1),t._v(") using Github and publish it.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(379),alt:"ContributeCloneRepo",title:"ContributeCloneRepo"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:r(380),alt:"ContributeCloneRepo2",title:"ContributeCloneRepo2"}})]),t._v(" "),e("h2",{attrs:{id:"step-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-2"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 2")])]),t._v(" "),e("p",[t._v("Create a branch and name it (for example what file you're working on).")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(381),alt:"ContributeCreateBranch",title:"ContributeCreateBranch"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:r(382),alt:"ContributeCreateBranch2",title:"ContributeCreateBranch2"}})]),t._v(" "),e("h2",{attrs:{id:"step-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-3"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 3")])]),t._v(" "),e("p",[t._v("Now open your branch in your file explorer.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(383),alt:"ContributeFindFile",title:"ContributeFindFile"}})]),t._v(" "),e("p",[t._v("You're all set!\nOpen the file you wish to edit and work on it.\nOnce finished, save it.")]),t._v(" "),e("h2",{attrs:{id:"step-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-4"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 4")])]),t._v(" "),e("p",[t._v("Once your changes are saved, return to Github Desktop.\nSee your changes on the right hand side.")]),t._v(" "),e("p",[t._v("Name your contribution and describe it.\nClick the "),e("code",[t._v("Commit")]),t._v(" button in the bottom left.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(384),alt:"ContributeCommit",title:"ContributeCommit"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:r(385),alt:"ContributeCommit2",title:"ContributeCommit2"}})]),t._v(" "),e("h2",{attrs:{id:"step-5"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-5"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 5")])]),t._v(" "),e("p",[t._v("Next, create a "),e("code",[t._v("Pull Request")]),t._v(" by clicking the "),e("code",[t._v("Create Pull Request")]),t._v(" button on the right to open a browser page.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(386),alt:"ContributeCreatePR",title:"ContributeCreatePR"}})]),t._v(" "),e("p",[t._v("Then describe what your "),e("code",[t._v("Pull Request")]),t._v(" changes, give it a title, and click "),e("code",[t._v("Create Pull Request")]),t._v(".")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(387),alt:"ContributeOpenPR",title:"ContributeOpenPR"}})]),t._v(" "),e("p",[t._v("Once your pull request is submitted, it has to be reviewed by the maintainers and contributors. If it gets accepted - congratulations, you've made your first contribution.")])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[29],{380:function(t,e,r){t.exports=r.p+"assets/img/ContributeCloneRepo.4df4c253.jpg"},381:function(t,e,r){t.exports=r.p+"assets/img/ContributeCloneRepo2.70d12ce3.jpg"},382:function(t,e,r){t.exports=r.p+"assets/img/ContributeCreateBranch.7d45e1e5.jpg"},383:function(t,e,r){t.exports=r.p+"assets/img/ContributeCreateBranch2.05759e70.jpg"},384:function(t,e,r){t.exports=r.p+"assets/img/ContributeFindFile.0bdf3b61.jpg"},385:function(t,e,r){t.exports=r.p+"assets/img/ContributeCommit.aadec825.jpg"},386:function(t,e,r){t.exports=r.p+"assets/img/ContributeCommit2.e2985a43.jpg"},387:function(t,e,r){t.exports=r.p+"assets/img/ContributeCreatePR.67d68a78.jpg"},388:function(t,e,r){t.exports=r.p+"assets/img/ContributeOpenPR.bacee510.jpg"},786:function(t,e,r){"use strict";r.r(e);var i=r(17),o=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"contribute-to-the-software-stack"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contribute-to-the-software-stack"}},[t._v("#")]),t._v(" Contribute to the software stack")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("If you have trouble finding a string or contributing to the software stack, ask the "),e("RouterLink",{attrs:{to:"/Community/"}},[t._v("community")])],1),t._v(" "),e("p",[t._v("If your textual change is significant "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[t._v("open an issue on GitHub"),e("OutboundLink")],1),t._v(" and explain what you'd like to change and why.")])]),t._v(" "),e("h2",{attrs:{id:"step-1"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-1"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 1")])]),t._v(" "),e("p",[t._v("Fork/Clone the main repository ("),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server"),e("OutboundLink")],1),t._v(") using Github and publish it.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(380),alt:"ContributeCloneRepo",title:"ContributeCloneRepo"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:r(381),alt:"ContributeCloneRepo2",title:"ContributeCloneRepo2"}})]),t._v(" "),e("h2",{attrs:{id:"step-2"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-2"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 2")])]),t._v(" "),e("p",[t._v("Create a branch and name it (for example what file you're working on).")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(382),alt:"ContributeCreateBranch",title:"ContributeCreateBranch"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:r(383),alt:"ContributeCreateBranch2",title:"ContributeCreateBranch2"}})]),t._v(" "),e("h2",{attrs:{id:"step-3"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-3"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 3")])]),t._v(" "),e("p",[t._v("Now open your branch in your file explorer.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(384),alt:"ContributeFindFile",title:"ContributeFindFile"}})]),t._v(" "),e("p",[t._v("You're all set!\nOpen the file you wish to edit and work on it.\nOnce finished, save it.")]),t._v(" "),e("h2",{attrs:{id:"step-4"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-4"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 4")])]),t._v(" "),e("p",[t._v("Once your changes are saved, return to Github Desktop.\nSee your changes on the right hand side.")]),t._v(" "),e("p",[t._v("Name your contribution and describe it.\nClick the "),e("code",[t._v("Commit")]),t._v(" button in the bottom left.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(385),alt:"ContributeCommit",title:"ContributeCommit"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:r(386),alt:"ContributeCommit2",title:"ContributeCommit2"}})]),t._v(" "),e("h2",{attrs:{id:"step-5"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#step-5"}},[t._v("#")]),t._v(" "),e("strong",[t._v("Step 5")])]),t._v(" "),e("p",[t._v("Next, create a "),e("code",[t._v("Pull Request")]),t._v(" by clicking the "),e("code",[t._v("Create Pull Request")]),t._v(" button on the right to open a browser page.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(387),alt:"ContributeCreatePR",title:"ContributeCreatePR"}})]),t._v(" "),e("p",[t._v("Then describe what your "),e("code",[t._v("Pull Request")]),t._v(" changes, give it a title, and click "),e("code",[t._v("Create Pull Request")]),t._v(".")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(388),alt:"ContributeOpenPR",title:"ContributeOpenPR"}})]),t._v(" "),e("p",[t._v("Once your pull request is submitted, it has to be reviewed by the maintainers and contributors. If it gets accepted - congratulations, you've made your first contribution.")])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/31.6602158f.js b/assets/js/31.e7391443.js similarity index 93% rename from assets/js/31.6602158f.js rename to assets/js/31.e7391443.js index cae0693861..1b9282427e 100644 --- a/assets/js/31.6602158f.js +++ b/assets/js/31.e7391443.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{683:function(t,e,a){t.exports=a.p+"assets/img/WalletTransactions.4bdec6ac.png"},684:function(t,e,a){t.exports=a.p+"assets/img/WalletSend.11c9a1cc.png"},685:function(t,e,a){t.exports=a.p+"assets/img/WalletReceive.b66ff262.png"},686:function(t,e,a){t.exports=a.p+"assets/img/WalletReceiveTwo.8730da42.png"},687:function(t,e,a){t.exports=a.p+"assets/img/WalletSetting.f8faa28f.png"},688:function(t,e,a){t.exports=a.p+"assets/img/WalletSettingTwo.aa27485f.png"},689:function(t,e,a){t.exports=a.p+"assets/img/WalletRescan.f42b1081.png"},690:function(t,e,a){t.exports=a.p+"assets/img/WalletRescanProgress.7dfd1487.png"},691:function(t,e,a){t.exports=a.p+"assets/img/ManageLabel.0ed9ac9c.png"},901:function(t,e,a){"use strict";a.r(e);var s=a(17),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-server-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-wallet"}},[t._v("#")]),t._v(" BTCPay Server Wallet")]),t._v(" "),e("p",[t._v("BTCPay Server has a built in, "),e("strong",[t._v("full-node reliant wallet")]),t._v(" that allows for easy funds management.")]),t._v(" "),e("p",[t._v("Each "),e("RouterLink",{attrs:{to:"/CreateStore/"}},[t._v("store")]),t._v("'s configured cryptocurrency has a separate wallet displayed under Wallets in the menu bar.")],1),t._v(" "),e("h2",{attrs:{id:"wallet-features"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wallet-features"}},[t._v("#")]),t._v(" Wallet features")]),t._v(" "),e("p",[t._v("The wallet contains the following features:")]),t._v(" "),e("ol",[e("li",[t._v("Transactions")]),t._v(" "),e("li",[t._v("Send")]),t._v(" "),e("li",[t._v("Receive")]),t._v(" "),e("li",[t._v("Rescan")]),t._v(" "),e("li",[t._v("Pull payments")]),t._v(" "),e("li",[t._v("Payouts")]),t._v(" "),e("li",[t._v("PSBT")]),t._v(" "),e("li",[t._v("Settings")])]),t._v(" "),e("h3",{attrs:{id:"transactions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transactions"}},[t._v("#")]),t._v(" Transactions")]),t._v(" "),e("p",[t._v("An overview of the incoming (green), outgoing (red) and unconfirmed (grayed out) "),e("strong",[t._v("transactions")]),t._v(" displayed together with timestamps and balances, sorted by date. You can click on the transaction ID to view the transaction details on the block explorer.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(683),alt:"Individual Wallet",title:"Individual Wallet"}})]),t._v(" "),e("h4",{attrs:{id:"transaction-labels"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transaction-labels"}},[t._v("#")]),t._v(" Transaction Labels")]),t._v(" "),e("p",[t._v("The table below lists the various "),e("strong",[t._v("transaction labels used by BTCPay")]),t._v(".")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Transaction Type")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("app")]),t._v(" "),e("td",[t._v("Payment was received through an app created invoice")])]),t._v(" "),e("tr",[e("td",[t._v("invoice")]),t._v(" "),e("td",[t._v("Payment was received through an invoice")])]),t._v(" "),e("tr",[e("td",[t._v("payjoin")]),t._v(" "),e("td",[t._v("Not paid, invoice timer still has not expired")])]),t._v(" "),e("tr",[e("td",[t._v("payjoin-exposed")]),t._v(" "),e("td",[t._v("UTXO was exposed through an invoice payjoin proposal")])]),t._v(" "),e("tr",[e("td",[t._v("payment-request")]),t._v(" "),e("td",[t._v("Payment was received through a payment request")])]),t._v(" "),e("tr",[e("td",[t._v("payout")]),t._v(" "),e("td",[t._v("Payment was sent through a payout or refund")])])])]),t._v(" "),e("p",[t._v("You can also create your own "),e("RouterLink",{attrs:{to:"/FAQ/Wallet/#how-to-add-custom-labels-and-comments-to-transactions"}},[t._v("custom transaction labels and comments")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"send"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#send"}},[t._v("#")]),t._v(" Send")]),t._v(" "),e("p",[t._v("The Send function allows "),e("strong",[t._v("spending of the funds from the BTCPay wallet")]),t._v(".")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(684),alt:"Send from the Wallet",title:"Send from the Wallet"}})]),t._v(" "),e("h4",{attrs:{id:"advanced-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings"}},[t._v("#")]),t._v(" Advanced Settings")]),t._v(" "),e("p",[t._v("Certain wallet features are available for advanced users. Toggle the "),e("code",[t._v("Advanced Settings")]),t._v(" within the "),e("code",[t._v("Send")]),t._v(" tab to preview them.")]),t._v(" "),e("h5",{attrs:{id:"dont-create-utxo-change"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dont-create-utxo-change"}},[t._v("#")]),t._v(" Don't create UTXO change")]),t._v(" "),e("p",[t._v("This option is available in the "),e("code",[t._v("Advanced mode")]),t._v(" of the "),e("code",[t._v("Send")]),t._v(" page.")]),t._v(" "),e("p",[t._v("It is a privacy enhancing feature which is useful when you're sending funds to another wallet of yours or to an exchange. It makes sure that no change UTXO is created by "),e("strong",[t._v("rounding up")]),t._v(" the amount sent.")]),t._v(" "),e("p",[t._v("By default this feature is disabled, so if your wallet has a UTXO of "),e("code",[t._v("1.1 BTC")]),t._v(" and you input an amount equal to "),e("code",[t._v("1.0 BTC")]),t._v(", the resulting transaction will have two outputs "),e("code",[t._v("0.1 BTC")]),t._v(" of change, and "),e("code",[t._v("1.0 BTC")]),t._v(" to your destination.")]),t._v(" "),e("p",[t._v("Blockchain analysis will understand that those "),e("code",[t._v("0.1 BTC")]),t._v(" of change belong to the same entity which controlled "),e("code",[t._v("1.1 BTC")]),t._v(" before, and can track the future purchase you make under the same pattern.")]),t._v(" "),e("p",[t._v("By enabling this feature, BTCPay Server wallet will round up the amount sent to "),e("code",[t._v("1.1 BTC")]),t._v(" such that no change output is sent back to you.")]),t._v(" "),e("p",[t._v("Warning: Despite the fact, in this example, that you entered "),e("code",[t._v("1.0")]),t._v(" in the amount field, the amount that will really be sent to your destination will be "),e("code",[t._v("1.1 BTC")]),t._v(".")]),t._v(" "),e("h5",{attrs:{id:"other-features"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#other-features"}},[t._v("#")]),t._v(" Other features")]),t._v(" "),e("h6",{attrs:{id:"camera-qr-scan"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#camera-qr-scan"}},[t._v("#")]),t._v(" Camera QR scan")]),t._v(" "),e("p",[t._v("Scan option in wallet (camera icon in send screen) lets you "),e("strong",[t._v("use your device’s camera to scan a QR code containing an address or BIP21 payment link")]),t._v(". It auto-populates the sending information so that you don’t have to manually copy-paste an address and amount.")]),t._v(" "),e("h6",{attrs:{id:"paste-bip21-address"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#paste-bip21-address"}},[t._v("#")]),t._v(" Paste BIP21 address")]),t._v(" "),e("p",[t._v("This option "),e("strong",[t._v("decodes a BIP21 payment link")]),t._v(". It's useful when you're trying to pay a "),e("RouterLink",{attrs:{to:"/Payjoin/"}},[t._v("Payjoin")]),t._v(" invoice.")],1),t._v(" "),e("h4",{attrs:{id:"signing-a-transaction-spending"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-a-transaction-spending"}},[t._v("#")]),t._v(" Signing a transaction (spending)")]),t._v(" "),e("p",[t._v("To spend the funds, you are required to "),e("strong",[t._v("sign")]),t._v(" the transaction. Transactions can be signed with:")]),t._v(" "),e("ul",[e("li",[t._v("Hardware Wallet")]),t._v(" "),e("li",[t._v("Wallet supporting PSBT")]),t._v(" "),e("li",[t._v("HD private key or recovery seed")]),t._v(" "),e("li",[t._v("Hot Wallet")])]),t._v(" "),e("h5",{attrs:{id:"signing-with-hd-private-key-or-mnemonic-seed"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-hd-private-key-or-mnemonic-seed"}},[t._v("#")]),t._v(" Signing with HD Private Key or mnemonic seed")]),t._v(" "),e("p",[t._v("If you set up an "),e("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[t._v("existing wallet with your BTCPay Server")]),t._v(", you can spend the funds by inputting your private key into an appropriate field. Make sure to set a proper "),e("code",[t._v("AccountKeyPath")]),t._v(" in Wallet > Settings otherwise you won't be able to spend.")],1),t._v(" "),e("h5",{attrs:{id:"signing-with-a-wallet-supporting-psbt"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-a-wallet-supporting-psbt"}},[t._v("#")]),t._v(" Signing with a wallet supporting PSBT")]),t._v(" "),e("p",[t._v("PSBT ("),e("strong",[t._v("Partially Signed Bitcoin Transactions")]),t._v(") is an interchange format for Bitcoin transactions that are not fully signed yet.\nPSBT is supported in BTCPay Server and can be signed with compatible hardware and software wallets.")]),t._v(" "),e("p",[t._v("The construction of a fully signed Bitcoin transaction goes through the following steps:")]),t._v(" "),e("ul",[e("li",[t._v("A PSBT gets constructed with certain inputs and outputs, but no signatures")]),t._v(" "),e("li",[t._v("The exported PSBT can be imported by a wallet that supports this format")]),t._v(" "),e("li",[t._v("The transaction data can be inspected and signed using the wallet")]),t._v(" "),e("li",[t._v("The signed PSBT file gets exported from the wallet and imported with BTCPay Server")]),t._v(" "),e("li",[t._v("BTCPay Server produces the final Bitcoin transaction")]),t._v(" "),e("li",[t._v("You verify the result and broadcast it to the network")])]),t._v(" "),e("p",[t._v("Tutorials:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/ColdCardWallet/#spending-from-btcpay-server-wallet-with-coldcard-psbt"}},[t._v("Sign a PSBT transaction with ColdCard Hardware Wallet")]),t._v(" (completely offline/air-gapped)")],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Sign-PSBT-with-sparrow-wallet/"}},[t._v("Create and sign a PSBT transaction with Sparrow wallet")])],1)]),t._v(" "),e("h5",{attrs:{id:"signing-with-a-hardware-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-a-hardware-wallet"}},[t._v("#")]),t._v(" Signing with a hardware wallet")]),t._v(" "),e("p",[t._v("BTCPay Server has built-in hardware wallet support allowing you to "),e("strong",[t._v("use your hardware wallet with BTCPay")]),t._v(", without leaking information to third-party apps or servers.")]),t._v(" "),e("p",[e("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[t._v("Check instructions")]),t._v(" on how to set up and sign with a "),e("a",{attrs:{href:"https://github.com/bitcoin-core/HWI#device-support",target:"_blank",rel:"noopener noreferrer"}},[t._v("compatible hardware wallet"),e("OutboundLink")],1),t._v(".")],1),t._v(" "),e("h5",{attrs:{id:"signing-with-a-hot-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-a-hot-wallet"}},[t._v("#")]),t._v(" Signing with a hot wallet")]),t._v(" "),e("p",[t._v("If you "),e("RouterLink",{attrs:{to:"/CreateWallet/"}},[t._v("created a new wallet")]),t._v(" when setting up your store and enabled it as a "),e("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[t._v("hot wallet")]),t._v(", since version 1.2.0, we've added an option that when a "),e("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[t._v("hot wallet")]),t._v(" is created, it'll automatically use the seed stored on a server to sign.")],1),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),e("p",[t._v("Using the hot wallet feature comes with security implications; please be sure to read and understand them over at the "),e("RouterLink",{attrs:{to:"/CreateWallet/#security-implications"}},[t._v("Hot Wallet documentation")])],1)]),t._v(" "),e("h3",{attrs:{id:"receive"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#receive"}},[t._v("#")]),t._v(" Receive")]),t._v(" "),e("p",[t._v("The Receive tab "),e("strong",[t._v("generates an unused address which can be used to receive payments")]),t._v(". The same can be achieved by generating an invoice (Invoices > Create new invoice).")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(685),alt:"Wallet Receive",title:"Wallet Receive"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(686),alt:"Wallet Receive Two",title:"Wallet Receive Two"}})]),t._v(" "),e("h3",{attrs:{id:"pull-payments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pull-payments"}},[t._v("#")]),t._v(" Pull Payments")]),t._v(" "),e("p",[t._v("This feature gives you the ability to "),e("strong",[t._v("create a Pull Payment")]),t._v(", so that an outside individual may request to "),e("code",[t._v("pull")]),t._v(" funds from your wallet.")]),t._v(" "),e("p",[t._v("For more information, see "),e("RouterLink",{attrs:{to:"/PullPayments/"}},[t._v("Pull Payments")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"payouts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#payouts"}},[t._v("#")]),t._v(" Payouts")]),t._v(" "),e("p",[t._v("This section lets you manage Pull Payments and gives you the ability to "),e("strong",[t._v("accept or decline payouts requested by outside individuals")]),t._v(".")]),t._v(" "),e("p",[t._v("For more information, see "),e("RouterLink",{attrs:{to:"/PullPayments/#approve-and-pay-a-payout"}},[t._v("Payouts")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#settings"}},[t._v("#")]),t._v(" Settings")]),t._v(" "),e("p",[t._v("In the top right corner of your "),e("code",[t._v("wallet")]),t._v(" you will find the "),e("code",[t._v("wallet settings")]),t._v(".\nIn the wallet settings tab you can adjust certain settings. If you've configured your wallet by "),e("RouterLink",{attrs:{to:"/CreateWallet/"}},[t._v("creating a new wallet")]),t._v(" or using an existing wallet via the "),e("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[t._v("hardware wallet integration")]),t._v(" these settings will be pre-configured.\nHere, you have the options to perform several actions on your wallet, such Rescanning wallet for missing transactions, prunning old transactions, view wallet phrase, remove wallet among features.")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(687),alt:"Wallet Rescan",title:"Wallet Rescan"}})]),t._v(" "),e("p",[t._v("If you manually added the extended public key from an external wallet, you'd need to adjust "),e("code",[t._v("AccountKeyPath")]),t._v(" that you can find in your external wallet, for example "),e("code",[t._v("m/84'/0'/0'")]),t._v(" to be able to spend from the BTCPay Wallet.")]),t._v(" "),e("p",[t._v("In "),e("code",[t._v("wallet settings")]),t._v(" you will also find the "),e("code",[t._v("speed policy")]),t._v(" for the specific store.\nThere are 2 main settings under "),e("code",[t._v("Payment")]),t._v(", "),e("RouterLink",{attrs:{to:"/FAQ/Stores/#payment-invalid-if-transactions-fails-to-confirm--minutes-after-invoice-expiration"}},[t._v("Payment invalid if transaction fails to confirm in ... after invoice creation")]),t._v(" and "),e("RouterLink",{attrs:{to:"/FAQ/Stores/#consider-the-invoice-confirmed-when-the-payment-transaction"}},[t._v("Consider the invoice confirmed when the payment transaction...")]),t._v(". The latter lets you set the number of confirmations required to be recognized as settled.")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(688),alt:"Wallet settings",title:"Wallet settings"}})]),t._v(" "),e("h3",{attrs:{id:"re-scan"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#re-scan"}},[t._v("#")]),t._v(" Re-scan")]),t._v(" "),e("p",[t._v("The Rescan relies on Bitcoin Core 0.17.0's "),e("code",[t._v("scantxoutset")]),t._v(" to "),e("strong",[t._v("scan the current state of the blockchain")]),t._v(" (called UTXO Set) for coins belonging to the configured derivation scheme.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(689),alt:"Wallet Rescan",title:"Wallet Rescan"}})]),t._v(" "),e("p",[t._v("Wallet re-scan solves two critical problems for BTCPay users:")]),t._v(" "),e("ol",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[t._v("Gap limit")])],1),t._v(" "),e("li",[t._v("Importing a previously used wallet")])]),t._v(" "),e("p",[e("strong",[t._v("Gap limit")]),t._v(": Most wallets typically have the address gap limit set to 20. This means that if a merchant receives 21 or more consecutive unpaid invoices, those wallets show the incorrect balance and some transactions may not be visible.")]),t._v(" "),e("p",[e("strong",[t._v("Wallet import")]),t._v(": When users add a derivation scheme of a wallet that had transactions in the past (previously used wallet), BTCPay won't be able to show the balance and transactions from the past.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(690),alt:"Wallet rescan progress",title:"Wallet rescan progress"}})]),t._v(" "),e("p",[t._v("Re-scan is a feature that solves both of these problems. Once the scan is complete, BTCPay Server will show the correct balance, along with the past transactions of the wallet.")]),t._v(" "),e("p",[t._v("Wallet re-scan requires access to the full node which means that this function is only available for server owners.")]),t._v(" "),e("p",[t._v("Users who use a third-party host should use a newly generated xpub key and also use an external wallet like Electrum which allows them to increase the gap limit.")]),t._v(" "),e("h3",{attrs:{id:"labels"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#labels"}},[t._v("#")]),t._v(" Labels")]),t._v(" "),e("p",[t._v("At the bottom of your wallet settings, you can manage your "),e("code",[t._v("custom transaction label")]),t._v(".")]),t._v(" "),e("p",[t._v("Clicking on the link would take you to a page where you can view all custom labels associated to all transaction. You can remove any or all custom labels given the required\npermission.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(691),alt:"Wallet settings",title:"Wallet settings"}})])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[31],{664:function(t,e,a){t.exports=a.p+"assets/img/WalletTransactions.4bdec6ac.png"},665:function(t,e,a){t.exports=a.p+"assets/img/WalletSend.11c9a1cc.png"},666:function(t,e,a){t.exports=a.p+"assets/img/WalletReceive.b66ff262.png"},667:function(t,e,a){t.exports=a.p+"assets/img/WalletReceiveTwo.8730da42.png"},668:function(t,e,a){t.exports=a.p+"assets/img/WalletSetting.f8faa28f.png"},669:function(t,e,a){t.exports=a.p+"assets/img/WalletSettingTwo.aa27485f.png"},670:function(t,e,a){t.exports=a.p+"assets/img/WalletRescan.f42b1081.png"},671:function(t,e,a){t.exports=a.p+"assets/img/WalletRescanProgress.7dfd1487.png"},672:function(t,e,a){t.exports=a.p+"assets/img/ManageLabel.0ed9ac9c.png"},899:function(t,e,a){"use strict";a.r(e);var s=a(17),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-server-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-wallet"}},[t._v("#")]),t._v(" BTCPay Server Wallet")]),t._v(" "),e("p",[t._v("BTCPay Server has a built in, "),e("strong",[t._v("full-node reliant wallet")]),t._v(" that allows for easy funds management.")]),t._v(" "),e("p",[t._v("Each "),e("RouterLink",{attrs:{to:"/CreateStore/"}},[t._v("store")]),t._v("'s configured cryptocurrency has a separate wallet displayed under Wallets in the menu bar.")],1),t._v(" "),e("h2",{attrs:{id:"wallet-features"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wallet-features"}},[t._v("#")]),t._v(" Wallet features")]),t._v(" "),e("p",[t._v("The wallet contains the following features:")]),t._v(" "),e("ol",[e("li",[t._v("Transactions")]),t._v(" "),e("li",[t._v("Send")]),t._v(" "),e("li",[t._v("Receive")]),t._v(" "),e("li",[t._v("Rescan")]),t._v(" "),e("li",[t._v("Pull payments")]),t._v(" "),e("li",[t._v("Payouts")]),t._v(" "),e("li",[t._v("PSBT")]),t._v(" "),e("li",[t._v("Settings")])]),t._v(" "),e("h3",{attrs:{id:"transactions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transactions"}},[t._v("#")]),t._v(" Transactions")]),t._v(" "),e("p",[t._v("An overview of the incoming (green), outgoing (red) and unconfirmed (grayed out) "),e("strong",[t._v("transactions")]),t._v(" displayed together with timestamps and balances, sorted by date. You can click on the transaction ID to view the transaction details on the block explorer.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(664),alt:"Individual Wallet",title:"Individual Wallet"}})]),t._v(" "),e("h4",{attrs:{id:"transaction-labels"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transaction-labels"}},[t._v("#")]),t._v(" Transaction Labels")]),t._v(" "),e("p",[t._v("The table below lists the various "),e("strong",[t._v("transaction labels used by BTCPay")]),t._v(".")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",[t._v("Transaction Type")]),t._v(" "),e("th",[t._v("Description")])])]),t._v(" "),e("tbody",[e("tr",[e("td",[t._v("app")]),t._v(" "),e("td",[t._v("Payment was received through an app created invoice")])]),t._v(" "),e("tr",[e("td",[t._v("invoice")]),t._v(" "),e("td",[t._v("Payment was received through an invoice")])]),t._v(" "),e("tr",[e("td",[t._v("payjoin")]),t._v(" "),e("td",[t._v("Not paid, invoice timer still has not expired")])]),t._v(" "),e("tr",[e("td",[t._v("payjoin-exposed")]),t._v(" "),e("td",[t._v("UTXO was exposed through an invoice payjoin proposal")])]),t._v(" "),e("tr",[e("td",[t._v("payment-request")]),t._v(" "),e("td",[t._v("Payment was received through a payment request")])]),t._v(" "),e("tr",[e("td",[t._v("payout")]),t._v(" "),e("td",[t._v("Payment was sent through a payout or refund")])])])]),t._v(" "),e("p",[t._v("You can also create your own "),e("RouterLink",{attrs:{to:"/FAQ/Wallet/#how-to-add-custom-labels-and-comments-to-transactions"}},[t._v("custom transaction labels and comments")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"send"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#send"}},[t._v("#")]),t._v(" Send")]),t._v(" "),e("p",[t._v("The Send function allows "),e("strong",[t._v("spending of the funds from the BTCPay wallet")]),t._v(".")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(665),alt:"Send from the Wallet",title:"Send from the Wallet"}})]),t._v(" "),e("h4",{attrs:{id:"advanced-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#advanced-settings"}},[t._v("#")]),t._v(" Advanced Settings")]),t._v(" "),e("p",[t._v("Certain wallet features are available for advanced users. Toggle the "),e("code",[t._v("Advanced Settings")]),t._v(" within the "),e("code",[t._v("Send")]),t._v(" tab to preview them.")]),t._v(" "),e("h5",{attrs:{id:"dont-create-utxo-change"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dont-create-utxo-change"}},[t._v("#")]),t._v(" Don't create UTXO change")]),t._v(" "),e("p",[t._v("This option is available in the "),e("code",[t._v("Advanced mode")]),t._v(" of the "),e("code",[t._v("Send")]),t._v(" page.")]),t._v(" "),e("p",[t._v("It is a privacy enhancing feature which is useful when you're sending funds to another wallet of yours or to an exchange. It makes sure that no change UTXO is created by "),e("strong",[t._v("rounding up")]),t._v(" the amount sent.")]),t._v(" "),e("p",[t._v("By default this feature is disabled, so if your wallet has a UTXO of "),e("code",[t._v("1.1 BTC")]),t._v(" and you input an amount equal to "),e("code",[t._v("1.0 BTC")]),t._v(", the resulting transaction will have two outputs "),e("code",[t._v("0.1 BTC")]),t._v(" of change, and "),e("code",[t._v("1.0 BTC")]),t._v(" to your destination.")]),t._v(" "),e("p",[t._v("Blockchain analysis will understand that those "),e("code",[t._v("0.1 BTC")]),t._v(" of change belong to the same entity which controlled "),e("code",[t._v("1.1 BTC")]),t._v(" before, and can track the future purchase you make under the same pattern.")]),t._v(" "),e("p",[t._v("By enabling this feature, BTCPay Server wallet will round up the amount sent to "),e("code",[t._v("1.1 BTC")]),t._v(" such that no change output is sent back to you.")]),t._v(" "),e("p",[t._v("Warning: Despite the fact, in this example, that you entered "),e("code",[t._v("1.0")]),t._v(" in the amount field, the amount that will really be sent to your destination will be "),e("code",[t._v("1.1 BTC")]),t._v(".")]),t._v(" "),e("h5",{attrs:{id:"other-features"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#other-features"}},[t._v("#")]),t._v(" Other features")]),t._v(" "),e("h6",{attrs:{id:"camera-qr-scan"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#camera-qr-scan"}},[t._v("#")]),t._v(" Camera QR scan")]),t._v(" "),e("p",[t._v("Scan option in wallet (camera icon in send screen) lets you "),e("strong",[t._v("use your device’s camera to scan a QR code containing an address or BIP21 payment link")]),t._v(". It auto-populates the sending information so that you don’t have to manually copy-paste an address and amount.")]),t._v(" "),e("h6",{attrs:{id:"paste-bip21-address"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#paste-bip21-address"}},[t._v("#")]),t._v(" Paste BIP21 address")]),t._v(" "),e("p",[t._v("This option "),e("strong",[t._v("decodes a BIP21 payment link")]),t._v(". It's useful when you're trying to pay a "),e("RouterLink",{attrs:{to:"/Payjoin/"}},[t._v("Payjoin")]),t._v(" invoice.")],1),t._v(" "),e("h4",{attrs:{id:"signing-a-transaction-spending"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-a-transaction-spending"}},[t._v("#")]),t._v(" Signing a transaction (spending)")]),t._v(" "),e("p",[t._v("To spend the funds, you are required to "),e("strong",[t._v("sign")]),t._v(" the transaction. Transactions can be signed with:")]),t._v(" "),e("ul",[e("li",[t._v("Hardware Wallet")]),t._v(" "),e("li",[t._v("Wallet supporting PSBT")]),t._v(" "),e("li",[t._v("HD private key or recovery seed")]),t._v(" "),e("li",[t._v("Hot Wallet")])]),t._v(" "),e("h5",{attrs:{id:"signing-with-hd-private-key-or-mnemonic-seed"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-hd-private-key-or-mnemonic-seed"}},[t._v("#")]),t._v(" Signing with HD Private Key or mnemonic seed")]),t._v(" "),e("p",[t._v("If you set up an "),e("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[t._v("existing wallet with your BTCPay Server")]),t._v(", you can spend the funds by inputting your private key into an appropriate field. Make sure to set a proper "),e("code",[t._v("AccountKeyPath")]),t._v(" in Wallet > Settings otherwise you won't be able to spend.")],1),t._v(" "),e("h5",{attrs:{id:"signing-with-a-wallet-supporting-psbt"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-a-wallet-supporting-psbt"}},[t._v("#")]),t._v(" Signing with a wallet supporting PSBT")]),t._v(" "),e("p",[t._v("PSBT ("),e("strong",[t._v("Partially Signed Bitcoin Transactions")]),t._v(") is an interchange format for Bitcoin transactions that are not fully signed yet.\nPSBT is supported in BTCPay Server and can be signed with compatible hardware and software wallets.")]),t._v(" "),e("p",[t._v("The construction of a fully signed Bitcoin transaction goes through the following steps:")]),t._v(" "),e("ul",[e("li",[t._v("A PSBT gets constructed with certain inputs and outputs, but no signatures")]),t._v(" "),e("li",[t._v("The exported PSBT can be imported by a wallet that supports this format")]),t._v(" "),e("li",[t._v("The transaction data can be inspected and signed using the wallet")]),t._v(" "),e("li",[t._v("The signed PSBT file gets exported from the wallet and imported with BTCPay Server")]),t._v(" "),e("li",[t._v("BTCPay Server produces the final Bitcoin transaction")]),t._v(" "),e("li",[t._v("You verify the result and broadcast it to the network")])]),t._v(" "),e("p",[t._v("Tutorials:")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/ColdCardWallet/#spending-from-btcpay-server-wallet-with-coldcard-psbt"}},[t._v("Sign a PSBT transaction with ColdCard Hardware Wallet")]),t._v(" (completely offline/air-gapped)")],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Sign-PSBT-with-sparrow-wallet/"}},[t._v("Create and sign a PSBT transaction with Sparrow wallet")])],1)]),t._v(" "),e("h5",{attrs:{id:"signing-with-a-hardware-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-a-hardware-wallet"}},[t._v("#")]),t._v(" Signing with a hardware wallet")]),t._v(" "),e("p",[t._v("BTCPay Server has built-in hardware wallet support allowing you to "),e("strong",[t._v("use your hardware wallet with BTCPay")]),t._v(", without leaking information to third-party apps or servers.")]),t._v(" "),e("p",[e("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[t._v("Check instructions")]),t._v(" on how to set up and sign with a "),e("a",{attrs:{href:"https://github.com/bitcoin-core/HWI#device-support",target:"_blank",rel:"noopener noreferrer"}},[t._v("compatible hardware wallet"),e("OutboundLink")],1),t._v(".")],1),t._v(" "),e("h5",{attrs:{id:"signing-with-a-hot-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-with-a-hot-wallet"}},[t._v("#")]),t._v(" Signing with a hot wallet")]),t._v(" "),e("p",[t._v("If you "),e("RouterLink",{attrs:{to:"/CreateWallet/"}},[t._v("created a new wallet")]),t._v(" when setting up your store and enabled it as a "),e("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[t._v("hot wallet")]),t._v(", since version 1.2.0, we've added an option that when a "),e("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[t._v("hot wallet")]),t._v(" is created, it'll automatically use the seed stored on a server to sign.")],1),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),e("p",[t._v("Using the hot wallet feature comes with security implications; please be sure to read and understand them over at the "),e("RouterLink",{attrs:{to:"/CreateWallet/#security-implications"}},[t._v("Hot Wallet documentation")])],1)]),t._v(" "),e("h3",{attrs:{id:"receive"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#receive"}},[t._v("#")]),t._v(" Receive")]),t._v(" "),e("p",[t._v("The Receive tab "),e("strong",[t._v("generates an unused address which can be used to receive payments")]),t._v(". The same can be achieved by generating an invoice (Invoices > Create new invoice).")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(666),alt:"Wallet Receive",title:"Wallet Receive"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(667),alt:"Wallet Receive Two",title:"Wallet Receive Two"}})]),t._v(" "),e("h3",{attrs:{id:"pull-payments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#pull-payments"}},[t._v("#")]),t._v(" Pull Payments")]),t._v(" "),e("p",[t._v("This feature gives you the ability to "),e("strong",[t._v("create a Pull Payment")]),t._v(", so that an outside individual may request to "),e("code",[t._v("pull")]),t._v(" funds from your wallet.")]),t._v(" "),e("p",[t._v("For more information, see "),e("RouterLink",{attrs:{to:"/PullPayments/"}},[t._v("Pull Payments")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"payouts"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#payouts"}},[t._v("#")]),t._v(" Payouts")]),t._v(" "),e("p",[t._v("This section lets you manage Pull Payments and gives you the ability to "),e("strong",[t._v("accept or decline payouts requested by outside individuals")]),t._v(".")]),t._v(" "),e("p",[t._v("For more information, see "),e("RouterLink",{attrs:{to:"/PullPayments/#approve-and-pay-a-payout"}},[t._v("Payouts")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#settings"}},[t._v("#")]),t._v(" Settings")]),t._v(" "),e("p",[t._v("In the top right corner of your "),e("code",[t._v("wallet")]),t._v(" you will find the "),e("code",[t._v("wallet settings")]),t._v(".\nIn the wallet settings tab you can adjust certain settings. If you've configured your wallet by "),e("RouterLink",{attrs:{to:"/CreateWallet/"}},[t._v("creating a new wallet")]),t._v(" or using an existing wallet via the "),e("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[t._v("hardware wallet integration")]),t._v(" these settings will be pre-configured.\nHere, you have the options to perform several actions on your wallet, such Rescanning wallet for missing transactions, prunning old transactions, view wallet phrase, remove wallet among features.")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(668),alt:"Wallet Rescan",title:"Wallet Rescan"}})]),t._v(" "),e("p",[t._v("If you manually added the extended public key from an external wallet, you'd need to adjust "),e("code",[t._v("AccountKeyPath")]),t._v(" that you can find in your external wallet, for example "),e("code",[t._v("m/84'/0'/0'")]),t._v(" to be able to spend from the BTCPay Wallet.")]),t._v(" "),e("p",[t._v("In "),e("code",[t._v("wallet settings")]),t._v(" you will also find the "),e("code",[t._v("speed policy")]),t._v(" for the specific store.\nThere are 2 main settings under "),e("code",[t._v("Payment")]),t._v(", "),e("RouterLink",{attrs:{to:"/FAQ/Stores/#payment-invalid-if-transactions-fails-to-confirm--minutes-after-invoice-expiration"}},[t._v("Payment invalid if transaction fails to confirm in ... after invoice creation")]),t._v(" and "),e("RouterLink",{attrs:{to:"/FAQ/Stores/#consider-the-invoice-confirmed-when-the-payment-transaction"}},[t._v("Consider the invoice confirmed when the payment transaction...")]),t._v(". The latter lets you set the number of confirmations required to be recognized as settled.")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(669),alt:"Wallet settings",title:"Wallet settings"}})]),t._v(" "),e("h3",{attrs:{id:"re-scan"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#re-scan"}},[t._v("#")]),t._v(" Re-scan")]),t._v(" "),e("p",[t._v("The Rescan relies on Bitcoin Core 0.17.0's "),e("code",[t._v("scantxoutset")]),t._v(" to "),e("strong",[t._v("scan the current state of the blockchain")]),t._v(" (called UTXO Set) for coins belonging to the configured derivation scheme.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(670),alt:"Wallet Rescan",title:"Wallet Rescan"}})]),t._v(" "),e("p",[t._v("Wallet re-scan solves two critical problems for BTCPay users:")]),t._v(" "),e("ol",[e("li",[e("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[t._v("Gap limit")])],1),t._v(" "),e("li",[t._v("Importing a previously used wallet")])]),t._v(" "),e("p",[e("strong",[t._v("Gap limit")]),t._v(": Most wallets typically have the address gap limit set to 20. This means that if a merchant receives 21 or more consecutive unpaid invoices, those wallets show the incorrect balance and some transactions may not be visible.")]),t._v(" "),e("p",[e("strong",[t._v("Wallet import")]),t._v(": When users add a derivation scheme of a wallet that had transactions in the past (previously used wallet), BTCPay won't be able to show the balance and transactions from the past.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(671),alt:"Wallet rescan progress",title:"Wallet rescan progress"}})]),t._v(" "),e("p",[t._v("Re-scan is a feature that solves both of these problems. Once the scan is complete, BTCPay Server will show the correct balance, along with the past transactions of the wallet.")]),t._v(" "),e("p",[t._v("Wallet re-scan requires access to the full node which means that this function is only available for server owners.")]),t._v(" "),e("p",[t._v("Users who use a third-party host should use a newly generated xpub key and also use an external wallet like Electrum which allows them to increase the gap limit.")]),t._v(" "),e("h3",{attrs:{id:"labels"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#labels"}},[t._v("#")]),t._v(" Labels")]),t._v(" "),e("p",[t._v("At the bottom of your wallet settings, you can manage your "),e("code",[t._v("custom transaction label")]),t._v(".")]),t._v(" "),e("p",[t._v("Clicking on the link would take you to a page where you can view all custom labels associated to all transaction. You can remove any or all custom labels given the required\npermission.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(672),alt:"Wallet settings",title:"Wallet settings"}})])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/32.5c1bc3c9.js b/assets/js/32.3355b5eb.js similarity index 98% rename from assets/js/32.5c1bc3c9.js rename to assets/js/32.3355b5eb.js index 558e4ecf2b..4a0696c178 100644 --- a/assets/js/32.5c1bc3c9.js +++ b/assets/js/32.3355b5eb.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{397:function(t,e,a){t.exports=a.p+"assets/img/dashboardgif.e52489e5.gif"},398:function(t,e,a){t.exports=a.p+"assets/img/wallet-view.7dad96c7.jpg"},399:function(t,e,a){t.exports=a.p+"assets/img/tx-activity-view.8254b07e.jpg"},400:function(t,e,a){t.exports=a.p+"assets/img/btcpayLNDashboard3.e08e2f1f.jpg"},401:function(t,e,a){t.exports=a.p+"assets/img/btcpayLNDashboard4.946731bb.jpg"},402:function(t,e,a){t.exports=a.p+"assets/img/recent-tx-view.34d9cd12.jpg"},403:function(t,e,a){t.exports=a.p+"assets/img/recent-invoice-view.d6235bab.jpg"},404:function(t,e,a){t.exports=a.p+"assets/img/fund-full-view.79683f5c.jpg"},790:function(t,e,a){"use strict";a.r(e);var i=a(17),r=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"dashboard"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dashboard"}},[t._v("#")]),t._v(" Dashboard")]),t._v(" "),e("p",[t._v("BTCPay Server version 1.5.0 introduced a new dashboard concept that features several tiles that will help with the initial setup, better understand the store's data and manage refunds and payouts with ease.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(397),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),e("h2",{attrs:{id:"dashboard-tiles"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dashboard-tiles"}},[t._v("#")]),t._v(" Dashboard tiles")]),t._v(" "),e("p",[t._v("In the main dashboard view, you'll find a couple of tiles that we think could help you quickly overview your store's performance.")]),t._v(" "),e("h3",{attrs:{id:"wallet-balance"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wallet-balance"}},[t._v("#")]),t._v(" Wallet Balance")]),t._v(" "),e("p",[t._v("The current store's "),e("RouterLink",{attrs:{to:"/Wallet/"}},[t._v("wallet")]),t._v(" balance, showing a graph by week, month, or year.")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(398),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),e("h3",{attrs:{id:"transaction-activity"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transaction-activity"}},[t._v("#")]),t._v(" Transaction activity")]),t._v(" "),e("p",[t._v("Quickly manage pending payouts, view recent transactions, and overview outstanding "),e("RouterLink",{attrs:{to:"/Refund/"}},[t._v("refunds")])],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(399),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),e("h3",{attrs:{id:"lightning-balance"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightning-balance"}},[t._v("#")]),t._v(" Lightning Balance")]),t._v(" "),e("p",[t._v("This will show the available balances for your Lightning node.\nPlease note that the on-chain balance refers to the wallet of your store's Lightning node, not the store's general on-chain wallet.")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("Node Info")]),t._v(" will show you a quick overview of your node, it's online status and the address to connect to for peers.\nFor more information on "),e("code",[t._v("Lightning Network")]),t._v(" check our "),e("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network page")]),t._v(".")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(400),alt:"BTCPay Server Dashboard LN",title:"BTCPay Server Dashboard LN"}})]),t._v(" "),e("h3",{attrs:{id:"lightning-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightning-services"}},[t._v("#")]),t._v(" Lightning Services")]),t._v(" "),e("p",[t._v("In this tile, you will find quick buttons to "),e("code",[t._v("Lightning Network")]),t._v(" services like:")]),t._v(" "),e("ul",[e("li",[t._v("Core Lightning (REST)")]),t._v(" "),e("li",[t._v("Ride The Lightning")]),t._v(" "),e("li",[t._v("ThunderHub")]),t._v(" "),e("li",[t._v("Lightning Terminal")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(401),alt:"BTCPay Server Dashboard LN",title:"BTCPay Server Dashboard LN"}})]),t._v(" "),e("h3",{attrs:{id:"recent-transactions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#recent-transactions"}},[t._v("#")]),t._v(" Recent Transactions")]),t._v(" "),e("p",[t._v("Showcasing the five most recent transactions that arrived to your on-chain wallet.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(402),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),e("h3",{attrs:{id:"recent-invoices"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#recent-invoices"}},[t._v("#")]),t._v(" Recent invoices")]),t._v(" "),e("p",[t._v("The five most recent invoices are shown with their corresponding status and value allowing you to quickly access and manage a particular "),e("RouterLink",{attrs:{to:"/Invoices/"}},[t._v("invoice")]),t._v(".")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(403),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),e("h3",{attrs:{id:"current-active-crowdfund"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#current-active-crowdfund"}},[t._v("#")]),t._v(" Current active crowdfund")]),t._v(" "),e("p",[t._v("This tile shows the current active crowdfunds, including their top-ranked items/perks. When more than one crowdfunding app is active crowdfund is, the tiles will show below the initial one. That's an easy way to manage your active crowdfund campaigns and see all the perks and how they're performing.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(404),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("This page is subject to change as the software progresses. Features will be updated by release.")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[32],{397:function(t,e,a){t.exports=a.p+"assets/img/dashboardgif.e52489e5.gif"},398:function(t,e,a){t.exports=a.p+"assets/img/wallet-view.7dad96c7.jpg"},399:function(t,e,a){t.exports=a.p+"assets/img/tx-activity-view.8254b07e.jpg"},400:function(t,e,a){t.exports=a.p+"assets/img/btcpayLNDashboard3.e08e2f1f.jpg"},401:function(t,e,a){t.exports=a.p+"assets/img/btcpayLNDashboard4.946731bb.jpg"},402:function(t,e,a){t.exports=a.p+"assets/img/recent-tx-view.34d9cd12.jpg"},403:function(t,e,a){t.exports=a.p+"assets/img/recent-invoice-view.d6235bab.jpg"},404:function(t,e,a){t.exports=a.p+"assets/img/fund-full-view.79683f5c.jpg"},789:function(t,e,a){"use strict";a.r(e);var i=a(17),r=Object(i.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"dashboard"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dashboard"}},[t._v("#")]),t._v(" Dashboard")]),t._v(" "),e("p",[t._v("BTCPay Server version 1.5.0 introduced a new dashboard concept that features several tiles that will help with the initial setup, better understand the store's data and manage refunds and payouts with ease.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(397),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),e("h2",{attrs:{id:"dashboard-tiles"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#dashboard-tiles"}},[t._v("#")]),t._v(" Dashboard tiles")]),t._v(" "),e("p",[t._v("In the main dashboard view, you'll find a couple of tiles that we think could help you quickly overview your store's performance.")]),t._v(" "),e("h3",{attrs:{id:"wallet-balance"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wallet-balance"}},[t._v("#")]),t._v(" Wallet Balance")]),t._v(" "),e("p",[t._v("The current store's "),e("RouterLink",{attrs:{to:"/Wallet/"}},[t._v("wallet")]),t._v(" balance, showing a graph by week, month, or year.")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(398),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),e("h3",{attrs:{id:"transaction-activity"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transaction-activity"}},[t._v("#")]),t._v(" Transaction activity")]),t._v(" "),e("p",[t._v("Quickly manage pending payouts, view recent transactions, and overview outstanding "),e("RouterLink",{attrs:{to:"/Refund/"}},[t._v("refunds")])],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(399),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),e("h3",{attrs:{id:"lightning-balance"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightning-balance"}},[t._v("#")]),t._v(" Lightning Balance")]),t._v(" "),e("p",[t._v("This will show the available balances for your Lightning node.\nPlease note that the on-chain balance refers to the wallet of your store's Lightning node, not the store's general on-chain wallet.")]),t._v(" "),e("p",[t._v("The "),e("code",[t._v("Node Info")]),t._v(" will show you a quick overview of your node, it's online status and the address to connect to for peers.\nFor more information on "),e("code",[t._v("Lightning Network")]),t._v(" check our "),e("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network page")]),t._v(".")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(400),alt:"BTCPay Server Dashboard LN",title:"BTCPay Server Dashboard LN"}})]),t._v(" "),e("h3",{attrs:{id:"lightning-services"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lightning-services"}},[t._v("#")]),t._v(" Lightning Services")]),t._v(" "),e("p",[t._v("In this tile, you will find quick buttons to "),e("code",[t._v("Lightning Network")]),t._v(" services like:")]),t._v(" "),e("ul",[e("li",[t._v("Core Lightning (REST)")]),t._v(" "),e("li",[t._v("Ride The Lightning")]),t._v(" "),e("li",[t._v("ThunderHub")]),t._v(" "),e("li",[t._v("Lightning Terminal")])]),t._v(" "),e("figure",[e("img",{attrs:{src:a(401),alt:"BTCPay Server Dashboard LN",title:"BTCPay Server Dashboard LN"}})]),t._v(" "),e("h3",{attrs:{id:"recent-transactions"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#recent-transactions"}},[t._v("#")]),t._v(" Recent Transactions")]),t._v(" "),e("p",[t._v("Showcasing the five most recent transactions that arrived to your on-chain wallet.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(402),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),e("h3",{attrs:{id:"recent-invoices"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#recent-invoices"}},[t._v("#")]),t._v(" Recent invoices")]),t._v(" "),e("p",[t._v("The five most recent invoices are shown with their corresponding status and value allowing you to quickly access and manage a particular "),e("RouterLink",{attrs:{to:"/Invoices/"}},[t._v("invoice")]),t._v(".")],1),t._v(" "),e("figure",[e("img",{attrs:{src:a(403),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),e("h3",{attrs:{id:"current-active-crowdfund"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#current-active-crowdfund"}},[t._v("#")]),t._v(" Current active crowdfund")]),t._v(" "),e("p",[t._v("This tile shows the current active crowdfunds, including their top-ranked items/perks. When more than one crowdfunding app is active crowdfund is, the tiles will show below the initial one. That's an easy way to manage your active crowdfund campaigns and see all the perks and how they're performing.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(404),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("This page is subject to change as the software progresses. Features will be updated by release.")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/35.ddb3535e.js b/assets/js/35.a6e66fb8.js similarity index 89% rename from assets/js/35.ddb3535e.js rename to assets/js/35.a6e66fb8.js index bc9a6cf985..131d5cf95c 100644 --- a/assets/js/35.ddb3535e.js +++ b/assets/js/35.a6e66fb8.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{604:function(t,e,a){t.exports=a.p+"assets/img/btcpay-1-send.45cbfd83.png"},605:function(t,e,a){t.exports=a.p+"assets/img/btcpay-2-choose-signing-method.6606170c.png"},606:function(t,e,a){t.exports=a.p+"assets/img/btcpay-3-download-psbt.438a81f5.png"},607:function(t,e,a){t.exports=a.p+"assets/img/sparrow-1-loaded-psbt-for-signing.24a6fc3d.png"},608:function(t,e,a){t.exports=a.p+"assets/img/sparrow-2-loaded-psbt-sign.0e112fd5.png"},609:function(t,e,a){t.exports=a.p+"assets/img/sparrow-3-scan-for-hww.4788196d.png"},610:function(t,e,a){t.exports=a.p+"assets/img/sparrow-4-unlocked-hww.0a8fb110.png"},611:function(t,e,a){t.exports=a.p+"assets/img/sparrow-5-broadcast-transaction.5dab7222.png"},884:function(t,e,a){"use strict";a.r(e);var n=a(17),r=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"creating-a-psbt-with-btcpay-server-and-sparrow-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-psbt-with-btcpay-server-and-sparrow-wallet"}},[t._v("#")]),t._v(" Creating a PSBT with BTCPay Server and Sparrow wallet")]),t._v(" "),e("p",[t._v("This guide explains how you can create a partially signed bitcoin transaction (PSBT) on BTCPay Server and sign and broadcast it with "),e("a",{attrs:{href:"https://www.sparrowwallet.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sparrow wallet"),e("OutboundLink")],1),t._v(". We use "),e("a",{attrs:{href:"https://bitbox.swiss/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BitBox02"),e("OutboundLink")],1),t._v(" hardware wallet in this example, but it will work with any other supported hardware wallet. This can be useful if you have an airgapped setup or persons creating the transaction and signing it are different people.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#1-creating-a-transaction-on-btcpay-server"}},[t._v("1. Creating a transaction (on BTCPay Server):")]),e("ul",[e("li",[e("a",{attrs:{href:"#on-send-screen"}},[t._v("On send screen:")])]),e("li",[e("a",{attrs:{href:"#on-choosing-signing-method-screen"}},[t._v("On choosing signing method screen:")])]),e("li",[e("a",{attrs:{href:"#on-psbt-screen"}},[t._v("On PSBT screen:")])])])]),e("li",[e("a",{attrs:{href:"#2-signing-and-sending-the-psbt-on-sparrow-wallet"}},[t._v("2. Signing and sending the PSBT (on Sparrow wallet)")]),e("ul",[e("li",[e("a",{attrs:{href:"#on-showing-the-imported-psbt-transaction"}},[t._v("On showing the imported PSBT transaction:")])]),e("li",[e("a",{attrs:{href:"#signing-the-transaction"}},[t._v("Signing the transaction:")])]),e("li",[e("a",{attrs:{href:"#connect-hardware-wallet-popup"}},[t._v("Connect Hardware wallet popup:")])]),e("li",[e("a",{attrs:{href:"#wallet-connected-successfully"}},[t._v("Wallet connected successfully:")])]),e("li",[e("a",{attrs:{href:"#broadcasting-the-transaction"}},[t._v("Broadcasting the transaction:")])])])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"1-creating-a-transaction-on-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1-creating-a-transaction-on-btcpay-server"}},[t._v("#")]),t._v(" 1. Creating a transaction (on BTCPay Server):")]),t._v(" "),e("ul",[e("li",[t._v("Log into your BTCPay Server and select the store you want to send from")]),t._v(" "),e("li",[t._v('Under "Wallets" select "Bitcoin"')]),t._v(" "),e("li",[t._v("Click on button "),e("strong",[t._v("[Send]")])])]),t._v(" "),e("h3",{attrs:{id:"on-send-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-send-screen"}},[t._v("#")]),t._v(" On send screen:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(604),alt:"BTCPay: Create transaction on BTCPay Server",title:"Create a transaction"}})]),t._v(" "),e("ul",[e("li",[t._v("Enter the destination bitcoin address")]),t._v(" "),e("li",[t._v("Enter the amount")]),t._v(" "),e("li",[t._v("Optional: Change fee rate (get the current fee rate on "),e("a",{attrs:{href:"https://mempool.space",target:"_blank",rel:"noopener noreferrer"}},[t._v("mempool.space"),e("OutboundLink")],1),t._v(" depending on how fast you want the transaction to be confirmed)")]),t._v(" "),e("li",[e("strong",[t._v("Important")]),t._v(': click on "Advanced Settings" so it expands and check "'),e("strong",[t._v("Always include non-witness UTXO if available")]),t._v('" (this is needed so hardware wallets like BitBox02 can sign the transaction)')]),t._v(" "),e("li",[t._v('Optional: on "Allow fee increase (RBF)", set to "Yes" (this is useful if you select a too low fee you can bump the fee so your transaction is not stuck and get’s confirmed)')]),t._v(" "),e("li",[t._v("Click "),e("strong",[t._v("[Sign transaction]")]),t._v(" button")])]),t._v(" "),e("h3",{attrs:{id:"on-choosing-signing-method-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-choosing-signing-method-screen"}},[t._v("#")]),t._v(" On choosing signing method screen:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(605),alt:"BTCPay: Choose signing method: Partially Signed Bitcoin Transaction",title:"Select Partially Signed Bitcoin Transaction"}})]),t._v(" "),e("ul",[e("li",[t._v('Select "Partially Signed Bitcoin Transaction"')])]),t._v(" "),e("h3",{attrs:{id:"on-psbt-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-psbt-screen"}},[t._v("#")]),t._v(" On PSBT screen:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(606),alt:"BTCPay: Download the PSBT file",title:"PSBT screen overview, download PSBT"}})]),t._v(" "),e("ul",[e("li",[t._v('Open the accordion of "Export PSBT for signing" click on button '),e("strong",[t._v("[Download PSBT file]")])]),t._v(" "),e("li",[t._v("Store the file on hard-drive (you can use it to sign the PSBT yourself, or you can send it to somebody doing the signing on Sparrow wallet, see below); e.g. psbt-export.psbt")])]),t._v(" "),e("h2",{attrs:{id:"2-signing-and-sending-the-psbt-on-sparrow-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2-signing-and-sending-the-psbt-on-sparrow-wallet"}},[t._v("#")]),t._v(" 2. Signing and sending the PSBT (on Sparrow wallet)")]),t._v(" "),e("ul",[e("li",[t._v("Open your Sparrow wallet app and corresponding wallet holding the data for the xPub used in your store")]),t._v(" "),e("li",[t._v("Next, import the PSBT file you created on BTCPay Server")]),t._v(" "),e("li",[t._v("In menu: File -> Open Transaction -> File...")]),t._v(" "),e("li",[t._v("Select the file you stored (or got sent from accounting) e.g. psbt-export.psbt")])]),t._v(" "),e("h3",{attrs:{id:"on-showing-the-imported-psbt-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-showing-the-imported-psbt-transaction"}},[t._v("#")]),t._v(" On showing the imported PSBT transaction:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(607),alt:"Sparrow wallet: Load the PSBT file",title:"Loaded PSBT for signing"}})]),t._v(" "),e("ul",[e("li",[t._v('Make sure under headline "Signatures:" the "signing wallet" matches the wallet you want to sent from')]),t._v(" "),e("li",[t._v("Click on "),e("strong",[t._v("[Finalize Transaction for Signing]")])])]),t._v(" "),e("h3",{attrs:{id:"signing-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-the-transaction"}},[t._v("#")]),t._v(" Signing the transaction:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(608),alt:"Sparrow wallet: PSBT loaded, ready for signing",title:"Sparrow wallet: PSBT loaded, ready for signing"}})]),t._v(" "),e("ul",[e("li",[t._v("Click on "),e("strong",[t._v("[Sign]")])])]),t._v(" "),e("h3",{attrs:{id:"connect-hardware-wallet-popup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connect-hardware-wallet-popup"}},[t._v("#")]),t._v(" Connect Hardware wallet popup:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(609),alt:"Sparrow wallet: connect to hardware wallet (e.g. in our case BitBox02)",title:"Connect your hardware wallet"}})]),t._v(" "),e("ul",[e("li",[t._v("Plug-in your hardware wallet (BitBox02 in our case)")]),t._v(" "),e("li",[t._v("Enter your hardware wallet pin (for BitBox02 it shows on screen open BitBox app but you do not need to, wait until you can enter the pin)")]),t._v(" "),e("li",[t._v("After BitBox02 unlocked, click "),e("strong",[t._v("[Scan...]")]),t._v(", your hardware wallet will show up")])]),t._v(" "),e("h3",{attrs:{id:"wallet-connected-successfully"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wallet-connected-successfully"}},[t._v("#")]),t._v(" Wallet connected successfully:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(610),alt:"Sparrow wallet: hardware wallet successfully connected",title:"BitBox02 successfully connected"}})]),t._v(" "),e("ul",[e("li",[t._v("Click "),e("strong",[t._v("[Sign]")])]),t._v(" "),e("li",[t._v("A summary of the transaction will be shown on the BitBox02 device, you need to confirm it there")])]),t._v(" "),e("h3",{attrs:{id:"broadcasting-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#broadcasting-the-transaction"}},[t._v("#")]),t._v(" Broadcasting the transaction:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(611),alt:"Sparrow wallet: broadcast the transaction",title:"Broadcast the transaction"}})]),t._v(" "),e("ul",[e("li",[t._v("After signing was successful you need to broadcast the transaction to the Bitcoin network")]),t._v(" "),e("li",[t._v("Click "),e("strong",[t._v("[Broadcast Transaction]")])])]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Alternatively, instead of broadcasting the transaction from Sparrow wallet (e.g. if you have an airgapped setup) you could also copy and paste the signed transaction PSBT from the textbox and upload it to your BTCPay Server and let it broadcast the transaction to the network.")])]),t._v(" "),e("p",[e("strong",[t._v("Congrats, done!")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{623:function(t,e,a){t.exports=a.p+"assets/img/btcpay-1-send.45cbfd83.png"},624:function(t,e,a){t.exports=a.p+"assets/img/btcpay-2-choose-signing-method.6606170c.png"},625:function(t,e,a){t.exports=a.p+"assets/img/btcpay-3-download-psbt.438a81f5.png"},626:function(t,e,a){t.exports=a.p+"assets/img/sparrow-1-loaded-psbt-for-signing.24a6fc3d.png"},627:function(t,e,a){t.exports=a.p+"assets/img/sparrow-2-loaded-psbt-sign.0e112fd5.png"},628:function(t,e,a){t.exports=a.p+"assets/img/sparrow-3-scan-for-hww.4788196d.png"},629:function(t,e,a){t.exports=a.p+"assets/img/sparrow-4-unlocked-hww.0a8fb110.png"},630:function(t,e,a){t.exports=a.p+"assets/img/sparrow-5-broadcast-transaction.5dab7222.png"},888:function(t,e,a){"use strict";a.r(e);var n=a(17),r=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"creating-a-psbt-with-btcpay-server-and-sparrow-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#creating-a-psbt-with-btcpay-server-and-sparrow-wallet"}},[t._v("#")]),t._v(" Creating a PSBT with BTCPay Server and Sparrow wallet")]),t._v(" "),e("p",[t._v("This guide explains how you can create a partially signed bitcoin transaction (PSBT) on BTCPay Server and sign and broadcast it with "),e("a",{attrs:{href:"https://www.sparrowwallet.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sparrow wallet"),e("OutboundLink")],1),t._v(". We use "),e("a",{attrs:{href:"https://bitbox.swiss/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BitBox02"),e("OutboundLink")],1),t._v(" hardware wallet in this example, but it will work with any other supported hardware wallet. This can be useful if you have an airgapped setup or persons creating the transaction and signing it are different people.")]),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#1-creating-a-transaction-on-btcpay-server"}},[t._v("1. Creating a transaction (on BTCPay Server):")]),e("ul",[e("li",[e("a",{attrs:{href:"#on-send-screen"}},[t._v("On send screen:")])]),e("li",[e("a",{attrs:{href:"#on-choosing-signing-method-screen"}},[t._v("On choosing signing method screen:")])]),e("li",[e("a",{attrs:{href:"#on-psbt-screen"}},[t._v("On PSBT screen:")])])])]),e("li",[e("a",{attrs:{href:"#2-signing-and-sending-the-psbt-on-sparrow-wallet"}},[t._v("2. Signing and sending the PSBT (on Sparrow wallet)")]),e("ul",[e("li",[e("a",{attrs:{href:"#on-showing-the-imported-psbt-transaction"}},[t._v("On showing the imported PSBT transaction:")])]),e("li",[e("a",{attrs:{href:"#signing-the-transaction"}},[t._v("Signing the transaction:")])]),e("li",[e("a",{attrs:{href:"#connect-hardware-wallet-popup"}},[t._v("Connect Hardware wallet popup:")])]),e("li",[e("a",{attrs:{href:"#wallet-connected-successfully"}},[t._v("Wallet connected successfully:")])]),e("li",[e("a",{attrs:{href:"#broadcasting-the-transaction"}},[t._v("Broadcasting the transaction:")])])])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"1-creating-a-transaction-on-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1-creating-a-transaction-on-btcpay-server"}},[t._v("#")]),t._v(" 1. Creating a transaction (on BTCPay Server):")]),t._v(" "),e("ul",[e("li",[t._v("Log into your BTCPay Server and select the store you want to send from")]),t._v(" "),e("li",[t._v('Under "Wallets" select "Bitcoin"')]),t._v(" "),e("li",[t._v("Click on button "),e("strong",[t._v("[Send]")])])]),t._v(" "),e("h3",{attrs:{id:"on-send-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-send-screen"}},[t._v("#")]),t._v(" On send screen:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(623),alt:"BTCPay: Create transaction on BTCPay Server",title:"Create a transaction"}})]),t._v(" "),e("ul",[e("li",[t._v("Enter the destination bitcoin address")]),t._v(" "),e("li",[t._v("Enter the amount")]),t._v(" "),e("li",[t._v("Optional: Change fee rate (get the current fee rate on "),e("a",{attrs:{href:"https://mempool.space",target:"_blank",rel:"noopener noreferrer"}},[t._v("mempool.space"),e("OutboundLink")],1),t._v(" depending on how fast you want the transaction to be confirmed)")]),t._v(" "),e("li",[e("strong",[t._v("Important")]),t._v(': click on "Advanced Settings" so it expands and check "'),e("strong",[t._v("Always include non-witness UTXO if available")]),t._v('" (this is needed so hardware wallets like BitBox02 can sign the transaction)')]),t._v(" "),e("li",[t._v('Optional: on "Allow fee increase (RBF)", set to "Yes" (this is useful if you select a too low fee you can bump the fee so your transaction is not stuck and get’s confirmed)')]),t._v(" "),e("li",[t._v("Click "),e("strong",[t._v("[Sign transaction]")]),t._v(" button")])]),t._v(" "),e("h3",{attrs:{id:"on-choosing-signing-method-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-choosing-signing-method-screen"}},[t._v("#")]),t._v(" On choosing signing method screen:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(624),alt:"BTCPay: Choose signing method: Partially Signed Bitcoin Transaction",title:"Select Partially Signed Bitcoin Transaction"}})]),t._v(" "),e("ul",[e("li",[t._v('Select "Partially Signed Bitcoin Transaction"')])]),t._v(" "),e("h3",{attrs:{id:"on-psbt-screen"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-psbt-screen"}},[t._v("#")]),t._v(" On PSBT screen:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(625),alt:"BTCPay: Download the PSBT file",title:"PSBT screen overview, download PSBT"}})]),t._v(" "),e("ul",[e("li",[t._v('Open the accordion of "Export PSBT for signing" click on button '),e("strong",[t._v("[Download PSBT file]")])]),t._v(" "),e("li",[t._v("Store the file on hard-drive (you can use it to sign the PSBT yourself, or you can send it to somebody doing the signing on Sparrow wallet, see below); e.g. psbt-export.psbt")])]),t._v(" "),e("h2",{attrs:{id:"2-signing-and-sending-the-psbt-on-sparrow-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2-signing-and-sending-the-psbt-on-sparrow-wallet"}},[t._v("#")]),t._v(" 2. Signing and sending the PSBT (on Sparrow wallet)")]),t._v(" "),e("ul",[e("li",[t._v("Open your Sparrow wallet app and corresponding wallet holding the data for the xPub used in your store")]),t._v(" "),e("li",[t._v("Next, import the PSBT file you created on BTCPay Server")]),t._v(" "),e("li",[t._v("In menu: File -> Open Transaction -> File...")]),t._v(" "),e("li",[t._v("Select the file you stored (or got sent from accounting) e.g. psbt-export.psbt")])]),t._v(" "),e("h3",{attrs:{id:"on-showing-the-imported-psbt-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#on-showing-the-imported-psbt-transaction"}},[t._v("#")]),t._v(" On showing the imported PSBT transaction:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(626),alt:"Sparrow wallet: Load the PSBT file",title:"Loaded PSBT for signing"}})]),t._v(" "),e("ul",[e("li",[t._v('Make sure under headline "Signatures:" the "signing wallet" matches the wallet you want to sent from')]),t._v(" "),e("li",[t._v("Click on "),e("strong",[t._v("[Finalize Transaction for Signing]")])])]),t._v(" "),e("h3",{attrs:{id:"signing-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#signing-the-transaction"}},[t._v("#")]),t._v(" Signing the transaction:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(627),alt:"Sparrow wallet: PSBT loaded, ready for signing",title:"Sparrow wallet: PSBT loaded, ready for signing"}})]),t._v(" "),e("ul",[e("li",[t._v("Click on "),e("strong",[t._v("[Sign]")])])]),t._v(" "),e("h3",{attrs:{id:"connect-hardware-wallet-popup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#connect-hardware-wallet-popup"}},[t._v("#")]),t._v(" Connect Hardware wallet popup:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(628),alt:"Sparrow wallet: connect to hardware wallet (e.g. in our case BitBox02)",title:"Connect your hardware wallet"}})]),t._v(" "),e("ul",[e("li",[t._v("Plug-in your hardware wallet (BitBox02 in our case)")]),t._v(" "),e("li",[t._v("Enter your hardware wallet pin (for BitBox02 it shows on screen open BitBox app but you do not need to, wait until you can enter the pin)")]),t._v(" "),e("li",[t._v("After BitBox02 unlocked, click "),e("strong",[t._v("[Scan...]")]),t._v(", your hardware wallet will show up")])]),t._v(" "),e("h3",{attrs:{id:"wallet-connected-successfully"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#wallet-connected-successfully"}},[t._v("#")]),t._v(" Wallet connected successfully:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(629),alt:"Sparrow wallet: hardware wallet successfully connected",title:"BitBox02 successfully connected"}})]),t._v(" "),e("ul",[e("li",[t._v("Click "),e("strong",[t._v("[Sign]")])]),t._v(" "),e("li",[t._v("A summary of the transaction will be shown on the BitBox02 device, you need to confirm it there")])]),t._v(" "),e("h3",{attrs:{id:"broadcasting-the-transaction"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#broadcasting-the-transaction"}},[t._v("#")]),t._v(" Broadcasting the transaction:")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(630),alt:"Sparrow wallet: broadcast the transaction",title:"Broadcast the transaction"}})]),t._v(" "),e("ul",[e("li",[t._v("After signing was successful you need to broadcast the transaction to the Bitcoin network")]),t._v(" "),e("li",[t._v("Click "),e("strong",[t._v("[Broadcast Transaction]")])])]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("Alternatively, instead of broadcasting the transaction from Sparrow wallet (e.g. if you have an airgapped setup) you could also copy and paste the signed transaction PSBT from the textbox and upload it to your BTCPay Server and let it broadcast the transaction to the network.")])]),t._v(" "),e("p",[e("strong",[t._v("Congrats, done!")])])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/41.6bb6d0af.js b/assets/js/41.2f27517d.js similarity index 99% rename from assets/js/41.6bb6d0af.js rename to assets/js/41.2f27517d.js index ed72c54192..9496d5bedd 100644 --- a/assets/js/41.6bb6d0af.js +++ b/assets/js/41.2f27517d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{548:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Receive_1.9b34f175.png"},549:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Receive_2.46633674.png"},550:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Receive_3.9eede34c.png"},551:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Pay_1.b4dc6b43.png"},552:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Pay_2.8a0a51a4.png"},553:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Pay_3.6dc7c8c0.png"},554:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Pay_4.5608332a.png"},869:function(e,a,t){"use strict";t.r(a);var i=t(17),o=Object(i.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"btcpay-server-payjoin-guide"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-payjoin-guide"}},[e._v("#")]),e._v(" BTCPay Server Payjoin Guide")]),e._v(" "),a("p",[e._v("This document explains how to use BTCPay Server's "),a("strong",[e._v("Payjoin")]),e._v(" feature. For a detailed, technical explanation of how payjoin is implemented, check "),a("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0078.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[e._v("BIP78"),a("OutboundLink")],1)]),e._v(" "),a("p",[e._v("You can follow this video to better understand what payjoin is and how to use it.")]),e._v(" "),a("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/-Wrqv6nSmAM/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=-Wrqv6nSmAM",title:"How to use Payjoin with BTCPay Server","data-id":"-Wrqv6nSmAM"}},[a("iframe",{attrs:{title:"How to use Payjoin with BTCPay Server","data-src":"https://www.youtube-nocookie.com/embed/-Wrqv6nSmAM?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),a("h2",{attrs:{id:"enabling-payjoin-as-a-merchant"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enabling-payjoin-as-a-merchant"}},[e._v("#")]),e._v(" Enabling Payjoin as a merchant")]),e._v(" "),a("ol",[a("li",[e._v("Create a store")]),e._v(" "),a("li",[e._v("Configure a "),a("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[e._v("hot wallet")]),e._v(" for your derivation scheme. Be sure to use either segwit or segwit wrapped as the address type.")],1),e._v(" "),a("li",[e._v('Enable Payjoin/P2EP in the "General Settings" and click "Save"')])]),e._v(" "),a("p",[e._v("It's important to note that you will need at least 1 UTXO for payjoin to work.")]),e._v(" "),a("figure",[a("img",{attrs:{src:t(548),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(549),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(550),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("h2",{attrs:{id:"paying-to-payjoin-as-a-user"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#paying-to-payjoin-as-a-user"}},[e._v("#")]),e._v(" Paying to Payjoin as a user")]),e._v(" "),a("p",[e._v("The "),a("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("BTCPay Wallet")]),e._v(" supports Payjoin.")],1),e._v(" "),a("ol",[a("li",[e._v("Retrieve the BIP21 payment link from a BTCPay Server invoice which has payjoin enabled by either:\n"),a("ul",[a("li",[e._v("Scan the QR code with the camera scanning feature")]),e._v(" "),a("li",[e._v('Copy the link from the "Open in wallet" button and paste it in the "Parse BIP21" prompt')])])]),e._v(" "),a("li",[e._v('The send form should be populated with the payment details. You can check if the invoice supports payjoin by expanding "advanced settings" to see if there is a "Payjoin endpoint" input with a url.')]),e._v(" "),a("li",[e._v("Sign your transaction using either BTCPay Server's hardware wallet support via "),a("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[e._v("BTCPay Vault")]),e._v(" or the "),a("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[e._v("hot wallet")]),e._v(" feature.")],1),e._v(" "),a("li",[e._v("Once your original transaction is ready, you will be given the option to either "),a("code",[e._v("Broadcast (Payjoin)")]),e._v(" or to "),a("code",[e._v("Broadcast (Simple)")]),e._v(". Choose "),a("code",[e._v("Broadcast (Payjoin)")]),e._v(".")]),e._v(" "),a("li",[e._v("The payjoin server will propose a new special transaction, if possible. If the payjoin server is unable to do the payjoin, the original transaction is broadcast instead.")]),e._v(" "),a("li",[e._v("If you are using a hardware wallet, you will be asked to sign the payjoin transaction again (the hot wallet feature signs the transaction for you automatically).")]),e._v(" "),a("li",[e._v("Congratulations, you've just helped improve Bitcoin's fungibility and your financial sovereignty!")])]),e._v(" "),a("figure",[a("img",{attrs:{src:t(551),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(552),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(553),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(554),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("h2",{attrs:{id:"why-did-a-payjoin-not-happen"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#why-did-a-payjoin-not-happen"}},[e._v("#")]),e._v(" Why did a payjoin not happen?")]),e._v(" "),a("p",[e._v("There's multiple reasons for this:")]),e._v(" "),a("ul",[a("li",[e._v("The store did not have any utxos to contribute towards a payjoin")]),e._v(" "),a("li",[e._v("Your wallet does not use the same format as the store's (essential to not raise suspicion to analysis companies)")]),e._v(" "),a("li",[e._v("You are not using segwit or p2sh wrapped segwit.")]),e._v(" "),a("li",[e._v("The payjoin server is not available")])]),e._v(" "),a("h2",{attrs:{id:"supported-wallets"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#supported-wallets"}},[e._v("#")]),e._v(" Supported wallets")]),e._v(" "),a("p",[e._v("Please contact and encourage your wallet developers to add support. The more widespread the "),a("strong",[e._v("usage of payjoin")]),e._v(", the more broken the heuristics used by blockchain analysis companies become and can effectively trace your financial history. If you are a wallet developer, please "),a("RouterLink",{attrs:{to:"/Community/"}},[e._v("contact us")]),e._v(" if you need help or have feedback.")],1)])}),[],!1,null,null,null);a.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{548:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Receive_1.9b34f175.png"},549:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Receive_2.46633674.png"},550:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Receive_3.9eede34c.png"},551:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Pay_1.b4dc6b43.png"},552:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Pay_2.8a0a51a4.png"},553:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Pay_3.6dc7c8c0.png"},554:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Pay_4.5608332a.png"},868:function(e,a,t){"use strict";t.r(a);var i=t(17),o=Object(i.a)({},(function(){var e=this,a=e._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[a("h1",{attrs:{id:"btcpay-server-payjoin-guide"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-payjoin-guide"}},[e._v("#")]),e._v(" BTCPay Server Payjoin Guide")]),e._v(" "),a("p",[e._v("This document explains how to use BTCPay Server's "),a("strong",[e._v("Payjoin")]),e._v(" feature. For a detailed, technical explanation of how payjoin is implemented, check "),a("a",{attrs:{href:"https://github.com/bitcoin/bips/blob/master/bip-0078.mediawiki",target:"_blank",rel:"noopener noreferrer"}},[e._v("BIP78"),a("OutboundLink")],1)]),e._v(" "),a("p",[e._v("You can follow this video to better understand what payjoin is and how to use it.")]),e._v(" "),a("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/-Wrqv6nSmAM/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=-Wrqv6nSmAM",title:"How to use Payjoin with BTCPay Server","data-id":"-Wrqv6nSmAM"}},[a("iframe",{attrs:{title:"How to use Payjoin with BTCPay Server","data-src":"https://www.youtube-nocookie.com/embed/-Wrqv6nSmAM?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),a("h2",{attrs:{id:"enabling-payjoin-as-a-merchant"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#enabling-payjoin-as-a-merchant"}},[e._v("#")]),e._v(" Enabling Payjoin as a merchant")]),e._v(" "),a("ol",[a("li",[e._v("Create a store")]),e._v(" "),a("li",[e._v("Configure a "),a("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[e._v("hot wallet")]),e._v(" for your derivation scheme. Be sure to use either segwit or segwit wrapped as the address type.")],1),e._v(" "),a("li",[e._v('Enable Payjoin/P2EP in the "General Settings" and click "Save"')])]),e._v(" "),a("p",[e._v("It's important to note that you will need at least 1 UTXO for payjoin to work.")]),e._v(" "),a("figure",[a("img",{attrs:{src:t(548),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(549),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(550),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("h2",{attrs:{id:"paying-to-payjoin-as-a-user"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#paying-to-payjoin-as-a-user"}},[e._v("#")]),e._v(" Paying to Payjoin as a user")]),e._v(" "),a("p",[e._v("The "),a("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("BTCPay Wallet")]),e._v(" supports Payjoin.")],1),e._v(" "),a("ol",[a("li",[e._v("Retrieve the BIP21 payment link from a BTCPay Server invoice which has payjoin enabled by either:\n"),a("ul",[a("li",[e._v("Scan the QR code with the camera scanning feature")]),e._v(" "),a("li",[e._v('Copy the link from the "Open in wallet" button and paste it in the "Parse BIP21" prompt')])])]),e._v(" "),a("li",[e._v('The send form should be populated with the payment details. You can check if the invoice supports payjoin by expanding "advanced settings" to see if there is a "Payjoin endpoint" input with a url.')]),e._v(" "),a("li",[e._v("Sign your transaction using either BTCPay Server's hardware wallet support via "),a("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[e._v("BTCPay Vault")]),e._v(" or the "),a("RouterLink",{attrs:{to:"/CreateWallet/#hot-wallet"}},[e._v("hot wallet")]),e._v(" feature.")],1),e._v(" "),a("li",[e._v("Once your original transaction is ready, you will be given the option to either "),a("code",[e._v("Broadcast (Payjoin)")]),e._v(" or to "),a("code",[e._v("Broadcast (Simple)")]),e._v(". Choose "),a("code",[e._v("Broadcast (Payjoin)")]),e._v(".")]),e._v(" "),a("li",[e._v("The payjoin server will propose a new special transaction, if possible. If the payjoin server is unable to do the payjoin, the original transaction is broadcast instead.")]),e._v(" "),a("li",[e._v("If you are using a hardware wallet, you will be asked to sign the payjoin transaction again (the hot wallet feature signs the transaction for you automatically).")]),e._v(" "),a("li",[e._v("Congratulations, you've just helped improve Bitcoin's fungibility and your financial sovereignty!")])]),e._v(" "),a("figure",[a("img",{attrs:{src:t(551),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(552),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(553),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(554),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("h2",{attrs:{id:"why-did-a-payjoin-not-happen"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#why-did-a-payjoin-not-happen"}},[e._v("#")]),e._v(" Why did a payjoin not happen?")]),e._v(" "),a("p",[e._v("There's multiple reasons for this:")]),e._v(" "),a("ul",[a("li",[e._v("The store did not have any utxos to contribute towards a payjoin")]),e._v(" "),a("li",[e._v("Your wallet does not use the same format as the store's (essential to not raise suspicion to analysis companies)")]),e._v(" "),a("li",[e._v("You are not using segwit or p2sh wrapped segwit.")]),e._v(" "),a("li",[e._v("The payjoin server is not available")])]),e._v(" "),a("h2",{attrs:{id:"supported-wallets"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#supported-wallets"}},[e._v("#")]),e._v(" Supported wallets")]),e._v(" "),a("p",[e._v("Please contact and encourage your wallet developers to add support. The more widespread the "),a("strong",[e._v("usage of payjoin")]),e._v(", the more broken the heuristics used by blockchain analysis companies become and can effectively trace your financial history. If you are a wallet developer, please "),a("RouterLink",{attrs:{to:"/Community/"}},[e._v("contact us")]),e._v(" if you need help or have feedback.")],1)])}),[],!1,null,null,null);a.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/42.e55dc09c.js b/assets/js/42.9ea78455.js similarity index 84% rename from assets/js/42.e55dc09c.js rename to assets/js/42.9ea78455.js index 41ba1b5302..ad3221094f 100644 --- a/assets/js/42.e55dc09c.js +++ b/assets/js/42.9ea78455.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{612:function(t,a,e){t.exports=e.p+"assets/img/01_Translation.74ed4506.png"},613:function(t,a,e){t.exports=e.p+"assets/img/02_Translation.c6f2bd99.png"},614:function(t,a,e){t.exports=e.p+"assets/img/03_Translation_creation.d83c5a42.png"},615:function(t,a,e){t.exports=e.p+"assets/img/04_Translation_dictionary.44ae9f0a.png"},616:function(t,a,e){t.exports=e.p+"assets/img/05_Translation_Add_Role_To_Yoruba.b8350fa8.png"},617:function(t,a,e){t.exports=e.p+"assets/img/06_Translation_Saved_Dictionary.6cc6b25d.png"},618:function(t,a,e){t.exports=e.p+"assets/img/07_Translation_Validation.9625e320.png"},886:function(t,a,e){"use strict";e.r(a);var n=e(17),s=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"using-btcpay-translation-feature-to-localize-your-btcpay-server-instance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using-btcpay-translation-feature-to-localize-your-btcpay-server-instance"}},[t._v("#")]),t._v(" Using BTCPay Translation Feature to Localize Your BTCPay Server instance")]),t._v(" "),a("p",[t._v("Since version 2.0 BTCPay Server includes a translation feature that allows administrators to set up a default language for users accessing their instance.")]),t._v(" "),a("p",[t._v("With this feature, you can replace the default English text across the entire back-office with your chosen language.")]),t._v(" "),a("p",[t._v("Here’s how you can create and manage translations to make the BTCPay server easier to use.")]),t._v(" "),a("h2",{attrs:{id:"translating-btcpay-server"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#translating-btcpay-server"}},[t._v("#")]),t._v(" Translating BTCPay Server")]),t._v(" "),a("ol",[a("li",[t._v("Log in to your BTCPay Server instance.")]),t._v(" "),a("li",[t._v("Navigate to Translation on "),a("strong",[t._v("Server Settings")]),t._v(" >> "),a("strong",[t._v("Translations")]),t._v(".")])]),t._v(" "),a("figure",[a("img",{attrs:{src:e(612),alt:"Translation 1",title:"Translation 1"}})]),t._v(" "),a("ol",{attrs:{start:"3"}},[a("li",[a("p",[t._v("Click "),a("strong",[t._v("Create")]),t._v(" button to generate a new language dictionary.")])]),t._v(" "),a("li",[a("p",[t._v("Enter the dictionary name you want to save the language collection with and then click "),a("strong",[t._v("Create")]),t._v(" button to create the dictionary.")])])]),t._v(" "),a("figure",[a("img",{attrs:{src:e(613),alt:"Translation 2",title:"Translation 2"}})]),t._v(" "),a("figure",[a("img",{attrs:{src:e(614),alt:"Translation 3",title:"Translation 3"}})]),t._v(" "),a("figure",[a("img",{attrs:{src:e(615),alt:"Translation 4",title:"Translation 4"}})]),t._v(" "),a("p",[t._v("In the image above, you can see a dictionary of words that can be translated on your BTCPay Server.")]),t._v(" "),a("p",[t._v("The dictionary is usually organized as pairs of "),a("code",[t._v('"key": "value"')]),t._v(", where:")]),t._v(" "),a("p",[a("strong",[t._v("Key:")]),t._v(" The original English text or phrase in your BTCPay instance.")]),t._v(" "),a("p",[a("strong",[t._v("Value:")]),t._v(" The translated text you want to display.")]),t._v(" "),a("p",[t._v("For each English term, enter its equivalent in your chosen language in the corresponding text. Be sure to review for accuracy and clarity.")]),t._v(" "),a("p",[t._v('For example, lets translate "Add Role" into Yoruba. Since I created a dictionary for Yoruba, I’ll provide the translation in Yoruba.')]),t._v(" "),a("figure",[a("img",{attrs:{src:e(616),alt:"Translation 5",title:"Translation 5"}})]),t._v(" "),a("p",[t._v("Replace the text and click the "),a("strong",[t._v("Save")]),t._v(" button. A confirmation message will appear indicating that your translations have been successfully saved. Next, click the "),a("strong",[t._v("Select")]),t._v(" button for the new dictionary to set it as the default for the system.")]),t._v(" "),a("figure",[a("img",{attrs:{src:e(617),alt:"Translation 6",title:"Translation 6"}})]),t._v(" "),a("p",[t._v("Now let's test the translation. Go to "),a("strong",[t._v("Roles")]),t._v(" under "),a("strong",[t._v("Server Settings")]),t._v(', and if we check the button at the top right of the view, we can see that the text has been translated from "Add Roles" to "Fi ipa kun".')]),t._v(" "),a("figure",[a("img",{attrs:{src:e(618),alt:"Translation 7",title:"Translation 7"}})]),t._v(" "),a("p",[t._v('You can also search for other places in the BTCPay application where "Add Role" appears, and confirm that it has been successfully translated to your chosen language.')]),t._v(" "),a("p",[t._v("With one translation done, go ahead and translate other texts in the dictionary. All instances of English text will be replaced with your translated versions, and now you can enjoy your new localized experience.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("All translation strings are in a single text box, easy to copy over. Feel free to leverage this by pasting them into translation AI tools like ChatGPT, giving yourself a good starting point. We strongly recommend that you manually review all strings afterwards, ensuring contextual accuracy, which is sometimes lost when depending on AI.")])]),t._v(" "),a("h2",{attrs:{id:"tips-for-effective-translations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#tips-for-effective-translations"}},[t._v("#")]),t._v(" Tips for Effective Translations")]),t._v(" "),a("ul",[a("li",[a("strong",[t._v("Consistency is Key:")]),t._v(" Ensure that similar terms are translated consistently throughout.")]),t._v(" "),a("li",[a("strong",[t._v("Context matters:")]),t._v(" Keep context in mind when translating phrases to maintain meaning.")]),t._v(" "),a("li",[a("strong",[t._v("Review regularly:")]),t._v(" Regularly update translations as new features are added.")])])])}),[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[42],{604:function(t,a,e){t.exports=e.p+"assets/img/01_Translation.74ed4506.png"},605:function(t,a,e){t.exports=e.p+"assets/img/02_Translation.c6f2bd99.png"},606:function(t,a,e){t.exports=e.p+"assets/img/03_Translation_creation.d83c5a42.png"},607:function(t,a,e){t.exports=e.p+"assets/img/04_Translation_dictionary.44ae9f0a.png"},608:function(t,a,e){t.exports=e.p+"assets/img/05_Translation_Add_Role_To_Yoruba.b8350fa8.png"},609:function(t,a,e){t.exports=e.p+"assets/img/06_Translation_Saved_Dictionary.6cc6b25d.png"},610:function(t,a,e){t.exports=e.p+"assets/img/07_Translation_Validation.9625e320.png"},886:function(t,a,e){"use strict";e.r(a);var n=e(17),s=Object(n.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"using-btcpay-translation-feature-to-localize-your-btcpay-server-instance"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#using-btcpay-translation-feature-to-localize-your-btcpay-server-instance"}},[t._v("#")]),t._v(" Using BTCPay Translation Feature to Localize Your BTCPay Server instance")]),t._v(" "),a("p",[t._v("Since version 2.0 BTCPay Server includes a translation feature that allows administrators to set up a default language for users accessing their instance.")]),t._v(" "),a("p",[t._v("With this feature, you can replace the default English text across the entire back-office with your chosen language.")]),t._v(" "),a("p",[t._v("Here’s how you can create and manage translations to make the BTCPay server easier to use.")]),t._v(" "),a("h2",{attrs:{id:"translating-btcpay-server"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#translating-btcpay-server"}},[t._v("#")]),t._v(" Translating BTCPay Server")]),t._v(" "),a("ol",[a("li",[t._v("Log in to your BTCPay Server instance.")]),t._v(" "),a("li",[t._v("Navigate to Translation on "),a("strong",[t._v("Server Settings")]),t._v(" >> "),a("strong",[t._v("Translations")]),t._v(".")])]),t._v(" "),a("figure",[a("img",{attrs:{src:e(604),alt:"Translation 1",title:"Translation 1"}})]),t._v(" "),a("ol",{attrs:{start:"3"}},[a("li",[a("p",[t._v("Click "),a("strong",[t._v("Create")]),t._v(" button to generate a new language dictionary.")])]),t._v(" "),a("li",[a("p",[t._v("Enter the dictionary name you want to save the language collection with and then click "),a("strong",[t._v("Create")]),t._v(" button to create the dictionary.")])])]),t._v(" "),a("figure",[a("img",{attrs:{src:e(605),alt:"Translation 2",title:"Translation 2"}})]),t._v(" "),a("figure",[a("img",{attrs:{src:e(606),alt:"Translation 3",title:"Translation 3"}})]),t._v(" "),a("figure",[a("img",{attrs:{src:e(607),alt:"Translation 4",title:"Translation 4"}})]),t._v(" "),a("p",[t._v("In the image above, you can see a dictionary of words that can be translated on your BTCPay Server.")]),t._v(" "),a("p",[t._v("The dictionary is usually organized as pairs of "),a("code",[t._v('"key": "value"')]),t._v(", where:")]),t._v(" "),a("p",[a("strong",[t._v("Key:")]),t._v(" The original English text or phrase in your BTCPay instance.")]),t._v(" "),a("p",[a("strong",[t._v("Value:")]),t._v(" The translated text you want to display.")]),t._v(" "),a("p",[t._v("For each English term, enter its equivalent in your chosen language in the corresponding text. Be sure to review for accuracy and clarity.")]),t._v(" "),a("p",[t._v('For example, lets translate "Add Role" into Yoruba. Since I created a dictionary for Yoruba, I’ll provide the translation in Yoruba.')]),t._v(" "),a("figure",[a("img",{attrs:{src:e(608),alt:"Translation 5",title:"Translation 5"}})]),t._v(" "),a("p",[t._v("Replace the text and click the "),a("strong",[t._v("Save")]),t._v(" button. A confirmation message will appear indicating that your translations have been successfully saved. Next, click the "),a("strong",[t._v("Select")]),t._v(" button for the new dictionary to set it as the default for the system.")]),t._v(" "),a("figure",[a("img",{attrs:{src:e(609),alt:"Translation 6",title:"Translation 6"}})]),t._v(" "),a("p",[t._v("Now let's test the translation. Go to "),a("strong",[t._v("Roles")]),t._v(" under "),a("strong",[t._v("Server Settings")]),t._v(', and if we check the button at the top right of the view, we can see that the text has been translated from "Add Roles" to "Fi ipa kun".')]),t._v(" "),a("figure",[a("img",{attrs:{src:e(610),alt:"Translation 7",title:"Translation 7"}})]),t._v(" "),a("p",[t._v('You can also search for other places in the BTCPay application where "Add Role" appears, and confirm that it has been successfully translated to your chosen language.')]),t._v(" "),a("p",[t._v("With one translation done, go ahead and translate other texts in the dictionary. All instances of English text will be replaced with your translated versions, and now you can enjoy your new localized experience.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("All translation strings are in a single text box, easy to copy over. Feel free to leverage this by pasting them into translation AI tools like ChatGPT, giving yourself a good starting point. We strongly recommend that you manually review all strings afterwards, ensuring contextual accuracy, which is sometimes lost when depending on AI.")])]),t._v(" "),a("h2",{attrs:{id:"tips-for-effective-translations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#tips-for-effective-translations"}},[t._v("#")]),t._v(" Tips for Effective Translations")]),t._v(" "),a("ul",[a("li",[a("strong",[t._v("Consistency is Key:")]),t._v(" Ensure that similar terms are translated consistently throughout.")]),t._v(" "),a("li",[a("strong",[t._v("Context matters:")]),t._v(" Keep context in mind when translating phrases to maintain meaning.")]),t._v(" "),a("li",[a("strong",[t._v("Review regularly:")]),t._v(" Regularly update translations as new features are added.")])])])}),[],!1,null,null,null);a.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/48.a7c396c2.js b/assets/js/48.8bf7be7a.js similarity index 92% rename from assets/js/48.a7c396c2.js rename to assets/js/48.8bf7be7a.js index e9ce3f5abf..16b65f184a 100644 --- a/assets/js/48.a7c396c2.js +++ b/assets/js/48.8bf7be7a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{425:function(e,t,o){e.exports=o.p+"assets/img/voltagereg.6093e48b.jpg"},426:function(e,t,o){e.exports=o.p+"assets/img/deployln.f60bffa7.jpg"},427:function(e,t,o){e.exports=o.p+"assets/img/voltagelnname.40b8926a.jpg"},428:function(e,t,o){e.exports=o.p+"assets/img/whatnode.cabcdd98.jpg"},429:function(e,t,o){e.exports=o.p+"assets/img/deploybtcpay.cd98b71c.jpg"},809:function(e,t,o){"use strict";o.r(t);var a=o(17),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"voltage-cloud-btcpay-server-web-deployment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#voltage-cloud-btcpay-server-web-deployment"}},[e._v("#")]),e._v(" Voltage Cloud BTCPay Server web deployment")]),e._v(" "),t("p",[e._v("This page will explain how to deploy the BTCPay Server on "),t("code",[e._v("Voltage Cloud")]),e._v(".\nVoltage cloud is building Bitcoin and Lightning infrastructure. Its mission is to provide easy and scalable solutions to a Bitcoin standard.\nThey've built an easy-to-use onboard flow to the BTCPay Server and provide an easy solution for Lightning Network usage.\nIt's modular. Pick your Bitcoin node, decide if you want to use Lightning, and then put a BTCPay server on top.\nThey also offer a solution for inbound liquidity once you have Lightning running.")]),e._v(" "),t("p",[e._v("In the video below, "),t("a",{attrs:{href:"https://twitter.com/BTCsessions",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTC Sessions"),t("OutboundLink")],1),e._v(" goes through all the steps for setting up "),t("strong",[e._v("BTCPay server on Voltage Cloud")]),e._v(".")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/KqsM-n-e4aY/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=KqsM-n-e4aY",title:"BTCPay Server - Voltage Web-Deployment","data-id":"KqsM-n-e4aY"}},[t("iframe",{attrs:{title:"BTCPay Server - Voltage Web-Deployment","data-src":"https://www.youtube-nocookie.com/embed/KqsM-n-e4aY?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"1-sign-up-and-top-up-your-account"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-sign-up-and-top-up-your-account"}},[e._v("#")]),e._v(" 1. Sign up and top up your account.")]),e._v(" "),t("p",[e._v("First off, sign up and add credit to your account.\nGo to the "),t("a",{attrs:{href:"https://account.voltage.cloud/register",target:"_blank",rel:"noopener noreferrer"}},[e._v("Voltage cloud"),t("OutboundLink")],1),e._v(" website to create an account.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(425),alt:"Voltage Cloud signup",title:"Voltage Cloud signup"}})]),e._v(" "),t("p",[e._v("Upon registering, to top up the account go to"),t("code",[e._v("Billing")]),e._v(" and add "),t("code",[e._v("Node credit")]),e._v(" to your account.\nFilling up your account can be done by paying in Bitcoin, Lightning, or by credit card.\nAfter you've paid, return to the main dashboard of Voltage-Cloud.")]),e._v(" "),t("h2",{attrs:{id:"2-what-node-suits-you"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-what-node-suits-you"}},[e._v("#")]),e._v(" 2. What node suits you?")]),e._v(" "),t("p",[e._v("The dashboard asks us what to do.\nIn this section, we go into the "),t("code",[e._v("Nodes")]),e._v(" tab and leave "),t("code",[e._v("Flow")]),e._v(" for now.\nBy clicking "),t("code",[e._v("Nodes")]),e._v(", we are now prompted to "),t("strong",[e._v("Create Node")])]),e._v(" "),t("p",[e._v("For running the BTCPay server with Lightning-enabled, we will have to create two nodes.\nFirst, you have to create the Lightning Node, click on LND button.\nAfter that, it makes your choice between three options of nodes.")]),e._v(" "),t("ul",[t("li",[e._v("Lite node")]),e._v(" "),t("li",[e._v("Standard Node")]),e._v(" "),t("li",[e._v("Pro node")])]),e._v(" "),t("p",[e._v("Each comes with its own pro's and con's. The pro node requires you to contact Voltage's marketing team to customize your node plan.\nIt will also show you the cost of the node per hour rate and an approximate for a full month.\nBut as far as this guide and BTCPay Server's needs reach, the "),t("code",[e._v("Lite node")]),e._v(" should be sufficient.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(426),alt:"Voltage Cloud Password",title:"Voltage Cloud Password"}})]),e._v(" "),t("p",[e._v("Now we get into naming your node and securing it with a strong password\nThere is also an option to restore a previous node from seed and a Static Channel backup.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(427),alt:"Voltage Cloud Password",title:"Voltage Cloud Password"}})]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("This password is something to backup securely. As Voltage can "),t("strong",[e._v("NOT")]),e._v(" recover this for you")])]),e._v(" "),t("h2",{attrs:{id:"3-node-dashboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-node-dashboard"}},[e._v("#")]),e._v(" 3. Node dashboard")]),e._v(" "),t("p",[e._v("After completing the above steps, you are now in your Voltage node's dashboard.\nIt shows you the node's status, the version LND it runs, the API endpoint, and some other tiles with information on your new node.\nThis is when we will start working towards our "),t("strong",[e._v("BTCPay server node")]),e._v(".")]),e._v(" "),t("p",[e._v("The top right corner of your dashboard will allow you to switch between "),t("code",[e._v("Nodes")]),e._v(" and "),t("code",[e._v("Flow")]),e._v(".\nClick on "),t("code",[e._v("Nodes")]),e._v(" as we want a BTCPay server node and create a new node.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(428),alt:"Voltage Cloud Node",title:"Voltage Cloud Node"}})]),e._v(" "),t("h2",{attrs:{id:"4-btcpay-server-node"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#4-btcpay-server-node"}},[e._v("#")]),e._v(" 4. BTCPay server node")]),e._v(" "),t("p",[e._v("Now we are looking at creating a BTCPay Server node.\nIt tells us the approximate cost hourly and monthly again as it did with the LND node.")]),e._v(" "),t("p",[e._v("Click on the "),t("code",[e._v("Create")]),e._v(" button and lets set the store initials.\nYou now have to set a "),t("code",[e._v("Store name")]),e._v(" for the main store of your BTCpay server.\nThe choice to connect it to your Voltage node and pick the node you created earlier (the LND node)\nAnd lock this in by typing the password set for the LND node.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(429),alt:"Voltage Cloud BTCPay server Node",title:"Voltage Cloud BTCPay server Node"}})]),e._v(" "),t("h2",{attrs:{id:"5-finnish-initial-deployment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#5-finnish-initial-deployment"}},[e._v("#")]),e._v(" 5. Finnish initial deployment.")]),e._v(" "),t("p",[e._v("With all the steps taken above and following along with the video above, you are now at the point where Voltage shows you the BTCPay server information.")]),e._v(" "),t("ul",[t("li",[e._v("URL for BTCPay Server access")]),e._v(" "),t("li",[e._v("Username for the BTCPay Server's store.")]),e._v(" "),t("li",[e._v("Default password")]),e._v(" "),t("li",[e._v("Attached Node Name")]),e._v(" "),t("li",[e._v("Creation date of the node")]),e._v(" "),t("li",[e._v("Expiration date")]),e._v(" "),t("li",[e._v("Purchase status")])]),e._v(" "),t("p",[e._v("A button for easy access to your BTCPay Server dashboard and the button to delete the instance also became available to you.\nNow click the button to go to your BTCPay server dashboard, and you are ready to start using BTCPay!")]),e._v(" "),t("h2",{attrs:{id:"6-welcome-to-your-btcpay-server-dashboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#6-welcome-to-your-btcpay-server-dashboard"}},[e._v("#")]),e._v(" 6. Welcome to your BTCPay Server dashboard")]),e._v(" "),t("p",[e._v("You are now inside your new BTCPay Server.\nIt shows in the dashboard that you've created a store and that Lightning Network has been set up.\nThe bitcoin wallet is still missing. You can follow along in "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("this wallet setup guide")])],1),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("If there are questions about your node, the deployment or updates, please reach out to the support of "),t("a",{attrs:{href:"https://voltage.cloud",target:"_blank",rel:"noopener noreferrer"}},[e._v("Voltage Cloud"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[48],{428:function(e,t,o){e.exports=o.p+"assets/img/voltagereg.6093e48b.jpg"},429:function(e,t,o){e.exports=o.p+"assets/img/deployln.f60bffa7.jpg"},430:function(e,t,o){e.exports=o.p+"assets/img/voltagelnname.40b8926a.jpg"},431:function(e,t,o){e.exports=o.p+"assets/img/whatnode.cabcdd98.jpg"},432:function(e,t,o){e.exports=o.p+"assets/img/deploybtcpay.cd98b71c.jpg"},818:function(e,t,o){"use strict";o.r(t);var a=o(17),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"voltage-cloud-btcpay-server-web-deployment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#voltage-cloud-btcpay-server-web-deployment"}},[e._v("#")]),e._v(" Voltage Cloud BTCPay Server web deployment")]),e._v(" "),t("p",[e._v("This page will explain how to deploy the BTCPay Server on "),t("code",[e._v("Voltage Cloud")]),e._v(".\nVoltage cloud is building Bitcoin and Lightning infrastructure. Its mission is to provide easy and scalable solutions to a Bitcoin standard.\nThey've built an easy-to-use onboard flow to the BTCPay Server and provide an easy solution for Lightning Network usage.\nIt's modular. Pick your Bitcoin node, decide if you want to use Lightning, and then put a BTCPay server on top.\nThey also offer a solution for inbound liquidity once you have Lightning running.")]),e._v(" "),t("p",[e._v("In the video below, "),t("a",{attrs:{href:"https://twitter.com/BTCsessions",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTC Sessions"),t("OutboundLink")],1),e._v(" goes through all the steps for setting up "),t("strong",[e._v("BTCPay server on Voltage Cloud")]),e._v(".")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/KqsM-n-e4aY/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=KqsM-n-e4aY",title:"BTCPay Server - Voltage Web-Deployment","data-id":"KqsM-n-e4aY"}},[t("iframe",{attrs:{title:"BTCPay Server - Voltage Web-Deployment","data-src":"https://www.youtube-nocookie.com/embed/KqsM-n-e4aY?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"1-sign-up-and-top-up-your-account"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-sign-up-and-top-up-your-account"}},[e._v("#")]),e._v(" 1. Sign up and top up your account.")]),e._v(" "),t("p",[e._v("First off, sign up and add credit to your account.\nGo to the "),t("a",{attrs:{href:"https://account.voltage.cloud/register",target:"_blank",rel:"noopener noreferrer"}},[e._v("Voltage cloud"),t("OutboundLink")],1),e._v(" website to create an account.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(428),alt:"Voltage Cloud signup",title:"Voltage Cloud signup"}})]),e._v(" "),t("p",[e._v("Upon registering, to top up the account go to"),t("code",[e._v("Billing")]),e._v(" and add "),t("code",[e._v("Node credit")]),e._v(" to your account.\nFilling up your account can be done by paying in Bitcoin, Lightning, or by credit card.\nAfter you've paid, return to the main dashboard of Voltage-Cloud.")]),e._v(" "),t("h2",{attrs:{id:"2-what-node-suits-you"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-what-node-suits-you"}},[e._v("#")]),e._v(" 2. What node suits you?")]),e._v(" "),t("p",[e._v("The dashboard asks us what to do.\nIn this section, we go into the "),t("code",[e._v("Nodes")]),e._v(" tab and leave "),t("code",[e._v("Flow")]),e._v(" for now.\nBy clicking "),t("code",[e._v("Nodes")]),e._v(", we are now prompted to "),t("strong",[e._v("Create Node")])]),e._v(" "),t("p",[e._v("For running the BTCPay server with Lightning-enabled, we will have to create two nodes.\nFirst, you have to create the Lightning Node, click on LND button.\nAfter that, it makes your choice between three options of nodes.")]),e._v(" "),t("ul",[t("li",[e._v("Lite node")]),e._v(" "),t("li",[e._v("Standard Node")]),e._v(" "),t("li",[e._v("Pro node")])]),e._v(" "),t("p",[e._v("Each comes with its own pro's and con's. The pro node requires you to contact Voltage's marketing team to customize your node plan.\nIt will also show you the cost of the node per hour rate and an approximate for a full month.\nBut as far as this guide and BTCPay Server's needs reach, the "),t("code",[e._v("Lite node")]),e._v(" should be sufficient.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(429),alt:"Voltage Cloud Password",title:"Voltage Cloud Password"}})]),e._v(" "),t("p",[e._v("Now we get into naming your node and securing it with a strong password\nThere is also an option to restore a previous node from seed and a Static Channel backup.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(430),alt:"Voltage Cloud Password",title:"Voltage Cloud Password"}})]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("This password is something to backup securely. As Voltage can "),t("strong",[e._v("NOT")]),e._v(" recover this for you")])]),e._v(" "),t("h2",{attrs:{id:"3-node-dashboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-node-dashboard"}},[e._v("#")]),e._v(" 3. Node dashboard")]),e._v(" "),t("p",[e._v("After completing the above steps, you are now in your Voltage node's dashboard.\nIt shows you the node's status, the version LND it runs, the API endpoint, and some other tiles with information on your new node.\nThis is when we will start working towards our "),t("strong",[e._v("BTCPay server node")]),e._v(".")]),e._v(" "),t("p",[e._v("The top right corner of your dashboard will allow you to switch between "),t("code",[e._v("Nodes")]),e._v(" and "),t("code",[e._v("Flow")]),e._v(".\nClick on "),t("code",[e._v("Nodes")]),e._v(" as we want a BTCPay server node and create a new node.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(431),alt:"Voltage Cloud Node",title:"Voltage Cloud Node"}})]),e._v(" "),t("h2",{attrs:{id:"4-btcpay-server-node"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#4-btcpay-server-node"}},[e._v("#")]),e._v(" 4. BTCPay server node")]),e._v(" "),t("p",[e._v("Now we are looking at creating a BTCPay Server node.\nIt tells us the approximate cost hourly and monthly again as it did with the LND node.")]),e._v(" "),t("p",[e._v("Click on the "),t("code",[e._v("Create")]),e._v(" button and lets set the store initials.\nYou now have to set a "),t("code",[e._v("Store name")]),e._v(" for the main store of your BTCpay server.\nThe choice to connect it to your Voltage node and pick the node you created earlier (the LND node)\nAnd lock this in by typing the password set for the LND node.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(432),alt:"Voltage Cloud BTCPay server Node",title:"Voltage Cloud BTCPay server Node"}})]),e._v(" "),t("h2",{attrs:{id:"5-finnish-initial-deployment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#5-finnish-initial-deployment"}},[e._v("#")]),e._v(" 5. Finnish initial deployment.")]),e._v(" "),t("p",[e._v("With all the steps taken above and following along with the video above, you are now at the point where Voltage shows you the BTCPay server information.")]),e._v(" "),t("ul",[t("li",[e._v("URL for BTCPay Server access")]),e._v(" "),t("li",[e._v("Username for the BTCPay Server's store.")]),e._v(" "),t("li",[e._v("Default password")]),e._v(" "),t("li",[e._v("Attached Node Name")]),e._v(" "),t("li",[e._v("Creation date of the node")]),e._v(" "),t("li",[e._v("Expiration date")]),e._v(" "),t("li",[e._v("Purchase status")])]),e._v(" "),t("p",[e._v("A button for easy access to your BTCPay Server dashboard and the button to delete the instance also became available to you.\nNow click the button to go to your BTCPay server dashboard, and you are ready to start using BTCPay!")]),e._v(" "),t("h2",{attrs:{id:"6-welcome-to-your-btcpay-server-dashboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#6-welcome-to-your-btcpay-server-dashboard"}},[e._v("#")]),e._v(" 6. Welcome to your BTCPay Server dashboard")]),e._v(" "),t("p",[e._v("You are now inside your new BTCPay Server.\nIt shows in the dashboard that you've created a store and that Lightning Network has been set up.\nThe bitcoin wallet is still missing. You can follow along in "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("this wallet setup guide")])],1),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("If there are questions about your node, the deployment or updates, please reach out to the support of "),t("a",{attrs:{href:"https://voltage.cloud",target:"_blank",rel:"noopener noreferrer"}},[e._v("Voltage Cloud"),t("OutboundLink")],1)])])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/49.b4d574ce.js b/assets/js/49.6f8f6c8a.js similarity index 93% rename from assets/js/49.b4d574ce.js rename to assets/js/49.6f8f6c8a.js index 914a53acc4..1f77682c08 100644 --- a/assets/js/49.b4d574ce.js +++ b/assets/js/49.6f8f6c8a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{437:function(e,t,a){e.exports=a.p+"assets/img/btcpayexposecloudflare1.34903339.jpg"},438:function(e,t,a){e.exports=a.p+"assets/img/btcpayexposecloudflare2.155cf736.jpg"},439:function(e,t,a){e.exports=a.p+"assets/img/Cloudflare-Tunnel-Token.736d06fd.png"},440:function(e,t,a){e.exports=a.p+"assets/img/btcpayexposecloudflare5.477f4a44.jpg"},441:function(e,t,a){e.exports=a.p+"assets/img/Cloudflare-Always-Https.96f896eb.png"},825:function(e,t,a){"use strict";a.r(t);var r=a(17),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"cloudflare-tunnel-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cloudflare-tunnel-support"}},[e._v("#")]),e._v(" Cloudflare tunnel support")]),e._v(" "),t("p",[e._v("Your server is on a local network, and you want to expose it on the internet (clearnet)?")]),e._v(" "),t("p",[e._v("While there are many solutions at your disposal, this one is by far the least costly and easiest.")]),e._v(" "),t("p",[e._v("Traditionally, the solution to this problem is either:")]),e._v(" "),t("ul",[t("li",[e._v("Configure your firewall and your internet router (NAT) correctly to accept incoming traffic")]),e._v(" "),t("li",[e._v("Use Tor")]),e._v(" "),t("li",[e._v("Setup an SSH reverse tunnel to a public VPS")])]),e._v(" "),t("p",[e._v("The challenge with the first solution is that there is no unified way to do it. Every local network has its own way of doing.\nOn top of it, it may not even work: internet server providers may block incoming traffic, or they might use dynamic IPs. You need to set up a "),t("RouterLink",{attrs:{to:"/Deployment/DynamicDNS/"}},[e._v("dyndns service")]),e._v(" to update the DNS record when the IP changes automatically.")],1),e._v(" "),t("p",[e._v("The challenges with the second solution are that Tor has very high latency, so your server will feel sluggish and unreliable, and you would need a Tor-enabled browser to access it. (such as Brave or Tor Browser)")]),e._v(" "),t("p",[e._v("The third solution is technically challenging and isn't free, as you need to pay for a VPS.")]),e._v(" "),t("p",[e._v("Cloudflare tunnel offers an alternative to those solutions with a single downside: Cloudflare can see or modify all of your traffic, as it acts as a middleman between the client's browser and your local server.")]),e._v(" "),t("p",[e._v("With Cloudflare tunnel, you will enjoy low latency access to your server, on clearnet, and WITHOUT the need to configure your firewall, internet router, dynamic DNS, and any internet service provider. For free.")]),e._v(" "),t("p",[e._v("You still need to configure the tunnel correctly; this documentation will guide you through it.")]),e._v(" "),t("h2",{attrs:{id:"how-to-use"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[e._v("#")]),e._v(" How to use?")]),e._v(" "),t("p",[e._v("First, we are going to create the tunnel on Cloudflare.")]),e._v(" "),t("ol",[t("li",[e._v("You need to "),t("a",{attrs:{href:"https://cloudflare.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("create an account on Cloudflare"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Enable Cloudflare for your domain name. For Namecheap, "),t("a",{attrs:{href:"https://www.namecheap.com/support/knowledgebase/article.aspx/9607/2210/how-to-set-up-dns-records-for-your-domain-in-cloudflare-account/",target:"_blank",rel:"noopener noreferrer"}},[e._v("follow this tutorial"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("After the DNS changes are propagated, go to "),t("a",{attrs:{href:"https://dash.teams.cloudflare.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Zero Trust"),t("OutboundLink")],1),e._v(" option on the left menu, go to "),t("code",[e._v("access")]),e._v(", then click "),t("code",[e._v("tunnels")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(437),alt:"BTCPay Server Cloudflare Tunnel",title:"BTCPay Server Cloudflare Tunnel"}})]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Click the "),t("code",[e._v("create tunnel")]),e._v(" button, and give it a name")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(438),alt:"BTCPay Server Cloudflare Tunnel",title:"BTCPay Server Cloudflare Tunnel"}})]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[e._v("In "),t("code",[e._v("Choose your environment")]),e._v(", click on docker and copy your token. You will need it later (the string after "),t("code",[e._v("--token")]),e._v(", as shown in the following screenshot)")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(439),alt:"BTCpay Server Cloudflare Tunnel",title:"BTCpay Server Cloudflare Tunnel"}})]),e._v(" "),t("ol",{attrs:{start:"6"}},[t("li",[e._v("Click on the "),t("code",[e._v("Next")]),e._v(" button")]),e._v(" "),t("li",[e._v("Enter your subdomain, and select your domain in the list. Then in "),t("code",[e._v("Service")]),e._v(" select "),t("code",[e._v("HTTP")]),e._v(" and enter "),t("code",[e._v("nginx")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(440),alt:"BTCPay Server Cloudflare Tunnel",title:"BTCPay Server Cloudflare Tunnel"}})]),e._v(" "),t("ol",{attrs:{start:"8"}},[t("li",[e._v("In the SSH section of your server, add Cloudflare tunnel by running the following script. (replace "),t("code",[e._v("")]),e._v(" with what you copied in step "),t("code",[e._v("5.")]),e._v(", and also replace "),t("code",[e._v("")]),e._v(" with the domain you entered in steps "),t("code",[e._v("7.")]),e._v(")")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$REVERSEPROXY_DEFAULT_HOST")]),e._v('"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&&")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("REVERSEPROXY_DEFAULT_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_HOST")]),e._v('"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("CLOUDFLARE_TUNNEL_TOKEN")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-cloudflared"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_EXCLUDE_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_EXCLUDE_FRAGMENTS")]),e._v(';nginx-https"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("Now you should be able to access your server from the internet! (If you get an Nginx error 503, check below)")]),e._v(" "),t("h2",{attrs:{id:"recommended-additional-step"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#recommended-additional-step"}},[e._v("#")]),e._v(" Recommended additional step")]),e._v(" "),t("p",[e._v("In "),t("a",{attrs:{href:"https://dash.cloudflare.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("cloudflare dashboard"),t("OutboundLink")],1),e._v(", navigate to your websites, go to "),t("code",[e._v("Edge Certificates")]),e._v(", and check "),t("code",[e._v("Always Use HTTPS")]),e._v(". This will make sure that any request to your website uses HTTPS.\n"),t("img",{attrs:{src:a(441),alt:""}})]),e._v(" "),t("h2",{attrs:{id:"known-error"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#known-error"}},[e._v("#")]),e._v(" Known error")]),e._v(" "),t("h3",{attrs:{id:"error-503"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#error-503"}},[e._v("#")]),e._v(" Error 503")]),e._v(" "),t("p",[e._v("An error 503 means that the tunnel is working and Cloudflare is correctly set up, the HTTP request is reaching your server, but the server's reverse proxy doesn't know which downstream container should receive the request.")]),e._v(" "),t("p",[e._v("This command will instruct you to forward any requests from your domain to your BTCPay Server container. It also instructs you to forward any HTTP requests with an unrecognized domain name to your BTCPay Server container.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("REVERSEPROXY_DEFAULT_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[t("code",[e._v("REVERSEPROXY_DEFAULT_HOST")]),e._v(" will ensure you can still access your server from the local network with an IP or a local domain name.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[49],{442:function(e,t,a){e.exports=a.p+"assets/img/btcpayexposecloudflare1.34903339.jpg"},443:function(e,t,a){e.exports=a.p+"assets/img/btcpayexposecloudflare2.155cf736.jpg"},444:function(e,t,a){e.exports=a.p+"assets/img/Cloudflare-Tunnel-Token.736d06fd.png"},445:function(e,t,a){e.exports=a.p+"assets/img/btcpayexposecloudflare5.477f4a44.jpg"},446:function(e,t,a){e.exports=a.p+"assets/img/Cloudflare-Always-Https.96f896eb.png"},826:function(e,t,a){"use strict";a.r(t);var r=a(17),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"cloudflare-tunnel-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cloudflare-tunnel-support"}},[e._v("#")]),e._v(" Cloudflare tunnel support")]),e._v(" "),t("p",[e._v("Your server is on a local network, and you want to expose it on the internet (clearnet)?")]),e._v(" "),t("p",[e._v("While there are many solutions at your disposal, this one is by far the least costly and easiest.")]),e._v(" "),t("p",[e._v("Traditionally, the solution to this problem is either:")]),e._v(" "),t("ul",[t("li",[e._v("Configure your firewall and your internet router (NAT) correctly to accept incoming traffic")]),e._v(" "),t("li",[e._v("Use Tor")]),e._v(" "),t("li",[e._v("Setup an SSH reverse tunnel to a public VPS")])]),e._v(" "),t("p",[e._v("The challenge with the first solution is that there is no unified way to do it. Every local network has its own way of doing.\nOn top of it, it may not even work: internet server providers may block incoming traffic, or they might use dynamic IPs. You need to set up a "),t("RouterLink",{attrs:{to:"/Deployment/DynamicDNS/"}},[e._v("dyndns service")]),e._v(" to update the DNS record when the IP changes automatically.")],1),e._v(" "),t("p",[e._v("The challenges with the second solution are that Tor has very high latency, so your server will feel sluggish and unreliable, and you would need a Tor-enabled browser to access it. (such as Brave or Tor Browser)")]),e._v(" "),t("p",[e._v("The third solution is technically challenging and isn't free, as you need to pay for a VPS.")]),e._v(" "),t("p",[e._v("Cloudflare tunnel offers an alternative to those solutions with a single downside: Cloudflare can see or modify all of your traffic, as it acts as a middleman between the client's browser and your local server.")]),e._v(" "),t("p",[e._v("With Cloudflare tunnel, you will enjoy low latency access to your server, on clearnet, and WITHOUT the need to configure your firewall, internet router, dynamic DNS, and any internet service provider. For free.")]),e._v(" "),t("p",[e._v("You still need to configure the tunnel correctly; this documentation will guide you through it.")]),e._v(" "),t("h2",{attrs:{id:"how-to-use"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use"}},[e._v("#")]),e._v(" How to use?")]),e._v(" "),t("p",[e._v("First, we are going to create the tunnel on Cloudflare.")]),e._v(" "),t("ol",[t("li",[e._v("You need to "),t("a",{attrs:{href:"https://cloudflare.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("create an account on Cloudflare"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("Enable Cloudflare for your domain name. For Namecheap, "),t("a",{attrs:{href:"https://www.namecheap.com/support/knowledgebase/article.aspx/9607/2210/how-to-set-up-dns-records-for-your-domain-in-cloudflare-account/",target:"_blank",rel:"noopener noreferrer"}},[e._v("follow this tutorial"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[e._v("After the DNS changes are propagated, go to "),t("a",{attrs:{href:"https://dash.teams.cloudflare.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Zero Trust"),t("OutboundLink")],1),e._v(" option on the left menu, go to "),t("code",[e._v("access")]),e._v(", then click "),t("code",[e._v("tunnels")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(442),alt:"BTCPay Server Cloudflare Tunnel",title:"BTCPay Server Cloudflare Tunnel"}})]),e._v(" "),t("ol",{attrs:{start:"4"}},[t("li",[e._v("Click the "),t("code",[e._v("create tunnel")]),e._v(" button, and give it a name")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(443),alt:"BTCPay Server Cloudflare Tunnel",title:"BTCPay Server Cloudflare Tunnel"}})]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[e._v("In "),t("code",[e._v("Choose your environment")]),e._v(", click on docker and copy your token. You will need it later (the string after "),t("code",[e._v("--token")]),e._v(", as shown in the following screenshot)")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(444),alt:"BTCpay Server Cloudflare Tunnel",title:"BTCpay Server Cloudflare Tunnel"}})]),e._v(" "),t("ol",{attrs:{start:"6"}},[t("li",[e._v("Click on the "),t("code",[e._v("Next")]),e._v(" button")]),e._v(" "),t("li",[e._v("Enter your subdomain, and select your domain in the list. Then in "),t("code",[e._v("Service")]),e._v(" select "),t("code",[e._v("HTTP")]),e._v(" and enter "),t("code",[e._v("nginx")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(445),alt:"BTCPay Server Cloudflare Tunnel",title:"BTCPay Server Cloudflare Tunnel"}})]),e._v(" "),t("ol",{attrs:{start:"8"}},[t("li",[e._v("In the SSH section of your server, add Cloudflare tunnel by running the following script. (replace "),t("code",[e._v("")]),e._v(" with what you copied in step "),t("code",[e._v("5.")]),e._v(", and also replace "),t("code",[e._v("")]),e._v(" with the domain you entered in steps "),t("code",[e._v("7.")]),e._v(")")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$REVERSEPROXY_DEFAULT_HOST")]),e._v('"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("&&")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("REVERSEPROXY_DEFAULT_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_HOST")]),e._v('"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("CLOUDFLARE_TUNNEL_TOKEN")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e._v(';opt-add-cloudflared"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_EXCLUDE_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_EXCLUDE_FRAGMENTS")]),e._v(';nginx-https"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[e._v("Now you should be able to access your server from the internet! (If you get an Nginx error 503, check below)")]),e._v(" "),t("h2",{attrs:{id:"recommended-additional-step"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#recommended-additional-step"}},[e._v("#")]),e._v(" Recommended additional step")]),e._v(" "),t("p",[e._v("In "),t("a",{attrs:{href:"https://dash.cloudflare.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("cloudflare dashboard"),t("OutboundLink")],1),e._v(", navigate to your websites, go to "),t("code",[e._v("Edge Certificates")]),e._v(", and check "),t("code",[e._v("Always Use HTTPS")]),e._v(". This will make sure that any request to your website uses HTTPS.\n"),t("img",{attrs:{src:a(446),alt:""}})]),e._v(" "),t("h2",{attrs:{id:"known-error"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#known-error"}},[e._v("#")]),e._v(" Known error")]),e._v(" "),t("h3",{attrs:{id:"error-503"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#error-503"}},[e._v("#")]),e._v(" Error 503")]),e._v(" "),t("p",[e._v("An error 503 means that the tunnel is working and Cloudflare is correctly set up, the HTTP request is reaching your server, but the server's reverse proxy doesn't know which downstream container should receive the request.")]),e._v(" "),t("p",[e._v("This command will instruct you to forward any requests from your domain to your BTCPay Server container. It also instructs you to forward any HTTP requests with an unrecognized domain name to your BTCPay Server container.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAY_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("REVERSEPROXY_DEFAULT_HOST")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('""')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("p",[t("code",[e._v("REVERSEPROXY_DEFAULT_HOST")]),e._v(" will ensure you can still access your server from the local network with an IP or a local domain name.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/50.96e8683a.js b/assets/js/50.05a5fdf4.js similarity index 97% rename from assets/js/50.96e8683a.js rename to assets/js/50.05a5fdf4.js index 7caaf744ab..b857fc6b09 100644 --- a/assets/js/50.96e8683a.js +++ b/assets/js/50.05a5fdf4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{442:function(e,t,s){e.exports=s.p+"assets/img/btcpayfastsync1.b3088b95.jpg"},443:function(e,t,s){e.exports=s.p+"assets/img/btcpayfastsync2.4daae8f3.jpg"},444:function(e,t,s){e.exports=s.p+"assets/img/btcpayfastsync3.97ca261b.jpg"},445:function(e,t,s){e.exports=s.p+"assets/img/btcpayfastsync4.c09d48fe.jpg"},446:function(e,t,s){e.exports=s.p+"assets/img/btcpayfastsync6.e4367afb.jpg"},826:function(e,t,s){"use strict";s.r(t);var a=s(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"fast-sync-bitcoin-for-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fast-sync-bitcoin-for-btcpay-server"}},[e._v("#")]),e._v(" Fast sync Bitcoin for BTCPay Server")]),e._v(" "),t("h2",{attrs:{id:"what-problem-does-fast-sync-solve"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-problem-does-fast-sync-solve"}},[e._v("#")]),e._v(" What problem does Fast Sync solve?")]),e._v(" "),t("p",[e._v("When you start a new BTCPay Server, you need to synchronize your Bitcoin node from the genesis block.")]),e._v(" "),t("p",[e._v("Validating from the genesis blocks takes, in general, 1 or 2 days on affordable servers. (around 10$ per month)")]),e._v(" "),t("p",[e._v("However, synchronization time will take around two weeks on some low-powered devices like a raspberry PI. (and it will linearly increase with time)")]),e._v(" "),t("p",[e._v("Fast Sync provides a solution to decrease the synchronization time dramatically to minutes or a few hours.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Current UTXO Set snapshots only work for Bitcoin Core 0.17.0 or higher. Do NOT use these sets on older versions of Bitcoin Core (0.16.3 or lower)")])]),e._v(" "),t("h2",{attrs:{id:"how-does-fast-sync-solve-the-problem"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-fast-sync-solve-the-problem"}},[e._v("#")]),e._v(" How does Fast Sync solve the problem?")]),e._v(" "),t("p",[e._v("For Bitcoin software to operate, you do not need all the history of blocks from the genesis.")]),e._v(" "),t("p",[e._v("You need the state of Bitcoin up to a certain block (this state is called "),t("code",[e._v("UTXO Set")]),e._v("), and around ~300 blocks before this point.")]),e._v(" "),t("p",[e._v("Fast Sync downloads the UTXO Set at a specific block on an external server, and deploy it on your node. We call this file a "),t("code",[e._v("UTXO Set snapshot")]),e._v(".")]),e._v(" "),t("p",[e._v("When your node starts up again, with the "),t("code",[e._v("UTXO Set snapshot")]),e._v(" it will only need to synchronize from this point to the latest blocks.")]),e._v(" "),t("h2",{attrs:{id:"what-are-the-downsides-of-fast-sync"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-are-the-downsides-of-fast-sync"}},[e._v("#")]),e._v(" What are the downsides of Fast Sync?")]),e._v(" "),t("h3",{attrs:{id:"malicious-utxo-set"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#malicious-utxo-set"}},[e._v("#")]),e._v(" Malicious UTXO Set")]),e._v(" "),t("p",[e._v("Fast Sync can potentially get abused:")]),e._v(" "),t("ol",[t("li",[e._v("The attacker gives you a "),t("code",[e._v("UTXO Set snapshot")]),e._v(", which does not follow Bitcoin consensus.")]),e._v(" "),t("li",[e._v("The attacker makes a purchase to your store.")]),e._v(" "),t("li",[e._v("Nodes following the consensus would not recognize the payment as valid, but your node will.")]),e._v(" "),t("li",[e._v("The coins the attacker sent you are just worthless.")])]),e._v(" "),t("p",[e._v("Other attacks can completely bring down your node.")]),e._v(" "),t("h3",{attrs:{id:"lightning-network-routing-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-routing-issues"}},[e._v("#")]),e._v(" Lightning Network routing issues")]),e._v(" "),t("p",[e._v("As a merchant, you generally do not care about this issue. Merchants are mainly receiving payment, so they don't need to do any routing.")]),e._v(" "),t("p",[e._v("However, if you plan to send payments from your lightning node, you may have issues:")]),e._v(" "),t("p",[e._v("Because you do not have old blocks, your lightning node won't see any channels created prior to the snapshot.")]),e._v(" "),t("p",[e._v("If this is a problem for you, use an older snapshot.")]),e._v(" "),t("h2",{attrs:{id:"how-to-verify-that-the-utxo-set-snapshot-follows-the-consensus"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-verify-that-the-utxo-set-snapshot-follows-the-consensus"}},[e._v("#")]),e._v(" How to verify that the UTXO Set snapshot follows the consensus?")]),e._v(" "),t("h3",{attrs:{id:"if-you-trust-the-owner-of-this-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#if-you-trust-the-owner-of-this-repository"}},[e._v("#")]),e._v(" If you trust the owner of this repository....")]),e._v(" "),t("p",[e._v("The snapshots recognized as valid by the "),t("code",[e._v("btcpayserver-docker")]),e._v(" repository you've cloned, can be found on "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/utxo-sets",target:"_blank",rel:"noopener noreferrer"}},[e._v("utxo-sets"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("When you SSH into your new Sync BTCPay Server (by the use of Putty, for example), the first thing you have to do is become "),t("code",[e._v("root")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n")])])]),t("p",[e._v("Before you start the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/load-utxo-set.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("load-utxo-set.sh"),t("OutboundLink")],1),e._v(", you must bring down your BTCPay Server.")]),e._v(" "),t("p",[e._v("In the "),t("code",[e._v("btcpayserver-docker")]),e._v(" directory you run "),t("code",[e._v("btcpay-down.sh")]),e._v(" to bring down your instance.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n./btcpay-down.sh\n")])])]),t("figure",[t("img",{attrs:{src:s(442),alt:"BTCPay Server FastSync",title:"BTCPay Server FastSync"}})]),e._v(" "),t("p",[e._v("After you've shut down BTCPay Server, you now go into the FastSync directory and run the "),t("code",[e._v("load-utxo-set.sh")]),e._v(" script:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker/contrib/FastSync\n./load-utxo-set.sh\n")])])]),t("p",[e._v("The script "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/load-utxo-set.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("load-utxo-set.sh"),t("OutboundLink")],1),e._v(" will download the utxo-set from the environment variable "),t("code",[e._v("UTXO_DOWNLOAD_LINK")]),e._v(".")]),e._v(" "),t("p",[e._v("If "),t("code",[e._v("UTXO_DOWNLOAD_LINK")]),e._v(" is empty, "),t("code",[e._v("NBITCOIN_NETWORK")]),e._v(" (with value set to "),t("code",[e._v("mainnet")]),e._v(" or "),t("code",[e._v("testnet")]),e._v(") will be used to take a default "),t("code",[e._v("UTXO_DOWNLOAD_LINK")]),e._v(" that we hard coded inside "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/load-utxo-set.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("load-utxo-set.sh"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:s(443),alt:"BTCPay Server FastSync",title:"BTCPay Server FastSync"}})]),e._v(" "),t("p",[e._v("Once the files are downloaded, the hash will be checked against those in "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/utxo-sets",target:"_blank",rel:"noopener noreferrer"}},[e._v("utxo-sets"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:s(444),alt:"BTCPay Server FastSync",title:"BTCPay Server FastSync"}})]),e._v(" "),t("p",[e._v("After the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/load-utxo-set.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("load-utxo-set.sh"),t("OutboundLink")],1),e._v(" is done, you will be warned, and asked to delete the docker volume "),t("code",[e._v("generated_bitcoin_wallet_datadir")]),e._v(".\nThis will be recreated when we now run the "),t("code",[e._v("btcpay-up.sh")]),e._v(" script.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" volume "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" generated_bitcoin_wallet_datadir\n")])])]),t("p",[e._v("Now go back to the "),t("code",[e._v("btcpayserver-docker")]),e._v(" directory, and let's restart your Server with "),t("code",[e._v("./btcpay-up.sh")]),e._v(" to sync the rest!")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n./btcpay-up.sh\n")])])]),t("p",[e._v("The rest of the Sync will take place on your BTCPay Server until it reaches the latest block height.")]),e._v(" "),t("p",[e._v("You can either follow this process in the UI of the BTCPay Server or run the following command in the CLI. This will show you the latest log output and the current block height of your "),t("code",[e._v("Fast Sync")]),e._v(" node.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-100")]),e._v(" btcpayserver_bitcoind\n")])])]),t("figure",[t("img",{attrs:{src:s(445),alt:"BTCPay Server FastSync",title:"BTCPay Server FastSync"}})]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[t("strong",[e._v("However: This will only prove that the owner of this git repository is honest, and the utxo-sets are verified and correct.")]),e._v(" "),t("strong",[e._v("Completing those steps does not mean that the UTXO set snapshot is legit. It only means that you trust the owner of this git repository to have verified that it is legit.")])])]),e._v(" "),t("h3",{attrs:{id:"dont-trust-verify-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dont-trust-verify-"}},[e._v("#")]),e._v(" Don't trust, verify!"),t("a",{attrs:{name:"donttrust"}})]),e._v(" "),t("p",[e._v("If you don't trust anybody, which should be the case as much as possible, then here are the steps to verify that the UTXO set you just loaded is not malicious.")]),e._v(" "),t("ol",[t("li",[e._v("You need another node that you own, entirely "),t("code",[e._v("under your control")]),e._v(", that "),t("code",[e._v("you synchronized from the genesis block")]),e._v(". Let's call this node "),t("code",[e._v("Trusty")]),e._v(".")]),e._v(" "),t("li",[e._v("In the previous "),t("RouterLink",{attrs:{to:"/Docker/#if-you-trust-the-owner-of-this-repository"}},[e._v("step")]),e._v(" you've set up the "),t("code",[e._v("Fast Sync")]),e._v(" node. Let's call this "),t("code",[e._v("Synchy")]),e._v(".")],1),e._v(" "),t("li",[e._v("Wait for "),t("code",[e._v("Synchy")]),e._v(" to be fully synced.")]),e._v(" "),t("li",[e._v("Now on, "),t("code",[e._v("Synchy")]),e._v(" and "),t("code",[e._v("Trusty")]),e._v(" run the following command at the same time:")])]),e._v(" "),t("p",[e._v("If "),t("code",[e._v("Synchy")]),e._v(" or "),t("code",[e._v("Trusty")]),e._v(" are both using BTCPay Server, go to the "),t("code",[e._v("btcpayserver-docker")]),e._v(" directory and use:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n./bitcoin-cli.sh gettxoutsetinfo\n")])])]),t("p",[e._v("Or use if non BTCPay Server node :")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v(" bitcoin-cli gettxoutsetinfo\n")])])]),t("p",[e._v("Running this command might take some time, and nothing will show up in the terminal in the meantime.")]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[e._v("Verify that the output of "),t("code",[e._v("Synchy")]),e._v(" and "),t("code",[e._v("Trusty")]),e._v(" are identical (you can ignore "),t("code",[e._v("disk_size")]),e._v(").")])]),e._v(" "),t("figure",[t("img",{attrs:{src:s(446),alt:"BTCPay Server FastSync",title:"BTCPay Server FastSync"}})]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[t("strong",[e._v("Completing those steps, assuming the software you are running is not malicious, correctly prove that the UTXO set snapshot is legit")]),e._v(".")])]),e._v(" "),t("h3",{attrs:{id:"if-you-trust-someone-else"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#if-you-trust-someone-else"}},[e._v("#")]),e._v(" If you trust someone else...")]),e._v(" "),t("p",[e._v("This repository contains the signatures of some developers, for example "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/sigs/NicolasDorier.utxo-sets.asc",target:"_blank",rel:"noopener noreferrer"}},[e._v("sigs/NicolasDorier.utxo-sets.asc"),t("OutboundLink")],1),e._v(" contains the hashes that "),t("code",[e._v("NicolasDorier")]),e._v(" verified himself.")]),e._v(" "),t("p",[e._v("You need to verify with "),t("a",{attrs:{href:"https://keybase.io/docs/command_line",target:"_blank",rel:"noopener noreferrer"}},[e._v("KeyBase command line"),t("OutboundLink")],1),e._v(" that the signature is legit:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("keybase pgp verify "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v(" sigs/NicolasDorier.utxo-sets.asc\n")])])]),t("p",[e._v("If you don't like command line, you can verify against "),t("a",{attrs:{href:"https://keybase.io/verify",target:"_blank",rel:"noopener noreferrer"}},[e._v("keybase verify page"),t("OutboundLink")],1),e._v(" by just copying and pasting the content of "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/sigs/NicolasDorier.utxo-sets.asc",target:"_blank",rel:"noopener noreferrer"}},[e._v("sigs/NicolasDorier.utxo-sets.asc"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("You can verify that the handle "),t("code",[e._v("NicolasDorier")]),e._v(" refers to the person who controls "),t("code",[e._v("NicolasDorier")]),e._v(" Twitter, GitHub, and Reddit handle on "),t("a",{attrs:{href:"https://keybase.io/NicolasDorier",target:"_blank",rel:"noopener noreferrer"}},[e._v("the keybase profile page"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[t("strong",[e._v("Completing those steps does not mean that the UTXO set snapshot is legit")]),e._v(". It only means that you trust the owner of a Keybase account, who has proved access to some social media accounts in the past.")])]),e._v(" "),t("h2",{attrs:{id:"faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),t("h3",{attrs:{id:"can-i-add-my-signature-to-this-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-add-my-signature-to-this-repository"}},[e._v("#")]),e._v(" Can I add my signature to this repository?")]),e._v(" "),t("p",[e._v("If you are a bitcoin developer or public figure, feel free to add your signature. For this, you need:")]),e._v(" "),t("ol",[t("li",[e._v("A "),t("a",{attrs:{href:"http://keybase.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("keybase account"),t("OutboundLink")],1),e._v(" linked to your social media accounts.")]),e._v(" "),t("li",[e._v("Follow the steps described in the "),t("a",{attrs:{href:"#donttrust"}},[e._v("Don't trust, verify!")]),e._v(" section for each snapshot you want to sign.")]),e._v(" "),t("li",[e._v("Create a file with the same format as "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/utxo-sets",target:"_blank",rel:"noopener noreferrer"}},[e._v("utxo-sets"),t("OutboundLink")],1),e._v(" with the snapshots you validated. (Let's call this file "),t("code",[e._v("YOU.utxo-sets")]),e._v(")")]),e._v(" "),t("li",[e._v("Run the following command line")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker/contrib/FastSync\nkeybase pgp sign "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v(" YOU.utxo-sets "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-t")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-o")]),e._v(" sigs/YOU.utxo-sets.asc\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" YOU.utxo-sets\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" sigs/YOU.utxo-sets.asc\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" commit "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-m")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Add YOU utxo-set signature"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--all")]),e._v("\n")])])]),t("p",[e._v("And make a pull request to "),t("code",[e._v("btcpayserver-docker")]),e._v(" repository.")]),e._v(" "),t("h3",{attrs:{id:"where-can-i-download-utxo-set-snapshots"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-can-i-download-utxo-set-snapshots"}},[e._v("#")]),e._v(" Where can I download UTXO set snapshots")]),e._v(" "),t("p",[e._v("You should not need to do this because "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/load-utxo-set.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("load-utxo-set.sh"),t("OutboundLink")],1),e._v(" will do the hard work for you.")]),e._v(" "),t("p",[e._v("But if you want, browse on "),t("a",{attrs:{href:"http://utxosets.blob.core.windows.net/public?restype=container&comp=list&include=metadata",target:"_blank",rel:"noopener noreferrer"}},[e._v("this listing"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Select the snapshot you want, and download it by querying "),t("code",[e._v("http://utxosets.blob.core.windows.net/public/{blobName}")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"how-can-i-create-my-own-snapshot"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-create-my-own-snapshot"}},[e._v("#")]),e._v(" How can I create my own snapshot?")]),e._v(" "),t("p",[e._v("Assuming you have a node running on a docker deployment of BTCPay Server, you need to run "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/save-utxo-set.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("save-utxo-set.sh"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("This script shows the steps to create an archive of the current UTXO Set\nIt will:")]),e._v(" "),t("ol",[t("li",[e._v("Shutdown BTCPay Server")]),e._v(" "),t("li",[e._v("Start bitcoind")]),e._v(" "),t("li",[e._v("Prune it to up to 289 blocks from the tip")]),e._v(" "),t("li",[e._v("Stop bitcoind")]),e._v(" "),t("li",[e._v("Archive in a tarball the blocks and chainstate directories")]),e._v(" "),t("li",[e._v("Restart BTCPay")]),e._v(" "),t("li",[e._v("If "),t("code",[e._v("AZURE_STORAGE_CONNECTION_STRING")]),e._v(" is set, then upload to azure storage and make the blob public else print hash and tarball")])]),e._v(" "),t("h3",{attrs:{id:"how-can-i-do-this-for-my-altcoin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-do-this-for-my-altcoin"}},[e._v("#")]),e._v(" How can I do this for my altcoin?")]),e._v(" "),t("p",[e._v("Your altcoin does not need it. Almost nobody uses it compared to bitcoin.")]),e._v(" "),t("p",[e._v("However, if you insist follow what we did for Bitcoin, we can't handhold you on this.")]),e._v(" "),t("h3",{attrs:{id:"do-you-plan-to-destroy-bitcoin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#do-you-plan-to-destroy-bitcoin"}},[e._v("#")]),e._v(" Do you plan to destroy Bitcoin?")]),e._v(" "),t("p",[e._v("This feature may be controversial because of the risk that almost nobody will follow the "),t("a",{attrs:{href:"#donttrust"}},[e._v("Don't trust, verify!")]),e._v(" step.")]),e._v(" "),t("p",[e._v("What if somebody starts spreading a corrupted snapshot on the wild scale?")]),e._v(" "),t("p",[e._v("I think this issue can be mitigated at the social layer. If several people start using social media to spread their "),t("code",[e._v("bitcoin-cli getutxosetinfo")]),e._v(" every 10 000 blocks, any corrupt snapshot would be soon detected. We plan to make expose the hash via "),t("code",[e._v("BTCPayServer")]),e._v(" and make it easy for people to share.")]),e._v(" "),t("h3",{attrs:{id:"why-you-dont-just-make-btcpayserver-rely-on-spv"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-you-dont-just-make-btcpayserver-rely-on-spv"}},[e._v("#")]),e._v(" Why you don't just: Make BTCPayServer rely on SPV")]),e._v(" "),t("p",[e._v("All SPV solution brings a systemic risk to Bitcoin. Suppose everybody relies on SPV to accept payment, and miners want to change consensus rules. In that case, you will have no leverage as an individual or a community to decide against.")]),e._v(" "),t("p",[e._v("Even with "),t("code",[e._v("UTXO Set snapshots")]),e._v(", you continue to validate consensus rules from the block of the snapshot.")]),e._v(" "),t("h3",{attrs:{id:"why-you-dont-just-make-btcpayserver-rely-on-an-external-trusted-node"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-you-dont-just-make-btcpayserver-rely-on-an-external-trusted-node"}},[e._v("#")]),e._v(" Why you don't just: Make BTCPayServer rely on an external trusted node")]),e._v(" "),t("p",[e._v("Why not just host BTCPayServer on the raspberry pi, but the full bitcoin node on another machine?")]),e._v(" "),t("p",[e._v("For two reasons:")]),e._v(" "),t("p",[e._v("First, "),t("code",[e._v("BTCPayServer")]),e._v(" is trying to reduce the technical barriers to operating payments on your own. Running on an external node means that the user needs the technical skills to set it up.")]),e._v(" "),t("p",[t("code",[e._v("BTCPayServer")]),e._v(" also relies on Bitcoin's RPC, which is not meant to be exposed on the internet. We can't see a simple enough solution that would allow normal people to run an external node elsewhere.")]),e._v(" "),t("p",[e._v("The second reason is reliability: You want your service to be self-contained. If you host a node on another server, and for some reason, this Server goes down, then your "),t("code",[e._v("BTCPayServer")]),e._v(" hosted on the raspberry PI will also cease to function.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[50],{437:function(e,t,s){e.exports=s.p+"assets/img/btcpayfastsync1.b3088b95.jpg"},438:function(e,t,s){e.exports=s.p+"assets/img/btcpayfastsync2.4daae8f3.jpg"},439:function(e,t,s){e.exports=s.p+"assets/img/btcpayfastsync3.97ca261b.jpg"},440:function(e,t,s){e.exports=s.p+"assets/img/btcpayfastsync4.c09d48fe.jpg"},441:function(e,t,s){e.exports=s.p+"assets/img/btcpayfastsync6.e4367afb.jpg"},824:function(e,t,s){"use strict";s.r(t);var a=s(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"fast-sync-bitcoin-for-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fast-sync-bitcoin-for-btcpay-server"}},[e._v("#")]),e._v(" Fast sync Bitcoin for BTCPay Server")]),e._v(" "),t("h2",{attrs:{id:"what-problem-does-fast-sync-solve"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-problem-does-fast-sync-solve"}},[e._v("#")]),e._v(" What problem does Fast Sync solve?")]),e._v(" "),t("p",[e._v("When you start a new BTCPay Server, you need to synchronize your Bitcoin node from the genesis block.")]),e._v(" "),t("p",[e._v("Validating from the genesis blocks takes, in general, 1 or 2 days on affordable servers. (around 10$ per month)")]),e._v(" "),t("p",[e._v("However, synchronization time will take around two weeks on some low-powered devices like a raspberry PI. (and it will linearly increase with time)")]),e._v(" "),t("p",[e._v("Fast Sync provides a solution to decrease the synchronization time dramatically to minutes or a few hours.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Current UTXO Set snapshots only work for Bitcoin Core 0.17.0 or higher. Do NOT use these sets on older versions of Bitcoin Core (0.16.3 or lower)")])]),e._v(" "),t("h2",{attrs:{id:"how-does-fast-sync-solve-the-problem"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-fast-sync-solve-the-problem"}},[e._v("#")]),e._v(" How does Fast Sync solve the problem?")]),e._v(" "),t("p",[e._v("For Bitcoin software to operate, you do not need all the history of blocks from the genesis.")]),e._v(" "),t("p",[e._v("You need the state of Bitcoin up to a certain block (this state is called "),t("code",[e._v("UTXO Set")]),e._v("), and around ~300 blocks before this point.")]),e._v(" "),t("p",[e._v("Fast Sync downloads the UTXO Set at a specific block on an external server, and deploy it on your node. We call this file a "),t("code",[e._v("UTXO Set snapshot")]),e._v(".")]),e._v(" "),t("p",[e._v("When your node starts up again, with the "),t("code",[e._v("UTXO Set snapshot")]),e._v(" it will only need to synchronize from this point to the latest blocks.")]),e._v(" "),t("h2",{attrs:{id:"what-are-the-downsides-of-fast-sync"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-are-the-downsides-of-fast-sync"}},[e._v("#")]),e._v(" What are the downsides of Fast Sync?")]),e._v(" "),t("h3",{attrs:{id:"malicious-utxo-set"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#malicious-utxo-set"}},[e._v("#")]),e._v(" Malicious UTXO Set")]),e._v(" "),t("p",[e._v("Fast Sync can potentially get abused:")]),e._v(" "),t("ol",[t("li",[e._v("The attacker gives you a "),t("code",[e._v("UTXO Set snapshot")]),e._v(", which does not follow Bitcoin consensus.")]),e._v(" "),t("li",[e._v("The attacker makes a purchase to your store.")]),e._v(" "),t("li",[e._v("Nodes following the consensus would not recognize the payment as valid, but your node will.")]),e._v(" "),t("li",[e._v("The coins the attacker sent you are just worthless.")])]),e._v(" "),t("p",[e._v("Other attacks can completely bring down your node.")]),e._v(" "),t("h3",{attrs:{id:"lightning-network-routing-issues"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-routing-issues"}},[e._v("#")]),e._v(" Lightning Network routing issues")]),e._v(" "),t("p",[e._v("As a merchant, you generally do not care about this issue. Merchants are mainly receiving payment, so they don't need to do any routing.")]),e._v(" "),t("p",[e._v("However, if you plan to send payments from your lightning node, you may have issues:")]),e._v(" "),t("p",[e._v("Because you do not have old blocks, your lightning node won't see any channels created prior to the snapshot.")]),e._v(" "),t("p",[e._v("If this is a problem for you, use an older snapshot.")]),e._v(" "),t("h2",{attrs:{id:"how-to-verify-that-the-utxo-set-snapshot-follows-the-consensus"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-verify-that-the-utxo-set-snapshot-follows-the-consensus"}},[e._v("#")]),e._v(" How to verify that the UTXO Set snapshot follows the consensus?")]),e._v(" "),t("h3",{attrs:{id:"if-you-trust-the-owner-of-this-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#if-you-trust-the-owner-of-this-repository"}},[e._v("#")]),e._v(" If you trust the owner of this repository....")]),e._v(" "),t("p",[e._v("The snapshots recognized as valid by the "),t("code",[e._v("btcpayserver-docker")]),e._v(" repository you've cloned, can be found on "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/utxo-sets",target:"_blank",rel:"noopener noreferrer"}},[e._v("utxo-sets"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("When you SSH into your new Sync BTCPay Server (by the use of Putty, for example), the first thing you have to do is become "),t("code",[e._v("root")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("sudo")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("su")]),e._v(" -\n")])])]),t("p",[e._v("Before you start the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/load-utxo-set.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("load-utxo-set.sh"),t("OutboundLink")],1),e._v(", you must bring down your BTCPay Server.")]),e._v(" "),t("p",[e._v("In the "),t("code",[e._v("btcpayserver-docker")]),e._v(" directory you run "),t("code",[e._v("btcpay-down.sh")]),e._v(" to bring down your instance.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n./btcpay-down.sh\n")])])]),t("figure",[t("img",{attrs:{src:s(437),alt:"BTCPay Server FastSync",title:"BTCPay Server FastSync"}})]),e._v(" "),t("p",[e._v("After you've shut down BTCPay Server, you now go into the FastSync directory and run the "),t("code",[e._v("load-utxo-set.sh")]),e._v(" script:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker/contrib/FastSync\n./load-utxo-set.sh\n")])])]),t("p",[e._v("The script "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/load-utxo-set.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("load-utxo-set.sh"),t("OutboundLink")],1),e._v(" will download the utxo-set from the environment variable "),t("code",[e._v("UTXO_DOWNLOAD_LINK")]),e._v(".")]),e._v(" "),t("p",[e._v("If "),t("code",[e._v("UTXO_DOWNLOAD_LINK")]),e._v(" is empty, "),t("code",[e._v("NBITCOIN_NETWORK")]),e._v(" (with value set to "),t("code",[e._v("mainnet")]),e._v(" or "),t("code",[e._v("testnet")]),e._v(") will be used to take a default "),t("code",[e._v("UTXO_DOWNLOAD_LINK")]),e._v(" that we hard coded inside "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/load-utxo-set.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("load-utxo-set.sh"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:s(438),alt:"BTCPay Server FastSync",title:"BTCPay Server FastSync"}})]),e._v(" "),t("p",[e._v("Once the files are downloaded, the hash will be checked against those in "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/utxo-sets",target:"_blank",rel:"noopener noreferrer"}},[e._v("utxo-sets"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:s(439),alt:"BTCPay Server FastSync",title:"BTCPay Server FastSync"}})]),e._v(" "),t("p",[e._v("After the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/load-utxo-set.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("load-utxo-set.sh"),t("OutboundLink")],1),e._v(" is done, you will be warned, and asked to delete the docker volume "),t("code",[e._v("generated_bitcoin_wallet_datadir")]),e._v(".\nThis will be recreated when we now run the "),t("code",[e._v("btcpay-up.sh")]),e._v(" script.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" volume "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" generated_bitcoin_wallet_datadir\n")])])]),t("p",[e._v("Now go back to the "),t("code",[e._v("btcpayserver-docker")]),e._v(" directory, and let's restart your Server with "),t("code",[e._v("./btcpay-up.sh")]),e._v(" to sync the rest!")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n./btcpay-up.sh\n")])])]),t("p",[e._v("The rest of the Sync will take place on your BTCPay Server until it reaches the latest block height.")]),e._v(" "),t("p",[e._v("You can either follow this process in the UI of the BTCPay Server or run the following command in the CLI. This will show you the latest log output and the current block height of your "),t("code",[e._v("Fast Sync")]),e._v(" node.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" logs "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--tail")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-100")]),e._v(" btcpayserver_bitcoind\n")])])]),t("figure",[t("img",{attrs:{src:s(440),alt:"BTCPay Server FastSync",title:"BTCPay Server FastSync"}})]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[t("strong",[e._v("However: This will only prove that the owner of this git repository is honest, and the utxo-sets are verified and correct.")]),e._v(" "),t("strong",[e._v("Completing those steps does not mean that the UTXO set snapshot is legit. It only means that you trust the owner of this git repository to have verified that it is legit.")])])]),e._v(" "),t("h3",{attrs:{id:"dont-trust-verify-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dont-trust-verify-"}},[e._v("#")]),e._v(" Don't trust, verify!"),t("a",{attrs:{name:"donttrust"}})]),e._v(" "),t("p",[e._v("If you don't trust anybody, which should be the case as much as possible, then here are the steps to verify that the UTXO set you just loaded is not malicious.")]),e._v(" "),t("ol",[t("li",[e._v("You need another node that you own, entirely "),t("code",[e._v("under your control")]),e._v(", that "),t("code",[e._v("you synchronized from the genesis block")]),e._v(". Let's call this node "),t("code",[e._v("Trusty")]),e._v(".")]),e._v(" "),t("li",[e._v("In the previous "),t("RouterLink",{attrs:{to:"/Docker/#if-you-trust-the-owner-of-this-repository"}},[e._v("step")]),e._v(" you've set up the "),t("code",[e._v("Fast Sync")]),e._v(" node. Let's call this "),t("code",[e._v("Synchy")]),e._v(".")],1),e._v(" "),t("li",[e._v("Wait for "),t("code",[e._v("Synchy")]),e._v(" to be fully synced.")]),e._v(" "),t("li",[e._v("Now on, "),t("code",[e._v("Synchy")]),e._v(" and "),t("code",[e._v("Trusty")]),e._v(" run the following command at the same time:")])]),e._v(" "),t("p",[e._v("If "),t("code",[e._v("Synchy")]),e._v(" or "),t("code",[e._v("Trusty")]),e._v(" are both using BTCPay Server, go to the "),t("code",[e._v("btcpayserver-docker")]),e._v(" directory and use:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n./bitcoin-cli.sh gettxoutsetinfo\n")])])]),t("p",[e._v("Or use if non BTCPay Server node :")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v(" bitcoin-cli gettxoutsetinfo\n")])])]),t("p",[e._v("Running this command might take some time, and nothing will show up in the terminal in the meantime.")]),e._v(" "),t("ol",{attrs:{start:"5"}},[t("li",[e._v("Verify that the output of "),t("code",[e._v("Synchy")]),e._v(" and "),t("code",[e._v("Trusty")]),e._v(" are identical (you can ignore "),t("code",[e._v("disk_size")]),e._v(").")])]),e._v(" "),t("figure",[t("img",{attrs:{src:s(441),alt:"BTCPay Server FastSync",title:"BTCPay Server FastSync"}})]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[t("strong",[e._v("Completing those steps, assuming the software you are running is not malicious, correctly prove that the UTXO set snapshot is legit")]),e._v(".")])]),e._v(" "),t("h3",{attrs:{id:"if-you-trust-someone-else"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#if-you-trust-someone-else"}},[e._v("#")]),e._v(" If you trust someone else...")]),e._v(" "),t("p",[e._v("This repository contains the signatures of some developers, for example "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/sigs/NicolasDorier.utxo-sets.asc",target:"_blank",rel:"noopener noreferrer"}},[e._v("sigs/NicolasDorier.utxo-sets.asc"),t("OutboundLink")],1),e._v(" contains the hashes that "),t("code",[e._v("NicolasDorier")]),e._v(" verified himself.")]),e._v(" "),t("p",[e._v("You need to verify with "),t("a",{attrs:{href:"https://keybase.io/docs/command_line",target:"_blank",rel:"noopener noreferrer"}},[e._v("KeyBase command line"),t("OutboundLink")],1),e._v(" that the signature is legit:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("keybase pgp verify "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v(" sigs/NicolasDorier.utxo-sets.asc\n")])])]),t("p",[e._v("If you don't like command line, you can verify against "),t("a",{attrs:{href:"https://keybase.io/verify",target:"_blank",rel:"noopener noreferrer"}},[e._v("keybase verify page"),t("OutboundLink")],1),e._v(" by just copying and pasting the content of "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/sigs/NicolasDorier.utxo-sets.asc",target:"_blank",rel:"noopener noreferrer"}},[e._v("sigs/NicolasDorier.utxo-sets.asc"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("You can verify that the handle "),t("code",[e._v("NicolasDorier")]),e._v(" refers to the person who controls "),t("code",[e._v("NicolasDorier")]),e._v(" Twitter, GitHub, and Reddit handle on "),t("a",{attrs:{href:"https://keybase.io/NicolasDorier",target:"_blank",rel:"noopener noreferrer"}},[e._v("the keybase profile page"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[t("strong",[e._v("Completing those steps does not mean that the UTXO set snapshot is legit")]),e._v(". It only means that you trust the owner of a Keybase account, who has proved access to some social media accounts in the past.")])]),e._v(" "),t("h2",{attrs:{id:"faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[e._v("#")]),e._v(" FAQ")]),e._v(" "),t("h3",{attrs:{id:"can-i-add-my-signature-to-this-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-add-my-signature-to-this-repository"}},[e._v("#")]),e._v(" Can I add my signature to this repository?")]),e._v(" "),t("p",[e._v("If you are a bitcoin developer or public figure, feel free to add your signature. For this, you need:")]),e._v(" "),t("ol",[t("li",[e._v("A "),t("a",{attrs:{href:"http://keybase.io",target:"_blank",rel:"noopener noreferrer"}},[e._v("keybase account"),t("OutboundLink")],1),e._v(" linked to your social media accounts.")]),e._v(" "),t("li",[e._v("Follow the steps described in the "),t("a",{attrs:{href:"#donttrust"}},[e._v("Don't trust, verify!")]),e._v(" section for each snapshot you want to sign.")]),e._v(" "),t("li",[e._v("Create a file with the same format as "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/utxo-sets",target:"_blank",rel:"noopener noreferrer"}},[e._v("utxo-sets"),t("OutboundLink")],1),e._v(" with the snapshots you validated. (Let's call this file "),t("code",[e._v("YOU.utxo-sets")]),e._v(")")]),e._v(" "),t("li",[e._v("Run the following command line")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker/contrib/FastSync\nkeybase pgp sign "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v(" YOU.utxo-sets "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-t")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-o")]),e._v(" sigs/YOU.utxo-sets.asc\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("rm")]),e._v(" YOU.utxo-sets\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" sigs/YOU.utxo-sets.asc\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" commit "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-m")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Add YOU utxo-set signature"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("--all")]),e._v("\n")])])]),t("p",[e._v("And make a pull request to "),t("code",[e._v("btcpayserver-docker")]),e._v(" repository.")]),e._v(" "),t("h3",{attrs:{id:"where-can-i-download-utxo-set-snapshots"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-can-i-download-utxo-set-snapshots"}},[e._v("#")]),e._v(" Where can I download UTXO set snapshots")]),e._v(" "),t("p",[e._v("You should not need to do this because "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/load-utxo-set.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("load-utxo-set.sh"),t("OutboundLink")],1),e._v(" will do the hard work for you.")]),e._v(" "),t("p",[e._v("But if you want, browse on "),t("a",{attrs:{href:"http://utxosets.blob.core.windows.net/public?restype=container&comp=list&include=metadata",target:"_blank",rel:"noopener noreferrer"}},[e._v("this listing"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Select the snapshot you want, and download it by querying "),t("code",[e._v("http://utxosets.blob.core.windows.net/public/{blobName}")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"how-can-i-create-my-own-snapshot"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-create-my-own-snapshot"}},[e._v("#")]),e._v(" How can I create my own snapshot?")]),e._v(" "),t("p",[e._v("Assuming you have a node running on a docker deployment of BTCPay Server, you need to run "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/save-utxo-set.sh",target:"_blank",rel:"noopener noreferrer"}},[e._v("save-utxo-set.sh"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("This script shows the steps to create an archive of the current UTXO Set\nIt will:")]),e._v(" "),t("ol",[t("li",[e._v("Shutdown BTCPay Server")]),e._v(" "),t("li",[e._v("Start bitcoind")]),e._v(" "),t("li",[e._v("Prune it to up to 289 blocks from the tip")]),e._v(" "),t("li",[e._v("Stop bitcoind")]),e._v(" "),t("li",[e._v("Archive in a tarball the blocks and chainstate directories")]),e._v(" "),t("li",[e._v("Restart BTCPay")]),e._v(" "),t("li",[e._v("If "),t("code",[e._v("AZURE_STORAGE_CONNECTION_STRING")]),e._v(" is set, then upload to azure storage and make the blob public else print hash and tarball")])]),e._v(" "),t("h3",{attrs:{id:"how-can-i-do-this-for-my-altcoin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-do-this-for-my-altcoin"}},[e._v("#")]),e._v(" How can I do this for my altcoin?")]),e._v(" "),t("p",[e._v("Your altcoin does not need it. Almost nobody uses it compared to bitcoin.")]),e._v(" "),t("p",[e._v("However, if you insist follow what we did for Bitcoin, we can't handhold you on this.")]),e._v(" "),t("h3",{attrs:{id:"do-you-plan-to-destroy-bitcoin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#do-you-plan-to-destroy-bitcoin"}},[e._v("#")]),e._v(" Do you plan to destroy Bitcoin?")]),e._v(" "),t("p",[e._v("This feature may be controversial because of the risk that almost nobody will follow the "),t("a",{attrs:{href:"#donttrust"}},[e._v("Don't trust, verify!")]),e._v(" step.")]),e._v(" "),t("p",[e._v("What if somebody starts spreading a corrupted snapshot on the wild scale?")]),e._v(" "),t("p",[e._v("I think this issue can be mitigated at the social layer. If several people start using social media to spread their "),t("code",[e._v("bitcoin-cli getutxosetinfo")]),e._v(" every 10 000 blocks, any corrupt snapshot would be soon detected. We plan to make expose the hash via "),t("code",[e._v("BTCPayServer")]),e._v(" and make it easy for people to share.")]),e._v(" "),t("h3",{attrs:{id:"why-you-dont-just-make-btcpayserver-rely-on-spv"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-you-dont-just-make-btcpayserver-rely-on-spv"}},[e._v("#")]),e._v(" Why you don't just: Make BTCPayServer rely on SPV")]),e._v(" "),t("p",[e._v("All SPV solution brings a systemic risk to Bitcoin. Suppose everybody relies on SPV to accept payment, and miners want to change consensus rules. In that case, you will have no leverage as an individual or a community to decide against.")]),e._v(" "),t("p",[e._v("Even with "),t("code",[e._v("UTXO Set snapshots")]),e._v(", you continue to validate consensus rules from the block of the snapshot.")]),e._v(" "),t("h3",{attrs:{id:"why-you-dont-just-make-btcpayserver-rely-on-an-external-trusted-node"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-you-dont-just-make-btcpayserver-rely-on-an-external-trusted-node"}},[e._v("#")]),e._v(" Why you don't just: Make BTCPayServer rely on an external trusted node")]),e._v(" "),t("p",[e._v("Why not just host BTCPayServer on the raspberry pi, but the full bitcoin node on another machine?")]),e._v(" "),t("p",[e._v("For two reasons:")]),e._v(" "),t("p",[e._v("First, "),t("code",[e._v("BTCPayServer")]),e._v(" is trying to reduce the technical barriers to operating payments on your own. Running on an external node means that the user needs the technical skills to set it up.")]),e._v(" "),t("p",[t("code",[e._v("BTCPayServer")]),e._v(" also relies on Bitcoin's RPC, which is not meant to be exposed on the internet. We can't see a simple enough solution that would allow normal people to run an external node elsewhere.")]),e._v(" "),t("p",[e._v("The second reason is reliability: You want your service to be self-contained. If you host a node on another server, and for some reason, this Server goes down, then your "),t("code",[e._v("BTCPayServer")]),e._v(" hosted on the raspberry PI will also cease to function.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/52.da3bfa3f.js b/assets/js/52.4615899c.js similarity index 99% rename from assets/js/52.da3bfa3f.js rename to assets/js/52.4615899c.js index 524055fc12..8658fed2f2 100644 --- a/assets/js/52.da3bfa3f.js +++ b/assets/js/52.4615899c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{529:function(e,t,a){e.exports=a.p+"assets/img/notification-page.63fd19ec.png"},530:function(e,t,a){e.exports=a.p+"assets/img/notification-manage.c904ee1a.png"},531:function(e,t,a){e.exports=a.p+"assets/img/smtp-setup.ffa2fe30.png"},532:function(e,t,a){e.exports=a.p+"assets/img/validate-smtp-setup.65ecc80c.png"},533:function(e,t,a){e.exports=a.p+"assets/img/btcpayemailrule1.27a8427f.jpg"},866:function(e,t,a){"use strict";a.r(t);var r=a(17),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"notifications"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notifications"}},[e._v("#")]),e._v(" Notifications")]),e._v(" "),t("p",[e._v("Notifications to monitor BTCPay Server events can be configured in several different ways.")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#notification-alerts"}},[e._v("Notification Alerts")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#server-emails"}},[e._v("Server level SMTP (Email)")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#store-emails"}},[e._v("Store level SMTP (Email)")])]),e._v(" "),t("li",[t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#tag/Webhooks",target:"_blank",rel:"noopener noreferrer"}},[e._v("Store level Webhooks"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"notification-alerts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notification-alerts"}},[e._v("#")]),e._v(" Notification Alerts")]),e._v(" "),t("p",[e._v("Click the notification icon in the main header to view the current notifications. The notification page shows the status of all current notifications such as invoice events, payouts, version updates, etc. Notifications can be marked as seen from the notifications dropdown or the notifications page.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(529),alt:"BTCPay Notifications",title:"BTCPay Notifications"}})]),e._v(" "),t("p",[e._v("Each user registered on the server can manage the notifications they receive.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(530),alt:"BTCPay Manage Notifications",title:"BTCPay Manage Notifications"}})]),e._v(" "),t("h2",{attrs:{id:"server-emails"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#server-emails"}},[e._v("#")]),e._v(" Server Emails")]),e._v(" "),t("p",[e._v("Emails can be sent from the server-level of BTCPay. These are "),t("a",{attrs:{href:"#user-emails"}},[e._v("user emails")]),e._v(". Admins can setup server SMTP in:")]),e._v(" "),t("p",[e._v("Server Settings > Email server > "),t("a",{attrs:{href:"#smtp-email-setup"}},[e._v("Setup")])]),e._v(" "),t("h2",{attrs:{id:"store-emails"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#store-emails"}},[e._v("#")]),e._v(" Store Emails")]),e._v(" "),t("p",[e._v("Emails can be sent from the store-level of BTCPay. These emails are for store related events such as invoices. Users can setup store SMTP in:")]),e._v(" "),t("p",[e._v("Store Settings > General Settings > Services > Email > "),t("a",{attrs:{href:"#smtp-email-setup"}},[e._v("Setup")])]),e._v(" "),t("h3",{attrs:{id:"smtp-email-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#smtp-email-setup"}},[e._v("#")]),e._v(" SMTP Email Setup")]),e._v(" "),t("p",[e._v("Use the Quick fill settings dropdown for commonly used email client setup parameters. Send yourself a test email from the same page to verify your setup parameters work properly.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(531),alt:"BTCPay Email SMTP",title:"BTCPay Email SMTP"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:a(532),alt:"BTCPay Email SMTP",title:"BTCPay Email SMTP"}})]),e._v(" "),t("p",[e._v("Each email client may have different requirements for setting up SMTP. For more information see this "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-configure-smtp-settings-in-btcpay"}},[e._v("SMTP FAQ")]),e._v(" or refer to your email provider's documentation.")],1),e._v(" "),t("h1",{attrs:{id:"user-emails"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-emails"}},[e._v("#")]),e._v(" User Emails")]),e._v(" "),t("p",[e._v("There are various user emails built-in to your BTCPay Server to communicate with your users.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("User emails will only be sent if SMTP is enabled for the server.")])]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#forgot-password-email"}},[e._v("Forgot Password")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#new-user-confirmation-email"}},[e._v("New User Confirmation")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#new-user-invitation-email"}},[e._v("New User Invitation")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#custom-emails"}},[e._v("Custom Emails")])])]),e._v(" "),t("h2",{attrs:{id:"forgot-password-email"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#forgot-password-email"}},[e._v("#")]),e._v(" Forgot Password Email")]),e._v(" "),t("p",[e._v("This email can be sent to users who have lost their password. If SMTP is not enabled on the server, there is "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#forgot-btcpay-admin-password"}},[e._v("no easy way")]),e._v(" to reset any user passwords including the server admin's password. Be sure to save your password in a safe place or setup email for your server.")],1),e._v(" "),t("h2",{attrs:{id:"new-user-confirmation-email"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#new-user-confirmation-email"}},[e._v("#")]),e._v(" New User Confirmation Email")]),e._v(" "),t("p",[e._v("This email is used to confirm new user account registration. In order to reduce spam account registration, email confirmation may be required by the server admin (set in server settings policies). New users can click the link in this email to verify their account to complete their registration process.")]),e._v(" "),t("h2",{attrs:{id:"new-user-invitation-email"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#new-user-invitation-email"}},[e._v("#")]),e._v(" New User Invitation Email")]),e._v(" "),t("p",[e._v("Send an invitation email to "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-add-a-new-user-by-invite"}},[e._v("invite a new user")]),e._v(" to register an account on your server. This can be used to keep server registration closed to the public but still invite new users.")],1),e._v(" "),t("h2",{attrs:{id:"custom-emails"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-emails"}},[e._v("#")]),e._v(" Custom Emails")]),e._v(" "),t("p",[e._v("Custom emails can be created using the BTCPay Server Transmuter preset "),t("RouterLink",{attrs:{to:"/Transmuter/EmailReceiptsPreset/#transmuter-email-receipts-setup"}},[e._v("Email Receipts")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"email-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#email-rules"}},[e._v("#")]),e._v(" Email rules")]),e._v(" "),t("p",[e._v("Email rules allow BTCPay Server to send customized emails from your store based on events.\nClick the "),t("code",[e._v("Configure")]),e._v(" button and "),t("code",[e._v("create")]),e._v(" a new Email rule.")]),e._v(" "),t("p",[e._v("Set your Email trigger out of the following :")]),e._v(" "),t("ul",[t("li",[e._v("Invoice created")]),e._v(" "),t("li",[e._v("Invoice Received Payment")]),e._v(" "),t("li",[e._v("Invoice Processing")]),e._v(" "),t("li",[e._v("Invoice Expired")]),e._v(" "),t("li",[e._v("Invoice Settled")]),e._v(" "),t("li",[e._v("Invoice Invalid")]),e._v(" "),t("li",[e._v("Invoice Payment Settled")])]),e._v(" "),t("p",[e._v("Set a recipient email address where you'd want to be updated by email on store events, or tick the option for "),t("code",[e._v("Send email to the buyer if an email was provided to the invoice")]),e._v(".\nFill out a subject for the event email, and you can stylize the body of the email at last.")]),e._v(" "),t("p",[e._v("Possible placeholder's we currently offer are as follows :")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" {Invoice.Id}\n {Invoice.StoreId}\n {Invoice.Price}\n {Invoice.Currency}\n {Invoice.Status}\n {Invoice.OrderId}\n")])])]),t("p",[e._v("Find the source "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/HostedServices/StoreEmailRuleProcessorSender.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("here for possible updates"),t("OutboundLink")],1)]),e._v(" "),t("figure",[t("img",{attrs:{src:a(533),alt:"Create new Email rule",title:"Create new Email rule"}})])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[52],{529:function(e,t,a){e.exports=a.p+"assets/img/notification-page.63fd19ec.png"},530:function(e,t,a){e.exports=a.p+"assets/img/notification-manage.c904ee1a.png"},531:function(e,t,a){e.exports=a.p+"assets/img/smtp-setup.ffa2fe30.png"},532:function(e,t,a){e.exports=a.p+"assets/img/validate-smtp-setup.65ecc80c.png"},533:function(e,t,a){e.exports=a.p+"assets/img/btcpayemailrule1.27a8427f.jpg"},865:function(e,t,a){"use strict";a.r(t);var r=a(17),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"notifications"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notifications"}},[e._v("#")]),e._v(" Notifications")]),e._v(" "),t("p",[e._v("Notifications to monitor BTCPay Server events can be configured in several different ways.")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#notification-alerts"}},[e._v("Notification Alerts")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#server-emails"}},[e._v("Server level SMTP (Email)")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#store-emails"}},[e._v("Store level SMTP (Email)")])]),e._v(" "),t("li",[t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#tag/Webhooks",target:"_blank",rel:"noopener noreferrer"}},[e._v("Store level Webhooks"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"notification-alerts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notification-alerts"}},[e._v("#")]),e._v(" Notification Alerts")]),e._v(" "),t("p",[e._v("Click the notification icon in the main header to view the current notifications. The notification page shows the status of all current notifications such as invoice events, payouts, version updates, etc. Notifications can be marked as seen from the notifications dropdown or the notifications page.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(529),alt:"BTCPay Notifications",title:"BTCPay Notifications"}})]),e._v(" "),t("p",[e._v("Each user registered on the server can manage the notifications they receive.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(530),alt:"BTCPay Manage Notifications",title:"BTCPay Manage Notifications"}})]),e._v(" "),t("h2",{attrs:{id:"server-emails"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#server-emails"}},[e._v("#")]),e._v(" Server Emails")]),e._v(" "),t("p",[e._v("Emails can be sent from the server-level of BTCPay. These are "),t("a",{attrs:{href:"#user-emails"}},[e._v("user emails")]),e._v(". Admins can setup server SMTP in:")]),e._v(" "),t("p",[e._v("Server Settings > Email server > "),t("a",{attrs:{href:"#smtp-email-setup"}},[e._v("Setup")])]),e._v(" "),t("h2",{attrs:{id:"store-emails"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#store-emails"}},[e._v("#")]),e._v(" Store Emails")]),e._v(" "),t("p",[e._v("Emails can be sent from the store-level of BTCPay. These emails are for store related events such as invoices. Users can setup store SMTP in:")]),e._v(" "),t("p",[e._v("Store Settings > General Settings > Services > Email > "),t("a",{attrs:{href:"#smtp-email-setup"}},[e._v("Setup")])]),e._v(" "),t("h3",{attrs:{id:"smtp-email-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#smtp-email-setup"}},[e._v("#")]),e._v(" SMTP Email Setup")]),e._v(" "),t("p",[e._v("Use the Quick fill settings dropdown for commonly used email client setup parameters. Send yourself a test email from the same page to verify your setup parameters work properly.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(531),alt:"BTCPay Email SMTP",title:"BTCPay Email SMTP"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:a(532),alt:"BTCPay Email SMTP",title:"BTCPay Email SMTP"}})]),e._v(" "),t("p",[e._v("Each email client may have different requirements for setting up SMTP. For more information see this "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-configure-smtp-settings-in-btcpay"}},[e._v("SMTP FAQ")]),e._v(" or refer to your email provider's documentation.")],1),e._v(" "),t("h1",{attrs:{id:"user-emails"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#user-emails"}},[e._v("#")]),e._v(" User Emails")]),e._v(" "),t("p",[e._v("There are various user emails built-in to your BTCPay Server to communicate with your users.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("User emails will only be sent if SMTP is enabled for the server.")])]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#forgot-password-email"}},[e._v("Forgot Password")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#new-user-confirmation-email"}},[e._v("New User Confirmation")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#new-user-invitation-email"}},[e._v("New User Invitation")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#custom-emails"}},[e._v("Custom Emails")])])]),e._v(" "),t("h2",{attrs:{id:"forgot-password-email"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#forgot-password-email"}},[e._v("#")]),e._v(" Forgot Password Email")]),e._v(" "),t("p",[e._v("This email can be sent to users who have lost their password. If SMTP is not enabled on the server, there is "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#forgot-btcpay-admin-password"}},[e._v("no easy way")]),e._v(" to reset any user passwords including the server admin's password. Be sure to save your password in a safe place or setup email for your server.")],1),e._v(" "),t("h2",{attrs:{id:"new-user-confirmation-email"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#new-user-confirmation-email"}},[e._v("#")]),e._v(" New User Confirmation Email")]),e._v(" "),t("p",[e._v("This email is used to confirm new user account registration. In order to reduce spam account registration, email confirmation may be required by the server admin (set in server settings policies). New users can click the link in this email to verify their account to complete their registration process.")]),e._v(" "),t("h2",{attrs:{id:"new-user-invitation-email"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#new-user-invitation-email"}},[e._v("#")]),e._v(" New User Invitation Email")]),e._v(" "),t("p",[e._v("Send an invitation email to "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-add-a-new-user-by-invite"}},[e._v("invite a new user")]),e._v(" to register an account on your server. This can be used to keep server registration closed to the public but still invite new users.")],1),e._v(" "),t("h2",{attrs:{id:"custom-emails"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#custom-emails"}},[e._v("#")]),e._v(" Custom Emails")]),e._v(" "),t("p",[e._v("Custom emails can be created using the BTCPay Server Transmuter preset "),t("RouterLink",{attrs:{to:"/Transmuter/EmailReceiptsPreset/#transmuter-email-receipts-setup"}},[e._v("Email Receipts")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"email-rules"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#email-rules"}},[e._v("#")]),e._v(" Email rules")]),e._v(" "),t("p",[e._v("Email rules allow BTCPay Server to send customized emails from your store based on events.\nClick the "),t("code",[e._v("Configure")]),e._v(" button and "),t("code",[e._v("create")]),e._v(" a new Email rule.")]),e._v(" "),t("p",[e._v("Set your Email trigger out of the following :")]),e._v(" "),t("ul",[t("li",[e._v("Invoice created")]),e._v(" "),t("li",[e._v("Invoice Received Payment")]),e._v(" "),t("li",[e._v("Invoice Processing")]),e._v(" "),t("li",[e._v("Invoice Expired")]),e._v(" "),t("li",[e._v("Invoice Settled")]),e._v(" "),t("li",[e._v("Invoice Invalid")]),e._v(" "),t("li",[e._v("Invoice Payment Settled")])]),e._v(" "),t("p",[e._v("Set a recipient email address where you'd want to be updated by email on store events, or tick the option for "),t("code",[e._v("Send email to the buyer if an email was provided to the invoice")]),e._v(".\nFill out a subject for the event email, and you can stylize the body of the email at last.")]),e._v(" "),t("p",[e._v("Possible placeholder's we currently offer are as follows :")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",{pre:!0,attrs:{class:"language-text"}},[t("code",[e._v(" {Invoice.Id}\n {Invoice.StoreId}\n {Invoice.Price}\n {Invoice.Currency}\n {Invoice.Status}\n {Invoice.OrderId}\n")])])]),t("p",[e._v("Find the source "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/HostedServices/StoreEmailRuleProcessorSender.cs",target:"_blank",rel:"noopener noreferrer"}},[e._v("here for possible updates"),t("OutboundLink")],1)]),e._v(" "),t("figure",[t("img",{attrs:{src:a(533),alt:"Create new Email rule",title:"Create new Email rule"}})])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/53.7465bd8d.js b/assets/js/53.ae28d12a.js similarity index 98% rename from assets/js/53.7465bd8d.js rename to assets/js/53.ae28d12a.js index cc9fea9c66..84594cf327 100644 --- a/assets/js/53.7465bd8d.js +++ b/assets/js/53.ae28d12a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{555:function(e,t,a){e.exports=a.p+"assets/img/PaymentRequestList.a24a908a.png"},556:function(e,t,a){e.exports=a.p+"assets/img/CreatePaymentRequest.98e26b82.png"},557:function(e,t,a){e.exports=a.p+"assets/img/NewPaymentRequest.f3ddaa42.png"},558:function(e,t,a){e.exports=a.p+"assets/img/PaymentRequestListOptions.606f0cf0.png"},559:function(e,t,a){e.exports=a.p+"assets/img/PaidPaymentRequest.4247ac2b.png"},870:function(e,t,a){"use strict";a.r(t);var s=a(17),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"payment-requests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payment-requests"}},[e._v("#")]),e._v(" Payment Requests")]),e._v(" "),t("p",[e._v("Payment Requests are a feature which allows BTCPay store owners to create long-lived invoices.\nFunds paid to a payment request use the exchange rate at the time of payment.\nThis allows users to make payments at their convenience without having to negotiate or verify exchange rates with the store owner at the time of payment.")]),e._v(" "),t("p",[e._v("Users can pay requests in partial payments.\nThe payment request will remain valid until it is paid in full or if the store owner requires an expiration time.\nAddresses are never reused. A new address is generated each time the user clicks pay to create an invoice for the payment request.")]),e._v(" "),t("p",[e._v("Store owners can also print payment requests (or export invoice data) for record keeping and accounting.\nBTCPay automatically labels invoices as Payment Requests in your store's invoice list.")]),e._v(" "),t("h2",{attrs:{id:"payment-requests-video"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payment-requests-video"}},[e._v("#")]),e._v(" Payment Requests Video")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/j6CvwDPvfzQ/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=j6CvwDPvfzQ",title:"BTCPay Server Payment Requests","data-id":"j6CvwDPvfzQ"}},[t("iframe",{attrs:{title:"BTCPay Server Payment Requests","data-src":"https://www.youtube-nocookie.com/embed/j6CvwDPvfzQ?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"create-a-payment-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-payment-request"}},[e._v("#")]),e._v(" Create a Payment Request")]),e._v(" "),t("p",[e._v("Click Requests > Create Requests")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(555),alt:"Create Payment Request",title:"Create Payment Request"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:a(556),alt:"Create Payment Request",title:"Create Payment Request"}})]),e._v(" "),t("p",[e._v("When creating a payment request, you provide the following details:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Title")]),e._v(": The payment request title")]),e._v(" "),t("li",[t("strong",[e._v("Amount & Currency")]),e._v(": The requested amount in Fiat or cryptocurrency")]),e._v(" "),t("li",[t("strong",[e._v("Expiration Time")]),e._v(": The date until which payments are valid (optional)")]),e._v(" "),t("li",[t("strong",[e._v("Email")]),e._v(": If specified, the email address will receive notification regarding any payment done on this request")]),e._v(" "),t("li",[t("strong",[e._v("Request Customer data on checkout")]),e._v(": You can request customer's details such as email address or shipping address.")]),e._v(" "),t("li",[e._v("Memo: If you wish to leave a note for the client, you can write them in the memo section. A text editor that allows you format your message and also include attachment")])]),e._v(" "),t("p",[e._v("Select the option "),t("em",[e._v("Allow payee to create invoices in their own denomination")]),e._v(" if you want to allow partial payments to be made.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Payment requests are store-dependent, which means that each payment request is associated with a store during creation.\nBe sure to have a wallet connected to your store which the payment request belongs to.")])]),e._v(" "),t("p",[e._v("Click Create to review your payment request.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(557),alt:"View New Payment Request",title:"View New Payment Request"}})]),e._v(" "),t("p",[e._v("BTCPay creates a URL for the payment request. Share this URL to view your payment request.\nNeed multiple of the same request ? You can use the "),t("code",[e._v("Clone")]),e._v(" option in the main menu to duplicate payment requests as shown.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(558),alt:"View Payment Request List",title:"View Payment Request List"}})]),e._v(" "),t("h2",{attrs:{id:"paid-request-for-payment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#paid-request-for-payment"}},[e._v("#")]),e._v(" Paid Request for Payment")]),e._v(" "),t("p",[e._v("Both the payee and requester can view the status of the payment request after sending payment.\nThe status will appear as "),t("strong",[e._v("Settled")]),e._v(" if payment has been received in full.\nIf only partial payment was made, the Amount Due will show the balance due.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(559),alt:"View Paid Payment Request",title:"View Paid Payment Request"}})])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{555:function(e,t,a){e.exports=a.p+"assets/img/PaymentRequestList.a24a908a.png"},556:function(e,t,a){e.exports=a.p+"assets/img/CreatePaymentRequest.98e26b82.png"},557:function(e,t,a){e.exports=a.p+"assets/img/NewPaymentRequest.f3ddaa42.png"},558:function(e,t,a){e.exports=a.p+"assets/img/PaymentRequestListOptions.606f0cf0.png"},559:function(e,t,a){e.exports=a.p+"assets/img/PaidPaymentRequest.4247ac2b.png"},869:function(e,t,a){"use strict";a.r(t);var s=a(17),n=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"payment-requests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payment-requests"}},[e._v("#")]),e._v(" Payment Requests")]),e._v(" "),t("p",[e._v("Payment Requests are a feature which allows BTCPay store owners to create long-lived invoices.\nFunds paid to a payment request use the exchange rate at the time of payment.\nThis allows users to make payments at their convenience without having to negotiate or verify exchange rates with the store owner at the time of payment.")]),e._v(" "),t("p",[e._v("Users can pay requests in partial payments.\nThe payment request will remain valid until it is paid in full or if the store owner requires an expiration time.\nAddresses are never reused. A new address is generated each time the user clicks pay to create an invoice for the payment request.")]),e._v(" "),t("p",[e._v("Store owners can also print payment requests (or export invoice data) for record keeping and accounting.\nBTCPay automatically labels invoices as Payment Requests in your store's invoice list.")]),e._v(" "),t("h2",{attrs:{id:"payment-requests-video"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payment-requests-video"}},[e._v("#")]),e._v(" Payment Requests Video")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/j6CvwDPvfzQ/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=j6CvwDPvfzQ",title:"BTCPay Server Payment Requests","data-id":"j6CvwDPvfzQ"}},[t("iframe",{attrs:{title:"BTCPay Server Payment Requests","data-src":"https://www.youtube-nocookie.com/embed/j6CvwDPvfzQ?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"create-a-payment-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-payment-request"}},[e._v("#")]),e._v(" Create a Payment Request")]),e._v(" "),t("p",[e._v("Click Requests > Create Requests")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(555),alt:"Create Payment Request",title:"Create Payment Request"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:a(556),alt:"Create Payment Request",title:"Create Payment Request"}})]),e._v(" "),t("p",[e._v("When creating a payment request, you provide the following details:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Title")]),e._v(": The payment request title")]),e._v(" "),t("li",[t("strong",[e._v("Amount & Currency")]),e._v(": The requested amount in Fiat or cryptocurrency")]),e._v(" "),t("li",[t("strong",[e._v("Expiration Time")]),e._v(": The date until which payments are valid (optional)")]),e._v(" "),t("li",[t("strong",[e._v("Email")]),e._v(": If specified, the email address will receive notification regarding any payment done on this request")]),e._v(" "),t("li",[t("strong",[e._v("Request Customer data on checkout")]),e._v(": You can request customer's details such as email address or shipping address.")]),e._v(" "),t("li",[e._v("Memo: If you wish to leave a note for the client, you can write them in the memo section. A text editor that allows you format your message and also include attachment")])]),e._v(" "),t("p",[e._v("Select the option "),t("em",[e._v("Allow payee to create invoices in their own denomination")]),e._v(" if you want to allow partial payments to be made.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Payment requests are store-dependent, which means that each payment request is associated with a store during creation.\nBe sure to have a wallet connected to your store which the payment request belongs to.")])]),e._v(" "),t("p",[e._v("Click Create to review your payment request.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(557),alt:"View New Payment Request",title:"View New Payment Request"}})]),e._v(" "),t("p",[e._v("BTCPay creates a URL for the payment request. Share this URL to view your payment request.\nNeed multiple of the same request ? You can use the "),t("code",[e._v("Clone")]),e._v(" option in the main menu to duplicate payment requests as shown.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(558),alt:"View Payment Request List",title:"View Payment Request List"}})]),e._v(" "),t("h2",{attrs:{id:"paid-request-for-payment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#paid-request-for-payment"}},[e._v("#")]),e._v(" Paid Request for Payment")]),e._v(" "),t("p",[e._v("Both the payee and requester can view the status of the payment request after sending payment.\nThe status will appear as "),t("strong",[e._v("Settled")]),e._v(" if payment has been received in full.\nIf only partial payment was made, the Amount Due will show the balance due.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(559),alt:"View Paid Payment Request",title:"View Paid Payment Request"}})])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/59.c922a6e3.js b/assets/js/59.871cb143.js similarity index 96% rename from assets/js/59.c922a6e3.js rename to assets/js/59.871cb143.js index 110d87acc6..61b5520ec3 100644 --- a/assets/js/59.c922a6e3.js +++ b/assets/js/59.871cb143.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{679:function(e,t,a){e.exports=a.p+"assets/img/welcome-store.0b77b754.jpg"},680:function(e,t,a){e.exports=a.p+"assets/img/selected-store.5628bf9e.jpg"},681:function(e,t,a){e.exports=a.p+"assets/img/walktrough-payouts1.779e4d06.jpg"},682:function(e,t,a){e.exports=a.p+"assets/img/preview-paybutton.ac9cebb4.jpg"},900:function(e,t,a){"use strict";a.r(t);var o=a(17),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btcpay-server-walkthrough"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-walkthrough"}},[e._v("#")]),e._v(" BTCPay Server Walkthrough")]),e._v(" "),t("p",[e._v("This page walks you through the "),t("strong",[e._v("BTCPay user interface")]),e._v(" and shows how to navigate through the different options.")]),e._v(" "),t("p",[e._v("Watch the video below for an interactive overview of the features.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/ZIfJyq9RimM/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=ZIfJyq9RimM",title:"BTCPay Server Walkthrough","data-id":"ZIfJyq9RimM"}},[t("iframe",{attrs:{title:"BTCPay Server Walkthrough","data-src":"https://www.youtube-nocookie.com/embed/ZIfJyq9RimM?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("p",[e._v("After you've created an account on the BTCPay Server instance hosted by yourself or a third party, you'll be greeted by your store's new home or, as we call it, your "),t("code",[e._v("dashboard")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(679),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),e._v(" "),t("p",[e._v("All the settings in the left menu are meant for the Current Store you selected at the top.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(680),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#notifications"}},[e._v("Notifications")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Dashboard/"}},[e._v("Dashboard")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#store"}},[e._v("Settings")]),e._v(" "),t("strong",[e._v("store settings")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#wallets"}},[e._v("Wallets")]),e._v(" "),t("ul",[t("li",[e._v("Bitcoin")]),e._v(" "),t("li",[e._v("Lightning")])])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#payments"}},[e._v("Payments")]),e._v(" "),t("ul",[t("li",[e._v("Invoices")]),e._v(" "),t("li",[e._v("Requests")]),e._v(" "),t("li",[e._v("Pull Payments")]),e._v(" "),t("li",[e._v("Payouts")]),e._v(" "),t("li",[e._v("Pay Button")])])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#apps"}},[e._v("Apps")]),e._v(" "),t("ul",[t("li",[e._v("New App")])])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#plugins"}},[e._v("Plugins")]),e._v(" "),t("ul",[t("li",[e._v("Manage Plugins")])])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#server-settings"}},[e._v("Server Settings")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#account"}},[e._v("Account")])],1)]),e._v(" "),t("h2",{attrs:{id:"store"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#store"}},[e._v("#")]),e._v(" Store")]),e._v(" "),t("p",[e._v("Inside BTCPay, you can "),t("strong",[e._v("create and manage an unlimited number of stores")]),e._v(". Each store has its own wallet, can create apps (Point of Sale or Payment Buttons and Crowdfunds) or be paired with external e-commerce software through one of the integrations available. Admin does not have control over the private keys of the other user's stores. For more information, check "),t("RouterLink",{attrs:{to:"/FAQ/Stores/"}},[e._v("Stores FAQ")])],1),e._v(" "),t("ul",[t("li",[e._v("Store settings - Configure global payment settings and customize the payment experience for your customers.")]),e._v(" "),t("li",[e._v("Rates - Set the source for cryptocurrency to fiat "),t("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-change-the-exchange-rate-provider-for-invoices"}},[e._v("exchange rates for your store")]),e._v(".")],1),e._v(" "),t("li",[e._v("Checkout experience - "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-modify-the-checkout-page"}},[e._v("Customize the appearance")]),e._v(" of the checkout page, choose default coin, etc.")],1),e._v(" "),t("li",[e._v("Access Tokens - Tokens for "),t("RouterLink",{attrs:{to:"/WhatsNext/#connecting-your-btcpay-store-to-your-e-commerce-platform"}},[e._v("pairing the store to an integration")])],1),e._v(" "),t("li",[e._v("Users - Enable other users with a registered BTCPay account to access your store as either guest or owner.")]),e._v(" "),t("li",[e._v("Pay Button - "),t("RouterLink",{attrs:{to:"/WhatsNext/#creating-the-pay-button"}},[e._v("Create a payment button")]),e._v(" you can easily embed into your website.")],1)]),e._v(" "),t("h2",{attrs:{id:"notifications"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notifications"}},[e._v("#")]),e._v(" Notifications")]),e._v(" "),t("p",[e._v("Notifications inform the user that "),t("strong",[e._v("an event has occurred on the BTCPay Server instance")]),e._v(".\nSuch event could be a received or failed payment, an overpaid or underpaid invoice, a new BTCPay version and more.")]),e._v(" "),t("p",[e._v("By clicking on the icon, you can access the "),t("code",[e._v("Notifications")]),e._v(" page, where you can view past notifications and optionally delete them.\nLearn more about all BTCPay notifications "),t("RouterLink",{attrs:{to:"/Notifications/"}},[e._v("here")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"dashboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dashboard"}},[e._v("#")]),e._v(" Dashboard")]),e._v(" "),t("p",[e._v("In dashboard you will see the stores wallet balance, a overview of invoices and quickly see your crowdfunds top perks.\nThere's 5 main tiles in the Dashboard.")]),e._v(" "),t("ul",[t("li",[e._v("A quick view on the wallet balance")]),e._v(" "),t("li",[e._v("Transaction and payout activity")]),e._v(" "),t("li",[e._v("Recent Transactions")]),e._v(" "),t("li",[e._v("Recent Invoices")]),e._v(" "),t("li",[e._v("Current running Crowdfunds")])]),e._v(" "),t("p",[e._v("Continue to read more about "),t("RouterLink",{attrs:{to:"/Dashboard/"}},[e._v("Dashboard")])],1),e._v(" "),t("h2",{attrs:{id:"wallets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wallets"}},[e._v("#")]),e._v(" Wallets")]),e._v(" "),t("h3",{attrs:{id:"bitcoin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin"}},[e._v("#")]),e._v(" Bitcoin")]),e._v(" "),t("p",[e._v("Depending how many different payment methods you've setup, inside the wallets tab you'll see a wallet for each of the payment methods. Bitcoin on-chain wallet allows you to manage received funds. BTCPay's wallet is feature-rich and has privacy features built-in. Furthermore it has a full hardware wallet integration, so you can manage your funds with compatible hardware wallet directly from your BTCPay. Check "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("wallet page")]),e._v(" for more information.")],1),e._v(" "),t("p",[e._v("Elements of the internal BTCPay Wallet are:")]),e._v(" "),t("ul",[t("li",[e._v("Transaction - This shows your entire transaction history.")]),e._v(" "),t("li",[e._v("Send - Used for sending funds out of your wallet (has to be signed and confirmed on a compatible hardware wallet).")]),e._v(" "),t("li",[e._v("Receive - Used to generate a new address manually.")]),e._v(" "),t("li",[e._v("Rescan - Enables you to import old wallets into BTCPay more easily and solves the gap limit issue most external wallets have.")]),e._v(" "),t("li",[e._v("Pull Payments - Used to create and manage Pull Payments. For more information on this feature, check "),t("RouterLink",{attrs:{to:"/PullPayments/"}},[e._v("Pull Payments")]),e._v(".")],1),e._v(" "),t("li",[e._v("Payouts - Used to manage Pull Payment requests.")]),e._v(" "),t("li",[e._v("PSBT - Used to sign multi-signature transactions through the PSBT standard.")]),e._v(" "),t("li",[e._v("Settings - Used to view and adjust additional settings for your wallet.")])]),e._v(" "),t("h3",{attrs:{id:"lightning"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lightning"}},[e._v("#")]),e._v(" Lightning")]),e._v(" "),t("p",[e._v("Additionally, we recommend adding a lightning wallet. There are two options, connect an "),t("RouterLink",{attrs:{to:"/LightningNetwork/#connecting-your-internal-lightning-node-in-btcpay"}},[e._v("internal")]),e._v(" or connect an external "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning node")]),e._v(".\nOnce completed, the Lightning wallet function becomes active.")],1),e._v(" "),t("p",[e._v("For more information, check "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("Wallet")]),e._v(" or "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/"}},[e._v("Wallet FAQ")])],1),e._v(" "),t("h2",{attrs:{id:"payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payments"}},[e._v("#")]),e._v(" Payments")]),e._v(" "),t("h3",{attrs:{id:"invoices"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#invoices"}},[e._v("#")]),e._v(" Invoices")]),e._v(" "),t("p",[e._v("All of the "),t("strong",[e._v("invoices")]),e._v(" for your user account will be displayed here. You can filter the invoices by the status, order, item, store or date. You can also create invoices manually. Invoices are sorted by date from new to old. You can open an individual invoice for more information. Use the export button to save a file (.json or .csv).")]),e._v(" "),t("p",[e._v("For more information, check "),t("RouterLink",{attrs:{to:"/Invoices/"}},[e._v("Invoices")])],1),e._v(" "),t("h3",{attrs:{id:"payment-requests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payment-requests"}},[e._v("#")]),e._v(" Payment Requests")]),e._v(" "),t("p",[e._v("Each store can have an unlimited number of "),t("strong",[e._v("payment requests")]),e._v(" displayed here. Payment requests are dynamic invoices that can be shared by URL and paid at any time using current BTC exchange rates. Here you can edit and view your payment requests. You can see invoice details for your payment requests and clone previously created payment requests.")]),e._v(" "),t("p",[e._v("For more information, check "),t("RouterLink",{attrs:{to:"/PaymentRequests/"}},[e._v("Payment Requests")])],1),e._v(" "),t("h3",{attrs:{id:"pull-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pull-payments"}},[e._v("#")]),e._v(" Pull Payments")]),e._v(" "),t("p",[e._v("The feature of "),t("RouterLink",{attrs:{to:"/PullPayments/"}},[e._v("pull payments")]),e._v(" is one we see fit for options like\nA subscription service, refunds, time-based billing for freelancers, patronage, or a a withdrawal service.")],1),e._v(" "),t("p",[e._v("For a detailed description of the concept, please visit the "),t("RouterLink",{attrs:{to:"/PullPayments/"}},[e._v("Pull Payments")])],1),e._v(" "),t("h3",{attrs:{id:"payouts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payouts"}},[e._v("#")]),e._v(" Payouts")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("payouts")]),e._v(" view gives an overview of the current pull payments and their status.\nIf, for example, a refund has been issued and the claimant has accepted, this will show in Payouts.\nHere you will find the options to Approve and directly send the requested amount of the refund.\nWhen there are multiple instances of Pull payments, these can be selected and batched for sending out at once.\nIn a future version, we expect this to have scheduling options.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(681),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),e._v(" "),t("h3",{attrs:{id:"pay-button"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pay-button"}},[e._v("#")]),e._v(" Pay Button")]),e._v(" "),t("p",[e._v("You can easily embed a donation or a payment button into an HTML of your website.\nWhen the customer or a visitor clicks on the button, BTCPay displays a checkout page and an invoice for them.")]),e._v(" "),t("p",[e._v("For more information, check "),t("RouterLink",{attrs:{to:"/Apps/#payment-button"}},[e._v("Create a payment button")])],1),e._v(" "),t("figure",[t("img",{attrs:{src:a(682),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),e._v(" "),t("h2",{attrs:{id:"apps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#apps"}},[e._v("#")]),e._v(" Apps")]),e._v(" "),t("p",[e._v("Each store has access to different apps. "),t("strong",[e._v("Applications built on top of BTCPay")]),e._v(" extend the "),t("RouterLink",{attrs:{to:"/UseCase/"}},[e._v("use case")]),e._v(" of the software and cater to other types of users. Here, you can create a new app, connect it to the store, and customize it. A good example is the Point of Sale app, which you can use to receive payments in physical stores or even donations.")],1),e._v(" "),t("p",[e._v("For more information, check "),t("RouterLink",{attrs:{to:"/Apps/"}},[e._v("Apps")]),e._v(" or "),t("RouterLink",{attrs:{to:"/FAQ/Apps/"}},[e._v("Apps FAQ")])],1),e._v(" "),t("h2",{attrs:{id:"plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugins"}},[e._v("#")]),e._v(" Plugins")]),e._v(" "),t("p",[e._v("Manage your store-used plugins right from this view.\nThe available plugins for the user will show in the side menu.")]),e._v(" "),t("p",[e._v("For more information, check "),t("RouterLink",{attrs:{to:"/CustomIntegration/"}},[e._v("Integrations")]),e._v("\nor one of the pre build plugins like :")],1),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/WooCommerce/"}},[e._v("WooCommerce")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Shopify/"}},[e._v("Shopify")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Magento/"}},[e._v("Magento")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/PrestaShop/"}},[e._v("Prestashop")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Drupal/"}},[e._v("Drupal")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Zapier/"}},[e._v("Zapier")])],1)]),e._v(" "),t("h2",{attrs:{id:"server-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#server-settings"}},[e._v("#")]),e._v(" Server settings")]),e._v(" "),t("p",[t("strong",[e._v("Server settings")]),e._v(" is something only a server admin can access. If you're using someone else's server, you won't see Server Settings. Inside the settings, you can perform tasks such as controlling users, rates, updating the server, etc. For more information, check "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/"}},[e._v("Server Settings FAQ")])],1),e._v(" "),t("ul",[t("li",[e._v("Users - Add, remove or manage users of your BTCPay Server.")]),e._v(" "),t("li",[e._v("Email server - If you want users to verify their e-mail address when registering set up the SMTP settings.")]),e._v(" "),t("li",[e._v("Policies - Enable or disable user registration, e-mail verification, search engine indexing, display apps on website root.")]),e._v(" "),t("li",[e._v("Services - gRPC, REST, and RTL are used for connecting your LN node, SSH keys, and uploaded file storage setup.")]),e._v(" "),t("li",[e._v("Theme - Customize the front-end appearance of your BTCPay Server.")]),e._v(" "),t("li",[e._v("Maintenance - Update your BTCPay to the latest version and clean your BTCPay by deleting unused docker images.")]),e._v(" "),t("li",[e._v("Logs - Displays most recent logs of the BTCPay Server.")]),e._v(" "),t("li",[e._v("Files - After enabling this feature in Services, upload external files and access them via URL.")])]),e._v(" "),t("h2",{attrs:{id:"account"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#account"}},[e._v("#")]),e._v(" Account")]),e._v(" "),t("p",[e._v("Manage your BTCPay Server account.\nChange anything related to your user-account.\nSetup Two-Factor Authentication and manage API keys.")]),e._v(" "),t("h2",{attrs:{id:"join-the-btcpay-community"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#join-the-btcpay-community"}},[e._v("#")]),e._v(" Join The BTCPay Community")]),e._v(" "),t("p",[e._v("If you have questions, try searching our "),t("RouterLink",{attrs:{to:"/FAQ/"}},[e._v("FAQ Section")]),e._v(" or join the "),t("RouterLink",{attrs:{to:"/Community/"}},[e._v("BTCPay Community")]),e._v(" and share questions and ideas for improvement.")],1),e._v(" "),t("p",[e._v("If you are a developer, take a look at the "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("Local Development")]),e._v(" guide and help us with any "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("open issues"),t("OutboundLink")],1),e._v(" on Github. If you would like to contribute to BTCPay in other ways, check out the "),t("RouterLink",{attrs:{to:"/Contribute/"}},[e._v("Contribution Guide")]),e._v(" for ideas.")],1)])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[59],{659:function(e,t,a){e.exports=a.p+"assets/img/welcome-store.0b77b754.jpg"},660:function(e,t,a){e.exports=a.p+"assets/img/selected-store.5628bf9e.jpg"},661:function(e,t,a){e.exports=a.p+"assets/img/walktrough-payouts1.779e4d06.jpg"},662:function(e,t,a){e.exports=a.p+"assets/img/preview-paybutton.ac9cebb4.jpg"},897:function(e,t,a){"use strict";a.r(t);var o=a(17),r=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"btcpay-server-walkthrough"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-walkthrough"}},[e._v("#")]),e._v(" BTCPay Server Walkthrough")]),e._v(" "),t("p",[e._v("This page walks you through the "),t("strong",[e._v("BTCPay user interface")]),e._v(" and shows how to navigate through the different options.")]),e._v(" "),t("p",[e._v("Watch the video below for an interactive overview of the features.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/ZIfJyq9RimM/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=ZIfJyq9RimM",title:"BTCPay Server Walkthrough","data-id":"ZIfJyq9RimM"}},[t("iframe",{attrs:{title:"BTCPay Server Walkthrough","data-src":"https://www.youtube-nocookie.com/embed/ZIfJyq9RimM?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("p",[e._v("After you've created an account on the BTCPay Server instance hosted by yourself or a third party, you'll be greeted by your store's new home or, as we call it, your "),t("code",[e._v("dashboard")]),e._v(".")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(659),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),e._v(" "),t("p",[e._v("All the settings in the left menu are meant for the Current Store you selected at the top.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(660),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#notifications"}},[e._v("Notifications")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Dashboard/"}},[e._v("Dashboard")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#store"}},[e._v("Settings")]),e._v(" "),t("strong",[e._v("store settings")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#wallets"}},[e._v("Wallets")]),e._v(" "),t("ul",[t("li",[e._v("Bitcoin")]),e._v(" "),t("li",[e._v("Lightning")])])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#payments"}},[e._v("Payments")]),e._v(" "),t("ul",[t("li",[e._v("Invoices")]),e._v(" "),t("li",[e._v("Requests")]),e._v(" "),t("li",[e._v("Pull Payments")]),e._v(" "),t("li",[e._v("Payouts")]),e._v(" "),t("li",[e._v("Pay Button")])])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#apps"}},[e._v("Apps")]),e._v(" "),t("ul",[t("li",[e._v("New App")])])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#plugins"}},[e._v("Plugins")]),e._v(" "),t("ul",[t("li",[e._v("Manage Plugins")])])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#server-settings"}},[e._v("Server Settings")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Walkthrough/#account"}},[e._v("Account")])],1)]),e._v(" "),t("h2",{attrs:{id:"store"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#store"}},[e._v("#")]),e._v(" Store")]),e._v(" "),t("p",[e._v("Inside BTCPay, you can "),t("strong",[e._v("create and manage an unlimited number of stores")]),e._v(". Each store has its own wallet, can create apps (Point of Sale or Payment Buttons and Crowdfunds) or be paired with external e-commerce software through one of the integrations available. Admin does not have control over the private keys of the other user's stores. For more information, check "),t("RouterLink",{attrs:{to:"/FAQ/Stores/"}},[e._v("Stores FAQ")])],1),e._v(" "),t("ul",[t("li",[e._v("Store settings - Configure global payment settings and customize the payment experience for your customers.")]),e._v(" "),t("li",[e._v("Rates - Set the source for cryptocurrency to fiat "),t("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-change-the-exchange-rate-provider-for-invoices"}},[e._v("exchange rates for your store")]),e._v(".")],1),e._v(" "),t("li",[e._v("Checkout experience - "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-modify-the-checkout-page"}},[e._v("Customize the appearance")]),e._v(" of the checkout page, choose default coin, etc.")],1),e._v(" "),t("li",[e._v("Access Tokens - Tokens for "),t("RouterLink",{attrs:{to:"/WhatsNext/#connecting-your-btcpay-store-to-your-e-commerce-platform"}},[e._v("pairing the store to an integration")])],1),e._v(" "),t("li",[e._v("Users - Enable other users with a registered BTCPay account to access your store as either guest or owner.")]),e._v(" "),t("li",[e._v("Pay Button - "),t("RouterLink",{attrs:{to:"/WhatsNext/#creating-the-pay-button"}},[e._v("Create a payment button")]),e._v(" you can easily embed into your website.")],1)]),e._v(" "),t("h2",{attrs:{id:"notifications"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#notifications"}},[e._v("#")]),e._v(" Notifications")]),e._v(" "),t("p",[e._v("Notifications inform the user that "),t("strong",[e._v("an event has occurred on the BTCPay Server instance")]),e._v(".\nSuch event could be a received or failed payment, an overpaid or underpaid invoice, a new BTCPay version and more.")]),e._v(" "),t("p",[e._v("By clicking on the icon, you can access the "),t("code",[e._v("Notifications")]),e._v(" page, where you can view past notifications and optionally delete them.\nLearn more about all BTCPay notifications "),t("RouterLink",{attrs:{to:"/Notifications/"}},[e._v("here")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"dashboard"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#dashboard"}},[e._v("#")]),e._v(" Dashboard")]),e._v(" "),t("p",[e._v("In dashboard you will see the stores wallet balance, a overview of invoices and quickly see your crowdfunds top perks.\nThere's 5 main tiles in the Dashboard.")]),e._v(" "),t("ul",[t("li",[e._v("A quick view on the wallet balance")]),e._v(" "),t("li",[e._v("Transaction and payout activity")]),e._v(" "),t("li",[e._v("Recent Transactions")]),e._v(" "),t("li",[e._v("Recent Invoices")]),e._v(" "),t("li",[e._v("Current running Crowdfunds")])]),e._v(" "),t("p",[e._v("Continue to read more about "),t("RouterLink",{attrs:{to:"/Dashboard/"}},[e._v("Dashboard")])],1),e._v(" "),t("h2",{attrs:{id:"wallets"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wallets"}},[e._v("#")]),e._v(" Wallets")]),e._v(" "),t("h3",{attrs:{id:"bitcoin"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin"}},[e._v("#")]),e._v(" Bitcoin")]),e._v(" "),t("p",[e._v("Depending how many different payment methods you've setup, inside the wallets tab you'll see a wallet for each of the payment methods. Bitcoin on-chain wallet allows you to manage received funds. BTCPay's wallet is feature-rich and has privacy features built-in. Furthermore it has a full hardware wallet integration, so you can manage your funds with compatible hardware wallet directly from your BTCPay. Check "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("wallet page")]),e._v(" for more information.")],1),e._v(" "),t("p",[e._v("Elements of the internal BTCPay Wallet are:")]),e._v(" "),t("ul",[t("li",[e._v("Transaction - This shows your entire transaction history.")]),e._v(" "),t("li",[e._v("Send - Used for sending funds out of your wallet (has to be signed and confirmed on a compatible hardware wallet).")]),e._v(" "),t("li",[e._v("Receive - Used to generate a new address manually.")]),e._v(" "),t("li",[e._v("Rescan - Enables you to import old wallets into BTCPay more easily and solves the gap limit issue most external wallets have.")]),e._v(" "),t("li",[e._v("Pull Payments - Used to create and manage Pull Payments. For more information on this feature, check "),t("RouterLink",{attrs:{to:"/PullPayments/"}},[e._v("Pull Payments")]),e._v(".")],1),e._v(" "),t("li",[e._v("Payouts - Used to manage Pull Payment requests.")]),e._v(" "),t("li",[e._v("PSBT - Used to sign multi-signature transactions through the PSBT standard.")]),e._v(" "),t("li",[e._v("Settings - Used to view and adjust additional settings for your wallet.")])]),e._v(" "),t("h3",{attrs:{id:"lightning"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#lightning"}},[e._v("#")]),e._v(" Lightning")]),e._v(" "),t("p",[e._v("Additionally, we recommend adding a lightning wallet. There are two options, connect an "),t("RouterLink",{attrs:{to:"/LightningNetwork/#connecting-your-internal-lightning-node-in-btcpay"}},[e._v("internal")]),e._v(" or connect an external "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning node")]),e._v(".\nOnce completed, the Lightning wallet function becomes active.")],1),e._v(" "),t("p",[e._v("For more information, check "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("Wallet")]),e._v(" or "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/"}},[e._v("Wallet FAQ")])],1),e._v(" "),t("h2",{attrs:{id:"payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payments"}},[e._v("#")]),e._v(" Payments")]),e._v(" "),t("h3",{attrs:{id:"invoices"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#invoices"}},[e._v("#")]),e._v(" Invoices")]),e._v(" "),t("p",[e._v("All of the "),t("strong",[e._v("invoices")]),e._v(" for your user account will be displayed here. You can filter the invoices by the status, order, item, store or date. You can also create invoices manually. Invoices are sorted by date from new to old. You can open an individual invoice for more information. Use the export button to save a file (.json or .csv).")]),e._v(" "),t("p",[e._v("For more information, check "),t("RouterLink",{attrs:{to:"/Invoices/"}},[e._v("Invoices")])],1),e._v(" "),t("h3",{attrs:{id:"payment-requests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payment-requests"}},[e._v("#")]),e._v(" Payment Requests")]),e._v(" "),t("p",[e._v("Each store can have an unlimited number of "),t("strong",[e._v("payment requests")]),e._v(" displayed here. Payment requests are dynamic invoices that can be shared by URL and paid at any time using current BTC exchange rates. Here you can edit and view your payment requests. You can see invoice details for your payment requests and clone previously created payment requests.")]),e._v(" "),t("p",[e._v("For more information, check "),t("RouterLink",{attrs:{to:"/PaymentRequests/"}},[e._v("Payment Requests")])],1),e._v(" "),t("h3",{attrs:{id:"pull-payments"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pull-payments"}},[e._v("#")]),e._v(" Pull Payments")]),e._v(" "),t("p",[e._v("The feature of "),t("RouterLink",{attrs:{to:"/PullPayments/"}},[e._v("pull payments")]),e._v(" is one we see fit for options like\nA subscription service, refunds, time-based billing for freelancers, patronage, or a a withdrawal service.")],1),e._v(" "),t("p",[e._v("For a detailed description of the concept, please visit the "),t("RouterLink",{attrs:{to:"/PullPayments/"}},[e._v("Pull Payments")])],1),e._v(" "),t("h3",{attrs:{id:"payouts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payouts"}},[e._v("#")]),e._v(" Payouts")]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("payouts")]),e._v(" view gives an overview of the current pull payments and their status.\nIf, for example, a refund has been issued and the claimant has accepted, this will show in Payouts.\nHere you will find the options to Approve and directly send the requested amount of the refund.\nWhen there are multiple instances of Pull payments, these can be selected and batched for sending out at once.\nIn a future version, we expect this to have scheduling options.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(661),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),e._v(" "),t("h3",{attrs:{id:"pay-button"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pay-button"}},[e._v("#")]),e._v(" Pay Button")]),e._v(" "),t("p",[e._v("You can easily embed a donation or a payment button into an HTML of your website.\nWhen the customer or a visitor clicks on the button, BTCPay displays a checkout page and an invoice for them.")]),e._v(" "),t("p",[e._v("For more information, check "),t("RouterLink",{attrs:{to:"/Apps/#payment-button"}},[e._v("Create a payment button")])],1),e._v(" "),t("figure",[t("img",{attrs:{src:a(662),alt:"BTCPay Server Navigation",title:"BTCPay Server Navigation"}})]),e._v(" "),t("h2",{attrs:{id:"apps"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#apps"}},[e._v("#")]),e._v(" Apps")]),e._v(" "),t("p",[e._v("Each store has access to different apps. "),t("strong",[e._v("Applications built on top of BTCPay")]),e._v(" extend the "),t("RouterLink",{attrs:{to:"/UseCase/"}},[e._v("use case")]),e._v(" of the software and cater to other types of users. Here, you can create a new app, connect it to the store, and customize it. A good example is the Point of Sale app, which you can use to receive payments in physical stores or even donations.")],1),e._v(" "),t("p",[e._v("For more information, check "),t("RouterLink",{attrs:{to:"/Apps/"}},[e._v("Apps")]),e._v(" or "),t("RouterLink",{attrs:{to:"/FAQ/Apps/"}},[e._v("Apps FAQ")])],1),e._v(" "),t("h2",{attrs:{id:"plugins"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#plugins"}},[e._v("#")]),e._v(" Plugins")]),e._v(" "),t("p",[e._v("Manage your store-used plugins right from this view.\nThe available plugins for the user will show in the side menu.")]),e._v(" "),t("p",[e._v("For more information, check "),t("RouterLink",{attrs:{to:"/CustomIntegration/"}},[e._v("Integrations")]),e._v("\nor one of the pre build plugins like :")],1),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/WooCommerce/"}},[e._v("WooCommerce")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Shopify/"}},[e._v("Shopify")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Magento/"}},[e._v("Magento")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/PrestaShop/"}},[e._v("Prestashop")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Drupal/"}},[e._v("Drupal")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Zapier/"}},[e._v("Zapier")])],1)]),e._v(" "),t("h2",{attrs:{id:"server-settings"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#server-settings"}},[e._v("#")]),e._v(" Server settings")]),e._v(" "),t("p",[t("strong",[e._v("Server settings")]),e._v(" is something only a server admin can access. If you're using someone else's server, you won't see Server Settings. Inside the settings, you can perform tasks such as controlling users, rates, updating the server, etc. For more information, check "),t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/"}},[e._v("Server Settings FAQ")])],1),e._v(" "),t("ul",[t("li",[e._v("Users - Add, remove or manage users of your BTCPay Server.")]),e._v(" "),t("li",[e._v("Email server - If you want users to verify their e-mail address when registering set up the SMTP settings.")]),e._v(" "),t("li",[e._v("Policies - Enable or disable user registration, e-mail verification, search engine indexing, display apps on website root.")]),e._v(" "),t("li",[e._v("Services - gRPC, REST, and RTL are used for connecting your LN node, SSH keys, and uploaded file storage setup.")]),e._v(" "),t("li",[e._v("Theme - Customize the front-end appearance of your BTCPay Server.")]),e._v(" "),t("li",[e._v("Maintenance - Update your BTCPay to the latest version and clean your BTCPay by deleting unused docker images.")]),e._v(" "),t("li",[e._v("Logs - Displays most recent logs of the BTCPay Server.")]),e._v(" "),t("li",[e._v("Files - After enabling this feature in Services, upload external files and access them via URL.")])]),e._v(" "),t("h2",{attrs:{id:"account"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#account"}},[e._v("#")]),e._v(" Account")]),e._v(" "),t("p",[e._v("Manage your BTCPay Server account.\nChange anything related to your user-account.\nSetup Two-Factor Authentication and manage API keys.")]),e._v(" "),t("h2",{attrs:{id:"join-the-btcpay-community"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#join-the-btcpay-community"}},[e._v("#")]),e._v(" Join The BTCPay Community")]),e._v(" "),t("p",[e._v("If you have questions, try searching our "),t("RouterLink",{attrs:{to:"/FAQ/"}},[e._v("FAQ Section")]),e._v(" or join the "),t("RouterLink",{attrs:{to:"/Community/"}},[e._v("BTCPay Community")]),e._v(" and share questions and ideas for improvement.")],1),e._v(" "),t("p",[e._v("If you are a developer, take a look at the "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("Local Development")]),e._v(" guide and help us with any "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("open issues"),t("OutboundLink")],1),e._v(" on Github. If you would like to contribute to BTCPay in other ways, check out the "),t("RouterLink",{attrs:{to:"/Contribute/"}},[e._v("Contribution Guide")]),e._v(" for ideas.")],1)])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/61.83afe78a.js b/assets/js/61.4768525b.js similarity index 99% rename from assets/js/61.83afe78a.js rename to assets/js/61.4768525b.js index 201ea62b4e..f83316b8d1 100644 --- a/assets/js/61.83afe78a.js +++ b/assets/js/61.4768525b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{467:function(t,e,a){t.exports=a.p+"assets/img/Gandi3.3773602e.png"},468:function(t,e,a){t.exports=a.p+"assets/img/changedomain.854d7214.png"},469:function(t,e,a){t.exports=a.p+"assets/img/Maintenance2.65b06a5b.png"},840:function(t,e,a){"use strict";a.r(e);var s=a(17),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"deployment-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#deployment-faq"}},[t._v("#")]),t._v(" Deployment FAQ")]),t._v(" "),e("p",[t._v("This document covers the most common questions, errors, and issues you may encounter prior and during the installation of the software. For a detailed list of deployment methods and instructions for each, please see "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("Deployment page")]),t._v(".")],1),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#general-deployment"}},[t._v("General Deployment")]),e("ul",[e("li",[e("a",{attrs:{href:"#how-much-does-it-cost-to-run-btcpay-server"}},[t._v("How much does it cost to run BTCPay Server?")])]),e("li",[e("a",{attrs:{href:"#what-are-the-minimal-requirements-for-btcpay"}},[t._v("What are the minimal requirements for BTCPay?")])]),e("li",[e("a",{attrs:{href:"#what-is-the-easiest-method-to-deploy-a-self-hosted-btcpay-server"}},[t._v("What is the easiest method to deploy a self-hosted BTCPay Server?")])]),e("li",[e("a",{attrs:{href:"#how-to-choose-a-proper-deployment-method"}},[t._v("How to choose a proper deployment method?")])]),e("li",[e("a",{attrs:{href:"#can-i-run-btcpay-on-my-own-hardware"}},[t._v("Can I run BTCPay on my own hardware?")])]),e("li",[e("a",{attrs:{href:"#can-i-deploy-btcpay-on-my-existing-vps"}},[t._v("Can I deploy BTCPay on my existing VPS?")])]),e("li",[e("a",{attrs:{href:"#are-there-free-hosts-where-i-can-test"}},[t._v("Are there free hosts where I can test?")])]),e("li",[e("a",{attrs:{href:"#after-initial-deployment-i-cant-register-and-i-dont-have-a-login-yet"}},[t._v("After initial deployment, I can't register and I don't have a login yet?")])]),e("li",[e("a",{attrs:{href:"#how-do-i-activate-tor-on-my-btcpay-server"}},[t._v("How do I activate Tor on my BTCPay Server?")])]),e("li",[e("a",{attrs:{href:"#how-do-i-disable-tor-on-my-btcpay-server"}},[t._v("How do I disable Tor on my BTCPay Server?")])]),e("li",[e("a",{attrs:{href:"#why-activate-tor-does-it-mean-that-nobody-knows-who-i-am"}},[t._v("Why activate Tor? Does it mean that nobody knows who I am?")])]),e("li",[e("a",{attrs:{href:"#how-to-access-the-onion-address-without-clearnet"}},[t._v("How to access the .onion address without clearnet?")])]),e("li",[e("a",{attrs:{href:"#how-can-i-modify-or-deactivate-environment-variables"}},[t._v("How can I modify or deactivate environment variables?")])]),e("li",[e("a",{attrs:{href:"#how-can-i-run-btcpay-on-testnet"}},[t._v("How can I run BTCPay on testnet?")])]),e("li",[e("a",{attrs:{href:"#can-i-start-btcpay-only-when-im-expecting-a-payment"}},[t._v("Can I start BTCPay only when I'm expecting a payment?")])]),e("li",[e("a",{attrs:{href:"#can-i-connect-to-my-btcpay-bitcoin-p2p-on-port-8333"}},[t._v("Can I connect to my BTCPay Bitcoin P2P on port 8333?")])]),e("li",[e("a",{attrs:{href:"#how-can-i-renew-my-ssl-certificate"}},[t._v("How can I renew my SSL certificate?")])]),e("li",[e("a",{attrs:{href:"#can-i-use-an-existing-nginx-server-as-a-reverse-proxy-with-ssl-termination"}},[t._v("Can I use an existing Nginx server as a reverse proxy with SSL termination?")])])])]),e("li",[e("a",{attrs:{href:"#how-to-change-your-btcpay-server-domain-name"}},[t._v("How to change your BTCPay Server domain name?")]),e("ul",[e("li",[e("a",{attrs:{href:"#setting-up-dns-records"}},[t._v("Setting up DNS Records")])]),e("li",[e("a",{attrs:{href:"#change-domain-name-in-btcpay-server-settings"}},[t._v("Change domain name in BTCPay Server settings")])]),e("li",[e("a",{attrs:{href:"#change-domain-on-command-line"}},[t._v("Change domain on command line")])])])]),e("li",[e("a",{attrs:{href:"#web-deployment"}},[t._v("Web-deployment")]),e("ul",[e("li",[e("a",{attrs:{href:"#can-i-run-btcpay-on-my-home-computer"}},[t._v("Can I run BTCPay on my home computer?")])]),e("li",[e("a",{attrs:{href:"#lunanode-web-deployment"}},[t._v("LunaNode web-deployment")])])])]),e("li",[e("a",{attrs:{href:"#manual-deployment"}},[t._v("Manual Deployment")]),e("ul",[e("li",[e("a",{attrs:{href:"#how-do-i-completely-uninstall-btcpay-from-a-linux-environment-docker-version"}},[t._v("How do I completely uninstall BTCPay from a Linux environment (Docker version)")])]),e("li",[e("a",{attrs:{href:"#how-to-deploy-btcpay-server-alongside-existing-bitcoin-node"}},[t._v("How to deploy BTCPay Server alongside existing Bitcoin node?")])]),e("li",[e("a",{attrs:{href:"#with-the-docker-deployment-how-to-use-a-different-volume-for-the-data"}},[t._v("With the docker deployment, how to use a different volume for the data?")])]),e("li",[e("a",{attrs:{href:"#i-get-503-service-temporarily-unavailable-nginx"}},[t._v("I get 503 Service Temporarily Unavailable nginx")])])])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"general-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#general-deployment"}},[t._v("#")]),t._v(" General Deployment")]),t._v(" "),e("h3",{attrs:{id:"how-much-does-it-cost-to-run-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-much-does-it-cost-to-run-btcpay-server"}},[t._v("#")]),t._v(" How much does it cost to run BTCPay Server?")]),t._v(" "),e("p",[t._v("BTCPay is a 100% free and open-source software. We do not charge you anything.\nHowever, to run it, you should host it. You can run it as a self-hosted solution on your own local server, or use a cloud hosting provider, which is what a majority of users do. Advanced users can run BTCPay on "),e("RouterLink",{attrs:{to:"/Deployment/Hardware/"}},[t._v("their own hardware")]),t._v(". Less technical users can use "),e("RouterLink",{attrs:{to:"/Deployment/HardwareAsAService/"}},[t._v("Hardware As A Service options")]),t._v(". If you do not wish to host your own server, you can use a free "),e("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[t._v("Third-Party Host")]),t._v(". Visit our "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("Deployment Page")]),t._v(" for more information on the various ways in which you can run BTCPay.")],1),t._v(" "),e("h3",{attrs:{id:"what-are-the-minimal-requirements-for-btcpay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#what-are-the-minimal-requirements-for-btcpay"}},[t._v("#")]),t._v(" What are the minimal requirements for BTCPay?")]),t._v(" "),e("p",[t._v("If you would like to run Bitcoin and Lightning Network nodes, the minimal requirements are :")]),t._v(" "),e("ul",[e("li",[t._v("2GB Ram")]),t._v(" "),e("li",[t._v("80 GB of storage "),e("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[t._v("with enabled pruning")])],1),t._v(" "),e("li",[t._v("Docker")])]),t._v(" "),e("h3",{attrs:{id:"what-is-the-easiest-method-to-deploy-a-self-hosted-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#what-is-the-easiest-method-to-deploy-a-self-hosted-btcpay-server"}},[t._v("#")]),t._v(" What is the easiest method to deploy a self-hosted BTCPay Server?")]),t._v(" "),e("p",[t._v("For beginners, we strongly recommend the "),e("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[t._v("web-deployment")]),t._v(" if you want a self-hosted solution or a "),e("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[t._v("third-party host")]),t._v(".")],1),t._v(" "),e("p",[t._v("If you're going to add more than one crypto coin, you need to expand the storage according to that coin(s) blockchain size.")]),t._v(" "),e("h3",{attrs:{id:"how-to-choose-a-proper-deployment-method"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-choose-a-proper-deployment-method"}},[t._v("#")]),t._v(" How to choose a proper deployment method?")]),t._v(" "),e("p",[t._v("Please see the "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("Deployment page")]),t._v(" for comparison of different installation methods and choose the one that suits your needs and skill level the most.")],1),t._v(" "),e("h3",{attrs:{id:"can-i-run-btcpay-on-my-own-hardware"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-i-run-btcpay-on-my-own-hardware"}},[t._v("#")]),t._v(" Can I run BTCPay on my own hardware?")]),t._v(" "),e("p",[t._v("Yes, you can. Check our the "),e("RouterLink",{attrs:{to:"/Deployment/Hardware/"}},[t._v("Hardware Deployment page")]),t._v(" for detailed instructions.")],1),t._v(" "),e("h3",{attrs:{id:"can-i-deploy-btcpay-on-my-existing-vps"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-i-deploy-btcpay-on-my-existing-vps"}},[t._v("#")]),t._v(" Can I deploy BTCPay on my existing VPS?")]),t._v(" "),e("p",[t._v("Yes. BTCPay is not limited to the documented deployment methods. You can use whichever hosting solution you prefer, that fits the minimal requirements.")]),t._v(" "),e("h3",{attrs:{id:"are-there-free-hosts-where-i-can-test"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-there-free-hosts-where-i-can-test"}},[t._v("#")]),t._v(" Are there free hosts where I can test?")]),t._v(" "),e("p",[t._v("On a self-hosted BTCPay, an unlimited amount of users and stores can be attached. Some community users have open registration on their servers for others to use their BTCPay Server mainly for testing and learning. Most of them are community-driven and free. See the "),e("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[t._v("third-party hosts documentation")]),t._v(" for more information.")],1),t._v(" "),e("h3",{attrs:{id:"after-initial-deployment-i-cant-register-and-i-dont-have-a-login-yet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#after-initial-deployment-i-cant-register-and-i-dont-have-a-login-yet"}},[t._v("#")]),t._v(" After initial deployment, I can't register and I don't have a login yet?")]),t._v(" "),e("p",[t._v("When you deploy your BTCPay Server, you should first register a user (during server synchronization). This user is automatically the server admin. If your BTCPay only shows Login in the header menu, and you are unable to register the first user after initial deployment, someone else has registered on your server as the admin. Although this is unlikely to occur (the user would need to know and watch your BTCPay domain name), they had access to your ssh private keys, thus you should redeploy a new server for security reasons.")]),t._v(" "),e("h3",{attrs:{id:"how-do-i-activate-tor-on-my-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-activate-tor-on-my-btcpay-server"}},[t._v("#")]),t._v(" How do I activate Tor on my BTCPay Server?")]),t._v(" "),e("p",[t._v("Tor is activated by default on the docker deployment.")]),t._v(" "),e("h3",{attrs:{id:"how-do-i-disable-tor-on-my-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-disable-tor-on-my-btcpay-server"}},[t._v("#")]),t._v(" How do I disable Tor on my BTCPay Server?")]),t._v(" "),e("p",[t._v("That's really easy: just log in your instance with SSH, and enter as root the enter following commands:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_EXCLUDE_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_EXCLUDE_FRAGMENTS")]),t._v(';opt-add-tor"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),e("p",[t._v("Then wait a few minutes for the server to restart, and you're done!")]),t._v(" "),e("h3",{attrs:{id:"why-activate-tor-does-it-mean-that-nobody-knows-who-i-am"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#why-activate-tor-does-it-mean-that-nobody-knows-who-i-am"}},[t._v("#")]),t._v(" Why activate Tor? Does it mean that nobody knows who I am?")]),t._v(" "),e("p",[t._v("Tor for BTCPay server is intended more as an improvement of the setup process, and allows for more flexibility for hosting on one's own device at home or in an office.")]),t._v(" "),e("p",[t._v("Having Tor activated would allow for simpler, plug-and-play usage of BTCPay, as it suppress the need for the following configuration steps:")]),t._v(" "),e("ul",[e("li",[t._v("Opening multiple ports on the firewall")]),t._v(" "),e("li",[t._v("Configuring the NAT for port redirection to your device on your local network")]),t._v(" "),e("li",[t._v("Setting up a DNS entry to get a HTTPS certificate")]),t._v(" "),e("li",[t._v("Having a fixed IP for Lightning")])]),t._v(" "),e("p",[t._v("While these steps are usually not a problem when BTCPay is hosted on a VPS, it can be difficult to solve for non-technical users on home or office networks.")]),t._v(" "),e("p",[t._v("Tor just solves all these issues in one shot, all you have to do is plug your device on the local network. It is especially useful for POS application.")]),t._v(" "),e("p",[t._v("But if you're looking for perfect privacy and security, "),e("strong",[t._v("activating Tor with your BTCPay just won't do it.")])]),t._v(" "),e("p",[t._v("Tor is a really tricky software to use for developers, as the slightest mistake can tear down the anonymity it provides. As BTCPay is evolving into a rather complex service and adding more and more plugins, even if we tried to route all this traffic through Tor, we couldn't guarantee that there would never be leaks of data in clear.")]),t._v(" "),e("p",[t._v("We think that the illusion of security is more dangerous that no security, or at least security we know is imperfect. So be aware that activating Tor doesn't prevent others to connect to your instance website, your bitcoin or lightning node in clear, "),e("strong",[t._v("it doesn't make you anonymous at all.")])]),t._v(" "),e("p",[t._v("If you want to know more about the philosophy behind all this, you can read our "),e("a",{attrs:{href:"https://medium.com/@BtcpayServer/about-tor-and-btcpay-server-2ec1e4bd5e51",target:"_blank",rel:"noopener noreferrer"}},[t._v("article on Medium"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"how-to-access-the-onion-address-without-clearnet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-access-the-onion-address-without-clearnet"}},[t._v("#")]),t._v(" How to access the .onion address without clearnet?")]),t._v(" "),e("p",[t._v("To see the .onion address of your BTCPay instance without accessing it through the clearnet and clicking the Tor logo in top left corner, apply the following command:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /var/lib/docker/volumes/generated_tor_servicesdir/_data/BTCPayServer/hostname\n")])])]),e("h3",{attrs:{id:"how-can-i-modify-or-deactivate-environment-variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-modify-or-deactivate-environment-variables"}},[t._v("#")]),t._v(" How can I modify or deactivate environment variables?")]),t._v(" "),e("p",[t._v("In BTCPay, various options are activated through environment variables. You can modify or delete any of these options using command lines by exporting the new value with "),e("code",[t._v('export {environment variable}="{value}"')]),t._v(" and then running "),e("code",[t._v(". ./btcpay-setup.sh -i")]),t._v(" again.")]),t._v(" "),e("p",[t._v("For example, let's say I want to deactivate Tor for my BTCPay server:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Login as root")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Go to the root/btcpayserver-docker directory")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" /root/btcpayserver-docker\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Print the complete list of options that you are running (for the sake of the demonstration, let's say that besides Tor you have pruning mode activated too)")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t._v("\nopt-save-storage-s"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("opt-add-tor\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Export the BTCPAYGEN_ADDITIONAL_FRAGMENTS variable without opt-add-tor")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"opt-save-storage-s"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Run btcpay-setup.sh")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exit")]),t._v("\n")])])]),e("p",[t._v("Similarly if you are adding an environment variable, the export command would instead look like this:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Enable Tor in addition to your existing environment variables (such as pruning)")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t._v(';opt-add-tor"')]),t._v("\n")])])]),e("p",[t._v("If you need to figure out which environment variable you need to modify, have a look at "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker#environment-variables",target:"_blank",rel:"noopener noreferrer"}},[t._v("this list"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"how-can-i-run-btcpay-on-testnet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-run-btcpay-on-testnet"}},[t._v("#")]),t._v(" How can I run BTCPay on testnet?")]),t._v(" "),e("p",[t._v("Building on the section above, this is how you configure BTCPay to use "),e("code",[t._v("testnet")]),t._v(" instead of the default "),e("code",[t._v("mainnet")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Export the NBITCOIN_NETWORK variable switching to testnet")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("NBITCOIN_NETWORK")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"testnet"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Run btcpay-setup.sh for the change to take effect")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),e("p",[t._v("If you just want to test things quickly without deploying everything yourself, have a look at the "),e("RouterLink",{attrs:{to:"/TryItOut/"}},[t._v("Try It Out")]),t._v(" section.\nIt provides links and explanations for a BTCPay testnet instance hosted by us.")],1),t._v(" "),e("h3",{attrs:{id:"can-i-start-btcpay-only-when-im-expecting-a-payment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-i-start-btcpay-only-when-im-expecting-a-payment"}},[t._v("#")]),t._v(" Can I start BTCPay only when I'm expecting a payment?")]),t._v(" "),e("p",[t._v("No, you need to keep your BTCPay running at all times so that your Bitcoin node stays in sync with the blockchain to verify transactions. If you only start it up every now and then, it would take a long time to catch up on verifying recent blocks, and your payments would not show up until much later.")]),t._v(" "),e("h3",{attrs:{id:"can-i-connect-to-my-btcpay-bitcoin-p2p-on-port-8333"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-i-connect-to-my-btcpay-bitcoin-p2p-on-port-8333"}},[t._v("#")]),t._v(" Can I connect to my BTCPay Bitcoin P2P on port 8333?")]),t._v(" "),e("p",[t._v("BTCPay's Bitcoin core node is not exposed externally by default. For BTCPay purposes, it is typically not in the interest of the user, as it increases the bandwidth requirement. BTCPay is also whitebinding connections to this port, so opening it would expose the node to potential DDoS.")]),t._v(" "),e("p",[t._v("However, we expose a P2P connection to your full node on Tor. You can get the Tor address by running:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /var/lib/docker/volumes/generated_tor_servicesdir/_data/BTC-P2P/hostname\n")])])]),e("p",[t._v("Or via the "),e("code",[t._v("Server Settings")]),t._v(" of your BTCPay Server instance, logged as an administrator.")]),t._v(" "),e("p",[t._v("Please do not share this tor hidden service with untrusted parties. Connections to this hidden service are whitelisted by the bitcoin node, malicious peer would be able to DDoS your node.")]),t._v(" "),e("p",[t._v("If you need to unsafely expose bitcoind P2P port 8333 (for example if you require P2P for Bisq, DOJO, Esplora, etc.) and you are using a docker deployment, you can use the "),e("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[t._v("opt-unsafe-expose")]),t._v(" additional fragment.")],1),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("ONLY USE ON TRUSTED LAN OR WITH FIREWALL RULES WHITELISTING SPECIFIC HOSTS")])]),t._v(" "),e("h3",{attrs:{id:"how-can-i-renew-my-ssl-certificate"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-renew-my-ssl-certificate"}},[t._v("#")]),t._v(" How can I renew my SSL certificate?")]),t._v(" "),e("p",[t._v("If your SSL certificate has expired for your BTCPay Server, you can manually renew it. For Docker deployments the easiest way to do this is to "),e("RouterLink",{attrs:{to:"/Troubleshooting/#13-restarting-a-service"}},[t._v("restart the container")]),t._v(" named "),e("code",[t._v("letsencrypt-nginx-proxy-companion")]),t._v(" on your server.")],1),t._v(" "),e("h3",{attrs:{id:"can-i-use-an-existing-nginx-server-as-a-reverse-proxy-with-ssl-termination"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-i-use-an-existing-nginx-server-as-a-reverse-proxy-with-ssl-termination"}},[t._v("#")]),t._v(" Can I use an existing Nginx server as a reverse proxy with SSL termination?")]),t._v(" "),e("p",[t._v("Yes you can! Just make sure to use the proper configuration.")]),t._v(" "),e("p",[t._v("Create an extra config file for your vhost in "),e("code",[t._v("/etc/nginx/sites-available/btcpayserver")]),t._v(" and create a symlink for this file at "),e("code",[t._v("/etc/nginx/sites-enabled/btcpayserver")])]),t._v(" "),e("p",[t._v("The contents of this vhost file should look like this:")]),t._v(" "),e("div",{staticClass:"language-nginx extra-class"},[e("pre",{pre:!0,attrs:{class:"language-nginx"}},[e("code",[e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("listen")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("80")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("root")]),t._v(" /var/www/html")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("index")]),t._v(" index.html index.htm index.nginx-debian.html")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Put your domain name here")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server_name")]),t._v(" btcpay.domain.com")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Needed for Let's Encrypt verification")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" ~ /.well-known/acme-challenge")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("allow")]),t._v(" all")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Force HTTP to HTTPS")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" /")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("301")]),t._v(" https://"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_host")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$request_uri")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("listen")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("443")]),t._v(" ssl http2")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("on")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# SSL certificate by Let's Encrypt in this Nginx (not using Let's Encyrpt that came with BTCPay Server Docker)")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_certificate")]),t._v(" /etc/letsencrypt/live/btcpay.domain.com/fullchain.pem")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_certificate_key")]),t._v(" /etc/letsencrypt/live/btcpay.domain.com/privkey.pem")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("root")]),t._v(" /var/www/html")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("index")]),t._v(" index.html index.htm index.nginx-debian.html")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Put your domain name here")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server_name")]),t._v(" btcpay.domain.com")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Route everything to the real BTCPay server")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" /")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# URL of BTCPay Server (i.e. a Docker installation with REVERSEPROXY_HTTP_PORT set to 10080)")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_pass")]),t._v(" http://127.0.0.1:10080")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" Host "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_host")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Forwarded-Proto "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$scheme")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Real-IP "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$remote_addr")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Forwarded-For "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$proxy_add_x_forwarded_for")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# For websockets (used by Ledger hardware wallets)")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" Upgrade "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_upgrade")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Needed for Let's Encrypt verification")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" ~ /.well-known/acme-challenge")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("allow")]),t._v(" all")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),e("p",[t._v("Also, put the following in your main Nginx config file at "),e("code",[t._v("/etc/nginx/nginx.conf")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-nginx extra-class"},[e("pre",{pre:!0,attrs:{class:"language-nginx"}},[e("code",[e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("http")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ... # Existing stuff")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Needed to allow very long URLs to prevent issues while signing PSBTs")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server_names_hash_bucket_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("128")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_buffer_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("128k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_buffers")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("256k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_busy_buffers_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("256k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("client_header_buffer_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("500k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("large_client_header_buffers")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("500k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Needed websocket support (used by Ledger hardware wallets)")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_upgrade")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection_upgrade")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" upgrade")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t'' "),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("close")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("Now test your Nginx config with "),e("code",[t._v("service nginx configtest")]),t._v(" and reload the config with "),e("code",[t._v("service nginx reload")]),t._v(".")]),t._v(" "),e("p",[t._v("Then, you need to make sure that BTCPayServer does not try to handle HTTPS on its side, you can do this by disabling it on your BTCPayServer instance.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_EXCLUDE_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_EXCLUDE_FRAGMENTS")]),t._v(';nginx-https"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),e("p",[t._v("Notice: If your BTCPay Server install has more than one domain (for example "),e("code",[t._v("WOOCOMMERCE_HOST")]),t._v(" or "),e("code",[t._v("BTCPAY_ADDITIONAL_HOSTS")]),t._v(") you will need to modify your config for each domain name. The example above only covers 1 domain name called "),e("code",[t._v("btcpay.domain.com")]),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"how-to-change-your-btcpay-server-domain-name"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-change-your-btcpay-server-domain-name"}},[t._v("#")]),t._v(" How to change your BTCPay Server domain name?")]),t._v(" "),e("h3",{attrs:{id:"setting-up-dns-records"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-dns-records"}},[t._v("#")]),t._v(" Setting up DNS Records")]),t._v(" "),e("p",[t._v("You bought a domain and now want to connect that to your BTCPay Server.\nThe hosting party usually has a page to manage your domain.\nHere you will find the "),e("code",[t._v("DNS records")]),t._v(" page and add a "),e("code",[t._v("CNAME")]),t._v(" record.")]),t._v(" "),e("p",[t._v("In this record you will make sure, it points to the provided domain by your VPS hoster.\nYou could also do this by IP address, but then instead of a "),e("code",[t._v("CNAME record")]),t._v(" it would be an "),e("code",[t._v("A Record")]),t._v(".")]),t._v(" "),e("p",[t._v("This is an example of how this would look at "),e("a",{attrs:{href:"https://gandi.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("gandi.net"),e("OutboundLink")],1)]),t._v(" "),e("figure",[e("img",{attrs:{src:a(467),alt:"Gandi3",title:"Gandi3"}})]),t._v(" "),e("h3",{attrs:{id:"change-domain-name-in-btcpay-server-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#change-domain-name-in-btcpay-server-settings"}},[t._v("#")]),t._v(" Change domain name in BTCPay Server settings")]),t._v(" "),e("p",[t._v("In BTCPay Server you go to the "),e("code",[t._v("Server Settings")]),t._v(" menu, and then into the tab "),e("code",[t._v("Maintenance")]),t._v(".\nHere you will find a field to replace your old by the new set domain, it might take a few seconds to update.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(468),alt:"Maintenance domain name",title:"Maintenance domain name"}})]),t._v(" "),e("p",[t._v("Now enter the new set domain in the address bar and see if it works!")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(469),alt:"Maintenance2",title:"Maintenance2"}})]),t._v(" "),e("h3",{attrs:{id:"change-domain-on-command-line"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#change-domain-on-command-line"}},[t._v("#")]),t._v(" Change domain on command line")]),t._v(" "),e("p",[t._v("Connect to your server through SSH.")]),t._v(" "),e("p",[t._v("Example :")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ssh")]),t._v(" btcpayserver@myawesomedemobtcpay.westeurope.cloudapp.azure.com\n")])])]),e("p",[t._v("Enter your password and change the domain name.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\nchangedomain.sh tothemoon.btcpayserver.com\n")])])]),e("p",[t._v("Success!")]),t._v(" "),e("h2",{attrs:{id:"web-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#web-deployment"}},[t._v("#")]),t._v(" Web-deployment")]),t._v(" "),e("p",[t._v("Here you can find common questions and solutions to BTCPay web-deployments.")]),t._v(" "),e("h3",{attrs:{id:"can-i-run-btcpay-on-my-home-computer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-i-run-btcpay-on-my-home-computer"}},[t._v("#")]),t._v(" Can I run BTCPay on my home computer?")]),t._v(" "),e("p",[t._v("Similar to the requirements for hosting a website, a web server is required for a BTCPay Server instance. While it is possible to run BTCPay Server locally on your PC, it would have to meet the minimal requirements and also run 24/7 if you don't want interruptions of service. You might also not want to expose your home IP address for the activity related to BTCPay Server payments. For all these reasons, while local hosting is suitable for testing, it's not a viable solution for production. A Virtual Private Server (VPS) is commonly used to address these problems.")]),t._v(" "),e("h3",{attrs:{id:"lunanode-web-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lunanode-web-deployment"}},[t._v("#")]),t._v(" LunaNode web-deployment")]),t._v(" "),e("h4",{attrs:{id:"how-to-change-domain-name-on-my-lunanode-btcpay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-change-domain-name-on-my-lunanode-btcpay"}},[t._v("#")]),t._v(" How to change domain name on my LunaNode BTCPay?")]),t._v(" "),e("ol",[e("li",[t._v("In your LunaNode dashboard, click on Virtual Machines > Your Virtual Machine > General Tab > External IP. Copy the external IP.")]),t._v(" "),e("li",[t._v("Go to your DNS provider and create an A record. Paste the external IP.")]),t._v(" "),e("li",[t._v("Go to Server Settings > Maintenance > Change Domain. Paste yourdomain.com without http or https prefix.")])]),t._v(" "),e("p",[t._v("Additional documentation can be found here: "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-to-change-your-btcpay-server-domain-name"}},[t._v("How to change your BTCPay Server domain name")]),t._v(").")],1),t._v(" "),e("h2",{attrs:{id:"manual-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#manual-deployment"}},[t._v("#")]),t._v(" Manual Deployment")]),t._v(" "),e("h4",{attrs:{id:"how-to-manually-install-btcpay-on-ubuntu-1804"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-manually-install-btcpay-on-ubuntu-1804"}},[t._v("#")]),t._v(" How to manually install BTCPay on Ubuntu 18.04?")]),t._v(" "),e("p",[t._v("Check this "),e("a",{attrs:{href:"https://freedomnode.com/blog/114/how-to-setup-btc-and-lightning-payment-gateway-with-btcpayserver-on-linux-manual-install",target:"_blank",rel:"noopener noreferrer"}},[t._v("community guide"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"how-do-i-completely-uninstall-btcpay-from-a-linux-environment-docker-version"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-completely-uninstall-btcpay-from-a-linux-environment-docker-version"}},[t._v("#")]),t._v(" How do I completely uninstall BTCPay from a Linux environment (Docker version)")]),t._v(" "),e("p",[t._v("Use the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/btcpay-teardown.sh",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("btcpay-teardown.sh")]),e("OutboundLink")],1),t._v(" script like this:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-teardown.sh\n")])])]),e("p",[t._v("This will completely erase BTCPay Server from your instance and remove the associated Docker containers and volumes.")]),t._v(" "),e("h3",{attrs:{id:"how-to-deploy-btcpay-server-alongside-existing-bitcoin-node"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-deploy-btcpay-server-alongside-existing-bitcoin-node"}},[t._v("#")]),t._v(" How to deploy BTCPay Server alongside existing Bitcoin node?")]),t._v(" "),e("p",[t._v("The instructions below are valid for Docker deployments:")]),t._v(" "),e("ul",[e("li",[t._v("Run setup as described in "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker#full-installation-for-technical-users",target:"_blank",rel:"noopener noreferrer"}},[t._v("btcpayserver-docker"),e("OutboundLink")],1),t._v(" up until "),e("code",[t._v(". ./btcpay-setup.sh -i")])]),t._v(" "),e("li",[t._v("Create "),e("code",[t._v("bitcoin.custom.yml")]),t._v(" in the "),e("code",[t._v("docker-compose-generator/docker-fragments/")]),t._v(" folder.")])]),t._v(" "),e("div",{staticClass:"language-yml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-yml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("version")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'3'")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("services")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("btcpayserver")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("environment")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("BTCPAY_CHAINS")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'btc'")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("BTCPAY_BTCEXPLORERURL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" http"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("//nbxplorer"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("32838/\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("nbxplorer")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("environment")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("NBXPLORER_CHAINS")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'btc'")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("NBXPLORER_BTCRPCURL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" http"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("//host.docker.internal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("43782/\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("NBXPLORER_BTCRPCUSER")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'rpc-username'")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("NBXPLORER_BTCRPCPASSWORD")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'rpc-password'")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("NBXPLORER_BTCNODEENDPOINT")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" host.docker.internal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("39388")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("volumes")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'localBitcoinfolder:/root/.bitcoin'")]),t._v("\n")])])]),e("ul",[e("li",[t._v("Replace: "),e("code",[t._v("43782")]),t._v(" with your bitcoin node's configured RPC port")]),t._v(" "),e("li",[t._v("Replace: "),e("code",[t._v("rpc-username")]),t._v(" with your bitcoin node's configured RPC username")]),t._v(" "),e("li",[t._v("Replace: "),e("code",[t._v("rpc-password")]),t._v(" with your bitcoin node's configured RPC password")]),t._v(" "),e("li",[t._v("Replace: "),e("code",[t._v("39388")]),t._v(" with your bitcoin node's configured p2p port")]),t._v(" "),e("li",[t._v("Replace "),e("code",[t._v("localBitcoinfolder")]),t._v(" with the path to your bitcoin data folder")])]),t._v(" "),e("p",[t._v("If you are running on linux, due to "),e("a",{attrs:{href:"https://github.com/docker/for-linux/issues/264",target:"_blank",rel:"noopener noreferrer"}},[t._v("a limitation of docker"),e("OutboundLink")],1),t._v(", you will also need to do the following:")]),t._v(" "),e("ul",[e("li",[t._v("Run "),e("code",[t._v("ip route | grep docker0 | awk '{print $9}'")]),t._v(" "),e("ul",[e("li",[t._v("Add the following at the end of the "),e("code",[t._v("bitcoin.custom.yml")]),t._v(" file, replacing "),e("code",[t._v("$DOCKER_HOST_IP")]),t._v(" with the result of the previous command.")])])])]),t._v(" "),e("div",{staticClass:"language-yml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-yml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("extra_hosts")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'host.docker.internal:$DOCKER_HOST_IP'")]),t._v("\n")])])]),e("ul",[e("li",[t._v("Run "),e("code",[t._v('export BTCPAYGEN_EXCLUDE_FRAGMENTS="bitcoin"')])]),t._v(" "),e("li",[t._v("Run "),e("code",[t._v('export BTCPAYGEN_ADDITIONAL_FRAGMENTS="$BTCPAYGEN_ADDITIONAL_FRAGMENTS;bitcoin.custom"')])]),t._v(" "),e("li",[t._v("Run "),e("code",[t._v(". ./btcpay-setup.sh -i")])])]),t._v(" "),e("p",[t._v("If you are looking for how to deploy alongside existing Lightning node "),e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#can-i-use-my-existing-ln-node-with-btcpay"}},[t._v("see this")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"with-the-docker-deployment-how-to-use-a-different-volume-for-the-data"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#with-the-docker-deployment-how-to-use-a-different-volume-for-the-data"}},[t._v("#")]),t._v(" With the docker deployment, how to use a different volume for the data?")]),t._v(" "),e("p",[t._v("First, you need to make sure that btcpayserver and docker is not running")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\nbtcpay-down.sh\nsystemctl stop "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v("\n")])])]),e("p",[t._v("Now, you need to format your drive. If you have already done it, you can skip this step.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Step 1: Unplug the drive")]),t._v("\nlsblk\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Step 2: Plug the drive")]),t._v("\nlsblk\n")])])]),e("p",[t._v("The second "),e("code",[t._v("lsblk")]),t._v(" should show the drive you just plugged in. (of TYPE "),e("code",[t._v("disk")]),t._v(")\nMake sure you don't make a mistake as the next command will erase all data on this disk.")]),t._v(" "),e("p",[t._v("For the sake of the example, let's suppose it has the NAME "),e("code",[t._v("/dev/sdd")]),t._v(".")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Save the name in a variable")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("DEVICE_NAME")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/dev/sdd"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Set the partition name")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("PARTITION_NAME")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/dev/sdd1"')]),t._v("\n")])])]),e("p",[t._v("Now we can partition the disk and format the partition:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Partitioning the external drive '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DEVICE_NAME")]),t._v('..."')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("### DANGER ZONE ###")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" o "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Create a new empty DOS partition table")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Add a new partition")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" p "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Primary partition")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Partition number")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# First sector (Accept default: 1)")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Last sector (Accept default: varies)")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" w "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Write changes")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("fdisk")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${DEVICE_NAME}")]),t._v("\npartprobe "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${DEVICE_NAME}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" lsblk "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$PARTITION_NAME")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&>")]),t._v(" /dev/null"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("do")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sleep")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("done")]),t._v("\nmkfs.ext4 "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-F")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$PARTITION_NAME")]),t._v('"')]),t._v("\n")])])]),e("p",[t._v("Then we need to mount the partition on the linux filesystem.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Mounting the partition")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("MOUNT_DIR")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/mnt/external"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mount")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" defaults,noatime "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$PARTITION_NAME")]),t._v('"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v('"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Make sure the partition exists at the next reboot, we use UUID in case")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# the partition name is different in the next reboot")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-qF")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v('"')]),t._v(" /etc/fstab"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("UUID")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" blkid "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" UUID "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" value $PARTITION_NAME"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v('"')]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UUID='),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$UUID")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v(' ext4 defaults,noatime,nofail 0 2"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" /etc/fstab\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])])]),e("p",[t._v("Then, we need to make sure that docker not start before the mount.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("MOUNT_UNIT")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("systemd-escape "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--path")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v('"')]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v('.mount"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("docker_service")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/lib/systemd/system/docker.service"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-qF")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"After='),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_UNIT")]),t._v('"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$docker_service")]),t._v('"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sed")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"s/After=/After='),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_UNIT")]),t._v(' /g"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$docker_service")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])])]),e("p",[t._v("Now, imagine you want to put all the docker volume data on the previous partition")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("DOCKER_VOLUMES")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/var/lib/docker/volumes"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Copy all the data from our volume to the mount directory (this can take a while)")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-r")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DOCKER_VOLUMES")]),t._v('/."')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Make the folder a mountpoint")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-rf")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DOCKER_VOLUMES")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DOCKER_VOLUMES")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mount")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bind")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v('"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DOCKER_VOLUMES")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Make sure the mountpoint is mounted after reboot")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-qF")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DOCKER_VOLUMES")]),t._v('"')]),t._v(" /etc/fstab"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DOCKER_VOLUMES")]),t._v(' none bind,nobootwait 0 2"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" /etc/fstab\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])])]),e("p",[t._v("Now restart docker and btcpayserver")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("systemctl start "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v("\nbtcpay-up.sh\n")])])]),e("p",[t._v("Note: We use mount bind instead of symbolic link because docker would complain when running "),e("code",[t._v("docker volume rm")]),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"i-get-503-service-temporarily-unavailable-nginx"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#i-get-503-service-temporarily-unavailable-nginx"}},[t._v("#")]),t._v(" I get 503 Service Temporarily Unavailable nginx")]),t._v(" "),e("h4",{attrs:{id:"cause-1-trying-to-access-my-btcpay-by-ip-address"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cause-1-trying-to-access-my-btcpay-by-ip-address"}},[t._v("#")]),t._v(" Cause 1: Trying to access my BTCPay by IP address")]),t._v(" "),e("p",[t._v("When nginx receives a HTTP request, it needs to decide which service is the real destination. If you set "),e("code",[t._v("BTCPAY_HOST")]),t._v(" to "),e("code",[t._v("http://raspberrypi.local/")]),t._v(", then you can only access BTCPay Server via this URL. Trying to access BTCPay with another domain name or with the IP address (for example "),e("code",[t._v("http://192.168.0.2")]),t._v(") will result in an HTTP 503 error.")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("503 Service Temporarily Unavailable\n-----------------------------------\nnginx\n")])])]),e("p",[t._v("You can fix this by asking nginx to route such HTTP request to BTCPay Server instead.\nSimply, re-run the setup script like this:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("REVERSEPROXY_DEFAULT_HOST")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAY_HOST")]),t._v('"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),e("p",[t._v("Now browsing to "),e("code",[t._v("http://192.168.0.2")]),t._v(" should work properly.")]),t._v(" "),e("h4",{attrs:{id:"cause-2-btcpayserver-or-letsencrypt-nginx-proxy-is-not-running"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cause-2-btcpayserver-or-letsencrypt-nginx-proxy-is-not-running"}},[t._v("#")]),t._v(" Cause 2: btcpayserver or letsencrypt-nginx-proxy is not running")]),t._v(" "),e("p",[t._v("To check, run:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ps")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("less")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-S")]),t._v("\n")])])]),e("p",[t._v('Press "q" to quit out of less.')]),t._v(" "),e("p",[t._v("The output should contain:")]),t._v(" "),e("ul",[e("li",[t._v("btcpayserver/letsencrypt-nginx-proxy-companion")]),t._v(" "),e("li",[t._v("btcpayserver/btcpayserver")])]),t._v(" "),e("p",[t._v('And the status should be "Up"')]),t._v(" "),e("p",[t._v("If the docker container is not running, then check the reason for crash like this:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" logs 6a6b9fd75692 "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--tail")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\n")])])]),e("p",[t._v("Where 6a6b9fd75692 is the container ID that is having issues.")]),t._v(" "),e("h4",{attrs:{id:"cause-3-btcpay-is-expecting-you-to-access-this-website-from"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cause-3-btcpay-is-expecting-you-to-access-this-website-from"}},[t._v("#")]),t._v(" Cause 3: BTCPay is expecting you to access this website from")]),t._v(" "),e("p",[t._v("You might also see the following error: "),e("code",[t._v("You access BTCPay Server over an unsecured network")]),t._v(".")]),t._v(" "),e("p",[t._v("You might see this error on the front page of your BTCPay Server since version "),e("code",[t._v("1.0.3.73")]),t._v(".")]),t._v(" "),e("p",[t._v("This is caused by a breaking change made in BTCPay to be able to handle different domain on the same server.")]),t._v(" "),e("p",[t._v("It happens because your BTCPay Server is not exposed directly on internet, instead a reverse proxy (like nginx or IIS) receive the request and forward it to BTCPay Server.")]),t._v(" "),e("p",[t._v("Sadly, depending on the configuration of your reverse proxy, either the HTTP HOST header has been replaced, or the reverse proxy did not forwarded the protocol at the front with the http header "),e("code",[t._v("X-Forwarded-Proto")]),t._v(".")]),t._v(" "),e("p",[t._v("If you use NGinx, here is what you need to have at the top level in "),e("code",[t._v("/etc/nginx/conf.d/default.conf")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-nginx extra-class"},[e("pre",{pre:!0,attrs:{class:"language-nginx"}},[e("code",[e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_x_forwarded_proto")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$proxy_x_forwarded_proto")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_x_forwarded_proto")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n '' $scheme"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" Host "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_host")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Forwarded-Proto "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$proxy_x_forwarded_proto")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server_names_hash_bucket_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("128")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_buffer_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("128k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_buffers")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("256k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_busy_buffers_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("256k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("client_header_buffer_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("500k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("large_client_header_buffers")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("500k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("If your reverse proxy is Apache 2, you need to set those two settings")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('\n RequestHeader set X-Forwarded-Proto "https"\n ProxyPreserveHost on\n...\n\n')])])]),e("p",[t._v("You will also need those settings in the "),e("code",[t._v("apache2.conf")]),t._v(" to prevent issues while signing PSBTs.")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("LimitRequestLine 500000\nLimitRequestFieldSize 500000\n")])])]),e("h4",{attrs:{id:"cause-4-getting-500-nginx-error-on-a-local-server-https-and-for-http-btcpay-is-expecting-you-to-access-this-website-from"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cause-4-getting-500-nginx-error-on-a-local-server-https-and-for-http-btcpay-is-expecting-you-to-access-this-website-from"}},[t._v("#")]),t._v(" Cause 4: Getting 500 nginx error on a local server https and for http BTCPay is expecting you to access this website from")]),t._v(" "),e("p",[t._v("You need to open port 80 and 443. Once you did that, restart docker "),e("code",[t._v("btcpay-restart.sh")])]),t._v(" "),e("h4",{attrs:{id:"cause-5-other"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cause-5-other"}},[t._v("#")]),t._v(" Cause 5: Other")]),t._v(" "),e("p",[t._v("There could be many causes for 5XX HTTP errors. Please create an "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("Issue"),e("OutboundLink")],1),t._v(" and when cause becomes known add it here in the "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/"}},[t._v("Deployment FAQ")]),t._v(" doc.")],1)])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[61],{470:function(t,e,a){t.exports=a.p+"assets/img/Gandi3.3773602e.png"},471:function(t,e,a){t.exports=a.p+"assets/img/changedomain.854d7214.png"},472:function(t,e,a){t.exports=a.p+"assets/img/Maintenance2.65b06a5b.png"},841:function(t,e,a){"use strict";a.r(e);var s=a(17),n=Object(s.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"deployment-faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#deployment-faq"}},[t._v("#")]),t._v(" Deployment FAQ")]),t._v(" "),e("p",[t._v("This document covers the most common questions, errors, and issues you may encounter prior and during the installation of the software. For a detailed list of deployment methods and instructions for each, please see "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("Deployment page")]),t._v(".")],1),t._v(" "),e("p"),e("div",{staticClass:"table-of-contents"},[e("ul",[e("li",[e("a",{attrs:{href:"#general-deployment"}},[t._v("General Deployment")]),e("ul",[e("li",[e("a",{attrs:{href:"#how-much-does-it-cost-to-run-btcpay-server"}},[t._v("How much does it cost to run BTCPay Server?")])]),e("li",[e("a",{attrs:{href:"#what-are-the-minimal-requirements-for-btcpay"}},[t._v("What are the minimal requirements for BTCPay?")])]),e("li",[e("a",{attrs:{href:"#what-is-the-easiest-method-to-deploy-a-self-hosted-btcpay-server"}},[t._v("What is the easiest method to deploy a self-hosted BTCPay Server?")])]),e("li",[e("a",{attrs:{href:"#how-to-choose-a-proper-deployment-method"}},[t._v("How to choose a proper deployment method?")])]),e("li",[e("a",{attrs:{href:"#can-i-run-btcpay-on-my-own-hardware"}},[t._v("Can I run BTCPay on my own hardware?")])]),e("li",[e("a",{attrs:{href:"#can-i-deploy-btcpay-on-my-existing-vps"}},[t._v("Can I deploy BTCPay on my existing VPS?")])]),e("li",[e("a",{attrs:{href:"#are-there-free-hosts-where-i-can-test"}},[t._v("Are there free hosts where I can test?")])]),e("li",[e("a",{attrs:{href:"#after-initial-deployment-i-cant-register-and-i-dont-have-a-login-yet"}},[t._v("After initial deployment, I can't register and I don't have a login yet?")])]),e("li",[e("a",{attrs:{href:"#how-do-i-activate-tor-on-my-btcpay-server"}},[t._v("How do I activate Tor on my BTCPay Server?")])]),e("li",[e("a",{attrs:{href:"#how-do-i-disable-tor-on-my-btcpay-server"}},[t._v("How do I disable Tor on my BTCPay Server?")])]),e("li",[e("a",{attrs:{href:"#why-activate-tor-does-it-mean-that-nobody-knows-who-i-am"}},[t._v("Why activate Tor? Does it mean that nobody knows who I am?")])]),e("li",[e("a",{attrs:{href:"#how-to-access-the-onion-address-without-clearnet"}},[t._v("How to access the .onion address without clearnet?")])]),e("li",[e("a",{attrs:{href:"#how-can-i-modify-or-deactivate-environment-variables"}},[t._v("How can I modify or deactivate environment variables?")])]),e("li",[e("a",{attrs:{href:"#how-can-i-run-btcpay-on-testnet"}},[t._v("How can I run BTCPay on testnet?")])]),e("li",[e("a",{attrs:{href:"#can-i-start-btcpay-only-when-im-expecting-a-payment"}},[t._v("Can I start BTCPay only when I'm expecting a payment?")])]),e("li",[e("a",{attrs:{href:"#can-i-connect-to-my-btcpay-bitcoin-p2p-on-port-8333"}},[t._v("Can I connect to my BTCPay Bitcoin P2P on port 8333?")])]),e("li",[e("a",{attrs:{href:"#how-can-i-renew-my-ssl-certificate"}},[t._v("How can I renew my SSL certificate?")])]),e("li",[e("a",{attrs:{href:"#can-i-use-an-existing-nginx-server-as-a-reverse-proxy-with-ssl-termination"}},[t._v("Can I use an existing Nginx server as a reverse proxy with SSL termination?")])])])]),e("li",[e("a",{attrs:{href:"#how-to-change-your-btcpay-server-domain-name"}},[t._v("How to change your BTCPay Server domain name?")]),e("ul",[e("li",[e("a",{attrs:{href:"#setting-up-dns-records"}},[t._v("Setting up DNS Records")])]),e("li",[e("a",{attrs:{href:"#change-domain-name-in-btcpay-server-settings"}},[t._v("Change domain name in BTCPay Server settings")])]),e("li",[e("a",{attrs:{href:"#change-domain-on-command-line"}},[t._v("Change domain on command line")])])])]),e("li",[e("a",{attrs:{href:"#web-deployment"}},[t._v("Web-deployment")]),e("ul",[e("li",[e("a",{attrs:{href:"#can-i-run-btcpay-on-my-home-computer"}},[t._v("Can I run BTCPay on my home computer?")])]),e("li",[e("a",{attrs:{href:"#lunanode-web-deployment"}},[t._v("LunaNode web-deployment")])])])]),e("li",[e("a",{attrs:{href:"#manual-deployment"}},[t._v("Manual Deployment")]),e("ul",[e("li",[e("a",{attrs:{href:"#how-do-i-completely-uninstall-btcpay-from-a-linux-environment-docker-version"}},[t._v("How do I completely uninstall BTCPay from a Linux environment (Docker version)")])]),e("li",[e("a",{attrs:{href:"#how-to-deploy-btcpay-server-alongside-existing-bitcoin-node"}},[t._v("How to deploy BTCPay Server alongside existing Bitcoin node?")])]),e("li",[e("a",{attrs:{href:"#with-the-docker-deployment-how-to-use-a-different-volume-for-the-data"}},[t._v("With the docker deployment, how to use a different volume for the data?")])]),e("li",[e("a",{attrs:{href:"#i-get-503-service-temporarily-unavailable-nginx"}},[t._v("I get 503 Service Temporarily Unavailable nginx")])])])])])]),e("p"),t._v(" "),e("h2",{attrs:{id:"general-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#general-deployment"}},[t._v("#")]),t._v(" General Deployment")]),t._v(" "),e("h3",{attrs:{id:"how-much-does-it-cost-to-run-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-much-does-it-cost-to-run-btcpay-server"}},[t._v("#")]),t._v(" How much does it cost to run BTCPay Server?")]),t._v(" "),e("p",[t._v("BTCPay is a 100% free and open-source software. We do not charge you anything.\nHowever, to run it, you should host it. You can run it as a self-hosted solution on your own local server, or use a cloud hosting provider, which is what a majority of users do. Advanced users can run BTCPay on "),e("RouterLink",{attrs:{to:"/Deployment/Hardware/"}},[t._v("their own hardware")]),t._v(". Less technical users can use "),e("RouterLink",{attrs:{to:"/Deployment/HardwareAsAService/"}},[t._v("Hardware As A Service options")]),t._v(". If you do not wish to host your own server, you can use a free "),e("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[t._v("Third-Party Host")]),t._v(". Visit our "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("Deployment Page")]),t._v(" for more information on the various ways in which you can run BTCPay.")],1),t._v(" "),e("h3",{attrs:{id:"what-are-the-minimal-requirements-for-btcpay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#what-are-the-minimal-requirements-for-btcpay"}},[t._v("#")]),t._v(" What are the minimal requirements for BTCPay?")]),t._v(" "),e("p",[t._v("If you would like to run Bitcoin and Lightning Network nodes, the minimal requirements are :")]),t._v(" "),e("ul",[e("li",[t._v("2GB Ram")]),t._v(" "),e("li",[t._v("80 GB of storage "),e("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[t._v("with enabled pruning")])],1),t._v(" "),e("li",[t._v("Docker")])]),t._v(" "),e("h3",{attrs:{id:"what-is-the-easiest-method-to-deploy-a-self-hosted-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#what-is-the-easiest-method-to-deploy-a-self-hosted-btcpay-server"}},[t._v("#")]),t._v(" What is the easiest method to deploy a self-hosted BTCPay Server?")]),t._v(" "),e("p",[t._v("For beginners, we strongly recommend the "),e("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[t._v("web-deployment")]),t._v(" if you want a self-hosted solution or a "),e("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[t._v("third-party host")]),t._v(".")],1),t._v(" "),e("p",[t._v("If you're going to add more than one crypto coin, you need to expand the storage according to that coin(s) blockchain size.")]),t._v(" "),e("h3",{attrs:{id:"how-to-choose-a-proper-deployment-method"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-choose-a-proper-deployment-method"}},[t._v("#")]),t._v(" How to choose a proper deployment method?")]),t._v(" "),e("p",[t._v("Please see the "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("Deployment page")]),t._v(" for comparison of different installation methods and choose the one that suits your needs and skill level the most.")],1),t._v(" "),e("h3",{attrs:{id:"can-i-run-btcpay-on-my-own-hardware"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-i-run-btcpay-on-my-own-hardware"}},[t._v("#")]),t._v(" Can I run BTCPay on my own hardware?")]),t._v(" "),e("p",[t._v("Yes, you can. Check our the "),e("RouterLink",{attrs:{to:"/Deployment/Hardware/"}},[t._v("Hardware Deployment page")]),t._v(" for detailed instructions.")],1),t._v(" "),e("h3",{attrs:{id:"can-i-deploy-btcpay-on-my-existing-vps"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-i-deploy-btcpay-on-my-existing-vps"}},[t._v("#")]),t._v(" Can I deploy BTCPay on my existing VPS?")]),t._v(" "),e("p",[t._v("Yes. BTCPay is not limited to the documented deployment methods. You can use whichever hosting solution you prefer, that fits the minimal requirements.")]),t._v(" "),e("h3",{attrs:{id:"are-there-free-hosts-where-i-can-test"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#are-there-free-hosts-where-i-can-test"}},[t._v("#")]),t._v(" Are there free hosts where I can test?")]),t._v(" "),e("p",[t._v("On a self-hosted BTCPay, an unlimited amount of users and stores can be attached. Some community users have open registration on their servers for others to use their BTCPay Server mainly for testing and learning. Most of them are community-driven and free. See the "),e("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[t._v("third-party hosts documentation")]),t._v(" for more information.")],1),t._v(" "),e("h3",{attrs:{id:"after-initial-deployment-i-cant-register-and-i-dont-have-a-login-yet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#after-initial-deployment-i-cant-register-and-i-dont-have-a-login-yet"}},[t._v("#")]),t._v(" After initial deployment, I can't register and I don't have a login yet?")]),t._v(" "),e("p",[t._v("When you deploy your BTCPay Server, you should first register a user (during server synchronization). This user is automatically the server admin. If your BTCPay only shows Login in the header menu, and you are unable to register the first user after initial deployment, someone else has registered on your server as the admin. Although this is unlikely to occur (the user would need to know and watch your BTCPay domain name), they had access to your ssh private keys, thus you should redeploy a new server for security reasons.")]),t._v(" "),e("h3",{attrs:{id:"how-do-i-activate-tor-on-my-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-activate-tor-on-my-btcpay-server"}},[t._v("#")]),t._v(" How do I activate Tor on my BTCPay Server?")]),t._v(" "),e("p",[t._v("Tor is activated by default on the docker deployment.")]),t._v(" "),e("h3",{attrs:{id:"how-do-i-disable-tor-on-my-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-disable-tor-on-my-btcpay-server"}},[t._v("#")]),t._v(" How do I disable Tor on my BTCPay Server?")]),t._v(" "),e("p",[t._v("That's really easy: just log in your instance with SSH, and enter as root the enter following commands:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_EXCLUDE_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_EXCLUDE_FRAGMENTS")]),t._v(';opt-add-tor"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),e("p",[t._v("Then wait a few minutes for the server to restart, and you're done!")]),t._v(" "),e("h3",{attrs:{id:"why-activate-tor-does-it-mean-that-nobody-knows-who-i-am"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#why-activate-tor-does-it-mean-that-nobody-knows-who-i-am"}},[t._v("#")]),t._v(" Why activate Tor? Does it mean that nobody knows who I am?")]),t._v(" "),e("p",[t._v("Tor for BTCPay server is intended more as an improvement of the setup process, and allows for more flexibility for hosting on one's own device at home or in an office.")]),t._v(" "),e("p",[t._v("Having Tor activated would allow for simpler, plug-and-play usage of BTCPay, as it suppress the need for the following configuration steps:")]),t._v(" "),e("ul",[e("li",[t._v("Opening multiple ports on the firewall")]),t._v(" "),e("li",[t._v("Configuring the NAT for port redirection to your device on your local network")]),t._v(" "),e("li",[t._v("Setting up a DNS entry to get a HTTPS certificate")]),t._v(" "),e("li",[t._v("Having a fixed IP for Lightning")])]),t._v(" "),e("p",[t._v("While these steps are usually not a problem when BTCPay is hosted on a VPS, it can be difficult to solve for non-technical users on home or office networks.")]),t._v(" "),e("p",[t._v("Tor just solves all these issues in one shot, all you have to do is plug your device on the local network. It is especially useful for POS application.")]),t._v(" "),e("p",[t._v("But if you're looking for perfect privacy and security, "),e("strong",[t._v("activating Tor with your BTCPay just won't do it.")])]),t._v(" "),e("p",[t._v("Tor is a really tricky software to use for developers, as the slightest mistake can tear down the anonymity it provides. As BTCPay is evolving into a rather complex service and adding more and more plugins, even if we tried to route all this traffic through Tor, we couldn't guarantee that there would never be leaks of data in clear.")]),t._v(" "),e("p",[t._v("We think that the illusion of security is more dangerous that no security, or at least security we know is imperfect. So be aware that activating Tor doesn't prevent others to connect to your instance website, your bitcoin or lightning node in clear, "),e("strong",[t._v("it doesn't make you anonymous at all.")])]),t._v(" "),e("p",[t._v("If you want to know more about the philosophy behind all this, you can read our "),e("a",{attrs:{href:"https://medium.com/@BtcpayServer/about-tor-and-btcpay-server-2ec1e4bd5e51",target:"_blank",rel:"noopener noreferrer"}},[t._v("article on Medium"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"how-to-access-the-onion-address-without-clearnet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-access-the-onion-address-without-clearnet"}},[t._v("#")]),t._v(" How to access the .onion address without clearnet?")]),t._v(" "),e("p",[t._v("To see the .onion address of your BTCPay instance without accessing it through the clearnet and clicking the Tor logo in top left corner, apply the following command:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /var/lib/docker/volumes/generated_tor_servicesdir/_data/BTCPayServer/hostname\n")])])]),e("h3",{attrs:{id:"how-can-i-modify-or-deactivate-environment-variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-modify-or-deactivate-environment-variables"}},[t._v("#")]),t._v(" How can I modify or deactivate environment variables?")]),t._v(" "),e("p",[t._v("In BTCPay, various options are activated through environment variables. You can modify or delete any of these options using command lines by exporting the new value with "),e("code",[t._v('export {environment variable}="{value}"')]),t._v(" and then running "),e("code",[t._v(". ./btcpay-setup.sh -i")]),t._v(" again.")]),t._v(" "),e("p",[t._v("For example, let's say I want to deactivate Tor for my BTCPay server:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Login as root")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Go to the root/btcpayserver-docker directory")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" /root/btcpayserver-docker\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Print the complete list of options that you are running (for the sake of the demonstration, let's say that besides Tor you have pruning mode activated too)")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t._v("\nopt-save-storage-s"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("opt-add-tor\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Export the BTCPAYGEN_ADDITIONAL_FRAGMENTS variable without opt-add-tor")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"opt-save-storage-s"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Run btcpay-setup.sh")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exit")]),t._v("\n")])])]),e("p",[t._v("Similarly if you are adding an environment variable, the export command would instead look like this:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Enable Tor in addition to your existing environment variables (such as pruning)")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),t._v(';opt-add-tor"')]),t._v("\n")])])]),e("p",[t._v("If you need to figure out which environment variable you need to modify, have a look at "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker#environment-variables",target:"_blank",rel:"noopener noreferrer"}},[t._v("this list"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"how-can-i-run-btcpay-on-testnet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-run-btcpay-on-testnet"}},[t._v("#")]),t._v(" How can I run BTCPay on testnet?")]),t._v(" "),e("p",[t._v("Building on the section above, this is how you configure BTCPay to use "),e("code",[t._v("testnet")]),t._v(" instead of the default "),e("code",[t._v("mainnet")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Export the NBITCOIN_NETWORK variable switching to testnet")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("NBITCOIN_NETWORK")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"testnet"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Run btcpay-setup.sh for the change to take effect")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),e("p",[t._v("If you just want to test things quickly without deploying everything yourself, have a look at the "),e("RouterLink",{attrs:{to:"/TryItOut/"}},[t._v("Try It Out")]),t._v(" section.\nIt provides links and explanations for a BTCPay testnet instance hosted by us.")],1),t._v(" "),e("h3",{attrs:{id:"can-i-start-btcpay-only-when-im-expecting-a-payment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-i-start-btcpay-only-when-im-expecting-a-payment"}},[t._v("#")]),t._v(" Can I start BTCPay only when I'm expecting a payment?")]),t._v(" "),e("p",[t._v("No, you need to keep your BTCPay running at all times so that your Bitcoin node stays in sync with the blockchain to verify transactions. If you only start it up every now and then, it would take a long time to catch up on verifying recent blocks, and your payments would not show up until much later.")]),t._v(" "),e("h3",{attrs:{id:"can-i-connect-to-my-btcpay-bitcoin-p2p-on-port-8333"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-i-connect-to-my-btcpay-bitcoin-p2p-on-port-8333"}},[t._v("#")]),t._v(" Can I connect to my BTCPay Bitcoin P2P on port 8333?")]),t._v(" "),e("p",[t._v("BTCPay's Bitcoin core node is not exposed externally by default. For BTCPay purposes, it is typically not in the interest of the user, as it increases the bandwidth requirement. BTCPay is also whitebinding connections to this port, so opening it would expose the node to potential DDoS.")]),t._v(" "),e("p",[t._v("However, we expose a P2P connection to your full node on Tor. You can get the Tor address by running:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /var/lib/docker/volumes/generated_tor_servicesdir/_data/BTC-P2P/hostname\n")])])]),e("p",[t._v("Or via the "),e("code",[t._v("Server Settings")]),t._v(" of your BTCPay Server instance, logged as an administrator.")]),t._v(" "),e("p",[t._v("Please do not share this tor hidden service with untrusted parties. Connections to this hidden service are whitelisted by the bitcoin node, malicious peer would be able to DDoS your node.")]),t._v(" "),e("p",[t._v("If you need to unsafely expose bitcoind P2P port 8333 (for example if you require P2P for Bisq, DOJO, Esplora, etc.) and you are using a docker deployment, you can use the "),e("RouterLink",{attrs:{to:"/Docker/#generated-docker-compose"}},[t._v("opt-unsafe-expose")]),t._v(" additional fragment.")],1),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("ONLY USE ON TRUSTED LAN OR WITH FIREWALL RULES WHITELISTING SPECIFIC HOSTS")])]),t._v(" "),e("h3",{attrs:{id:"how-can-i-renew-my-ssl-certificate"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-renew-my-ssl-certificate"}},[t._v("#")]),t._v(" How can I renew my SSL certificate?")]),t._v(" "),e("p",[t._v("If your SSL certificate has expired for your BTCPay Server, you can manually renew it. For Docker deployments the easiest way to do this is to "),e("RouterLink",{attrs:{to:"/Troubleshooting/#13-restarting-a-service"}},[t._v("restart the container")]),t._v(" named "),e("code",[t._v("letsencrypt-nginx-proxy-companion")]),t._v(" on your server.")],1),t._v(" "),e("h3",{attrs:{id:"can-i-use-an-existing-nginx-server-as-a-reverse-proxy-with-ssl-termination"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-i-use-an-existing-nginx-server-as-a-reverse-proxy-with-ssl-termination"}},[t._v("#")]),t._v(" Can I use an existing Nginx server as a reverse proxy with SSL termination?")]),t._v(" "),e("p",[t._v("Yes you can! Just make sure to use the proper configuration.")]),t._v(" "),e("p",[t._v("Create an extra config file for your vhost in "),e("code",[t._v("/etc/nginx/sites-available/btcpayserver")]),t._v(" and create a symlink for this file at "),e("code",[t._v("/etc/nginx/sites-enabled/btcpayserver")])]),t._v(" "),e("p",[t._v("The contents of this vhost file should look like this:")]),t._v(" "),e("div",{staticClass:"language-nginx extra-class"},[e("pre",{pre:!0,attrs:{class:"language-nginx"}},[e("code",[e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("listen")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("80")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("root")]),t._v(" /var/www/html")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("index")]),t._v(" index.html index.htm index.nginx-debian.html")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Put your domain name here")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server_name")]),t._v(" btcpay.domain.com")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Needed for Let's Encrypt verification")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" ~ /.well-known/acme-challenge")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("allow")]),t._v(" all")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Force HTTP to HTTPS")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" /")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("301")]),t._v(" https://"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_host")]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$request_uri")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("listen")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("443")]),t._v(" ssl http2")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("on")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# SSL certificate by Let's Encrypt in this Nginx (not using Let's Encyrpt that came with BTCPay Server Docker)")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_certificate")]),t._v(" /etc/letsencrypt/live/btcpay.domain.com/fullchain.pem")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ssl_certificate_key")]),t._v(" /etc/letsencrypt/live/btcpay.domain.com/privkey.pem")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("root")]),t._v(" /var/www/html")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("index")]),t._v(" index.html index.htm index.nginx-debian.html")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Put your domain name here")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server_name")]),t._v(" btcpay.domain.com")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Route everything to the real BTCPay server")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" /")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# URL of BTCPay Server (i.e. a Docker installation with REVERSEPROXY_HTTP_PORT set to 10080)")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_pass")]),t._v(" http://127.0.0.1:10080")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" Host "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_host")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Forwarded-Proto "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$scheme")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Real-IP "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$remote_addr")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Forwarded-For "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$proxy_add_x_forwarded_for")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# For websockets (used by Ledger hardware wallets)")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" Upgrade "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_upgrade")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Needed for Let's Encrypt verification")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("location")]),t._v(" ~ /.well-known/acme-challenge")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\t\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("allow")]),t._v(" all")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n")])])]),e("p",[t._v("Also, put the following in your main Nginx config file at "),e("code",[t._v("/etc/nginx/nginx.conf")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-nginx extra-class"},[e("pre",{pre:!0,attrs:{class:"language-nginx"}},[e("code",[e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("http")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ... # Existing stuff")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Needed to allow very long URLs to prevent issues while signing PSBTs")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server_names_hash_bucket_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("128")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_buffer_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("128k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_buffers")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("256k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_busy_buffers_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("256k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("client_header_buffer_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("500k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("large_client_header_buffers")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("500k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n\t"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Needed websocket support (used by Ledger hardware wallets)")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_upgrade")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$connection_upgrade")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n \t"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" upgrade")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n \t'' "),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("close")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("Now test your Nginx config with "),e("code",[t._v("service nginx configtest")]),t._v(" and reload the config with "),e("code",[t._v("service nginx reload")]),t._v(".")]),t._v(" "),e("p",[t._v("Then, you need to make sure that BTCPayServer does not try to handle HTTPS on its side, you can do this by disabling it on your BTCPayServer instance.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_EXCLUDE_FRAGMENTS")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAYGEN_EXCLUDE_FRAGMENTS")]),t._v(';nginx-https"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),e("p",[t._v("Notice: If your BTCPay Server install has more than one domain (for example "),e("code",[t._v("WOOCOMMERCE_HOST")]),t._v(" or "),e("code",[t._v("BTCPAY_ADDITIONAL_HOSTS")]),t._v(") you will need to modify your config for each domain name. The example above only covers 1 domain name called "),e("code",[t._v("btcpay.domain.com")]),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"how-to-change-your-btcpay-server-domain-name"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-change-your-btcpay-server-domain-name"}},[t._v("#")]),t._v(" How to change your BTCPay Server domain name?")]),t._v(" "),e("h3",{attrs:{id:"setting-up-dns-records"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-dns-records"}},[t._v("#")]),t._v(" Setting up DNS Records")]),t._v(" "),e("p",[t._v("You bought a domain and now want to connect that to your BTCPay Server.\nThe hosting party usually has a page to manage your domain.\nHere you will find the "),e("code",[t._v("DNS records")]),t._v(" page and add a "),e("code",[t._v("CNAME")]),t._v(" record.")]),t._v(" "),e("p",[t._v("In this record you will make sure, it points to the provided domain by your VPS hoster.\nYou could also do this by IP address, but then instead of a "),e("code",[t._v("CNAME record")]),t._v(" it would be an "),e("code",[t._v("A Record")]),t._v(".")]),t._v(" "),e("p",[t._v("This is an example of how this would look at "),e("a",{attrs:{href:"https://gandi.net/",target:"_blank",rel:"noopener noreferrer"}},[t._v("gandi.net"),e("OutboundLink")],1)]),t._v(" "),e("figure",[e("img",{attrs:{src:a(470),alt:"Gandi3",title:"Gandi3"}})]),t._v(" "),e("h3",{attrs:{id:"change-domain-name-in-btcpay-server-settings"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#change-domain-name-in-btcpay-server-settings"}},[t._v("#")]),t._v(" Change domain name in BTCPay Server settings")]),t._v(" "),e("p",[t._v("In BTCPay Server you go to the "),e("code",[t._v("Server Settings")]),t._v(" menu, and then into the tab "),e("code",[t._v("Maintenance")]),t._v(".\nHere you will find a field to replace your old by the new set domain, it might take a few seconds to update.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(471),alt:"Maintenance domain name",title:"Maintenance domain name"}})]),t._v(" "),e("p",[t._v("Now enter the new set domain in the address bar and see if it works!")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(472),alt:"Maintenance2",title:"Maintenance2"}})]),t._v(" "),e("h3",{attrs:{id:"change-domain-on-command-line"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#change-domain-on-command-line"}},[t._v("#")]),t._v(" Change domain on command line")]),t._v(" "),e("p",[t._v("Connect to your server through SSH.")]),t._v(" "),e("p",[t._v("Example :")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ssh")]),t._v(" btcpayserver@myawesomedemobtcpay.westeurope.cloudapp.azure.com\n")])])]),e("p",[t._v("Enter your password and change the domain name.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\nchangedomain.sh tothemoon.btcpayserver.com\n")])])]),e("p",[t._v("Success!")]),t._v(" "),e("h2",{attrs:{id:"web-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#web-deployment"}},[t._v("#")]),t._v(" Web-deployment")]),t._v(" "),e("p",[t._v("Here you can find common questions and solutions to BTCPay web-deployments.")]),t._v(" "),e("h3",{attrs:{id:"can-i-run-btcpay-on-my-home-computer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#can-i-run-btcpay-on-my-home-computer"}},[t._v("#")]),t._v(" Can I run BTCPay on my home computer?")]),t._v(" "),e("p",[t._v("Similar to the requirements for hosting a website, a web server is required for a BTCPay Server instance. While it is possible to run BTCPay Server locally on your PC, it would have to meet the minimal requirements and also run 24/7 if you don't want interruptions of service. You might also not want to expose your home IP address for the activity related to BTCPay Server payments. For all these reasons, while local hosting is suitable for testing, it's not a viable solution for production. A Virtual Private Server (VPS) is commonly used to address these problems.")]),t._v(" "),e("h3",{attrs:{id:"lunanode-web-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lunanode-web-deployment"}},[t._v("#")]),t._v(" LunaNode web-deployment")]),t._v(" "),e("h4",{attrs:{id:"how-to-change-domain-name-on-my-lunanode-btcpay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-change-domain-name-on-my-lunanode-btcpay"}},[t._v("#")]),t._v(" How to change domain name on my LunaNode BTCPay?")]),t._v(" "),e("ol",[e("li",[t._v("In your LunaNode dashboard, click on Virtual Machines > Your Virtual Machine > General Tab > External IP. Copy the external IP.")]),t._v(" "),e("li",[t._v("Go to your DNS provider and create an A record. Paste the external IP.")]),t._v(" "),e("li",[t._v("Go to Server Settings > Maintenance > Change Domain. Paste yourdomain.com without http or https prefix.")])]),t._v(" "),e("p",[t._v("Additional documentation can be found here: "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#how-to-change-your-btcpay-server-domain-name"}},[t._v("How to change your BTCPay Server domain name")]),t._v(").")],1),t._v(" "),e("h2",{attrs:{id:"manual-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#manual-deployment"}},[t._v("#")]),t._v(" Manual Deployment")]),t._v(" "),e("h4",{attrs:{id:"how-to-manually-install-btcpay-on-ubuntu-1804"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-manually-install-btcpay-on-ubuntu-1804"}},[t._v("#")]),t._v(" How to manually install BTCPay on Ubuntu 18.04?")]),t._v(" "),e("p",[t._v("Check this "),e("a",{attrs:{href:"https://freedomnode.com/blog/114/how-to-setup-btc-and-lightning-payment-gateway-with-btcpayserver-on-linux-manual-install",target:"_blank",rel:"noopener noreferrer"}},[t._v("community guide"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"how-do-i-completely-uninstall-btcpay-from-a-linux-environment-docker-version"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-do-i-completely-uninstall-btcpay-from-a-linux-environment-docker-version"}},[t._v("#")]),t._v(" How do I completely uninstall BTCPay from a Linux environment (Docker version)")]),t._v(" "),e("p",[t._v("Use the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/btcpay-teardown.sh",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("btcpay-teardown.sh")]),e("OutboundLink")],1),t._v(" script like this:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-teardown.sh\n")])])]),e("p",[t._v("This will completely erase BTCPay Server from your instance and remove the associated Docker containers and volumes.")]),t._v(" "),e("h3",{attrs:{id:"how-to-deploy-btcpay-server-alongside-existing-bitcoin-node"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-deploy-btcpay-server-alongside-existing-bitcoin-node"}},[t._v("#")]),t._v(" How to deploy BTCPay Server alongside existing Bitcoin node?")]),t._v(" "),e("p",[t._v("The instructions below are valid for Docker deployments:")]),t._v(" "),e("ul",[e("li",[t._v("Run setup as described in "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker#full-installation-for-technical-users",target:"_blank",rel:"noopener noreferrer"}},[t._v("btcpayserver-docker"),e("OutboundLink")],1),t._v(" up until "),e("code",[t._v(". ./btcpay-setup.sh -i")])]),t._v(" "),e("li",[t._v("Create "),e("code",[t._v("bitcoin.custom.yml")]),t._v(" in the "),e("code",[t._v("docker-compose-generator/docker-fragments/")]),t._v(" folder.")])]),t._v(" "),e("div",{staticClass:"language-yml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-yml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("version")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'3'")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("services")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("btcpayserver")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("environment")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("BTCPAY_CHAINS")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'btc'")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("BTCPAY_BTCEXPLORERURL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" http"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("//nbxplorer"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("32838/\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("nbxplorer")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("environment")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("NBXPLORER_CHAINS")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'btc'")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("NBXPLORER_BTCRPCURL")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" http"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("//host.docker.internal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("43782/\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("NBXPLORER_BTCRPCUSER")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'rpc-username'")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("NBXPLORER_BTCRPCPASSWORD")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'rpc-password'")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("NBXPLORER_BTCNODEENDPOINT")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" host.docker.internal"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("39388")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("volumes")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'localBitcoinfolder:/root/.bitcoin'")]),t._v("\n")])])]),e("ul",[e("li",[t._v("Replace: "),e("code",[t._v("43782")]),t._v(" with your bitcoin node's configured RPC port")]),t._v(" "),e("li",[t._v("Replace: "),e("code",[t._v("rpc-username")]),t._v(" with your bitcoin node's configured RPC username")]),t._v(" "),e("li",[t._v("Replace: "),e("code",[t._v("rpc-password")]),t._v(" with your bitcoin node's configured RPC password")]),t._v(" "),e("li",[t._v("Replace: "),e("code",[t._v("39388")]),t._v(" with your bitcoin node's configured p2p port")]),t._v(" "),e("li",[t._v("Replace "),e("code",[t._v("localBitcoinfolder")]),t._v(" with the path to your bitcoin data folder")])]),t._v(" "),e("p",[t._v("If you are running on linux, due to "),e("a",{attrs:{href:"https://github.com/docker/for-linux/issues/264",target:"_blank",rel:"noopener noreferrer"}},[t._v("a limitation of docker"),e("OutboundLink")],1),t._v(", you will also need to do the following:")]),t._v(" "),e("ul",[e("li",[t._v("Run "),e("code",[t._v("ip route | grep docker0 | awk '{print $9}'")]),t._v(" "),e("ul",[e("li",[t._v("Add the following at the end of the "),e("code",[t._v("bitcoin.custom.yml")]),t._v(" file, replacing "),e("code",[t._v("$DOCKER_HOST_IP")]),t._v(" with the result of the previous command.")])])])]),t._v(" "),e("div",{staticClass:"language-yml extra-class"},[e("pre",{pre:!0,attrs:{class:"language-yml"}},[e("code",[e("span",{pre:!0,attrs:{class:"token key atrule"}},[t._v("extra_hosts")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("-")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v("'host.docker.internal:$DOCKER_HOST_IP'")]),t._v("\n")])])]),e("ul",[e("li",[t._v("Run "),e("code",[t._v('export BTCPAYGEN_EXCLUDE_FRAGMENTS="bitcoin"')])]),t._v(" "),e("li",[t._v("Run "),e("code",[t._v('export BTCPAYGEN_ADDITIONAL_FRAGMENTS="$BTCPAYGEN_ADDITIONAL_FRAGMENTS;bitcoin.custom"')])]),t._v(" "),e("li",[t._v("Run "),e("code",[t._v(". ./btcpay-setup.sh -i")])])]),t._v(" "),e("p",[t._v("If you are looking for how to deploy alongside existing Lightning node "),e("RouterLink",{attrs:{to:"/FAQ/LightningNetwork/#can-i-use-my-existing-ln-node-with-btcpay"}},[t._v("see this")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"with-the-docker-deployment-how-to-use-a-different-volume-for-the-data"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#with-the-docker-deployment-how-to-use-a-different-volume-for-the-data"}},[t._v("#")]),t._v(" With the docker deployment, how to use a different volume for the data?")]),t._v(" "),e("p",[t._v("First, you need to make sure that btcpayserver and docker is not running")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\nbtcpay-down.sh\nsystemctl stop "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v("\n")])])]),e("p",[t._v("Now, you need to format your drive. If you have already done it, you can skip this step.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Step 1: Unplug the drive")]),t._v("\nlsblk\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Step 2: Plug the drive")]),t._v("\nlsblk\n")])])]),e("p",[t._v("The second "),e("code",[t._v("lsblk")]),t._v(" should show the drive you just plugged in. (of TYPE "),e("code",[t._v("disk")]),t._v(")\nMake sure you don't make a mistake as the next command will erase all data on this disk.")]),t._v(" "),e("p",[t._v("For the sake of the example, let's suppose it has the NAME "),e("code",[t._v("/dev/sdd")]),t._v(".")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Save the name in a variable")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("DEVICE_NAME")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/dev/sdd"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Set the partition name")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("PARTITION_NAME")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/dev/sdd1"')]),t._v("\n")])])]),e("p",[t._v("Now we can partition the disk and format the partition:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Partitioning the external drive '),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DEVICE_NAME")]),t._v('..."')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("### DANGER ZONE ###")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" o "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Create a new empty DOS partition table")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" n "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Add a new partition")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" p "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Primary partition")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Partition number")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# First sector (Accept default: 1)")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Last sector (Accept default: varies)")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" w "),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Write changes")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("fdisk")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${DEVICE_NAME}")]),t._v("\npartprobe "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${DEVICE_NAME}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("while")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" lsblk "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$PARTITION_NAME")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&>")]),t._v(" /dev/null"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("do")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sleep")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("done")]),t._v("\nmkfs.ext4 "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-F")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$PARTITION_NAME")]),t._v('"')]),t._v("\n")])])]),e("p",[t._v("Then we need to mount the partition on the linux filesystem.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Mounting the partition")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("MOUNT_DIR")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/mnt/external"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mount")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" defaults,noatime "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$PARTITION_NAME")]),t._v('"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v('"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Make sure the partition exists at the next reboot, we use UUID in case")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# the partition name is different in the next reboot")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-qF")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v('"')]),t._v(" /etc/fstab"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("UUID")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" blkid "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" UUID "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" value $PARTITION_NAME"),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v('"')]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UUID='),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$UUID")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v(' ext4 defaults,noatime,nofail 0 2"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" /etc/fstab\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])])]),e("p",[t._v("Then, we need to make sure that docker not start before the mount.")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("MOUNT_UNIT")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("systemd-escape "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--path")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v('"')]),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v('.mount"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("docker_service")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/lib/systemd/system/docker.service"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-qF")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"After='),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_UNIT")]),t._v('"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$docker_service")]),t._v('"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sed")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"s/After=/After='),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_UNIT")]),t._v(' /g"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$docker_service")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])])]),e("p",[t._v("Now, imagine you want to put all the docker volume data on the previous partition")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("DOCKER_VOLUMES")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/var/lib/docker/volumes"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Copy all the data from our volume to the mount directory (this can take a while)")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-r")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DOCKER_VOLUMES")]),t._v('/."')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Make the folder a mountpoint")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-rf")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DOCKER_VOLUMES")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DOCKER_VOLUMES")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("mount")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bind")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v('"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DOCKER_VOLUMES")]),t._v('"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Make sure the mountpoint is mounted after reboot")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-qF")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DOCKER_VOLUMES")]),t._v('"')]),t._v(" /etc/fstab"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("then")]),t._v("\n\t"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$MOUNT_DIR")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$DOCKER_VOLUMES")]),t._v(' none bind,nobootwait 0 2"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" /etc/fstab\n"),e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("fi")]),t._v("\n")])])]),e("p",[t._v("Now restart docker and btcpayserver")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("systemctl start "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v("\nbtcpay-up.sh\n")])])]),e("p",[t._v("Note: We use mount bind instead of symbolic link because docker would complain when running "),e("code",[t._v("docker volume rm")]),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"i-get-503-service-temporarily-unavailable-nginx"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#i-get-503-service-temporarily-unavailable-nginx"}},[t._v("#")]),t._v(" I get 503 Service Temporarily Unavailable nginx")]),t._v(" "),e("h4",{attrs:{id:"cause-1-trying-to-access-my-btcpay-by-ip-address"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cause-1-trying-to-access-my-btcpay-by-ip-address"}},[t._v("#")]),t._v(" Cause 1: Trying to access my BTCPay by IP address")]),t._v(" "),e("p",[t._v("When nginx receives a HTTP request, it needs to decide which service is the real destination. If you set "),e("code",[t._v("BTCPAY_HOST")]),t._v(" to "),e("code",[t._v("http://raspberrypi.local/")]),t._v(", then you can only access BTCPay Server via this URL. Trying to access BTCPay with another domain name or with the IP address (for example "),e("code",[t._v("http://192.168.0.2")]),t._v(") will result in an HTTP 503 error.")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("503 Service Temporarily Unavailable\n-----------------------------------\nnginx\n")])])]),e("p",[t._v("You can fix this by asking nginx to route such HTTP request to BTCPay Server instead.\nSimply, re-run the setup script like this:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("REVERSEPROXY_DEFAULT_HOST")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAY_HOST")]),t._v('"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpay-setup.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),e("p",[t._v("Now browsing to "),e("code",[t._v("http://192.168.0.2")]),t._v(" should work properly.")]),t._v(" "),e("h4",{attrs:{id:"cause-2-btcpayserver-or-letsencrypt-nginx-proxy-is-not-running"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cause-2-btcpayserver-or-letsencrypt-nginx-proxy-is-not-running"}},[t._v("#")]),t._v(" Cause 2: btcpayserver or letsencrypt-nginx-proxy is not running")]),t._v(" "),e("p",[t._v("To check, run:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("ps")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("less")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-S")]),t._v("\n")])])]),e("p",[t._v('Press "q" to quit out of less.')]),t._v(" "),e("p",[t._v("The output should contain:")]),t._v(" "),e("ul",[e("li",[t._v("btcpayserver/letsencrypt-nginx-proxy-companion")]),t._v(" "),e("li",[t._v("btcpayserver/btcpayserver")])]),t._v(" "),e("p",[t._v('And the status should be "Up"')]),t._v(" "),e("p",[t._v("If the docker container is not running, then check the reason for crash like this:")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v(" logs 6a6b9fd75692 "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--tail")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v("\n")])])]),e("p",[t._v("Where 6a6b9fd75692 is the container ID that is having issues.")]),t._v(" "),e("h4",{attrs:{id:"cause-3-btcpay-is-expecting-you-to-access-this-website-from"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cause-3-btcpay-is-expecting-you-to-access-this-website-from"}},[t._v("#")]),t._v(" Cause 3: BTCPay is expecting you to access this website from")]),t._v(" "),e("p",[t._v("You might also see the following error: "),e("code",[t._v("You access BTCPay Server over an unsecured network")]),t._v(".")]),t._v(" "),e("p",[t._v("You might see this error on the front page of your BTCPay Server since version "),e("code",[t._v("1.0.3.73")]),t._v(".")]),t._v(" "),e("p",[t._v("This is caused by a breaking change made in BTCPay to be able to handle different domain on the same server.")]),t._v(" "),e("p",[t._v("It happens because your BTCPay Server is not exposed directly on internet, instead a reverse proxy (like nginx or IIS) receive the request and forward it to BTCPay Server.")]),t._v(" "),e("p",[t._v("Sadly, depending on the configuration of your reverse proxy, either the HTTP HOST header has been replaced, or the reverse proxy did not forwarded the protocol at the front with the http header "),e("code",[t._v("X-Forwarded-Proto")]),t._v(".")]),t._v(" "),e("p",[t._v("If you use NGinx, here is what you need to have at the top level in "),e("code",[t._v("/etc/nginx/conf.d/default.conf")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-nginx extra-class"},[e("pre",{pre:!0,attrs:{class:"language-nginx"}},[e("code",[e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("map")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_x_forwarded_proto")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$proxy_x_forwarded_proto")])]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("default")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_x_forwarded_proto")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n '' $scheme"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" Host "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$http_host")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_set_header")]),t._v(" X-Forwarded-Proto "),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$proxy_x_forwarded_proto")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("server_names_hash_bucket_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("128")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_buffer_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("128k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_buffers")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("256k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("proxy_busy_buffers_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("256k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("client_header_buffer_size")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("500k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token directive"}},[e("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("large_client_header_buffers")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("500k")])]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),e("p",[t._v("If your reverse proxy is Apache 2, you need to set those two settings")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v('\n RequestHeader set X-Forwarded-Proto "https"\n ProxyPreserveHost on\n...\n\n')])])]),e("p",[t._v("You will also need those settings in the "),e("code",[t._v("apache2.conf")]),t._v(" to prevent issues while signing PSBTs.")]),t._v(" "),e("div",{staticClass:"language- extra-class"},[e("pre",{pre:!0,attrs:{class:"language-text"}},[e("code",[t._v("LimitRequestLine 500000\nLimitRequestFieldSize 500000\n")])])]),e("h4",{attrs:{id:"cause-4-getting-500-nginx-error-on-a-local-server-https-and-for-http-btcpay-is-expecting-you-to-access-this-website-from"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cause-4-getting-500-nginx-error-on-a-local-server-https-and-for-http-btcpay-is-expecting-you-to-access-this-website-from"}},[t._v("#")]),t._v(" Cause 4: Getting 500 nginx error on a local server https and for http BTCPay is expecting you to access this website from")]),t._v(" "),e("p",[t._v("You need to open port 80 and 443. Once you did that, restart docker "),e("code",[t._v("btcpay-restart.sh")])]),t._v(" "),e("h4",{attrs:{id:"cause-5-other"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#cause-5-other"}},[t._v("#")]),t._v(" Cause 5: Other")]),t._v(" "),e("p",[t._v("There could be many causes for 5XX HTTP errors. Please create an "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("Issue"),e("OutboundLink")],1),t._v(" and when cause becomes known add it here in the "),e("RouterLink",{attrs:{to:"/FAQ/Deployment/"}},[t._v("Deployment FAQ")]),t._v(" doc.")],1)])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/62.60907b1a.js b/assets/js/62.a16b9f24.js similarity index 98% rename from assets/js/62.60907b1a.js rename to assets/js/62.a16b9f24.js index 47f7d06b8d..4c1b3bba5f 100644 --- a/assets/js/62.60907b1a.js +++ b/assets/js/62.a16b9f24.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{470:function(e,t,a){e.exports=a.p+"assets/img/btcpayWebhookFAQ1.2e4720f3.jpg"},471:function(e,t,a){e.exports=a.p+"assets/img/btcpayWebhookFAQ2.3b3a0f4e.jpg"},472:function(e,t,a){e.exports=a.p+"assets/img/NBXplorer-stuck.715f322b.png"},841:function(e,t,a){"use strict";a.r(t);var r=a(17),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"general-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general-faq"}},[e._v("#")]),e._v(" General FAQ")]),e._v(" "),t("p",[e._v("This page contains general questions and answers about BTCPay Server. What it is, how it works, how to install it.")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#what-is-btcpay-server"}},[e._v("What is BTCPay Server?")])]),t("li",[t("a",{attrs:{href:"#why-should-i-choose-btcpay-over-other-processors"}},[e._v("Why should I choose BTCPay over other processors?")])]),t("li",[t("a",{attrs:{href:"#why-is-everyone-so-excited-about-btcpay"}},[e._v("Why is everyone so excited about BTCPay?")])]),t("li",[t("a",{attrs:{href:"#who-can-use-btcpay"}},[e._v("Who can use BTCPay?")])]),t("li",[t("a",{attrs:{href:"#how-to-install-btcpay-server"}},[e._v("How to install BTCPay Server?")])]),t("li",[t("a",{attrs:{href:"#where-to-find-btcpay-video-tutorials"}},[e._v("Where to find BTCPay video tutorials?")])]),t("li",[t("a",{attrs:{href:"#do-i-need-to-have-an-online-store-to-use-btcpay-server"}},[e._v("Do I need to have an online store to use BTCPay Server?")])]),t("li",[t("a",{attrs:{href:"#why-cant-i-just-give-my-bitcoin-address-to-a-buyer"}},[e._v("Why can't I just give my Bitcoin address to a buyer?")])]),t("li",[t("a",{attrs:{href:"#how-does-btcpay-create-a-new-address-for-each-invoice"}},[e._v("How does BTCPay create a new address for each invoice?")])]),t("li",[t("a",{attrs:{href:"#does-btcpay-need-my-private-key"}},[e._v("Does BTCPay need my private key?")])]),t("li",[t("a",{attrs:{href:"#does-btcpay-server-support-crypto-to-fiat-conversion"}},[e._v("Does BTCPay Server support crypto to fiat conversion?")])]),t("li",[t("a",{attrs:{href:"#what-if-i-have-a-problem-paying-an-invoice"}},[e._v("What if I have a problem paying an invoice?")])]),t("li",[t("a",{attrs:{href:"#what-if-i-have-a-problem-with-a-paid-invoice"}},[e._v("What if I have a problem with a paid invoice?")])]),t("li",[t("a",{attrs:{href:"#where-can-i-get-help-and-support"}},[e._v("Where can I get help and support?")])]),t("li",[t("a",{attrs:{href:"#how-can-i-contribute-to-btcpay"}},[e._v("How can I contribute to BTCPay?")])]),t("li",[t("a",{attrs:{href:"#how-can-i-use-the-btcpay-server-api"}},[e._v("How can I use the BTCPay Server API?")])]),t("li",[t("a",{attrs:{href:"#how-to-create-a-webhook-"}},[e._v("How to create a webhook ?")])]),t("li",[t("a",{attrs:{href:"#webhook-format-is-not-bitpay-compatible"}},[e._v("Webhook format is not bitpay compatible?")])]),t("li",[t("a",{attrs:{href:"#how-can-i-backup-my-btcpay-server"}},[e._v("How can I backup my BTCPay Server?")])]),t("li",[t("a",{attrs:{href:"#how-can-i-charge-for-using-my-btcpay-server-instance"}},[e._v("How can I charge for using my BTCPay Server instance?")])]),t("li",[t("a",{attrs:{href:"#stuck-synching-nbxplorer-is-synchronizing-"}},[e._v('Stuck synching: "NBXplorer is synchronizing"')])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"what-is-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-btcpay-server"}},[e._v("#")]),e._v(" What is BTCPay Server?")]),e._v(" "),t("p",[e._v("BTCPay Server is a free and open-source cryptocurrency payment processor which allows you to receive payments in Bitcoin (on-chain and via the Lightning Network) and altcoins directly, with no fees, transaction cost or a middleman.")]),e._v(" "),t("p",[e._v("BTCPay is a non-custodial invoicing system which eliminates the involvement of a third-party. Payments with BTCPay go directly to your wallet, which increases the privacy and security. Your private keys are never required to receive payments to your BTCPay Server. There is "),t("a",{attrs:{href:"#how-does-btcpay-create-a-new-address-for-each-invoice"}},[e._v("no address re-use")]),e._v(" since each invoice uses a new address for receiving payments to your wallet.")]),e._v(" "),t("h2",{attrs:{id:"why-should-i-choose-btcpay-over-other-processors"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-should-i-choose-btcpay-over-other-processors"}},[e._v("#")]),e._v(" Why should I choose BTCPay over other processors?")]),e._v(" "),t("p",[e._v("The most significant advantage of BTCPay over other processors is that it is entirely free and open-source, non-custodial software, created by the community. While most of the other processors hold your Bitcoins, BTCPay allows you to receive payments P2P, directly to your software or hardware wallet.")]),e._v(" "),t("p",[e._v("BTCPay is a self-hosted software. This means that you are your own payment processor. There are no subscriptions, no transaction fees. There's no third-party involvement which significantly increases the censorship-resistance, privacy, and security for you and your customers. Furthermore, BTCPay enables you to become a processor yourself, so that you can offer different packages and help spread the adoption locally or globally.")]),e._v(" "),t("p",[e._v("With BTCPay, you are your own bank.")]),e._v(" "),t("h2",{attrs:{id:"why-is-everyone-so-excited-about-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-is-everyone-so-excited-about-btcpay"}},[e._v("#")]),e._v(" Why is everyone so excited about BTCPay?")]),e._v(" "),t("p",[e._v("The community is excited about BTCPay and often recommends it to merchants or content creators because it offers a direct way for store-owners and charities to receive Bitcoin payments, which significantly improves the privacy of the customers/donors.")]),e._v(" "),t("p",[e._v("BTCPay doesn't compromise on censorship-resistance, which is one of the main features of Bitcoin. Besides that, being free and open-source it gives an excellent opportunity for developers to build things and integrations on top of BTCPay.")]),e._v(" "),t("h2",{attrs:{id:"who-can-use-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#who-can-use-btcpay"}},[e._v("#")]),e._v(" Who can use BTCPay?")]),e._v(" "),t("p",[e._v("BTCPay server is a feature-rich software with plenty of use-cases that can solve problems for different types of users. Merchants, content creators, lightning network users, exchanges, hosting providers and many others can find it useful. See the "),t("RouterLink",{attrs:{to:"/UseCase/"}},[e._v("Use Case page")]),e._v(" for detailed breakdown of BTCPay use-cases.")],1),e._v(" "),t("p",[e._v("BTCPay is licensed under the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[e._v("MIT License"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-install-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-install-btcpay-server"}},[e._v("#")]),e._v(" How to install BTCPay Server?")]),e._v(" "),t("p",[e._v("First take a look at the various deployment options and consider which one best suits your specific needs.")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("See all deployments")])],1)]),e._v(" "),t("p",[e._v("If you still have questions, visit the "),t("RouterLink",{attrs:{to:"/FAQ/Deployment/"}},[e._v("Deployment FAQ")])],1),e._v(" "),t("h2",{attrs:{id:"where-to-find-btcpay-video-tutorials"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-to-find-btcpay-video-tutorials"}},[e._v("#")]),e._v(" Where to find BTCPay video tutorials?")]),e._v(" "),t("p",[e._v("BTCPay Server instructional video guides can be found on the official BTCPay Server YouTube channel:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://www.youtube.com/channel/UCpG9WL6TJuoNfFVkaDMp9ug/videos",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay YouTube channel"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.youtube.com/playlist?list=PL7b9Wt9shK2r-WXS6ysG4tafVQRu80biZ",target:"_blank",rel:"noopener noreferrer"}},[e._v("Assorted playlist of all BTCPay YouTube videos"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"do-i-need-to-have-an-online-store-to-use-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#do-i-need-to-have-an-online-store-to-use-btcpay-server"}},[e._v("#")]),e._v(" Do I need to have an online store to use BTCPay Server?")]),e._v(" "),t("p",[e._v("You can use BTCPay even if you don't have an e-commerce store. You can launch your BTCPay Server and be the payment processor for your friends or local market. Another use-case is to accept donations through the POS (Point of Sale) app or payment buttons which can be copy-pasted as HTML snippets into any website.")]),e._v(" "),t("h2",{attrs:{id:"why-cant-i-just-give-my-bitcoin-address-to-a-buyer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-cant-i-just-give-my-bitcoin-address-to-a-buyer"}},[e._v("#")]),e._v(" Why can't I just give my Bitcoin address to a buyer?")]),e._v(" "),t("p",[e._v("Re-using an address for receiving payments is a privacy issue. Providing a different address manually to each customer is not an optimal solution. Imagine having to send a unique e-mail to everyone that wants to pay you with cryptocurrency.")]),e._v(" "),t("p",[e._v("BTCPay solves the address re-use issue. It automates the checkout process for the merchant by creating a new invoice with a unique address created from the merchant's wallet, each time a customer pays using BTCPay. If you are using an integration with an e-commerce store, BTCPay Server integrates into your checkout process, and customers can pay you in Bitcoin or altcoins in a few clicks, just like any other traditional payment option.")]),e._v(" "),t("p",[e._v("After a customer makes a payment, the BTCPay Server software notifies your store that the order has been paid/completed. Depending on the e-commerce software you're using, it can also change the order status. All you have to worry about is getting items shipped, leave the invoicing and payment processing to BTCPay.")]),e._v(" "),t("h2",{attrs:{id:"how-does-btcpay-create-a-new-address-for-each-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-btcpay-create-a-new-address-for-each-invoice"}},[e._v("#")]),e._v(" How does BTCPay create a new address for each invoice?")]),e._v(" "),t("p",[e._v("BTCPay Server includes an important feature which eliminates the known privacy issue of address re-use. It does this by providing a new address each time an invoice is requested for payment. This is all done automatically and the merchant does not need to keep track of which addresses belong to which wallet, store, etc. BTCPay Server organizes all the payment information in a detailed invoicing system for the merchant.")]),e._v(" "),t("p",[e._v("The way it works is fairly simple. Merchants connect a wallet to each of their stores that they want to receive payments to. The invoices produced for store payments are linked directly to the merchant's connected wallet. The invoice addresses are derived from the "),t("a",{attrs:{href:"https://bitcointalk.org/index.php?topic=2828777.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("xpubkey"),t("OutboundLink")],1),e._v(" of the wallet associated with the store. The software only needs your extended public key of a wallet to produce new addresses for each payment. These addresses are monitored by BTCPay Server as they move through the blockchain. The status of the payments to those addresses are detailed in the merchant's invoice page for each store.")]),e._v(" "),t("h2",{attrs:{id:"does-btcpay-need-my-private-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#does-btcpay-need-my-private-key"}},[e._v("#")]),e._v(" Does BTCPay need my private key?")]),e._v(" "),t("p",[e._v("Private keys are not required for using BTCPay with an existing wallet. The fact that BTCPay Server does not require access to your master private key for on-chain transactions is a huge security advantage. Even if your server gets hacked, your funds from the on-chain transactions are always safe. Securing your on-chain funds comes down to "),t("a",{attrs:{href:"https://btcinformation.org/en/secure-your-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("securing your wallet"),t("OutboundLink")],1),e._v(". Using an "),t("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[e._v("existing wallet with BTCPay Server")]),e._v(" only requires the public key from your wallet.")],1),e._v(" "),t("p",[e._v("It is possible to generate new wallets using BTCPay Server which are hot wallets stored on the server. If you have a lightning node, BTCPay technically has access to the keys (macaroons) of your Lightning funds as well. If these are features that you would like to use, be sure to understand the "),t("RouterLink",{attrs:{to:"/CreateWallet/#security-implications"}},[e._v("security implications and the risks")]),e._v(" associated with these experimental features.")],1),e._v(" "),t("p",[e._v("If you're using a Third-Party BTCPay host, you should be familiar with the "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/#security-concerns"}},[e._v("security concerns")]),e._v(" associated with private keys.")],1),e._v(" "),t("h2",{attrs:{id:"does-btcpay-server-support-crypto-to-fiat-conversion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#does-btcpay-server-support-crypto-to-fiat-conversion"}},[e._v("#")]),e._v(" Does BTCPay Server support crypto to fiat conversion?")]),e._v(" "),t("p",[e._v("At this time, it is possible to do automated conversions using the BTCPay Server plugin called "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCTransmuter"),t("OutboundLink")],1),e._v(". Please note this software is currently in "),t("em",[e._v("alpha state")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"what-if-i-have-a-problem-paying-an-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-if-i-have-a-problem-paying-an-invoice"}},[e._v("#")]),e._v(" What if I have a problem paying an invoice?")]),e._v(" "),t("p",[e._v("If you have an issue paying a BTCPay Server invoice, it is likely do to one of the following reasons:")]),e._v(" "),t("ol",[t("li",[e._v("You are trying to pay using a non-segwit wallet and the merchant's invoices use Bech32 format.")])]),e._v(" "),t("p",[e._v("This is a fairly common issue but can be confusing to the user who will likely receive wallet errors similar to "),t("code",[e._v("invalid address")]),e._v(" when making a payment to an invoice. The solution for this (by the customer) is to use a "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Bech32_adoption",target:"_blank",rel:"noopener noreferrer"}},[e._v("SegWit compatible wallet"),t("OutboundLink")],1),e._v(" which supports sending to Bech32 addresses.")]),e._v(" "),t("p",[e._v("The solution for this (by the merchant) is to modify your extended public key (xPub) you are providing in your BTCPay Server store. To do this, you can append your xPub with "),t("code",[e._v("-[p2sh]")]),e._v(" which will automatically modify your invoice addresses to allow both SegWit and non-SegWit wallets to make payments to your addresses. The BTCPay Server wallet will do this by wrapping the xPub's addresses with a Pay to Script Hash (p2sh) which produces more widely accepted addresses. It's important to understand how this can affect your wallet and the payments received before and after implementing this solution in your BTCPay Server store. Modifying your store's xPub will generate an entirely new wallet from the perspective of your BTCPay Server store. Please understand the following before blindly implementing the solution:")]),e._v(" "),t("ul",[t("li",[e._v("If you are using a hot wallet generated by your BTCPay Server, modifying the xpub will not create new seed words and your previous hot wallet seed words will "),t("strong",[e._v("no longer be stored")]),e._v(" on the server.\n"),t("ul",[t("li",[e._v("As a result, you will not be able to spend your new funds. Instead, create a new store and a new BTCPay Server hot wallet and select the option "),t("code",[e._v("Segwit wrapped (Compatible with old wallets)")]),e._v(" address type, and migrate funds to this new store's wallet.)")])])]),e._v(" "),t("li",[e._v("If you imported your xPub from another wallet (such as a hardware or software wallet) your external wallet will not detect the payments after modifying your xPub.\n"),t("ul",[t("li",[e._v("As a result, you will still be able to spend the funds using your BTCPay Server internal wallet using the Hardware Wallet Integration (Vault, recommended) or by signing with seed (not recommended).")])])]),e._v(" "),t("li",[e._v("Older funds and transactions which were previously displayed in your store's wallet will not appear anymore.\n"),t("ul",[t("li",[e._v("As a result, you may want to consider creating a second store with the modified xpub, to retain the previous transaction history of your transactions.")])])])]),e._v(" "),t("p",[e._v("Learn more about xpub formats and how to modify them "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#what-is-a-derivation-scheme"}},[e._v("here")]),e._v(". If you do not understand the options listed above, ask for clarification in the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("community on Mattermost"),t("OutboundLink")],1),e._v(".")],1),e._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[e._v("The invoice receives payment, but it is not paid in full.")])]),e._v(" "),t("p",[e._v("Users may try to pay an invoice from an exchange or other custodial service where part of the payment is deducted as a fee from the payment. A solution is to pay the amount due (provided that the invoice has not expired) or contact the merchant for a refund or a way to pay the remainder of payment due.")]),e._v(" "),t("h2",{attrs:{id:"what-if-i-have-a-problem-with-a-paid-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-if-i-have-a-problem-with-a-paid-invoice"}},[e._v("#")]),e._v(" What if I have a problem with a paid invoice?")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("To request a refund from a merchant, you must contact the merchant directly! BTCPay Server has no relationship to the merchant you purchased the product or service from.")])]),e._v(" "),t("p",[e._v("BTCPay Server is an open-source self-hosted software stack, not a company. The community and contributors behind BTCPay Server have no control over who uses the software or how they use it.\nIf you paid an invoice to a merchant and have a problem with your order, you must contact the merchant directly to see what happened.")]),e._v(" "),t("p",[e._v("Each merchant running the software controls their own store and the connected wallets that receive funds. The BTCPay Server community does not hold or have access to any funds of a store using the BTCPay Server software, only the merchant does.")]),e._v(" "),t("h2",{attrs:{id:"where-can-i-get-help-and-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-can-i-get-help-and-support"}},[e._v("#")]),e._v(" Where can I get help and support?")]),e._v(" "),t("p",[e._v("BTCPay is an open-source project. It is not a company; there is no e-mail, live-chat or phone support. The software relies on a network of contributors and users to provide support.")]),e._v(" "),t("p",[e._v("If you encountered an issue or have a feature request, please "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("open an issue on GitHub"),t("OutboundLink")],1),e._v(". For more general questions, join our "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("community on Mattermost"),t("OutboundLink")],1),e._v(". Certain community members offer "),t("RouterLink",{attrs:{to:"/Support/"}},[e._v("premium (paid) support")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"how-can-i-contribute-to-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-contribute-to-btcpay"}},[e._v("#")]),e._v(" How can I contribute to BTCPay?")]),e._v(" "),t("p",[e._v("There are many ways in which you can contribute to an open-source project like BTCPay.")]),e._v(" "),t("p",[e._v("The easiest way is to use the software, provide feedback and report any bugs or issues you or your customers encounter. If you're a developer, you can help us develop and improve the software by contributing in any of the BTCPay Server "),t("a",{attrs:{href:"https://github.com/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub repositories"),t("OutboundLink")],1),e._v(". Translating BTCPay into your native language on "),t("a",{attrs:{href:"https://www.transifex.com/btcpayserver/btcpayserver/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Transifex"),t("OutboundLink")],1),e._v(", helping us with documentation and writing are ways in which you can help us out, even if you're not a developer or tech-savvy. We appreciate every contributor to the project.")]),e._v(" "),t("p",[e._v("Check out the "),t("RouterLink",{attrs:{to:"/Contribute/"}},[e._v("contribute section")]),e._v(" for all the ways to contribute and help improve the project.")],1),e._v(" "),t("h2",{attrs:{id:"how-can-i-use-the-btcpay-server-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-use-the-btcpay-server-api"}},[e._v("#")]),e._v(" How can I use the BTCPay Server API?")]),e._v(" "),t("p",[e._v("The original BTCPay Server API is compatible for the most part with "),t("a",{attrs:{href:"https://bitpay.com/api/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BitPay's API"),t("OutboundLink")],1),e._v(" to allow merchants to smoothly transition to using BTCPay if they prefer a free, open source, payment processing alternative.")]),e._v(" "),t("p",[e._v("In 2020, BTCPay Server started releasing a new Greenfield API. This new API will co-exist with the original API and allow full usage of all BTCPay Server features, without requiring the UI. You can view the current "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Greenfield API documentation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("A BTCPay Server functionality that is not found in the Greenfield API documentation means it isn't fully implemented yet in the new API and users should use the original API instead. The discussion on the development of the new Greenfield API can be found "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/1320",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-create-a-webhook-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-create-a-webhook-"}},[e._v("#")]),e._v(" How to create a webhook ?")]),e._v(" "),t("p",[e._v("Within BTCPay Server, it's reasonably easy to make a new "),t("code",[e._v("Webhook")]),e._v("\nWhile in the BTCPay Server Dashboard, go to "),t("code",[e._v("Store settings")]),e._v(" and then click on the "),t("code",[e._v("Webhooks")]),e._v(" tab.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(470),alt:"Create new Webhook",title:"Create new Webhook"}})]),e._v(" "),t("p",[e._v("You're now in the view for creating a "),t("code",[e._v("Webhook")]),e._v(".\nMake sure you know your "),t("code",[e._v("Payload")]),e._v(" URL and paste this into your BTCPay Server.\nWhile you pasted the "),t("code",[e._v("payload")]),e._v(" URL, underneath it shows the "),t("code",[e._v("webhook")]),e._v(" secret.")]),e._v(" "),t("p",[e._v("Copy the "),t("code",[e._v("webhook")]),e._v(" secret and provide it on the endpoint.\nWhen everything has been set, you can toggle in BTCPay Server to "),t("code",[e._v("Automatical redelivery")]),e._v(".\nWe will try to redeliver any failed delivery after 10 seconds, 1 minute, and up to 6 times after 10 minutes.\nYou can toggle between every event or specify the events for your needs.")]),e._v(" "),t("p",[e._v("Be sure to enable the webhook and hit the "),t("code",[e._v("Add webhook")]),e._v(" to save it.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(471),alt:"Create new Webhook",title:"Create new Webhook"}})]),e._v(" "),t("h2",{attrs:{id:"webhook-format-is-not-bitpay-compatible"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#webhook-format-is-not-bitpay-compatible"}},[e._v("#")]),e._v(" Webhook format is not bitpay compatible?")]),e._v(" "),t("p",[e._v('Webhooks are not meant to be compatible with bitpay API.\nThere\'s two seperate IPNs (in BitPay terms: "Instant Payment Notifications") in BTCPay Server.')]),e._v(" "),t("ul",[t("li",[e._v("Webhooks")]),e._v(" "),t("li",[e._v("notifications")])]),e._v(" "),t("p",[e._v("Where "),t("code",[e._v("Webhooks")]),e._v(" are the Greenfield Events and "),t("code",[e._v("Notifications")]),e._v(" are Bitpay events.\nUse "),t("code",[e._v("Notification URL")]),e._v(" when creating an invoice through Bitpay.")]),e._v(" "),t("p",[e._v("To read more on this question ; "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/discussions/2282",target:"_blank",rel:"noopener noreferrer"}},[e._v("Source"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("To read more on "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Greenfield API "),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("For guidance on how to process a "),t("code",[e._v("Webhook")]),e._v(" in PHP, check out the following "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-greenfield-php/blob/master/examples/webhook.php",target:"_blank",rel:"noopener noreferrer"}},[e._v("example script"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"how-can-i-backup-my-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-backup-my-btcpay-server"}},[e._v("#")]),e._v(" How can I backup my BTCPay Server?")]),e._v(" "),t("p",[e._v("It's possible to "),t("RouterLink",{attrs:{to:"/Docker/backup-restore/"}},[e._v("create backups of your BTCPay Server")]),e._v(" instance and it's data. Please keep in mind that the backup scripts have not been thoroughly tested for all types of BTCPay Server setups and custom deployments. Be sure to use your backup to verify it properly recreates your setup, before relying on it.")],1),e._v(" "),t("h2",{attrs:{id:"how-can-i-charge-for-using-my-btcpay-server-instance"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-charge-for-using-my-btcpay-server-instance"}},[e._v("#")]),e._v(" How can I charge for using my BTCPay Server instance?")]),e._v(" "),t("p",[e._v("Currently charging users for using your BTCPay Server instance, whether it's a percentage of transactions or a registration fee, is not supported natively.\nEnabling such a feature could be possible, using the "),t("RouterLink",{attrs:{to:"/Transmuter/"}},[e._v("Transmuter")]),e._v(" and/or the "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Greenfield API"),t("OutboundLink")],1),e._v(" but will require moderate to extensive technical knowledge.")],1),e._v(" "),t("h2",{attrs:{id:"stuck-synching-nbxplorer-is-synchronizing-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#stuck-synching-nbxplorer-is-synchronizing-"}},[e._v("#")]),e._v(' Stuck synching: "NBXplorer is synchronizing"')]),e._v(" "),t("p",[e._v("In some cases, you may encounter NBXplorer getting stuck. The first thing to try in such a situation is to update it. If you are using the Docker deployment, simply run "),t("code",[e._v("./btcpay-update.sh")]),e._v(" or go to "),t("code",[e._v("Server settings / Maintenance / Update")]),e._v(".")]),e._v(" "),t("p",[e._v("If, despite restarting, the problem persists and NBXplorer remains stuck, you may notice that the synch dialog appears as shown below, and the height does not change such as in this screenshot:")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(472),alt:"NBXplorer-stuck",title:"NBXplorer-stuck"}})]),e._v(" "),t("p",[e._v("This issue generally occurs when your server has been offline for an extended period, and your Bitcoin full node is pruned, which is the default setting in BTCPay Server Docker deployments.")]),e._v(" "),t("p",[e._v("When the server restarts, the Bitcoin full node syncs before allowing NBXplorer to sync. However, after the full node has synced, it may have pruned the blocks that NBXplorer requires for syncing.")]),e._v(" "),t("p",[e._v("The only way to resolve this situation is to force NBXplorer to skip the affected blocks. This means that it will not be able to see any transactions that occurred during that period. Nevertheless, your BTCPay Server will be back online.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" stop generated_nbxplorer_1\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exec")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-ti")]),e._v(" generated_postgres_1 psql "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-U")]),e._v(" postgres "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" nbxplorermainnet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("\"DELETE FROM nbxv1_settings WHERE code='BTC' AND key='BlockLocator-';\"")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" start generated_nbxplorer_1\n")])])]),t("p",[e._v("Your server should now be synced and ready for use.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[62],{467:function(e,t,a){e.exports=a.p+"assets/img/btcpayWebhookFAQ1.2e4720f3.jpg"},468:function(e,t,a){e.exports=a.p+"assets/img/btcpayWebhookFAQ2.3b3a0f4e.jpg"},469:function(e,t,a){e.exports=a.p+"assets/img/NBXplorer-stuck.715f322b.png"},840:function(e,t,a){"use strict";a.r(t);var r=a(17),o=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"general-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general-faq"}},[e._v("#")]),e._v(" General FAQ")]),e._v(" "),t("p",[e._v("This page contains general questions and answers about BTCPay Server. What it is, how it works, how to install it.")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#what-is-btcpay-server"}},[e._v("What is BTCPay Server?")])]),t("li",[t("a",{attrs:{href:"#why-should-i-choose-btcpay-over-other-processors"}},[e._v("Why should I choose BTCPay over other processors?")])]),t("li",[t("a",{attrs:{href:"#why-is-everyone-so-excited-about-btcpay"}},[e._v("Why is everyone so excited about BTCPay?")])]),t("li",[t("a",{attrs:{href:"#who-can-use-btcpay"}},[e._v("Who can use BTCPay?")])]),t("li",[t("a",{attrs:{href:"#how-to-install-btcpay-server"}},[e._v("How to install BTCPay Server?")])]),t("li",[t("a",{attrs:{href:"#where-to-find-btcpay-video-tutorials"}},[e._v("Where to find BTCPay video tutorials?")])]),t("li",[t("a",{attrs:{href:"#do-i-need-to-have-an-online-store-to-use-btcpay-server"}},[e._v("Do I need to have an online store to use BTCPay Server?")])]),t("li",[t("a",{attrs:{href:"#why-cant-i-just-give-my-bitcoin-address-to-a-buyer"}},[e._v("Why can't I just give my Bitcoin address to a buyer?")])]),t("li",[t("a",{attrs:{href:"#how-does-btcpay-create-a-new-address-for-each-invoice"}},[e._v("How does BTCPay create a new address for each invoice?")])]),t("li",[t("a",{attrs:{href:"#does-btcpay-need-my-private-key"}},[e._v("Does BTCPay need my private key?")])]),t("li",[t("a",{attrs:{href:"#does-btcpay-server-support-crypto-to-fiat-conversion"}},[e._v("Does BTCPay Server support crypto to fiat conversion?")])]),t("li",[t("a",{attrs:{href:"#what-if-i-have-a-problem-paying-an-invoice"}},[e._v("What if I have a problem paying an invoice?")])]),t("li",[t("a",{attrs:{href:"#what-if-i-have-a-problem-with-a-paid-invoice"}},[e._v("What if I have a problem with a paid invoice?")])]),t("li",[t("a",{attrs:{href:"#where-can-i-get-help-and-support"}},[e._v("Where can I get help and support?")])]),t("li",[t("a",{attrs:{href:"#how-can-i-contribute-to-btcpay"}},[e._v("How can I contribute to BTCPay?")])]),t("li",[t("a",{attrs:{href:"#how-can-i-use-the-btcpay-server-api"}},[e._v("How can I use the BTCPay Server API?")])]),t("li",[t("a",{attrs:{href:"#how-to-create-a-webhook-"}},[e._v("How to create a webhook ?")])]),t("li",[t("a",{attrs:{href:"#webhook-format-is-not-bitpay-compatible"}},[e._v("Webhook format is not bitpay compatible?")])]),t("li",[t("a",{attrs:{href:"#how-can-i-backup-my-btcpay-server"}},[e._v("How can I backup my BTCPay Server?")])]),t("li",[t("a",{attrs:{href:"#how-can-i-charge-for-using-my-btcpay-server-instance"}},[e._v("How can I charge for using my BTCPay Server instance?")])]),t("li",[t("a",{attrs:{href:"#stuck-synching-nbxplorer-is-synchronizing-"}},[e._v('Stuck synching: "NBXplorer is synchronizing"')])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"what-is-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-btcpay-server"}},[e._v("#")]),e._v(" What is BTCPay Server?")]),e._v(" "),t("p",[e._v("BTCPay Server is a free and open-source cryptocurrency payment processor which allows you to receive payments in Bitcoin (on-chain and via the Lightning Network) and altcoins directly, with no fees, transaction cost or a middleman.")]),e._v(" "),t("p",[e._v("BTCPay is a non-custodial invoicing system which eliminates the involvement of a third-party. Payments with BTCPay go directly to your wallet, which increases the privacy and security. Your private keys are never required to receive payments to your BTCPay Server. There is "),t("a",{attrs:{href:"#how-does-btcpay-create-a-new-address-for-each-invoice"}},[e._v("no address re-use")]),e._v(" since each invoice uses a new address for receiving payments to your wallet.")]),e._v(" "),t("h2",{attrs:{id:"why-should-i-choose-btcpay-over-other-processors"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-should-i-choose-btcpay-over-other-processors"}},[e._v("#")]),e._v(" Why should I choose BTCPay over other processors?")]),e._v(" "),t("p",[e._v("The most significant advantage of BTCPay over other processors is that it is entirely free and open-source, non-custodial software, created by the community. While most of the other processors hold your Bitcoins, BTCPay allows you to receive payments P2P, directly to your software or hardware wallet.")]),e._v(" "),t("p",[e._v("BTCPay is a self-hosted software. This means that you are your own payment processor. There are no subscriptions, no transaction fees. There's no third-party involvement which significantly increases the censorship-resistance, privacy, and security for you and your customers. Furthermore, BTCPay enables you to become a processor yourself, so that you can offer different packages and help spread the adoption locally or globally.")]),e._v(" "),t("p",[e._v("With BTCPay, you are your own bank.")]),e._v(" "),t("h2",{attrs:{id:"why-is-everyone-so-excited-about-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-is-everyone-so-excited-about-btcpay"}},[e._v("#")]),e._v(" Why is everyone so excited about BTCPay?")]),e._v(" "),t("p",[e._v("The community is excited about BTCPay and often recommends it to merchants or content creators because it offers a direct way for store-owners and charities to receive Bitcoin payments, which significantly improves the privacy of the customers/donors.")]),e._v(" "),t("p",[e._v("BTCPay doesn't compromise on censorship-resistance, which is one of the main features of Bitcoin. Besides that, being free and open-source it gives an excellent opportunity for developers to build things and integrations on top of BTCPay.")]),e._v(" "),t("h2",{attrs:{id:"who-can-use-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#who-can-use-btcpay"}},[e._v("#")]),e._v(" Who can use BTCPay?")]),e._v(" "),t("p",[e._v("BTCPay server is a feature-rich software with plenty of use-cases that can solve problems for different types of users. Merchants, content creators, lightning network users, exchanges, hosting providers and many others can find it useful. See the "),t("RouterLink",{attrs:{to:"/UseCase/"}},[e._v("Use Case page")]),e._v(" for detailed breakdown of BTCPay use-cases.")],1),e._v(" "),t("p",[e._v("BTCPay is licensed under the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/LICENSE",target:"_blank",rel:"noopener noreferrer"}},[e._v("MIT License"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-install-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-install-btcpay-server"}},[e._v("#")]),e._v(" How to install BTCPay Server?")]),e._v(" "),t("p",[e._v("First take a look at the various deployment options and consider which one best suits your specific needs.")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("See all deployments")])],1)]),e._v(" "),t("p",[e._v("If you still have questions, visit the "),t("RouterLink",{attrs:{to:"/FAQ/Deployment/"}},[e._v("Deployment FAQ")])],1),e._v(" "),t("h2",{attrs:{id:"where-to-find-btcpay-video-tutorials"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-to-find-btcpay-video-tutorials"}},[e._v("#")]),e._v(" Where to find BTCPay video tutorials?")]),e._v(" "),t("p",[e._v("BTCPay Server instructional video guides can be found on the official BTCPay Server YouTube channel:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://www.youtube.com/channel/UCpG9WL6TJuoNfFVkaDMp9ug/videos",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay YouTube channel"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.youtube.com/playlist?list=PL7b9Wt9shK2r-WXS6ysG4tafVQRu80biZ",target:"_blank",rel:"noopener noreferrer"}},[e._v("Assorted playlist of all BTCPay YouTube videos"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"do-i-need-to-have-an-online-store-to-use-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#do-i-need-to-have-an-online-store-to-use-btcpay-server"}},[e._v("#")]),e._v(" Do I need to have an online store to use BTCPay Server?")]),e._v(" "),t("p",[e._v("You can use BTCPay even if you don't have an e-commerce store. You can launch your BTCPay Server and be the payment processor for your friends or local market. Another use-case is to accept donations through the POS (Point of Sale) app or payment buttons which can be copy-pasted as HTML snippets into any website.")]),e._v(" "),t("h2",{attrs:{id:"why-cant-i-just-give-my-bitcoin-address-to-a-buyer"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-cant-i-just-give-my-bitcoin-address-to-a-buyer"}},[e._v("#")]),e._v(" Why can't I just give my Bitcoin address to a buyer?")]),e._v(" "),t("p",[e._v("Re-using an address for receiving payments is a privacy issue. Providing a different address manually to each customer is not an optimal solution. Imagine having to send a unique e-mail to everyone that wants to pay you with cryptocurrency.")]),e._v(" "),t("p",[e._v("BTCPay solves the address re-use issue. It automates the checkout process for the merchant by creating a new invoice with a unique address created from the merchant's wallet, each time a customer pays using BTCPay. If you are using an integration with an e-commerce store, BTCPay Server integrates into your checkout process, and customers can pay you in Bitcoin or altcoins in a few clicks, just like any other traditional payment option.")]),e._v(" "),t("p",[e._v("After a customer makes a payment, the BTCPay Server software notifies your store that the order has been paid/completed. Depending on the e-commerce software you're using, it can also change the order status. All you have to worry about is getting items shipped, leave the invoicing and payment processing to BTCPay.")]),e._v(" "),t("h2",{attrs:{id:"how-does-btcpay-create-a-new-address-for-each-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-btcpay-create-a-new-address-for-each-invoice"}},[e._v("#")]),e._v(" How does BTCPay create a new address for each invoice?")]),e._v(" "),t("p",[e._v("BTCPay Server includes an important feature which eliminates the known privacy issue of address re-use. It does this by providing a new address each time an invoice is requested for payment. This is all done automatically and the merchant does not need to keep track of which addresses belong to which wallet, store, etc. BTCPay Server organizes all the payment information in a detailed invoicing system for the merchant.")]),e._v(" "),t("p",[e._v("The way it works is fairly simple. Merchants connect a wallet to each of their stores that they want to receive payments to. The invoices produced for store payments are linked directly to the merchant's connected wallet. The invoice addresses are derived from the "),t("a",{attrs:{href:"https://bitcointalk.org/index.php?topic=2828777.0",target:"_blank",rel:"noopener noreferrer"}},[e._v("xpubkey"),t("OutboundLink")],1),e._v(" of the wallet associated with the store. The software only needs your extended public key of a wallet to produce new addresses for each payment. These addresses are monitored by BTCPay Server as they move through the blockchain. The status of the payments to those addresses are detailed in the merchant's invoice page for each store.")]),e._v(" "),t("h2",{attrs:{id:"does-btcpay-need-my-private-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#does-btcpay-need-my-private-key"}},[e._v("#")]),e._v(" Does BTCPay need my private key?")]),e._v(" "),t("p",[e._v("Private keys are not required for using BTCPay with an existing wallet. The fact that BTCPay Server does not require access to your master private key for on-chain transactions is a huge security advantage. Even if your server gets hacked, your funds from the on-chain transactions are always safe. Securing your on-chain funds comes down to "),t("a",{attrs:{href:"https://btcinformation.org/en/secure-your-wallet",target:"_blank",rel:"noopener noreferrer"}},[e._v("securing your wallet"),t("OutboundLink")],1),e._v(". Using an "),t("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[e._v("existing wallet with BTCPay Server")]),e._v(" only requires the public key from your wallet.")],1),e._v(" "),t("p",[e._v("It is possible to generate new wallets using BTCPay Server which are hot wallets stored on the server. If you have a lightning node, BTCPay technically has access to the keys (macaroons) of your Lightning funds as well. If these are features that you would like to use, be sure to understand the "),t("RouterLink",{attrs:{to:"/CreateWallet/#security-implications"}},[e._v("security implications and the risks")]),e._v(" associated with these experimental features.")],1),e._v(" "),t("p",[e._v("If you're using a Third-Party BTCPay host, you should be familiar with the "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/#security-concerns"}},[e._v("security concerns")]),e._v(" associated with private keys.")],1),e._v(" "),t("h2",{attrs:{id:"does-btcpay-server-support-crypto-to-fiat-conversion"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#does-btcpay-server-support-crypto-to-fiat-conversion"}},[e._v("#")]),e._v(" Does BTCPay Server support crypto to fiat conversion?")]),e._v(" "),t("p",[e._v("At this time, it is possible to do automated conversions using the BTCPay Server plugin called "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCTransmuter"),t("OutboundLink")],1),e._v(". Please note this software is currently in "),t("em",[e._v("alpha state")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"what-if-i-have-a-problem-paying-an-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-if-i-have-a-problem-paying-an-invoice"}},[e._v("#")]),e._v(" What if I have a problem paying an invoice?")]),e._v(" "),t("p",[e._v("If you have an issue paying a BTCPay Server invoice, it is likely do to one of the following reasons:")]),e._v(" "),t("ol",[t("li",[e._v("You are trying to pay using a non-segwit wallet and the merchant's invoices use Bech32 format.")])]),e._v(" "),t("p",[e._v("This is a fairly common issue but can be confusing to the user who will likely receive wallet errors similar to "),t("code",[e._v("invalid address")]),e._v(" when making a payment to an invoice. The solution for this (by the customer) is to use a "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Bech32_adoption",target:"_blank",rel:"noopener noreferrer"}},[e._v("SegWit compatible wallet"),t("OutboundLink")],1),e._v(" which supports sending to Bech32 addresses.")]),e._v(" "),t("p",[e._v("The solution for this (by the merchant) is to modify your extended public key (xPub) you are providing in your BTCPay Server store. To do this, you can append your xPub with "),t("code",[e._v("-[p2sh]")]),e._v(" which will automatically modify your invoice addresses to allow both SegWit and non-SegWit wallets to make payments to your addresses. The BTCPay Server wallet will do this by wrapping the xPub's addresses with a Pay to Script Hash (p2sh) which produces more widely accepted addresses. It's important to understand how this can affect your wallet and the payments received before and after implementing this solution in your BTCPay Server store. Modifying your store's xPub will generate an entirely new wallet from the perspective of your BTCPay Server store. Please understand the following before blindly implementing the solution:")]),e._v(" "),t("ul",[t("li",[e._v("If you are using a hot wallet generated by your BTCPay Server, modifying the xpub will not create new seed words and your previous hot wallet seed words will "),t("strong",[e._v("no longer be stored")]),e._v(" on the server.\n"),t("ul",[t("li",[e._v("As a result, you will not be able to spend your new funds. Instead, create a new store and a new BTCPay Server hot wallet and select the option "),t("code",[e._v("Segwit wrapped (Compatible with old wallets)")]),e._v(" address type, and migrate funds to this new store's wallet.)")])])]),e._v(" "),t("li",[e._v("If you imported your xPub from another wallet (such as a hardware or software wallet) your external wallet will not detect the payments after modifying your xPub.\n"),t("ul",[t("li",[e._v("As a result, you will still be able to spend the funds using your BTCPay Server internal wallet using the Hardware Wallet Integration (Vault, recommended) or by signing with seed (not recommended).")])])]),e._v(" "),t("li",[e._v("Older funds and transactions which were previously displayed in your store's wallet will not appear anymore.\n"),t("ul",[t("li",[e._v("As a result, you may want to consider creating a second store with the modified xpub, to retain the previous transaction history of your transactions.")])])])]),e._v(" "),t("p",[e._v("Learn more about xpub formats and how to modify them "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#what-is-a-derivation-scheme"}},[e._v("here")]),e._v(". If you do not understand the options listed above, ask for clarification in the "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("community on Mattermost"),t("OutboundLink")],1),e._v(".")],1),e._v(" "),t("ol",{attrs:{start:"2"}},[t("li",[e._v("The invoice receives payment, but it is not paid in full.")])]),e._v(" "),t("p",[e._v("Users may try to pay an invoice from an exchange or other custodial service where part of the payment is deducted as a fee from the payment. A solution is to pay the amount due (provided that the invoice has not expired) or contact the merchant for a refund or a way to pay the remainder of payment due.")]),e._v(" "),t("h2",{attrs:{id:"what-if-i-have-a-problem-with-a-paid-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-if-i-have-a-problem-with-a-paid-invoice"}},[e._v("#")]),e._v(" What if I have a problem with a paid invoice?")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("To request a refund from a merchant, you must contact the merchant directly! BTCPay Server has no relationship to the merchant you purchased the product or service from.")])]),e._v(" "),t("p",[e._v("BTCPay Server is an open-source self-hosted software stack, not a company. The community and contributors behind BTCPay Server have no control over who uses the software or how they use it.\nIf you paid an invoice to a merchant and have a problem with your order, you must contact the merchant directly to see what happened.")]),e._v(" "),t("p",[e._v("Each merchant running the software controls their own store and the connected wallets that receive funds. The BTCPay Server community does not hold or have access to any funds of a store using the BTCPay Server software, only the merchant does.")]),e._v(" "),t("h2",{attrs:{id:"where-can-i-get-help-and-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#where-can-i-get-help-and-support"}},[e._v("#")]),e._v(" Where can I get help and support?")]),e._v(" "),t("p",[e._v("BTCPay is an open-source project. It is not a company; there is no e-mail, live-chat or phone support. The software relies on a network of contributors and users to provide support.")]),e._v(" "),t("p",[e._v("If you encountered an issue or have a feature request, please "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[e._v("open an issue on GitHub"),t("OutboundLink")],1),e._v(". For more general questions, join our "),t("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("community on Mattermost"),t("OutboundLink")],1),e._v(". Certain community members offer "),t("RouterLink",{attrs:{to:"/Support/"}},[e._v("premium (paid) support")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"how-can-i-contribute-to-btcpay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-contribute-to-btcpay"}},[e._v("#")]),e._v(" How can I contribute to BTCPay?")]),e._v(" "),t("p",[e._v("There are many ways in which you can contribute to an open-source project like BTCPay.")]),e._v(" "),t("p",[e._v("The easiest way is to use the software, provide feedback and report any bugs or issues you or your customers encounter. If you're a developer, you can help us develop and improve the software by contributing in any of the BTCPay Server "),t("a",{attrs:{href:"https://github.com/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub repositories"),t("OutboundLink")],1),e._v(". Translating BTCPay into your native language on "),t("a",{attrs:{href:"https://www.transifex.com/btcpayserver/btcpayserver/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Transifex"),t("OutboundLink")],1),e._v(", helping us with documentation and writing are ways in which you can help us out, even if you're not a developer or tech-savvy. We appreciate every contributor to the project.")]),e._v(" "),t("p",[e._v("Check out the "),t("RouterLink",{attrs:{to:"/Contribute/"}},[e._v("contribute section")]),e._v(" for all the ways to contribute and help improve the project.")],1),e._v(" "),t("h2",{attrs:{id:"how-can-i-use-the-btcpay-server-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-use-the-btcpay-server-api"}},[e._v("#")]),e._v(" How can I use the BTCPay Server API?")]),e._v(" "),t("p",[e._v("The original BTCPay Server API is compatible for the most part with "),t("a",{attrs:{href:"https://bitpay.com/api/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BitPay's API"),t("OutboundLink")],1),e._v(" to allow merchants to smoothly transition to using BTCPay if they prefer a free, open source, payment processing alternative.")]),e._v(" "),t("p",[e._v("In 2020, BTCPay Server started releasing a new Greenfield API. This new API will co-exist with the original API and allow full usage of all BTCPay Server features, without requiring the UI. You can view the current "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Greenfield API documentation"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("A BTCPay Server functionality that is not found in the Greenfield API documentation means it isn't fully implemented yet in the new API and users should use the original API instead. The discussion on the development of the new Greenfield API can be found "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/1320",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"how-to-create-a-webhook-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-create-a-webhook-"}},[e._v("#")]),e._v(" How to create a webhook ?")]),e._v(" "),t("p",[e._v("Within BTCPay Server, it's reasonably easy to make a new "),t("code",[e._v("Webhook")]),e._v("\nWhile in the BTCPay Server Dashboard, go to "),t("code",[e._v("Store settings")]),e._v(" and then click on the "),t("code",[e._v("Webhooks")]),e._v(" tab.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(467),alt:"Create new Webhook",title:"Create new Webhook"}})]),e._v(" "),t("p",[e._v("You're now in the view for creating a "),t("code",[e._v("Webhook")]),e._v(".\nMake sure you know your "),t("code",[e._v("Payload")]),e._v(" URL and paste this into your BTCPay Server.\nWhile you pasted the "),t("code",[e._v("payload")]),e._v(" URL, underneath it shows the "),t("code",[e._v("webhook")]),e._v(" secret.")]),e._v(" "),t("p",[e._v("Copy the "),t("code",[e._v("webhook")]),e._v(" secret and provide it on the endpoint.\nWhen everything has been set, you can toggle in BTCPay Server to "),t("code",[e._v("Automatical redelivery")]),e._v(".\nWe will try to redeliver any failed delivery after 10 seconds, 1 minute, and up to 6 times after 10 minutes.\nYou can toggle between every event or specify the events for your needs.")]),e._v(" "),t("p",[e._v("Be sure to enable the webhook and hit the "),t("code",[e._v("Add webhook")]),e._v(" to save it.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(468),alt:"Create new Webhook",title:"Create new Webhook"}})]),e._v(" "),t("h2",{attrs:{id:"webhook-format-is-not-bitpay-compatible"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#webhook-format-is-not-bitpay-compatible"}},[e._v("#")]),e._v(" Webhook format is not bitpay compatible?")]),e._v(" "),t("p",[e._v('Webhooks are not meant to be compatible with bitpay API.\nThere\'s two seperate IPNs (in BitPay terms: "Instant Payment Notifications") in BTCPay Server.')]),e._v(" "),t("ul",[t("li",[e._v("Webhooks")]),e._v(" "),t("li",[e._v("notifications")])]),e._v(" "),t("p",[e._v("Where "),t("code",[e._v("Webhooks")]),e._v(" are the Greenfield Events and "),t("code",[e._v("Notifications")]),e._v(" are Bitpay events.\nUse "),t("code",[e._v("Notification URL")]),e._v(" when creating an invoice through Bitpay.")]),e._v(" "),t("p",[e._v("To read more on this question ; "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/discussions/2282",target:"_blank",rel:"noopener noreferrer"}},[e._v("Source"),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("To read more on "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Greenfield API "),t("OutboundLink")],1)]),e._v(" "),t("p",[e._v("For guidance on how to process a "),t("code",[e._v("Webhook")]),e._v(" in PHP, check out the following "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-greenfield-php/blob/master/examples/webhook.php",target:"_blank",rel:"noopener noreferrer"}},[e._v("example script"),t("OutboundLink")],1)]),e._v(" "),t("h2",{attrs:{id:"how-can-i-backup-my-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-backup-my-btcpay-server"}},[e._v("#")]),e._v(" How can I backup my BTCPay Server?")]),e._v(" "),t("p",[e._v("It's possible to "),t("RouterLink",{attrs:{to:"/Docker/backup-restore/"}},[e._v("create backups of your BTCPay Server")]),e._v(" instance and it's data. Please keep in mind that the backup scripts have not been thoroughly tested for all types of BTCPay Server setups and custom deployments. Be sure to use your backup to verify it properly recreates your setup, before relying on it.")],1),e._v(" "),t("h2",{attrs:{id:"how-can-i-charge-for-using-my-btcpay-server-instance"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-charge-for-using-my-btcpay-server-instance"}},[e._v("#")]),e._v(" How can I charge for using my BTCPay Server instance?")]),e._v(" "),t("p",[e._v("Currently charging users for using your BTCPay Server instance, whether it's a percentage of transactions or a registration fee, is not supported natively.\nEnabling such a feature could be possible, using the "),t("RouterLink",{attrs:{to:"/Transmuter/"}},[e._v("Transmuter")]),e._v(" and/or the "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Greenfield API"),t("OutboundLink")],1),e._v(" but will require moderate to extensive technical knowledge.")],1),e._v(" "),t("h2",{attrs:{id:"stuck-synching-nbxplorer-is-synchronizing-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#stuck-synching-nbxplorer-is-synchronizing-"}},[e._v("#")]),e._v(' Stuck synching: "NBXplorer is synchronizing"')]),e._v(" "),t("p",[e._v("In some cases, you may encounter NBXplorer getting stuck. The first thing to try in such a situation is to update it. If you are using the Docker deployment, simply run "),t("code",[e._v("./btcpay-update.sh")]),e._v(" or go to "),t("code",[e._v("Server settings / Maintenance / Update")]),e._v(".")]),e._v(" "),t("p",[e._v("If, despite restarting, the problem persists and NBXplorer remains stuck, you may notice that the synch dialog appears as shown below, and the height does not change such as in this screenshot:")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(469),alt:"NBXplorer-stuck",title:"NBXplorer-stuck"}})]),e._v(" "),t("p",[e._v("This issue generally occurs when your server has been offline for an extended period, and your Bitcoin full node is pruned, which is the default setting in BTCPay Server Docker deployments.")]),e._v(" "),t("p",[e._v("When the server restarts, the Bitcoin full node syncs before allowing NBXplorer to sync. However, after the full node has synced, it may have pruned the blocks that NBXplorer requires for syncing.")]),e._v(" "),t("p",[e._v("The only way to resolve this situation is to force NBXplorer to skip the affected blocks. This means that it will not be able to see any transactions that occurred during that period. Nevertheless, your BTCPay Server will be back online.")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" stop generated_nbxplorer_1\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("exec")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-ti")]),e._v(" generated_postgres_1 psql "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-U")]),e._v(" postgres "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-d")]),e._v(" nbxplorermainnet "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-c")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("\"DELETE FROM nbxv1_settings WHERE code='BTC' AND key='BlockLocator-';\"")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" start generated_nbxplorer_1\n")])])]),t("p",[e._v("Your server should now be synced and ready for use.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/66.7c69963b.js b/assets/js/66.352643ec.js similarity index 99% rename from assets/js/66.7c69963b.js rename to assets/js/66.352643ec.js index 1a3f4ce58e..d7313523a1 100644 --- a/assets/js/66.7c69963b.js +++ b/assets/js/66.352643ec.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{376:function(e,t,a){e.exports=a.p+"assets/img/lunanode-fork.0a8ba55f.png"},377:function(e,t,a){e.exports=a.p+"assets/img/regtest-paid-invoice.d35b2e14.png"},779:function(e,t,a){"use strict";a.r(t);var r=a(17),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"testing-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#testing-btcpay-server"}},[e._v("#")]),e._v(" Testing BTCPay Server")]),e._v(" "),t("p",[e._v("Testing the software is a great way to contribute to the project. There are many different ways that someone can "),t("em",[e._v("test")]),e._v(" the software. Users who manually test (QA) the software and features to provide user experience, feedback or bugs to the project developers and designers is always appreciated.")]),e._v(" "),t("p",[e._v("Since the software is open source, anyone can test and audit the code. Some merchants or other technical users may want verify new or existing features by testing the software themselves. Developers working on the code can also benefit from understanding how to manually test certain actions in BTCPay.")]),e._v(" "),t("p",[e._v("This guide will show you how to manually test some common BTCPay features and assumes you already have your "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/"}},[e._v("Local Development Environment")]),e._v(" set up. Once you understand the basic testing actions, most other features can be manually tested in a similar way.")],1),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#setup-regtest-network-and-local-btcpay-server"}},[e._v("Setup Regtest Network and Local BTCPay Server")])]),t("li",[t("a",{attrs:{href:"#using-local-docker-images-for-live-testing"}},[e._v("Using local Docker Images for Live Testing")])]),t("li",[t("a",{attrs:{href:"#using-docker-images-for-mainnet-testing"}},[e._v("Using Docker Images for Mainnet Testing")])]),t("li",[t("a",{attrs:{href:"#create-invoice"}},[e._v("Create Invoice")])]),t("li",[t("a",{attrs:{href:"#pay-invoice"}},[e._v("Pay Invoice")])]),t("li",[t("a",{attrs:{href:"#testers-faq"}},[e._v("Testers FAQ")]),t("ul",[t("li",[t("a",{attrs:{href:"#start-debugging-gives-error-no-connection-could-be-made-because-the-target-machine-actively-refused-it-12700139372"}},[e._v("Start Debugging gives Error: No connection could be made because the target machine actively refused it. 127.0.0.1:39372")])]),t("li",[t("a",{attrs:{href:"#regtest-payments-are-not-showing-as-confirmed"}},[e._v("Regtest payments are not showing as confirmed?")])]),t("li",[t("a",{attrs:{href:"#which-branch-should-be-tested-for-major-releases"}},[e._v("Which branch should be tested for major releases?")])]),t("li",[t("a",{attrs:{href:"#can-i-mark-an-invoice-as-paid"}},[e._v("Can I mark an invoice as paid?")])])])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"setup-regtest-network-and-local-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-regtest-network-and-local-btcpay-server"}},[e._v("#")]),e._v(" Setup Regtest Network and Local BTCPay Server")]),e._v(" "),t("p",[e._v("First, be sure you have completed the following:")]),e._v(" "),t("ul",[t("li",[e._v("Option 1: Test the latest code - "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/#sync-forked-btcpayserver-repository"}},[e._v("Pull master")])],1),e._v(" "),t("li",[e._v("Option 2: Test a new feature - "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/#create-a-branch-of-a-pull-request"}},[e._v("Pull request")])],1),e._v(" "),t("li",[e._v("Created a local "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/#bitcoin-regtest-network-setup"}},[e._v("Regtest Network")])],1),e._v(" "),t("li",[e._v("Built your solution and started "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/#build-local-btcpayserver-in-browser-mode"}},[e._v("Browser mode")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/#build-local-btcpayserver-in-debug-mode"}},[e._v("Debug mode")])],1)]),e._v(" "),t("h2",{attrs:{id:"using-local-docker-images-for-live-testing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-local-docker-images-for-live-testing"}},[e._v("#")]),e._v(" Using local Docker Images for Live Testing")]),e._v(" "),t("p",[e._v("You can use any open pull request or feature branch to test new feature in a live environment using local docker images, in case you don't want to use Docker Hub.")]),e._v(" "),t("p",[e._v("Step 1:")]),e._v(" "),t("p",[e._v("Log into your BTCPay instance:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ssh")]),e._v(" user@your-btcpay-server.tld\n")])])]),t("p",[e._v("Step 2:")]),e._v(" "),t("p",[e._v("Clone the BTCPay Server branch you want to test. Can be your own or from another contributor. Replace MYREMOTE and FEATUREBRANCH accordingly:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Clone the repository next to your btcpayserver-docker directory or somewhere else, does not really matter.")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone git@github.com:MYREMOTE/btcpayserver.git btcpayserver-images\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-images\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Checkout the branch you want to test")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout FEATUREBRANCH\n")])])]),t("p",[e._v("Step 3:")]),e._v(" "),t("p",[e._v("Find out the currently deployed tag and build the docker image locally with the same tag.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("If you use the current deployed tag of BTCPay Server, as described below, you avoid the additional step of changing the tag in the docker-compose file. Because local builds always override remote builds. That said, you can build a custom tag and then change the docker compose file accordingly and run BTCPay setup again.")])]),e._v(" "),t("p",[e._v("First, find the current tag of your BTCPay Server instance:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ps")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" generated_btcpayserver "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("awk")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'{print $2}'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# output: btcpayserver/btcpayserver:1.13.1")]),e._v("\n")])])]),t("p",[e._v("Secondly, build the docker image overwriting the current tag, in our case "),t("code",[e._v("btcpayserver/btcpayserver:1.13.1")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" build "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-t")]),e._v(" btcpayserver/btcpayserver:1.13.1 "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n")])])]),t("p",[e._v("Step 4:")]),e._v(" "),t("p",[e._v("Switch to your btcpayserver-docker direcory and run btcpay-up.sh:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n./btcpay-up.sh\n")])])]),t("p",[e._v("Done, you are now running your custom BTCPay Server image.")]),e._v(" "),t("h2",{attrs:{id:"using-docker-images-for-mainnet-testing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-docker-images-for-mainnet-testing"}},[e._v("#")]),e._v(" Using Docker Images for Mainnet Testing")]),e._v(" "),t("p",[e._v("Some features are not suitable for testing using a localhost development environment. Integration type features often require mainnet or testnet payments in order to be sufficiently tested. This will show you how to deploy a custom docker image containing an unreleased feature for testing on a live server.")]),e._v(" "),t("p",[e._v("Step 1:")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/Contribute/DevCode/#git-setup"}},[e._v("Fork, clone and create a branch")]),e._v(" of the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server repository"),t("OutboundLink")],1),e._v(" and name your branch: "),t("code",[e._v("btcpay-branch")]),e._v(". Make a modification, such as changing "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/Views/UIHome/Home.cshtml#L31",target:"_blank",rel:"noopener noreferrer"}},[e._v("this line"),t("OutboundLink")],1),e._v(" on your new branch.")],1),e._v(" "),t("p",[e._v("Step 2:")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/Contribute/DevCode/#git-setup"}},[e._v("Fork, clone and create a branch")]),e._v(" of the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Docker repository"),t("OutboundLink")],1),e._v(" and name your branch: "),t("code",[e._v("docker-branch")]),e._v(".")],1),e._v(" "),t("p",[e._v("Step 3:")]),e._v(" "),t("p",[e._v("Create a Docker Hub account, Docker repository, download Docker Desktop and Login to your account by following "),t("a",{attrs:{href:"https://docs.docker.com/docker-hub/",target:"_blank",rel:"noopener noreferrer"}},[e._v("these steps"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Step 4:")]),e._v(" "),t("p",[e._v("Since BTCPay Server requires a blockchain sync, it's easiest to use an already deployed & synced server. This server should be deployed referencing your own "),t("code",[e._v("docker-branch")]),e._v(" created in step 2. See this example using the "),t("a",{attrs:{href:"https://launchbtcpay.lunanode.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("LunaNode launcher"),t("OutboundLink")],1),e._v(":")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(376),alt:"LunaNode Fork",title:"LunaNode Fork"}})]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Note the image above shows you must specify your GitHub repository url and branch name of your forked and cloned btcpayserver-docker repository you created in step 2.")])]),e._v(" "),t("p",[e._v("Step 5:")]),e._v(" "),t("p",[e._v("Inside the root directory of your "),t("code",[e._v("btcpay-branch")]),e._v(" there are Dockerfiles prefixed by the following: amd64, arm32v7, arm64v8. We need to build and push a custom image using the Dockerfile for the OS being used.")]),e._v(" "),t("p",[e._v("Replace "),t("code",[e._v("")]),e._v(" with your Dockerhub username. Replace the tag "),t("code",[e._v("1.13.1")]),e._v(" with your own custom version tag or use "),t("code",[e._v("latest")]),e._v(" tag in the following commands:")]),e._v(" "),t("div",{staticClass:"language-docker extra-class"},[t("pre",{pre:!0,attrs:{class:"language-docker"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("#build image")]),e._v("\ndocker build -t /btcpayserver:1.13.1 --file ./amd64.Dockerfile .\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("#push image")]),e._v("\ndocker push /btcpayserver:1.13.1\n")])])]),t("p",[e._v("Step 6:")]),e._v(" "),t("p",[e._v("Check that your image appears in your Docker Hub repository and the version tag matches the one you have supplied in the push command above.")]),e._v(" "),t("p",[e._v("Step 7:")]),e._v(" "),t("p",[e._v("Locate the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/tree/master/docker-compose-generator/docker-fragments",target:"_blank",rel:"noopener noreferrer"}},[e._v("btcpayserver.yml docker-fragment"),t("OutboundLink")],1),e._v(" in your local "),t("code",[e._v("docker-branch")]),e._v(" created in step 2. Replace the btcpayserver image's referenced repository to be your Docker image. Replace "),t("code",[e._v("")]),e._v(" with your Dockerhub username and tag version (example: 1.13.1) with the one you have supplied in your step 5 above.")]),e._v(" "),t("div",{staticClass:"language-yaml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yaml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[e._v("image")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" $"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("BTCPAY_IMAGE"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("-")]),e._v("")]),e._v("/btcpayserver"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v("1.0.0.1$")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("?")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("Step 8:")]),e._v(" "),t("p",[e._v("Push your local "),t("code",[e._v("docker-branch")]),e._v(" changes to your BTCPayServer Docker repository on GitHub.")]),e._v(" "),t("p",[e._v("Step 9:")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-update-btcpay-server"}},[e._v("Update your server")]),e._v(".")],1),e._v(" "),t("p",[e._v("Now you can test your feature as if it was already released!")]),e._v(" "),t("h2",{attrs:{id:"create-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-invoice"}},[e._v("#")]),e._v(" Create Invoice")]),e._v(" "),t("p",[e._v("Creating an invoice and sending payment is an important feature in BTCPay and in order to manually test this, you must first:")]),e._v(" "),t("ul",[t("li",[e._v("Create a Store")]),e._v(" "),t("li",[e._v("Setup a Wallet")])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Use the hot wallet for fastest wallet setup during testing. Import from ... > a new/existing seed > check Is hot wallet > Generate")])]),e._v(" "),t("ul",[t("li",[e._v("Create an invoice for your store")])]),e._v(" "),t("h2",{attrs:{id:"pay-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pay-invoice"}},[e._v("#")]),e._v(" Pay Invoice")]),e._v(" "),t("p",[e._v("Open a new Powershell terminal and navigate to your "),t("code",[e._v("BTCPayServer.Tests")]),e._v(" directory where our Docker-Compose commands are run for the project. Copy the amount and address for payment from your invoice. Add them into the following command:")]),e._v(" "),t("p",[t("code",[e._v('.\\docker-bitcoin-cli.ps1 sendtoaddress "bcrt1qym96l8gztggldraywdumgmfw27u8p8h5w7h9kc" 0.00097449')]),e._v(" then press "),t("code",[e._v("Enter")]),e._v(".")]),e._v(" "),t("p",[e._v("Notice that your invoice has now been paid in your local BTCPay Server.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(377),alt:"Test Paid Invoice",title:"Test Paid Invoice"}})]),e._v(" "),t("p",[e._v("To pay other types of payments see "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("this guide"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"testers-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#testers-faq"}},[e._v("#")]),e._v(" Testers FAQ")]),e._v(" "),t("h3",{attrs:{id:"start-debugging-gives-error-no-connection-could-be-made-because-the-target-machine-actively-refused-it-12700139372"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#start-debugging-gives-error-no-connection-could-be-made-because-the-target-machine-actively-refused-it-12700139372"}},[e._v("#")]),e._v(" Start Debugging gives Error: No connection could be made because the target machine actively refused it. 127.0.0.1:39372")]),e._v(" "),t("p",[e._v("If you see this error, it means you did not set up your Regtest Network using the "),t("code",[e._v("docker-compose up dev")]),e._v(" command in the "),t("code",[e._v("BTCPayServer.Tests")]),e._v(" directory. This command will set up all the dependencies you need for services used by BTCPay in the local development environment. You must run it before you try to start debugging.")]),e._v(" "),t("h3",{attrs:{id:"regtest-payments-are-not-showing-as-confirmed"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#regtest-payments-are-not-showing-as-confirmed"}},[e._v("#")]),e._v(" Regtest payments are not showing as confirmed?")]),e._v(" "),t("p",[e._v("If you make a "),t("a",{attrs:{href:"#pay-invoice"}},[e._v("test payment")]),e._v(" and it's stuck as unconfirmed, you should mine some blocks to add confirmations to your transaction.")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-bitcoin-generate"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 3\n")])])]),t("p",[e._v("If you are missing things like test payment notifications or other expected events, this may be the reason.")]),e._v(" "),t("h3",{attrs:{id:"which-branch-should-be-tested-for-major-releases"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#which-branch-should-be-tested-for-major-releases"}},[e._v("#")]),e._v(" Which branch should be tested for major releases?")]),e._v(" "),t("p",[e._v("Testing master branch is acceptable because it will include the release changes. However, other commits which are not yet released may also be in master. It is always good to find issues before the release so master (or a specific PR) is the ideal branch to test.")]),e._v(" "),t("p",[e._v("You can check the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("latest release"),t("OutboundLink")],1),e._v(" to see the changes which are available for current deployments as well as the unreleased commits.")]),e._v(" "),t("h3",{attrs:{id:"can-i-mark-an-invoice-as-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-mark-an-invoice-as-paid"}},[e._v("#")]),e._v(" Can I mark an invoice as paid?")]),e._v(" "),t("p",[e._v("No, you can't mark an invoice as paid. If you need completed payment status for development, either "),t("a",{attrs:{href:"#pay-invoice"}},[e._v("pay the invoice")]),e._v(" or create the invoice for $0 which will be automatically paid upon creation.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[66],{376:function(e,t,a){e.exports=a.p+"assets/img/lunanode-fork.0a8ba55f.png"},377:function(e,t,a){e.exports=a.p+"assets/img/regtest-paid-invoice.d35b2e14.png"},778:function(e,t,a){"use strict";a.r(t);var r=a(17),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"testing-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#testing-btcpay-server"}},[e._v("#")]),e._v(" Testing BTCPay Server")]),e._v(" "),t("p",[e._v("Testing the software is a great way to contribute to the project. There are many different ways that someone can "),t("em",[e._v("test")]),e._v(" the software. Users who manually test (QA) the software and features to provide user experience, feedback or bugs to the project developers and designers is always appreciated.")]),e._v(" "),t("p",[e._v("Since the software is open source, anyone can test and audit the code. Some merchants or other technical users may want verify new or existing features by testing the software themselves. Developers working on the code can also benefit from understanding how to manually test certain actions in BTCPay.")]),e._v(" "),t("p",[e._v("This guide will show you how to manually test some common BTCPay features and assumes you already have your "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/"}},[e._v("Local Development Environment")]),e._v(" set up. Once you understand the basic testing actions, most other features can be manually tested in a similar way.")],1),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#setup-regtest-network-and-local-btcpay-server"}},[e._v("Setup Regtest Network and Local BTCPay Server")])]),t("li",[t("a",{attrs:{href:"#using-local-docker-images-for-live-testing"}},[e._v("Using local Docker Images for Live Testing")])]),t("li",[t("a",{attrs:{href:"#using-docker-images-for-mainnet-testing"}},[e._v("Using Docker Images for Mainnet Testing")])]),t("li",[t("a",{attrs:{href:"#create-invoice"}},[e._v("Create Invoice")])]),t("li",[t("a",{attrs:{href:"#pay-invoice"}},[e._v("Pay Invoice")])]),t("li",[t("a",{attrs:{href:"#testers-faq"}},[e._v("Testers FAQ")]),t("ul",[t("li",[t("a",{attrs:{href:"#start-debugging-gives-error-no-connection-could-be-made-because-the-target-machine-actively-refused-it-12700139372"}},[e._v("Start Debugging gives Error: No connection could be made because the target machine actively refused it. 127.0.0.1:39372")])]),t("li",[t("a",{attrs:{href:"#regtest-payments-are-not-showing-as-confirmed"}},[e._v("Regtest payments are not showing as confirmed?")])]),t("li",[t("a",{attrs:{href:"#which-branch-should-be-tested-for-major-releases"}},[e._v("Which branch should be tested for major releases?")])]),t("li",[t("a",{attrs:{href:"#can-i-mark-an-invoice-as-paid"}},[e._v("Can I mark an invoice as paid?")])])])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"setup-regtest-network-and-local-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-regtest-network-and-local-btcpay-server"}},[e._v("#")]),e._v(" Setup Regtest Network and Local BTCPay Server")]),e._v(" "),t("p",[e._v("First, be sure you have completed the following:")]),e._v(" "),t("ul",[t("li",[e._v("Option 1: Test the latest code - "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/#sync-forked-btcpayserver-repository"}},[e._v("Pull master")])],1),e._v(" "),t("li",[e._v("Option 2: Test a new feature - "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/#create-a-branch-of-a-pull-request"}},[e._v("Pull request")])],1),e._v(" "),t("li",[e._v("Created a local "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/#bitcoin-regtest-network-setup"}},[e._v("Regtest Network")])],1),e._v(" "),t("li",[e._v("Built your solution and started "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/#build-local-btcpayserver-in-browser-mode"}},[e._v("Browser mode")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Contribute/DevCode/#build-local-btcpayserver-in-debug-mode"}},[e._v("Debug mode")])],1)]),e._v(" "),t("h2",{attrs:{id:"using-local-docker-images-for-live-testing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-local-docker-images-for-live-testing"}},[e._v("#")]),e._v(" Using local Docker Images for Live Testing")]),e._v(" "),t("p",[e._v("You can use any open pull request or feature branch to test new feature in a live environment using local docker images, in case you don't want to use Docker Hub.")]),e._v(" "),t("p",[e._v("Step 1:")]),e._v(" "),t("p",[e._v("Log into your BTCPay instance:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ssh")]),e._v(" user@your-btcpay-server.tld\n")])])]),t("p",[e._v("Step 2:")]),e._v(" "),t("p",[e._v("Clone the BTCPay Server branch you want to test. Can be your own or from another contributor. Replace MYREMOTE and FEATUREBRANCH accordingly:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Clone the repository next to your btcpayserver-docker directory or somewhere else, does not really matter.")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" clone git@github.com:MYREMOTE/btcpayserver.git btcpayserver-images\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" btcpayserver-images\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# Checkout the branch you want to test")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" checkout FEATUREBRANCH\n")])])]),t("p",[e._v("Step 3:")]),e._v(" "),t("p",[e._v("Find out the currently deployed tag and build the docker image locally with the same tag.")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("If you use the current deployed tag of BTCPay Server, as described below, you avoid the additional step of changing the tag in the docker-compose file. Because local builds always override remote builds. That said, you can build a custom tag and then change the docker compose file accordingly and run BTCPay setup again.")])]),e._v(" "),t("p",[e._v("First, find the current tag of your BTCPay Server instance:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("ps")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("grep")]),e._v(" generated_btcpayserver "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("|")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("awk")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'{print $2}'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# output: btcpayserver/btcpayserver:1.13.1")]),e._v("\n")])])]),t("p",[e._v("Secondly, build the docker image overwriting the current tag, in our case "),t("code",[e._v("btcpayserver/btcpayserver:1.13.1")]),e._v(":")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("docker")]),e._v(" build "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-t")]),e._v(" btcpayserver/btcpayserver:1.13.1 "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n")])])]),t("p",[e._v("Step 4:")]),e._v(" "),t("p",[e._v("Switch to your btcpayserver-docker direcory and run btcpay-up.sh:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAY_BASE_DIRECTORY")]),e._v("/btcpayserver-docker\n./btcpay-up.sh\n")])])]),t("p",[e._v("Done, you are now running your custom BTCPay Server image.")]),e._v(" "),t("h2",{attrs:{id:"using-docker-images-for-mainnet-testing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-docker-images-for-mainnet-testing"}},[e._v("#")]),e._v(" Using Docker Images for Mainnet Testing")]),e._v(" "),t("p",[e._v("Some features are not suitable for testing using a localhost development environment. Integration type features often require mainnet or testnet payments in order to be sufficiently tested. This will show you how to deploy a custom docker image containing an unreleased feature for testing on a live server.")]),e._v(" "),t("p",[e._v("Step 1:")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/Contribute/DevCode/#git-setup"}},[e._v("Fork, clone and create a branch")]),e._v(" of the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server repository"),t("OutboundLink")],1),e._v(" and name your branch: "),t("code",[e._v("btcpay-branch")]),e._v(". Make a modification, such as changing "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/Views/UIHome/Home.cshtml#L31",target:"_blank",rel:"noopener noreferrer"}},[e._v("this line"),t("OutboundLink")],1),e._v(" on your new branch.")],1),e._v(" "),t("p",[e._v("Step 2:")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/Contribute/DevCode/#git-setup"}},[e._v("Fork, clone and create a branch")]),e._v(" of the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Docker repository"),t("OutboundLink")],1),e._v(" and name your branch: "),t("code",[e._v("docker-branch")]),e._v(".")],1),e._v(" "),t("p",[e._v("Step 3:")]),e._v(" "),t("p",[e._v("Create a Docker Hub account, Docker repository, download Docker Desktop and Login to your account by following "),t("a",{attrs:{href:"https://docs.docker.com/docker-hub/",target:"_blank",rel:"noopener noreferrer"}},[e._v("these steps"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Step 4:")]),e._v(" "),t("p",[e._v("Since BTCPay Server requires a blockchain sync, it's easiest to use an already deployed & synced server. This server should be deployed referencing your own "),t("code",[e._v("docker-branch")]),e._v(" created in step 2. See this example using the "),t("a",{attrs:{href:"https://launchbtcpay.lunanode.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("LunaNode launcher"),t("OutboundLink")],1),e._v(":")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(376),alt:"LunaNode Fork",title:"LunaNode Fork"}})]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("Note the image above shows you must specify your GitHub repository url and branch name of your forked and cloned btcpayserver-docker repository you created in step 2.")])]),e._v(" "),t("p",[e._v("Step 5:")]),e._v(" "),t("p",[e._v("Inside the root directory of your "),t("code",[e._v("btcpay-branch")]),e._v(" there are Dockerfiles prefixed by the following: amd64, arm32v7, arm64v8. We need to build and push a custom image using the Dockerfile for the OS being used.")]),e._v(" "),t("p",[e._v("Replace "),t("code",[e._v("")]),e._v(" with your Dockerhub username. Replace the tag "),t("code",[e._v("1.13.1")]),e._v(" with your own custom version tag or use "),t("code",[e._v("latest")]),e._v(" tag in the following commands:")]),e._v(" "),t("div",{staticClass:"language-docker extra-class"},[t("pre",{pre:!0,attrs:{class:"language-docker"}},[t("code",[t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("#build image")]),e._v("\ndocker build -t /btcpayserver:1.13.1 --file ./amd64.Dockerfile .\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("#push image")]),e._v("\ndocker push /btcpayserver:1.13.1\n")])])]),t("p",[e._v("Step 6:")]),e._v(" "),t("p",[e._v("Check that your image appears in your Docker Hub repository and the version tag matches the one you have supplied in the push command above.")]),e._v(" "),t("p",[e._v("Step 7:")]),e._v(" "),t("p",[e._v("Locate the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/tree/master/docker-compose-generator/docker-fragments",target:"_blank",rel:"noopener noreferrer"}},[e._v("btcpayserver.yml docker-fragment"),t("OutboundLink")],1),e._v(" in your local "),t("code",[e._v("docker-branch")]),e._v(" created in step 2. Replace the btcpayserver image's referenced repository to be your Docker image. Replace "),t("code",[e._v("")]),e._v(" with your Dockerhub username and tag version (example: 1.13.1) with the one you have supplied in your step 5 above.")]),e._v(" "),t("div",{staticClass:"language-yaml extra-class"},[t("pre",{pre:!0,attrs:{class:"language-yaml"}},[t("code",[t("span",{pre:!0,attrs:{class:"token key atrule"}},[e._v("image")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v(" $"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("BTCPAY_IMAGE"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("-")]),e._v("")]),e._v("/btcpayserver"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(":")]),e._v("1.0.0.1$")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("?")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("Step 8:")]),e._v(" "),t("p",[e._v("Push your local "),t("code",[e._v("docker-branch")]),e._v(" changes to your BTCPayServer Docker repository on GitHub.")]),e._v(" "),t("p",[e._v("Step 9:")]),e._v(" "),t("p",[t("RouterLink",{attrs:{to:"/FAQ/ServerSettings/#how-to-update-btcpay-server"}},[e._v("Update your server")]),e._v(".")],1),e._v(" "),t("p",[e._v("Now you can test your feature as if it was already released!")]),e._v(" "),t("h2",{attrs:{id:"create-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-invoice"}},[e._v("#")]),e._v(" Create Invoice")]),e._v(" "),t("p",[e._v("Creating an invoice and sending payment is an important feature in BTCPay and in order to manually test this, you must first:")]),e._v(" "),t("ul",[t("li",[e._v("Create a Store")]),e._v(" "),t("li",[e._v("Setup a Wallet")])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Use the hot wallet for fastest wallet setup during testing. Import from ... > a new/existing seed > check Is hot wallet > Generate")])]),e._v(" "),t("ul",[t("li",[e._v("Create an invoice for your store")])]),e._v(" "),t("h2",{attrs:{id:"pay-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#pay-invoice"}},[e._v("#")]),e._v(" Pay Invoice")]),e._v(" "),t("p",[e._v("Open a new Powershell terminal and navigate to your "),t("code",[e._v("BTCPayServer.Tests")]),e._v(" directory where our Docker-Compose commands are run for the project. Copy the amount and address for payment from your invoice. Add them into the following command:")]),e._v(" "),t("p",[t("code",[e._v('.\\docker-bitcoin-cli.ps1 sendtoaddress "bcrt1qym96l8gztggldraywdumgmfw27u8p8h5w7h9kc" 0.00097449')]),e._v(" then press "),t("code",[e._v("Enter")]),e._v(".")]),e._v(" "),t("p",[e._v("Notice that your invoice has now been paid in your local BTCPay Server.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(377),alt:"Test Paid Invoice",title:"Test Paid Invoice"}})]),e._v(" "),t("p",[e._v("To pay other types of payments see "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Tests/README.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("this guide"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"testers-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#testers-faq"}},[e._v("#")]),e._v(" Testers FAQ")]),e._v(" "),t("h3",{attrs:{id:"start-debugging-gives-error-no-connection-could-be-made-because-the-target-machine-actively-refused-it-12700139372"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#start-debugging-gives-error-no-connection-could-be-made-because-the-target-machine-actively-refused-it-12700139372"}},[e._v("#")]),e._v(" Start Debugging gives Error: No connection could be made because the target machine actively refused it. 127.0.0.1:39372")]),e._v(" "),t("p",[e._v("If you see this error, it means you did not set up your Regtest Network using the "),t("code",[e._v("docker-compose up dev")]),e._v(" command in the "),t("code",[e._v("BTCPayServer.Tests")]),e._v(" directory. This command will set up all the dependencies you need for services used by BTCPay in the local development environment. You must run it before you try to start debugging.")]),e._v(" "),t("h3",{attrs:{id:"regtest-payments-are-not-showing-as-confirmed"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#regtest-payments-are-not-showing-as-confirmed"}},[e._v("#")]),e._v(" Regtest payments are not showing as confirmed?")]),e._v(" "),t("p",[e._v("If you make a "),t("a",{attrs:{href:"#pay-invoice"}},[e._v("test payment")]),e._v(" and it's stuck as unconfirmed, you should mine some blocks to add confirmations to your transaction.")]),e._v(" "),t("div",{staticClass:"language-powershell extra-class"},[t("pre",{pre:!0,attrs:{class:"language-powershell"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("\\docker-bitcoin-generate"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("ps1 3\n")])])]),t("p",[e._v("If you are missing things like test payment notifications or other expected events, this may be the reason.")]),e._v(" "),t("h3",{attrs:{id:"which-branch-should-be-tested-for-major-releases"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#which-branch-should-be-tested-for-major-releases"}},[e._v("#")]),e._v(" Which branch should be tested for major releases?")]),e._v(" "),t("p",[e._v("Testing master branch is acceptable because it will include the release changes. However, other commits which are not yet released may also be in master. It is always good to find issues before the release so master (or a specific PR) is the ideal branch to test.")]),e._v(" "),t("p",[e._v("You can check the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("latest release"),t("OutboundLink")],1),e._v(" to see the changes which are available for current deployments as well as the unreleased commits.")]),e._v(" "),t("h3",{attrs:{id:"can-i-mark-an-invoice-as-paid"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-mark-an-invoice-as-paid"}},[e._v("#")]),e._v(" Can I mark an invoice as paid?")]),e._v(" "),t("p",[e._v("No, you can't mark an invoice as paid. If you need completed payment status for development, either "),t("a",{attrs:{href:"#pay-invoice"}},[e._v("pay the invoice")]),e._v(" or create the invoice for $0 which will be automatically paid upon creation.")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/67.78656f08.js b/assets/js/67.7572d8d1.js similarity index 99% rename from assets/js/67.78656f08.js rename to assets/js/67.7572d8d1.js index 6490098a18..1f73f3c120 100644 --- a/assets/js/67.78656f08.js +++ b/assets/js/67.7572d8d1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{422:function(t,a,s){t.exports=s.p+"assets/img/rpi-imager.9299bfff.png"},423:function(t,a,s){t.exports=s.p+"assets/img/rpi-imager-advanced-settings.8bdd9c34.png"},803:function(t,a,s){"use strict";s.r(a);var e=s(17),r=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"raspberry-pi-deployment"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#raspberry-pi-deployment"}},[t._v("#")]),t._v(" Raspberry Pi Deployment")]),t._v(" "),a("p",[t._v("This document guides you step by step on "),a("strong",[t._v("how to run BTCPay Server on a Raspberry Pi 4")]),t._v(".")]),t._v(" "),a("p",[t._v("The "),a("strong",[t._v("Raspberry Pi 4")]),t._v(" is currently the best low-cost single-board computer available.\nYou can "),a("strong",[t._v("use a Raspberry Pi 4 to run your BTCPay Server")]),t._v(" at home for around $150 worth of parts, described below.")]),t._v(" "),a("p",[t._v("Already have a Raspberry Pi 4 with the following specs?")]),t._v(" "),a("ul",[a("li",[t._v("4GB memory")]),t._v(" "),a("li",[t._v("1TB USB 3.0 SSD")]),t._v(" "),a("li",[t._v("16GB or greater SD card")])]),t._v(" "),a("p",[t._v("If so, you can go straight to the "),a("a",{attrs:{href:"#quickstart"}},[t._v("quickstart instructions")]),t._v(".\nOtherwise, here's what you need …")]),t._v(" "),a("h2",{attrs:{id:"required-hardware"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#required-hardware"}},[t._v("#")]),t._v(" Required Hardware")]),t._v(" "),a("h3",{attrs:{id:"raspberry-pi-4"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#raspberry-pi-4"}},[t._v("#")]),t._v(" Raspberry Pi 4")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://www.canakit.com/raspberry-pi-4-4gb.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Raspberry Pi 4 with "),a("strong",[t._v("4GB RAM")]),a("OutboundLink")],1),t._v(" (~$65)")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://www.amazon.com/dp/B073K14CVB/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sandisk 16GB SD Card"),a("OutboundLink")],1),t._v(" (~$10)")])]),t._v(" "),a("p",[t._v("Don’t settle for only 1GB or 2GB of RAM. The "),a("strong",[t._v("4GB RAM")]),t._v(" version is harder to find than the other versions, but you absolutely want that "),a("strong",[t._v("4GB of RAM")]),t._v(" for a few extra bucks, and it’s totally worth spending a few extra minutes searching on the Internet to find a vendor that has the 4GB RAM version in stock. You’ll also need an "),a("strong",[t._v("SD card reader")]),t._v(" if you don’t already have one.")]),t._v(" "),a("h3",{attrs:{id:"data-storage-options"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#data-storage-options"}},[t._v("#")]),t._v(" Data Storage options")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://www.amazon.com/dp/B0874XN4D8/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Samsung SSD T7 1TB"),a("OutboundLink")],1),t._v(" (~$100)")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://www.amazon.com/dp/B071KGRXRG/",target:"_blank",rel:"noopener noreferrer"}},[t._v("SanDisk Ultra 3D 1TB"),a("OutboundLink")],1),t._v(" (~$100)")])]),t._v(" "),a("p",[t._v("A 1TB SSD allows you to keep a full copy of the Bitcoin blockchain.\nYou can also use BTCPay Server without a full copy of the Bitcoin blockchain by using the "),a("RouterLink",{attrs:{to:"/Docker/#how-i-can-prune-my-nodes"}},[t._v("pruning option")]),t._v(".")],1),t._v(" "),a("h3",{attrs:{id:"power-adapter-options"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#power-adapter-options"}},[t._v("#")]),t._v(" Power Adapter options")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://shop.pimoroni.com/products/raspberry-pi-official-usb-c-power-supply-us?variant=29391144648787",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official Raspberry Pi 4 USB-C Power Adapter 5.1V/3A for US"),a("OutboundLink")],1),t._v(" ($10)")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://shop.pimoroni.com/products/raspberry-pi-official-usb-c-power-supply-eu?variant=29391130624083",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official Raspberry Pi 4 USB-C Power Adapter 5.1V/3A for EU"),a("OutboundLink")],1),t._v(" ($10)")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://shop.pimoroni.com/products/raspberry-pi-official-usb-c-power-supply-au?variant=29391160737875",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official Raspberry Pi 4 USB-C Power Adapter 5.1V/3A for AU"),a("OutboundLink")],1),t._v(" ($10)")])]),t._v(" "),a("p",[t._v("Don’t waste your time with random cheap power adapters from Amazon, or expect that the existing ones you have at home are going to work fine. The Raspberry Pi 4 has issues with unofficial adapters, and for only $10 it’s better to just "),a("strong",[t._v("get an official adapter")]),t._v(" instead of learning this the hard way.")]),t._v(" "),a("h3",{attrs:{id:"case-and-cooling-options"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#case-and-cooling-options"}},[t._v("#")]),t._v(" Case and Cooling options")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://www.amazon.com/dp/B07WG4DW52/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Flirc Heatsink Case"),a("OutboundLink")],1),t._v(" (~$15)")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://www.amazon.com/dp/B07VQRYTPR/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Passive cooling aluminum case"),a("OutboundLink")],1),t._v(" (~$15)")])]),t._v(" "),a("p",[t._v("Of course, using a case is totally optional, but we recommend one to protect your Raspberry Pi over the long-term.\nStrictly speaking, you don’t actually need a cooling solution, but you certainly "),a("strong",[t._v("want")]),t._v(" at least passive cooling.\nOnce the Raspberry PI core temperature reaches 70°C, it will throttle down the CPU.")]),t._v(" "),a("h2",{attrs:{id:"quickstart"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#quickstart"}},[t._v("#")]),t._v(" Quickstart")]),t._v(" "),a("p",[t._v("Download and open the latest "),a("a",{attrs:{href:"https://www.raspberrypi.com/software/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Raspberry Pi Imager"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("figure",[a("img",{attrs:{src:s(422),alt:"Raspberry Pi Imager",title:"Raspberry Pi Imager"}})]),t._v(" "),a("p",[t._v("Choose the following options:")]),t._v(" "),a("ul",[a("li",[t._v("Operating System: Raspberry Pi OS Lite (64-bit)\n"),a("ul",[a("li",[t._v('Find it via "Raspberry Pi OS (Other)"')])])]),t._v(" "),a("li",[t._v("Storage: Select your SD card")])]),t._v(" "),a("p",[t._v("Open the Advanced Settings via the button in the bottom right corner.")]),t._v(" "),a("figure",[a("img",{attrs:{src:s(423),alt:"Raspberry Pi Imager Advanced Settings",title:"Raspberry Pi Imager Advanced Settings"}})]),t._v(" "),a("p",[t._v("Advanced Settings:")]),t._v(" "),a("ul",[a("li",[t._v("Set the hostname to what you like, this guide assumes "),a("code",[t._v("btcpay.local")]),t._v(".")]),t._v(" "),a("li",[t._v("Enabled SSH")]),t._v(" "),a("li",[t._v("Set username and password, this guide assumes "),a("code",[t._v("btcpay")]),t._v(" as username.")])]),t._v(" "),a("p",[t._v("Other settings are optional, you do not need to configure wireless LAN.")]),t._v(" "),a("p",[t._v('Close the Advanced Settings and click the "Write" button.')]),t._v(" "),a("h3",{attrs:{id:"setting-up-the-raspberry-pi"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-the-raspberry-pi"}},[t._v("#")]),t._v(" Setting up the Raspberry Pi")]),t._v(" "),a("p",[t._v("Once the image is written to the SD card, you can eject it and insert it into the Raspberry Pi.\nConnect the SSD and network cable to the Raspberry Pi.\nAt last, connect the power cable ­— this starts the boot process.\nIt should boot up and get an IP address using DHCP.")]),t._v(" "),a("p",[t._v("Login to the Raspberry Pi using the credentials you configured in the Raspberry Pi Imager:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ssh")]),t._v(" btcpay@btcpay.local\n")])])]),a("p",[t._v("Confirm the "),a("code",[t._v("Are you sure you want to continue connecting?")]),t._v(" question with "),a("code",[t._v("yes")])]),t._v(" "),a("p",[t._v("If your Raspberry Pi cannot be found by the "),a("code",[t._v("btcpay.local")]),t._v(" address, you will need to login to your router to find its IP address.\nThe IP address that my Raspberry Pi got was "),a("code",[t._v("192.168.1.5")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ssh")]),t._v(" btcpay@192.168.1.5\n")])])]),a("p",[t._v("Switch to the "),a("code",[t._v("root")]),t._v(" user:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n")])])]),a("p",[t._v("Afterwards, you can choose between "),a("a",{attrs:{href:"https://github.com/lightningnetwork/lnd",target:"_blank",rel:"noopener noreferrer"}},[t._v("LND"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://github.com/ElementsProject/lightning",target:"_blank",rel:"noopener noreferrer"}},[t._v("Core Lightning"),a("OutboundLink")],1),t._v(" for your Lightning node.")]),t._v(" "),a("p",[a("strong",[t._v("Required:")]),t._v(" Choose one of the following …")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Core Lightning")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_LIGHTNING")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"clightning"')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# LND")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_LIGHTNING")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"lnd"')]),t._v("\n")])])]),a("p",[a("strong",[t._v("Optional:")]),t._v(" You can also configure "),a("RouterLink",{attrs:{to:"/Docker/#environment-variables"}},[t._v("additional settings")]),t._v(" …")],1),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# optional, this is just an example for runing a pruned node on a public domain")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"opt-save-storage"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAY_ADDITIONAL_HOSTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btcpay.YourDomain.com"')]),t._v("\n")])])]),a("p",[t._v("Download and run the install script:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" btcpayserver-install.sh https://raw.githubusercontent.com/btcpayserver/btcpayserver-doc/master/scripts/btcpayserver-rpi4-install.sh\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" +x btcpayserver-install.sh\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpayserver-install.sh\n")])])]),a("p",[t._v("After the initial setup is complete open a browser on another computer and go to "),a("code",[t._v("btcpay.local")]),t._v(".")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("Your installation is done and your node should have started synching.\nFor a Bitcoin full node the initial block download takes approximately 40 hours after install.")])]),t._v(" "),a("p",[t._v("If you are curious, here are the details of what the installation scripts above do …")]),t._v(" "),a("h2",{attrs:{id:"detailed-step-by-step-instructions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#detailed-step-by-step-instructions"}},[t._v("#")]),t._v(" Detailed Step by Step Instructions")]),t._v(" "),a("p",[t._v("These are the steps that follow after the general setup process outlined in the "),a("a",{attrs:{href:"#quickstart"}},[t._v("quickstart instructions")]),t._v(".")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("NOTE")]),t._v(" "),a("p",[t._v("The following steps require you to be the root user.")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n")])])])]),t._v(" "),a("h3",{attrs:{id:"upgrade-the-os-packages-to-latest"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrade-the-os-packages-to-latest"}},[t._v("#")]),t._v(" Upgrade the OS packages to latest")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" upgrade "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" autoremove\n")])])]),a("h3",{attrs:{id:"configuring-the-storage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-storage"}},[t._v("#")]),t._v(" Configuring the storage")]),t._v(" "),a("p",[t._v("We recommend to disable swap to prevent burning out your SD card:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("dphys-swapfile swapoff\ndphys-swapfile uninstall\nupdate-rc.d dphys-swapfile remove\nsystemctl disable dphys-swapfile\n")])])]),a("p",[t._v("Partition your SSD:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("fdisk")]),t._v(" /dev/sda\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# type 'p' to list existing partitions")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# type 'd' to delete currently selected partitions")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# type 'n' to create a new partition")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# type 'w' to write the new partition table and exit fdisk")]),t._v("\n")])])]),a("p",[t._v("Format the new partition on your SSD:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("mkfs.ext4 /dev/sda1\n")])])]),a("p",[t._v("Configure the SSD partition to auto-mount at bootup:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("mkfs.ext4 /dev/sda1\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" /mnt/usb\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("UUID")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" blkid "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" UUID "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" value /dev/sda1"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v('"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UUID='),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$UUID")]),t._v(' /mnt/usb ext4 defaults,noatime,nofail 0 0"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("tee")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v(" /etc/fstab\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mount")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v("\n")])])]),a("p",[t._v("While you’re editing "),a("code",[t._v("/etc/fstab")]),t._v(" add a RAM filesystem for logs (optional).\nThis is also to prevent burning out your SD card too quickly:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'none /var/log tmpfs size=10M,noatime 0 0'")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" /etc/fstab\n")])])]),a("h3",{attrs:{id:"install-docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-docker"}},[t._v("#")]),t._v(" Install Docker")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" apt-transport-https ca-certificates "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" gnupg lsb-release "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-fsSL")]),t._v(" https://download.docker.com/linux/debian/gpg "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--dearmor")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" /usr/share/keyrings/docker-archive-keyring.gpg\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"deb [arch='),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("dpkg --print-architecture"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \\\n "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("lsb_release "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-cs")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(' stable"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("tee")]),t._v(" /etc/apt/sources.list.d/docker.list "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" /dev/null\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" docker-ce docker-ce-cli containerd.io\n")])])]),a("h3",{attrs:{id:"create-mount-for-docker-volumes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#create-mount-for-docker-volumes"}},[t._v("#")]),t._v(" Create mount for Docker volumes")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-rf")]),t._v(" /var/lib/docker\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /var/lib/docker\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mount")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bind")]),t._v(" /mnt/usb /var/lib/docker\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/mnt/usb /var/lib/docker none bind,nobootwait 0 2"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" /etc/fstab\nsystemctl restart "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v("\n")])])]),a("h3",{attrs:{id:"configuring-the-firewall"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-firewall"}},[t._v("#")]),t._v(" Configuring the firewall")]),t._v(" "),a("p",[t._v("Install a firewall and allow SSH, HTTP, HTTPS, Bitcoin, and Lightning:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" ufw\nufw default deny incoming\nufw default allow outgoing\n")])])]),a("p",[t._v("This command allows SSH connections from internal networks only:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("ufw allow from "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.0")]),t._v(".0.0/8 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\nufw allow from "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("172.16")]),t._v(".0.0/12 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\nufw allow from "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.0/16 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\nufw allow from "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("169.254")]),t._v(".0.0/16 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\nufw allow from fc00::/7 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\nufw allow from fe80::/10 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\nufw allow from ff00::/8 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\n")])])]),a("p",[t._v("These ports need to be accessible from anywhere (The default subnet is 'any' unless you specify one):")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("ufw allow "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("80")]),t._v("/tcp\nufw allow "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("443")]),t._v("/tcp\nufw allow "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v("/tcp\nufw allow "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("9735")]),t._v("/tcp\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Enable the firewall")]),t._v("\nufw "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Verify the configuration")]),t._v("\nufw status\n")])])]),a("h3",{attrs:{id:"setup-btcpay-server"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#setup-btcpay-server"}},[t._v("#")]),t._v(" Setup BTCPay Server")]),t._v(" "),a("p",[t._v("Download BTCPay Server from GitHub:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ensure we are in root home")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" fail2ban "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/btcpayserver/btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver-docker\n")])])]),a("p",[t._v("Configure BTCPay by setting some "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker#environment-variables",target:"_blank",rel:"noopener noreferrer"}},[t._v("environment variables"),a("OutboundLink")],1),t._v(":")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAY_HOST")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btcpay.local"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("REVERSEPROXY_DEFAULT_HOST")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAY_HOST")]),t._v('"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("NBITCOIN_NETWORK")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mainnet"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_CRYPTO1")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btc"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_LIGHTNING")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"clightning"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_REVERSEPROXY")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nginx"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"opt-more-memory"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAY_ENABLE_SSH")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true\n")])])]),a("p",[t._v("If you want to use multiple hostnames, add them via the optional "),a("code",[t._v("BTCPAY_ADDITIONAL_HOSTS")]),t._v(" variable:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAY_ADDITIONAL_HOSTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btcpay.YourDomain.com"')]),t._v("\n")])])]),a("p",[t._v("In case you want to restrict access to your local network only, please note that you need to use a "),a("code",[t._v(".local")]),t._v(" domain.")]),t._v(" "),a("p",[t._v("Run the BTCPay installation:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),a("p",[t._v("It should be up and running within a few minutes. Try opening http://btcpay.local in your web browser. If everything is correct, you will see BTCPay Server front page.")]),t._v(" "),a("p",[t._v("Now, you just need to wait a day or so for the Bitcoin blockchain to "),a("RouterLink",{attrs:{to:"/FAQ/Synchronization/"}},[t._v("sync and full verify")]),t._v(". The bottom of the BTCPay Server web GUI will show a pop-up dialog box to monitor the progress.")],1),t._v(" "),a("h3",{attrs:{id:"fastsync-optional"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#fastsync-optional"}},[t._v("#")]),t._v(" FastSync (optional)")]),t._v(" "),a("p",[t._v("Please read very carefully to understand what "),a("RouterLink",{attrs:{to:"/Docker/fastsync/"}},[t._v("FastSync")]),t._v(" is and why it is important to verify the UTXO set yourself.")],1),t._v(" "),a("p",[t._v("By using FastSync, you are exposing yourself to attacks if a "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/README.md#what-are-the-downsides-of-fast-sync",target:"_blank",rel:"noopener noreferrer"}},[t._v("malicious UTXO set snapshot"),a("OutboundLink")],1),t._v(" is sent to you.\nIf you have another trusted node somewhere else, you can check the validity of the UTXO set gathered by FastSync by following "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/README.md#dont-trust-verify",target:"_blank",rel:"noopener noreferrer"}},[t._v("these instructions"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Stop BTCPay Server")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" /root/btcpayserver/btcpayserver-docker\n./btcpay-down.sh\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Import FastSync UTXO set")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" contrib/FastSync\n./load-utxo-set.sh\n")])])]),a("p",[t._v("FastSync currently takes about 30 minutes on a high-speed internet connection.\nAfter FastSync finishes, run the following command to restart BTCPay Server:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("/"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("\n./btcpay-up.sh\n")])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[67],{423:function(t,a,s){t.exports=s.p+"assets/img/rpi-imager.9299bfff.png"},424:function(t,a,s){t.exports=s.p+"assets/img/rpi-imager-advanced-settings.8bdd9c34.png"},804:function(t,a,s){"use strict";s.r(a);var e=s(17),r=Object(e.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"raspberry-pi-deployment"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#raspberry-pi-deployment"}},[t._v("#")]),t._v(" Raspberry Pi Deployment")]),t._v(" "),a("p",[t._v("This document guides you step by step on "),a("strong",[t._v("how to run BTCPay Server on a Raspberry Pi 4")]),t._v(".")]),t._v(" "),a("p",[t._v("The "),a("strong",[t._v("Raspberry Pi 4")]),t._v(" is currently the best low-cost single-board computer available.\nYou can "),a("strong",[t._v("use a Raspberry Pi 4 to run your BTCPay Server")]),t._v(" at home for around $150 worth of parts, described below.")]),t._v(" "),a("p",[t._v("Already have a Raspberry Pi 4 with the following specs?")]),t._v(" "),a("ul",[a("li",[t._v("4GB memory")]),t._v(" "),a("li",[t._v("1TB USB 3.0 SSD")]),t._v(" "),a("li",[t._v("16GB or greater SD card")])]),t._v(" "),a("p",[t._v("If so, you can go straight to the "),a("a",{attrs:{href:"#quickstart"}},[t._v("quickstart instructions")]),t._v(".\nOtherwise, here's what you need …")]),t._v(" "),a("h2",{attrs:{id:"required-hardware"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#required-hardware"}},[t._v("#")]),t._v(" Required Hardware")]),t._v(" "),a("h3",{attrs:{id:"raspberry-pi-4"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#raspberry-pi-4"}},[t._v("#")]),t._v(" Raspberry Pi 4")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://www.canakit.com/raspberry-pi-4-4gb.html",target:"_blank",rel:"noopener noreferrer"}},[t._v("Raspberry Pi 4 with "),a("strong",[t._v("4GB RAM")]),a("OutboundLink")],1),t._v(" (~$65)")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://www.amazon.com/dp/B073K14CVB/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Sandisk 16GB SD Card"),a("OutboundLink")],1),t._v(" (~$10)")])]),t._v(" "),a("p",[t._v("Don’t settle for only 1GB or 2GB of RAM. The "),a("strong",[t._v("4GB RAM")]),t._v(" version is harder to find than the other versions, but you absolutely want that "),a("strong",[t._v("4GB of RAM")]),t._v(" for a few extra bucks, and it’s totally worth spending a few extra minutes searching on the Internet to find a vendor that has the 4GB RAM version in stock. You’ll also need an "),a("strong",[t._v("SD card reader")]),t._v(" if you don’t already have one.")]),t._v(" "),a("h3",{attrs:{id:"data-storage-options"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#data-storage-options"}},[t._v("#")]),t._v(" Data Storage options")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://www.amazon.com/dp/B0874XN4D8/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Samsung SSD T7 1TB"),a("OutboundLink")],1),t._v(" (~$100)")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://www.amazon.com/dp/B071KGRXRG/",target:"_blank",rel:"noopener noreferrer"}},[t._v("SanDisk Ultra 3D 1TB"),a("OutboundLink")],1),t._v(" (~$100)")])]),t._v(" "),a("p",[t._v("A 1TB SSD allows you to keep a full copy of the Bitcoin blockchain.\nYou can also use BTCPay Server without a full copy of the Bitcoin blockchain by using the "),a("RouterLink",{attrs:{to:"/Docker/#how-i-can-prune-my-nodes"}},[t._v("pruning option")]),t._v(".")],1),t._v(" "),a("h3",{attrs:{id:"power-adapter-options"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#power-adapter-options"}},[t._v("#")]),t._v(" Power Adapter options")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://shop.pimoroni.com/products/raspberry-pi-official-usb-c-power-supply-us?variant=29391144648787",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official Raspberry Pi 4 USB-C Power Adapter 5.1V/3A for US"),a("OutboundLink")],1),t._v(" ($10)")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://shop.pimoroni.com/products/raspberry-pi-official-usb-c-power-supply-eu?variant=29391130624083",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official Raspberry Pi 4 USB-C Power Adapter 5.1V/3A for EU"),a("OutboundLink")],1),t._v(" ($10)")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://shop.pimoroni.com/products/raspberry-pi-official-usb-c-power-supply-au?variant=29391160737875",target:"_blank",rel:"noopener noreferrer"}},[t._v("Official Raspberry Pi 4 USB-C Power Adapter 5.1V/3A for AU"),a("OutboundLink")],1),t._v(" ($10)")])]),t._v(" "),a("p",[t._v("Don’t waste your time with random cheap power adapters from Amazon, or expect that the existing ones you have at home are going to work fine. The Raspberry Pi 4 has issues with unofficial adapters, and for only $10 it’s better to just "),a("strong",[t._v("get an official adapter")]),t._v(" instead of learning this the hard way.")]),t._v(" "),a("h3",{attrs:{id:"case-and-cooling-options"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#case-and-cooling-options"}},[t._v("#")]),t._v(" Case and Cooling options")]),t._v(" "),a("ul",[a("li",[a("a",{attrs:{href:"https://www.amazon.com/dp/B07WG4DW52/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Flirc Heatsink Case"),a("OutboundLink")],1),t._v(" (~$15)")]),t._v(" "),a("li",[a("a",{attrs:{href:"https://www.amazon.com/dp/B07VQRYTPR/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Passive cooling aluminum case"),a("OutboundLink")],1),t._v(" (~$15)")])]),t._v(" "),a("p",[t._v("Of course, using a case is totally optional, but we recommend one to protect your Raspberry Pi over the long-term.\nStrictly speaking, you don’t actually need a cooling solution, but you certainly "),a("strong",[t._v("want")]),t._v(" at least passive cooling.\nOnce the Raspberry PI core temperature reaches 70°C, it will throttle down the CPU.")]),t._v(" "),a("h2",{attrs:{id:"quickstart"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#quickstart"}},[t._v("#")]),t._v(" Quickstart")]),t._v(" "),a("p",[t._v("Download and open the latest "),a("a",{attrs:{href:"https://www.raspberrypi.com/software/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Raspberry Pi Imager"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("figure",[a("img",{attrs:{src:s(423),alt:"Raspberry Pi Imager",title:"Raspberry Pi Imager"}})]),t._v(" "),a("p",[t._v("Choose the following options:")]),t._v(" "),a("ul",[a("li",[t._v("Operating System: Raspberry Pi OS Lite (64-bit)\n"),a("ul",[a("li",[t._v('Find it via "Raspberry Pi OS (Other)"')])])]),t._v(" "),a("li",[t._v("Storage: Select your SD card")])]),t._v(" "),a("p",[t._v("Open the Advanced Settings via the button in the bottom right corner.")]),t._v(" "),a("figure",[a("img",{attrs:{src:s(424),alt:"Raspberry Pi Imager Advanced Settings",title:"Raspberry Pi Imager Advanced Settings"}})]),t._v(" "),a("p",[t._v("Advanced Settings:")]),t._v(" "),a("ul",[a("li",[t._v("Set the hostname to what you like, this guide assumes "),a("code",[t._v("btcpay.local")]),t._v(".")]),t._v(" "),a("li",[t._v("Enabled SSH")]),t._v(" "),a("li",[t._v("Set username and password, this guide assumes "),a("code",[t._v("btcpay")]),t._v(" as username.")])]),t._v(" "),a("p",[t._v("Other settings are optional, you do not need to configure wireless LAN.")]),t._v(" "),a("p",[t._v('Close the Advanced Settings and click the "Write" button.')]),t._v(" "),a("h3",{attrs:{id:"setting-up-the-raspberry-pi"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-the-raspberry-pi"}},[t._v("#")]),t._v(" Setting up the Raspberry Pi")]),t._v(" "),a("p",[t._v("Once the image is written to the SD card, you can eject it and insert it into the Raspberry Pi.\nConnect the SSD and network cable to the Raspberry Pi.\nAt last, connect the power cable ­— this starts the boot process.\nIt should boot up and get an IP address using DHCP.")]),t._v(" "),a("p",[t._v("Login to the Raspberry Pi using the credentials you configured in the Raspberry Pi Imager:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ssh")]),t._v(" btcpay@btcpay.local\n")])])]),a("p",[t._v("Confirm the "),a("code",[t._v("Are you sure you want to continue connecting?")]),t._v(" question with "),a("code",[t._v("yes")])]),t._v(" "),a("p",[t._v("If your Raspberry Pi cannot be found by the "),a("code",[t._v("btcpay.local")]),t._v(" address, you will need to login to your router to find its IP address.\nThe IP address that my Raspberry Pi got was "),a("code",[t._v("192.168.1.5")]),t._v(".")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("ssh")]),t._v(" btcpay@192.168.1.5\n")])])]),a("p",[t._v("Switch to the "),a("code",[t._v("root")]),t._v(" user:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n")])])]),a("p",[t._v("Afterwards, you can choose between "),a("a",{attrs:{href:"https://github.com/lightningnetwork/lnd",target:"_blank",rel:"noopener noreferrer"}},[t._v("LND"),a("OutboundLink")],1),t._v(" and "),a("a",{attrs:{href:"https://github.com/ElementsProject/lightning",target:"_blank",rel:"noopener noreferrer"}},[t._v("Core Lightning"),a("OutboundLink")],1),t._v(" for your Lightning node.")]),t._v(" "),a("p",[a("strong",[t._v("Required:")]),t._v(" Choose one of the following …")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Core Lightning")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_LIGHTNING")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"clightning"')]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# LND")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_LIGHTNING")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"lnd"')]),t._v("\n")])])]),a("p",[a("strong",[t._v("Optional:")]),t._v(" You can also configure "),a("RouterLink",{attrs:{to:"/Docker/#environment-variables"}},[t._v("additional settings")]),t._v(" …")],1),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# optional, this is just an example for runing a pruned node on a public domain")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"opt-save-storage"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAY_ADDITIONAL_HOSTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btcpay.YourDomain.com"')]),t._v("\n")])])]),a("p",[t._v("Download and run the install script:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" btcpayserver-install.sh https://raw.githubusercontent.com/btcpayserver/btcpayserver-doc/master/scripts/btcpayserver-rpi4-install.sh\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" +x btcpayserver-install.sh\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" btcpayserver-install.sh\n")])])]),a("p",[t._v("After the initial setup is complete open a browser on another computer and go to "),a("code",[t._v("btcpay.local")]),t._v(".")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("Your installation is done and your node should have started synching.\nFor a Bitcoin full node the initial block download takes approximately 40 hours after install.")])]),t._v(" "),a("p",[t._v("If you are curious, here are the details of what the installation scripts above do …")]),t._v(" "),a("h2",{attrs:{id:"detailed-step-by-step-instructions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#detailed-step-by-step-instructions"}},[t._v("#")]),t._v(" Detailed Step by Step Instructions")]),t._v(" "),a("p",[t._v("These are the steps that follow after the general setup process outlined in the "),a("a",{attrs:{href:"#quickstart"}},[t._v("quickstart instructions")]),t._v(".")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("NOTE")]),t._v(" "),a("p",[t._v("The following steps require you to be the root user.")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("su")]),t._v(" -\n")])])])]),t._v(" "),a("h3",{attrs:{id:"upgrade-the-os-packages-to-latest"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#upgrade-the-os-packages-to-latest"}},[t._v("#")]),t._v(" Upgrade the OS packages to latest")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" upgrade "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" autoremove\n")])])]),a("h3",{attrs:{id:"configuring-the-storage"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-storage"}},[t._v("#")]),t._v(" Configuring the storage")]),t._v(" "),a("p",[t._v("We recommend to disable swap to prevent burning out your SD card:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("dphys-swapfile swapoff\ndphys-swapfile uninstall\nupdate-rc.d dphys-swapfile remove\nsystemctl disable dphys-swapfile\n")])])]),a("p",[t._v("Partition your SSD:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("fdisk")]),t._v(" /dev/sda\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# type 'p' to list existing partitions")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# type 'd' to delete currently selected partitions")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# type 'n' to create a new partition")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# type 'w' to write the new partition table and exit fdisk")]),t._v("\n")])])]),a("p",[t._v("Format the new partition on your SSD:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("mkfs.ext4 /dev/sda1\n")])])]),a("p",[t._v("Configure the SSD partition to auto-mount at bootup:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("mkfs.ext4 /dev/sda1\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" /mnt/usb\n"),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("UUID")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" blkid "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" UUID "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" value /dev/sda1"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v('"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"UUID='),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$UUID")]),t._v(' /mnt/usb ext4 defaults,noatime,nofail 0 0"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("tee")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v(" /etc/fstab\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mount")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v("\n")])])]),a("p",[t._v("While you’re editing "),a("code",[t._v("/etc/fstab")]),t._v(" add a RAM filesystem for logs (optional).\nThis is also to prevent burning out your SD card too quickly:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v("'none /var/log tmpfs size=10M,noatime 0 0'")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" /etc/fstab\n")])])]),a("h3",{attrs:{id:"install-docker"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#install-docker"}},[t._v("#")]),t._v(" Install Docker")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" apt-transport-https ca-certificates "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" gnupg lsb-release "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("curl")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-fsSL")]),t._v(" https://download.docker.com/linux/debian/gpg "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" gpg "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--dearmor")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" /usr/share/keyrings/docker-archive-keyring.gpg\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"deb [arch='),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("dpkg --print-architecture"),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \\\n "),a("span",{pre:!0,attrs:{class:"token variable"}},[a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),t._v("lsb_release "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-cs")]),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(' stable"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("tee")]),t._v(" /etc/apt/sources.list.d/docker.list "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" /dev/null\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" update\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" docker-ce docker-ce-cli containerd.io\n")])])]),a("h3",{attrs:{id:"create-mount-for-docker-volumes"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#create-mount-for-docker-volumes"}},[t._v("#")]),t._v(" Create mount for Docker volumes")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-rf")]),t._v(" /var/lib/docker\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /var/lib/docker\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("mount")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bind")]),t._v(" /mnt/usb /var/lib/docker\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("echo")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/mnt/usb /var/lib/docker none bind,nobootwait 0 2"')]),t._v(" "),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">>")]),t._v(" /etc/fstab\nsystemctl restart "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("docker")]),t._v("\n")])])]),a("h3",{attrs:{id:"configuring-the-firewall"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#configuring-the-firewall"}},[t._v("#")]),t._v(" Configuring the firewall")]),t._v(" "),a("p",[t._v("Install a firewall and allow SSH, HTTP, HTTPS, Bitcoin, and Lightning:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" ufw\nufw default deny incoming\nufw default allow outgoing\n")])])]),a("p",[t._v("This command allows SSH connections from internal networks only:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("ufw allow from "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("10.0")]),t._v(".0.0/8 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\nufw allow from "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("172.16")]),t._v(".0.0/12 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\nufw allow from "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("192.168")]),t._v(".0.0/16 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\nufw allow from "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("169.254")]),t._v(".0.0/16 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\nufw allow from fc00::/7 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\nufw allow from fe80::/10 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\nufw allow from ff00::/8 to any port "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(" proto tcp\n")])])]),a("p",[t._v("These ports need to be accessible from anywhere (The default subnet is 'any' unless you specify one):")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[t._v("ufw allow "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("80")]),t._v("/tcp\nufw allow "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("443")]),t._v("/tcp\nufw allow "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v("/tcp\nufw allow "),a("span",{pre:!0,attrs:{class:"token number"}},[t._v("9735")]),t._v("/tcp\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Enable the firewall")]),t._v("\nufw "),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("enable")]),t._v("\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Verify the configuration")]),t._v("\nufw status\n")])])]),a("h3",{attrs:{id:"setup-btcpay-server"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#setup-btcpay-server"}},[t._v("#")]),t._v(" Setup BTCPay Server")]),t._v(" "),a("p",[t._v("Download BTCPay Server from GitHub:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# ensure we are in root home")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" fail2ban "),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/btcpayserver/btcpayserver-docker\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver-docker\n")])])]),a("p",[t._v("Configure BTCPay by setting some "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker#environment-variables",target:"_blank",rel:"noopener noreferrer"}},[t._v("environment variables"),a("OutboundLink")],1),t._v(":")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAY_HOST")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btcpay.local"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("REVERSEPROXY_DEFAULT_HOST")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),a("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BTCPAY_HOST")]),t._v('"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("NBITCOIN_NETWORK")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mainnet"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_CRYPTO1")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btc"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_LIGHTNING")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"clightning"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_REVERSEPROXY")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"nginx"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAYGEN_ADDITIONAL_FRAGMENTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"opt-more-memory"')]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAY_ENABLE_SSH")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true\n")])])]),a("p",[t._v("If you want to use multiple hostnames, add them via the optional "),a("code",[t._v("BTCPAY_ADDITIONAL_HOSTS")]),t._v(" variable:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BTCPAY_ADDITIONAL_HOSTS")]),a("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),a("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btcpay.YourDomain.com"')]),t._v("\n")])])]),a("p",[t._v("In case you want to restrict access to your local network only, please note that you need to use a "),a("code",[t._v(".local")]),t._v(" domain.")]),t._v(" "),a("p",[t._v("Run the BTCPay installation:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v(" ./btcpay-setup.sh "),a("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v("\n")])])]),a("p",[t._v("It should be up and running within a few minutes. Try opening http://btcpay.local in your web browser. If everything is correct, you will see BTCPay Server front page.")]),t._v(" "),a("p",[t._v("Now, you just need to wait a day or so for the Bitcoin blockchain to "),a("RouterLink",{attrs:{to:"/FAQ/Synchronization/"}},[t._v("sync and full verify")]),t._v(". The bottom of the BTCPay Server web GUI will show a pop-up dialog box to monitor the progress.")],1),t._v(" "),a("h3",{attrs:{id:"fastsync-optional"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#fastsync-optional"}},[t._v("#")]),t._v(" FastSync (optional)")]),t._v(" "),a("p",[t._v("Please read very carefully to understand what "),a("RouterLink",{attrs:{to:"/Docker/fastsync/"}},[t._v("FastSync")]),t._v(" is and why it is important to verify the UTXO set yourself.")],1),t._v(" "),a("p",[t._v("By using FastSync, you are exposing yourself to attacks if a "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/README.md#what-are-the-downsides-of-fast-sync",target:"_blank",rel:"noopener noreferrer"}},[t._v("malicious UTXO set snapshot"),a("OutboundLink")],1),t._v(" is sent to you.\nIf you have another trusted node somewhere else, you can check the validity of the UTXO set gathered by FastSync by following "),a("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/blob/master/contrib/FastSync/README.md#dont-trust-verify",target:"_blank",rel:"noopener noreferrer"}},[t._v("these instructions"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Stop BTCPay Server")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" /root/btcpayserver/btcpayserver-docker\n./btcpay-down.sh\n\n"),a("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Import FastSync UTXO set")]),t._v("\n"),a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" contrib/FastSync\n./load-utxo-set.sh\n")])])]),a("p",[t._v("FastSync currently takes about 30 minutes on a high-speed internet connection.\nAfter FastSync finishes, run the following command to restart BTCPay Server:")]),t._v(" "),a("div",{staticClass:"language-bash extra-class"},[a("pre",{pre:!0,attrs:{class:"language-bash"}},[a("code",[a("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" "),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("/"),a("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("\n./btcpay-up.sh\n")])])])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/68.747dbff3.js b/assets/js/68.f7d2aae5.js similarity index 99% rename from assets/js/68.747dbff3.js rename to assets/js/68.f7d2aae5.js index 6dffbda294..740a772af1 100644 --- a/assets/js/68.747dbff3.js +++ b/assets/js/68.f7d2aae5.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{430:function(t,s,a){t.exports=a.p+"assets/img/plugin-builder-create-plugin.ee43a125.png"},431:function(t,s,a){t.exports=a.p+"assets/img/plugin-builder-create-build.f8541056.png"},817:function(t,s,a){"use strict";a.r(s);var e=a(17),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"plugins"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#plugins"}},[t._v("#")]),t._v(" Plugins")]),t._v(" "),s("p",[t._v("BTCPay Server Plugins are written in C#.\nThey extend the core functionality and run in the same context as the BTCPay Server code.\nAs a prerequisite for developing a plugin, you should be familiar with the "),s("RouterLink",{attrs:{to:"/Development/LocalDev/"}},[t._v("local development")]),t._v(" process.")],1),t._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#setup-of-a-new-plugin"}},[t._v("Setup of a new plugin")]),s("ul",[s("li",[s("a",{attrs:{href:"#plugin-reference"}},[t._v("Plugin reference")])])])]),s("li",[s("a",{attrs:{href:"#coding-a-plugin"}},[t._v("Coding a plugin")]),s("ul",[s("li",[s("a",{attrs:{href:"#assets"}},[t._v("Assets")])]),s("li",[s("a",{attrs:{href:"#database"}},[t._v("Database")])]),s("li",[s("a",{attrs:{href:"#ui-extension-points"}},[t._v("UI Extension Points")])]),s("li",[s("a",{attrs:{href:"#actions-and-filters"}},[t._v("Actions and Filters")])]),s("li",[s("a",{attrs:{href:"#authorization-and-permissions"}},[t._v("Authorization and Permissions")])]),s("li",[s("a",{attrs:{href:"#api"}},[t._v("API")])])])]),s("li",[s("a",{attrs:{href:"#publishing-the-plugin"}},[t._v("Publishing the plugin")])]),s("li",[s("a",{attrs:{href:"#resources"}},[t._v("Resources")])])])]),s("p"),t._v(" "),s("h2",{attrs:{id:"setup-of-a-new-plugin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup-of-a-new-plugin"}},[t._v("#")]),t._v(" Setup of a new plugin")]),t._v(" "),s("p",[t._v("Create a folder for the BTCPay Server projects. It will contain at least:")]),t._v(" "),s("ul",[s("li",[t._v("Your plugin repository")]),t._v(" "),s("li",[t._v("Your fork of the BTCPay Server repository")])]),t._v(" "),s("p",[t._v("You can get started by cloning the "),s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-plugin-template",target:"_blank",rel:"noopener noreferrer"}},[t._v("plugin template"),s("OutboundLink")],1),t._v(" or taking a look at "),s("a",{attrs:{href:"#resources"}},[t._v("existing plugins")]),t._v(".\nThis tutorial uses the plugin template as an example — substitute the references with your own plugin or simply follow along with the template.")]),t._v(" "),s("p",[t._v("The plugin repository should have BTCPay Server as a submodule.\nThis way you are able to reference BTCPay Server as a dependency, so that you can use the existing core classes and modules.\nStart by first building BTCPay Server and then your plugin to check that the references are working:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Clone the plugin template to a new directory called btcpayserver-my-plugin + make sure we get the contents of the submodule too")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone git@github.com:btcpayserver/btcpayserver-plugin-template.git --recurse-submodules btcpayserver-my-plugin\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Enter the dir")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver-my-plugin\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Build the BTCPay Server project inside the plugin repository")]),t._v("\ndotnet build btcpayserver\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Build your plugin, which references the BTCPay Server project")]),t._v("\ndotnet build BTCPayServer.Plugins.Template\n")])])]),s("p",[t._v("To develop your plugin you will need the BTCPay Server solution as the context:\nFork the "),s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("main repository"),s("OutboundLink")],1),t._v(" to your personal GitHub account and clone it onto your computer.")]),t._v(" "),s("p",[t._v("The folder structure should now look like this:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("_ btcpayserver "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# your fork")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("_ btcpayserver-plugin-template\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("_ btcpayserver "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# the submodule")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("_ BTCPayServer.Plugins.Template\n")])])]),s("p",[t._v("Before starting, rename "),s("code",[t._v("BTCPayServer.Plugins.Template")]),t._v(" to the name of your plugin.\nAlso rename the "),s("code",[t._v("BTCPayServer.Plugins.Template/BTCPayServer.Plugins.Template.csproj")]),t._v(" file.")]),t._v(" "),s("p",[t._v("In the csproj file, customize the plugin information, for example:")]),t._v(" "),s("div",{staticClass:"language-xml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("PropertyGroup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("Product")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Cool Plugin"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("Description")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("My plugin is doing nothing, but it's cool."),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("Version")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("1.0.0"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("h3",{attrs:{id:"plugin-reference"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#plugin-reference"}},[t._v("#")]),t._v(" Plugin reference")]),t._v(" "),s("p",[t._v("In the forked repository you can "),s("a",{attrs:{href:"https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-sln#add",target:"_blank",rel:"noopener noreferrer"}},[t._v("include your plugin in the solution"),s("OutboundLink")],1),t._v(" inside the "),s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/tree/master/Plugins/",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("Plugins")]),t._v(" subdirectory"),s("OutboundLink")],1),t._v(":")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Enter the forked BTCPay Server repository")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Add your plugin to the solution")]),t._v("\ndotnet sln "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("/btcpayserver-plugin-template/BTCPayServer.Plugins.Template "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" Plugins\n")])])]),s("p",[t._v("This references the plugin project in the folder, that sits right next to your BTCPay Server fork.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("The BTCPay Server dependency")]),t._v(" "),s("p",[t._v("Your plugin is part of the BTCPay Server solution then, but keep the following in mind:\nThe BTCPay Server version your plugin has as a dependecy is the submodule in the plugin repository — not the one in the forked repository.\nYou will need to update the submodule to access the latest version of BTCPay Server.")])]),t._v(" "),s("p",[t._v("To have the main project include the plugin whenever you run the app in development mode, you need to add the file "),s("code",[t._v("BTCPayServer/appsettings.dev.json")]),t._v(". It is ignored in the repository and references the local and built version of your plugin for debugging:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"DEBUG_PLUGINS"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/absolute/path/btcpayserver-plugin-template/BTCPay.Plugins.Template/bin/Debug/net6.0/BTCPayServer.Plugins.Template.dll"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("You need to reference the built DLL file with the absolute path of the build version of your plugin on your local file system.\nIf you want to reference multiple plugins, separate them using a semicolon.")]),t._v(" "),s("p",[t._v("Once that is set up, you should be able to build and run the app — see the startup message for potential problems.\nYour plugin should be included and also be ready for debugging.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Building the whole solution")]),t._v(" "),s("p",[t._v("You might want to setup a pre-build step in the solution, so that your plugins gets rebuild whenever you run the app.\nDo so by editing the run/debug configuration and choose the build the whole solution, instead of just the BTCPay Server project.")])]),t._v(" "),s("h2",{attrs:{id:"coding-a-plugin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#coding-a-plugin"}},[t._v("#")]),t._v(" Coding a plugin")]),t._v(" "),s("p",[t._v("More information on the following topics will be provided soon.\nFor now, these are the basics you should know about …")]),t._v(" "),s("h3",{attrs:{id:"assets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#assets"}},[t._v("#")]),t._v(" Assets")]),t._v(" "),s("p",[t._v("In order to reference assets (CSS, JavaScript and images), the plugin project needs to "),s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-plugin-template/blob/master/BTCPayServer.Plugins.Template/BTCPayServer.Plugins.Template.csproj#L32",target:"_blank",rel:"noopener noreferrer"}},[t._v("embed a "),s("code",[t._v("Resources")]),t._v(" folder"),s("OutboundLink")],1),t._v(" like this:")]),t._v(" "),s("div",{staticClass:"language-xml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ItemGroup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ProjectReference")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("Include")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("..\\btcpayserver\\BTCPayServer\\BTCPayServer.csproj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("EmbeddedResource")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("Include")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Resources\\**"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("Then you can reference the assets in your views like this:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("img")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("~/Resources/img/my.png"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("asp-append-version")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("true"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("~/Resources/js/my.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("asp-append-version")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("true"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("link")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("href")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("~/Resources/css/my.css"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("asp-append-version")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("true"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("rel")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("stylesheet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n")])])]),s("p",[t._v("A good example of this is the "),s("a",{attrs:{href:"https://github.com/Kukks/BTCPayServerPlugins/tree/master/Plugins/BTCPayServer.Plugins.BitcoinWhitepaper",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Whitepaper plugin"),s("OutboundLink")],1),t._v(" which exposes the bitcoin whitepaper PDF on your BTCPay Server using embedded resources.")]),t._v(" "),s("h3",{attrs:{id:"database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#database"}},[t._v("#")]),t._v(" Database")]),t._v(" "),s("p",[t._v("The main BTCPay Server database tables are part of the public schema.\nPlugins have their own database context and schema, named after the plugin:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyPluginDbContextFactory")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BaseDbContextFactory"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("MyPluginDbContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("MyPluginDbContextFactory")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOptions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("DatabaseOptions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" options"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("base")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("options"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BTCPayServer.Plugins.Template"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Plugins can have their own data models and migrations:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Add a new migration once you defined a new model or updates")]),t._v("\ndotnet ef migrations "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" MoreData "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" BTCPayServer.Plugins.Template "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" PluginDbContext "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" Data/Migrations\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Update the database")]),t._v("\ndotnet ef database update "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" BTCPayServer.Plugins.Template "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" PluginDbContext\n")])])]),s("p",[t._v("When inspecting the database (with "),s("code",[t._v("psql")]),t._v("), only the tables of the public schema are shown by default.\nIf you want to also see and select the plugin tables, you need to extend the search path:")]),t._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# list plugin schemas")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" pg_catalog"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pg_namespace "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WHERE")]),t._v(" nspname "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("LIKE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'BTCPayServer.%'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# extend search path")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SET")]),t._v(" search_path "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TO")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BTCPayServer.Plugins.Template"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# table list now also shows the template plugin tables")]),t._v("\n\\dt\n")])])]),s("h3",{attrs:{id:"ui-extension-points"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ui-extension-points"}},[t._v("#")]),t._v(" UI Extension Points")]),t._v(" "),s("p",[t._v("The extension points offer you ways to add your plugin views and partials to the UI.\nThey get defined in the plugin base class.\nThe following snippet shows how you can add a link to your plugin to the main navigation:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Plugin")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BaseBTCPayServerPlugin")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IServiceCollection")]),t._v(" services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSingleton")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("IUIExtension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("UIExtension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TemplatePluginHeaderNav"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"header-nav"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("In this case, "),s("code",[t._v("header-nav")]),t._v(" is the name of the extension point.\nYou can find the available extension points by searching for the "),s("code",[t._v("vc:ui-extension-point")]),t._v(" references inside the main app.\nFor the "),s("code",[t._v("header-nav")]),t._v(" the reference looks like this:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("vc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("ui"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("extension"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("point")]),t._v(" location"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"header-nav"')]),t._v(" model"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"@Model"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n")])])]),s("p",[t._v("The views and partials (i.e. "),s("code",[t._v("TemplatePluginHeaderNav.cshtml")]),t._v(") need to be located in the "),s("code",[t._v("Shared")]),t._v(" folder of your "),s("code",[t._v("Views")]),t._v(" or "),s("code",[t._v("Pages")]),t._v(" directory, so that the main app can find and include them.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Missing extension points")]),t._v(" "),s("p",[t._v("If you would like to extend the UI but an extension point is not available yet, feel free to open an issue with a request to add it.\nWe extend them as we move along, same with "),s("a",{attrs:{href:"#actions-and-filters"}},[t._v("actions and filters")]),t._v(" …")])]),t._v(" "),s("h3",{attrs:{id:"actions-and-filters"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#actions-and-filters"}},[t._v("#")]),t._v(" Actions and Filters")]),t._v(" "),s("p",[t._v("In addtion to the extention points which hook into the UI, you can also use the following hooks to modify and extend behaviour:")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Abstractions/Contracts/IPluginHookAction.cs",target:"_blank",rel:"noopener noreferrer"}},[t._v("Action"),s("OutboundLink")],1),t._v(": Extend the core functionality")]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Abstractions/Contracts/IPluginHookFilter.cs",target:"_blank",rel:"noopener noreferrer"}},[t._v("Filters"),s("OutboundLink")],1),t._v(": Do something and also return data")])]),t._v(" "),s("p",[t._v("As with the UI extention points, you can define them within the "),s("code",[t._v("Execute")]),t._v(" method of the plugin base class:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Plugin")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BaseBTCPayServerPlugin")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IServiceCollection")]),t._v(" services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSingleton")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("IPluginHookAction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" MyPluginAction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSingleton")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("IPluginHookFilter"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" MyPluginFilter"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Find the available hooks by searching for "),s("code",[t._v("ApplyAction")]),t._v(" and "),s("code",[t._v("ApplyFilter")]),t._v(" calls inside the main app.")]),t._v(" "),s("h3",{attrs:{id:"authorization-and-permissions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#authorization-and-permissions"}},[t._v("#")]),t._v(" Authorization and Permissions")]),t._v(" "),s("p",[t._v("You can reuse the "),s("code",[t._v("AuthenticationSchemes")]),t._v(" and "),s("code",[t._v("Policies")]),t._v(" of the main app:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Authorize users via their cookie login")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Authorize")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("AuthenticationSchemes "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" AuthenticationSchemes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Cookie"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Policy "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Policies"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("CanViewProfile"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UIPluginController")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Controller")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// GET might inherit CanViewProfile")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("HttpGet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("IActionResult"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Index")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("View")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// POST might require CanModifyProfile")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("HttpPost")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"update"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token attribute"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Authorize")]),s("span",{pre:!0,attrs:{class:"token attribute-arguments"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("AuthenticationSchemes "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" AuthenticationSchemes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Cookie"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Policy "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Policies"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("CanModifyProfile"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("IActionResult"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Modify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("RedirectToAction")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("nameof")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("To show certain parts of the UI depending on the permissions the user has, you can use the "),s("code",[t._v("permissions")]),t._v(" view tag helper:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("li")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("nav-item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("permission")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("@Policies.CanModifyProfile"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("h4",{attrs:{id:"customizing-authorization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#customizing-authorization"}},[t._v("#")]),t._v(" Customizing Authorization")]),t._v(" "),s("p",[t._v("You can also define your own "),s("code",[t._v("AuthenticationSchemes")]),t._v(" and "),s("code",[t._v("Policies")]),t._v(" within the "),s("code",[t._v("Execute")]),t._v(" method of the plugin base class:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Plugin")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BaseBTCPayServerPlugin")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IServiceCollection")]),t._v(" services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Add custom authentication scheme")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("AuthenticationBuilder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddScheme")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("PluginAuthenticationOptions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" PluginAuthenticationHandler"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n PluginAuthenticationSchemes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("AccessKey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _ "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Add custom policies")]),t._v("\n services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddAuthorization")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("opts "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("foreach")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" policy "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" PluginPolicies"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("AllPolicies"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n opts"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddPolicy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("policy"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" policyBuilder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" policyBuilder\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddRequirements")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("PolicyRequirement")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("policy"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("The custom policies might look like this:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginPolicies")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" CanViewWallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btcpay.plugin.template.canviewwallet"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" CanManageWallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btcpay.plugin.template.canmanagewallet"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("IEnumerable"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" AllPolicies\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" CanViewWallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" CanManageWallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"api"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#api"}},[t._v("#")]),t._v(" API")]),t._v(" "),s("p",[t._v("In case your plugin has an API and you want to add its OpenAPI documentation, add a class inheriting from our "),s("code",[t._v("ISwaggerProvider")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginSwaggerProvider")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISwaggerProvider")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("readonly")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IFileProvider")]),t._v(" _fileProvider"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("PluginSwaggerProvider")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IWebHostEnvironment")]),t._v(" webHostEnvironment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n _fileProvider "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" webHostEnvironment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("WebRootFileProvider"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("JObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JObject")]),t._v(" json "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" fi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" _fileProvider"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFileInfo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Resources/swagger/v1/swagger.template.plugin.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" stream "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("CreateReadStream")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" reader "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("StreamReader")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("fi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("CreateReadStream")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n json"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Merge")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" reader"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReadToEndAsync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" json"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("As you can see it references the Swagger files in "),s("code",[t._v("Resources/swagger/v1")]),t._v(" — you can add them just like other "),s("a",{attrs:{href:"#asset"}},[t._v("assets")]),t._v(".\nOnce that is done, your plugin API documentation should appear on the instance "),s("code",[t._v("/docs")]),t._v(" path alongside the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Greenfield API documentation"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"publishing-the-plugin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#publishing-the-plugin"}},[t._v("#")]),t._v(" Publishing the plugin")]),t._v(" "),s("p",[t._v("The plugins are published via the "),s("a",{attrs:{href:"https://plugin-builder.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("plugin builder"),s("OutboundLink")],1),t._v(".\nYou can sign up, build and submit new versions of your plugin using this web UI.")]),t._v(" "),s("figure",[s("img",{attrs:{src:a(430),alt:"Plugin Builder: Create a new plugin",title:"Plugin Builder: Create a new plugin"}})]),t._v(" "),s("p",[t._v("Once you have a new version ready, you can create a new build.\nTo do so, you will need to reference the Git repository of your plugin, as well as the branch and path of your plugin.")]),t._v(" "),s("figure",[s("img",{attrs:{src:a(431),alt:"Plugin Builder: Create a new build",title:"Plugin Builder: Create a new build"}})]),t._v(" "),s("p",[t._v("The result will be a packaged version of your plugin in "),s("code",[t._v("prerelease")]),t._v(" state.\nA version in prerelease can be modified just by rebuilding your plugin in the plugin builder.")]),t._v(" "),s("p",[t._v("You can browse the prereleased plugin list on any BTCPay Server by going to "),s("code",[t._v("Server Settings > Policies")]),t._v(", check "),s("code",[t._v("Show plugins in pre-release")]),t._v(" and "),s("code",[t._v("Save")]),t._v(".")]),t._v(" "),s("p",[t._v("Once you click the "),s("code",[t._v("Release")]),t._v(" button on the build page, the package won't be in prerelease anymore and it is visible to everyone. Once the package is released, you won't be able to publish a new build with the same version number. So you will need to bump the "),s("code",[t._v("")]),t._v(" of your plugin in the csproj before publishing any new adjustment to your plugin.")]),t._v(" "),s("h2",{attrs:{id:"resources"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resources"}},[t._v("#")]),t._v(" Resources")]),t._v(" "),s("p",[t._v("For more information check out these repositories with existing plugins:")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/Kukks/BTCPayServerPlugins",target:"_blank",rel:"noopener noreferrer"}},[t._v("kukks' plugins"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/rockstardev/BTCPayServerPlugins.RockstarDev",target:"_blank",rel:"noopener noreferrer"}},[t._v("rockstardev' plugins"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/dennisreimann/btcpayserver-plugin-lndhub-api",target:"_blank",rel:"noopener noreferrer"}},[t._v("LNDhub API"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/dennisreimann/btcpayserver-plugin-podserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("PodServer"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/saltrafael/trocador-plugin",target:"_blank",rel:"noopener noreferrer"}},[t._v("Trocador.app"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[68],{425:function(t,s,a){t.exports=a.p+"assets/img/plugin-builder-create-plugin.ee43a125.png"},426:function(t,s,a){t.exports=a.p+"assets/img/plugin-builder-create-build.f8541056.png"},816:function(t,s,a){"use strict";a.r(s);var e=a(17),n=Object(e.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"plugins"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#plugins"}},[t._v("#")]),t._v(" Plugins")]),t._v(" "),s("p",[t._v("BTCPay Server Plugins are written in C#.\nThey extend the core functionality and run in the same context as the BTCPay Server code.\nAs a prerequisite for developing a plugin, you should be familiar with the "),s("RouterLink",{attrs:{to:"/Development/LocalDev/"}},[t._v("local development")]),t._v(" process.")],1),t._v(" "),s("p"),s("div",{staticClass:"table-of-contents"},[s("ul",[s("li",[s("a",{attrs:{href:"#setup-of-a-new-plugin"}},[t._v("Setup of a new plugin")]),s("ul",[s("li",[s("a",{attrs:{href:"#plugin-reference"}},[t._v("Plugin reference")])])])]),s("li",[s("a",{attrs:{href:"#coding-a-plugin"}},[t._v("Coding a plugin")]),s("ul",[s("li",[s("a",{attrs:{href:"#assets"}},[t._v("Assets")])]),s("li",[s("a",{attrs:{href:"#database"}},[t._v("Database")])]),s("li",[s("a",{attrs:{href:"#ui-extension-points"}},[t._v("UI Extension Points")])]),s("li",[s("a",{attrs:{href:"#actions-and-filters"}},[t._v("Actions and Filters")])]),s("li",[s("a",{attrs:{href:"#authorization-and-permissions"}},[t._v("Authorization and Permissions")])]),s("li",[s("a",{attrs:{href:"#api"}},[t._v("API")])])])]),s("li",[s("a",{attrs:{href:"#publishing-the-plugin"}},[t._v("Publishing the plugin")])]),s("li",[s("a",{attrs:{href:"#resources"}},[t._v("Resources")])])])]),s("p"),t._v(" "),s("h2",{attrs:{id:"setup-of-a-new-plugin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#setup-of-a-new-plugin"}},[t._v("#")]),t._v(" Setup of a new plugin")]),t._v(" "),s("p",[t._v("Create a folder for the BTCPay Server projects. It will contain at least:")]),t._v(" "),s("ul",[s("li",[t._v("Your plugin repository")]),t._v(" "),s("li",[t._v("Your fork of the BTCPay Server repository")])]),t._v(" "),s("p",[t._v("You can get started by cloning the "),s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-plugin-template",target:"_blank",rel:"noopener noreferrer"}},[t._v("plugin template"),s("OutboundLink")],1),t._v(" or taking a look at "),s("a",{attrs:{href:"#resources"}},[t._v("existing plugins")]),t._v(".\nThis tutorial uses the plugin template as an example — substitute the references with your own plugin or simply follow along with the template.")]),t._v(" "),s("p",[t._v("The plugin repository should have BTCPay Server as a submodule.\nThis way you are able to reference BTCPay Server as a dependency, so that you can use the existing core classes and modules.\nStart by first building BTCPay Server and then your plugin to check that the references are working:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Clone the plugin template to a new directory called btcpayserver-my-plugin + make sure we get the contents of the submodule too")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone git@github.com:btcpayserver/btcpayserver-plugin-template.git --recurse-submodules btcpayserver-my-plugin\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Enter the dir")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver-my-plugin\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Build the BTCPay Server project inside the plugin repository")]),t._v("\ndotnet build btcpayserver\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Build your plugin, which references the BTCPay Server project")]),t._v("\ndotnet build BTCPayServer.Plugins.Template\n")])])]),s("p",[t._v("To develop your plugin you will need the BTCPay Server solution as the context:\nFork the "),s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("main repository"),s("OutboundLink")],1),t._v(" to your personal GitHub account and clone it onto your computer.")]),t._v(" "),s("p",[t._v("The folder structure should now look like this:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("_ btcpayserver "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# your fork")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("_ btcpayserver-plugin-template\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("_ btcpayserver "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# the submodule")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v("_ BTCPayServer.Plugins.Template\n")])])]),s("p",[t._v("Before starting, rename "),s("code",[t._v("BTCPayServer.Plugins.Template")]),t._v(" to the name of your plugin.\nAlso rename the "),s("code",[t._v("BTCPayServer.Plugins.Template/BTCPayServer.Plugins.Template.csproj")]),t._v(" file.")]),t._v(" "),s("p",[t._v("In the csproj file, customize the plugin information, for example:")]),t._v(" "),s("div",{staticClass:"language-xml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[t._v(" "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("PropertyGroup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("Product")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("Cool Plugin"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("Description")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("My plugin is doing nothing, but it's cool."),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("Version")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("1.0.0"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("h3",{attrs:{id:"plugin-reference"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#plugin-reference"}},[t._v("#")]),t._v(" Plugin reference")]),t._v(" "),s("p",[t._v("In the forked repository you can "),s("a",{attrs:{href:"https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-sln#add",target:"_blank",rel:"noopener noreferrer"}},[t._v("include your plugin in the solution"),s("OutboundLink")],1),t._v(" inside the "),s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/tree/master/Plugins/",target:"_blank",rel:"noopener noreferrer"}},[s("code",[t._v("Plugins")]),t._v(" subdirectory"),s("OutboundLink")],1),t._v(":")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Enter the forked BTCPay Server repository")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Add your plugin to the solution")]),t._v("\ndotnet sln "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v("/btcpayserver-plugin-template/BTCPayServer.Plugins.Template "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" Plugins\n")])])]),s("p",[t._v("This references the plugin project in the folder, that sits right next to your BTCPay Server fork.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("The BTCPay Server dependency")]),t._v(" "),s("p",[t._v("Your plugin is part of the BTCPay Server solution then, but keep the following in mind:\nThe BTCPay Server version your plugin has as a dependecy is the submodule in the plugin repository — not the one in the forked repository.\nYou will need to update the submodule to access the latest version of BTCPay Server.")])]),t._v(" "),s("p",[t._v("To have the main project include the plugin whenever you run the app in development mode, you need to add the file "),s("code",[t._v("BTCPayServer/appsettings.dev.json")]),t._v(". It is ignored in the repository and references the local and built version of your plugin for debugging:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"DEBUG_PLUGINS"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/absolute/path/btcpayserver-plugin-template/BTCPay.Plugins.Template/bin/Debug/net6.0/BTCPayServer.Plugins.Template.dll"')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("You need to reference the built DLL file with the absolute path of the build version of your plugin on your local file system.\nIf you want to reference multiple plugins, separate them using a semicolon.")]),t._v(" "),s("p",[t._v("Once that is set up, you should be able to build and run the app — see the startup message for potential problems.\nYour plugin should be included and also be ready for debugging.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Building the whole solution")]),t._v(" "),s("p",[t._v("You might want to setup a pre-build step in the solution, so that your plugins gets rebuild whenever you run the app.\nDo so by editing the run/debug configuration and choose the build the whole solution, instead of just the BTCPay Server project.")])]),t._v(" "),s("h2",{attrs:{id:"coding-a-plugin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#coding-a-plugin"}},[t._v("#")]),t._v(" Coding a plugin")]),t._v(" "),s("p",[t._v("More information on the following topics will be provided soon.\nFor now, these are the basics you should know about …")]),t._v(" "),s("h3",{attrs:{id:"assets"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#assets"}},[t._v("#")]),t._v(" Assets")]),t._v(" "),s("p",[t._v("In order to reference assets (CSS, JavaScript and images), the plugin project needs to "),s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-plugin-template/blob/master/BTCPayServer.Plugins.Template/BTCPayServer.Plugins.Template.csproj#L32",target:"_blank",rel:"noopener noreferrer"}},[t._v("embed a "),s("code",[t._v("Resources")]),t._v(" folder"),s("OutboundLink")],1),t._v(" like this:")]),t._v(" "),s("div",{staticClass:"language-xml extra-class"},[s("pre",{pre:!0,attrs:{class:"language-xml"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ItemGroup")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("ProjectReference")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("Include")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("..\\btcpayserver\\BTCPayServer\\BTCPayServer.csproj"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("EmbeddedResource")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("Include")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("Resources\\**"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("p",[t._v("Then you can reference the assets in your views like this:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("img")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("~/Resources/img/my.png"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("asp-append-version")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("true"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("script")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("src")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("~/Resources/js/my.js"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("asp-append-version")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("true"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token script"}}),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("link")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("href")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("~/Resources/css/my.css"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("asp-append-version")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("true"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("rel")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("stylesheet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("/>")])]),t._v("\n")])])]),s("p",[t._v("A good example of this is the "),s("a",{attrs:{href:"https://github.com/Kukks/BTCPayServerPlugins/tree/master/Plugins/BTCPayServer.Plugins.BitcoinWhitepaper",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Whitepaper plugin"),s("OutboundLink")],1),t._v(" which exposes the bitcoin whitepaper PDF on your BTCPay Server using embedded resources.")]),t._v(" "),s("h3",{attrs:{id:"database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#database"}},[t._v("#")]),t._v(" Database")]),t._v(" "),s("p",[t._v("The main BTCPay Server database tables are part of the public schema.\nPlugins have their own database context and schema, named after the plugin:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("MyPluginDbContextFactory")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BaseDbContextFactory"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("MyPluginDbContext"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("MyPluginDbContextFactory")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IOptions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("DatabaseOptions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" options"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("base")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("options"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BTCPayServer.Plugins.Template"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Plugins can have their own data models and migrations:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Add a new migration once you defined a new model or updates")]),t._v("\ndotnet ef migrations "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("add")]),t._v(" MoreData "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" BTCPayServer.Plugins.Template "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" PluginDbContext "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-o")]),t._v(" Data/Migrations\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Update the database")]),t._v("\ndotnet ef database update "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" BTCPayServer.Plugins.Template "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" PluginDbContext\n")])])]),s("p",[t._v("When inspecting the database (with "),s("code",[t._v("psql")]),t._v("), only the tables of the public schema are shown by default.\nIf you want to also see and select the plugin tables, you need to extend the search path:")]),t._v(" "),s("div",{staticClass:"language-sql extra-class"},[s("pre",{pre:!0,attrs:{class:"language-sql"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# list plugin schemas")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" pg_catalog"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("pg_namespace "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WHERE")]),t._v(" nspname "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("LIKE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'BTCPayServer.%'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# extend search path")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SET")]),t._v(" search_path "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TO")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"BTCPayServer.Plugins.Template"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# table list now also shows the template plugin tables")]),t._v("\n\\dt\n")])])]),s("h3",{attrs:{id:"ui-extension-points"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ui-extension-points"}},[t._v("#")]),t._v(" UI Extension Points")]),t._v(" "),s("p",[t._v("The extension points offer you ways to add your plugin views and partials to the UI.\nThey get defined in the plugin base class.\nThe following snippet shows how you can add a link to your plugin to the main navigation:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Plugin")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BaseBTCPayServerPlugin")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IServiceCollection")]),t._v(" services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSingleton")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("IUIExtension"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("UIExtension")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"TemplatePluginHeaderNav"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"header-nav"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("In this case, "),s("code",[t._v("header-nav")]),t._v(" is the name of the extension point.\nYou can find the available extension points by searching for the "),s("code",[t._v("vc:ui-extension-point")]),t._v(" references inside the main app.\nFor the "),s("code",[t._v("header-nav")]),t._v(" the reference looks like this:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("vc"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v("ui"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),t._v("extension"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("-")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("point")]),t._v(" location"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"header-nav"')]),t._v(" model"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"@Model"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("/")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v("\n")])])]),s("p",[t._v("The views and partials (i.e. "),s("code",[t._v("TemplatePluginHeaderNav.cshtml")]),t._v(") need to be located in the "),s("code",[t._v("Shared")]),t._v(" folder of your "),s("code",[t._v("Views")]),t._v(" or "),s("code",[t._v("Pages")]),t._v(" directory, so that the main app can find and include them.")]),t._v(" "),s("div",{staticClass:"custom-block tip"},[s("p",{staticClass:"custom-block-title"},[t._v("Missing extension points")]),t._v(" "),s("p",[t._v("If you would like to extend the UI but an extension point is not available yet, feel free to open an issue with a request to add it.\nWe extend them as we move along, same with "),s("a",{attrs:{href:"#actions-and-filters"}},[t._v("actions and filters")]),t._v(" …")])]),t._v(" "),s("h3",{attrs:{id:"actions-and-filters"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#actions-and-filters"}},[t._v("#")]),t._v(" Actions and Filters")]),t._v(" "),s("p",[t._v("In addtion to the extention points which hook into the UI, you can also use the following hooks to modify and extend behaviour:")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Abstractions/Contracts/IPluginHookAction.cs",target:"_blank",rel:"noopener noreferrer"}},[t._v("Action"),s("OutboundLink")],1),t._v(": Extend the core functionality")]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer.Abstractions/Contracts/IPluginHookFilter.cs",target:"_blank",rel:"noopener noreferrer"}},[t._v("Filters"),s("OutboundLink")],1),t._v(": Do something and also return data")])]),t._v(" "),s("p",[t._v("As with the UI extention points, you can define them within the "),s("code",[t._v("Execute")]),t._v(" method of the plugin base class:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Plugin")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BaseBTCPayServerPlugin")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IServiceCollection")]),t._v(" services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSingleton")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("IPluginHookAction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" MyPluginAction"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddSingleton")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("IPluginHookFilter"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" MyPluginFilter"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Find the available hooks by searching for "),s("code",[t._v("ApplyAction")]),t._v(" and "),s("code",[t._v("ApplyFilter")]),t._v(" calls inside the main app.")]),t._v(" "),s("h3",{attrs:{id:"authorization-and-permissions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#authorization-and-permissions"}},[t._v("#")]),t._v(" Authorization and Permissions")]),t._v(" "),s("p",[t._v("You can reuse the "),s("code",[t._v("AuthenticationSchemes")]),t._v(" and "),s("code",[t._v("Policies")]),t._v(" of the main app:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Authorize users via their cookie login")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Authorize")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("AuthenticationSchemes "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" AuthenticationSchemes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Cookie"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Policy "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Policies"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("CanViewProfile"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("UIPluginController")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Controller")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// GET might inherit CanViewProfile")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("HttpGet")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("IActionResult"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Index")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("View")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// POST might require CanModifyProfile")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("HttpPost")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"update"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token attribute"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Authorize")]),s("span",{pre:!0,attrs:{class:"token attribute-arguments"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("AuthenticationSchemes "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" AuthenticationSchemes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("Cookie"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" Policy "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" Policies"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("CanModifyProfile"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("IActionResult"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Modify")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("RedirectToAction")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("nameof")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Index"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("To show certain parts of the UI depending on the permissions the user has, you can use the "),s("code",[t._v("permissions")]),t._v(" view tag helper:")]),t._v(" "),s("div",{staticClass:"language-html extra-class"},[s("pre",{pre:!0,attrs:{class:"language-html"}},[s("code",[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("li")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("class")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("nav-item"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token attr-name"}},[t._v("permission")]),s("span",{pre:!0,attrs:{class:"token attr-value"}},[s("span",{pre:!0,attrs:{class:"token punctuation attr-equals"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')]),t._v("@Policies.CanModifyProfile"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v('"')])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token tag"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("")])]),t._v("\n")])])]),s("h4",{attrs:{id:"customizing-authorization"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#customizing-authorization"}},[t._v("#")]),t._v(" Customizing Authorization")]),t._v(" "),s("p",[t._v("You can also define your own "),s("code",[t._v("AuthenticationSchemes")]),t._v(" and "),s("code",[t._v("Policies")]),t._v(" within the "),s("code",[t._v("Execute")]),t._v(" method of the plugin base class:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("Plugin")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("BaseBTCPayServerPlugin")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("override")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("void")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Execute")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IServiceCollection")]),t._v(" services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Add custom authentication scheme")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" builder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("AuthenticationBuilder")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n builder"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token generic-method"}},[s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddScheme")]),s("span",{pre:!0,attrs:{class:"token generic class-name"}},[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("PluginAuthenticationOptions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" PluginAuthenticationHandler"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])])]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("\n PluginAuthenticationSchemes"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("AccessKey"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" _ "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("// Add custom policies")]),t._v("\n services"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddAuthorization")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("opts "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("foreach")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" policy "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("in")]),t._v(" PluginPolicies"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("AllPolicies"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n opts"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddPolicy")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("policy"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" policyBuilder "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=>")]),t._v(" policyBuilder\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("AddRequirements")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("PolicyRequirement")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("policy"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("The custom policies might look like this:")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginPolicies")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" CanViewWallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btcpay.plugin.template.canviewwallet"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("const")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")])]),t._v(" CanManageWallet "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"btcpay.plugin.template.canmanagewallet"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("static")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("IEnumerable"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("string")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" AllPolicies\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("get")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" CanViewWallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("yield")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" CanManageWallet"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h3",{attrs:{id:"api"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#api"}},[t._v("#")]),t._v(" API")]),t._v(" "),s("p",[t._v("In case your plugin has an API and you want to add its OpenAPI documentation, add a class inheriting from our "),s("code",[t._v("ISwaggerProvider")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-csharp extra-class"},[s("pre",{pre:!0,attrs:{class:"language-csharp"}},[s("code",[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("class")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("PluginSwaggerProvider")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token type-list"}},[s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("ISwaggerProvider")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("private")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("readonly")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IFileProvider")]),t._v(" _fileProvider"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("PluginSwaggerProvider")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("IWebHostEnvironment")]),t._v(" webHostEnvironment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n _fileProvider "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" webHostEnvironment"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("WebRootFileProvider"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("public")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("async")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token return-type class-name"}},[t._v("Task"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("<")]),t._v("JObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(">")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Fetch")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[t._v("JObject")]),t._v(" json "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" fi "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" _fileProvider"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("GetFileInfo")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Resources/swagger/v1/swagger.template.plugin.json"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" stream "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" fi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("CreateReadStream")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("using")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token class-name"}},[s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("var")])]),t._v(" reader "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("new")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token constructor-invocation class-name"}},[t._v("StreamReader")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("fi"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("CreateReadStream")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n json"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Merge")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("JObject"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("Parse")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("await")]),t._v(" reader"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ReadToEndAsync")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("return")]),t._v(" json"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("As you can see it references the Swagger files in "),s("code",[t._v("Resources/swagger/v1")]),t._v(" — you can add them just like other "),s("a",{attrs:{href:"#asset"}},[t._v("assets")]),t._v(".\nOnce that is done, your plugin API documentation should appear on the instance "),s("code",[t._v("/docs")]),t._v(" path alongside the "),s("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Greenfield API documentation"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h2",{attrs:{id:"publishing-the-plugin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#publishing-the-plugin"}},[t._v("#")]),t._v(" Publishing the plugin")]),t._v(" "),s("p",[t._v("The plugins are published via the "),s("a",{attrs:{href:"https://plugin-builder.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("plugin builder"),s("OutboundLink")],1),t._v(".\nYou can sign up, build and submit new versions of your plugin using this web UI.")]),t._v(" "),s("figure",[s("img",{attrs:{src:a(425),alt:"Plugin Builder: Create a new plugin",title:"Plugin Builder: Create a new plugin"}})]),t._v(" "),s("p",[t._v("Once you have a new version ready, you can create a new build.\nTo do so, you will need to reference the Git repository of your plugin, as well as the branch and path of your plugin.")]),t._v(" "),s("figure",[s("img",{attrs:{src:a(426),alt:"Plugin Builder: Create a new build",title:"Plugin Builder: Create a new build"}})]),t._v(" "),s("p",[t._v("The result will be a packaged version of your plugin in "),s("code",[t._v("prerelease")]),t._v(" state.\nA version in prerelease can be modified just by rebuilding your plugin in the plugin builder.")]),t._v(" "),s("p",[t._v("You can browse the prereleased plugin list on any BTCPay Server by going to "),s("code",[t._v("Server Settings > Policies")]),t._v(", check "),s("code",[t._v("Show plugins in pre-release")]),t._v(" and "),s("code",[t._v("Save")]),t._v(".")]),t._v(" "),s("p",[t._v("Once you click the "),s("code",[t._v("Release")]),t._v(" button on the build page, the package won't be in prerelease anymore and it is visible to everyone. Once the package is released, you won't be able to publish a new build with the same version number. So you will need to bump the "),s("code",[t._v("")]),t._v(" of your plugin in the csproj before publishing any new adjustment to your plugin.")]),t._v(" "),s("h2",{attrs:{id:"resources"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#resources"}},[t._v("#")]),t._v(" Resources")]),t._v(" "),s("p",[t._v("For more information check out these repositories with existing plugins:")]),t._v(" "),s("ul",[s("li",[s("a",{attrs:{href:"https://github.com/Kukks/BTCPayServerPlugins",target:"_blank",rel:"noopener noreferrer"}},[t._v("kukks' plugins"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/rockstardev/BTCPayServerPlugins.RockstarDev",target:"_blank",rel:"noopener noreferrer"}},[t._v("rockstardev' plugins"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/dennisreimann/btcpayserver-plugin-lndhub-api",target:"_blank",rel:"noopener noreferrer"}},[t._v("LNDhub API"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/dennisreimann/btcpayserver-plugin-podserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("PodServer"),s("OutboundLink")],1)]),t._v(" "),s("li",[s("a",{attrs:{href:"https://github.com/saltrafael/trocador-plugin",target:"_blank",rel:"noopener noreferrer"}},[t._v("Trocador.app"),s("OutboundLink")],1)])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/69.c57daaf1.js b/assets/js/69.82dc139e.js similarity index 99% rename from assets/js/69.c57daaf1.js rename to assets/js/69.82dc139e.js index a68a579cb5..377d82e4cf 100644 --- a/assets/js/69.c57daaf1.js +++ b/assets/js/69.82dc139e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{433:function(t,e,s){t.exports=s.p+"assets/img/BrandingTheme.485689d7.png"},434:function(t,e,s){t.exports=s.p+"assets/img/CustomTheme.f81af671.png"},820:function(t,e,s){"use strict";s.r(e);var a=s(17),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"customizing-themes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#customizing-themes"}},[t._v("#")]),t._v(" Customizing themes")]),t._v(" "),e("p",[t._v("BTCPay Server is built on Bootstrap and offers the flexibility to adjust its look to your needs.\nLearn more about the "),e("a",{attrs:{href:"https://design.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("standard design specifications used in BTCPay"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"developing-and-extending-a-custom-theme"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#developing-and-extending-a-custom-theme"}},[t._v("#")]),t._v(" Developing and extending a custom theme")]),t._v(" "),e("p",[t._v("The BTCPay Server user interface is built on a "),e("strong",[t._v("customized version of Bootstrap")]),t._v(" that supports "),e("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/CSS/--*",target:"_blank",rel:"noopener noreferrer"}},[t._v("CSS custom properties"),e("OutboundLink")],1),t._v(".\nThis allows us to change theme related settings like fonts and colors without affecting the "),e("a",{attrs:{href:"#notes-on-bootstrap-css"}},[e("code",[t._v("bootstrap.css")])]),t._v(".\nAlso we can provide just the relevant customized parts instead of shipping a whole "),e("code",[t._v("bootstrap.css")]),t._v(" file for each theme.")]),t._v(" "),e("p",[t._v("Take a look at the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/wwwroot/main/themes/",target:"_blank",rel:"noopener noreferrer"}},[t._v("predefined themes"),e("OutboundLink")],1),t._v(" to get an overview of this approach.")]),t._v(" "),e("h3",{attrs:{id:"modifying-existing-themes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modifying-existing-themes"}},[t._v("#")]),t._v(" Modifying existing themes")]),t._v(" "),e("p",[t._v("The custom property definitions in the "),e("code",[t._v(":root")]),t._v(" selector are divided into several sections, that can be seen as a cascade:")]),t._v(" "),e("ul",[e("li",[t._v("The first section contains general definitions (i.e. for custom brand and neutral colors).")]),t._v(" "),e("li",[t._v("The second section defines variables for specific purposes.\nHere you can map the general definitions or create additional ones.")]),t._v(" "),e("li",[t._v("The third section contains definitions for specific parts of the page, sections or components.\nHere you should try to reuse definitions from above as much as possible to provide a consistent look and feel.")])]),t._v(" "),e("p",[t._v("The variables defined in a theme file get used in the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/wwwroot/main/site.css",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("site.css")]),e("OutboundLink")],1),t._v(" file.")]),t._v(" "),e("h4",{attrs:{id:"overriding-bootstrap-selectors"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overriding-bootstrap-selectors"}},[t._v("#")]),t._v(" Overriding Bootstrap selectors")]),t._v(" "),e("p",[t._v("In addition to the variables you can also provide styles by directly "),e("strong",[t._v("adding CSS selectors")]),t._v(" to this file.\nThis can be seen as a last resort in case there is no variable for something you want to change or some minor tweaking.")]),t._v(" "),e("h4",{attrs:{id:"adding-theme-variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-theme-variables"}},[t._v("#")]),t._v(" Adding theme variables")]),t._v(" "),e("p",[t._v("In general it is a good idea to introduce "),e("strong",[t._v("specific variables")]),t._v(" for special purposes (like setting the link colors of a specific section).\nThis allows us to address individual portions of the styles without affecting other parts which might be tight to a general variable.")]),t._v(" "),e("p",[t._v("For cases in which you want to introduce new variables that are used across all themes, add them to the "),e("code",[t._v("site.css")]),t._v(" file.\nThis file contains our modifications of the Bootstrap styles.\nRefrain from modifying "),e("code",[t._v("bootstrap.css")]),t._v(" directly – see the "),e("a",{attrs:{href:"#notes-on-bootstrap-css"}},[t._v("additional notes")]),t._v(" for the reasoning behind this.")]),t._v(" "),e("h4",{attrs:{id:"adding-a-new-theme"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-a-new-theme"}},[t._v("#")]),t._v(" Adding a new theme")]),t._v(" "),e("p",[t._v("You should copy one of our predefined themes and change the variables to fit your needs.")]),t._v(" "),e("p",[t._v("To test and play around with the adjustments, you can also use the developer tools of the browser:\nInspect the "),e("code",[t._v("")]),t._v(" element and modify the variables in the "),e("code",[t._v(":root")]),t._v(" section of the styles inspector.")]),t._v(" "),e("p",[t._v("In most cases it should suffice to adapt the primary colors like this:")]),t._v(" "),e("div",{staticClass:"language-css extra-class"},[e("pre",{pre:!0,attrs:{class:"language-css"}},[e("code",[e("span",{pre:!0,attrs:{class:"token selector"}},[t._v(":root")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-100")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #fef3e6"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-200")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #fcdcb5"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-300")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #fbc584"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-400")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #f9ae53"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-500")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #f79621"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-600")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #de7d08"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-700")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #ac6106"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-800")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #7b4504"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-900")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #4a2a03"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-rgb")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" 247"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("150"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("33"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-accent-rgb")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" 222"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" 125"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" 8"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rgb")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("var")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("--btcpay-primary-rgb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-accent")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rgb")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("var")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("--btcpay-primary-accent-rgb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-shadow")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rgba")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("var")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("--btcpay-primary-rgb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" .5"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("Once you are done adapting, save the CSS as a file and upload it on the "),e("code",[t._v("Server Settings > Branding")]),t._v(" page:")]),t._v(" "),e("figure",[e("img",{attrs:{src:s(433),alt:"CustomTheme",title:"CustomTheme"}})]),t._v(" "),e("p",[t._v("The theme will be applied on upload.\nWith the example above, the section looks like this after applying the custom theme:")]),t._v(" "),e("figure",[e("img",{attrs:{src:s(434),alt:"CustomTheme",title:"CustomTheme"}})])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[69],{433:function(t,e,s){t.exports=s.p+"assets/img/BrandingTheme.485689d7.png"},434:function(t,e,s){t.exports=s.p+"assets/img/CustomTheme.f81af671.png"},819:function(t,e,s){"use strict";s.r(e);var a=s(17),n=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"customizing-themes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#customizing-themes"}},[t._v("#")]),t._v(" Customizing themes")]),t._v(" "),e("p",[t._v("BTCPay Server is built on Bootstrap and offers the flexibility to adjust its look to your needs.\nLearn more about the "),e("a",{attrs:{href:"https://design.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("standard design specifications used in BTCPay"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"developing-and-extending-a-custom-theme"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#developing-and-extending-a-custom-theme"}},[t._v("#")]),t._v(" Developing and extending a custom theme")]),t._v(" "),e("p",[t._v("The BTCPay Server user interface is built on a "),e("strong",[t._v("customized version of Bootstrap")]),t._v(" that supports "),e("a",{attrs:{href:"https://developer.mozilla.org/en-US/docs/Web/CSS/--*",target:"_blank",rel:"noopener noreferrer"}},[t._v("CSS custom properties"),e("OutboundLink")],1),t._v(".\nThis allows us to change theme related settings like fonts and colors without affecting the "),e("a",{attrs:{href:"#notes-on-bootstrap-css"}},[e("code",[t._v("bootstrap.css")])]),t._v(".\nAlso we can provide just the relevant customized parts instead of shipping a whole "),e("code",[t._v("bootstrap.css")]),t._v(" file for each theme.")]),t._v(" "),e("p",[t._v("Take a look at the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/wwwroot/main/themes/",target:"_blank",rel:"noopener noreferrer"}},[t._v("predefined themes"),e("OutboundLink")],1),t._v(" to get an overview of this approach.")]),t._v(" "),e("h3",{attrs:{id:"modifying-existing-themes"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#modifying-existing-themes"}},[t._v("#")]),t._v(" Modifying existing themes")]),t._v(" "),e("p",[t._v("The custom property definitions in the "),e("code",[t._v(":root")]),t._v(" selector are divided into several sections, that can be seen as a cascade:")]),t._v(" "),e("ul",[e("li",[t._v("The first section contains general definitions (i.e. for custom brand and neutral colors).")]),t._v(" "),e("li",[t._v("The second section defines variables for specific purposes.\nHere you can map the general definitions or create additional ones.")]),t._v(" "),e("li",[t._v("The third section contains definitions for specific parts of the page, sections or components.\nHere you should try to reuse definitions from above as much as possible to provide a consistent look and feel.")])]),t._v(" "),e("p",[t._v("The variables defined in a theme file get used in the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/BTCPayServer/wwwroot/main/site.css",target:"_blank",rel:"noopener noreferrer"}},[e("code",[t._v("site.css")]),e("OutboundLink")],1),t._v(" file.")]),t._v(" "),e("h4",{attrs:{id:"overriding-bootstrap-selectors"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#overriding-bootstrap-selectors"}},[t._v("#")]),t._v(" Overriding Bootstrap selectors")]),t._v(" "),e("p",[t._v("In addition to the variables you can also provide styles by directly "),e("strong",[t._v("adding CSS selectors")]),t._v(" to this file.\nThis can be seen as a last resort in case there is no variable for something you want to change or some minor tweaking.")]),t._v(" "),e("h4",{attrs:{id:"adding-theme-variables"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-theme-variables"}},[t._v("#")]),t._v(" Adding theme variables")]),t._v(" "),e("p",[t._v("In general it is a good idea to introduce "),e("strong",[t._v("specific variables")]),t._v(" for special purposes (like setting the link colors of a specific section).\nThis allows us to address individual portions of the styles without affecting other parts which might be tight to a general variable.")]),t._v(" "),e("p",[t._v("For cases in which you want to introduce new variables that are used across all themes, add them to the "),e("code",[t._v("site.css")]),t._v(" file.\nThis file contains our modifications of the Bootstrap styles.\nRefrain from modifying "),e("code",[t._v("bootstrap.css")]),t._v(" directly – see the "),e("a",{attrs:{href:"#notes-on-bootstrap-css"}},[t._v("additional notes")]),t._v(" for the reasoning behind this.")]),t._v(" "),e("h4",{attrs:{id:"adding-a-new-theme"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#adding-a-new-theme"}},[t._v("#")]),t._v(" Adding a new theme")]),t._v(" "),e("p",[t._v("You should copy one of our predefined themes and change the variables to fit your needs.")]),t._v(" "),e("p",[t._v("To test and play around with the adjustments, you can also use the developer tools of the browser:\nInspect the "),e("code",[t._v("")]),t._v(" element and modify the variables in the "),e("code",[t._v(":root")]),t._v(" section of the styles inspector.")]),t._v(" "),e("p",[t._v("In most cases it should suffice to adapt the primary colors like this:")]),t._v(" "),e("div",{staticClass:"language-css extra-class"},[e("pre",{pre:!0,attrs:{class:"language-css"}},[e("code",[e("span",{pre:!0,attrs:{class:"token selector"}},[t._v(":root")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-100")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #fef3e6"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-200")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #fcdcb5"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-300")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #fbc584"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-400")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #f9ae53"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-500")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #f79621"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-600")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #de7d08"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-700")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #ac6106"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-800")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #7b4504"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-900")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" #4a2a03"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-rgb")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" 247"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("150"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("33"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-accent-rgb")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" 222"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" 125"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" 8"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rgb")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("var")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("--btcpay-primary-rgb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-accent")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rgb")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("var")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("--btcpay-primary-accent-rgb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v("--btcpay-primary-shadow")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rgba")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("var")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("--btcpay-primary-rgb"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" .5"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("Once you are done adapting, save the CSS as a file and upload it on the "),e("code",[t._v("Server Settings > Branding")]),t._v(" page:")]),t._v(" "),e("figure",[e("img",{attrs:{src:s(433),alt:"CustomTheme",title:"CustomTheme"}})]),t._v(" "),e("p",[t._v("The theme will be applied on upload.\nWith the example above, the section looks like this after applying the custom theme:")]),t._v(" "),e("figure",[e("img",{attrs:{src:s(434),alt:"CustomTheme",title:"CustomTheme"}})])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/70.cbc81b59.js b/assets/js/70.d6ab05ec.js similarity index 99% rename from assets/js/70.cbc81b59.js rename to assets/js/70.d6ab05ec.js index dcec12ac91..bf3bfa6c4b 100644 --- a/assets/js/70.cbc81b59.js +++ b/assets/js/70.d6ab05ec.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{435:function(e,t,a){e.exports=a.p+"assets/img/btcpay-authorize-app-api-key.7a407a00.png"},436:function(e,t,a){e.exports=a.p+"assets/img/btcpay-checkout-flow-chart.1639f36e.png"},821:function(e,t,a){"use strict";a.r(t);var s=a(17),o=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"ecommerce-integration-guide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ecommerce-integration-guide"}},[e._v("#")]),e._v(" eCommerce Integration Guide")]),e._v(" "),t("p",[e._v("This document aims to give best practices and a guide on how to integrate BTCPay Server as a payment solution into eCommerce, ERP, Point of Sale or other systems. If you want to do a broader integration which also manages stores and users on BTCPay this guide is still useful as a starting point. You can find examples on how to manage your BTCPay Server headless via "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[e._v("cURL")]),e._v(", "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample-NodeJS/"}},[e._v("Node.js")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Development/GreenfieldExample-PHP/"}},[e._v("PHP")]),e._v(" in our docs.")],1),e._v(" "),t("h2",{attrs:{id:"table-of-contents"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#table-of-contents"}},[e._v("#")]),e._v(" Table of contents")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#table-of-contents"}},[e._v("Table of contents")])]),t("li",[t("a",{attrs:{href:"#general-information"}},[e._v("General information")])]),t("li",[t("a",{attrs:{href:"#greenfield-api-docs"}},[e._v("Greenfield API docs")])]),t("li",[t("a",{attrs:{href:"#authentication"}},[e._v("Authentication")]),t("ul",[t("li",[t("a",{attrs:{href:"#api-keys"}},[e._v("API Keys")])]),t("li",[t("a",{attrs:{href:"#permissions"}},[e._v("Permissions")])])])]),t("li",[t("a",{attrs:{href:"#setup-best-practices"}},[e._v("Setup best practices")]),t("ul",[t("li",[t("a",{attrs:{href:"#automatic-setup"}},[e._v("Automatic setup")])]),t("li",[t("a",{attrs:{href:"#manual-setup"}},[e._v("Manual setup")])])])]),t("li",[t("a",{attrs:{href:"#checkout-flow"}},[e._v("Checkout flow")]),t("ul",[t("li",[t("a",{attrs:{href:"#overview-of-the-checkout-flow"}},[e._v("Overview of the checkout flow")])]),t("li",[t("a",{attrs:{href:"#showing-btcpay-bitcoin-lightning-network-as-payment-gateway"}},[e._v("Showing BTCPay (Bitcoin / Lightning Network) as payment gateway")])]),t("li",[t("a",{attrs:{href:"#creating-an-invoice"}},[e._v("Creating an invoice")])]),t("li",[t("a",{attrs:{href:"#redirect"}},[e._v("Redirect")])]),t("li",[t("a",{attrs:{href:"#modal-invoice-page-advanced-optional"}},[e._v("Modal invoice page (advanced, optional)")])]),t("li",[t("a",{attrs:{href:"#validate-and-process-webhooks"}},[e._v("Validate and process webhooks")])]),t("li",[t("a",{attrs:{href:"#refunds"}},[e._v("Refunds")])])])]),t("li",[t("a",{attrs:{href:"#logging-debugging"}},[e._v("Logging / Debugging")])]),t("li",[t("a",{attrs:{href:"#data-scarcity"}},[e._v("Data scarcity")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"general-information"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general-information"}},[e._v("#")]),e._v(" General information")]),e._v(" "),t("p",[e._v("The general idea is to have a smooth setup for your users and a seamless checkout experience for their customers. By providing an automated setup wizard as described below you can avoid writing lots of documentation and make the process as easy as possible for your users.")]),e._v(" "),t("h2",{attrs:{id:"greenfield-api-docs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#greenfield-api-docs"}},[e._v("#")]),e._v(" Greenfield API docs")]),e._v(" "),t("p",[e._v("You can find the API documentation of our so-called Greenfield API "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(" (or on your BTCPay Server on the "),t("code",[e._v("/docs")]),e._v(" path). As a quick starter, we have covered the most basic eCommerce integration endpoints examples for "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[e._v("cURL")]),e._v(", "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample-NodeJS/"}},[e._v("Node.js")]),e._v(" and "),t("RouterLink",{attrs:{to:"/Development/GreenfieldExample-PHP/"}},[e._v("PHP")]),e._v(". We will refer to those examples throughout this document.")],1),e._v(" "),t("p",[e._v("In the examples below we use the our demo server "),t("a",{attrs:{href:"https://mainnet.demo.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://mainnet.demo.btcpayserver.org"),t("OutboundLink")],1),e._v(" as an example. On your integration, this will be the user provided BTCPay Server instance URL.")]),e._v(" "),t("h2",{attrs:{id:"authentication"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[e._v("#")]),e._v(" Authentication")]),e._v(" "),t("p",[e._v("Authentication can be done over Basic-Auth or API key. Using Basic-Auth is not recommended as it will always have full access of your user. With API keys you can give fine-grained permissions per store that can’t do much damage even if your API key is leaked.")]),e._v(" "),t("p",[t("strong",[e._v("Important")]),e._v(": the Authorization-Header is formatted like this:")]),e._v(" "),t("p",[t("code",[e._v("Authorization: token API_KEY")]),e._v("\n(Replace API_KEY with the actual API key)")]),e._v(" "),t("p",[e._v("Example using cURL:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-H")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Content-Type: application/json"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-H")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Authorization: token API_KEY"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-X")]),e._v(" GET "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"https://mainnet.demo.btcpayserver.org/api/v1/stores/STORE_ID"')]),e._v("\n")])])]),t("h3",{attrs:{id:"api-keys"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-keys"}},[e._v("#")]),e._v(" API Keys")]),e._v(" "),t("p",[e._v("You can generate API keys via the "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#tag/Authorization",target:"_blank",rel:"noopener noreferrer"}},[e._v("authorization endpoint"),t("OutboundLink")],1),e._v(" (as detailed below in "),t("a",{attrs:{href:"#automatic-setup"}},[e._v("automatic setup")]),e._v(") or for testing you can do so manually as described on "),t("a",{attrs:{href:"#manual-setup"}},[e._v("manual setup")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#permissions"}},[e._v("#")]),e._v(" Permissions")]),e._v(" "),t("p",[e._v("You need the following permissions for a typical eCommerce integration and as a starting point to process payments and refunds:")]),e._v(" "),t("p",[t("code",[e._v("btcpay.store.canviewinvoices")]),e._v(" "),t("br"),e._v(" "),t("code",[e._v("btcpay.store.cancreateinvoice")]),e._v(" "),t("br"),e._v(" "),t("code",[e._v("btcpay.store.canmodifyinvoices")]),e._v(" "),t("br"),e._v(" "),t("code",[e._v("btcpay.store.webhooks.canmodifywebhooks")]),e._v(" "),t("br"),e._v(" "),t("code",[e._v("btcpay.store.canviewstoresettings")]),e._v(" "),t("br"),e._v(" "),t("code",[e._v("btcpay.store.cancreatenonapprovedpullpayments")])]),e._v(" "),t("p",[e._v("This allows you to have the minimal needed permissions to create invoices, refunds and to programmatically register a webhook. You should also limit your API key to a specific store, otherwise the API key will work for all the stores of a user.")]),e._v(" "),t("h2",{attrs:{id:"setup-best-practices"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-best-practices"}},[e._v("#")]),e._v(" Setup best practices")]),e._v(" "),t("h3",{attrs:{id:"automatic-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automatic-setup"}},[e._v("#")]),e._v(" Automatic setup")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(435),alt:"Authorize App, API key generation",title:"Authorize App, API key generation"}})]),e._v(" "),t("p",[e._v("To make the connection flow between your eCommerce system and BTCPay Server as smooth and easy as possible for your users, you can guide them through a setup wizard. This means that ideally the user only enters the URL to their BTCPay Server instance (e.g. "),t("a",{attrs:{href:"https://mainnet.demo.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://mainnet.demo.btcpayserver.org"),t("OutboundLink")],1),e._v(') and clicks on a "'),t("em",[e._v("Connect BTCPay Server")]),e._v('" button that will start the following process:')]),e._v(" "),t("ul",[t("li",[e._v("User will get redirected to BTCPay Server authorization page")]),e._v(" "),t("li",[e._v("User logs in with their BTCPay Server account (if not already)")]),e._v(" "),t("li",[e._v("User selects the desired store (if they have multiple stores)")]),e._v(" "),t("li",[e._v("User can enter a label to identify the API key in their BTCPay Server account (optional)")]),e._v(" "),t("li",[e._v("Required permissions (see above screenshot) are already pre-filled for the user")]),e._v(" "),t("li",[e._v('When the user clicks "Authorize app" BTCPay will generate an API key with the permissions and bound to a single store and send it back to your eCommerce system')]),e._v(" "),t("li",[e._v("There you can process the returned payload which contains the API key and the store id")]),e._v(" "),t("li",[e._v("Using that API key you can register a webhook endpoint (of your eCommerce system) on the users store")]),e._v(" "),t("li",[e._v('That endpoint will return a webhook "secret" that you need later to store and use to validate incoming webhook events on invoice status changes')]),e._v(" "),t("li",[e._v("You store all those information in your eCommerce system and the setup is done")])]),e._v(" "),t("h4",{attrs:{id:"example-of-request-of-authorization-endpoint"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-of-request-of-authorization-endpoint"}},[e._v("#")]),e._v(" Example of request of "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/ApiKeys_Authorize",target:"_blank",rel:"noopener noreferrer"}},[e._v("Authorization endpoint"),t("OutboundLink")],1),e._v(":")]),e._v(" "),t("p",[t("strong",[e._v("Important")]),e._v(': "selectiveStores" needs to be set to true so the user has to explicitly select a store for which the API key will get permissions to. Otherwise the user can select multiple stores.')]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-H")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Content-Type: application/json"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-X")]),e._v(" GET "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"https://mainnet.demo.btcpayserver.org/api-keys/authorize?permissions=btcpay.store.canviewinvoices&permissions=btcpay.store.cancreateinvoice&permissions=btcpay.store.canmodifyinvoices&permissions=btcpay.store.webhooks.canmodifywebhooks&permissions=btcpay.store.canviewstoresettings&permissions=btcpay.store.cancreatenonapprovedpullpayments&strict=true&selectiveStores=true&applicationName=YourAppName&redirect=https://example.com/your-callback-url"')]),e._v("\n")])])]),t("h3",{attrs:{id:"manual-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manual-setup"}},[e._v("#")]),e._v(" Manual setup")]),e._v(" "),t("p",[e._v("You or your user can also create API keys manually in the BTCPay Server UI. That said, the automatic setup is more user-friendly and less error-prone. The manual setup is done as follows:")]),e._v(" "),t("ul",[t("li",[e._v("User logs into BTCPay Server instance")]),e._v(" "),t("li",[e._v('User clicks "'),t("em",[e._v("Account")]),e._v('" -> "'),t("em",[e._v("Manage Account")]),e._v('" -> "'),t("em",[e._v("API keys")]),e._v('"')]),e._v(" "),t("li",[e._v("Creates an API key with above-mentioned permissions, limited to a specific store")]),e._v(" "),t("li",[e._v("Copies the API key and store id to your form")]),e._v(" "),t("li",[e._v('Creates a webhook in store: "'),t("em",[e._v("Settings")]),e._v('" -> "'),t("em",[e._v("Webhooks")]),e._v('"; Copies the '),t("code",[e._v("secret")]),e._v(" into your settings form")])]),e._v(" "),t("h2",{attrs:{id:"checkout-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#checkout-flow"}},[e._v("#")]),e._v(" Checkout flow")]),e._v(" "),t("h3",{attrs:{id:"overview-of-the-checkout-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview-of-the-checkout-flow"}},[e._v("#")]),e._v(" Overview of the checkout flow")]),e._v(" "),t("p",[t("strong",[t("em",[e._v("Legend")])]),e._v(":")]),e._v(" "),t("p",[t("strong",[e._v("FE")]),e._v(": Frontend (your website/existing system) "),t("br"),e._v(" "),t("strong",[e._v("BE")]),e._v(": Backend (your website/existing system) "),t("br"),e._v(" "),t("strong",[e._v("BTCPay")]),e._v(": BTCPay Server instance hosted by yourself or a 3rd party")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(436),alt:"BTCPay checkout flow chart",title:"BTCPay checkout flow chart"}})]),e._v(" "),t("ol",[t("li",[e._v("FE: On checkout the user selects payment method (in this case e.g. Bitcoin (via BTCPay))")]),e._v(" "),t("li",[e._v("FE/BE: Checkout data is passed to BE and BE "),t("a",{attrs:{href:"#creating-an-invoice"}},[e._v("creates an invoice")]),e._v(" on BTCPay, your BE stores the invoice ID alongside your internal order or checkout id so it can be matched at a later point.")]),e._v(" "),t("li",[e._v("FE option 1: the customer gets redirected to BTCPay invoice page and sees the QR-code and payment options "),t("br"),e._v("\nFE option 2: the customer sees the BTCPay checkout page in an modal overlay")]),e._v(" "),t("li",[e._v("Customer pays the invoice")]),e._v(" "),t("li",[e._v('BTCPay: as soon as the payment is seen in the mempool (and the invoice is paid fully) BTCPay fires a webhook with the "InvoiceProcessing" event; BE needs to update the payment status to e.g. "pending", "approved", "on-hold"')]),e._v(" "),t("li",[e._v("Customer gets redirected to order-confirmation page either automatically or by clicking a button")]),e._v(" "),t("li",[e._v('BTCPay: depending on configured number of confirmations (defaults to 1 confirmation) BTCPay fires a webhook with the "InvoiceSettled" event; BE updates the order status to e.g. "paid", "settled"')])]),e._v(" "),t("p",[e._v("Note: the webhooks of 5. and 7. fire with an average 10 minute time gap, depending on when the next block is found for on-chain bitcoin transactions. For Lightning Network (off-chain) transactions those two events fire immediately after each other and the payment is settled.")]),e._v(" "),t("h3",{attrs:{id:"showing-btcpay-bitcoin-lightning-network-as-payment-gateway"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#showing-btcpay-bitcoin-lightning-network-as-payment-gateway"}},[e._v("#")]),e._v(" Showing BTCPay (Bitcoin / Lightning Network) as payment gateway")]),e._v(" "),t("p",[e._v('This is highly dependent on how your checkout flow works. On most eCommerce stores you have a payment step and on that step different payment methods are listed. Usually you list "Bitcoin / Lightning Network". The default is that all configured payment methods on BTCPay Server side will be available on the invoice page where the QR-code is shown. For more advanced use-cases you could also list supported payment methods separately and pass them when creating the invoic, this way you could give e.g. discount on Lightning Network payments compared to on-chain payments.')]),e._v(" "),t("h3",{attrs:{id:"creating-an-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#creating-an-invoice"}},[e._v("#")]),e._v(" Creating an invoice")]),e._v(" "),t("p",[e._v('When the customer chooses BTCPay (Bitcoin / Lightning Network) as payment option on the FE your BE needs to create an invoice using the create invoice endpoint. This will return you an invoice object with an invoice ID, this invoice ID should be stored alongside your order as it will be used in webhooks so you can match and find your order. The returned invoice object also contains a property "checkoutLink" this is the link you can redirect your customer to pay, see below.')]),e._v(" "),t("p",[e._v("This is done by using the "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_CreateInvoice",target:"_blank",rel:"noopener noreferrer"}},[e._v("create invoice endpoint"),t("OutboundLink")],1),e._v(", see examples in "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample/#create-an-invoice"}},[e._v("cURL")]),e._v(", "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample-NodeJS/"}},[e._v("Node.Js")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Development/GreenfieldExample-PHP/#create-an-invoice"}},[e._v("PHP")]),e._v(".")],1),e._v(" "),t("p",[e._v("It is important that you store the invoice id alongside your internal order or checkout object. This is needed so that you can find the matching internal order when you process the "),t("a",{attrs:{href:"#invoice-webhook-events"}},[e._v("webhook events")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"redirect"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#redirect"}},[e._v("#")]),e._v(" Redirect")]),e._v(" "),t("p",[e._v("The invoice object contains the property "),t("code",[e._v("checkoutLink")]),e._v(" which is the URL to your BTCPay checkout page for that specific invoice. You can redirect the customers to that page so they can pay.")]),e._v(" "),t("p",[e._v("After successful payment the customer will get redirected back to your store or to the specified "),t("code",[e._v("redirectURL")]),e._v(" in the "),t("code",[e._v("checkout")]),e._v(" object, you can set that on creating the invoice.")]),e._v(" "),t("h3",{attrs:{id:"modal-invoice-page-advanced-optional"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#modal-invoice-page-advanced-optional"}},[e._v("#")]),e._v(" Modal invoice page (advanced, optional)")]),e._v(" "),t("p",[e._v("Instead of redirecting the customer to an external BTCPay invoice checkout page you can also show it via an modal/overlay directly on your store checkout. For this you need to load the "),t("code",[e._v("btcpay.js")]),e._v(" from your BTCPay instance and add some Javascript to your frontend that listens on payment events.")]),e._v(" "),t("p",[e._v("Load the "),t("code",[e._v("btcpay.js")]),e._v(" script from your BTCPay instance:\n"),t("code",[e._v("https://mainnet.demo.btcpayserver.org/modal/btcpay.js")])]),e._v(" "),t("p",[e._v("Below is a simplified example of how to listen to payment events. You can find a full example in our WooCommerce plugin "),t("a",{attrs:{href:"https://github.com/btcpayserver/woocommerce-greenfield-plugin/blob/master/resources/js/frontend/modalCheckout.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("div",{staticClass:"language-js extra-class"},[t("pre",{pre:!0,attrs:{class:"language-js"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" invoice_paid "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\nwindow"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("btcpay"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("onModalReceiveMessage")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("function")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token parameter"}},[e._v("event")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("isObject")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("event"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("event"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("status"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("switch")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("event"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("status"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("case")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'complete'")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("case")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'paid'")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v("\n invoice_paid "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("true")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n window"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("location "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("orderCompleteLink"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("break")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("case")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'expired'")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v("\n window"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("btcpay"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("hideFrame")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Show some error to the user.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("break")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("else")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v('// handle event.data "loaded" "closed"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("event"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("data "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("===")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'close'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("invoice_paid "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("===")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("true")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n window"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("location "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("orderCompleteLink"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Show some error to the user, user closed the modal by clicking the X.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("const")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function-variable function"}},[e._v("isObject")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter"}},[e._v("obj")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=>")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("return")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Object")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("prototype"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("call")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("obj"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("===")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'[object Object]'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("h3",{attrs:{id:"validate-and-process-webhooks"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#validate-and-process-webhooks"}},[e._v("#")]),e._v(" Validate and process webhooks")]),e._v(" "),t("h4",{attrs:{id:"invoice-webhook-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#invoice-webhook-events"}},[e._v("#")]),e._v(" Invoice webhook events")]),e._v(" "),t("p",[e._v("These invoice webhook events are available, for details click on the link to the API doc.")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("InvoiceCreated")]),e._v(": Invoice has been created")]),e._v(" "),t("li",[t("strong",[e._v("InvoiceReceivedPayment")]),e._v(": Payment has been seen in the mempool (unconfirmed)")]),e._v(" "),t("li",[t("strong",[e._v("InvoicePaymentSettled")]),e._v(": Payment has been confirmed on the blockchain")]),e._v(" "),t("li",[t("strong",[e._v("InvoiceProcessing")]),e._v(': Full invoice payment ahs been seen in the mempool (unconfirmed), BE should update the order status to "pending" or "approved"')]),e._v(" "),t("li",[t("strong",[e._v("InvoiceExpired")]),e._v(': Payment is not seen in the mempool within the time frame, BE should update the order status to "expired"')]),e._v(" "),t("li",[t("strong",[e._v("InvoiceSettled")]),e._v(': Payment is confirmed on the blockchain, BE should update the order status to "paid" or "settled"')]),e._v(" "),t("li",[t("strong",[e._v("InvoiceInvalid")]),e._v(': Payment is invalid, BE should update the order status to "invalid"')])]),e._v(" "),t("p",[e._v("The most important events are:")]),e._v(" "),t("ul",[t("li",[e._v("InvoiceProcessing")]),e._v(" "),t("li",[e._v("InvoiceExpired")]),e._v(" "),t("li",[e._v("InvoiceSettled")]),e._v(" "),t("li",[e._v("InvoiceInvalid")])]),e._v(" "),t("p",[e._v("But you also need these events to e.g. handle payments after expiration:")]),e._v(" "),t("ul",[t("li",[e._v("InvoiceReceivedPayment")]),e._v(" "),t("li",[e._v("InvoicePaymentSettled")])]),e._v(" "),t("h4",{attrs:{id:"possible-invoices-states"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#possible-invoices-states"}},[e._v("#")]),e._v(" Possible invoices states")]),e._v(" "),t("p",[e._v("Normally the webhook events are enough to set the order status in your BE and there is no need to do an additional GET request to check the status of the invoice. However sometimes you still need to do that and check what the actual status is. You can do that by using the "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_GetInvoice",target:"_blank",rel:"noopener noreferrer"}},[e._v("get invoice endpoint"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Like with the webhook events you need to be aware of edge-cases like partial or overpayment. On the returned invoice object you have two important properties that will give you a clear status of what the current satus of the invoice is:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("status")]),e._v(": "),t("code",[e._v("Expired")]),e._v(" "),t("code",[e._v("Invalid")]),e._v(" "),t("code",[e._v("New")]),e._v(" "),t("code",[e._v("Processing")]),e._v(" "),t("code",[e._v("Settled")])]),e._v(" "),t("li",[t("strong",[e._v("additionalStatus")]),e._v(": "),t("code",[e._v("Invalid")]),e._v(" "),t("code",[e._v("Marked")]),e._v(" "),t("code",[e._v("None")]),e._v(" "),t("code",[e._v("PaidLate")]),e._v(" "),t("code",[e._v("PaidOver")]),e._v(" "),t("code",[e._v("PaidPartial")])])]),e._v(" "),t("p",[e._v("You always need to check both properties to get the full picture of the invoice status. It could happen that an invoice is expired but it was paid partially or fully paid after the invoice expired.")]),e._v(" "),t("h4",{attrs:{id:"validate-webhook-signature"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#validate-webhook-signature"}},[e._v("#")]),e._v(" Validate webhook signature")]),e._v(" "),t("p",[e._v('When you receive a webhook event you should validate the signature to make sure the event is actually coming from your BTCPay Server instance. The signature is a HMAC-SHA256 hash of the event payload and your webhook secret. The secret is returned when you register a webhook on the store (as mentioned above). You can find the secret in the BTCPay Server UI under "'),t("em",[e._v("Settings")]),e._v('" -> "'),t("em",[e._v("Webhooks")]),e._v('".')]),e._v(" "),t("p",[e._v("You can find examples for "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample-NodeJS/#validate-and-process-webhooks"}},[e._v("Node.Js")]),e._v(" and "),t("RouterLink",{attrs:{to:"/Development/GreenfieldExample-PHP/#validate-and-process-webhooks"}},[e._v("PHP")]),e._v(" in our docs.")],1),e._v(" "),t("h4",{attrs:{id:"process-webhook-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#process-webhook-events"}},[e._v("#")]),e._v(" Process webhook events")]),e._v(" "),t("p",[e._v("Each webhook payload with have an "),t("code",[e._v("invoiceId")]),e._v(" property, this is the id of the invoice that the event is related to. As you stored that invoice id alongside your order you can now find the matching order and update the status accordingly.")]),e._v(" "),t("p",[e._v("In most cases you can ignore the "),t("code",[e._v("InvoiceCreated")]),e._v(" event as you created the invoice during the checkout process and already have stored the invoice id alongside your order. But there are some edge-cases where you will have expired invoices that have been paid partially or overpaid. You can check our WooCommerce plugin PHP code for an example on how to handle those cases "),t("a",{attrs:{href:"https://github.com/btcpayserver/woocommerce-greenfield-plugin/blob/master/src/Gateway/AbstractGateway.php#L504",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v('On the invoice details page you can manually re-trigger the webhook events for testing purposes, by clicking on the "Redeliver" link on the list of webhooks.')])]),e._v(" "),t("h3",{attrs:{id:"refunds"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#refunds"}},[e._v("#")]),e._v(" Refunds")]),e._v(" "),t("p",[e._v("Refunds can be issued via the "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_Refund",target:"_blank",rel:"noopener noreferrer"}},[e._v("invoice refund endpoint"),t("OutboundLink")],1),e._v(". This will return a link where the customer can claim the refund. You can find examples for "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample-NodeJS/#issue-a-full-refund-of-an-invoice"}},[e._v("Node.Js")]),e._v(" and "),t("RouterLink",{attrs:{to:"/Development/GreenfieldExample-PHP/#issue-a-full-refund-of-an-invoice"}},[e._v("PHP")]),e._v(" in our docs.")],1),e._v(" "),t("p",[e._v("Alternatively you can also use the more generic "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/PullPayments_CreatePullPayment",target:"_blank",rel:"noopener noreferrer"}},[e._v("pull-payments endpoint"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"logging-debugging"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#logging-debugging"}},[e._v("#")]),e._v(" Logging / Debugging")]),e._v(" "),t("p",[e._v('On every API call and internal interaction like status updates you should catch errors and log them accordingly. So that in your BE the users/admins can see what the problem is and reach out to you with the actual error. You avoid lots of back and forth this way. You can also consider to do a "debug-mode" which will log even more data like webhook payloads and internal status updates - to allow more fine-grained bug hunting.')]),e._v(" "),t("h2",{attrs:{id:"data-scarcity"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-scarcity"}},[e._v("#")]),e._v(" Data scarcity")]),e._v(" "),t("p",[e._v("While it is possible that you pass any data as metadata to an invoice, you should not send customer data unless you have good reasons to do so. The most important metadata you want to send is the "),t("code",[e._v("orderId")]),e._v(" which you can use to then link with BTCPay "),t("code",[e._v("invoiceId")]),e._v(". This way there is no need to pass all customer data along and risk leaking the data if there is a hack of your BTCPay Server instance (or in case your users use a 3rd party host).")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[70],{435:function(e,t,a){e.exports=a.p+"assets/img/btcpay-authorize-app-api-key.7a407a00.png"},436:function(e,t,a){e.exports=a.p+"assets/img/btcpay-checkout-flow-chart.1639f36e.png"},820:function(e,t,a){"use strict";a.r(t);var s=a(17),o=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"ecommerce-integration-guide"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#ecommerce-integration-guide"}},[e._v("#")]),e._v(" eCommerce Integration Guide")]),e._v(" "),t("p",[e._v("This document aims to give best practices and a guide on how to integrate BTCPay Server as a payment solution into eCommerce, ERP, Point of Sale or other systems. If you want to do a broader integration which also manages stores and users on BTCPay this guide is still useful as a starting point. You can find examples on how to manage your BTCPay Server headless via "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[e._v("cURL")]),e._v(", "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample-NodeJS/"}},[e._v("Node.js")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Development/GreenfieldExample-PHP/"}},[e._v("PHP")]),e._v(" in our docs.")],1),e._v(" "),t("h2",{attrs:{id:"table-of-contents"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#table-of-contents"}},[e._v("#")]),e._v(" Table of contents")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#table-of-contents"}},[e._v("Table of contents")])]),t("li",[t("a",{attrs:{href:"#general-information"}},[e._v("General information")])]),t("li",[t("a",{attrs:{href:"#greenfield-api-docs"}},[e._v("Greenfield API docs")])]),t("li",[t("a",{attrs:{href:"#authentication"}},[e._v("Authentication")]),t("ul",[t("li",[t("a",{attrs:{href:"#api-keys"}},[e._v("API Keys")])]),t("li",[t("a",{attrs:{href:"#permissions"}},[e._v("Permissions")])])])]),t("li",[t("a",{attrs:{href:"#setup-best-practices"}},[e._v("Setup best practices")]),t("ul",[t("li",[t("a",{attrs:{href:"#automatic-setup"}},[e._v("Automatic setup")])]),t("li",[t("a",{attrs:{href:"#manual-setup"}},[e._v("Manual setup")])])])]),t("li",[t("a",{attrs:{href:"#checkout-flow"}},[e._v("Checkout flow")]),t("ul",[t("li",[t("a",{attrs:{href:"#overview-of-the-checkout-flow"}},[e._v("Overview of the checkout flow")])]),t("li",[t("a",{attrs:{href:"#showing-btcpay-bitcoin-lightning-network-as-payment-gateway"}},[e._v("Showing BTCPay (Bitcoin / Lightning Network) as payment gateway")])]),t("li",[t("a",{attrs:{href:"#creating-an-invoice"}},[e._v("Creating an invoice")])]),t("li",[t("a",{attrs:{href:"#redirect"}},[e._v("Redirect")])]),t("li",[t("a",{attrs:{href:"#modal-invoice-page-advanced-optional"}},[e._v("Modal invoice page (advanced, optional)")])]),t("li",[t("a",{attrs:{href:"#validate-and-process-webhooks"}},[e._v("Validate and process webhooks")])]),t("li",[t("a",{attrs:{href:"#refunds"}},[e._v("Refunds")])])])]),t("li",[t("a",{attrs:{href:"#logging-debugging"}},[e._v("Logging / Debugging")])]),t("li",[t("a",{attrs:{href:"#data-scarcity"}},[e._v("Data scarcity")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"general-information"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#general-information"}},[e._v("#")]),e._v(" General information")]),e._v(" "),t("p",[e._v("The general idea is to have a smooth setup for your users and a seamless checkout experience for their customers. By providing an automated setup wizard as described below you can avoid writing lots of documentation and make the process as easy as possible for your users.")]),e._v(" "),t("h2",{attrs:{id:"greenfield-api-docs"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#greenfield-api-docs"}},[e._v("#")]),e._v(" Greenfield API docs")]),e._v(" "),t("p",[e._v("You can find the API documentation of our so-called Greenfield API "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(" (or on your BTCPay Server on the "),t("code",[e._v("/docs")]),e._v(" path). As a quick starter, we have covered the most basic eCommerce integration endpoints examples for "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[e._v("cURL")]),e._v(", "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample-NodeJS/"}},[e._v("Node.js")]),e._v(" and "),t("RouterLink",{attrs:{to:"/Development/GreenfieldExample-PHP/"}},[e._v("PHP")]),e._v(". We will refer to those examples throughout this document.")],1),e._v(" "),t("p",[e._v("In the examples below we use the our demo server "),t("a",{attrs:{href:"https://mainnet.demo.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://mainnet.demo.btcpayserver.org"),t("OutboundLink")],1),e._v(" as an example. On your integration, this will be the user provided BTCPay Server instance URL.")]),e._v(" "),t("h2",{attrs:{id:"authentication"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#authentication"}},[e._v("#")]),e._v(" Authentication")]),e._v(" "),t("p",[e._v("Authentication can be done over Basic-Auth or API key. Using Basic-Auth is not recommended as it will always have full access of your user. With API keys you can give fine-grained permissions per store that can’t do much damage even if your API key is leaked.")]),e._v(" "),t("p",[t("strong",[e._v("Important")]),e._v(": the Authorization-Header is formatted like this:")]),e._v(" "),t("p",[t("code",[e._v("Authorization: token API_KEY")]),e._v("\n(Replace API_KEY with the actual API key)")]),e._v(" "),t("p",[e._v("Example using cURL:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-H")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Content-Type: application/json"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-H")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Authorization: token API_KEY"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-X")]),e._v(" GET "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"https://mainnet.demo.btcpayserver.org/api/v1/stores/STORE_ID"')]),e._v("\n")])])]),t("h3",{attrs:{id:"api-keys"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#api-keys"}},[e._v("#")]),e._v(" API Keys")]),e._v(" "),t("p",[e._v("You can generate API keys via the "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#tag/Authorization",target:"_blank",rel:"noopener noreferrer"}},[e._v("authorization endpoint"),t("OutboundLink")],1),e._v(" (as detailed below in "),t("a",{attrs:{href:"#automatic-setup"}},[e._v("automatic setup")]),e._v(") or for testing you can do so manually as described on "),t("a",{attrs:{href:"#manual-setup"}},[e._v("manual setup")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"permissions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#permissions"}},[e._v("#")]),e._v(" Permissions")]),e._v(" "),t("p",[e._v("You need the following permissions for a typical eCommerce integration and as a starting point to process payments and refunds:")]),e._v(" "),t("p",[t("code",[e._v("btcpay.store.canviewinvoices")]),e._v(" "),t("br"),e._v(" "),t("code",[e._v("btcpay.store.cancreateinvoice")]),e._v(" "),t("br"),e._v(" "),t("code",[e._v("btcpay.store.canmodifyinvoices")]),e._v(" "),t("br"),e._v(" "),t("code",[e._v("btcpay.store.webhooks.canmodifywebhooks")]),e._v(" "),t("br"),e._v(" "),t("code",[e._v("btcpay.store.canviewstoresettings")]),e._v(" "),t("br"),e._v(" "),t("code",[e._v("btcpay.store.cancreatenonapprovedpullpayments")])]),e._v(" "),t("p",[e._v("This allows you to have the minimal needed permissions to create invoices, refunds and to programmatically register a webhook. You should also limit your API key to a specific store, otherwise the API key will work for all the stores of a user.")]),e._v(" "),t("h2",{attrs:{id:"setup-best-practices"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-best-practices"}},[e._v("#")]),e._v(" Setup best practices")]),e._v(" "),t("h3",{attrs:{id:"automatic-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#automatic-setup"}},[e._v("#")]),e._v(" Automatic setup")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(435),alt:"Authorize App, API key generation",title:"Authorize App, API key generation"}})]),e._v(" "),t("p",[e._v("To make the connection flow between your eCommerce system and BTCPay Server as smooth and easy as possible for your users, you can guide them through a setup wizard. This means that ideally the user only enters the URL to their BTCPay Server instance (e.g. "),t("a",{attrs:{href:"https://mainnet.demo.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("https://mainnet.demo.btcpayserver.org"),t("OutboundLink")],1),e._v(') and clicks on a "'),t("em",[e._v("Connect BTCPay Server")]),e._v('" button that will start the following process:')]),e._v(" "),t("ul",[t("li",[e._v("User will get redirected to BTCPay Server authorization page")]),e._v(" "),t("li",[e._v("User logs in with their BTCPay Server account (if not already)")]),e._v(" "),t("li",[e._v("User selects the desired store (if they have multiple stores)")]),e._v(" "),t("li",[e._v("User can enter a label to identify the API key in their BTCPay Server account (optional)")]),e._v(" "),t("li",[e._v("Required permissions (see above screenshot) are already pre-filled for the user")]),e._v(" "),t("li",[e._v('When the user clicks "Authorize app" BTCPay will generate an API key with the permissions and bound to a single store and send it back to your eCommerce system')]),e._v(" "),t("li",[e._v("There you can process the returned payload which contains the API key and the store id")]),e._v(" "),t("li",[e._v("Using that API key you can register a webhook endpoint (of your eCommerce system) on the users store")]),e._v(" "),t("li",[e._v('That endpoint will return a webhook "secret" that you need later to store and use to validate incoming webhook events on invoice status changes')]),e._v(" "),t("li",[e._v("You store all those information in your eCommerce system and the setup is done")])]),e._v(" "),t("h4",{attrs:{id:"example-of-request-of-authorization-endpoint"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example-of-request-of-authorization-endpoint"}},[e._v("#")]),e._v(" Example of request of "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/ApiKeys_Authorize",target:"_blank",rel:"noopener noreferrer"}},[e._v("Authorization endpoint"),t("OutboundLink")],1),e._v(":")]),e._v(" "),t("p",[t("strong",[e._v("Important")]),e._v(': "selectiveStores" needs to be set to true so the user has to explicitly select a store for which the API key will get permissions to. Otherwise the user can select multiple stores.')]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token function"}},[e._v("curl")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-s")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-H")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"Content-Type: application/json"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-X")]),e._v(" GET "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("\\")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"https://mainnet.demo.btcpayserver.org/api-keys/authorize?permissions=btcpay.store.canviewinvoices&permissions=btcpay.store.cancreateinvoice&permissions=btcpay.store.canmodifyinvoices&permissions=btcpay.store.webhooks.canmodifywebhooks&permissions=btcpay.store.canviewstoresettings&permissions=btcpay.store.cancreatenonapprovedpullpayments&strict=true&selectiveStores=true&applicationName=YourAppName&redirect=https://example.com/your-callback-url"')]),e._v("\n")])])]),t("h3",{attrs:{id:"manual-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#manual-setup"}},[e._v("#")]),e._v(" Manual setup")]),e._v(" "),t("p",[e._v("You or your user can also create API keys manually in the BTCPay Server UI. That said, the automatic setup is more user-friendly and less error-prone. The manual setup is done as follows:")]),e._v(" "),t("ul",[t("li",[e._v("User logs into BTCPay Server instance")]),e._v(" "),t("li",[e._v('User clicks "'),t("em",[e._v("Account")]),e._v('" -> "'),t("em",[e._v("Manage Account")]),e._v('" -> "'),t("em",[e._v("API keys")]),e._v('"')]),e._v(" "),t("li",[e._v("Creates an API key with above-mentioned permissions, limited to a specific store")]),e._v(" "),t("li",[e._v("Copies the API key and store id to your form")]),e._v(" "),t("li",[e._v('Creates a webhook in store: "'),t("em",[e._v("Settings")]),e._v('" -> "'),t("em",[e._v("Webhooks")]),e._v('"; Copies the '),t("code",[e._v("secret")]),e._v(" into your settings form")])]),e._v(" "),t("h2",{attrs:{id:"checkout-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#checkout-flow"}},[e._v("#")]),e._v(" Checkout flow")]),e._v(" "),t("h3",{attrs:{id:"overview-of-the-checkout-flow"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#overview-of-the-checkout-flow"}},[e._v("#")]),e._v(" Overview of the checkout flow")]),e._v(" "),t("p",[t("strong",[t("em",[e._v("Legend")])]),e._v(":")]),e._v(" "),t("p",[t("strong",[e._v("FE")]),e._v(": Frontend (your website/existing system) "),t("br"),e._v(" "),t("strong",[e._v("BE")]),e._v(": Backend (your website/existing system) "),t("br"),e._v(" "),t("strong",[e._v("BTCPay")]),e._v(": BTCPay Server instance hosted by yourself or a 3rd party")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(436),alt:"BTCPay checkout flow chart",title:"BTCPay checkout flow chart"}})]),e._v(" "),t("ol",[t("li",[e._v("FE: On checkout the user selects payment method (in this case e.g. Bitcoin (via BTCPay))")]),e._v(" "),t("li",[e._v("FE/BE: Checkout data is passed to BE and BE "),t("a",{attrs:{href:"#creating-an-invoice"}},[e._v("creates an invoice")]),e._v(" on BTCPay, your BE stores the invoice ID alongside your internal order or checkout id so it can be matched at a later point.")]),e._v(" "),t("li",[e._v("FE option 1: the customer gets redirected to BTCPay invoice page and sees the QR-code and payment options "),t("br"),e._v("\nFE option 2: the customer sees the BTCPay checkout page in an modal overlay")]),e._v(" "),t("li",[e._v("Customer pays the invoice")]),e._v(" "),t("li",[e._v('BTCPay: as soon as the payment is seen in the mempool (and the invoice is paid fully) BTCPay fires a webhook with the "InvoiceProcessing" event; BE needs to update the payment status to e.g. "pending", "approved", "on-hold"')]),e._v(" "),t("li",[e._v("Customer gets redirected to order-confirmation page either automatically or by clicking a button")]),e._v(" "),t("li",[e._v('BTCPay: depending on configured number of confirmations (defaults to 1 confirmation) BTCPay fires a webhook with the "InvoiceSettled" event; BE updates the order status to e.g. "paid", "settled"')])]),e._v(" "),t("p",[e._v("Note: the webhooks of 5. and 7. fire with an average 10 minute time gap, depending on when the next block is found for on-chain bitcoin transactions. For Lightning Network (off-chain) transactions those two events fire immediately after each other and the payment is settled.")]),e._v(" "),t("h3",{attrs:{id:"showing-btcpay-bitcoin-lightning-network-as-payment-gateway"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#showing-btcpay-bitcoin-lightning-network-as-payment-gateway"}},[e._v("#")]),e._v(" Showing BTCPay (Bitcoin / Lightning Network) as payment gateway")]),e._v(" "),t("p",[e._v('This is highly dependent on how your checkout flow works. On most eCommerce stores you have a payment step and on that step different payment methods are listed. Usually you list "Bitcoin / Lightning Network". The default is that all configured payment methods on BTCPay Server side will be available on the invoice page where the QR-code is shown. For more advanced use-cases you could also list supported payment methods separately and pass them when creating the invoic, this way you could give e.g. discount on Lightning Network payments compared to on-chain payments.')]),e._v(" "),t("h3",{attrs:{id:"creating-an-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#creating-an-invoice"}},[e._v("#")]),e._v(" Creating an invoice")]),e._v(" "),t("p",[e._v('When the customer chooses BTCPay (Bitcoin / Lightning Network) as payment option on the FE your BE needs to create an invoice using the create invoice endpoint. This will return you an invoice object with an invoice ID, this invoice ID should be stored alongside your order as it will be used in webhooks so you can match and find your order. The returned invoice object also contains a property "checkoutLink" this is the link you can redirect your customer to pay, see below.')]),e._v(" "),t("p",[e._v("This is done by using the "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_CreateInvoice",target:"_blank",rel:"noopener noreferrer"}},[e._v("create invoice endpoint"),t("OutboundLink")],1),e._v(", see examples in "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample/#create-an-invoice"}},[e._v("cURL")]),e._v(", "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample-NodeJS/"}},[e._v("Node.Js")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Development/GreenfieldExample-PHP/#create-an-invoice"}},[e._v("PHP")]),e._v(".")],1),e._v(" "),t("p",[e._v("It is important that you store the invoice id alongside your internal order or checkout object. This is needed so that you can find the matching internal order when you process the "),t("a",{attrs:{href:"#invoice-webhook-events"}},[e._v("webhook events")]),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"redirect"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#redirect"}},[e._v("#")]),e._v(" Redirect")]),e._v(" "),t("p",[e._v("The invoice object contains the property "),t("code",[e._v("checkoutLink")]),e._v(" which is the URL to your BTCPay checkout page for that specific invoice. You can redirect the customers to that page so they can pay.")]),e._v(" "),t("p",[e._v("After successful payment the customer will get redirected back to your store or to the specified "),t("code",[e._v("redirectURL")]),e._v(" in the "),t("code",[e._v("checkout")]),e._v(" object, you can set that on creating the invoice.")]),e._v(" "),t("h3",{attrs:{id:"modal-invoice-page-advanced-optional"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#modal-invoice-page-advanced-optional"}},[e._v("#")]),e._v(" Modal invoice page (advanced, optional)")]),e._v(" "),t("p",[e._v("Instead of redirecting the customer to an external BTCPay invoice checkout page you can also show it via an modal/overlay directly on your store checkout. For this you need to load the "),t("code",[e._v("btcpay.js")]),e._v(" from your BTCPay instance and add some Javascript to your frontend that listens on payment events.")]),e._v(" "),t("p",[e._v("Load the "),t("code",[e._v("btcpay.js")]),e._v(" script from your BTCPay instance:\n"),t("code",[e._v("https://mainnet.demo.btcpayserver.org/modal/btcpay.js")])]),e._v(" "),t("p",[e._v("Below is a simplified example of how to listen to payment events. You can find a full example in our WooCommerce plugin "),t("a",{attrs:{href:"https://github.com/btcpayserver/woocommerce-greenfield-plugin/blob/master/resources/js/frontend/modalCheckout.js",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("div",{staticClass:"language-js extra-class"},[t("pre",{pre:!0,attrs:{class:"language-js"}},[t("code",[t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("let")]),e._v(" invoice_paid "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("false")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\nwindow"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("btcpay"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("onModalReceiveMessage")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("function")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token parameter"}},[e._v("event")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("isObject")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("event"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("event"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("status"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("switch")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("event"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("status"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("case")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'complete'")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("case")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'paid'")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v("\n invoice_paid "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("true")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n window"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("location "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("orderCompleteLink"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("break")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("case")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'expired'")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v("\n window"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("btcpay"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("hideFrame")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Show some error to the user.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("break")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("else")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v('// handle event.data "loaded" "closed"')]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("event"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("data "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("===")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'close'")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("if")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("invoice_paid "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("===")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token boolean"}},[e._v("true")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n window"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("location "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" data"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("orderCompleteLink"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("// Show some error to the user, user closed the modal by clicking the X.")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(";")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("const")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token function-variable function"}},[e._v("isObject")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token parameter"}},[e._v("obj")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=>")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("return")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token class-name"}},[e._v("Object")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),e._v("prototype"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("toString")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(".")]),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("call")]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("obj"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("===")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v("'[object Object]'")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("h3",{attrs:{id:"validate-and-process-webhooks"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#validate-and-process-webhooks"}},[e._v("#")]),e._v(" Validate and process webhooks")]),e._v(" "),t("h4",{attrs:{id:"invoice-webhook-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#invoice-webhook-events"}},[e._v("#")]),e._v(" Invoice webhook events")]),e._v(" "),t("p",[e._v("These invoice webhook events are available, for details click on the link to the API doc.")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("InvoiceCreated")]),e._v(": Invoice has been created")]),e._v(" "),t("li",[t("strong",[e._v("InvoiceReceivedPayment")]),e._v(": Payment has been seen in the mempool (unconfirmed)")]),e._v(" "),t("li",[t("strong",[e._v("InvoicePaymentSettled")]),e._v(": Payment has been confirmed on the blockchain")]),e._v(" "),t("li",[t("strong",[e._v("InvoiceProcessing")]),e._v(': Full invoice payment ahs been seen in the mempool (unconfirmed), BE should update the order status to "pending" or "approved"')]),e._v(" "),t("li",[t("strong",[e._v("InvoiceExpired")]),e._v(': Payment is not seen in the mempool within the time frame, BE should update the order status to "expired"')]),e._v(" "),t("li",[t("strong",[e._v("InvoiceSettled")]),e._v(': Payment is confirmed on the blockchain, BE should update the order status to "paid" or "settled"')]),e._v(" "),t("li",[t("strong",[e._v("InvoiceInvalid")]),e._v(': Payment is invalid, BE should update the order status to "invalid"')])]),e._v(" "),t("p",[e._v("The most important events are:")]),e._v(" "),t("ul",[t("li",[e._v("InvoiceProcessing")]),e._v(" "),t("li",[e._v("InvoiceExpired")]),e._v(" "),t("li",[e._v("InvoiceSettled")]),e._v(" "),t("li",[e._v("InvoiceInvalid")])]),e._v(" "),t("p",[e._v("But you also need these events to e.g. handle payments after expiration:")]),e._v(" "),t("ul",[t("li",[e._v("InvoiceReceivedPayment")]),e._v(" "),t("li",[e._v("InvoicePaymentSettled")])]),e._v(" "),t("h4",{attrs:{id:"possible-invoices-states"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#possible-invoices-states"}},[e._v("#")]),e._v(" Possible invoices states")]),e._v(" "),t("p",[e._v("Normally the webhook events are enough to set the order status in your BE and there is no need to do an additional GET request to check the status of the invoice. However sometimes you still need to do that and check what the actual status is. You can do that by using the "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_GetInvoice",target:"_blank",rel:"noopener noreferrer"}},[e._v("get invoice endpoint"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("Like with the webhook events you need to be aware of edge-cases like partial or overpayment. On the returned invoice object you have two important properties that will give you a clear status of what the current satus of the invoice is:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("status")]),e._v(": "),t("code",[e._v("Expired")]),e._v(" "),t("code",[e._v("Invalid")]),e._v(" "),t("code",[e._v("New")]),e._v(" "),t("code",[e._v("Processing")]),e._v(" "),t("code",[e._v("Settled")])]),e._v(" "),t("li",[t("strong",[e._v("additionalStatus")]),e._v(": "),t("code",[e._v("Invalid")]),e._v(" "),t("code",[e._v("Marked")]),e._v(" "),t("code",[e._v("None")]),e._v(" "),t("code",[e._v("PaidLate")]),e._v(" "),t("code",[e._v("PaidOver")]),e._v(" "),t("code",[e._v("PaidPartial")])])]),e._v(" "),t("p",[e._v("You always need to check both properties to get the full picture of the invoice status. It could happen that an invoice is expired but it was paid partially or fully paid after the invoice expired.")]),e._v(" "),t("h4",{attrs:{id:"validate-webhook-signature"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#validate-webhook-signature"}},[e._v("#")]),e._v(" Validate webhook signature")]),e._v(" "),t("p",[e._v('When you receive a webhook event you should validate the signature to make sure the event is actually coming from your BTCPay Server instance. The signature is a HMAC-SHA256 hash of the event payload and your webhook secret. The secret is returned when you register a webhook on the store (as mentioned above). You can find the secret in the BTCPay Server UI under "'),t("em",[e._v("Settings")]),e._v('" -> "'),t("em",[e._v("Webhooks")]),e._v('".')]),e._v(" "),t("p",[e._v("You can find examples for "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample-NodeJS/#validate-and-process-webhooks"}},[e._v("Node.Js")]),e._v(" and "),t("RouterLink",{attrs:{to:"/Development/GreenfieldExample-PHP/#validate-and-process-webhooks"}},[e._v("PHP")]),e._v(" in our docs.")],1),e._v(" "),t("h4",{attrs:{id:"process-webhook-events"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#process-webhook-events"}},[e._v("#")]),e._v(" Process webhook events")]),e._v(" "),t("p",[e._v("Each webhook payload with have an "),t("code",[e._v("invoiceId")]),e._v(" property, this is the id of the invoice that the event is related to. As you stored that invoice id alongside your order you can now find the matching order and update the status accordingly.")]),e._v(" "),t("p",[e._v("In most cases you can ignore the "),t("code",[e._v("InvoiceCreated")]),e._v(" event as you created the invoice during the checkout process and already have stored the invoice id alongside your order. But there are some edge-cases where you will have expired invoices that have been paid partially or overpaid. You can check our WooCommerce plugin PHP code for an example on how to handle those cases "),t("a",{attrs:{href:"https://github.com/btcpayserver/woocommerce-greenfield-plugin/blob/master/src/Gateway/AbstractGateway.php#L504",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v('On the invoice details page you can manually re-trigger the webhook events for testing purposes, by clicking on the "Redeliver" link on the list of webhooks.')])]),e._v(" "),t("h3",{attrs:{id:"refunds"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#refunds"}},[e._v("#")]),e._v(" Refunds")]),e._v(" "),t("p",[e._v("Refunds can be issued via the "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/Invoices_Refund",target:"_blank",rel:"noopener noreferrer"}},[e._v("invoice refund endpoint"),t("OutboundLink")],1),e._v(". This will return a link where the customer can claim the refund. You can find examples for "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample-NodeJS/#issue-a-full-refund-of-an-invoice"}},[e._v("Node.Js")]),e._v(" and "),t("RouterLink",{attrs:{to:"/Development/GreenfieldExample-PHP/#issue-a-full-refund-of-an-invoice"}},[e._v("PHP")]),e._v(" in our docs.")],1),e._v(" "),t("p",[e._v("Alternatively you can also use the more generic "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/#operation/PullPayments_CreatePullPayment",target:"_blank",rel:"noopener noreferrer"}},[e._v("pull-payments endpoint"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"logging-debugging"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#logging-debugging"}},[e._v("#")]),e._v(" Logging / Debugging")]),e._v(" "),t("p",[e._v('On every API call and internal interaction like status updates you should catch errors and log them accordingly. So that in your BE the users/admins can see what the problem is and reach out to you with the actual error. You avoid lots of back and forth this way. You can also consider to do a "debug-mode" which will log even more data like webhook payloads and internal status updates - to allow more fine-grained bug hunting.')]),e._v(" "),t("h2",{attrs:{id:"data-scarcity"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#data-scarcity"}},[e._v("#")]),e._v(" Data scarcity")]),e._v(" "),t("p",[e._v("While it is possible that you pass any data as metadata to an invoice, you should not send customer data unless you have good reasons to do so. The most important metadata you want to send is the "),t("code",[e._v("orderId")]),e._v(" which you can use to then link with BTCPay "),t("code",[e._v("invoiceId")]),e._v(". This way there is no need to pass all customer data along and risk leaking the data if there is a hack of your BTCPay Server instance (or in case your users use a 3rd party host).")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/71.bf08e2f8.js b/assets/js/71.e199fa5e.js similarity index 99% rename from assets/js/71.bf08e2f8.js rename to assets/js/71.e199fa5e.js index 574820d7cf..b66a4c9474 100644 --- a/assets/js/71.bf08e2f8.js +++ b/assets/js/71.e199fa5e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{492:function(e,t,a){e.exports=a.p+"assets/img/WalletTxComment.a835c154.png"},493:function(e,t,a){e.exports=a.p+"assets/img/FullyNoded.1780261f.png"},848:function(e,t,a){"use strict";a.r(t);var r=a(17),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"wallet-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wallet-faq"}},[e._v("#")]),e._v(" Wallet FAQ")]),e._v(" "),t("p",[e._v("This document contains frequently asked questions related to BTCPay Server's "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("internal wallet")]),e._v(".")],1),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#what-is-btcpay-server-wallet"}},[e._v("What is BTCPay Server wallet?")])]),t("li",[t("a",{attrs:{href:"#how-to-set-up-my-wallet-with-btcpay-server"}},[e._v("How to set up my wallet with BTCPay Server?")])]),t("li",[t("a",{attrs:{href:"#can-i-use-a-hardware-wallet-with-btcpay-server"}},[e._v("Can I use a hardware wallet with BTCPay Server?")])]),t("li",[t("a",{attrs:{href:"#is-there-address-re-use-for-separate-stores-using-same-xpub"}},[e._v("Is there address re-use for separate stores using same xpub?")])]),t("li",[t("a",{attrs:{href:"#do-i-have-to-use-btcpay-server-wallet"}},[e._v("Do I have to use BTCPay Server wallet?")])]),t("li",[t("a",{attrs:{href:"#why-is-sending-a-transaction-using-trezor-failing"}},[e._v("Why is sending a transaction using Trezor failing?")])]),t("li",[t("a",{attrs:{href:"#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("Missing payments in my software or hardware wallet")]),t("ul",[t("li",[t("a",{attrs:{href:"#the-gap-limit-problem"}},[e._v("The gap limit problem")])]),t("li",[t("a",{attrs:{href:"#the-gap-limit-solution"}},[e._v("The gap limit solution")])])])]),t("li",[t("a",{attrs:{href:"#what-is-a-derivation-scheme"}},[e._v("What is a derivation scheme?")])]),t("li",[t("a",{attrs:{href:"#what-is-a-replace-by-fee-rbf-transaction"}},[e._v("What is a Replace-By-Fee (RBF) transaction?")])]),t("li",[t("a",{attrs:{href:"#does-btcpay-server-use-mempoolfullrbf-1-"}},[e._v("Does BTCPay Server use mempoolfullrbf=1 ?")])]),t("li",[t("a",{attrs:{href:"#how-to-add-custom-labels-and-comments-to-transactions"}},[e._v("How to add custom labels and comments to transactions?")])]),t("li",[t("a",{attrs:{href:"#i-dont-see-lightning-network-payments-in-btcpay-wallet"}},[e._v("I don't see Lightning network payments in BTCPay wallet?")])]),t("li",[t("a",{attrs:{href:"#is-there-a-mobile-app-for-btcpay-server-wallet"}},[e._v("Is there a mobile app for BTCPay Server wallet?")])]),t("li",[t("a",{attrs:{href:"#how-can-i-use-psbt-partially-signed-bitcoin-transactions-with-btcpay-server"}},[e._v("How can I use PSBT (partially signed bitcoin transactions) with BTCPay Server?")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"what-is-btcpay-server-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-btcpay-server-wallet"}},[e._v("#")]),e._v(" What is BTCPay Server wallet?")]),e._v(" "),t("p",[e._v("BTCPay Server has an internal wallet which you can use to view incoming and outgoing associated Bitcoin transactions and spend your funds.")]),e._v(" "),t("p",[e._v("It works like any other wallet, but has enhanced privacy features (non-custodial, no third-parties, verified with your server's dedicated full node, etc.) by default and also solves certain UX problems you may encounter when using an existing wallet with BTCPay Server. It also includes many other wallet features such as custom transaction labelling, blockchain explorer links, transaction confirmation status, etc. It can be connected with many different external wallet types and even server generated hot wallets. For these reasons, it's recommended to use the internal wallet for the most flexible and best wallet experience in BTCPay Server.")]),e._v(" "),t("p",[e._v("For more information on how to use the built-in wallet "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("check this page")]),e._v(". To use the internal wallet, you first need to "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("set up the wallet")]),e._v(" with your BTCPay store.")],1),e._v(" "),t("h2",{attrs:{id:"how-to-set-up-my-wallet-with-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-set-up-my-wallet-with-btcpay-server"}},[e._v("#")]),e._v(" How to set up my wallet with BTCPay Server?")]),e._v(" "),t("p",[e._v("Your store's wallet setup page should guide you completely step by step to setting up any kind of wallet with BTCPay Server. If you have more questions, check our in-depth documentation on "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("how to set up a wallet")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"can-i-use-a-hardware-wallet-with-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-use-a-hardware-wallet-with-btcpay-server"}},[e._v("#")]),e._v(" Can I use a hardware wallet with BTCPay Server?")]),e._v(" "),t("p",[e._v("The internal wallet has a "),t("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[e._v("built in hardware wallet integration")]),e._v(". You can use a supported hardware wallet with the "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("BTCPay wallet")]),e._v(".")],1),e._v(" "),t("p",[e._v("This means that you're using a hardware wallet without leaking information to third-party apps or servers unlike the default software for the devices, since the wallet relies on the full node in your BTCPay.")]),e._v(" "),t("h2",{attrs:{id:"is-there-address-re-use-for-separate-stores-using-same-xpub"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#is-there-address-re-use-for-separate-stores-using-same-xpub"}},[e._v("#")]),e._v(" Is there address re-use for separate stores using same xpub?")]),e._v(" "),t("p",[e._v("In short, no there is not.\nCreate 2 separate stores on BTCpay Server under the same instance with the same xpub.\nIf you do so, BTCPay Server will do address rotation correctly and never re-use between the stores.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("This has to be done on the same instance.\nAs was documented in "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/issues/960",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github issue #960"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"do-i-have-to-use-btcpay-server-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#do-i-have-to-use-btcpay-server-wallet"}},[e._v("#")]),e._v(" Do I have to use BTCPay Server wallet?")]),e._v(" "),t("p",[e._v("By default BTCPay Server only requires an extended public key. To receive payments to your BTCPay store, you provide an extended public key (xPub) which you can generate in an external (existing) wallet. You do not have to use the built in wallet at all, you can manage funds in your "),t("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[e._v("existing wallet")]),e._v(" instead.")],1),e._v(" "),t("p",[e._v("However, it's recommended to use the built in wallet for funds management. The built in wallet not only improves your privacy by default, but also solves user-experience issues like "),t("a",{attrs:{href:"#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("gap-limit")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"why-is-sending-a-transaction-using-trezor-failing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-is-sending-a-transaction-using-trezor-failing"}},[e._v("#")]),e._v(" Why is sending a transaction using Trezor failing?")]),e._v(" "),t("p",[e._v('If you are experiencing problems (such as "user refused" or unresponsive Trezor) while trying to send a (PSBT) transaction using the BTCPay '),t("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[e._v("HWI (Vault)")]),e._v(" and your Trezor wallet, enable the "),t("strong",[e._v("Always include non-witness UTXO if available")]),e._v(" setting by expanding the Advanced Settings on the Send page.")],1),e._v(" "),t("h2",{attrs:{id:"missing-payments-in-my-software-or-hardware-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("#")]),e._v(" Missing payments in my software or hardware wallet")]),e._v(" "),t("p",[e._v("If you're using an "),t("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[e._v("existing software or a hardware wallet")]),e._v(" with your BTCPay Server, you may experience a discrepancy between balance in your BTCPay wallet and the external wallet's web, desktop or mobile app. This discrepancy is usually related to a "),t("strong",[e._v("gap-limit")]),e._v(" issue.")],1),e._v(" "),t("h3",{attrs:{id:"the-gap-limit-problem"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-gap-limit-problem"}},[e._v("#")]),e._v(" The gap limit problem")]),e._v(" "),t("p",[e._v("The majority of third party wallets are "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Lightweight_node",target:"_blank",rel:"noopener noreferrer"}},[e._v("light wallets"),t("OutboundLink")],1),e._v(", which share a node between many users. To prevent performance issues, both light and full node reliant wallets limit the amount (typically 20) of addresses without balance that they track on the blockchain. BTCPay Server generates a new address for every invoice.")]),e._v(" "),t("p",[e._v("With above in mind, after BTCPay Server generates 20 consecutive unpaid invoices, the external wallet stops fetching the transactions, assuming no new transactions occurred. Once 21st, 22nd, etc invoices are paid, your external wallet won't show them.")]),e._v(" "),t("p",[e._v("On the other hand, internally, BTCPay Server wallet tracks any address it generates itself along with a much greater gap limit. It does not rely on a third-party and is able to always show a correct balance.")]),e._v(" "),t("h3",{attrs:{id:"the-gap-limit-solution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-gap-limit-solution"}},[e._v("#")]),e._v(" The gap limit solution")]),e._v(" "),t("p",[e._v("It's not easy to solve the gap limit problem. You have two options:")]),e._v(" "),t("ol",[t("li",[e._v("Increase the gap limit in your existing (external) wallet")]),e._v(" "),t("li",[e._v("Use internal BTCPay Server wallet")])]),e._v(" "),t("h4",{attrs:{id:"1-increasing-the-gap-limit"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-increasing-the-gap-limit"}},[e._v("#")]),e._v(" 1. Increasing the gap limit")]),e._v(" "),t("p",[e._v("If your "),t("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[e._v("external/existing wallet")]),e._v(" allows gap-limit configuration, the easy fix is to increase it. However, majority of wallets do not allow this.")],1),e._v(" "),t("p",[e._v("The only wallets that allow gap-limit configuration that we're aware of are the following:")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/ElectrumWallet/"}},[e._v("Electrum")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WasabiWallet/"}},[e._v("Wasabi")])],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://sparrowwallet.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sparrow"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Core"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://specter.solutions/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Specter"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://nunchuk.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Nunchuk"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://samouraiwallet.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Samourai Wallet"),t("OutboundLink")],1),e._v(" (when used with Dojo Maintenance Tool)")])]),e._v(" "),t("p",[e._v("Unfortunately, with any other wallet you're likely to encounter a problem.")]),e._v(" "),t("p",[e._v("If you'd like to use an "),t("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[e._v("external wallet")]),e._v(" to manage the funds, we recommend that you recover your existing wallet into one of following wallets and increase the gap limit:")],1),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/ElectrumWallet/#configuring-the-gap-limit-in-electrum"}},[e._v("Increasing the gap limit in Electrum")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WasabiWallet/#configuring-the-gap-limit-in-wasabi"}},[e._v("Increasing the gap limit in Wasabi")])],1)]),e._v(" "),t("p",[e._v("After you've increased the gap limit, the balance in your external wallet and BTCPay wallet should match. If they don't, you may have set up your derivation scheme incorrectly.")]),e._v(" "),t("h4",{attrs:{id:"2-use-the-internal-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-use-the-internal-wallet"}},[e._v("#")]),e._v(" 2. Use the internal wallet")]),e._v(" "),t("p",[e._v("For best user-experience and privacy, we recommend that you consider dropping external wallets and start using the "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("BTCPay Server internal wallet")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"what-is-a-derivation-scheme"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-a-derivation-scheme"}},[e._v("#")]),e._v(" What is a derivation scheme?")]),e._v(" "),t("p",[e._v("No matter "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("how you set up your wallet")]),e._v(", BTCPay Server uses a "),t("code",[e._v("derivation scheme")]),e._v(" to represent the destination of the funds received by your invoices. The destination of those funds will be your wallet, located by the extended public key that you provide.")],1),e._v(" "),t("p",[e._v("Using different derivation schemes with your extended public key, you can also choose to create various receiving address types, shown in your store invoices.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",{staticStyle:{"text-align":"left"}},[e._v("Address Type")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("Example")])])]),e._v(" "),t("tbody",[t("tr",[t("td",{staticStyle:{"text-align":"left"}},[e._v("P2WPKH")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("xpub...")])]),e._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"left"}},[e._v("P2SH-P2WPKH")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("xpub...-[p2sh]")])]),e._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"left"}},[e._v("P2PKH")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("xpub...-[legacy]")])]),e._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"left"}},[e._v("Multi-sig P2WSH")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("2-of-xpub1...-xpub2...")])]),e._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"left"}},[e._v("Multi-sig P2SH-P2WSH")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("2-of-xpub1...-xpub2...-[p2sh]")])]),e._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"left"}},[e._v("Multi-sig P2SH")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("2-of-xpub1...-xpub2...-[legacy]")])])])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("On top of the xPub extended public key formats shown above, BTCPay Server supports yPub and zPub formats. Please note that these will be converted to xPub once the wallet setup is completed. This has no effect on how you receive or send funds.")])]),e._v(" "),t("h2",{attrs:{id:"what-is-a-replace-by-fee-rbf-transaction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-a-replace-by-fee-rbf-transaction"}},[e._v("#")]),e._v(" What is a Replace-By-Fee (RBF) transaction?")]),e._v(" "),t("p",[e._v("A Replace-By-Fee (RBF) transaction is a feature of the Bitcoin protocol. Learn more about what it is, why it happens and the different types of RBF "),t("a",{attrs:{href:"https://bitcoin.stackexchange.com/a/54457/85016",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("RBF capability is by default randomly enabled/disabled between transactions when using the BTCPay Server internal wallet, for enhanced privacy. In order to ensure it is enabled, or to disable it, see the advanced options of the BTCPay Server "),t("RouterLink",{attrs:{to:"/Wallet/#rbf-replace-by-fee"}},[e._v("internal wallet")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"does-btcpay-server-use-mempoolfullrbf-1-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#does-btcpay-server-use-mempoolfullrbf-1-"}},[e._v("#")]),e._v(" Does BTCPay Server use mempoolfullrbf=1 ?")]),e._v(" "),t("p",[e._v("In very short, yes.\nWe've decided to add this as default to your BTCPay Server setup. However, we've also made it a fragment you can disable yourself.\nWithout mempoolfullrbf=1 if a customer is double-spending a payment with a transaction not signaling RBF, the merchant would only know after confirmation.")]),e._v(" "),t("p",[e._v("However, some users don't want to activate this policy. Some people consider that while it aligns with the merchant's incentive to activate it, it is considered against the interests of the network, as it makes accepting a payment with 0 confirmations harder once the policy is widely deployed.")]),e._v(" "),t("p",[e._v("To opt out use the following :")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_EXCLUDE_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_EXCLUDE_FRAGMENTS")]),e._v(';opt-mempoolfullrbf"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("h2",{attrs:{id:"how-to-add-custom-labels-and-comments-to-transactions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-custom-labels-and-comments-to-transactions"}},[e._v("#")]),e._v(" How to add custom labels and comments to transactions?")]),e._v(" "),t("p",[e._v("In addition to the "),t("RouterLink",{attrs:{to:"/Wallet/#transaction-labels"}},[e._v("automatic labels")]),e._v(", you can easily create your own custom transaction labels. Labels can be used for filtering transactions in the wallet view. You can also add individual comments to transactions to leave a note or description about the payment.")],1),e._v(" "),t("figure",[t("img",{attrs:{src:a(492),alt:"Custom Transaction Labels",title:"Custom Transaction Labels"}})]),e._v(" "),t("h2",{attrs:{id:"i-dont-see-lightning-network-payments-in-btcpay-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-dont-see-lightning-network-payments-in-btcpay-wallet"}},[e._v("#")]),e._v(" I don't see Lightning network payments in BTCPay wallet?")]),e._v(" "),t("p",[e._v("The "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning Network")]),e._v(" and the BTCPay Server "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("wallet")]),e._v(" are different concepts. The internal BTCPay Server wallet only shows on-chain payments.")],1),e._v(" "),t("p",[e._v("In the future they may become unified but for the time being, to manage your Lightning Network funds, use Ride the Lightning, ThunderHub, an externally connected Lightning wallet (Zeus, Zap, etc.), or the Command Line Interface (CLI).")]),e._v(" "),t("h2",{attrs:{id:"is-there-a-mobile-app-for-btcpay-server-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#is-there-a-mobile-app-for-btcpay-server-wallet"}},[e._v("#")]),e._v(" Is there a mobile app for BTCPay Server wallet?")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Update 11/2023:\nThere will be a mobile app for BTCPay Server wallet in the future. "),t("a",{attrs:{href:"https://twitter.com/BtcpayServer/status/1699114457421447543",target:"_blank",rel:"noopener noreferrer"}},[e._v("It is currently in development"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p",[e._v("BTCPay Server is a web app (not a mobile app) and may be viewed using any device that can display a web browser. There are mobile apps which allow you to connect to your BTCPay Server Lightning node (Zeus, Zap, etc.).")]),e._v(" "),t("p",[e._v("You can also use mobile apps to connect to your Bitcoin full node using either P2P or RPC. If you are on iOS you can easily connect to your Bitcoin full node using Fully Noded.")]),e._v(" "),t("p",[e._v("To connect your BTCPay node to Fully Noded:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",[t("code",[e._v("1. Download Fully Noded from the App store.\n2. In BTCPay, go to Server Settings > Services and click on the Full Node RPC.\n3. Open your Fully Noded app, Quick Connect QR.\n4. Scan the QR code displayed on your BTCPay.\n5. Your Bitcoin full node is now connected to Fully Noded.\n")])])]),t("p",[e._v("Here are some node statuses and network information you can easily monitor from your Fully Noded:")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(493),alt:"Fully Noded",title:"Fully Noded"}})]),e._v(" "),t("h2",{attrs:{id:"how-can-i-use-psbt-partially-signed-bitcoin-transactions-with-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-use-psbt-partially-signed-bitcoin-transactions-with-btcpay-server"}},[e._v("#")]),e._v(" How can I use PSBT (partially signed bitcoin transactions) with BTCPay Server?")]),e._v(" "),t("p",[e._v("You can use BTCPay Server to create and/or broadcast PSBT. Check our guides to "),t("RouterLink",{attrs:{to:"/FAQ/ColdCardWallet/#spending-from-btcpay-server-wallet-with-coldcard-psbt"}},[e._v("Sign a PSBT transaction with ColdCard hardware wallet")]),e._v(" and "),t("RouterLink",{attrs:{to:"/FAQ/Sign-PSBT-with-sparrow-wallet/"}},[e._v("create and sign a PSBT transaction with Sparrow wallet")]),e._v(".")],1)])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[71],{492:function(e,t,a){e.exports=a.p+"assets/img/WalletTxComment.a835c154.png"},493:function(e,t,a){e.exports=a.p+"assets/img/FullyNoded.1780261f.png"},847:function(e,t,a){"use strict";a.r(t);var r=a(17),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"wallet-faq"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#wallet-faq"}},[e._v("#")]),e._v(" Wallet FAQ")]),e._v(" "),t("p",[e._v("This document contains frequently asked questions related to BTCPay Server's "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("internal wallet")]),e._v(".")],1),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#what-is-btcpay-server-wallet"}},[e._v("What is BTCPay Server wallet?")])]),t("li",[t("a",{attrs:{href:"#how-to-set-up-my-wallet-with-btcpay-server"}},[e._v("How to set up my wallet with BTCPay Server?")])]),t("li",[t("a",{attrs:{href:"#can-i-use-a-hardware-wallet-with-btcpay-server"}},[e._v("Can I use a hardware wallet with BTCPay Server?")])]),t("li",[t("a",{attrs:{href:"#is-there-address-re-use-for-separate-stores-using-same-xpub"}},[e._v("Is there address re-use for separate stores using same xpub?")])]),t("li",[t("a",{attrs:{href:"#do-i-have-to-use-btcpay-server-wallet"}},[e._v("Do I have to use BTCPay Server wallet?")])]),t("li",[t("a",{attrs:{href:"#why-is-sending-a-transaction-using-trezor-failing"}},[e._v("Why is sending a transaction using Trezor failing?")])]),t("li",[t("a",{attrs:{href:"#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("Missing payments in my software or hardware wallet")]),t("ul",[t("li",[t("a",{attrs:{href:"#the-gap-limit-problem"}},[e._v("The gap limit problem")])]),t("li",[t("a",{attrs:{href:"#the-gap-limit-solution"}},[e._v("The gap limit solution")])])])]),t("li",[t("a",{attrs:{href:"#what-is-a-derivation-scheme"}},[e._v("What is a derivation scheme?")])]),t("li",[t("a",{attrs:{href:"#what-is-a-replace-by-fee-rbf-transaction"}},[e._v("What is a Replace-By-Fee (RBF) transaction?")])]),t("li",[t("a",{attrs:{href:"#does-btcpay-server-use-mempoolfullrbf-1-"}},[e._v("Does BTCPay Server use mempoolfullrbf=1 ?")])]),t("li",[t("a",{attrs:{href:"#how-to-add-custom-labels-and-comments-to-transactions"}},[e._v("How to add custom labels and comments to transactions?")])]),t("li",[t("a",{attrs:{href:"#i-dont-see-lightning-network-payments-in-btcpay-wallet"}},[e._v("I don't see Lightning network payments in BTCPay wallet?")])]),t("li",[t("a",{attrs:{href:"#is-there-a-mobile-app-for-btcpay-server-wallet"}},[e._v("Is there a mobile app for BTCPay Server wallet?")])]),t("li",[t("a",{attrs:{href:"#how-can-i-use-psbt-partially-signed-bitcoin-transactions-with-btcpay-server"}},[e._v("How can I use PSBT (partially signed bitcoin transactions) with BTCPay Server?")])])])]),t("p"),e._v(" "),t("h2",{attrs:{id:"what-is-btcpay-server-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-btcpay-server-wallet"}},[e._v("#")]),e._v(" What is BTCPay Server wallet?")]),e._v(" "),t("p",[e._v("BTCPay Server has an internal wallet which you can use to view incoming and outgoing associated Bitcoin transactions and spend your funds.")]),e._v(" "),t("p",[e._v("It works like any other wallet, but has enhanced privacy features (non-custodial, no third-parties, verified with your server's dedicated full node, etc.) by default and also solves certain UX problems you may encounter when using an existing wallet with BTCPay Server. It also includes many other wallet features such as custom transaction labelling, blockchain explorer links, transaction confirmation status, etc. It can be connected with many different external wallet types and even server generated hot wallets. For these reasons, it's recommended to use the internal wallet for the most flexible and best wallet experience in BTCPay Server.")]),e._v(" "),t("p",[e._v("For more information on how to use the built-in wallet "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("check this page")]),e._v(". To use the internal wallet, you first need to "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("set up the wallet")]),e._v(" with your BTCPay store.")],1),e._v(" "),t("h2",{attrs:{id:"how-to-set-up-my-wallet-with-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-set-up-my-wallet-with-btcpay-server"}},[e._v("#")]),e._v(" How to set up my wallet with BTCPay Server?")]),e._v(" "),t("p",[e._v("Your store's wallet setup page should guide you completely step by step to setting up any kind of wallet with BTCPay Server. If you have more questions, check our in-depth documentation on "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("how to set up a wallet")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"can-i-use-a-hardware-wallet-with-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#can-i-use-a-hardware-wallet-with-btcpay-server"}},[e._v("#")]),e._v(" Can I use a hardware wallet with BTCPay Server?")]),e._v(" "),t("p",[e._v("The internal wallet has a "),t("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[e._v("built in hardware wallet integration")]),e._v(". You can use a supported hardware wallet with the "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("BTCPay wallet")]),e._v(".")],1),e._v(" "),t("p",[e._v("This means that you're using a hardware wallet without leaking information to third-party apps or servers unlike the default software for the devices, since the wallet relies on the full node in your BTCPay.")]),e._v(" "),t("h2",{attrs:{id:"is-there-address-re-use-for-separate-stores-using-same-xpub"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#is-there-address-re-use-for-separate-stores-using-same-xpub"}},[e._v("#")]),e._v(" Is there address re-use for separate stores using same xpub?")]),e._v(" "),t("p",[e._v("In short, no there is not.\nCreate 2 separate stores on BTCpay Server under the same instance with the same xpub.\nIf you do so, BTCPay Server will do address rotation correctly and never re-use between the stores.")]),e._v(" "),t("div",{staticClass:"custom-block warning"},[t("p",{staticClass:"custom-block-title"},[e._v("WARNING")]),e._v(" "),t("p",[e._v("This has to be done on the same instance.\nAs was documented in "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/issues/960",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github issue #960"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"do-i-have-to-use-btcpay-server-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#do-i-have-to-use-btcpay-server-wallet"}},[e._v("#")]),e._v(" Do I have to use BTCPay Server wallet?")]),e._v(" "),t("p",[e._v("By default BTCPay Server only requires an extended public key. To receive payments to your BTCPay store, you provide an extended public key (xPub) which you can generate in an external (existing) wallet. You do not have to use the built in wallet at all, you can manage funds in your "),t("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[e._v("existing wallet")]),e._v(" instead.")],1),e._v(" "),t("p",[e._v("However, it's recommended to use the built in wallet for funds management. The built in wallet not only improves your privacy by default, but also solves user-experience issues like "),t("a",{attrs:{href:"#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("gap-limit")]),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"why-is-sending-a-transaction-using-trezor-failing"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-is-sending-a-transaction-using-trezor-failing"}},[e._v("#")]),e._v(" Why is sending a transaction using Trezor failing?")]),e._v(" "),t("p",[e._v('If you are experiencing problems (such as "user refused" or unresponsive Trezor) while trying to send a (PSBT) transaction using the BTCPay '),t("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[e._v("HWI (Vault)")]),e._v(" and your Trezor wallet, enable the "),t("strong",[e._v("Always include non-witness UTXO if available")]),e._v(" setting by expanding the Advanced Settings on the Send page.")],1),e._v(" "),t("h2",{attrs:{id:"missing-payments-in-my-software-or-hardware-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("#")]),e._v(" Missing payments in my software or hardware wallet")]),e._v(" "),t("p",[e._v("If you're using an "),t("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[e._v("existing software or a hardware wallet")]),e._v(" with your BTCPay Server, you may experience a discrepancy between balance in your BTCPay wallet and the external wallet's web, desktop or mobile app. This discrepancy is usually related to a "),t("strong",[e._v("gap-limit")]),e._v(" issue.")],1),e._v(" "),t("h3",{attrs:{id:"the-gap-limit-problem"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-gap-limit-problem"}},[e._v("#")]),e._v(" The gap limit problem")]),e._v(" "),t("p",[e._v("The majority of third party wallets are "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Lightweight_node",target:"_blank",rel:"noopener noreferrer"}},[e._v("light wallets"),t("OutboundLink")],1),e._v(", which share a node between many users. To prevent performance issues, both light and full node reliant wallets limit the amount (typically 20) of addresses without balance that they track on the blockchain. BTCPay Server generates a new address for every invoice.")]),e._v(" "),t("p",[e._v("With above in mind, after BTCPay Server generates 20 consecutive unpaid invoices, the external wallet stops fetching the transactions, assuming no new transactions occurred. Once 21st, 22nd, etc invoices are paid, your external wallet won't show them.")]),e._v(" "),t("p",[e._v("On the other hand, internally, BTCPay Server wallet tracks any address it generates itself along with a much greater gap limit. It does not rely on a third-party and is able to always show a correct balance.")]),e._v(" "),t("h3",{attrs:{id:"the-gap-limit-solution"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#the-gap-limit-solution"}},[e._v("#")]),e._v(" The gap limit solution")]),e._v(" "),t("p",[e._v("It's not easy to solve the gap limit problem. You have two options:")]),e._v(" "),t("ol",[t("li",[e._v("Increase the gap limit in your existing (external) wallet")]),e._v(" "),t("li",[e._v("Use internal BTCPay Server wallet")])]),e._v(" "),t("h4",{attrs:{id:"1-increasing-the-gap-limit"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-increasing-the-gap-limit"}},[e._v("#")]),e._v(" 1. Increasing the gap limit")]),e._v(" "),t("p",[e._v("If your "),t("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[e._v("external/existing wallet")]),e._v(" allows gap-limit configuration, the easy fix is to increase it. However, majority of wallets do not allow this.")],1),e._v(" "),t("p",[e._v("The only wallets that allow gap-limit configuration that we're aware of are the following:")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/ElectrumWallet/"}},[e._v("Electrum")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WasabiWallet/"}},[e._v("Wasabi")])],1),e._v(" "),t("li",[t("a",{attrs:{href:"https://sparrowwallet.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Sparrow"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/bitcoin/bitcoin",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Core"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://specter.solutions/index.html",target:"_blank",rel:"noopener noreferrer"}},[e._v("Specter"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://nunchuk.io/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Nunchuk"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://samouraiwallet.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Samourai Wallet"),t("OutboundLink")],1),e._v(" (when used with Dojo Maintenance Tool)")])]),e._v(" "),t("p",[e._v("Unfortunately, with any other wallet you're likely to encounter a problem.")]),e._v(" "),t("p",[e._v("If you'd like to use an "),t("RouterLink",{attrs:{to:"/WalletSetup/#use-an-existing-wallet"}},[e._v("external wallet")]),e._v(" to manage the funds, we recommend that you recover your existing wallet into one of following wallets and increase the gap limit:")],1),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/ElectrumWallet/#configuring-the-gap-limit-in-electrum"}},[e._v("Increasing the gap limit in Electrum")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WasabiWallet/#configuring-the-gap-limit-in-wasabi"}},[e._v("Increasing the gap limit in Wasabi")])],1)]),e._v(" "),t("p",[e._v("After you've increased the gap limit, the balance in your external wallet and BTCPay wallet should match. If they don't, you may have set up your derivation scheme incorrectly.")]),e._v(" "),t("h4",{attrs:{id:"2-use-the-internal-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-use-the-internal-wallet"}},[e._v("#")]),e._v(" 2. Use the internal wallet")]),e._v(" "),t("p",[e._v("For best user-experience and privacy, we recommend that you consider dropping external wallets and start using the "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("BTCPay Server internal wallet")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"what-is-a-derivation-scheme"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-a-derivation-scheme"}},[e._v("#")]),e._v(" What is a derivation scheme?")]),e._v(" "),t("p",[e._v("No matter "),t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("how you set up your wallet")]),e._v(", BTCPay Server uses a "),t("code",[e._v("derivation scheme")]),e._v(" to represent the destination of the funds received by your invoices. The destination of those funds will be your wallet, located by the extended public key that you provide.")],1),e._v(" "),t("p",[e._v("Using different derivation schemes with your extended public key, you can also choose to create various receiving address types, shown in your store invoices.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",{staticStyle:{"text-align":"left"}},[e._v("Address Type")]),e._v(" "),t("th",{staticStyle:{"text-align":"center"}},[e._v("Example")])])]),e._v(" "),t("tbody",[t("tr",[t("td",{staticStyle:{"text-align":"left"}},[e._v("P2WPKH")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("xpub...")])]),e._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"left"}},[e._v("P2SH-P2WPKH")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("xpub...-[p2sh]")])]),e._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"left"}},[e._v("P2PKH")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("xpub...-[legacy]")])]),e._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"left"}},[e._v("Multi-sig P2WSH")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("2-of-xpub1...-xpub2...")])]),e._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"left"}},[e._v("Multi-sig P2SH-P2WSH")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("2-of-xpub1...-xpub2...-[p2sh]")])]),e._v(" "),t("tr",[t("td",{staticStyle:{"text-align":"left"}},[e._v("Multi-sig P2SH")]),e._v(" "),t("td",{staticStyle:{"text-align":"center"}},[e._v("2-of-xpub1...-xpub2...-[legacy]")])])])]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("On top of the xPub extended public key formats shown above, BTCPay Server supports yPub and zPub formats. Please note that these will be converted to xPub once the wallet setup is completed. This has no effect on how you receive or send funds.")])]),e._v(" "),t("h2",{attrs:{id:"what-is-a-replace-by-fee-rbf-transaction"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-a-replace-by-fee-rbf-transaction"}},[e._v("#")]),e._v(" What is a Replace-By-Fee (RBF) transaction?")]),e._v(" "),t("p",[e._v("A Replace-By-Fee (RBF) transaction is a feature of the Bitcoin protocol. Learn more about what it is, why it happens and the different types of RBF "),t("a",{attrs:{href:"https://bitcoin.stackexchange.com/a/54457/85016",target:"_blank",rel:"noopener noreferrer"}},[e._v("here"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("RBF capability is by default randomly enabled/disabled between transactions when using the BTCPay Server internal wallet, for enhanced privacy. In order to ensure it is enabled, or to disable it, see the advanced options of the BTCPay Server "),t("RouterLink",{attrs:{to:"/Wallet/#rbf-replace-by-fee"}},[e._v("internal wallet")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"does-btcpay-server-use-mempoolfullrbf-1-"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#does-btcpay-server-use-mempoolfullrbf-1-"}},[e._v("#")]),e._v(" Does BTCPay Server use mempoolfullrbf=1 ?")]),e._v(" "),t("p",[e._v("In very short, yes.\nWe've decided to add this as default to your BTCPay Server setup. However, we've also made it a fragment you can disable yourself.\nWithout mempoolfullrbf=1 if a customer is double-spending a payment with a transaction not signaling RBF, the merchant would only know after confirmation.")]),e._v(" "),t("p",[e._v("However, some users don't want to activate this policy. Some people consider that while it aligns with the merchant's incentive to activate it, it is considered against the interests of the network, as it makes accepting a payment with 0 confirmations harder once the policy is widely deployed.")]),e._v(" "),t("p",[e._v("To opt out use the following :")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token assign-left variable"}},[e._v("BTCPAYGEN_EXCLUDE_FRAGMENTS")]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("=")]),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"'),t("span",{pre:!0,attrs:{class:"token variable"}},[e._v("$BTCPAYGEN_EXCLUDE_FRAGMENTS")]),e._v(';opt-mempoolfullrbf"')]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v(" btcpay-setup.sh "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-i")]),e._v("\n")])])]),t("h2",{attrs:{id:"how-to-add-custom-labels-and-comments-to-transactions"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-add-custom-labels-and-comments-to-transactions"}},[e._v("#")]),e._v(" How to add custom labels and comments to transactions?")]),e._v(" "),t("p",[e._v("In addition to the "),t("RouterLink",{attrs:{to:"/Wallet/#transaction-labels"}},[e._v("automatic labels")]),e._v(", you can easily create your own custom transaction labels. Labels can be used for filtering transactions in the wallet view. You can also add individual comments to transactions to leave a note or description about the payment.")],1),e._v(" "),t("figure",[t("img",{attrs:{src:a(492),alt:"Custom Transaction Labels",title:"Custom Transaction Labels"}})]),e._v(" "),t("h2",{attrs:{id:"i-dont-see-lightning-network-payments-in-btcpay-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-dont-see-lightning-network-payments-in-btcpay-wallet"}},[e._v("#")]),e._v(" I don't see Lightning network payments in BTCPay wallet?")]),e._v(" "),t("p",[e._v("The "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning Network")]),e._v(" and the BTCPay Server "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("wallet")]),e._v(" are different concepts. The internal BTCPay Server wallet only shows on-chain payments.")],1),e._v(" "),t("p",[e._v("In the future they may become unified but for the time being, to manage your Lightning Network funds, use Ride the Lightning, ThunderHub, an externally connected Lightning wallet (Zeus, Zap, etc.), or the Command Line Interface (CLI).")]),e._v(" "),t("h2",{attrs:{id:"is-there-a-mobile-app-for-btcpay-server-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#is-there-a-mobile-app-for-btcpay-server-wallet"}},[e._v("#")]),e._v(" Is there a mobile app for BTCPay Server wallet?")]),e._v(" "),t("div",{staticClass:"custom-block tip"},[t("p",{staticClass:"custom-block-title"},[e._v("TIP")]),e._v(" "),t("p",[e._v("Update 11/2023:\nThere will be a mobile app for BTCPay Server wallet in the future. "),t("a",{attrs:{href:"https://twitter.com/BtcpayServer/status/1699114457421447543",target:"_blank",rel:"noopener noreferrer"}},[e._v("It is currently in development"),t("OutboundLink")],1),e._v(".")])]),e._v(" "),t("p",[e._v("BTCPay Server is a web app (not a mobile app) and may be viewed using any device that can display a web browser. There are mobile apps which allow you to connect to your BTCPay Server Lightning node (Zeus, Zap, etc.).")]),e._v(" "),t("p",[e._v("You can also use mobile apps to connect to your Bitcoin full node using either P2P or RPC. If you are on iOS you can easily connect to your Bitcoin full node using Fully Noded.")]),e._v(" "),t("p",[e._v("To connect your BTCPay node to Fully Noded:")]),e._v(" "),t("div",{staticClass:"language- extra-class"},[t("pre",[t("code",[e._v("1. Download Fully Noded from the App store.\n2. In BTCPay, go to Server Settings > Services and click on the Full Node RPC.\n3. Open your Fully Noded app, Quick Connect QR.\n4. Scan the QR code displayed on your BTCPay.\n5. Your Bitcoin full node is now connected to Fully Noded.\n")])])]),t("p",[e._v("Here are some node statuses and network information you can easily monitor from your Fully Noded:")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(493),alt:"Fully Noded",title:"Fully Noded"}})]),e._v(" "),t("h2",{attrs:{id:"how-can-i-use-psbt-partially-signed-bitcoin-transactions-with-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-can-i-use-psbt-partially-signed-bitcoin-transactions-with-btcpay-server"}},[e._v("#")]),e._v(" How can I use PSBT (partially signed bitcoin transactions) with BTCPay Server?")]),e._v(" "),t("p",[e._v("You can use BTCPay Server to create and/or broadcast PSBT. Check our guides to "),t("RouterLink",{attrs:{to:"/FAQ/ColdCardWallet/#spending-from-btcpay-server-wallet-with-coldcard-psbt"}},[e._v("Sign a PSBT transaction with ColdCard hardware wallet")]),e._v(" and "),t("RouterLink",{attrs:{to:"/FAQ/Sign-PSBT-with-sparrow-wallet/"}},[e._v("create and sign a PSBT transaction with Sparrow wallet")]),e._v(".")],1)])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/72.f8ac4708.js b/assets/js/72.e2a5c1d4.js similarity index 96% rename from assets/js/72.f8ac4708.js rename to assets/js/72.e2a5c1d4.js index ac89343cd4..a028508b42 100644 --- a/assets/js/72.f8ac4708.js +++ b/assets/js/72.e2a5c1d4.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{512:function(e,t,i){e.exports=i.p+"assets/img/Invoices.d261efe1.png"},513:function(e,t,i){e.exports=i.p+"assets/img/InvoiceFiltering.71317a76.gif"},853:function(e,t,i){"use strict";i.r(t);var a=i(17),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"what-is-an-invoice-in-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-an-invoice-in-btcpay-server"}},[e._v("#")]),e._v(" What is an invoice in BTCPay Server?")]),e._v(" "),t("p",[e._v("An "),t("strong",[e._v("invoice")]),e._v(" is a document issued by the seller to a buyer to collect payment.")]),e._v(" "),t("p",[e._v("In BTCPay Server, an invoice represents a document that must be paid within a "),t("strong",[e._v("defined time interval")]),e._v(" at a fixed exchange rate. Invoices have expiration because they lock the exchange rate within a specified time frame to protect the receiver from price fluctuations.")]),e._v(" "),t("figure",[t("img",{attrs:{src:i(512),alt:"Invoices",title:"Invoices"}})]),e._v(" "),t("p",[e._v("The core of BTCPay Server is the ability to act as a bitcoin invoice management system. An invoice is an essential tool for keeping track and managing a received payment.")]),e._v(" "),t("p",[e._v("Unless you use a built in "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("Wallet")]),e._v(" to receive payments manually, all payments within a store will be shown on the "),t("code",[e._v("Invoices")]),e._v(" page. This page cumulatively sorts payments by date and is a central piece for invoice management and payment troubleshooting.")],1),e._v(" "),t("h2",{attrs:{id:"invoice-statuses"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#invoice-statuses"}},[e._v("#")]),e._v(" Invoice statuses")]),e._v(" "),t("p",[e._v("Table below lists and describes common invoice statuses in BTCPay and suggests common actions.\nActions are just recommendations.\nIt's up to users to define best course of action for their use-case and business.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Invoice Status")]),e._v(" "),t("th",[e._v("Description")]),e._v(" "),t("th",[e._v("Action")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[t("strong",[e._v("New")])]),e._v(" "),t("td",[e._v("Not paid, invoice timer still has not expired")]),e._v(" "),t("td",[e._v("None")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("New (paidPartial)")])]),e._v(" "),t("td",[e._v("Paid, not in full, invoice timer still has not expired")]),e._v(" "),t("td",[e._v("None")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Expired")])]),e._v(" "),t("td",[e._v("Not paid, invoice timer expired")]),e._v(" "),t("td",[e._v("None")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Expired (paidPartial)")]),e._v(" **")]),e._v(" "),t("td",[e._v("Paid, not in full amount, and expired")]),e._v(" "),t("td",[e._v("Contact buyer to arrange a refund or ask for them to pay their due. Optionally mark invoice as settled or invalid")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Expired (paidLate)")])]),e._v(" "),t("td",[e._v("Paid, in full amount, after the invoice timer has expired")]),e._v(" "),t("td",[e._v("Contact buyer to arrange a refund or process order if late confirmations are acceptable.")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Settled (paidOver)")])]),e._v(" "),t("td",[e._v("Paid more than the invoice amount, settled, received sufficient amount of confirmations")]),e._v(" "),t("td",[e._v("Contact buyer to arrange a refund for the extra amount, or optionally wait for buyer to contact you")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Processing")])]),e._v(" "),t("td",[e._v("Paid in full, but has not received sufficient amount of confirmations specified in the store settings")]),e._v(" "),t("td",[e._v("Wait for confirmations (The invoice should become - settled)")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Processing (paidOver)")])]),e._v(" "),t("td",[e._v("Paid more than the invoice amount, not received sufficient amount of confirmations")]),e._v(" "),t("td",[e._v("Wait to be settled then contact buyer to arrange a refund for the extra amount, or optionally wait for buyer to contact you")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Settled")])]),e._v(" "),t("td",[e._v("Paid, in full, received sufficient amount of confirmations in store")]),e._v(" "),t("td",[e._v("Fulfil the order")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Settled (marked)")])]),e._v(" "),t("td",[e._v("Status was manually changed to settled from an processing or invalid status")]),e._v(" "),t("td",[e._v("Store admin has marked the payment as settled")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Invalid*")])]),e._v(" "),t("td",[e._v("Paid, but failed to receive sufficient amount of confirmations within the time specified in store settings")]),e._v(" "),t("td",[e._v("Check the transaction on a blockchain explorer, if it received sufficient confirmations, mark as settled")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Invalid (marked)")])]),e._v(" "),t("td",[e._v("Status was manually changed to invalid from a settled or expired status")]),e._v(" "),t("td",[e._v("Store admin has marked the payment as invalid")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Invalid (paidOver)")])]),e._v(" "),t("td",[e._v("Paid more than the invoice amount, but failed to receive sufficient amount of confirmations within the time specified in store settings")]),e._v(" "),t("td",[e._v("Check the transaction on a blockchain explorer, if it received sufficient confirmations, mark as settled")])])])]),e._v(" "),t("ul",[t("li",[t("ul",[t("li",[e._v("Invoices paid via the "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning Network")]),e._v(" immediately go to a settled state, as their settlement is instant.")],1)])]),e._v(" "),t("li",[e._v("** Paid Partial invoice usually happens when a buyer pays the invoice from the exchange wallet which takes a fee for their service and deducts it from a total. In some cases, it happens when buyer enters an incorrect amount in their wallet.")]),e._v(" "),t("li",[e._v("*** Invalid - If you're receiving a lot of invalid invoices in your store, you may want to "),t("RouterLink",{attrs:{to:"/FAQ/Stores/#payment-invalid-if-transactions-fails-to-confirm-minutes-after-invoice-expiration"}},[e._v("adjust invalid invoice time in store settings")]),e._v(".")],1)]),e._v(" "),t("h3",{attrs:{id:"invoice-details"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#invoice-details"}},[e._v("#")]),e._v(" Invoice details")]),e._v(" "),t("p",[e._v("The invoice details page contains all information related to an invoice.")]),e._v(" "),t("p",[e._v("Invoice information is created automatically based on invoice status, exchange rate, etc. Product information is created automatically if the invoice was created with product information such as in the Point of Sale app. Read about collecting Buyer information "),t("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-collect-additional-buyer-information"}},[e._v("here")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"invoice-filtering"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#invoice-filtering"}},[e._v("#")]),e._v(" Invoice filtering")]),e._v(" "),t("p",[e._v("Invoices can be filtered via the quick filters located next to the search button or the advanced filters, which can be toggled by clicking the (Help) link on the top. Users can "),t("strong",[e._v("filter invoices")]),e._v(" by store, order id, item id, status, or date.")]),e._v(" "),t("figure",[t("img",{attrs:{src:i(513),alt:"Invoice Filtering",title:"Invoice Filtering"}})]),e._v(" "),t("h3",{attrs:{id:"invoice-export"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#invoice-export"}},[e._v("#")]),e._v(" Invoice export")]),e._v(" "),t("p",[e._v("BTCPay Server Invoices can be exported in CSV or JSON format. For more information about invoice export and accounting, "),t("RouterLink",{attrs:{to:"/Reporting/"}},[e._v("see this page")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"refunding-an-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#refunding-an-invoice"}},[e._v("#")]),e._v(" Refunding an invoice")]),e._v(" "),t("p",[e._v("If for any reason you would like to issue a refund, you can easily create a refund from the invoice view. Check our "),t("RouterLink",{attrs:{to:"/Refund/"}},[e._v("refunding documentation")]),e._v(" for more information.")],1),e._v(" "),t("h2",{attrs:{id:"archiving-invoices"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#archiving-invoices"}},[e._v("#")]),e._v(" Archiving invoices")]),e._v(" "),t("p",[e._v("As a result of the no address re-use feature of BTCPay Server, it's common to see many expired invoices in your store's invoice page. To hide them from your view, select them in the list and mark them as "),t("strong",[e._v("archived")]),e._v(". Invoices that have been marked as archived are not deleted. Payment to an archived invoice will still be detected by your BTCPay Server (paidLate status). You can view the store's archived invoices at any time by selecting archived invoices from the search filter dropdown.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{524:function(e,t,i){e.exports=i.p+"assets/img/Invoices.d261efe1.png"},525:function(e,t,i){e.exports=i.p+"assets/img/InvoiceFiltering.71317a76.gif"},855:function(e,t,i){"use strict";i.r(t);var a=i(17),n=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"what-is-an-invoice-in-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-is-an-invoice-in-btcpay-server"}},[e._v("#")]),e._v(" What is an invoice in BTCPay Server?")]),e._v(" "),t("p",[e._v("An "),t("strong",[e._v("invoice")]),e._v(" is a document issued by the seller to a buyer to collect payment.")]),e._v(" "),t("p",[e._v("In BTCPay Server, an invoice represents a document that must be paid within a "),t("strong",[e._v("defined time interval")]),e._v(" at a fixed exchange rate. Invoices have expiration because they lock the exchange rate within a specified time frame to protect the receiver from price fluctuations.")]),e._v(" "),t("figure",[t("img",{attrs:{src:i(524),alt:"Invoices",title:"Invoices"}})]),e._v(" "),t("p",[e._v("The core of BTCPay Server is the ability to act as a bitcoin invoice management system. An invoice is an essential tool for keeping track and managing a received payment.")]),e._v(" "),t("p",[e._v("Unless you use a built in "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("Wallet")]),e._v(" to receive payments manually, all payments within a store will be shown on the "),t("code",[e._v("Invoices")]),e._v(" page. This page cumulatively sorts payments by date and is a central piece for invoice management and payment troubleshooting.")],1),e._v(" "),t("h2",{attrs:{id:"invoice-statuses"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#invoice-statuses"}},[e._v("#")]),e._v(" Invoice statuses")]),e._v(" "),t("p",[e._v("Table below lists and describes common invoice statuses in BTCPay and suggests common actions.\nActions are just recommendations.\nIt's up to users to define best course of action for their use-case and business.")]),e._v(" "),t("table",[t("thead",[t("tr",[t("th",[e._v("Invoice Status")]),e._v(" "),t("th",[e._v("Description")]),e._v(" "),t("th",[e._v("Action")])])]),e._v(" "),t("tbody",[t("tr",[t("td",[t("strong",[e._v("New")])]),e._v(" "),t("td",[e._v("Not paid, invoice timer still has not expired")]),e._v(" "),t("td",[e._v("None")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("New (paidPartial)")])]),e._v(" "),t("td",[e._v("Paid, not in full, invoice timer still has not expired")]),e._v(" "),t("td",[e._v("None")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Expired")])]),e._v(" "),t("td",[e._v("Not paid, invoice timer expired")]),e._v(" "),t("td",[e._v("None")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Expired (paidPartial)")]),e._v(" **")]),e._v(" "),t("td",[e._v("Paid, not in full amount, and expired")]),e._v(" "),t("td",[e._v("Contact buyer to arrange a refund or ask for them to pay their due. Optionally mark invoice as settled or invalid")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Expired (paidLate)")])]),e._v(" "),t("td",[e._v("Paid, in full amount, after the invoice timer has expired")]),e._v(" "),t("td",[e._v("Contact buyer to arrange a refund or process order if late confirmations are acceptable.")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Settled (paidOver)")])]),e._v(" "),t("td",[e._v("Paid more than the invoice amount, settled, received sufficient amount of confirmations")]),e._v(" "),t("td",[e._v("Contact buyer to arrange a refund for the extra amount, or optionally wait for buyer to contact you")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Processing")])]),e._v(" "),t("td",[e._v("Paid in full, but has not received sufficient amount of confirmations specified in the store settings")]),e._v(" "),t("td",[e._v("Wait for confirmations (The invoice should become - settled)")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Processing (paidOver)")])]),e._v(" "),t("td",[e._v("Paid more than the invoice amount, not received sufficient amount of confirmations")]),e._v(" "),t("td",[e._v("Wait to be settled then contact buyer to arrange a refund for the extra amount, or optionally wait for buyer to contact you")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Settled")])]),e._v(" "),t("td",[e._v("Paid, in full, received sufficient amount of confirmations in store")]),e._v(" "),t("td",[e._v("Fulfil the order")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Settled (marked)")])]),e._v(" "),t("td",[e._v("Status was manually changed to settled from an processing or invalid status")]),e._v(" "),t("td",[e._v("Store admin has marked the payment as settled")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Invalid*")])]),e._v(" "),t("td",[e._v("Paid, but failed to receive sufficient amount of confirmations within the time specified in store settings")]),e._v(" "),t("td",[e._v("Check the transaction on a blockchain explorer, if it received sufficient confirmations, mark as settled")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Invalid (marked)")])]),e._v(" "),t("td",[e._v("Status was manually changed to invalid from a settled or expired status")]),e._v(" "),t("td",[e._v("Store admin has marked the payment as invalid")])]),e._v(" "),t("tr",[t("td",[t("strong",[e._v("Invalid (paidOver)")])]),e._v(" "),t("td",[e._v("Paid more than the invoice amount, but failed to receive sufficient amount of confirmations within the time specified in store settings")]),e._v(" "),t("td",[e._v("Check the transaction on a blockchain explorer, if it received sufficient confirmations, mark as settled")])])])]),e._v(" "),t("ul",[t("li",[t("ul",[t("li",[e._v("Invoices paid via the "),t("RouterLink",{attrs:{to:"/LightningNetwork/"}},[e._v("Lightning Network")]),e._v(" immediately go to a settled state, as their settlement is instant.")],1)])]),e._v(" "),t("li",[e._v("** Paid Partial invoice usually happens when a buyer pays the invoice from the exchange wallet which takes a fee for their service and deducts it from a total. In some cases, it happens when buyer enters an incorrect amount in their wallet.")]),e._v(" "),t("li",[e._v("*** Invalid - If you're receiving a lot of invalid invoices in your store, you may want to "),t("RouterLink",{attrs:{to:"/FAQ/Stores/#payment-invalid-if-transactions-fails-to-confirm-minutes-after-invoice-expiration"}},[e._v("adjust invalid invoice time in store settings")]),e._v(".")],1)]),e._v(" "),t("h3",{attrs:{id:"invoice-details"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#invoice-details"}},[e._v("#")]),e._v(" Invoice details")]),e._v(" "),t("p",[e._v("The invoice details page contains all information related to an invoice.")]),e._v(" "),t("p",[e._v("Invoice information is created automatically based on invoice status, exchange rate, etc. Product information is created automatically if the invoice was created with product information such as in the Point of Sale app. Read about collecting Buyer information "),t("RouterLink",{attrs:{to:"/FAQ/Stores/#how-to-collect-additional-buyer-information"}},[e._v("here")]),e._v(".")],1),e._v(" "),t("h3",{attrs:{id:"invoice-filtering"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#invoice-filtering"}},[e._v("#")]),e._v(" Invoice filtering")]),e._v(" "),t("p",[e._v("Invoices can be filtered via the quick filters located next to the search button or the advanced filters, which can be toggled by clicking the (Help) link on the top. Users can "),t("strong",[e._v("filter invoices")]),e._v(" by store, order id, item id, status, or date.")]),e._v(" "),t("figure",[t("img",{attrs:{src:i(525),alt:"Invoice Filtering",title:"Invoice Filtering"}})]),e._v(" "),t("h3",{attrs:{id:"invoice-export"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#invoice-export"}},[e._v("#")]),e._v(" Invoice export")]),e._v(" "),t("p",[e._v("BTCPay Server Invoices can be exported in CSV or JSON format. For more information about invoice export and accounting, "),t("RouterLink",{attrs:{to:"/Reporting/"}},[e._v("see this page")]),e._v(".")],1),e._v(" "),t("h2",{attrs:{id:"refunding-an-invoice"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#refunding-an-invoice"}},[e._v("#")]),e._v(" Refunding an invoice")]),e._v(" "),t("p",[e._v("If for any reason you would like to issue a refund, you can easily create a refund from the invoice view. Check our "),t("RouterLink",{attrs:{to:"/Refund/"}},[e._v("refunding documentation")]),e._v(" for more information.")],1),e._v(" "),t("h2",{attrs:{id:"archiving-invoices"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#archiving-invoices"}},[e._v("#")]),e._v(" Archiving invoices")]),e._v(" "),t("p",[e._v("As a result of the no address re-use feature of BTCPay Server, it's common to see many expired invoices in your store's invoice page. To hide them from your view, select them in the list and mark them as "),t("strong",[e._v("archived")]),e._v(". Invoices that have been marked as archived are not deleted. Payment to an archived invoice will still be detected by your BTCPay Server (paidLate status). You can view the store's archived invoices at any time by selecting archived invoices from the search filter dropdown.")])])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/73.f971e08e.js b/assets/js/73.1210fc2b.js similarity index 97% rename from assets/js/73.f971e08e.js rename to assets/js/73.1210fc2b.js index 3fff301d23..3e7c93d1c4 100644 --- a/assets/js/73.f971e08e.js +++ b/assets/js/73.1210fc2b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{750:function(e,t,o){e.exports=o.p+"assets/img/zap-sample1.986ba1de.png"},751:function(e,t,o){e.exports=o.p+"assets/img/ExampleApiPermissions.ca8b30c0.jpeg"},908:function(e,t,o){"use strict";o.r(t);var a=o(17),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"easy-automation-for-btcpay-server-using-zapiercom-no-programming-skills-required"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#easy-automation-for-btcpay-server-using-zapiercom-no-programming-skills-required"}},[e._v("#")]),e._v(" Easy Automation for BTCPay Server using Zapier.com - No Programming Skills Required")]),e._v(" "),t("p",[e._v("BTCPay Server can be automated in an unlimited number of ways by using it in a "),t("a",{attrs:{href:"https://zapier.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Zapier"),t("OutboundLink")],1),e._v(" workflow.\nZapier is a simple tool for non-technical people to set up automations, simply by connecting blocks.")]),e._v(" "),t("h2",{attrs:{id:"free-to-use"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#free-to-use"}},[e._v("#")]),e._v(" Free to Use")]),e._v(" "),t("p",[e._v('The BTCPay Server Zapier integration is free to use, but you do need a Zapier.com account.\nA free account lets you process 100 actions a month and have 3 workflows called "Zaps".')]),e._v(" "),t("h2",{attrs:{id:"what-does-it-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-does-it-do"}},[e._v("#")]),e._v(" What does it do?")]),e._v(" "),t("p",[e._v("The BTCPay Server integration on Zapier defines a number of triggers that can be used to tell other applications what to do. You can chain multiple actions and create an entire workflow.\nBesides triggers, there is also a list of actions to make BTCPay Server do something you want. This can be creating an invoice, for example. In this case the trigger can be something happening on BTCPay Server or in another app or because you received an email.")]),e._v(" "),t("p",[e._v("A simple automation looks like this:\n"),t("img",{attrs:{src:o(750),alt:"Sample Workflow in Zapier",title:"Sample Workflow in Zapier"}})]),e._v(" "),t("h2",{attrs:{id:"who-is-it-for"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#who-is-it-for"}},[e._v("#")]),e._v(" Who is it for?")]),e._v(" "),t("p",[e._v("Zapier is an easy way for non-technical people to automate their workflow. It is also highly flexible and allows you to experiment.")]),e._v(" "),t("p",[e._v("If you are expecting heavy loads however, hiring a developer and building your own custom integration may be cheaper in the long run.")]),e._v(" "),t("h2",{attrs:{id:"some-examples"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#some-examples"}},[e._v("#")]),e._v(" Some Examples")]),e._v(" "),t("ul",[t("li",[e._v('When an invoice is paid in BTCPay Server, automatically send a "Thank You" email.')]),e._v(" "),t("li",[e._v("When an invoice is settled, create a payment in your accounting software.")]),e._v(" "),t("li",[e._v("When an invoice is paid in BTCPay Server, wait 7 days and then automatically send an email to ask your customer to write a review for your store.")]),e._v(" "),t("li",[e._v("At the end of the day, automatically move 75% of your funds from a hot wallet to you cold wallet.")]),e._v(" "),t("li",[e._v("When an invoice expires, notify your sales team by sending a message in Slack.")]),e._v(" "),t("li",[e._v("Automatically add customer email addresses to your Mailchimp account or other newsletter system.")]),e._v(" "),t("li",[e._v("Automatically create a new payment request when a row is inserted in a Google Spreadsheet + send the payment link to your customer via email.")])]),e._v(" "),t("h2",{attrs:{id:"getting-started"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[e._v("#")]),e._v(" Getting Started")]),e._v(" "),t("p",[e._v("Head over to the "),t("a",{attrs:{href:"https://zapier.com/apps/btcpay-server/integrations",target:"_blank",rel:"noopener noreferrer"}},[e._v("integrations documentation"),t("OutboundLink")],1),e._v(" to get started. You will see some examples here + a list of all triggers and actions we support.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/RylpDWt30uc/hqdefault.jpg)"},attrs:{href:"https://youtu.be/RylpDWt30uc",title:"BTCPay Server - Zapier","data-id":"RylpDWt30uc"}},[t("iframe",{attrs:{title:"BTCPay Server - Zapier","data-src":"https://www.youtube-nocookie.com/embed/RylpDWt30uc?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("An account at Zapier.com (free or paid)")]),e._v(" "),t("li",[e._v("A BTCPay Server instance where you have 1 or more stores")]),e._v(" "),t("li",[e._v("An API key that has access to the store and resources you want to automate (BEWARE: Never grant more permissions than is absolutely needed!). See below which permissions you should pick for your API key.")])]),e._v(" "),t("h2",{attrs:{id:"security-considerations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security-considerations"}},[e._v("#")]),e._v(" Security Considerations")]),e._v(" "),t("p",[e._v("With great power comes great responsibility. So when you automate your BTCPay Server, you should consider the things that could go wrong or get abused if someone were to get hold of your API Key.\nBecause you will be providing Zapier with your API key, we strongly encourage you to create an API key with as little permissions as possible.\nIf you are only going to automate a single store, make sure the API key only has access to the resources for that specific store.\nBTCPay Server allows you to configure access per store, so use it.")]),e._v(" "),t("h2",{attrs:{id:"which-permissions-should-i-choose-for-my-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#which-permissions-should-i-choose-for-my-api-key"}},[e._v("#")]),e._v(" Which permissions should I choose for my API key?")]),e._v(" "),t("p",[e._v("Choosing permissions depends on what you are going to do with Zapier. This list helps you make some choices.")]),e._v(" "),t("p",[e._v("If you want to use "),t("strong",[e._v("triggers")]),e._v(", you will need to have the permission "),t("code",[e._v("btcpay.store.webhooks.canmodifywebhooks")]),e._v(". It is easy to overlook this one, but Zapier gets its triggers from a webhook, so that must be allowed.")]),e._v(" "),t("p",[e._v("For the various actions we have, you will need different permissions, like if you want to create or modify an invoice, you will need the "),t("code",[e._v("btcpay.store.cancreateinvoice")]),e._v(" and "),t("code",[e._v("btcpay.store.canmodifyinvoices")]),e._v(" permissions.")]),e._v(" "),t("p",[e._v("Viewing stores and invoices is also a good idea to add anyway, so those would be "),t("code",[e._v("btcpay.store.canviewinvoices")]),e._v(" and "),t("code",[e._v("btcpay.store.canviewstoresettings")]),e._v(".")]),e._v(" "),t("p",[e._v("A good place to start would be these permissions:\n"),t("img",{attrs:{src:o(751),alt:"Example API Permissions",title:"Example API Permissions"}})]),e._v(" "),t("h2",{attrs:{id:"how-does-it-work-technically"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-it-work-technically"}},[e._v("#")]),e._v(" How does it work technically?")]),e._v(" "),t("ul",[t("li",[e._v("Every trigger registers its own webhook in the store it is for. There are no global webhooks in BTCPay Server, only ones per store.")]),e._v(" "),t("li",[e._v("The webhook only handles the single event it is created for.")]),e._v(" "),t("li",[e._v("When you enable the Zap, the webhook is automatically created in BTCPay Server and when you disable, the webhook is deleted.")]),e._v(" "),t("li",[e._v("Each webhook uses its own secret, randomly generated by BTCPay Server.")]),e._v(" "),t("li",[e._v("The webhook's request signature "),t("code",[e._v("BTCPay-Sig")]),e._v(" is used to verify the identity of the sender.")])]),e._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h3",{attrs:{id:"i-got-a-403-forbidden-error-what-happened"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-got-a-403-forbidden-error-what-happened"}},[e._v("#")]),e._v(" I got a 403 Forbidden error, what happened?")]),e._v(" "),t("p",[e._v("You are most likely using an API key that does not have the required permissions. If you are using any of the triggers in Zapier, always make sure you have the "),t("code",[e._v("btcpay.store.webhooks.canmodifywebhooks")]),e._v(" permission.")]),e._v(" "),t("h3",{attrs:{id:"i-deleted-the-webhook-from-my-btcpay-server-store-by-mistake"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-deleted-the-webhook-from-my-btcpay-server-store-by-mistake"}},[e._v("#")]),e._v(" I deleted the webhook from my BTCPay Server store by mistake.")]),e._v(" "),t("p",[e._v("No worries. Just turn your Zap off and on again and the webhook will automatically be recreated in BTCPay Server.")]),e._v(" "),t("h2",{attrs:{id:"source-code-issues-and-feature-requests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#source-code-issues-and-feature-requests"}},[e._v("#")]),e._v(" Source Code, Issues and Feature Requests")]),e._v(" "),t("p",[e._v("The Zapier integration source code is available on GitHub at the "),t("a",{attrs:{href:"https://github.com/btcpayserver/zapier",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Zapier repository"),t("OutboundLink")],1),e._v(".\nYou can also log issues here and ask for missing features.\nIssues can also be reported through Zapier as you encounter them.")]),e._v(" "),t("h2",{attrs:{id:"credits-and-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#credits-and-support"}},[e._v("#")]),e._v(" Credits and Support")]),e._v(" "),t("p",[e._v("The BTCPay Server Zapier integration was developed by "),t("a",{attrs:{href:"https://www.storefront.be/en/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Storefront.be"),t("OutboundLink")],1),e._v(" in their ongoing effort to support this community.")]),e._v(" "),t("p",[e._v("If you are looking to hire professional support or could use a developer for a custom integration, feel free to reach out at "),t("a",{attrs:{href:"https://www.storefront.be/en/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Storefront.be"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("This repository contains the Zapier integration for BTCPay Server.\nThe Zapier integration allows you to use triggers from BTCPay Server (like when a new invoice was created, paid or expired) to trigger actions in other systems, like send an email, post a chat message, etc.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[73],{731:function(e,t,o){e.exports=o.p+"assets/img/zap-sample1.986ba1de.png"},732:function(e,t,o){e.exports=o.p+"assets/img/ExampleApiPermissions.ca8b30c0.jpeg"},906:function(e,t,o){"use strict";o.r(t);var a=o(17),r=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"easy-automation-for-btcpay-server-using-zapiercom-no-programming-skills-required"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#easy-automation-for-btcpay-server-using-zapiercom-no-programming-skills-required"}},[e._v("#")]),e._v(" Easy Automation for BTCPay Server using Zapier.com - No Programming Skills Required")]),e._v(" "),t("p",[e._v("BTCPay Server can be automated in an unlimited number of ways by using it in a "),t("a",{attrs:{href:"https://zapier.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Zapier"),t("OutboundLink")],1),e._v(" workflow.\nZapier is a simple tool for non-technical people to set up automations, simply by connecting blocks.")]),e._v(" "),t("h2",{attrs:{id:"free-to-use"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#free-to-use"}},[e._v("#")]),e._v(" Free to Use")]),e._v(" "),t("p",[e._v('The BTCPay Server Zapier integration is free to use, but you do need a Zapier.com account.\nA free account lets you process 100 actions a month and have 3 workflows called "Zaps".')]),e._v(" "),t("h2",{attrs:{id:"what-does-it-do"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#what-does-it-do"}},[e._v("#")]),e._v(" What does it do?")]),e._v(" "),t("p",[e._v("The BTCPay Server integration on Zapier defines a number of triggers that can be used to tell other applications what to do. You can chain multiple actions and create an entire workflow.\nBesides triggers, there is also a list of actions to make BTCPay Server do something you want. This can be creating an invoice, for example. In this case the trigger can be something happening on BTCPay Server or in another app or because you received an email.")]),e._v(" "),t("p",[e._v("A simple automation looks like this:\n"),t("img",{attrs:{src:o(731),alt:"Sample Workflow in Zapier",title:"Sample Workflow in Zapier"}})]),e._v(" "),t("h2",{attrs:{id:"who-is-it-for"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#who-is-it-for"}},[e._v("#")]),e._v(" Who is it for?")]),e._v(" "),t("p",[e._v("Zapier is an easy way for non-technical people to automate their workflow. It is also highly flexible and allows you to experiment.")]),e._v(" "),t("p",[e._v("If you are expecting heavy loads however, hiring a developer and building your own custom integration may be cheaper in the long run.")]),e._v(" "),t("h2",{attrs:{id:"some-examples"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#some-examples"}},[e._v("#")]),e._v(" Some Examples")]),e._v(" "),t("ul",[t("li",[e._v('When an invoice is paid in BTCPay Server, automatically send a "Thank You" email.')]),e._v(" "),t("li",[e._v("When an invoice is settled, create a payment in your accounting software.")]),e._v(" "),t("li",[e._v("When an invoice is paid in BTCPay Server, wait 7 days and then automatically send an email to ask your customer to write a review for your store.")]),e._v(" "),t("li",[e._v("At the end of the day, automatically move 75% of your funds from a hot wallet to you cold wallet.")]),e._v(" "),t("li",[e._v("When an invoice expires, notify your sales team by sending a message in Slack.")]),e._v(" "),t("li",[e._v("Automatically add customer email addresses to your Mailchimp account or other newsletter system.")]),e._v(" "),t("li",[e._v("Automatically create a new payment request when a row is inserted in a Google Spreadsheet + send the payment link to your customer via email.")])]),e._v(" "),t("h2",{attrs:{id:"getting-started"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[e._v("#")]),e._v(" Getting Started")]),e._v(" "),t("p",[e._v("Head over to the "),t("a",{attrs:{href:"https://zapier.com/apps/btcpay-server/integrations",target:"_blank",rel:"noopener noreferrer"}},[e._v("integrations documentation"),t("OutboundLink")],1),e._v(" to get started. You will see some examples here + a list of all triggers and actions we support.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/RylpDWt30uc/hqdefault.jpg)"},attrs:{href:"https://youtu.be/RylpDWt30uc",title:"BTCPay Server - Zapier","data-id":"RylpDWt30uc"}},[t("iframe",{attrs:{title:"BTCPay Server - Zapier","data-src":"https://www.youtube-nocookie.com/embed/RylpDWt30uc?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"requirements"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[e._v("#")]),e._v(" Requirements")]),e._v(" "),t("ul",[t("li",[e._v("An account at Zapier.com (free or paid)")]),e._v(" "),t("li",[e._v("A BTCPay Server instance where you have 1 or more stores")]),e._v(" "),t("li",[e._v("An API key that has access to the store and resources you want to automate (BEWARE: Never grant more permissions than is absolutely needed!). See below which permissions you should pick for your API key.")])]),e._v(" "),t("h2",{attrs:{id:"security-considerations"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#security-considerations"}},[e._v("#")]),e._v(" Security Considerations")]),e._v(" "),t("p",[e._v("With great power comes great responsibility. So when you automate your BTCPay Server, you should consider the things that could go wrong or get abused if someone were to get hold of your API Key.\nBecause you will be providing Zapier with your API key, we strongly encourage you to create an API key with as little permissions as possible.\nIf you are only going to automate a single store, make sure the API key only has access to the resources for that specific store.\nBTCPay Server allows you to configure access per store, so use it.")]),e._v(" "),t("h2",{attrs:{id:"which-permissions-should-i-choose-for-my-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#which-permissions-should-i-choose-for-my-api-key"}},[e._v("#")]),e._v(" Which permissions should I choose for my API key?")]),e._v(" "),t("p",[e._v("Choosing permissions depends on what you are going to do with Zapier. This list helps you make some choices.")]),e._v(" "),t("p",[e._v("If you want to use "),t("strong",[e._v("triggers")]),e._v(", you will need to have the permission "),t("code",[e._v("btcpay.store.webhooks.canmodifywebhooks")]),e._v(". It is easy to overlook this one, but Zapier gets its triggers from a webhook, so that must be allowed.")]),e._v(" "),t("p",[e._v("For the various actions we have, you will need different permissions, like if you want to create or modify an invoice, you will need the "),t("code",[e._v("btcpay.store.cancreateinvoice")]),e._v(" and "),t("code",[e._v("btcpay.store.canmodifyinvoices")]),e._v(" permissions.")]),e._v(" "),t("p",[e._v("Viewing stores and invoices is also a good idea to add anyway, so those would be "),t("code",[e._v("btcpay.store.canviewinvoices")]),e._v(" and "),t("code",[e._v("btcpay.store.canviewstoresettings")]),e._v(".")]),e._v(" "),t("p",[e._v("A good place to start would be these permissions:\n"),t("img",{attrs:{src:o(732),alt:"Example API Permissions",title:"Example API Permissions"}})]),e._v(" "),t("h2",{attrs:{id:"how-does-it-work-technically"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-it-work-technically"}},[e._v("#")]),e._v(" How does it work technically?")]),e._v(" "),t("ul",[t("li",[e._v("Every trigger registers its own webhook in the store it is for. There are no global webhooks in BTCPay Server, only ones per store.")]),e._v(" "),t("li",[e._v("The webhook only handles the single event it is created for.")]),e._v(" "),t("li",[e._v("When you enable the Zap, the webhook is automatically created in BTCPay Server and when you disable, the webhook is deleted.")]),e._v(" "),t("li",[e._v("Each webhook uses its own secret, randomly generated by BTCPay Server.")]),e._v(" "),t("li",[e._v("The webhook's request signature "),t("code",[e._v("BTCPay-Sig")]),e._v(" is used to verify the identity of the sender.")])]),e._v(" "),t("h2",{attrs:{id:"troubleshooting"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#troubleshooting"}},[e._v("#")]),e._v(" Troubleshooting")]),e._v(" "),t("h3",{attrs:{id:"i-got-a-403-forbidden-error-what-happened"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-got-a-403-forbidden-error-what-happened"}},[e._v("#")]),e._v(" I got a 403 Forbidden error, what happened?")]),e._v(" "),t("p",[e._v("You are most likely using an API key that does not have the required permissions. If you are using any of the triggers in Zapier, always make sure you have the "),t("code",[e._v("btcpay.store.webhooks.canmodifywebhooks")]),e._v(" permission.")]),e._v(" "),t("h3",{attrs:{id:"i-deleted-the-webhook-from-my-btcpay-server-store-by-mistake"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#i-deleted-the-webhook-from-my-btcpay-server-store-by-mistake"}},[e._v("#")]),e._v(" I deleted the webhook from my BTCPay Server store by mistake.")]),e._v(" "),t("p",[e._v("No worries. Just turn your Zap off and on again and the webhook will automatically be recreated in BTCPay Server.")]),e._v(" "),t("h2",{attrs:{id:"source-code-issues-and-feature-requests"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#source-code-issues-and-feature-requests"}},[e._v("#")]),e._v(" Source Code, Issues and Feature Requests")]),e._v(" "),t("p",[e._v("The Zapier integration source code is available on GitHub at the "),t("a",{attrs:{href:"https://github.com/btcpayserver/zapier",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server Zapier repository"),t("OutboundLink")],1),e._v(".\nYou can also log issues here and ask for missing features.\nIssues can also be reported through Zapier as you encounter them.")]),e._v(" "),t("h2",{attrs:{id:"credits-and-support"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#credits-and-support"}},[e._v("#")]),e._v(" Credits and Support")]),e._v(" "),t("p",[e._v("The BTCPay Server Zapier integration was developed by "),t("a",{attrs:{href:"https://www.storefront.be/en/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Storefront.be"),t("OutboundLink")],1),e._v(" in their ongoing effort to support this community.")]),e._v(" "),t("p",[e._v("If you are looking to hire professional support or could use a developer for a custom integration, feel free to reach out at "),t("a",{attrs:{href:"https://www.storefront.be/en/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Storefront.be"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("This repository contains the Zapier integration for BTCPay Server.\nThe Zapier integration allows you to use triggers from BTCPay Server (like when a new invoice was created, paid or expired) to trigger actions in other systems, like send an email, post a chat message, etc.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/75.89e3020f.js b/assets/js/75.0456fd85.js similarity index 99% rename from assets/js/75.89e3020f.js rename to assets/js/75.0456fd85.js index ec0d28b234..47f2327d2b 100644 --- a/assets/js/75.89e3020f.js +++ b/assets/js/75.0456fd85.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{349:function(t,s){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhkAAAM7CAMAAADQ13IwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMAUExURUpQV0pQfUp2fXJQV3JQfXJ2V3J2fUpQnUp2uHJQnXJ2uF6xNV+yNma1P3OxNV6xT16xXF6xcF6xfF68fHO6T17BcF6xkF6xll6xnl6xpF6xql6xsXKYnXOxsUqY03KY03K003K01nK06V7JpF7Jql7Gvl7NxF7Xy17Z0l7h35ZQV5ZQfbN2V7N2fdcSANkSAN0SANcSUt0SUt1hAOFhAJZQnZZ2uLN2ndkShNlhhNdhpeFhhIixNY2xNYi8NaexNaK8NY2ZfbOYV6anfZ3BNaLPNazBNZfNdsCxNca8NeaLAN2LUtCYV9CYfdC0fe2sUui0fcvGNdXUNeDcNeDfNdvbfNvjaerkaZCXnp6XnpCXq56Xq5CXt56Xt56knpa0uK2Xnq2Xq62Xt7+knrO0naexsb+kq5Ckx56kx5Cz2Z6z2a2kx5fNlpfSnpfWvqzNirHSlr/Dq7/Jt7PQuJ7Dx5bQ057D7JbQ6ZbQ/5fl5a3W2a3W/7Hm37vl0qfr8qzt+bPp6bvr7Lvt7L/q7LPp/7vu8r/q/7bw+dmLhNSznteLxtms59DQncDguMbkuNXjsdXlsdDpuODeiv/LhP/QnerDq//Wt+DgluXjluXkkPXqivXrkPXrlvXrnuXmqurrqvXvqv/lpfrvpPXvsf/puPXysfXyuPXzvv/zsfr0vv/0uP/0vt3L/9D/09v238Dv8sDy+cDz/8b0/8v2/9Dt5d7i5t/j59Dv8tD0+dD1/9X68tD//9X5+dX6/9T//9v28tv2+dv7/+Hlxuj/0+r/2f/qx///xv/6y///0//62P//2f//3+Ll6OPm6eTn6uHl/+3u8Ojp/+j/6eD5/+D9/+D+/+X//+/w8ur9/+j//+3////p6f/95f//5f//5///6f//7PPz8/P09vT09PT19/b29vf39/X2+Pb3+fD/8vD9//D///X+///98v/+8vj4+Pj5+vv7+/r7/Pr////++fz8/P39/f7+/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAL205qsAAAAJcEhZcwAADsMAAA7DAcdvqGQAAB5iSURBVHhe7d1teGTnfdfxs6ybXa8TaGmakiaooEJpZe2mcXBcSIAS6ANBjqfPaSgQSCCEPqRpcFBraENRQmynadPILm2BYKo+pe5D2mpaKkhLWm9Ud1beBNhFbeOJd9eSgBBFTmbnvOS+z/lJ2tX/3uRotceje/7fz2VrjkYjvfl9fc6Mr0ua4hNACmUgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtIoA2mUgTRbxlPDEl4Mn9LqlinjKX0PfLhmGqYMzhi+DLW7YcrQN8AL7W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G4eijPmJ+vb0bY/VB3j6aHejYRn96SKY1Wfl8otXdXRwMxM7ZTz+knP1AZ4+2t1oWsbJOR1VFk7cuDKCuox3n3rh21906v7qHjxttLuxvzKWX/yKoji2NB/OH8dXl6eKYrLs3/Guo8eWyrIT1w0fFo4WRTicmay+afur4UvxG8v5PxNOPpPh+Phq9chw05ncOWc89IKH6wM8fbS7sc8ypsLg8fQfFu1PT5bLt871p+vll29fCnfNLk/NVl/ZLkNfLefDbehm/shcKGKiekj/Q9XNbhmnb/sATzSedtrd2M/zjGNLoYQw8vHVWMbCzfFMMRlqqB8SWgh3xa/Ei81OGbtfjfHEL1c/JPQQhZvdMu66L/6Dp5d2N/Z5zggnhu0y4iUlXDj0lSqHuHMcORSyXYa+Wj+DPTIXG9guI16NwuVotwyMgnY3rr8MPQvdKaN/8i3hMH5l+5wRrzXbX52pzx1XlBGvO1efMzAK2t24zjLCs4b4HGH3K8H880Mr288zOqGQzpHdMuJ3xJsrygg38XkLZYyWdjf28zyjmN0uI3xafQh37ZZRnQSqa0QYOn5x4s7dMqqLT0hqt4zq1co7KGPUtLvRsIwmqqekyI12N25gGeHVLPKj3Y0bVkYn/l8r5Ee7GzfwnIEsaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuRtMyLq10F5Gv7solLbmXdjcalnHhzIaOkKeNMxd0tId2N5qVMVwhjNxtrKTf1Ei7Gw3L6OoA+eq2UcZgUQfI1+JAB1fT7kajMoaUMQYWB8mThnY3mpWxRRn5W9yiDKRQBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtLaKYPfhc9ft5Uyeus6RK7We22UMThPGplb751v4Xfhy8Hm2R5/pytn3d7ZzRb+fka4nKxdfAI5u7iWvpgctIzLW5trTyJfa5tbl9sooxwOB4Mt5GswGKbDOGgZwRA504qWdjeal4HxpN0NyvBOuxuU4Z12N/ZXxqP/8P06uoYH3qyD2p5PcQhpd6NZGY+++pXR635XZTzwut33Zn3k77xNR8GnLeORf6qDHY9+G+/xOmra3Wh8znjk74YoDnbOePD1OtjxyD+hjFHT7sZ+y3jjK1/5re+PGz/yLdVRXcu94YRSRfDAPwtnl3AUTzLhJpTxwPeGw3uqr4UH1d93T3lvOOk8+Krvjuch2hgt7W7ss4xXh//s7319KOOj/3j7GhLK2D0ZPPCqt8XLy0df8+by0X/wtqqMkI8uOA+Ehz366nuqH3Xvm+PXH6SLkdPuxj7LCGvGOUMKoY9aKGP3qUYc/6Ovuad6cMyi+ifEVJ9QwherFu69J/ykvxfuo4zR0+7GdTzPqMsoH6wvJtV9H31NfTGpOghlPBifr4ZLx3YZsYn6Y7yk1BeaGAVljJ52N66/DN1V37dzWqjL2H5mGcuID73inFF9Z/zeN8bPKGPktLtxkDLqJlRGdW7YLiM+z9CnVz7PCB3E5xlB9Zh7ygfr0w5GSLsb11tGuH7oJUe4L1486v/6VUb4t/pyLCO+WqkeGF+wvL561fKqf/2akFb1TJXXJqOm3Y3GZVyv+lyCQ0u7G5ThnXY3KMM77W60XgYOOe1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+7GjS7j5ffrAJnQ7kbDMvrTE/FmZrb67NO462EdIBPa3WhaxsnPilF8hjJOf9mpv/S3T/3lP9CnyIF2N5qWcce7bl6qylg4WhTHV8vO3VNFMTtTFOFcshwOJ+vHPf4X76sPkAvtbjQ+Z8x1QgOhjP6HwqVlsuwcWyrnQw/LU7Px0+Vb56rHvfx+nmhkRrsbzcvoT89uX006oYzQyUJ9Gqluwl3BQ19+LvxTPQaZ0O5G8zJiCKGMeOkI54pYgsqYD3dUVxXkSLsb+ygjnCdmZsPVoz5n7JaxcII/6Zkx7W7sp4z+9DNm4xOK5amryojPM5At7W7sp4zwumS27BTFsXdcVUYoJlxNPuP/6cDhpN2NhmVgbGl3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtbjQt49JKdxH56q5c0pJ7aXejYRkXzmzoCHnaOHNBR3tod6NZGcMVwsjdxspQR1fT7kbDMro6QL66bZQxWNQB8rU40MHVtLvRqIwhZYyBxUHypKHdjWZlbFFG/ha3KAMplIE0ykAaZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANp7ZTBbzznr9tKGb11HSJX6702yhicJ43MrffOt/Abz+Vg82yPv8aUs27v7GYLfyUhXE7WLj6BnF1cS19MDlrG5a3NtSeRr7XNrcttlFEOh4PBFvI1GAzTYRy0jGCInGlFS7sbzcvAeNLuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rduJ4y5ifq25nZ+vZgTt/2mI4wCtrdaF7GjHpoWsbCidV4s/ttV5k/tqSjx19yTkcYBe1uNC5j4Rk3b2+5rzLSOn9MP+3dp1749hedur86xihod6NxGZ3JzmS4WThaHHltKKNTFMdfNtu/411Hw3/8M+GT1XK+iDf1x/jIuozwXZ27p4oifPNyfVN97Xdu3+7soRc8rCOMgnY3mpaxfPtSnHp5arbsT09UF4OFo7P96XhR6IQSZibDI+rH1d9wZRnxwTfN9acny+Vb56ov7j7u9G0f4InGKGl3o2kZ8QoSrh7z8XTQmQghlKGQUEa4oFQfFk58OAwfP6nPCleVEb43PGghXkCqE0+wU8Zd98V/MDLa3WhaRrhgFMVENXKopIohlNI/GU4B8SJRFOG80KkuI/XHq8qoM4rXmfgzKrvnFoyWdjcallHNHNaszhnh/BHPGdtlVB9q1Zf10ZShO2qUcVhod6NhGfVFIDyZ2PM8o4oiPs+o1eNf+fGKMnYvNAFlHBba3WhWhp44hmcK8bXJm74wDB5egbxCZcRPiol4UTkyV3+sHny0usbslhH+DffolS5lHBba3Wj6PAPjSrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u9G0jEsrvCdSzrorl7TkXtrdaFjGhTMbOkKeNs5c0NEe2t1oVsZwhTByt7HSyrtl8X6t+eu2UcaA93jO32IL7704pIwxsNjC+7XyvvDjoJ33haeM/FEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpLVTBr/xnL9uK2X01nWIXK332ihjcJ40MrfeO9/CbzyXg82zPf4aU866vbObLfyVhHA5Wbv4BHJ2cS19MTloGZe3NteeRL7WNrcut1FGORwOBlvI12AwTIdx0DKCIXKmFS3tbjQvA+NJuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd+N6ypifqG9nZutb5Ey7G83LmFEPTctYOLEab3a/7Qr96aI4tqRPMFLa3WhcxsIzbt6ecl9lJMXvTCaDp512NxqX0ZnsTIabhaPFkdeGTTtFcfxls/073nU0/Lc/Ez5ZLeeLeFN/jI+sywjf1bl7qijCNy/XN/LpysHTR7sbTctYvn0pTrk8NRsuBRPlfOhh4ehsfzpeEzqhhJnJ8Ij6cfU3XFlGfPBNc/3pyXL51rnqi0GHc8ahoN2NpmXEK0i4BszH00HYdCb8t9+fDmWEy0L1YeHEh8Pw8ZPts8IVZYTvDQ9aiJej6sQTVZ9h9LS70bSMcMEoion6P/T5iSqGUEr/ZDgFxItE9YSyU11G6o9XlVFnFK8z8WdUrjh5YKS0u9GwjGrmcKWozhnh/BHPGdtlVB9q1Zf10ZShOyqcMQ4N7W40LKO+CIQnE3ueZ1RRxOcZtXr8Kz9eUcbuhYYwDhHtbjQrQ+f+MGh8bfKmLwyDh1cgr1AZ8ZNiIl5UjszVH6sHH62uMbtlhH/DPfEyVB3oYRgx7W40fZ6BcaXdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t1oWsalFd4TKWfdlUtaci/tbjQs48KZDR0hTxtnLuhoD+1uNCtjuEIYudtYaeXdsni/1vx12yhjwHs852+xhfdeHFLGGFhs4f1aeV/4cdDO+8JTRv4oA2mUgTTKQBplII0ykEYZSKMMpFEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtIoA2ntlMHvwuev20oZvXUdIlfrvTbKGJwnjcyt98638Lvw5WDzbI+/05Wzbu/sZgt/PyNcTtYuPoGcXVxLX0wOWsblrc21J5Gvtc2ty22UUQ6Hg8EW8jUYDNNhHLSMYIicaUVLuxvNy8B40u4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uHLyM07c9piPkSLsbjctYOFoUxeTCTXPlnXO6q/b4S87pCDnS7kbTMjpHtnvon7yyjHefeuHbX3Tqfn2G/Gh3o2EZy1Oz9e3tvzBVFEf+xkQ47sQPZfnQCx6ubpEn7W40LGP++Gp1u3z70vKtc/Gm7E9XsZy+7QM80ciZdjeur4xyZrJcuHkp3nPXffEfZEu7G9dZxsKJ1c5kdQ8yp92Nps8zYg7xVmX0T77lqieiyJZ2NxqWsf3aJJZRPRmdf/6J+iyCzGl3o2kZ5XwRzMannp0iVLL9YgW50+5G4zL20PNPZE+7G9dbxkz9PzOQPe1uXF8ZnUKvVZA97W5c7zkD40K7G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtbjQt49IK74mUs+7KJS25l3Y3GpZx4cyGjpCnjTMXdLSHdjealTFcIYzcbay08m5ZvF9r/rptlDHgPZ7zt9jCey8OKWMMLLbwfq28L/w4aOd94Skjf5SBNMpAGmUgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0igDae2UwW8856/bShm9dR0iV+u9NsoYnCeNzK33zrfwG8/lYPNsj7/GlLNu7+xmC38lIVxO1i4+gZxdXEtfTA5axuWtzbUnka+1za3LbZRRDoeDwRbyNRgM02EctIxgiJxpRUu7G83LwHjS7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3WihjIUTqzpCBrS70bCM/nRRFMf3Lt6Z1cFVKCMr2t1oWsbJubKcmdBn22YoI3/a3dhPGQs3L5UzRXEkRhJOIX82nkdm4+GxnfuXp4ri74cyFo7GLyED2t3YZxmdcEWZP7Y0X509+tNh/HhP/THc35+eDNUcX12emq06wuGn3Y19lNGfnqhaCBeRhZtCKFUZ9T0798ca5o+vhn+uda3BIaPdjf08A50sl2+NRcxMxs/jh1nds31/VUR4ntEJj46Px+Gn3Y39XE12zw3xeGbyGueMUEZ9tUEOtLuxvzK2n09Uh6GMcFa45vMM5EG7G/ssowzXifAaZD5cK2ILu69N6vur1yZ3v3i1uo2f49DT7kbDMjC2tLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G03LuLTCeyLlrLtySUvupd2NhmVcOLOhI+Rp48wFHe2h3Y1mZQxXCCN3GyutvFsW79eav24bZQx4j+f8Lbbw3otDyhgDiy28XyvvCz8O2nlfeMrIH2UgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0igDaZSBNMpAGmUgrZ0y+F34/HVbKaO3rkPkar3XRhmD86SRufXe+RZ+F74cbJ7t8Xe6ctbtnd1s4e9nhMvJ2sUnkLOLa+mLyUHLuLy1ufYk8rW2uXW5jTLK4XAw2EK+BoNhOoyDlhEMkTOtaGl3o3kZGE/a3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G03L6BRFcWxp+cWr+jzcM6sDZE27Gw3LmD+2FG8WTuyWMUMZY0G7G03LmKg+hhPH8dV4+pjsT4ePs/FUUjeDXGl3o2EZy1OT8Wb+eDhn/OFquXDTXH86nDPiqaRTRYNcaXej8TPQmXhyqMoI+ifrMmZCL8u3c9LImXY3GpcRThBH5qoy4jXlSFVGdUkJx3oAcqTdjX2UEVqIZcQryM45g2eh2dPuxj7KCE8uYhVVHfGcEa4kesmCjGl3o2EZ8fVIuGqEy8fxD4dLyMSdc/GiMqtXK3oQcqTdjX2cMzCWtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G5ThnXY3mpZxaYX3RMpZd+WSltxLuxsNy7hwZkNHyNPGmQs62kO7G83KGK4QRu42Vlp5tyzerzV/3TbKGPAez/lbbOG9F4eUMQYWW3i/Vt4Xfhy0877wlJE/ykAaZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANplIG0dsrgN57z122ljN66DpGr9V4bZQzOk0bm1nvnW/iN53KwebbHX2PKWbd3drOFv5IQLidrF59Azi6upS8mBy3j8tbm2pPI19rm1uU2yiiHw8FgC/kaDIbpMA5aRjBEzrSipd2N5mVgPGl3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1utFjG6dse0xEOMe1uNC5j4WhRFJP6xLhzTgdXePwl53SEQ0y7G03L6BxJbL+jf9J89d2nXvj2F526X5/h0NLuRsMylqdm64N46pgoy5lw9gg59O94R1EcmVueih87/3y6+Ovha2UnfijLh17wcHWLQ027Gw3LmD++Wt3GQvrTkztlTIcIOsdXl28N54xOMVsu374Uvl5VdPq2D/BEIwPa3dhnGdXtwonVnTJCBAs3L9VlxFNF+EL4PD70rvviPzjstLuxzzKq9cP022XE5xc7ZcTnp6Ga6ha50O5G0+cZcfrgynNGuM+W0T/5FvtsFIeYdjcalrH92mT7eUZ4bhHv2ikjPkGtzxXzzz9Rn16QB+1uNC2jnC+C8BQzvAwJV5T+dLi5c6eM8OwzvDapyth5FYM8aHejcRlNxU6QEe1u3PAyZur/mYFcaHfjBpfRKfQiBrnQ7sYNP2cgM9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u9G0jEsrvCdSzrorl7TkXtrdaFjGhTMbOkKeNs5c0NEe2t1oVsZwhTByt7HSyrtl8X6t+eu2UcaA93jO32IL7704pIwxsNjC+7XyvvDjoJ33haeM/FEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0topg9+Fz1+3lTJ66zpErtZ7bZQxOE8amVvvnW/hd+HLwebZHn+nK2fd3tnNFv5+RricrF18Ajm7uJa+mBy0jMtbm2tPIl9rm1uX2yijHA4Hgy3kazAYpsM4aBnBEDnTipZ2N5qXgfGk3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p92NpmW889nPvOUGe+az36kfjhHS7kbDMt75LM15Qz2LNEZPuxsNy3i2trzBnq0fj9HR7kbDMm74paT2TP14jI52NxqWoSVvOP14jI52NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67Gze0jPd98K/paMdz/8e/01GSfjxGR7sbByvjz/1WWf6/H9Mn1yzjOb/5dfrM0I/H6Gh340Bl/Mlf/aMf+sFf+yZ9liwj+uL/TRmHl3Y3DlTGc//nf6puYxHPO/cTt7zv9369LP/jX3neuf/w38uP/8hby/KnwvFP/IWPleXHr9GGfjxGR7sbByrjT/ybT73nb4bbnTLKn3zDv/rkNz/v3Md/9Dv/V/lzb3hr+fXh7s/7no9/41f/1fo79tKPx+hod+NgzzM+9wc+Wf70V+yW8ZG/dctz/ut7//S59/7xW77vI197y59f/fF495de64xBGYeAdjcOVkZo41987GdfulNGuP3sX/ngPwqHt3zf739NvI8yDjvtbhy0jOpSEov44v9bnzP+1H8L5wzKyId2Nw5Uxhf84g9/17/8P+996fd/6t9+x2+Uep5RhucZV5fxJZ/899/+lfqWPfTjMTra3ThQGZ//X8ryUz/zVbd80W+Xn3rPfw5l/Pwv1a9Nri7jc365LL9B37KHfjxGR7sbB7+aHIh+PEZHuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W40LIPfhR9b2t1oWAZ/P2NsaXejYRn8zZ2xpd2NhmXwd7rGlnY3mpaBcaXdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G6aMob4BPgy1u2HKeErfAR+e0u6GKeMTT3HW8GN4zTASZQARZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANplIGUT3zi/wOHsDqm9cnlaAAAAABJRU5ErkJggg=="},760:function(t,s,e){"use strict";e.r(s);var a=e(17),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"forms"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#forms"}},[t._v("#")]),t._v(" Forms")]),t._v(" "),s("p",[t._v("BTCPay Server's Forms feature enables you to request that your customer complete a form before proceeding with a payment.")]),t._v(" "),s("p",[t._v("These forms are fully customizable to suit your requirements.")]),t._v(" "),s("p",[t._v("Example of form definition:")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerEmail"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"email"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Enter your email"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"This is help text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerName"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Name"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerAddress1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Address Line 1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"validationErrors"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerAddress2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Address Line 2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerCity"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"City"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerZip"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Postcode"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerState"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"State"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerCountry"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Country"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Output:")]),t._v(" "),s("figure",[s("img",{attrs:{src:e(349),alt:"Form",title:"Form"}})]),t._v(" "),s("p",[t._v("In a field definition, only the following fields can be set:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Field")]),t._v(" "),s("th",[t._v("Description")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[s("code",[t._v(".fields.constant")])]),t._v(" "),s("td",[t._v("If "),s("code",[t._v("true")]),t._v(", the "),s("code",[t._v(".value")]),t._v(" must be set in the form definition, and the user will not be able to change the field's value. ( example: the form definition's version)")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.type")])]),t._v(" "),s("td",[t._v("The HTML input type "),s("code",[t._v("text")]),t._v(", "),s("code",[t._v("radio")]),t._v(", "),s("code",[t._v("checkbox")]),t._v(", "),s("code",[t._v("password")]),t._v(", "),s("code",[t._v("hidden")]),t._v(", "),s("code",[t._v("button")]),t._v(", "),s("code",[t._v("color")]),t._v(", "),s("code",[t._v("date")]),t._v(", "),s("code",[t._v("datetime-local")]),t._v(", "),s("code",[t._v("month")]),t._v(", "),s("code",[t._v("week")]),t._v(", "),s("code",[t._v("time")]),t._v(", "),s("code",[t._v("email")]),t._v(", "),s("code",[t._v("number")]),t._v(", "),s("code",[t._v("range")]),t._v(", "),s("code",[t._v("search")]),t._v(", "),s("code",[t._v("url")]),t._v(", "),s("code",[t._v("select")]),t._v(", "),s("code",[t._v("tel")])])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.options")])]),t._v(" "),s("td",[t._v("If "),s("code",[t._v(".fields.type")]),t._v(" is "),s("code",[t._v("select")]),t._v(", the list of selectable values")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.options.text")])]),t._v(" "),s("td",[t._v("The text displayed for this option")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.options.value")])]),t._v(" "),s("td",[t._v("The value of the field if this option is selected")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.type=fieldset")])]),t._v(" "),s("td",[t._v("Create a HTML "),s("code",[t._v("fieldset")]),t._v(" around the children "),s("code",[t._v(".fields.fields")]),t._v(" (see below)")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.name")])]),t._v(" "),s("td",[t._v("The JSON property name of the field as it will appear in the invoice's metadata")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.value")])]),t._v(" "),s("td",[t._v("The default value of the field")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.required")])]),t._v(" "),s("td",[t._v("if "),s("code",[t._v("true")]),t._v(", the field will be required")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.label")])]),t._v(" "),s("td",[t._v("The label of the field (can contain HTML for formatting and links)")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.helpText")])]),t._v(" "),s("td",[t._v("Additional text to provide an explanation for the field (can contain HTML for formatting and links)")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.fields")])]),t._v(" "),s("td",[t._v("If "),s("code",[t._v(".fields.type")]),t._v(" is "),s("code",[t._v("fieldset")]),t._v(", you can organize your fields in a hierarchy, allowing child fields to be nested within the invoice's metadata. This structure can help you better organize and manage the collected information, making it easier to access and interpret. For example, if you have a form that collects customer information, you can group the fields under a parent field called customer. Within this parent field, you might have child fields like name, email, and address.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.valuemap")])]),t._v(" "),s("td",[t._v("If "),s("code",[t._v(".fields.type")]),t._v(" is "),s("code",[t._v("mirror")]),t._v(", you can specify an object, where the key is the value to match and and the value is the mapped result. "),s("code",[t._v('{ "hello": "world"}')]),t._v(", means that if the copied value is "),s("code",[t._v("hello")]),t._v(", it will be saved as "),s("code",[t._v("world")]),t._v(".")])])])]),t._v(" "),s("p",[t._v("The values of the fields are stored in the "),s("RouterLink",{attrs:{to:"/Development/InvoiceMetadata/"}},[t._v("metadata of the invoice")]),t._v(".")],1),t._v(" "),s("h2",{attrs:{id:"well-known-field-names"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#well-known-field-names"}},[t._v("#")]),t._v(" Well-known field names")]),t._v(" "),s("p",[t._v("The field name represents the JSON property name that stores the user-provided value in the invoice's metadata.")]),t._v(" "),s("p",[t._v("Some well-known names can be interpreted and modify the invoice's settings.")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Field name")]),t._v(" "),s("th",[t._v("Description")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[s("code",[t._v("invoice_amount")])]),t._v(" "),s("td",[t._v("The invoice's amount")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v("invoice_currency")])]),t._v(" "),s("td",[t._v("The invoice's currency")])]),t._v(" "),s("tr",[s("td",[t._v("Starts with "),s("code",[t._v("invoice_amount_adjustment")])]),t._v(" "),s("td",[t._v("As long its value is computed to be a number, it will adjust the invoice amount accordingly.")])]),t._v(" "),s("tr",[s("td",[t._v("Starts with "),s("code",[t._v("invoice_amount_multiply_adjustment")])]),t._v(" "),s("td",[t._v("Adjusts the generated invoice amount by multiplying with this value.")])])])]),t._v(" "),s("h2",{attrs:{id:"mirror-fields"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#mirror-fields"}},[t._v("#")]),t._v(" Mirror fields")]),t._v(" "),s("p",[t._v("A "),s("code",[t._v("Mirror")]),t._v(" field is defined by the type "),s("code",[t._v("mirror")]),t._v(". Its value is set to the name of another field, and upon form submission, that field's value will be copied to the mirror field.\nThe mirror type also has value mapping capabilities so that the referenced field's value can be transformed as it is copied over to the mirror field.")]),t._v(" "),s("p",[t._v("For example, you could have a select field with a list of countries, and then create an "),s("code",[t._v("invoice_amount_adjustment")]),t._v(" field, where you adjust the price of the invoice based on the country selected.\nOr you can generate percentage-based promo codes based on the "),s("code",[t._v("invoice_amount_multiply_adjustment")]),t._v(" field.")]),t._v(" "),s("p",[t._v("Here's an example of how three promo codes with different discounts can be implemented:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("huge")]),t._v(" = 50% discount")]),t._v(" "),s("li",[s("code",[t._v("medium")]),t._v(" = 10% discount")]),t._v(" "),s("li",[s("code",[t._v("tiny")]),t._v(" = 1% discount")])]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"promo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Promo Code"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"invoice_amount_multiply_adjustment_promo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mirror"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"promo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Promo Codes"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"valuemap"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tiny"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.99"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"medium"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.90"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"huge"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.5"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"pre-filling-form-values"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#pre-filling-form-values"}},[t._v("#")]),t._v(" Pre-filling form values")]),t._v(" "),s("p",[t._v("You can pre-fill the fields of an invoice automatically by adding query strings to the form's URL, such as "),s("code",[t._v("?your_field=value")]),t._v(".")]),t._v(" "),s("p",[t._v("Here are some use cases for this feature:")]),t._v(" "),s("ul",[s("li",[s("p",[s("code",[t._v("Assisting user input")]),t._v(": Pre-fill fields with known customer information to make it easier for them to complete the form. For example, if you already know a customer's email address, you can pre-fill the email field to save them time.")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("Personalization")]),t._v(": Customize the form based on customer preferences or segmentation. For instance, if you have different customer tiers, you can pre-fill the form with relevant data, such as their membership level or specific offers.")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("Tracking")]),t._v(": Track the source of customer visits by using hidden fields and pre-filled values. For example, you can create different links with pre-filled "),s("code",[t._v("utm_media")]),t._v(" values for each marketing channel (e.g., Twitter, Facebook, email). This helps you analyze the effectiveness of your marketing efforts.")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("A/B testing")]),t._v(": Pre-fill fields with different values to test different versions of a form, enabling you to optimize the user experience and conversion rates.")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[75],{350:function(t,s){t.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAhkAAAM7CAMAAADQ13IwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAMAUExURUpQV0pQfUp2fXJQV3JQfXJ2V3J2fUpQnUp2uHJQnXJ2uF6xNV+yNma1P3OxNV6xT16xXF6xcF6xfF68fHO6T17BcF6xkF6xll6xnl6xpF6xql6xsXKYnXOxsUqY03KY03K003K01nK06V7JpF7Jql7Gvl7NxF7Xy17Z0l7h35ZQV5ZQfbN2V7N2fdcSANkSAN0SANcSUt0SUt1hAOFhAJZQnZZ2uLN2ndkShNlhhNdhpeFhhIixNY2xNYi8NaexNaK8NY2ZfbOYV6anfZ3BNaLPNazBNZfNdsCxNca8NeaLAN2LUtCYV9CYfdC0fe2sUui0fcvGNdXUNeDcNeDfNdvbfNvjaerkaZCXnp6XnpCXq56Xq5CXt56Xt56knpa0uK2Xnq2Xq62Xt7+knrO0naexsb+kq5Ckx56kx5Cz2Z6z2a2kx5fNlpfSnpfWvqzNirHSlr/Dq7/Jt7PQuJ7Dx5bQ057D7JbQ6ZbQ/5fl5a3W2a3W/7Hm37vl0qfr8qzt+bPp6bvr7Lvt7L/q7LPp/7vu8r/q/7bw+dmLhNSznteLxtms59DQncDguMbkuNXjsdXlsdDpuODeiv/LhP/QnerDq//Wt+DgluXjluXkkPXqivXrkPXrlvXrnuXmqurrqvXvqv/lpfrvpPXvsf/puPXysfXyuPXzvv/zsfr0vv/0uP/0vt3L/9D/09v238Dv8sDy+cDz/8b0/8v2/9Dt5d7i5t/j59Dv8tD0+dD1/9X68tD//9X5+dX6/9T//9v28tv2+dv7/+Hlxuj/0+r/2f/qx///xv/6y///0//62P//2f//3+Ll6OPm6eTn6uHl/+3u8Ojp/+j/6eD5/+D9/+D+/+X//+/w8ur9/+j//+3////p6f/95f//5f//5///6f//7PPz8/P09vT09PT19/b29vf39/X2+Pb3+fD/8vD9//D///X+///98v/+8vj4+Pj5+vv7+/r7/Pr////++fz8/P39/f7+/v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAL205qsAAAAJcEhZcwAADsMAAA7DAcdvqGQAAB5iSURBVHhe7d1teGTnfdfxs6ybXa8TaGmakiaooEJpZe2mcXBcSIAS6ANBjqfPaSgQSCCEPqRpcFBraENRQmynadPILm2BYKo+pe5D2mpaKkhLWm9Ud1beBNhFbeOJd9eSgBBFTmbnvOS+z/lJ2tX/3uRotceje/7fz2VrjkYjvfl9fc6Mr0ua4hNACmUgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtIoA2mUgTRbxlPDEl4Mn9LqlinjKX0PfLhmGqYMzhi+DLW7YcrQN8AL7W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G4eijPmJ+vb0bY/VB3j6aHejYRn96SKY1Wfl8otXdXRwMxM7ZTz+knP1AZ4+2t1oWsbJOR1VFk7cuDKCuox3n3rh21906v7qHjxttLuxvzKWX/yKoji2NB/OH8dXl6eKYrLs3/Guo8eWyrIT1w0fFo4WRTicmay+afur4UvxG8v5PxNOPpPh+Phq9chw05ncOWc89IKH6wM8fbS7sc8ypsLg8fQfFu1PT5bLt871p+vll29fCnfNLk/NVl/ZLkNfLefDbehm/shcKGKiekj/Q9XNbhmnb/sATzSedtrd2M/zjGNLoYQw8vHVWMbCzfFMMRlqqB8SWgh3xa/Ei81OGbtfjfHEL1c/JPQQhZvdMu66L/6Dp5d2N/Z5zggnhu0y4iUlXDj0lSqHuHMcORSyXYa+Wj+DPTIXG9guI16NwuVotwyMgnY3rr8MPQvdKaN/8i3hMH5l+5wRrzXbX52pzx1XlBGvO1efMzAK2t24zjLCs4b4HGH3K8H880Mr288zOqGQzpHdMuJ3xJsrygg38XkLZYyWdjf28zyjmN0uI3xafQh37ZZRnQSqa0QYOn5x4s7dMqqLT0hqt4zq1co7KGPUtLvRsIwmqqekyI12N25gGeHVLPKj3Y0bVkYn/l8r5Ee7GzfwnIEsaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuRtMyLq10F5Gv7solLbmXdjcalnHhzIaOkKeNMxd0tId2N5qVMVwhjNxtrKTf1Ei7Gw3L6OoA+eq2UcZgUQfI1+JAB1fT7kajMoaUMQYWB8mThnY3mpWxRRn5W9yiDKRQBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtLaKYPfhc9ft5Uyeus6RK7We22UMThPGplb751v4Xfhy8Hm2R5/pytn3d7ZzRb+fka4nKxdfAI5u7iWvpgctIzLW5trTyJfa5tbl9sooxwOB4Mt5GswGKbDOGgZwRA504qWdjeal4HxpN0NyvBOuxuU4Z12N/ZXxqP/8P06uoYH3qyD2p5PcQhpd6NZGY+++pXR635XZTzwut33Zn3k77xNR8GnLeORf6qDHY9+G+/xOmra3Wh8znjk74YoDnbOePD1OtjxyD+hjFHT7sZ+y3jjK1/5re+PGz/yLdVRXcu94YRSRfDAPwtnl3AUTzLhJpTxwPeGw3uqr4UH1d93T3lvOOk8+Krvjuch2hgt7W7ss4xXh//s7319KOOj/3j7GhLK2D0ZPPCqt8XLy0df8+by0X/wtqqMkI8uOA+Ehz366nuqH3Xvm+PXH6SLkdPuxj7LCGvGOUMKoY9aKGP3qUYc/6Ovuad6cMyi+ifEVJ9QwherFu69J/ykvxfuo4zR0+7GdTzPqMsoH6wvJtV9H31NfTGpOghlPBifr4ZLx3YZsYn6Y7yk1BeaGAVljJ52N66/DN1V37dzWqjL2H5mGcuID73inFF9Z/zeN8bPKGPktLtxkDLqJlRGdW7YLiM+z9CnVz7PCB3E5xlB9Zh7ygfr0w5GSLsb11tGuH7oJUe4L1486v/6VUb4t/pyLCO+WqkeGF+wvL561fKqf/2akFb1TJXXJqOm3Y3GZVyv+lyCQ0u7G5ThnXY3KMM77W60XgYOOe1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+7GjS7j5ffrAJnQ7kbDMvrTE/FmZrb67NO462EdIBPa3WhaxsnPilF8hjJOf9mpv/S3T/3lP9CnyIF2N5qWcce7bl6qylg4WhTHV8vO3VNFMTtTFOFcshwOJ+vHPf4X76sPkAvtbjQ+Z8x1QgOhjP6HwqVlsuwcWyrnQw/LU7Px0+Vb56rHvfx+nmhkRrsbzcvoT89uX006oYzQyUJ9Gqluwl3BQ19+LvxTPQaZ0O5G8zJiCKGMeOkI54pYgsqYD3dUVxXkSLsb+ygjnCdmZsPVoz5n7JaxcII/6Zkx7W7sp4z+9DNm4xOK5amryojPM5At7W7sp4zwumS27BTFsXdcVUYoJlxNPuP/6cDhpN2NhmVgbGl3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtbjQt49JKdxH56q5c0pJ7aXejYRkXzmzoCHnaOHNBR3tod6NZGcMVwsjdxspQR1fT7kbDMro6QL66bZQxWNQB8rU40MHVtLvRqIwhZYyBxUHypKHdjWZlbFFG/ha3KAMplIE0ykAaZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANp7ZTBbzznr9tKGb11HSJX6702yhicJ43MrffOt/Abz+Vg82yPv8aUs27v7GYLfyUhXE7WLj6BnF1cS19MDlrG5a3NtSeRr7XNrcttlFEOh4PBFvI1GAzTYRy0jGCInGlFS7sbzcvAeNLuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rduJ4y5ifq25nZ+vZgTt/2mI4wCtrdaF7GjHpoWsbCidV4s/ttV5k/tqSjx19yTkcYBe1uNC5j4Rk3b2+5rzLSOn9MP+3dp1749hedur86xihod6NxGZ3JzmS4WThaHHltKKNTFMdfNtu/411Hw3/8M+GT1XK+iDf1x/jIuozwXZ27p4oifPNyfVN97Xdu3+7soRc8rCOMgnY3mpaxfPtSnHp5arbsT09UF4OFo7P96XhR6IQSZibDI+rH1d9wZRnxwTfN9acny+Vb56ov7j7u9G0f4InGKGl3o2kZ8QoSrh7z8XTQmQghlKGQUEa4oFQfFk58OAwfP6nPCleVEb43PGghXkCqE0+wU8Zd98V/MDLa3WhaRrhgFMVENXKopIohlNI/GU4B8SJRFOG80KkuI/XHq8qoM4rXmfgzKrvnFoyWdjcallHNHNaszhnh/BHPGdtlVB9q1Zf10ZShO2qUcVhod6NhGfVFIDyZ2PM8o4oiPs+o1eNf+fGKMnYvNAFlHBba3WhWhp44hmcK8bXJm74wDB5egbxCZcRPiol4UTkyV3+sHny0usbslhH+DffolS5lHBba3Wj6PAPjSrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u9G0jEsrvCdSzrorl7TkXtrdaFjGhTMbOkKeNs5c0NEe2t1oVsZwhTByt7HSyrtl8X6t+eu2UcaA93jO32IL7704pIwxsNjC+7XyvvDjoJ33haeM/FEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpLVTBr/xnL9uK2X01nWIXK332ihjcJ40MrfeO9/CbzyXg82zPf4aU866vbObLfyVhHA5Wbv4BHJ2cS19MTloGZe3NteeRL7WNrcut1FGORwOBlvI12AwTIdx0DKCIXKmFS3tbjQvA+NJuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd+N6ypifqG9nZutb5Ey7G83LmFEPTctYOLEab3a/7Qr96aI4tqRPMFLa3WhcxsIzbt6ecl9lJMXvTCaDp512NxqX0ZnsTIabhaPFkdeGTTtFcfxls/073nU0/Lc/Ez5ZLeeLeFN/jI+sywjf1bl7qijCNy/XN/LpysHTR7sbTctYvn0pTrk8NRsuBRPlfOhh4ehsfzpeEzqhhJnJ8Ij6cfU3XFlGfPBNc/3pyXL51rnqi0GHc8ahoN2NpmXEK0i4BszH00HYdCb8t9+fDmWEy0L1YeHEh8Pw8ZPts8IVZYTvDQ9aiJej6sQTVZ9h9LS70bSMcMEoion6P/T5iSqGUEr/ZDgFxItE9YSyU11G6o9XlVFnFK8z8WdUrjh5YKS0u9GwjGrmcKWozhnh/BHPGdtlVB9q1Zf10ZShOyqcMQ4N7W40LKO+CIQnE3ueZ1RRxOcZtXr8Kz9eUcbuhYYwDhHtbjQrQ+f+MGh8bfKmLwyDh1cgr1AZ8ZNiIl5UjszVH6sHH62uMbtlhH/DPfEyVB3oYRgx7W40fZ6BcaXdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t1oWsalFd4TKWfdlUtaci/tbjQs48KZDR0hTxtnLuhoD+1uNCtjuEIYudtYaeXdsni/1vx12yhjwHs852+xhfdeHFLGGFhs4f1aeV/4cdDO+8JTRv4oA2mUgTTKQBplII0ykEYZSKMMpFEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtIoA2ntlMHvwuev20oZvXUdIlfrvTbKGJwnjcyt98638Lvw5WDzbI+/05Wzbu/sZgt/PyNcTtYuPoGcXVxLX0wOWsblrc21J5Gvtc2ty22UUQ6Hg8EW8jUYDNNhHLSMYIicaUVLuxvNy8B40u4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uHLyM07c9piPkSLsbjctYOFoUxeTCTXPlnXO6q/b4S87pCDnS7kbTMjpHtnvon7yyjHefeuHbX3Tqfn2G/Gh3o2EZy1Oz9e3tvzBVFEf+xkQ47sQPZfnQCx6ubpEn7W40LGP++Gp1u3z70vKtc/Gm7E9XsZy+7QM80ciZdjeur4xyZrJcuHkp3nPXffEfZEu7G9dZxsKJ1c5kdQ8yp92Nps8zYg7xVmX0T77lqieiyJZ2NxqWsf3aJJZRPRmdf/6J+iyCzGl3o2kZ5XwRzMannp0iVLL9YgW50+5G4zL20PNPZE+7G9dbxkz9PzOQPe1uXF8ZnUKvVZA97W5c7zkD40K7G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtbjQt49IK74mUs+7KJS25l3Y3GpZx4cyGjpCnjTMXdLSHdjealTFcIYzcbay08m5ZvF9r/rptlDHgPZ7zt9jCey8OKWMMLLbwfq28L/w4aOd94Skjf5SBNMpAGmUgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0igDae2UwW8856/bShm9dR0iV+u9NsoYnCeNzK33zrfwG8/lYPNsj7/GlLNu7+xmC38lIVxO1i4+gZxdXEtfTA5axuWtzbUnka+1za3LbZRRDoeDwRbyNRgM02EctIxgiJxpRUu7G83LwHjS7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3WihjIUTqzpCBrS70bCM/nRRFMf3Lt6Z1cFVKCMr2t1oWsbJubKcmdBn22YoI3/a3dhPGQs3L5UzRXEkRhJOIX82nkdm4+GxnfuXp4ri74cyFo7GLyED2t3YZxmdcEWZP7Y0X509+tNh/HhP/THc35+eDNUcX12emq06wuGn3Y19lNGfnqhaCBeRhZtCKFUZ9T0798ca5o+vhn+uda3BIaPdjf08A50sl2+NRcxMxs/jh1nds31/VUR4ntEJj46Px+Gn3Y39XE12zw3xeGbyGueMUEZ9tUEOtLuxvzK2n09Uh6GMcFa45vMM5EG7G/ssowzXifAaZD5cK2ILu69N6vur1yZ3v3i1uo2f49DT7kbDMjC2tLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G03LuLTCeyLlrLtySUvupd2NhmVcOLOhI+Rp48wFHe2h3Y1mZQxXCCN3GyutvFsW79eav24bZQx4j+f8Lbbw3otDyhgDiy28XyvvCz8O2nlfeMrIH2UgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0igDaZSBNMpAGmUgrZ0y+F34/HVbKaO3rkPkar3XRhmD86SRufXe+RZ+F74cbJ7t8Xe6ctbtnd1s4e9nhMvJ2sUnkLOLa+mLyUHLuLy1ufYk8rW2uXW5jTLK4XAw2EK+BoNhOoyDlhEMkTOtaGl3o3kZGE/a3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G03L6BRFcWxp+cWr+jzcM6sDZE27Gw3LmD+2FG8WTuyWMUMZY0G7G03LmKg+hhPH8dV4+pjsT4ePs/FUUjeDXGl3o2EZy1OT8Wb+eDhn/OFquXDTXH86nDPiqaRTRYNcaXej8TPQmXhyqMoI+ifrMmZCL8u3c9LImXY3GpcRThBH5qoy4jXlSFVGdUkJx3oAcqTdjX2UEVqIZcQryM45g2eh2dPuxj7KCE8uYhVVHfGcEa4kesmCjGl3o2EZ8fVIuGqEy8fxD4dLyMSdc/GiMqtXK3oQcqTdjX2cMzCWtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G5ThnXY3mpZxaYX3RMpZd+WSltxLuxsNy7hwZkNHyNPGmQs62kO7G83KGK4QRu42Vlp5tyzerzV/3TbKGPAez/lbbOG9F4eUMQYWW3i/Vt4Xfhy0877wlJE/ykAaZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANplIG0dsrgN57z122ljN66DpGr9V4bZQzOk0bm1nvnW/iN53KwebbHX2PKWbd3drOFv5IQLidrF59Azi6upS8mBy3j8tbm2pPI19rm1uU2yiiHw8FgC/kaDIbpMA5aRjBEzrSipd2N5mVgPGl3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1utFjG6dse0xEOMe1uNC5j4WhRFJP6xLhzTgdXePwl53SEQ0y7G03L6BxJbL+jf9J89d2nXvj2F526X5/h0NLuRsMylqdm64N46pgoy5lw9gg59O94R1EcmVueih87/3y6+Ovha2UnfijLh17wcHWLQ027Gw3LmD++Wt3GQvrTkztlTIcIOsdXl28N54xOMVsu374Uvl5VdPq2D/BEIwPa3dhnGdXtwonVnTJCBAs3L9VlxFNF+EL4PD70rvviPzjstLuxzzKq9cP022XE5xc7ZcTnp6Ga6ha50O5G0+cZcfrgynNGuM+W0T/5FvtsFIeYdjcalrH92mT7eUZ4bhHv2ikjPkGtzxXzzz9Rn16QB+1uNC2jnC+C8BQzvAwJV5T+dLi5c6eM8OwzvDapyth5FYM8aHejcRlNxU6QEe1u3PAyZur/mYFcaHfjBpfRKfQiBrnQ7sYNP2cgM9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u9G0jEsrvCdSzrorl7TkXtrdaFjGhTMbOkKeNs5c0NEe2t1oVsZwhTByt7HSyrtl8X6t+eu2UcaA93jO32IL7704pIwxsNjC+7XyvvDjoJ33haeM/FEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANplIE0ykAaZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0topg9+Fz1+3lTJ66zpErtZ7bZQxOE8amVvvnW/hd+HLwebZHn+nK2fd3tnNFv5+RricrF18Ajm7uJa+mBy0jMtbm2tPIl9rm1uX2yijHA4Hgy3kazAYpsM4aBnBEDnTipZ2N5qXgfGk3Q3K8E67G5ThnXY3KMM77W5Qhnfa3aAM77S7QRneaXeDMrzT7gZleKfdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p92NpmW889nPvOUGe+az36kfjhHS7kbDMt75LM15Qz2LNEZPuxsNy3i2trzBnq0fj9HR7kbDMm74paT2TP14jI52NxqWoSVvOP14jI52NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67Gze0jPd98K/paMdz/8e/01GSfjxGR7sbByvjz/1WWf6/H9Mn1yzjOb/5dfrM0I/H6Gh340Bl/Mlf/aMf+sFf+yZ9liwj+uL/TRmHl3Y3DlTGc//nf6puYxHPO/cTt7zv9369LP/jX3neuf/w38uP/8hby/KnwvFP/IWPleXHr9GGfjxGR7sbByrjT/ybT73nb4bbnTLKn3zDv/rkNz/v3Md/9Dv/V/lzb3hr+fXh7s/7no9/41f/1fo79tKPx+hod+NgzzM+9wc+Wf70V+yW8ZG/dctz/ut7//S59/7xW77vI197y59f/fF495de64xBGYeAdjcOVkZo41987GdfulNGuP3sX/ngPwqHt3zf739NvI8yDjvtbhy0jOpSEov44v9bnzP+1H8L5wzKyId2Nw5Uxhf84g9/17/8P+996fd/6t9+x2+Uep5RhucZV5fxJZ/899/+lfqWPfTjMTra3ThQGZ//X8ryUz/zVbd80W+Xn3rPfw5l/Pwv1a9Nri7jc365LL9B37KHfjxGR7sbB7+aHIh+PEZHuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G5ThnXY3KMM77W40LIPfhR9b2t1oWAZ/P2NsaXejYRn8zZ2xpd2NhmXwd7rGlnY3mpaBcaXdDcrwTrsblOGddjcowzvtblCGd9rdoAzvtLtBGd5pd4MyvNPuBmV4p90NyvBOuxuU4Z12NyjDO+1uUIZ32t2gDO+0u0EZ3ml3gzK80+4GZXin3Q3K8E67G6aMob4BPgy1u2HKeErfAR+e0u6GKeMTT3HW8GN4zTASZQARZSCNMpBGGUijDKRRBtIoA2mUgTTKQBplII0ykEYZSKMMpFEG0igDaZSBNMpAGmUgjTKQRhlIowykUQbSKANplIGUT3zi/wOHsDqm9cnlaAAAAABJRU5ErkJggg=="},761:function(t,s,e){"use strict";e.r(s);var a=e(17),n=Object(a.a)({},(function(){var t=this,s=t._self._c;return s("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[s("h1",{attrs:{id:"forms"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#forms"}},[t._v("#")]),t._v(" Forms")]),t._v(" "),s("p",[t._v("BTCPay Server's Forms feature enables you to request that your customer complete a form before proceeding with a payment.")]),t._v(" "),s("p",[t._v("These forms are fully customizable to suit your requirements.")]),t._v(" "),s("p",[t._v("Example of form definition:")]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerEmail"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"email"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Enter your email"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"This is help text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerName"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Name"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerAddress1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Address Line 1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"validationErrors"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerAddress2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Address Line 2"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerCity"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"City"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerZip"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Postcode"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerState"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"State"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"buyerCountry"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"constant"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("false")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"required"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("true")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Country"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"helpText"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token null keyword"}},[t._v("null")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("Output:")]),t._v(" "),s("figure",[s("img",{attrs:{src:e(350),alt:"Form",title:"Form"}})]),t._v(" "),s("p",[t._v("In a field definition, only the following fields can be set:")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Field")]),t._v(" "),s("th",[t._v("Description")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[s("code",[t._v(".fields.constant")])]),t._v(" "),s("td",[t._v("If "),s("code",[t._v("true")]),t._v(", the "),s("code",[t._v(".value")]),t._v(" must be set in the form definition, and the user will not be able to change the field's value. ( example: the form definition's version)")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.type")])]),t._v(" "),s("td",[t._v("The HTML input type "),s("code",[t._v("text")]),t._v(", "),s("code",[t._v("radio")]),t._v(", "),s("code",[t._v("checkbox")]),t._v(", "),s("code",[t._v("password")]),t._v(", "),s("code",[t._v("hidden")]),t._v(", "),s("code",[t._v("button")]),t._v(", "),s("code",[t._v("color")]),t._v(", "),s("code",[t._v("date")]),t._v(", "),s("code",[t._v("datetime-local")]),t._v(", "),s("code",[t._v("month")]),t._v(", "),s("code",[t._v("week")]),t._v(", "),s("code",[t._v("time")]),t._v(", "),s("code",[t._v("email")]),t._v(", "),s("code",[t._v("number")]),t._v(", "),s("code",[t._v("range")]),t._v(", "),s("code",[t._v("search")]),t._v(", "),s("code",[t._v("url")]),t._v(", "),s("code",[t._v("select")]),t._v(", "),s("code",[t._v("tel")])])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.options")])]),t._v(" "),s("td",[t._v("If "),s("code",[t._v(".fields.type")]),t._v(" is "),s("code",[t._v("select")]),t._v(", the list of selectable values")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.options.text")])]),t._v(" "),s("td",[t._v("The text displayed for this option")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.options.value")])]),t._v(" "),s("td",[t._v("The value of the field if this option is selected")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.type=fieldset")])]),t._v(" "),s("td",[t._v("Create a HTML "),s("code",[t._v("fieldset")]),t._v(" around the children "),s("code",[t._v(".fields.fields")]),t._v(" (see below)")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.name")])]),t._v(" "),s("td",[t._v("The JSON property name of the field as it will appear in the invoice's metadata")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.value")])]),t._v(" "),s("td",[t._v("The default value of the field")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.required")])]),t._v(" "),s("td",[t._v("if "),s("code",[t._v("true")]),t._v(", the field will be required")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.label")])]),t._v(" "),s("td",[t._v("The label of the field (can contain HTML for formatting and links)")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.helpText")])]),t._v(" "),s("td",[t._v("Additional text to provide an explanation for the field (can contain HTML for formatting and links)")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.fields")])]),t._v(" "),s("td",[t._v("If "),s("code",[t._v(".fields.type")]),t._v(" is "),s("code",[t._v("fieldset")]),t._v(", you can organize your fields in a hierarchy, allowing child fields to be nested within the invoice's metadata. This structure can help you better organize and manage the collected information, making it easier to access and interpret. For example, if you have a form that collects customer information, you can group the fields under a parent field called customer. Within this parent field, you might have child fields like name, email, and address.")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v(".fields.valuemap")])]),t._v(" "),s("td",[t._v("If "),s("code",[t._v(".fields.type")]),t._v(" is "),s("code",[t._v("mirror")]),t._v(", you can specify an object, where the key is the value to match and and the value is the mapped result. "),s("code",[t._v('{ "hello": "world"}')]),t._v(", means that if the copied value is "),s("code",[t._v("hello")]),t._v(", it will be saved as "),s("code",[t._v("world")]),t._v(".")])])])]),t._v(" "),s("p",[t._v("The values of the fields are stored in the "),s("RouterLink",{attrs:{to:"/Development/InvoiceMetadata/"}},[t._v("metadata of the invoice")]),t._v(".")],1),t._v(" "),s("h2",{attrs:{id:"well-known-field-names"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#well-known-field-names"}},[t._v("#")]),t._v(" Well-known field names")]),t._v(" "),s("p",[t._v("The field name represents the JSON property name that stores the user-provided value in the invoice's metadata.")]),t._v(" "),s("p",[t._v("Some well-known names can be interpreted and modify the invoice's settings.")]),t._v(" "),s("table",[s("thead",[s("tr",[s("th",[t._v("Field name")]),t._v(" "),s("th",[t._v("Description")])])]),t._v(" "),s("tbody",[s("tr",[s("td",[s("code",[t._v("invoice_amount")])]),t._v(" "),s("td",[t._v("The invoice's amount")])]),t._v(" "),s("tr",[s("td",[s("code",[t._v("invoice_currency")])]),t._v(" "),s("td",[t._v("The invoice's currency")])]),t._v(" "),s("tr",[s("td",[t._v("Starts with "),s("code",[t._v("invoice_amount_adjustment")])]),t._v(" "),s("td",[t._v("As long its value is computed to be a number, it will adjust the invoice amount accordingly.")])]),t._v(" "),s("tr",[s("td",[t._v("Starts with "),s("code",[t._v("invoice_amount_multiply_adjustment")])]),t._v(" "),s("td",[t._v("Adjusts the generated invoice amount by multiplying with this value.")])])])]),t._v(" "),s("h2",{attrs:{id:"mirror-fields"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#mirror-fields"}},[t._v("#")]),t._v(" Mirror fields")]),t._v(" "),s("p",[t._v("A "),s("code",[t._v("Mirror")]),t._v(" field is defined by the type "),s("code",[t._v("mirror")]),t._v(". Its value is set to the name of another field, and upon form submission, that field's value will be copied to the mirror field.\nThe mirror type also has value mapping capabilities so that the referenced field's value can be transformed as it is copied over to the mirror field.")]),t._v(" "),s("p",[t._v("For example, you could have a select field with a list of countries, and then create an "),s("code",[t._v("invoice_amount_adjustment")]),t._v(" field, where you adjust the price of the invoice based on the country selected.\nOr you can generate percentage-based promo codes based on the "),s("code",[t._v("invoice_amount_multiply_adjustment")]),t._v(" field.")]),t._v(" "),s("p",[t._v("Here's an example of how three promo codes with different discounts can be implemented:")]),t._v(" "),s("ul",[s("li",[s("code",[t._v("huge")]),t._v(" = 50% discount")]),t._v(" "),s("li",[s("code",[t._v("medium")]),t._v(" = 10% discount")]),t._v(" "),s("li",[s("code",[t._v("tiny")]),t._v(" = 1% discount")])]),t._v(" "),s("div",{staticClass:"language-json extra-class"},[s("pre",{pre:!0,attrs:{class:"language-json"}},[s("code",[s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fields"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"promo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"text"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Promo Code"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"invoice_amount_multiply_adjustment_promo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"type"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mirror"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"value"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"promo"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"label"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Promo Codes"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"valuemap"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"tiny"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.99"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"medium"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.90"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"huge"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.5"')]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("h2",{attrs:{id:"pre-filling-form-values"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#pre-filling-form-values"}},[t._v("#")]),t._v(" Pre-filling form values")]),t._v(" "),s("p",[t._v("You can pre-fill the fields of an invoice automatically by adding query strings to the form's URL, such as "),s("code",[t._v("?your_field=value")]),t._v(".")]),t._v(" "),s("p",[t._v("Here are some use cases for this feature:")]),t._v(" "),s("ul",[s("li",[s("p",[s("code",[t._v("Assisting user input")]),t._v(": Pre-fill fields with known customer information to make it easier for them to complete the form. For example, if you already know a customer's email address, you can pre-fill the email field to save them time.")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("Personalization")]),t._v(": Customize the form based on customer preferences or segmentation. For instance, if you have different customer tiers, you can pre-fill the form with relevant data, such as their membership level or specific offers.")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("Tracking")]),t._v(": Track the source of customer visits by using hidden fields and pre-filled values. For example, you can create different links with pre-filled "),s("code",[t._v("utm_media")]),t._v(" values for each marketing channel (e.g., Twitter, Facebook, email). This helps you analyze the effectiveness of your marketing efforts.")])]),t._v(" "),s("li",[s("p",[s("code",[t._v("A/B testing")]),t._v(": Pre-fill fields with different values to test different versions of a form, enabling you to optimize the user experience and conversion rates.")])])])])}),[],!1,null,null,null);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/76.2fb25567.js b/assets/js/76.50847d02.js similarity index 97% rename from assets/js/76.2fb25567.js rename to assets/js/76.50847d02.js index 8a59f6c500..1a26aab2e4 100644 --- a/assets/js/76.2fb25567.js +++ b/assets/js/76.50847d02.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{350:function(t,e,o){t.exports=o.p+"assets/img/BTCPayPointOfSale1.84c38097.jpg"},761:function(t,e,o){"use strict";o.r(e);var a=o(17),r=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-server-apps"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-apps"}},[t._v("#")]),t._v(" BTCPay Server Apps")]),t._v(" "),e("p",[t._v("The primary purpose of BTCPay Server is to remove dependencies on trusted third-parties. The Apps are built in applications that obsolete central-authorities and allow users an easy way to extend the "),e("RouterLink",{attrs:{to:"/UseCase/"}},[t._v("use case")]),t._v(" of the software. Users can self-host all sorts of customizable applications that work out of the box.")],1),t._v(" "),e("p",[t._v("To create an app, go to Apps > Create a new app. Apps are store-dependent, which means that each app needs to be connected to a store.")]),t._v(" "),e("h2",{attrs:{id:"point-of-sale-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#point-of-sale-app"}},[t._v("#")]),t._v(" Point of Sale App")]),t._v(" "),e("p",[t._v("The "),e("strong",[t._v("web-based PoS app")]),t._v(" allows users with brick and mortar stores to readily "),e("strong",[t._v("accept cryptocurrencies without fees or a third-party")]),t._v(", directly to their wallet. The "),e("strong",[t._v("PoS")]),t._v(" can be displayed easily on tablets or any other devices which support web browsing. Users can easily create a homescreen shortcut for a quick access to the web-app.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(350),alt:"BTCPay Pos",title:"BTCPay Pos"}})]),t._v(" "),e("p",[t._v("Adding new products is easy. The app has a "),e("strong",[t._v("shopping cart feature")]),t._v(", "),e("strong",[t._v("tips")]),t._v(", "),e("strong",[t._v("product inventory")]),t._v(", "),e("strong",[t._v("custom payment options")]),t._v(" and more.")]),t._v(" "),e("p",[t._v("The "),e("strong",[t._v("Point of sale app")]),t._v(" can also be used to receive donations, tips or even as a small e-commerce shop, depending on the options or customizations applied.")]),t._v(" "),e("p",[t._v("Curently, the "),e("strong",[t._v("Point of Sale app")]),t._v(" supports three different views:")]),t._v(" "),e("ul",[e("li",[t._v("A "),e("code",[t._v("Static")]),t._v(" view representing only the items for sale.")]),t._v(" "),e("li",[t._v("A "),e("code",[t._v("Cart")]),t._v(" view including items for sale and a cart for checkout.")]),t._v(" "),e("li",[t._v("A "),e("code",[t._v("Light")]),t._v(" view consisting only of a keypad for easy and quick payments (Starting from "),e("a",{attrs:{href:"https://blog.btcpayserver.org/btcpay-server-1-0-5-6/#simplePOS",target:"_blank",rel:"noopener noreferrer"}},[t._v("v1.0.5.6"),e("OutboundLink")],1),t._v(").")])]),t._v(" "),e("p",[t._v("To get your first "),e("strong",[t._v("Point of Sale app")]),t._v(" running, follow theses few simple steps:")]),t._v(" "),e("ol",[e("li",[t._v("Go to "),e("code",[t._v("Apps")]),t._v(" and "),e("code",[t._v("Create a new app")])]),t._v(" "),e("li",[t._v("Add a "),e("code",[t._v("name")]),t._v(" for your app")]),t._v(" "),e("li",[t._v("Choose "),e("code",[t._v("app type")]),t._v(" > Point Of Sale")]),t._v(" "),e("li",[t._v("Select the "),e("code",[t._v("store")]),t._v(" to associate with the app.")]),t._v(" "),e("li",[t._v("Customize your PoS by choosing a "),e("code",[t._v("view")]),t._v(" (Static, Cart, Light), adding your own "),e("code",[t._v("items")]),t._v(" with prices, photos, and a description.")]),t._v(" "),e("li",[t._v("Click "),e("code",[t._v("Save Settings")]),t._v(".")]),t._v(" "),e("li",[t._v("Click "),e("code",[t._v("View App")]),t._v(" to view your PoS (Your customers can access the PoS through that link).")])]),t._v(" "),e("p",[t._v("You can change the appearance of your "),e("strong",[t._v("Point of Sale app")]),t._v(" by following the "),e("RouterLink",{attrs:{to:"/Development/Theme/"}},[t._v("theme customization guide")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"crowdfunding-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#crowdfunding-app"}},[t._v("#")]),t._v(" Crowdfunding App")]),t._v(" "),e("p",[e("strong",[t._v("Crowdfunding")]),t._v(" is an application which you can launch from BTCPay Server interface that allows you to create a "),e("strong",[t._v("self-hosted funding campaign")]),t._v(", similar to Kickstarter or Indiegogo. Unlike traditional "),e("strong",[t._v("crowdfunding platforms")]),t._v(", the creator of the campaign is the owner of the platform. Funds go directly to the creator’s wallet "),e("strong",[t._v("without any fees")]),t._v(".")]),t._v(" "),e("ol",[e("li",[t._v("Go to > Apps")]),t._v(" "),e("li",[t._v("Add a name of your app")]),t._v(" "),e("li",[t._v("Choose app type > Crowdfund")]),t._v(" "),e("li",[t._v("Select the store to associate with the app.")]),t._v(" "),e("li",[t._v("Customize your Crowdfund by adding your own perks with prices, photos, and description.")]),t._v(" "),e("li",[t._v("Check the box > Allow crowdfund to be publicly visible")]),t._v(" "),e("li",[t._v('Click "Save Settings".')]),t._v(" "),e("li",[t._v('Click "View App" to view your Crowdfund (Contributors can access the crowdfund through that link).')])]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/tFbfyneDj88/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=tFbfyneDj88",title:"BTCPay Server Crowdfunding","data-id":"tFbfyneDj88"}},[e("iframe",{attrs:{title:"BTCPay Server Crowdfunding","data-src":"https://www.youtube-nocookie.com/embed/tFbfyneDj88?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("p",[t._v("If you would like to provide digital or physical products to the backers of your "),e("strong",[t._v("crowdfunding campaign")]),t._v(", you can "),e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-to-integrate-woocommerce-store-into-a-btcpay-crowdfund-app"}},[t._v("integrate WooCommerce store into it")]),t._v(". You can also set limits on contribution perks using the inventory feature.")],1),t._v(" "),e("h2",{attrs:{id:"payment-button"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#payment-button"}},[t._v("#")]),t._v(" Payment Button")]),t._v(" "),e("p",[t._v("Easily-embeddable HTML and highly-customizable "),e("strong",[t._v("payment buttons")]),t._v(" allow users to receive tips and donations. Online stores can also integrate payment buttons. When a site visitor clicks on the button, BTCPay displays the "),e("strong",[t._v("invoice")]),t._v(".")]),t._v(" "),e("ol",[e("li",[t._v('In your left menu bar, under the "PLUGINS" section, select "Pay Button".')]),t._v(" "),e("li",[t._v("Allow anyone to create invoices.")]),t._v(" "),e("li",[t._v("Customize your button.")]),t._v(" "),e("li",[t._v("Copy the generated form and embed it on your website.")])]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/MIWGvl6_WzI/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=MIWGvl6_WzI",title:"BTCPay Server Payment Buttons","data-id":"MIWGvl6_WzI"}},[e("iframe",{attrs:{title:"BTCPay Server Payment Buttons","data-src":"https://www.youtube-nocookie.com/embed/MIWGvl6_WzI?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{349:function(t,e,o){t.exports=o.p+"assets/img/BTCPayPointOfSale1.84c38097.jpg"},760:function(t,e,o){"use strict";o.r(e);var a=o(17),r=Object(a.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-server-apps"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-apps"}},[t._v("#")]),t._v(" BTCPay Server Apps")]),t._v(" "),e("p",[t._v("The primary purpose of BTCPay Server is to remove dependencies on trusted third-parties. The Apps are built in applications that obsolete central-authorities and allow users an easy way to extend the "),e("RouterLink",{attrs:{to:"/UseCase/"}},[t._v("use case")]),t._v(" of the software. Users can self-host all sorts of customizable applications that work out of the box.")],1),t._v(" "),e("p",[t._v("To create an app, go to Apps > Create a new app. Apps are store-dependent, which means that each app needs to be connected to a store.")]),t._v(" "),e("h2",{attrs:{id:"point-of-sale-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#point-of-sale-app"}},[t._v("#")]),t._v(" Point of Sale App")]),t._v(" "),e("p",[t._v("The "),e("strong",[t._v("web-based PoS app")]),t._v(" allows users with brick and mortar stores to readily "),e("strong",[t._v("accept cryptocurrencies without fees or a third-party")]),t._v(", directly to their wallet. The "),e("strong",[t._v("PoS")]),t._v(" can be displayed easily on tablets or any other devices which support web browsing. Users can easily create a homescreen shortcut for a quick access to the web-app.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(349),alt:"BTCPay Pos",title:"BTCPay Pos"}})]),t._v(" "),e("p",[t._v("Adding new products is easy. The app has a "),e("strong",[t._v("shopping cart feature")]),t._v(", "),e("strong",[t._v("tips")]),t._v(", "),e("strong",[t._v("product inventory")]),t._v(", "),e("strong",[t._v("custom payment options")]),t._v(" and more.")]),t._v(" "),e("p",[t._v("The "),e("strong",[t._v("Point of sale app")]),t._v(" can also be used to receive donations, tips or even as a small e-commerce shop, depending on the options or customizations applied.")]),t._v(" "),e("p",[t._v("Curently, the "),e("strong",[t._v("Point of Sale app")]),t._v(" supports three different views:")]),t._v(" "),e("ul",[e("li",[t._v("A "),e("code",[t._v("Static")]),t._v(" view representing only the items for sale.")]),t._v(" "),e("li",[t._v("A "),e("code",[t._v("Cart")]),t._v(" view including items for sale and a cart for checkout.")]),t._v(" "),e("li",[t._v("A "),e("code",[t._v("Light")]),t._v(" view consisting only of a keypad for easy and quick payments (Starting from "),e("a",{attrs:{href:"https://blog.btcpayserver.org/btcpay-server-1-0-5-6/#simplePOS",target:"_blank",rel:"noopener noreferrer"}},[t._v("v1.0.5.6"),e("OutboundLink")],1),t._v(").")])]),t._v(" "),e("p",[t._v("To get your first "),e("strong",[t._v("Point of Sale app")]),t._v(" running, follow theses few simple steps:")]),t._v(" "),e("ol",[e("li",[t._v("Go to "),e("code",[t._v("Apps")]),t._v(" and "),e("code",[t._v("Create a new app")])]),t._v(" "),e("li",[t._v("Add a "),e("code",[t._v("name")]),t._v(" for your app")]),t._v(" "),e("li",[t._v("Choose "),e("code",[t._v("app type")]),t._v(" > Point Of Sale")]),t._v(" "),e("li",[t._v("Select the "),e("code",[t._v("store")]),t._v(" to associate with the app.")]),t._v(" "),e("li",[t._v("Customize your PoS by choosing a "),e("code",[t._v("view")]),t._v(" (Static, Cart, Light), adding your own "),e("code",[t._v("items")]),t._v(" with prices, photos, and a description.")]),t._v(" "),e("li",[t._v("Click "),e("code",[t._v("Save Settings")]),t._v(".")]),t._v(" "),e("li",[t._v("Click "),e("code",[t._v("View App")]),t._v(" to view your PoS (Your customers can access the PoS through that link).")])]),t._v(" "),e("p",[t._v("You can change the appearance of your "),e("strong",[t._v("Point of Sale app")]),t._v(" by following the "),e("RouterLink",{attrs:{to:"/Development/Theme/"}},[t._v("theme customization guide")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"crowdfunding-app"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#crowdfunding-app"}},[t._v("#")]),t._v(" Crowdfunding App")]),t._v(" "),e("p",[e("strong",[t._v("Crowdfunding")]),t._v(" is an application which you can launch from BTCPay Server interface that allows you to create a "),e("strong",[t._v("self-hosted funding campaign")]),t._v(", similar to Kickstarter or Indiegogo. Unlike traditional "),e("strong",[t._v("crowdfunding platforms")]),t._v(", the creator of the campaign is the owner of the platform. Funds go directly to the creator’s wallet "),e("strong",[t._v("without any fees")]),t._v(".")]),t._v(" "),e("ol",[e("li",[t._v("Go to > Apps")]),t._v(" "),e("li",[t._v("Add a name of your app")]),t._v(" "),e("li",[t._v("Choose app type > Crowdfund")]),t._v(" "),e("li",[t._v("Select the store to associate with the app.")]),t._v(" "),e("li",[t._v("Customize your Crowdfund by adding your own perks with prices, photos, and description.")]),t._v(" "),e("li",[t._v("Check the box > Allow crowdfund to be publicly visible")]),t._v(" "),e("li",[t._v('Click "Save Settings".')]),t._v(" "),e("li",[t._v('Click "View App" to view your Crowdfund (Contributors can access the crowdfund through that link).')])]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/tFbfyneDj88/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=tFbfyneDj88",title:"BTCPay Server Crowdfunding","data-id":"tFbfyneDj88"}},[e("iframe",{attrs:{title:"BTCPay Server Crowdfunding","data-src":"https://www.youtube-nocookie.com/embed/tFbfyneDj88?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("p",[t._v("If you would like to provide digital or physical products to the backers of your "),e("strong",[t._v("crowdfunding campaign")]),t._v(", you can "),e("RouterLink",{attrs:{to:"/FAQ/Apps/#how-to-integrate-woocommerce-store-into-a-btcpay-crowdfund-app"}},[t._v("integrate WooCommerce store into it")]),t._v(". You can also set limits on contribution perks using the inventory feature.")],1),t._v(" "),e("h2",{attrs:{id:"payment-button"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#payment-button"}},[t._v("#")]),t._v(" Payment Button")]),t._v(" "),e("p",[t._v("Easily-embeddable HTML and highly-customizable "),e("strong",[t._v("payment buttons")]),t._v(" allow users to receive tips and donations. Online stores can also integrate payment buttons. When a site visitor clicks on the button, BTCPay displays the "),e("strong",[t._v("invoice")]),t._v(".")]),t._v(" "),e("ol",[e("li",[t._v('In your left menu bar, under the "PLUGINS" section, select "Pay Button".')]),t._v(" "),e("li",[t._v("Allow anyone to create invoices.")]),t._v(" "),e("li",[t._v("Customize your button.")]),t._v(" "),e("li",[t._v("Copy the generated form and embed it on your website.")])]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/MIWGvl6_WzI/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=MIWGvl6_WzI",title:"BTCPay Server Payment Buttons","data-id":"MIWGvl6_WzI"}},[e("iframe",{attrs:{title:"BTCPay Server Payment Buttons","data-src":"https://www.youtube-nocookie.com/embed/MIWGvl6_WzI?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})])])}),[],!1,null,null,null);e.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/79.ad9bc617.js b/assets/js/79.d1b8b2da.js similarity index 99% rename from assets/js/79.ad9bc617.js rename to assets/js/79.d1b8b2da.js index 2d752fe30e..4ae7b39383 100644 --- a/assets/js/79.ad9bc617.js +++ b/assets/js/79.d1b8b2da.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{378:function(t,a,e){t.exports=e.p+"assets/img/transifex-alert.6ee8f6a0.png"},782:function(t,a,e){"use strict";e.r(a);var s=e(17),r=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"translating-btcpay-server"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#translating-btcpay-server"}},[t._v("#")]),t._v(" Translating BTCPay Server")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#why-translations-matter"}},[t._v("Why translations matter")])]),a("li",[a("a",{attrs:{href:"#requirements"}},[t._v("Requirements")])]),a("li",[a("a",{attrs:{href:"#step-1-view-existing-translations"}},[t._v("Step 1: View Existing Translations")])]),a("li",[a("a",{attrs:{href:"#step-2-start-new-translation"}},[t._v("Step 2: Start New Translation")])]),a("li",[a("a",{attrs:{href:"#step-3-translation"}},[t._v("Step 3: Translation")])]),a("li",[a("a",{attrs:{href:"#translation-tips"}},[t._v("Translation Tips")]),a("ul",[a("li",[a("a",{attrs:{href:"#-variables-"}},[t._v("Variables")])]),a("li",[a("a",{attrs:{href:"#-notifications-"}},[t._v("Notifications")])])])]),a("li",[a("a",{attrs:{href:"#get-help-ask-questions"}},[t._v("Get help, ask questions")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"why-translations-matter"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#why-translations-matter"}},[t._v("#")]),t._v(" Why translations matter")]),t._v(" "),a("p",[t._v("Translating BTCPay Server into multiple languages lets us reach a broader user base for the software and also decreases friction in the invoice checkout for customers that might not understand English perfectly.")]),t._v(" "),a("h2",{attrs:{id:"requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),a("p",[t._v("BTCPay Server uses a translation platform called Transifex to allow contributors to translate it into more languages.")]),t._v(" "),a("p",[t._v("The community is currently working on translating the "),a("a",{attrs:{href:"https://www.transifex.com/btcpayserver/btcpayserver/dashboard/",target:"_blank",rel:"noopener noreferrer"}},[t._v("invoice checkout page"),a("OutboundLink")],1),t._v(" and the "),a("a",{attrs:{href:"https://www.transifex.com/btcpayserver/btcpayserver-website/dashboard/",target:"_blank",rel:"noopener noreferrer"}},[t._v("official website"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("After a translation has been made on Transifex, the submittal process is completely automated and merged periodically into the BTCPay repository. Translations provided outside of Transifex, such as pull requests in Github will not be accepted.")]),t._v(" "),a("hr"),t._v(" "),a("h2",{attrs:{id:"step-1-view-existing-translations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#step-1-view-existing-translations"}},[t._v("#")]),t._v(" Step 1: View Existing Translations")]),t._v(" "),a("p",[t._v("First verify the language translation you would like to complete has not been started already. If it has already been started, you can complete the remaining strings. If you don't see the language you are looking for, make a request to add it to the project and to be a translator for it.")]),t._v(" "),a("h2",{attrs:{id:"step-2-start-new-translation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#step-2-start-new-translation"}},[t._v("#")]),t._v(" Step 2: Start New Translation")]),t._v(" "),a("p",[t._v("Look for the language you would like to translate. Some languages have the option for several regions. If your language request was denied, the reason is likely that the language is already being translated.")]),t._v(" "),a("h2",{attrs:{id:"step-3-translation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#step-3-translation"}},[t._v("#")]),t._v(" Step 3: Translation")]),t._v(" "),a("p",[t._v("Line 1: Translate your Country-Code.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[t._v("Example for Brazilian Portuguese\n 'en' translates to 'pt-BR'\n")])])]),a("p",[t._v("Line 2: The name of your language, in your language.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("This is the language name that will appear in user interface language dropdowns.")])]),t._v(" "),a("p",[t._v("Example for French\n'English' translates to 'Français'")]),t._v(" "),a("hr"),t._v(" "),a("h2",{attrs:{id:"translation-tips"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#translation-tips"}},[t._v("#")]),t._v(" Translation Tips")]),t._v(" "),a("h3",{attrs:{id:"variables"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#variables"}},[t._v("#")]),t._v(" "),a("strong",[t._v("Variables")])]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("{{Words}} like this will be replaced by a variable depending on user choices.\n{{btcDue}} Example: 10\n{{cryptoCode}} Example: BTC\n")])])]),a("p",[t._v("They should not be translated, but they need to remain in the correct place in your translated string because their placement will vary by language.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v('French Example:\n"Return to StoreName" translates to "Retourner sur {{storeName}}"\n\nJapanese Example:\n"Return to StoreName" translates to "{{storeName}} に戻る"\n')])])]),a("h3",{attrs:{id:"notifications"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#notifications"}},[t._v("#")]),t._v(" "),a("strong",[t._v("Notifications")])]),t._v(" "),a("p",[t._v("To stay up to date with new strings - enable alerts for new strings needing to be translated by enabling the watch language feature in Transifex.")]),t._v(" "),a("p",[t._v('Click on the "eye" icon (in red in the following screenshot).')]),t._v(" "),a("figure",[a("img",{attrs:{src:e(378),alt:"Transifex Alerts",title:"Transifex Alerts"}})]),t._v(" "),a("p",[t._v("You have to click it for the each project you wish to follow.")]),t._v(" "),a("hr"),t._v(" "),a("h2",{attrs:{id:"get-help-ask-questions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#get-help-ask-questions"}},[t._v("#")]),t._v(" Get help, ask questions")]),t._v(" "),a("p",[t._v("If you have any questions about translating, join the "),a("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/translations",target:"_blank",rel:"noopener noreferrer"}},[t._v("#Translations channel"),a("OutboundLink")],1),t._v(" on Mattermost.")])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[79],{378:function(t,a,e){t.exports=e.p+"assets/img/transifex-alert.6ee8f6a0.png"},781:function(t,a,e){"use strict";e.r(a);var s=e(17),r=Object(s.a)({},(function(){var t=this,a=t._self._c;return a("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[a("h1",{attrs:{id:"translating-btcpay-server"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#translating-btcpay-server"}},[t._v("#")]),t._v(" Translating BTCPay Server")]),t._v(" "),a("p"),a("div",{staticClass:"table-of-contents"},[a("ul",[a("li",[a("a",{attrs:{href:"#why-translations-matter"}},[t._v("Why translations matter")])]),a("li",[a("a",{attrs:{href:"#requirements"}},[t._v("Requirements")])]),a("li",[a("a",{attrs:{href:"#step-1-view-existing-translations"}},[t._v("Step 1: View Existing Translations")])]),a("li",[a("a",{attrs:{href:"#step-2-start-new-translation"}},[t._v("Step 2: Start New Translation")])]),a("li",[a("a",{attrs:{href:"#step-3-translation"}},[t._v("Step 3: Translation")])]),a("li",[a("a",{attrs:{href:"#translation-tips"}},[t._v("Translation Tips")]),a("ul",[a("li",[a("a",{attrs:{href:"#-variables-"}},[t._v("Variables")])]),a("li",[a("a",{attrs:{href:"#-notifications-"}},[t._v("Notifications")])])])]),a("li",[a("a",{attrs:{href:"#get-help-ask-questions"}},[t._v("Get help, ask questions")])])])]),a("p"),t._v(" "),a("h2",{attrs:{id:"why-translations-matter"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#why-translations-matter"}},[t._v("#")]),t._v(" Why translations matter")]),t._v(" "),a("p",[t._v("Translating BTCPay Server into multiple languages lets us reach a broader user base for the software and also decreases friction in the invoice checkout for customers that might not understand English perfectly.")]),t._v(" "),a("h2",{attrs:{id:"requirements"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#requirements"}},[t._v("#")]),t._v(" Requirements")]),t._v(" "),a("p",[t._v("BTCPay Server uses a translation platform called Transifex to allow contributors to translate it into more languages.")]),t._v(" "),a("p",[t._v("The community is currently working on translating the "),a("a",{attrs:{href:"https://www.transifex.com/btcpayserver/btcpayserver/dashboard/",target:"_blank",rel:"noopener noreferrer"}},[t._v("invoice checkout page"),a("OutboundLink")],1),t._v(" and the "),a("a",{attrs:{href:"https://www.transifex.com/btcpayserver/btcpayserver-website/dashboard/",target:"_blank",rel:"noopener noreferrer"}},[t._v("official website"),a("OutboundLink")],1),t._v(".")]),t._v(" "),a("p",[t._v("After a translation has been made on Transifex, the submittal process is completely automated and merged periodically into the BTCPay repository. Translations provided outside of Transifex, such as pull requests in Github will not be accepted.")]),t._v(" "),a("hr"),t._v(" "),a("h2",{attrs:{id:"step-1-view-existing-translations"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#step-1-view-existing-translations"}},[t._v("#")]),t._v(" Step 1: View Existing Translations")]),t._v(" "),a("p",[t._v("First verify the language translation you would like to complete has not been started already. If it has already been started, you can complete the remaining strings. If you don't see the language you are looking for, make a request to add it to the project and to be a translator for it.")]),t._v(" "),a("h2",{attrs:{id:"step-2-start-new-translation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#step-2-start-new-translation"}},[t._v("#")]),t._v(" Step 2: Start New Translation")]),t._v(" "),a("p",[t._v("Look for the language you would like to translate. Some languages have the option for several regions. If your language request was denied, the reason is likely that the language is already being translated.")]),t._v(" "),a("h2",{attrs:{id:"step-3-translation"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#step-3-translation"}},[t._v("#")]),t._v(" Step 3: Translation")]),t._v(" "),a("p",[t._v("Line 1: Translate your Country-Code.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",[a("code",[t._v("Example for Brazilian Portuguese\n 'en' translates to 'pt-BR'\n")])])]),a("p",[t._v("Line 2: The name of your language, in your language.")]),t._v(" "),a("div",{staticClass:"custom-block tip"},[a("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),a("p",[t._v("This is the language name that will appear in user interface language dropdowns.")])]),t._v(" "),a("p",[t._v("Example for French\n'English' translates to 'Français'")]),t._v(" "),a("hr"),t._v(" "),a("h2",{attrs:{id:"translation-tips"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#translation-tips"}},[t._v("#")]),t._v(" Translation Tips")]),t._v(" "),a("h3",{attrs:{id:"variables"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#variables"}},[t._v("#")]),t._v(" "),a("strong",[t._v("Variables")])]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v("{{Words}} like this will be replaced by a variable depending on user choices.\n{{btcDue}} Example: 10\n{{cryptoCode}} Example: BTC\n")])])]),a("p",[t._v("They should not be translated, but they need to remain in the correct place in your translated string because their placement will vary by language.")]),t._v(" "),a("div",{staticClass:"language- extra-class"},[a("pre",{pre:!0,attrs:{class:"language-text"}},[a("code",[t._v('French Example:\n"Return to StoreName" translates to "Retourner sur {{storeName}}"\n\nJapanese Example:\n"Return to StoreName" translates to "{{storeName}} に戻る"\n')])])]),a("h3",{attrs:{id:"notifications"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#notifications"}},[t._v("#")]),t._v(" "),a("strong",[t._v("Notifications")])]),t._v(" "),a("p",[t._v("To stay up to date with new strings - enable alerts for new strings needing to be translated by enabling the watch language feature in Transifex.")]),t._v(" "),a("p",[t._v('Click on the "eye" icon (in red in the following screenshot).')]),t._v(" "),a("figure",[a("img",{attrs:{src:e(378),alt:"Transifex Alerts",title:"Transifex Alerts"}})]),t._v(" "),a("p",[t._v("You have to click it for the each project you wish to follow.")]),t._v(" "),a("hr"),t._v(" "),a("h2",{attrs:{id:"get-help-ask-questions"}},[a("a",{staticClass:"header-anchor",attrs:{href:"#get-help-ask-questions"}},[t._v("#")]),t._v(" Get help, ask questions")]),t._v(" "),a("p",[t._v("If you have any questions about translating, join the "),a("a",{attrs:{href:"https://chat.btcpayserver.org/btcpayserver/channels/translations",target:"_blank",rel:"noopener noreferrer"}},[t._v("#Translations channel"),a("OutboundLink")],1),t._v(" on Mattermost.")])])}),[],!1,null,null,null);a.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/80.09b42ef2.js b/assets/js/80.1c986895.js similarity index 94% rename from assets/js/80.09b42ef2.js rename to assets/js/80.1c986895.js index cc8d3b2b8c..d57ed67ecb 100644 --- a/assets/js/80.09b42ef2.js +++ b/assets/js/80.1c986895.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{388:function(t,e,r){t.exports=r.p+"assets/img/Netlify_preview.ba76d24c.png"},786:function(t,e,r){"use strict";r.r(e);var o=r(17),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"contribute-to-the-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contribute-to-the-documentation"}},[t._v("#")]),t._v(" Contribute to the documentation")]),t._v(" "),e("p",[t._v("Helping us keep the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Documentation"),e("OutboundLink")],1),t._v(" up-to-date is an important contribution because BTCPay Server evolves at each release.")]),t._v(" "),e("p",[t._v("Beginners can view the following video on how to contribute to the BTCPay Server documentation:")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/bSDROcdSSWw/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=bSDROcdSSWw",title:"Contributing to Documentation","data-id":"bSDROcdSSWw"}},[e("iframe",{attrs:{title:"Contributing to Documentation","data-src":"https://www.youtube-nocookie.com/embed/bSDROcdSSWw?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("p",[t._v("The main documentation repository to fork/clone is the following: "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server Documentation"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("If your Pull Request alters the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Documentation"),e("OutboundLink")],1),t._v(", "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Website"),e("OutboundLink")],1),t._v(" or "),e("a",{attrs:{href:"https://github.com/btcpayserver/directory.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Directory"),e("OutboundLink")],1),t._v(" repositories, you can preview the changes directly in your web browser once your Pull Request is posted.")]),t._v(" "),e("p",[t._v("Simply click the "),e("code",[t._v("details")]),t._v(" button as shown in the screenshot below. Then locate the file or section that you edited and verify that everything appears as you intended.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(388),alt:"NetlifyDeploymentPreview",title:"NetlifyDeploymentPreview"}})]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("It's a good idea to use relative URLs instead of absolute URLs when editing links that redirect to pages that are part of the documentation already.\nThis helps the contributors setting up documentation locally.\n"),e("a",{attrs:{href:"https://v1.vuepress.vuejs.org/guide/markdown.html#internal-links/",target:"_blank",rel:"noopener noreferrer"}},[t._v("More info"),e("OutboundLink")],1),t._v(".")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[80],{379:function(t,e,r){t.exports=r.p+"assets/img/Netlify_preview.ba76d24c.png"},785:function(t,e,r){"use strict";r.r(e);var o=r(17),n=Object(o.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"contribute-to-the-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#contribute-to-the-documentation"}},[t._v("#")]),t._v(" Contribute to the documentation")]),t._v(" "),e("p",[t._v("Helping us keep the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc",target:"_blank",rel:"noopener noreferrer"}},[t._v("Documentation"),e("OutboundLink")],1),t._v(" up-to-date is an important contribution because BTCPay Server evolves at each release.")]),t._v(" "),e("p",[t._v("Beginners can view the following video on how to contribute to the BTCPay Server documentation:")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/bSDROcdSSWw/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=bSDROcdSSWw",title:"Contributing to Documentation","data-id":"bSDROcdSSWw"}},[e("iframe",{attrs:{title:"Contributing to Documentation","data-src":"https://www.youtube-nocookie.com/embed/bSDROcdSSWw?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("p",[t._v("The main documentation repository to fork/clone is the following: "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server Documentation"),e("OutboundLink")],1)]),t._v(" "),e("p",[t._v("If your Pull Request alters the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-doc/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Documentation"),e("OutboundLink")],1),t._v(", "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Website"),e("OutboundLink")],1),t._v(" or "),e("a",{attrs:{href:"https://github.com/btcpayserver/directory.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Directory"),e("OutboundLink")],1),t._v(" repositories, you can preview the changes directly in your web browser once your Pull Request is posted.")]),t._v(" "),e("p",[t._v("Simply click the "),e("code",[t._v("details")]),t._v(" button as shown in the screenshot below. Then locate the file or section that you edited and verify that everything appears as you intended.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(379),alt:"NetlifyDeploymentPreview",title:"NetlifyDeploymentPreview"}})]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("TIP")]),t._v(" "),e("p",[t._v("It's a good idea to use relative URLs instead of absolute URLs when editing links that redirect to pages that are part of the documentation already.\nThis helps the contributors setting up documentation locally.\n"),e("a",{attrs:{href:"https://v1.vuepress.vuejs.org/guide/markdown.html#internal-links/",target:"_blank",rel:"noopener noreferrer"}},[t._v("More info"),e("OutboundLink")],1),t._v(".")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/84.88cedb38.js b/assets/js/84.09891e28.js similarity index 98% rename from assets/js/84.88cedb38.js rename to assets/js/84.09891e28.js index 27f74df996..ccb2144644 100644 --- a/assets/js/84.88cedb38.js +++ b/assets/js/84.09891e28.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[84],{424:function(t,e,r){t.exports=r.p+"assets/img/DecisionDiagInstallBTCPayServer.381f8b42.png"},807:function(t,e,r){"use strict";r.r(e);var n=r(17),o=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"choosing-a-deployment-method"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#choosing-a-deployment-method"}},[t._v("#")]),t._v(" Choosing a Deployment Method")]),t._v(" "),e("p",[t._v("There are several "),e("strong",[t._v("different deployment methods")]),t._v(" available, all using "),e("strong",[t._v("the same BTCPay Server software")]),t._v(". Because BTCPay is a free and open-source cryptocurrency payment processor, we support diversity in deployment methods for users. Different solutions work best for "),e("RouterLink",{attrs:{to:"/UseCase/"}},[t._v("different use cases")]),t._v(".")],1),t._v(" "),e("p",[t._v("Business deployment methods can vary by setup, maintenance, support, price, etc. You can run "),e("strong",[t._v("BTCPay as a self-hosted")]),t._v(" solution on your own server, or use a "),e("strong",[t._v("third-party host")]),t._v(". The self-hosted solution allows you not only to attach an unlimited number of stores and use the "),e("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network")]),t._v(" but also become a payment processor for others.")],1),t._v(" "),e("p",[t._v("BTCPay is a non-custodial invoicing system which eliminates the involvement of a third-party when managing funds. Payments with BTCPay go directly to your wallet. Your private keys are never uploaded to the server. Meaning "),e("strong",[t._v("3rd Party BTCPay hosts do not control user funds")]),t._v(", they are simply hosting your instance of the BTCPay software for you.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(424),alt:"Decision diagram",title:"Decision diagram"}})]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("PLEASE NOTE")]),t._v(" "),e("p",[t._v("Manual deployments and Hardware builds are not recommended for production environments and require the user to have technical knowledge related to the build.")])]),t._v(" "),e("h2",{attrs:{id:"to-choose-one-that-will-best-suit-your-needs-consider-the-following"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#to-choose-one-that-will-best-suit-your-needs-consider-the-following"}},[t._v("#")]),t._v(" To choose one that will best suit your needs, consider the following:"),e("br")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"left"}},[t._v("Deployment method")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Difficulty")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Production/Dev")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("All features "),e("br"),t._v("available")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Approx. cost"),e("br"),t._v(" per month")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Lunanode")]),e("br"),e("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[t._v("1-click install")])],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Easy")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Production")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Yes")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("$10")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Voltage-Cloud")]),e("br"),e("RouterLink",{attrs:{to:"/Deployment/voltagecloud/"}},[t._v("1-click install")])],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Easy")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Production")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("No")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("$10-$30")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Clovyr")]),e("br"),e("RouterLink",{attrs:{to:"/Deployment/Clovyr/"}},[t._v("1-click install")])],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Easy")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Production")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Yes")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("$20")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Third-Party Hosts")]),e("br"),e("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[t._v("What is this ?")])],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Easy")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Production")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("strong",[t._v("Host:")]),t._v(" Yes"),e("br"),e("strong",[t._v("Hostee:")]),t._v(" No")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("strong",[t._v("Free")]),t._v(" or "),e("strong",[t._v("Paid")]),t._v(" hosting,"),e("br"),t._v("depending on provider.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Hardware & Cloud As A Service:")]),e("br"),t._v("- "),e("a",{attrs:{href:"https://start9.com",target:"_blank",rel:"noopener noreferrer"}},[t._v("embassyOS"),e("OutboundLink")],1),e("br"),t._v("- "),e("a",{attrs:{href:"https://lightninginabox.co/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Lightning in a Box"),e("OutboundLink")],1),e("br"),t._v("- "),e("a",{attrs:{href:"https://www.nodl.it/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nodl.it"),e("OutboundLink")],1),e("br"),t._v("- "),e("a",{attrs:{href:"https://nodl.cloud/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nodl.cloud"),e("OutboundLink")],1),e("br"),t._v("- "),e("a",{attrs:{href:"https://voltage.cloud/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Voltage.cloud"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Easy to Moderate")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Production")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Yes")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Varies on provider")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Virtual Private Server:")]),t._v(" "),e("br"),t._v("OpenVZ not supported"),e("br"),t._v("- "),e("a",{attrs:{href:"https://medium.com/@BtcpayServer/hosting-btcpayserver-on-lunanode-bf9ef5fff75b",target:"_blank",rel:"noopener noreferrer"}},[t._v("LunaNode"),e("OutboundLink")],1),e("br"),t._v("- "),e("RouterLink",{attrs:{to:"/Deployment/Azure/"}},[t._v("Microsoft Azure")]),e("br"),t._v("- "),e("a",{attrs:{href:"https://medium.com/@molthoff/running-btcpay-on-digital-ocean-for-10-month-how-to-add-other-coins-7a497339fb2f",target:"_blank",rel:"noopener noreferrer"}},[t._v("Digital Ocean"),e("OutboundLink")],1),e("br"),t._v("- "),e("RouterLink",{attrs:{to:"/Deployment/GoogleCloud/"}},[t._v("Google Cloud")]),e("br"),t._v("- Other VPS "),e("br"),t._v(" ("),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#what-are-the-minimal-requirements-for-btcpay"}},[t._v("minimal requirements")]),t._v(")")],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Moderate to Hard")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Production")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Yes")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("$10-70"),e("br"),t._v("depending on provider")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Manual Deployment:")]),e("br"),t._v("- "),e("a",{attrs:{href:"https://web.archive.org/web/20210416102027/http://blog.sipsorcery.com/?p=1052",target:"_blank",rel:"noopener noreferrer"}},[t._v("Install From Command Line"),e("OutboundLink")],1),e("br"),t._v("- "),e("RouterLink",{attrs:{to:"/Deployment/ManualDeployment/"}},[t._v("Build Without Docker Image")])],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Very hard")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Development")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Yes")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Components + Electricity")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[e("RouterLink",{attrs:{to:"/Deployment/Hardware/"}},[t._v("Hardware")]),t._v(" build:")],1),e("br"),t._v("- "),e("RouterLink",{attrs:{to:"/Deployment/RaspberryPi4/"}},[t._v("Raspberry Pi 4")]),e("br"),t._v("- "),e("RouterLink",{attrs:{to:"/Deployment/Hack0/"}},[t._v("Hack0")]),t._v(" "),e("br"),t._v("- "),e("RouterLink",{attrs:{to:"/Deployment/LightningInABox/"}},[t._v("LightningInABox")])],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("hard")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Development")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Yes")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Components + Electricity")])])])]),t._v(" "),e("p",[e("em",[t._v("Notes:")]),e("br"),t._v(" "),e("em",[t._v("- VPS providers that use OpenVZ are not supported.")]),e("br"),t._v(" "),e("em",[t._v("- "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/tree/master/contrib/FastSync",target:"_blank",rel:"noopener noreferrer"}},[t._v("Fast Sync"),e("OutboundLink")],1),t._v(" can be used to accelerate the initial setup sync time for most deployments.")])])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[84],{422:function(t,e,r){t.exports=r.p+"assets/img/DecisionDiagInstallBTCPayServer.381f8b42.png"},803:function(t,e,r){"use strict";r.r(e);var n=r(17),o=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"choosing-a-deployment-method"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#choosing-a-deployment-method"}},[t._v("#")]),t._v(" Choosing a Deployment Method")]),t._v(" "),e("p",[t._v("There are several "),e("strong",[t._v("different deployment methods")]),t._v(" available, all using "),e("strong",[t._v("the same BTCPay Server software")]),t._v(". Because BTCPay is a free and open-source cryptocurrency payment processor, we support diversity in deployment methods for users. Different solutions work best for "),e("RouterLink",{attrs:{to:"/UseCase/"}},[t._v("different use cases")]),t._v(".")],1),t._v(" "),e("p",[t._v("Business deployment methods can vary by setup, maintenance, support, price, etc. You can run "),e("strong",[t._v("BTCPay as a self-hosted")]),t._v(" solution on your own server, or use a "),e("strong",[t._v("third-party host")]),t._v(". The self-hosted solution allows you not only to attach an unlimited number of stores and use the "),e("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network")]),t._v(" but also become a payment processor for others.")],1),t._v(" "),e("p",[t._v("BTCPay is a non-custodial invoicing system which eliminates the involvement of a third-party when managing funds. Payments with BTCPay go directly to your wallet. Your private keys are never uploaded to the server. Meaning "),e("strong",[t._v("3rd Party BTCPay hosts do not control user funds")]),t._v(", they are simply hosting your instance of the BTCPay software for you.")]),t._v(" "),e("figure",[e("img",{attrs:{src:r(422),alt:"Decision diagram",title:"Decision diagram"}})]),t._v(" "),e("div",{staticClass:"custom-block warning"},[e("p",{staticClass:"custom-block-title"},[t._v("PLEASE NOTE")]),t._v(" "),e("p",[t._v("Manual deployments and Hardware builds are not recommended for production environments and require the user to have technical knowledge related to the build.")])]),t._v(" "),e("h2",{attrs:{id:"to-choose-one-that-will-best-suit-your-needs-consider-the-following"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#to-choose-one-that-will-best-suit-your-needs-consider-the-following"}},[t._v("#")]),t._v(" To choose one that will best suit your needs, consider the following:"),e("br")]),t._v(" "),e("table",[e("thead",[e("tr",[e("th",{staticStyle:{"text-align":"left"}},[t._v("Deployment method")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Difficulty")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Production/Dev")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("All features "),e("br"),t._v("available")]),t._v(" "),e("th",{staticStyle:{"text-align":"center"}},[t._v("Approx. cost"),e("br"),t._v(" per month")])])]),t._v(" "),e("tbody",[e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Lunanode")]),e("br"),e("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[t._v("1-click install")])],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Easy")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Production")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Yes")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("$10")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Voltage-Cloud")]),e("br"),e("RouterLink",{attrs:{to:"/Deployment/voltagecloud/"}},[t._v("1-click install")])],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Easy")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Production")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("No")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("$10-$30")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Clovyr")]),e("br"),e("RouterLink",{attrs:{to:"/Deployment/Clovyr/"}},[t._v("1-click install")])],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Easy")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Production")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Yes")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("$20")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Third-Party Hosts")]),e("br"),e("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[t._v("What is this ?")])],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Easy")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Production")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("strong",[t._v("Host:")]),t._v(" Yes"),e("br"),e("strong",[t._v("Hostee:")]),t._v(" No")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[e("strong",[t._v("Free")]),t._v(" or "),e("strong",[t._v("Paid")]),t._v(" hosting,"),e("br"),t._v("depending on provider.")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Hardware & Cloud As A Service:")]),e("br"),t._v("- "),e("a",{attrs:{href:"https://start9.com",target:"_blank",rel:"noopener noreferrer"}},[t._v("embassyOS"),e("OutboundLink")],1),e("br"),t._v("- "),e("a",{attrs:{href:"https://lightninginabox.co/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Lightning in a Box"),e("OutboundLink")],1),e("br"),t._v("- "),e("a",{attrs:{href:"https://www.nodl.it/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nodl.it"),e("OutboundLink")],1),e("br"),t._v("- "),e("a",{attrs:{href:"https://nodl.cloud/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Nodl.cloud"),e("OutboundLink")],1),e("br"),t._v("- "),e("a",{attrs:{href:"https://voltage.cloud/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Voltage.cloud"),e("OutboundLink")],1)]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Easy to Moderate")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Production")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Yes")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Varies on provider")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Virtual Private Server:")]),t._v(" "),e("br"),t._v("OpenVZ not supported"),e("br"),t._v("- "),e("a",{attrs:{href:"https://medium.com/@BtcpayServer/hosting-btcpayserver-on-lunanode-bf9ef5fff75b",target:"_blank",rel:"noopener noreferrer"}},[t._v("LunaNode"),e("OutboundLink")],1),e("br"),t._v("- "),e("RouterLink",{attrs:{to:"/Deployment/Azure/"}},[t._v("Microsoft Azure")]),e("br"),t._v("- "),e("a",{attrs:{href:"https://medium.com/@molthoff/running-btcpay-on-digital-ocean-for-10-month-how-to-add-other-coins-7a497339fb2f",target:"_blank",rel:"noopener noreferrer"}},[t._v("Digital Ocean"),e("OutboundLink")],1),e("br"),t._v("- "),e("RouterLink",{attrs:{to:"/Deployment/GoogleCloud/"}},[t._v("Google Cloud")]),e("br"),t._v("- Other VPS "),e("br"),t._v(" ("),e("RouterLink",{attrs:{to:"/FAQ/Deployment/#what-are-the-minimal-requirements-for-btcpay"}},[t._v("minimal requirements")]),t._v(")")],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Moderate to Hard")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Production")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Yes")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("$10-70"),e("br"),t._v("depending on provider")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[t._v("Manual Deployment:")]),e("br"),t._v("- "),e("a",{attrs:{href:"https://web.archive.org/web/20210416102027/http://blog.sipsorcery.com/?p=1052",target:"_blank",rel:"noopener noreferrer"}},[t._v("Install From Command Line"),e("OutboundLink")],1),e("br"),t._v("- "),e("RouterLink",{attrs:{to:"/Deployment/ManualDeployment/"}},[t._v("Build Without Docker Image")])],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Very hard")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Development")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Yes")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Components + Electricity")])]),t._v(" "),e("tr",[e("td",{staticStyle:{"text-align":"left"}},[e("strong",[e("RouterLink",{attrs:{to:"/Deployment/Hardware/"}},[t._v("Hardware")]),t._v(" build:")],1),e("br"),t._v("- "),e("RouterLink",{attrs:{to:"/Deployment/RaspberryPi4/"}},[t._v("Raspberry Pi 4")]),e("br"),t._v("- "),e("RouterLink",{attrs:{to:"/Deployment/Hack0/"}},[t._v("Hack0")]),t._v(" "),e("br"),t._v("- "),e("RouterLink",{attrs:{to:"/Deployment/LightningInABox/"}},[t._v("LightningInABox")])],1),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("hard")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Development")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Yes")]),t._v(" "),e("td",{staticStyle:{"text-align":"center"}},[t._v("Components + Electricity")])])])]),t._v(" "),e("p",[e("em",[t._v("Notes:")]),e("br"),t._v(" "),e("em",[t._v("- VPS providers that use OpenVZ are not supported.")]),e("br"),t._v(" "),e("em",[t._v("- "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker/tree/master/contrib/FastSync",target:"_blank",rel:"noopener noreferrer"}},[t._v("Fast Sync"),e("OutboundLink")],1),t._v(" can be used to accelerate the initial setup sync time for most deployments.")])])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/85.62148a14.js b/assets/js/85.3dd2e30e.js similarity index 95% rename from assets/js/85.62148a14.js rename to assets/js/85.3dd2e30e.js index dcdc6013a2..6c4b3c871b 100644 --- a/assets/js/85.62148a14.js +++ b/assets/js/85.3dd2e30e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[85],{432:function(e,t,r){e.exports=r.p+"assets/img/Architecture.88b62a98.png"},818:function(e,t,r){"use strict";r.r(t);var o=r(17),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[e._v("#")]),e._v(" Architecture")]),e._v(" "),t("p",[e._v("BTCPay Server is a project which ties together "),t("strong",[e._v("several Bitcoin-related components")]),e._v(" into a coherent user experience for installing and managing your own payment processor.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(432),alt:"Architecture",title:"Architecture"}})]),e._v(" "),t("p",[e._v("The minimal setup involves:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBXplorer"),t("OutboundLink")],1),e._v(" (Lightweight block explorer, responsible for tracking payments)")]),e._v(" "),t("li",[e._v("Bitcoin Core")]),e._v(" "),t("li",[e._v("PostgreSQL")])]),e._v(" "),t("p",[e._v("Additionally, if you need Lightning Network access, NBXplorer supports connections to:")]),e._v(" "),t("ul",[t("li",[e._v("Core Lightning (CLN) (via unix sockets)")]),e._v(" "),t("li",[e._v("LND (via the REST interface)")])]),e._v(" "),t("p",[e._v("Video below shows "),t("strong",[e._v("BTCPay Architecture")]),e._v(" in-depth.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Up0dvorzSNM/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Up0dvorzSNM",title:"BTCPay Architecture","data-id":"Up0dvorzSNM"}},[t("iframe",{attrs:{title:"BTCPay Architecture","data-src":"https://www.youtube-nocookie.com/embed/Up0dvorzSNM?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("hr"),e._v(" "),t("p",[e._v("We provide several ways of deploying BTCPay Server, depending on whether you favor flexibility or ease-of-use.")]),e._v(" "),t("p",[e._v("From the easiest way to the hardest:")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[e._v("Web-Interface LunaNode deployment")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Deployment/Azure/"}},[e._v("Azure deployment")]),e._v(" (Using a one-click deploy on Microsoft Azure)")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("Docker deployment")]),e._v(" (Using a "),t("code",[e._v("docker-compose.yml")]),e._v(" file which bundle all the dependencies together, in almost any environment)")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Deployment/ManualDeployment/"}},[e._v("Manual deployment")]),e._v(" (Downloading, building and running all the dependencies by yourself)")],1)]),e._v(" "),t("p",[e._v("Some community members also offer "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third-party hosting")]),e._v(" (Having someone else manage BTCPay Server for you).")],1),e._v(" "),t("p",[e._v("Remember the "),t("strong",[e._v("huge value")]),e._v(" of having "),t("strong",[e._v("direct control")]),e._v(" of your wallet and web service; for this reason we recommend you use "),t("RouterLink",{attrs:{to:"/Deployment/Azure/"}},[e._v("Azure deployment")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[e._v("Web-Interface deployment")]),e._v(" and "),t("strong",[e._v("do the setup yourself")]),e._v(" - it is pretty easy!")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[85],{427:function(e,t,r){e.exports=r.p+"assets/img/Architecture.88b62a98.png"},817:function(e,t,r){"use strict";r.r(t);var o=r(17),n=Object(o.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"architecture"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#architecture"}},[e._v("#")]),e._v(" Architecture")]),e._v(" "),t("p",[e._v("BTCPay Server is a project which ties together "),t("strong",[e._v("several Bitcoin-related components")]),e._v(" into a coherent user experience for installing and managing your own payment processor.")]),e._v(" "),t("figure",[t("img",{attrs:{src:r(427),alt:"Architecture",title:"Architecture"}})]),e._v(" "),t("p",[e._v("The minimal setup involves:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/dgarage/NBXplorer",target:"_blank",rel:"noopener noreferrer"}},[e._v("NBXplorer"),t("OutboundLink")],1),e._v(" (Lightweight block explorer, responsible for tracking payments)")]),e._v(" "),t("li",[e._v("Bitcoin Core")]),e._v(" "),t("li",[e._v("PostgreSQL")])]),e._v(" "),t("p",[e._v("Additionally, if you need Lightning Network access, NBXplorer supports connections to:")]),e._v(" "),t("ul",[t("li",[e._v("Core Lightning (CLN) (via unix sockets)")]),e._v(" "),t("li",[e._v("LND (via the REST interface)")])]),e._v(" "),t("p",[e._v("Video below shows "),t("strong",[e._v("BTCPay Architecture")]),e._v(" in-depth.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Up0dvorzSNM/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Up0dvorzSNM",title:"BTCPay Architecture","data-id":"Up0dvorzSNM"}},[t("iframe",{attrs:{title:"BTCPay Architecture","data-src":"https://www.youtube-nocookie.com/embed/Up0dvorzSNM?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("hr"),e._v(" "),t("p",[e._v("We provide several ways of deploying BTCPay Server, depending on whether you favor flexibility or ease-of-use.")]),e._v(" "),t("p",[e._v("From the easiest way to the hardest:")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[e._v("Web-Interface LunaNode deployment")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Deployment/Azure/"}},[e._v("Azure deployment")]),e._v(" (Using a one-click deploy on Microsoft Azure)")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Docker/"}},[e._v("Docker deployment")]),e._v(" (Using a "),t("code",[e._v("docker-compose.yml")]),e._v(" file which bundle all the dependencies together, in almost any environment)")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Deployment/ManualDeployment/"}},[e._v("Manual deployment")]),e._v(" (Downloading, building and running all the dependencies by yourself)")],1)]),e._v(" "),t("p",[e._v("Some community members also offer "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third-party hosting")]),e._v(" (Having someone else manage BTCPay Server for you).")],1),e._v(" "),t("p",[e._v("Remember the "),t("strong",[e._v("huge value")]),e._v(" of having "),t("strong",[e._v("direct control")]),e._v(" of your wallet and web service; for this reason we recommend you use "),t("RouterLink",{attrs:{to:"/Deployment/Azure/"}},[e._v("Azure deployment")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Deployment/LunaNode/"}},[e._v("Web-Interface deployment")]),e._v(" and "),t("strong",[e._v("do the setup yourself")]),e._v(" - it is pretty easy!")],1)])}),[],!1,null,null,null);t.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/87.b75e9822.js b/assets/js/87.2633d791.js similarity index 91% rename from assets/js/87.b75e9822.js rename to assets/js/87.2633d791.js index 8c54af1065..3f40bf2d6c 100644 --- a/assets/js/87.b75e9822.js +++ b/assets/js/87.2633d791.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[87],{501:function(t,e,a){t.exports=a.p+"assets/img/BTCPayServerScreenshot.276d0810.png"},851:function(t,e,a){"use strict";a.r(e);var r=a(17),l=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-server-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-documentation"}},[t._v("#")]),t._v(" BTCPay Server Documentation")]),t._v(" "),e("h2",{attrs:{id:"what-is-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#what-is-btcpay-server"}},[t._v("#")]),t._v(" What is BTCPay Server?")]),t._v(" "),e("p",[t._v("BTCPay Server is a free, open-source & self-hosted bitcoin payment gateway that allows self-sovereign individuals and businesses to accept bitcoin payments online or in person without any fees.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(501),alt:"BTCPay Server",title:"BTCPay Server screenshot"}})]),t._v(" "),e("h2",{attrs:{id:"how-btcpay-server-works"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-btcpay-server-works"}},[t._v("#")]),t._v(" How BTCPay Server works?")]),t._v(" "),e("p",[t._v("BTCPay Server is a self-hosted and automated invoicing system. At checkout, a customer is presented with an invoice that they pay from their wallet. BTCPay Server follows the status of the invoice through the blockchain and informs you when the payment has been settled so that you can fulfill the order. It also takes care of payment refunding and bitcoin management alongside plenty of other features.")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/nr0UNbz3AoQ/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=nr0UNbz3AoQ",title:"How BTCPay Works","data-id":"nr0UNbz3AoQ"}},[e("iframe",{attrs:{title:"How BTCPay Works","data-src":"https://www.youtube-nocookie.com/embed/nr0UNbz3AoQ?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/dbX6qWZlxOw/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=dbX6qWZlxOw",title:"BTCPay Server Simply Explained","data-id":"dbX6qWZlxOw"}},[e("iframe",{attrs:{title:"BTCPay Server Simply Explained","data-src":"https://www.youtube-nocookie.com/embed/dbX6qWZlxOw?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("p",[t._v("BTCPay Server is free to use and completely open-source, so developers or security auditors can always inspect the quality of the code.")]),t._v(" "),e("h2",{attrs:{id:"features"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#features"}},[t._v("#")]),t._v(" Features")]),t._v(" "),e("ul",[e("li",[t._v("Direct, peer-to-peer Bitcoin payments")]),t._v(" "),e("li",[t._v("No transaction fees (other than the "),e("a",{attrs:{href:"https://en.bitcoin.it/wiki/Miner_fees",target:"_blank",rel:"noopener noreferrer"}},[t._v("network fee"),e("OutboundLink")],1),t._v(")")]),t._v(" "),e("li",[t._v("No processing fees")]),t._v(" "),e("li",[t._v("No middleman")]),t._v(" "),e("li",[t._v("No KYC")]),t._v(" "),e("li",[t._v("Non-custodial (complete control over the private key)")]),t._v(" "),e("li",[t._v("Enhanced privacy")]),t._v(" "),e("li",[t._v("Enhanced security")]),t._v(" "),e("li",[t._v("Self-hosted software")]),t._v(" "),e("li",[t._v("SegWit support")]),t._v(" "),e("li",[t._v("Lightning Network support (LND, Core Lightning (CLN) & Eclair implementations)")]),t._v(" "),e("li",[t._v("Tor support")]),t._v(" "),e("li",[t._v("Opt-in "),e("RouterLink",{attrs:{to:"/Development/Altcoins/"}},[t._v("altcoin")]),t._v(" integrations")],1),t._v(" "),e("li",[t._v("Full compatibility with legacy BitPay API (easy migration)")]),t._v(" "),e("li",[t._v("Process payments for others")]),t._v(" "),e("li",[t._v("Easy-embeddable payment buttons")]),t._v(" "),e("li",[t._v("Point of sale app")]),t._v(" "),e("li",[t._v("Crowdfunding app")]),t._v(" "),e("li",[t._v("Payment Requests")]),t._v(" "),e("li",[t._v("Internal, full-node reliant wallet with "),e("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[t._v("hardware wallet integration")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Payjoin/"}},[t._v("Payjoin Support")])],1)]),t._v(" "),e("h2",{attrs:{id:"getting-started"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[t._v("#")]),t._v(" Getting started")]),t._v(" "),e("p",[t._v("To start using BTCPay Server, "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("decide how you would like to deploy it")]),t._v(". If you decide on a self-hosted option, start by reviewing our extensive deployment documentation. We recommend "),e("RouterLink",{attrs:{to:"/Docker/"}},[t._v("Docker deployment")]),t._v(". If your choice is a third-party hosting, read our "),e("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[t._v("third-party host docs")]),t._v(".")],1),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/R-yaXk4NvEs/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=R-yaXk4NvEs",title:"How BTCPay Server Features Overview","data-id":"R-yaXk4NvEs"}},[e("iframe",{attrs:{title:"How BTCPay Server Features Overview","data-src":"https://www.youtube-nocookie.com/embed/R-yaXk4NvEs?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("h2",{attrs:{id:"get-involved"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#get-involved"}},[t._v("#")]),t._v(" Get involved")]),t._v(" "),e("p",[t._v("Contributing to an open-source project is a great way to learn, network, and build your portfolio. Volunteers around the internet maintain BTCPay Server. If you would like to contribute to the project development, check our "),e("RouterLink",{attrs:{to:"/Contribute/"}},[t._v("contributing guidelines")])],1),t._v(" "),e("p",[t._v("If you're interested in helping out with documentation, look at the video below.")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/bSDROcdSSWw/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=bSDROcdSSWw",title:"Contributing to Documentation","data-id":"bSDROcdSSWw"}},[e("iframe",{attrs:{title:"Contributing to Documentation","data-src":"https://www.youtube-nocookie.com/embed/bSDROcdSSWw?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("h2",{attrs:{id:"support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[t._v("#")]),t._v(" Support")]),t._v(" "),e("p",[t._v("If you have trouble using BTCPay Server, consider joining the "),e("a",{attrs:{href:"https://btcpayserver.org/#communityCTA",target:"_blank",rel:"noopener noreferrer"}},[t._v("communities listed on the official website"),e("OutboundLink")],1),t._v(" to get help from BTCPay community members.")]),t._v(" "),e("p",[t._v("Only file a "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github issue"),e("OutboundLink")],1),t._v(" for technical issues you can't resolve through other channels or feature requests you've validated with other members of the community.")]),t._v(" "),e("p",[t._v("Please check out our "),e("a",{attrs:{href:"https://btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("official website"),e("OutboundLink")],1),t._v(",and "),e("RouterLink",{attrs:{to:"/FAQ/#btcpay-frequently-asked-questions-and-common-issues"}},[t._v("FAQ")]),t._v(" for more details.")],1),t._v(" "),e("svg",{attrs:{width:"0",height:"0",xmlns:"http://www.w3.org/2000/svg"}},[e("defs",[e("linearGradient",{attrs:{id:"spiral-gradient",x1:"81.36",y1:"311.35",x2:"541.35",y2:"311.35",gradientUnits:"userSpaceOnUse"}},[e("stop",{attrs:{offset:".18","stop-color":"#00f"}}),e("stop",{attrs:{offset:"1","stop-color":"#f0f"}})],1),t._v(" "),e("radialGradient",{attrs:{id:"acinq-a",cx:"47.833",cy:"51.834",r:"56.832"}},[e("stop",{attrs:{offset:"0","stop-color":"#fff"}}),e("stop",{attrs:{offset:"1","stop-color":"#fff","stop-opacity":"0"}})],1)],1),t._v(" "),e("symbol",{attrs:{id:"supporter-spiral",viewBox:"0 0 629 629"}},[e("path",{attrs:{d:"M326.4 572.09C201.2 572.09 141 503 112.48 445c-28.22-57.53-30.59-114.56-30.79-122.69-4.85-77 41-231.78 249.58-271.2a28.05 28.05 0 0 1 10.41 55.13c-213.12 40.28-204.44 206-204 213 0 .53.06 1.06.07 1.6.15 7.9 5.1 195.16 188.65 195.16 68.34 0 116.6-29.4 143.6-87.37 24.48-52.74 19.29-112.45-13.52-155.83-22.89-30.27-52.46-45-90.38-45-34.46 0-63.47 9.88-86.21 29.37A91.5 91.5 0 0 0 248 322.3c-1.41 25.4 7.14 49.36 24.07 67.49C287.27 406 305 413.9 326.4 413.9c27.46 0 45.52-9 53.66-26.81 8.38-18.3 3.61-38.93-.19-43.33-9.11-10-18.69-13.68-22.48-13-2.53.43-5.78 4.61-8.48 10.92a28 28 0 0 1-51.58-22c14.28-33.44 37.94-42 50.76-44.2 24.78-4.18 52.17 7.3 73.34 30.65s25.51 68.55 10.15 103.22C421.54 432 394.52 470 326.4 470c-36.72 0-69.67-14.49-95.29-41.92-27.47-29.4-41.34-68.08-39.11-108.89a149.1 149.1 0 0 1 51.31-104.6c33.19-28.45 74.48-42.87 122.71-42.87 55.12 0 101.85 23.25 135.12 67.23 45.36 60 52.9 141.71 19.66 213.3-25.35 54.67-79.68 119.84-194.4 119.84Z",fill:"url(#spiral-gradient)"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-bailliegifford",viewBox:"0 0 252.875 70.249"}},[e("path",{staticStyle:{fill:"var(--btcpay-body-text)","fill-opacity":"1",stroke:"var(--btcpay-body-text)","stroke-opacity":"1"},attrs:{d:"M366.764 291.907h4.554l-5.046 12.789h-4.553zM377.541 302.546h4.675l-.849 2.15h-9.229l5.046-12.789h4.554zM389.988 302.546h4.676l-.849 2.15h-9.229l5.045-12.789h4.554zM403.079 291.907h4.554l-5.046 12.789h-4.553zM418.795 302.487l-.871 2.209h-9.471l5.046-12.789h9.397l-.871 2.209h-4.844l-1.139 2.887h4.457l-.826 2.093h-4.457l-1.338 3.391zM445.115 294.349a6.207 6.207 0 0 0-2.213-.407c-3.344 0-4.898 3.391-5.35 4.535-.682 1.725-1.15 3.469.277 4.147.49.232 1.135.252 1.402.252l1.186-3.004h-1.648l.795-2.015h5.766l-2.4 6.084c-1.66.523-3.16.95-5.268.95-4.748 0-6.602-2.732-5.109-6.511 1.566-3.973 5.77-6.647 10.566-6.647 1.842 0 2.971.33 3.777.62l-1.781 1.996zM453.309 291.907h4.554l-5.045 12.789h-4.554zM458.684 304.696l5.045-12.789h9.398l-.871 2.209h-4.844l-1.269 3.217h4.457l-.871 2.209h-4.458l-2.033 5.154zM472.639 304.696l5.047-12.789h9.398l-.871 2.209h-4.846l-1.269 3.217h4.459l-.873 2.209h-4.457l-2.034 5.154z",transform:"translate(-293.5 -262.775)"}}),e("path",{staticStyle:{fill:"var(--btcpay-body-text)","fill-opacity":"1","fill-rule":"evenodd",stroke:"var(--btcpay-body-text)","stroke-opacity":"1"},attrs:{d:"M335.139 302.643c.557 0 1.187 0 1.747-.252.576-.232 1.106-.717 1.489-1.686.336-.854.189-1.279-.211-1.492-.376-.213-1.006-.213-1.612-.213h-.63l-1.438 3.643h.655zm2.154-5.523c.46 0 .993 0 1.521-.232.496-.213.986-.659 1.33-1.531.283-.717.162-1.085-.181-1.259-.319-.175-.852-.175-1.409-.175h-.63l-1.262 3.198h.631v-.001zm2.832-5.213c1.187 0 2.578.097 3.531.504.954.407 1.47 1.124.966 2.403-.727 1.841-2.749 2.732-4.501 3.12.502.077 1.378.252 2.05.698.647.445 1.06 1.182.578 2.403-.443 1.124-1.742 2.636-4.352 3.294-.995.252-2.107.368-4.481.368h-4.651l5.045-12.79h5.815zM350.689 300.201h2.833l.017-3.605-2.85 3.605zm6.664-8.294.792 12.79h-4.651l-.017-2.597h-4.288l-2.066 2.597h-3.149l10.714-12.79h2.665zM492.998 302.875c.922 0 2.209-.504 3.793-4.515 1.451-3.682 1.238-4.612-.047-4.612-1.283 0-2.363.775-3.955 4.806-1.07 2.713-1.316 4.321.209 4.321zm4.59-11.143c3.561 0 6.08 1.841 4.299 6.356-1.482 3.759-4.936 6.802-9.707 6.802-4.555 0-5.779-2.791-4.295-6.55 1.65-4.185 5.635-6.608 9.703-6.608zM512.328 293.922l-1.469 3.721h.484c1.502 0 2.234-.445 2.793-1.86.582-1.473.25-1.86-1.324-1.86h-.484v-.001zm1.254-2.015c2.398 0 3.312.078 4.168.426.814.33 1.785 1.124 1.166 2.694-.58 1.473-2.047 2.732-4.277 3.353l1.916 6.317h-4.893l-.965-5.29h-.533l-2.088 5.29h-4.408l5.047-12.79h4.867zM528.418 293.961l-3.424 8.682h.387c1.115 0 2.955.368 4.906-4.573 1.619-4.108.264-4.108-1.385-4.108h-.484v-.001zm.811-2.054c2.254 0 4.336 0 5.549 1.163 1.461 1.396.748 3.818.334 4.864-.727 1.841-2.406 4.748-6.227 6.143-1.24.446-2.498.62-5.09.62h-4.166l5.047-12.79h4.553z","clip-rule":"evenodd",transform:"translate(-293.5 -262.775)"}}),e("path",{staticStyle:{fill:"var(--btcpay-body-text)","fill-opacity":"1",stroke:"var(--btcpay-body-text)","stroke-opacity":"1"},attrs:{d:"M294 297.4c0-19.399 57.138-35.125 127.624-35.125 62.064 0 113.781 12.192 125.251 28.35-13.078-12.792-58.92-22.238-113.465-22.238-64.731 0-117.206 13.303-117.206 29.714 0 16.411 52.474 29.715 117.206 29.715 47.799 0 88.914-7.254 107.154-17.656-18.555 13.09-64.812 22.364-118.941 22.364C351.138 332.524 294 316.799 294 297.4z",transform:"translate(-293.5 -262.775)"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-coincards",viewBox:"0 0 64 32"}},[e("g",{attrs:{fill:"none"}},[e("path",{attrs:{d:"M32.7 5.9c-.2-1-1.3-1.7-2.3-1.4L7.7 9.9c-1 .2-1.7 1.3-1.4 2.3l3.1 12.9c.2 1 1.3 1.7 2.3 1.4l22.7-5.4c1-.2 1.7-1.3 1.4-2.3L32.7 5.9Z",fill:"#EF8022"}}),e("path",{attrs:{d:"M12.6 30.3c-.2.2-.5.3-.7.3l.8.5c.9.6 2.1.4 2.7-.5l3.1-4.4-5.9 4.1ZM2.3 19.5l-1 1.4c-.6.9-.4 2.1.5 2.7L8.1 28l-5.8-8.5ZM12.9 8.1l7.2-5-2.7-1.9c-.9-.6-2.1-.4-2.7.5l-5 7.2 3.2-.8Z",fill:"#F9F185"}}),e("path",{attrs:{d:"M9.7 29.4c.6.9 1.8 1.1 2.7.5l6.7-4.6-7.4 1.8c-1.3.3-2.6-.5-2.9-1.8L6 13.5l-3.3 2.3c-.9.6-1.1 1.8-.5 2.7l7.5 10.9Zm4.5-21.6L25.9 5l-1.3-2c-.6-.9-1.8-1.1-2.7-.5l-7.7 5.3Z",fill:"#FFC214"}}),e("path",{attrs:{d:"M11.9 24.8c-.7 0-1.4-.5-1.7-1.1l-1.5-3.2 1.1 4.6c.2.6.7 1.1 1.4 1.1h.3l17-4.1-16.2 2.7h-.4Z",fill:"#FFC214"}}),e("path",{attrs:{d:"M16 17.5s-1.1 1.2-2.5 1.2c-1.7 0-2.6-1.4-2.6-2.8 0-1.3.9-2.7 2.6-2.7 1.3 0 2.3 1 2.3 1l1.1-1.7s-.6-.7-1.9-1.1v-1.2h-1.1v1h-.6v-1h-1.1v1.1c-2.2.5-3.7 2.4-3.7 4.7 0 2.4 1.5 4.2 3.7 4.7v1.2h1.1v-1h.6V22H15v-1.3c1.4-.4 2.1-1.3 2.1-1.3L16 17.5ZM21 13.7c2.1 0 3.8 1.4 3.8 3.6 0 2.1-1.7 3.5-3.8 3.5-2.1 0-3.8-1.4-3.8-3.5s1.7-3.6 3.8-3.6Zm0 5.2c.8 0 1.5-.6 1.5-1.6s-.7-1.7-1.5-1.7-1.5.6-1.5 1.7c0 1 .7 1.6 1.5 1.6Zm4.3-5h2.3v6.7h-2.3v-6.7Zm0-2.6h2.2v1.8h-2.2v-1.8Zm3.2 2.6h2.2v1c.3-.5 1-1.2 2.1-1.2 1.4 0 2.4.6 2.4 2.5v4.4h-2.3v-4c0-.6-.2-.9-.7-.9-.7 0-1.1.4-1.3 1-.1.3-.1.6-.1.9v3h-2.3v-6.7Z",fill:"#FFF"}}),e("path",{attrs:{d:"M39.3 13.9c1.7 0 2.5 1 2.5 1l-.6.9s-.7-.8-1.8-.8c-1.3 0-2.3 1-2.3 2.4 0 1.3 1 2.4 2.3 2.4 1.2 0 2-.9 2-.9l.5.9s-.9 1.1-2.6 1.1c-2.1 0-3.5-1.5-3.5-3.5-.1-2 1.4-3.5 3.5-3.5Zm6.8 2.6h.3v-.1c0-1.1-.6-1.5-1.5-1.5-1 0-1.8.6-1.8.6l-.5-.9s1-.8 2.5-.8c1.7 0 2.6.9 2.6 2.6v4.2h-1.2v-1.1s-.5 1.3-2.1 1.3c-1.1 0-2.3-.7-2.3-2 0-2.2 2.9-2.3 4-2.3Zm-1.4 3.3c1.1 0 1.8-1.1 1.8-2.1v-.2h-.3c-1 0-2.7.1-2.7 1.3-.1.5.3 1 1.2 1Zm3.8-5.8h1.2v1.7c.3-1 1.1-1.7 2.1-1.7h.3v1.3h-.4c-.8 0-1.6.6-1.9 1.6-.1.4-.2.8-.2 1.2v2.7h-1.3V14h.2Zm6.8-.1c1.5 0 2 1 2 1v-3.5h1.3v9.2h-1.2v-1s-.5 1.2-2.2 1.2c-1.8 0-2.9-1.4-2.9-3.5s1.3-3.4 3-3.4Zm.2 5.8c1 0 1.9-.7 1.9-2.4 0-1.2-.6-2.4-1.9-2.4-1 0-1.9.9-1.9 2.4s.8 2.4 1.9 2.4Zm4.2-.8s.7.8 1.9.8c.5 0 1.1-.3 1.1-.8 0-1.2-3.4-1-3.4-3.1 0-1.2 1.1-1.9 2.4-1.9 1.5 0 2.1.7 2.1.7l-.5 1s-.6-.6-1.6-.6c-.5 0-1.1.2-1.1.8 0 1.2 3.4.9 3.4 3.1 0 1.1-.9 1.9-2.4 1.9-1.6 0-2.5-1-2.5-1l.6-.9Z",fill:"#EF8022"}})])]),t._v(" "),e("symbol",{attrs:{id:"supporter-lunanode",viewBox:"0 0 194.219 193.977"}},[e("path",{staticStyle:{fill:"#004581","fill-opacity":"1","fill-rule":"evenodd",stroke:"none"},attrs:{d:"M3185.89 2995.8c-1.77 21.49-2.76 43.2-2.76 65.16 0 411.03 319.09 747.36 723.13 774.95l-618.54-641.7c-54.62-56.68-88.55-126.08-101.83-198.41M3960 2284.09c-270.37 0-508.4 138.15-647.57 347.65l23.25-22.42c76.82-74.06 176.93-109.95 276.2-108.13 99 1.77 197.53 41.2 271.5 117.59l-177.95 171.52c-26.66-27.31-62.22-41.38-98.02-42.14-36.12-.65-72.43 12.41-100.16 39.15l-37.98 36.6c-27.69 26.66-42.04 62.45-42.7 98.57-.65 36.07 12.36 72.48 39.11 100.21l745.68 773.56c305.71-104.45 525.52-394.17 525.52-735.29 0-29.89-1.73-59.34-5.04-88.32-19.44 54.57-51.41 105.56-95.79 148.35l-37.93 36.58c-76.86 74.07-176.93 110.05-276.16 108.18-99.32-1.77-198.13-41.38-272.19-118.25l-290.74-301.59 177.95-171.53 290.74 301.61c26.71 27.73 62.64 42.04 98.72 42.74 36.12.69 72.38-12.35 100.16-39.1l37.89-36.59c27.69-26.66 42.09-62.45 42.74-98.58.61-36.03-12.4-72.48-39.1-100.21l-440.73-457.23c-22.23-1.9-44.69-2.93-67.4-2.93",transform:"matrix(.125 0 0 -.125 -397.891 479.489)"}}),e("path",{staticStyle:{fill:"#3384b9","fill-opacity":"1","fill-rule":"evenodd",stroke:"none"},attrs:{d:"M4376.22 2292.8h360.66v433.41c-17.35-55.88-47.59-108.64-90.81-153.48l-269.85-279.93",transform:"matrix(.125 0 0 -.125 -397.891 479.489)"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-walletofsatoshi",viewBox:"0 0 313.1 76.32"}},[e("path",{attrs:{d:"M110.47 44.8H121c.84 0 1.22-.64.9-1.48l-17.6-42A2 2 0 0 0 102.22 0H87.63a2 2 0 0 0-2 1.34L66 48.11c-.32.84.06 1.48.83 1.48h13.7a1.42 1.42 0 0 1 1.32 1.93l-9.7 24.8 30.55-32.63A1 1 0 0 0 102 42H84.73a1.42 1.42 0 0 1-1.32-2l5.06-12.91 6.86-17.47 6.78 17.51h-7.54a1.42 1.42 0 0 0-1.32.9l-2.83 7.22a1.42 1.42 0 0 0 1.32 1.93H105a1.42 1.42 0 0 1 1.33.91l2.08 5.36a1.92 1.92 0 0 0 2.06 1.35Zm62.65 0h37.42a1.3 1.3 0 0 0 1.46-1.41V35.9a1.3 1.3 0 0 0-1.47-1.41h-26V1.41A1.35 1.35 0 0 0 183 0h-9.92a1.3 1.3 0 0 0-1.47 1.41v42a1.3 1.3 0 0 0 1.51 1.39Zm45.36 0h42a1.3 1.3 0 0 0 1.52-1.41V35.9a1.31 1.31 0 0 0-1.47-1.41h-30.59v-7.36h25.59a1.33 1.33 0 0 0 1.48-1.4v-7a1.33 1.33 0 0 0-1.48-1.41h-25.59v-7h30.59A1.3 1.3 0 0 0 262 8.89V1.41A1.3 1.3 0 0 0 260.53 0h-42A1.3 1.3 0 0 0 217 1.41v42a1.3 1.3 0 0 0 1.48 1.39ZM71.79 0H61.61a1.71 1.71 0 0 0-1.85 1.41L52.08 34.3 44.91 1.41A1.65 1.65 0 0 0 43.12 0H30.38a1.71 1.71 0 0 0-1.85 1.41L21.36 34.3 13.68 1.41A1.65 1.65 0 0 0 11.89 0H1.14C.24 0-.14.51.05 1.41l10.88 42a1.68 1.68 0 0 0 1.79 1.41H28.4a1.65 1.65 0 0 0 1.79-1.41l6.27-28.31 6.34 28.29a1.65 1.65 0 0 0 1.79 1.41H60.2a1.66 1.66 0 0 0 1.8-1.41l10.87-42C73.07.51 72.68 0 71.79 0Zm239.84 0h-43.52a1.3 1.3 0 0 0-1.47 1.41v7.48a1.3 1.3 0 0 0 1.47 1.41h15.29v33.09a1.3 1.3 0 0 0 1.48 1.41h10a1.33 1.33 0 0 0 1.47-1.41V10.3h15.3a1.3 1.3 0 0 0 1.47-1.41V1.41A1.3 1.3 0 0 0 311.63 0ZM127.76 44.8h37.42a1.3 1.3 0 0 0 1.47-1.41V35.9a1.3 1.3 0 0 0-1.47-1.41h-26V1.41a1.35 1.35 0 0 0-1.5-1.41h-9.92a1.3 1.3 0 0 0-1.47 1.41v42a1.3 1.3 0 0 0 1.47 1.39Zm-3.84 9.6h-11.53c-3.13 0-4.53 1.31-4.53 4.36v10.37c0 3.05 1.4 4.36 4.53 4.36h11.53c3.16 0 4.51-1.31 4.51-4.36V58.76c0-3.05-1.35-4.36-4.51-4.36Zm-1 12.95c0 1.48-.29 1.75-2.07 1.75h-5.51c-1.76 0-2.08-.27-2.08-1.75v-6.81c0-1.47.32-1.75 2.08-1.75h5.51c1.78 0 2.07.28 2.07 1.75Zm51.87-5.59h-8.75c-.89 0-1.16-.27-1.16-.95v-1.06c0-.68.27-1 1.16-1h6.7c.65 0 .89.28.89.85v.16a.55.55 0 0 0 .62.6h4a.55.55 0 0 0 .62-.6v-1.08c0-3.21-1.11-4.28-4.4-4.28H164c-3.19 0-4.51 1.31-4.51 4.36v2.84c0 3.06 1.32 4.36 4.51 4.36h8.74c.9 0 1.17.28 1.17 1v1.23c0 .68-.27.95-1.17.95h-7.34c-.62 0-.86-.27-.86-.85v-.16a.56.56 0 0 0-.62-.6h-4a.55.55 0 0 0-.62.6v1.12c0 3.22 1.08 4.28 4.4 4.28h11.2c3.19 0 4.51-1.31 4.51-4.36v-3c-.06-3.1-1.41-4.41-4.57-4.41Zm85.43 0h-8.75c-.89 0-1.16-.27-1.16-.95v-1.06c0-.68.27-1 1.16-1h6.7c.64 0 .89.28.89.85v.16a.55.55 0 0 0 .62.6h4a.55.55 0 0 0 .62-.6v-1.08c0-3.21-1.11-4.28-4.4-4.28h-10.48c-3.19 0-4.51 1.31-4.51 4.36v2.84c0 3.06 1.32 4.36 4.51 4.36h8.74c.89 0 1.16.28 1.16 1v1.23c0 .68-.27.95-1.16.95h-7.34c-.62 0-.86-.27-.86-.85v-.16a.57.57 0 0 0-.62-.6h-4.05a.55.55 0 0 0-.62.6v1.12c0 3.22 1.08 4.28 4.4 4.28h11.2c3.18 0 4.51-1.31 4.51-4.36v-3c0-3.1-1.33-4.41-4.51-4.41Zm26.65-7.36h-4.21a.56.56 0 0 0-.63.6v6.66h-9.2V55a.57.57 0 0 0-.65-.6H268a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.18a.57.57 0 0 0 .65-.6v-6.84h9.2v6.84a.56.56 0 0 0 .63.6h4.21a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.57-.6Zm-137.62 0h-17.07a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.19a.58.58 0 0 0 .65-.6v-6.52h10.15a.57.57 0 0 0 .64-.6v-3.19a.57.57 0 0 0-.64-.6H137v-3.19h12.3a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.62-.6Zm146.47 0h-4.18a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.18a.57.57 0 0 0 .65-.6V55a.57.57 0 0 0-.6-.6Zm-100.28.6a.83.83 0 0 0-.86-.57h-6.16a.83.83 0 0 0-.89.57l-7.42 17.89c-.14.36 0 .63.38.63h4.45a.8.8 0 0 0 .86-.57l1-2.68h9.1l1 2.68a.8.8 0 0 0 .87.57h4.69c.33 0 .49-.27.35-.63Zm-7 11 2.89-7.52 2.92 7.52Zm30.9-11.6H201a.55.55 0 0 0-.62.6v3.19a.55.55 0 0 0 .62.6h6.45v14.1a.55.55 0 0 0 .62.6h4.21a.56.56 0 0 0 .62-.6v-14.1h6.46a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.64-.6Zm18.46 0h-11.52c-3.13 0-4.54 1.31-4.54 4.36v10.37c0 3.05 1.41 4.36 4.54 4.36h11.52c3.16 0 4.51-1.31 4.51-4.36V58.76c0-3.05-1.31-4.36-4.51-4.36Zm-.94 12.95c0 1.48-.3 1.75-2.08 1.75h-5.51c-1.75 0-2.07-.27-2.07-1.75v-6.81c0-1.47.32-1.75 2.07-1.75h5.51c1.78 0 2.08.28 2.08 1.75Z",fill:"#fad228",stroke:"#1e2127","stroke-width":"2"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-ivpn",viewBox:"0 0 84 29"}},[e("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M6.75 0h6.03c.07 0 .15.03.2.1.04.05.06.13.05.2L8.6 27.43a.26.26 0 0 1-.24.22l-6.63.38H1.7a.25.25 0 0 1-.19-.08.26.26 0 0 1-.06-.22L5.2 5.05C5.12 1.67 1 .85.49.73-.06.59 0 0 0 0h6.75Zm32.32.12a.25.25 0 0 0-.22-.12h-6.5c-.1 0-.18.05-.23.14l-8.98 17.4L20.08.2a.25.25 0 0 0-.24-.21h-6.55a.25.25 0 0 0-.2.1.26.26 0 0 0-.05.2l4.85 26.05a.25.25 0 0 0 .26.2l7.57-.43c.08 0 .16-.06.2-.14L39.08.38a.26.26 0 0 0-.01-.26Zm20.27 5.5a6.8 6.8 0 0 0-.53-2.08c-.27-.6-.61-1.1-1.01-1.5-.4-.41-.8-.75-1.23-1A8.23 8.23 0 0 0 52.9 0H40.47a.25.25 0 0 0-.25.2l-4.01 24.6c-.01.07.01.14.06.2.05.05.11.08.18.08h.02l6.25-.36c.11 0 .2-.1.22-.21l.75-4.63h6.08c1.39-.09 2.7-.43 3.89-1.03a9.75 9.75 0 0 0 2.99-2.46 9.9 9.9 0 0 0 2-4.76l.56-3.3c.17-1.02.21-1.93.13-2.71Zm-7.21 5.87a2.53 2.53 0 0 1-1.1 1.66c-.27.18-.64.27-1.1.27H44.7l1.1-7h5.3c.45 0 .78.09.97.27.22.2.38.41.47.65.1.27.13.6.1.95l-.52 3.2ZM83.75 0h-6.32c-.12 0-.23.1-.25.22l-2.25 14.34L70.04.17a.25.25 0 0 0-.23-.17H63.5c-.12 0-.23.1-.25.22l-3.86 24.56c-.01.07.01.16.06.22.05.05.12.08.19.08l6.43-.39c.12 0 .21-.1.23-.22l1.62-10.36 3.4 10.08c.04.1.14.17.25.17l8.58-.52c.11 0 .2-.1.23-.22L84 .3a.27.27 0 0 0-.06-.22.24.24 0 0 0-.19-.09Z",fill:"#F34"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-hrf",viewBox:"0 0 3000 987.6"}},[e("path",{attrs:{d:"M1137.09 103.9v773.45h-51.44V515.96h-953.6v361.38H80.62V103.9h51.44v361.2h953.6V103.9h51.43zm-102.77 0h-51.44v258.19H234.94V103.9H183.5v309.05h850.82V103.9zm-696.29 0h-50.87v205.84h50.87V103.9zm593.05 0h-51.44v205.84h51.44V103.9zM183.5 877.34h51.44V619.16h747.94v258.19h51.44V567.72H183.5v309.62zm695.72 0h51.44V670.93h-51.44v206.41zm-592.47 0h51.44V670.93h-51.44v206.41z",fill:"#e12991"}}),e("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M1422.94 103.88V331.3h-44.51v-94.22h-92.2v94.22h-44.83V103.88h44.83v90.32h92.2v-90.32h44.51zM1605.81 168.85V331.3h-41.91v-18.19c-9.75 14.62-26.64 22.74-48.41 22.74-34.44 0-61.4-24.04-61.4-67.25v-99.74H1496v94.54c0 22.1 13.32 33.47 32.16 33.47 20.47 0 35.74-12.02 35.74-40.29v-87.72h41.91zM1885.19 231.23V331.3h-41.91v-97.14c0-19.17-9.75-30.86-27.29-30.86-18.52 0-30.22 12.35-30.22 36.71v91.29h-41.91v-97.14c0-19.17-9.75-30.86-27.29-30.86-17.87 0-30.54 12.35-30.54 36.71v91.29h-41.91V168.85h41.91v17.22c9.1-13.64 24.37-21.77 45.16-21.77 20.14 0 35.09 8.45 44.18 23.39 10.07-14.62 26.32-23.39 48.41-23.39 37.04.01 61.41 26.32 61.41 66.93zM2086.24 168.85V331.3h-41.91v-19.17c-11.7 14.62-29.24 23.72-52.96 23.72-43.21 0-78.95-37.36-78.95-85.77s35.74-85.77 78.95-85.77c23.72 0 41.26 9.1 52.96 23.72v-19.17h41.91zm-41.91 81.23c0-27.29-19.17-45.81-45.16-45.81-25.66 0-44.83 18.52-44.83 45.81 0 27.29 19.17 45.81 44.83 45.81 25.99 0 45.16-18.52 45.16-45.81zM2275.93 231.56v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V168.85h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44.01 61.4 24.05 61.4 67.26zM1316.47 525.36h-30.25v78.95h-44.83V376.89h94.84c41.91 0 75.7 33.79 75.7 75.37 0 28.59-17.87 54.26-43.86 66.28l50.36 85.77h-48.41l-53.55-78.95zm-30.25-39.31h50c16.89 0 30.86-14.95 30.86-33.79s-13.97-33.46-30.86-33.46h-50v67.25zM1437.88 396.71c0-13.97 15.57-25.99 29.54-25.99 14.29 0 22.12 12.02 22.12 25.99s-11.7 25.67-25.99 25.67c-13.97 0-25.67-11.7-25.67-25.67zm4.88 45.16h41.91v162.45h-41.91V441.87zM1681.86 441.87v154.65c0 53.28-41.91 77.33-84.8 77.33-34.77 0-62.7-13.32-77-39.64l35.74-20.47c6.82 12.67 17.54 22.74 42.56 22.74 26.31 0 42.56-14.29 42.56-39.96v-17.54c-11.37 15.27-28.92 24.69-51.98 24.69-46.14 0-80.9-37.36-80.9-83.17 0-45.48 34.76-83.17 80.9-83.17 23.07 0 40.61 9.42 51.98 24.69v-20.14h40.94zm-40.94 78.62c0-25.67-19.17-44.18-45.49-44.18-26.31 0-45.48 18.52-45.48 44.18 0 25.99 19.17 44.51 45.48 44.51 26.32 0 45.49-18.52 45.49-44.51zM1871.55 504.57v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V376.89h41.91v83.17c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25zM1963.46 482.15v67.58c0 17.54 12.67 17.87 36.71 16.57v38.01c-58.81 6.5-78.62-10.72-78.62-54.58v-67.58h-28.27v-40.29h28.27v-32.81l41.91-12.67v45.48h36.71v40.29h-36.71zM2148.63 556.88c0 35.09-30.54 51.98-65.31 51.98-32.49 0-56.53-13.64-68.22-38.66l36.39-20.47c4.55 13.32 15.6 21.12 31.84 21.12 13.32 0 22.42-4.55 22.42-13.97 0-23.72-83.82-10.72-83.82-67.9 0-33.14 28.27-51.66 61.73-51.66 26.32 0 49.06 12.02 61.73 34.44l-35.74 19.49c-4.88-10.4-13.97-16.57-25.99-16.57-10.4 0-18.84 4.55-18.84 13.32-.01 24.04 83.81 9.1 83.81 68.88zM1286.22 692.79v53.93h96.11v42.89h-96.11v87.72h-44.83V649.9h143.54v42.88h-98.71zM1400.82 796.1c0-48.41 38.01-85.77 85.77-85.77s86.1 37.36 86.1 85.77-38.34 85.77-86.1 85.77c-47.76 0-85.77-37.36-85.77-85.77zm129.96 0c0-26.31-19.17-44.83-44.19-44.83-24.69 0-43.86 18.52-43.86 44.83 0 26.32 19.17 44.83 43.86 44.83 25.02.01 44.19-18.51 44.19-44.83zM1744.84 714.88v162.45h-41.91v-18.19c-9.75 14.62-26.64 22.74-48.41 22.74-34.44 0-61.4-24.04-61.4-67.25v-99.74h41.91v94.54c0 22.1 13.32 33.47 32.16 33.47 20.47 0 35.74-12.02 35.74-40.29v-87.72h41.91zM1934.86 777.58v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V714.88h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25zM2135.61 649.9v227.42h-41.91v-19.17c-11.7 14.95-28.92 23.72-52.63 23.72-43.54 0-79.27-37.36-79.27-85.77s35.74-85.77 79.27-85.77c23.72 0 40.94 8.77 52.63 23.72V649.9h41.91zm-41.91 146.2c0-27.29-19.17-45.81-44.84-45.81-25.99 0-45.16 18.52-45.16 45.81 0 27.29 19.17 45.81 45.16 45.81 25.67.01 44.84-18.51 44.84-45.81zM2337.35 714.88v162.45h-41.91v-19.17c-11.7 14.62-29.24 23.72-52.96 23.72-43.21 0-78.95-37.36-78.95-85.77s35.74-85.77 78.95-85.77c23.72 0 41.26 9.1 52.96 23.72v-19.17h41.91zm-41.91 81.22c0-27.29-19.17-45.81-45.16-45.81-25.66 0-44.83 18.52-44.83 45.81 0 27.29 19.17 45.81 44.83 45.81 25.99.01 45.16-18.51 45.16-45.81zM2433.46 755.17v67.58c0 17.54 12.67 17.87 36.71 16.57v38.01c-58.81 6.5-78.62-10.72-78.62-54.58v-67.58h-28.26v-40.29h28.26v-32.81l41.91-12.67v45.48h36.71v40.29h-36.71zM2494.84 669.72c0-13.97 11.7-25.99 25.67-25.99 14.29 0 25.99 12.02 25.99 25.99s-11.7 25.66-25.99 25.66c-13.97.01-25.67-11.69-25.67-25.66zm4.87 45.16h41.91v162.45h-41.91V714.88zM2565 796.1c0-48.41 38.01-85.77 85.77-85.77s86.1 37.36 86.1 85.77-38.34 85.77-86.1 85.77c-47.76 0-85.77-37.36-85.77-85.77zm129.96 0c0-26.31-19.17-44.83-44.19-44.83-24.69 0-43.86 18.52-43.86 44.83 0 26.32 19.17 44.83 43.86 44.83 25.02.01 44.19-18.51 44.19-44.83zM2911.62 777.58v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V714.88h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25z"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-opensats",viewBox:"0 0 5220 720"}},[e("path",{attrs:{d:"M0 435.197L229.609 291.597V288.121L0 144.259V29.0508L334.901 245.894V333.824L0 550.798V435.197Z",fill:"#FF3300"}}),e("path",{attrs:{d:"M486.969 623.844H902.627V719.643H486.969V623.844Z",fill:"#FF3300"}}),e("path",{attrs:{d:"M993.879 291.2C993.879 106.422 1084.61 0 1214.37 0C1344.13 0 1434.86 106.422 1434.86 291.2C1434.86 479.061 1344.13 587.581 1214.37 587.581C1084.61 587.581 993.879 479.061 993.879 291.2ZM1345.12 291.2C1345.12 155.01 1293.16 75.9967 1214.37 75.9967C1135.58 75.9967 1083.62 155.01 1083.62 291.2C1083.62 430.473 1135.58 511.584 1214.37 511.584C1293.16 511.584 1344.85 430.473 1344.85 291.2H1345.12Z",fill:"#FF3300"}}),e("path",{attrs:{d:"M1593.29 154.29H1663.81L1670.37 205.37H1673.13C1711.31 169.634 1764.71 144.258 1814.44 144.258C1925.96 144.258 1988.02 228.713 1988.02 359.855C1988.02 504.111 1897.95 587.911 1797.77 587.911C1759.13 587.911 1713.54 568.829 1677.39 535.454H1675.29L1679.43 612.237V749.936H1593.29V154.29ZM1899.65 359.855C1899.65 271.269 1867.44 215.599 1791.21 215.599C1756.57 215.599 1717.93 232.713 1679.69 272.121V472.112C1714.79 503.914 1754.61 515.455 1781.57 515.455C1848.75 515.717 1899.65 459.851 1899.65 359.855Z",fill:"#FF3300"}}),e("path",{attrs:{d:"M2118.96 365.035C2118.96 227.336 2222.75 143.93 2335.98 143.93C2460.16 143.93 2530.82 225.434 2530.82 343.527C2530.67 359.209 2529.35 374.858 2526.88 390.345H2178.73V327.2H2473.22L2454.52 348.249C2454.52 256.449 2410.17 210.55 2338.47 210.55C2264.41 210.55 2203.66 265.17 2203.66 364.904C2203.66 468.833 2268.8 520.044 2359.79 520.044C2407.09 520.044 2445.08 505.75 2483.39 482.8L2513.56 537.29C2464.7 569.886 2407.32 587.378 2348.57 587.582C2220.39 587.582 2118.96 505.947 2118.96 365.035Z",fill:"#FF3300"}}),e("path",{attrs:{d:"M2658.41 154.29H2729.07L2735.63 221.697H2739.04C2781.55 178.289 2829.83 144.258 2895.17 144.258C2994.1 144.258 3039.17 205.042 3039.17 315.201V577.026H2952.9V326.152C2952.9 252.319 2928.11 218.222 2865.39 218.222C2819.47 218.222 2788.31 240.844 2744.68 285.563V577.026H2658.41V154.29Z",fill:"#FF3300"}}),e("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M3208.36 504.308L3259.46 444.376C3303 486.486 3360.93 510.468 3421.5 511.455C3493.27 511.455 3533.03 478.669 3533.03 432.77C3533.03 377.362 3491.63 361.953 3435.41 338.217L3355.57 303.333C3297.64 280.514 3234.21 238.614 3234.21 155.143C3234.21 66.8186 3313.65 0.001814 3425.64 0.001814C3492.01 -0.442962 3555.93 25.0654 3603.75 71.0807L3558.87 126.554C3521.22 93.051 3472.3 74.9951 3421.9 75.9985C3362.2 75.9985 3322.11 103.604 3322.11 150.028C3322.11 199.206 3371.05 217.173 3420.98 236.516L3497.93 270.416C3569.04 298.087 3622.18 339.528 3622.18 422.344C3622.18 513.356 3545.36 587.583 3416.78 587.583C3339.11 587.998 3264.34 558.123 3208.36 504.308V504.308Z"}}),e("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M3762.96 465.557C3762.96 370.741 3849.04 324.055 4062.7 308.186C4059.62 255.73 4031.54 213.896 3956.3 213.896C3905.13 213.896 3854.68 237.304 3813.28 261.5L3780.48 203.994C3827.98 174.684 3898.57 144.062 3971.78 144.062C4088.42 144.062 4148.91 210.945 4148.91 322.678V577.027H4077.73L4070.84 522.144H4068.08C4022.82 557.553 3963.97 587.715 3906.04 587.715C3825.16 587.584 3762.96 540.045 3762.96 465.557ZM4062.7 462.278V363.266C3896.79 375.134 3847.26 408.576 3847.26 459C3847.26 501.489 3885.38 519.063 3930.65 519.063C3975.91 519.063 4018.88 497.883 4062.7 462.278Z"}}),e("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M4388.81 409.884V222.941H4272.17V158.813L4392.16 154.289L4403.44 20.2617H4475.02V154.289H4674.64V222.941H4475.02V410.146C4475.02 482.864 4500.73 518.076 4577.29 518.076C4610.27 517.981 4642.96 511.847 4673.73 499.979L4691.24 562.992C4648.39 578.951 4603.07 587.274 4557.35 587.581C4430.86 587.581 4388.81 516.043 4388.81 409.884Z"}}),e("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M4818.71 521.815L4857.09 466.014C4909.9 502.948 4972.98 522.353 5037.43 521.487C5102.31 521.487 5133.34 495.259 5133.34 463.85C5133.34 433.95 5115.76 415 5009.22 393.034C4897.7 369.887 4845.21 331.2 4845.21 267.203C4845.21 196.518 4908.85 143.93 5025.95 143.93C5093.26 143.93 5157.55 170.158 5199.93 198.878L5159.45 252.646C5117.79 224.668 5068.79 209.592 5018.6 209.304C4955.62 209.304 4931.28 234.155 4931.28 263.138C4931.28 295.923 4965.07 309.037 5048.12 326.938C5185.89 357.101 5220.33 392.509 5220.33 458.736C5220.33 529.487 5151.71 587.582 5026.8 587.582C4952.47 586.641 4880.07 563.76 4818.71 521.815V521.815Z"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-tether",viewBox:"0 0 111 90"}},[e("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M24.4825 0.862305H88.0496C89.5663 0.862305 90.9675 1.64827 91.7239 2.92338L110.244 34.1419C111.204 35.7609 110.919 37.8043 109.549 39.1171L58.5729 87.9703C56.9216 89.5528 54.2652 89.5528 52.6139 87.9703L1.70699 39.1831C0.305262 37.8398 0.0427812 35.7367 1.07354 34.1077L20.8696 2.82322C21.6406 1.60483 23.0087 0.862305 24.4825 0.862305ZM79.8419 14.8003V23.5597H61.7343V29.6329C74.4518 30.2819 83.9934 32.9475 84.0642 36.1425L84.0638 42.803C83.993 45.998 74.4518 48.6635 61.7343 49.3125V64.2168H49.7105V49.3125C36.9929 48.6635 27.4513 45.998 27.3805 42.803L27.381 36.1425C27.4517 32.9475 36.9929 30.2819 49.7105 29.6329V23.5597H31.6028V14.8003H79.8419ZM55.7224 44.7367C69.2943 44.7367 80.6382 42.4827 83.4143 39.4727C81.0601 36.9202 72.5448 34.9114 61.7343 34.3597V40.7183C59.7966 40.8172 57.7852 40.8693 55.7224 40.8693C53.6595 40.8693 51.6481 40.8172 49.7105 40.7183V34.3597C38.8999 34.9114 30.3846 36.9202 28.0304 39.4727C30.8066 42.4827 42.1504 44.7367 55.7224 44.7367Z",fill:"#009393"}}),t._v(" "),e("symbol",{attrs:{id:"supporter-unbank",viewBox:"0 0 766 132",fill:"none"}},[e("path",{attrs:{d:"M133.125 66.24v41.145c-.03 10.77-7.051 19.926-17.376 22.792-2.053.571-4.156.831-6.279.831-27.55 0-55.09.03-82.641-.01-13.209-.02-23.625-10.429-23.645-23.623v-82.52c0-13.194 10.425-23.593 23.635-23.613h82.641c13.209.02 23.605 10.429 23.645 23.623l.01 41.385.01-.01zM68.38 33.16H31.987c-.361 0-.721-.02-1.082 0-2.694.17-4.657 2.044-4.717 4.508-.07 2.805 1.662 4.779 4.517 5.019.711.06.851.321.851.952v34.904c0 .661-.19.952-.871 1.162-2.183.661-2.694 3.206-1.042 4.769.751.711 1.632.731 2.574.731h72.316.721c1.472-.05 2.594-1.012 2.844-2.434a2.77 2.77 0 0 0-1.853-3.016c-.641-.21-.771-.501-.771-1.092V43.76c0-.741.19-.972.982-1.082 3.595-.491 5.347-4.348 3.385-7.363-1.062-1.633-2.704-2.154-4.557-2.154H68.41h-.03zm-.12 53.026H28.261c-.881 0-1.763-.04-2.644.01-3.245.19-5.208 3.446-3.715 6.171.701 1.272 1.933 1.853 3.175 2.435l27.37 12.824 12.478 5.88c1.703.822 3.325.972 5.037.081 1.352-.692 2.754-1.293 4.136-1.914l23.144-10.519 14.952-6.822c1.542-.701 2.564-1.783 2.684-3.516.2-2.755-1.672-4.638-4.577-4.638H68.26v.01zm-.13-65.329H26.218c-1.933 0-2.574.631-2.604 2.585-.02 1.122 0 2.234 0 3.356 0 2.615.561 3.176 3.155 3.176h82.741c.281 0 .561.01.841 0 1.432-.08 2.133-.761 2.153-2.174v-4.198c0-2.294-.45-2.755-2.713-2.755H68.12l.01.01zM593.247 49.67c-.27 1.703-.11 3.426-.1 5.129l.13 13.665.241 25.777.23 16.18c.18 5.169-4.006 8.155-7.321 8.145-4.696 0-7.911-3.156-7.971-7.995l-.15-17.261-.261-25.777-.22-22.18-.231-19.415c-.03-3.827 1.903-6.622 5.248-7.714s6.58.05 8.813 3.136l46.859 64.517c.29.401.5.892 1.131 1.262v-1.473-59.849c0-4.378 2.524-7.463 6.61-8.125 4.356-.711 8.542 2.755 8.693 7.183.01.321 0 .641 0 .962v84.554c0 3.897-1.933 6.792-5.248 7.864-3.355 1.082-6.64-.11-8.913-3.246l-46.708-64.327c-.251-.351-.421-.782-.832-.992-.04-.05-.08-.09-.12-.14 0 .03-.01.06-.02.1.05 0 .11.01.16.02h-.02zm-288.231-.21v12.383l.17 12.823.321 31.768c.02 1.753.22 3.526.03 5.269-.481 4.368-3.936 7.113-8.453 6.833-3.715-.231-6.739-3.637-6.79-7.704l-.14-15.589-.24-26.017-.24-22.18-.231-21.218c-.03-3.737 1.933-6.562 5.218-7.624 3.325-1.082 6.61.07 8.833 3.126l47.069 64.808c.25.351.51.691.971 1.292v-1.523-60.45c0-4.087 2.584-7.123 6.56-7.774 4.156-.671 8.182 2.394 8.622 6.572a12.05 12.05 0 0 1 .06 1.192v85.396c0 6.071-6.239 9.697-11.476 6.702-1.062-.611-1.863-1.483-2.574-2.465l-47.009-64.707-.681-.912h-.02zm97.402 22.421l-.02-37.178.02-8.626c.141-2.585.641-5.019 2.855-6.702 1.522-1.162 3.334-1.573 5.197-1.583l20.66.01c11.617.26 21.502 7.153 25.257 17.602 2.955 8.225 1.703 16.109-2.413 23.653-1.102 2.004-1.122 2.004.591 3.436 5.287 4.428 9.504 9.608 11.376 16.37 4.317 15.628-4.026 35.375-24.355 38.861-3.636.621-7.341.471-11.016.511-5.759.06-11.527 0-17.296-.05-1.442-.01-2.894 0-4.306-.21-3.946-.592-6.129-3.246-6.469-7.725a27.22 27.22 0 0 1-.061-2.033V71.871l-.02.01zm15.864 15.598v14.156c0 .491-.171 1.062.701 1.052 6.119-.1 12.258.32 18.366-.171 10.806-.871 17.206-11.921 12.619-21.729-2.163-4.628-5.718-7.634-11.026-8.135a86.36 86.36 0 0 0-9.104-.361l-10.675.17c-.801 0-.891.321-.891.982l.01 14.035zm0-42.537l-.02 10.78c0 .731.19.942.941.942l11.156-.03c7.461-.15 12.619-5.891 11.988-13.274-.431-5.009-4.006-8.796-8.903-9.537-4.767-.721-9.564-.571-14.351-.701-.751-.02-.831.311-.831.922v10.9h.02zM704.27 68.014c.581-.17.811-.571 1.111-.872l21.692-21.76 24.676-24.875c3.165-3.196 7.992-3.286 11.076-.21 3.015 3.005 2.915 7.814-.22 10.97l-24.886 25.016-6.259 6.301c-.601.581-.551.942-.071 1.563l31.026 40.153 1.462 1.903c2.604 3.456 2.073 8.095-1.212 10.72-3.315 2.644-8.072 2.123-10.796-1.323l-11.016-14.226-20.299-26.307c-.431-.561-.691-.822-1.332-.16l-14.281 14.406c-.541.541-.681 1.092-.681 1.813v18.954c-.02 3.166-1.492 5.53-4.347 6.893-2.764 1.312-5.468 1.002-7.921-.832-1.893-1.412-2.935-3.366-2.935-5.77V25.446c0-3.997 3.305-7.273 7.341-7.384 4.086-.12 7.631 3.026 7.812 7.033.1 2.194.05 4.398.05 6.592v36.336l.01-.01zM258.548 50.873l-.03 24.955c-.361 19.586-13.54 37.278-32.838 41.355-16.464 3.486-30.154-1.823-40.83-14.687-5.688-6.852-8.642-14.927-9.484-23.793-.17-1.803-.13-3.587-.13-5.38V24.745c0-3.807 2.063-6.682 5.488-7.674 4.978-1.443 9.765 2.254 9.765 7.584v33.591l.06 17.872c.33 12.232 8.843 23.423 20.66 26.228 10.045 2.374 20.64-1.803 26.879-10.86 3.275-4.749 5.068-10.028 5.078-15.839l.07-50.852c0-3.787 2.083-6.702 5.478-7.704 4.937-1.463 9.784 2.184 9.794 7.413v26.388l.04-.02zm292.788 67.683c-3.295 0-5.898-1.824-7.15-5.04l-7.131-18.413c-.35-.922-.811-1.152-1.742-1.152h-33.75c-.871 0-1.312.19-1.642 1.092l-7.01 18.584c-1.322 3.436-4.297 5.199-8.072 4.909-3.105-.241-5.859-2.786-6.56-6.102-.33-1.572-.07-3.075.501-4.568l11.657-30.906 20.37-53.968c1.272-3.386 3.996-5.4 7.301-5.41 3.254-.01 5.998 1.963 7.28 5.28l32.948 84.904c1.853 4.789-.45 9.447-5.207 10.639-.591.151-1.192.131-1.783.151h-.01zm-20.66-39.843l-12.438-32.068-.271.611-11.547 30.546c-.39 1.032.151.912.802.912h21.842 1.612z",fill:"#3cce49"}}),e("path",{attrs:{d:"M68.38 33.16h36.874c1.863 0 3.495.511 4.557 2.154 1.962 3.005.21 6.873-3.385 7.363-.792.11-.982.341-.982 1.082v34.903c0 .591.13.892.771 1.092a2.76 2.76 0 0 1 1.853 3.016c-.24 1.423-1.372 2.384-2.844 2.434h-.721-72.316c-.931 0-1.823-.02-2.574-.731-1.652-1.563-1.142-4.118 1.042-4.769.681-.21.881-.501.871-1.162V43.639c0-.631-.14-.892-.851-.952-2.854-.24-4.587-2.214-4.517-5.019.06-2.455 2.023-4.338 4.717-4.508.361-.02.721 0 1.082 0H68.35h.03zM52.647 61.201l.02-17.271c0-.892-.16-1.252-1.172-1.232h-9.724c-.891-.01-1.152.23-1.152 1.132v34.543c0 .932.31 1.132 1.172 1.122h9.604c1.002.02 1.282-.27 1.272-1.272l-.02-17.031v.01zm42.973-.19l.02-17.141c0-.862-.18-1.192-1.122-1.172a249.45 249.45 0 0 1-9.484 0c-.921-.02-1.132.291-1.132 1.162v34.403c0 .902.18 1.262 1.182 1.242h9.364c.991.02 1.192-.321 1.192-1.232l-.02-17.261zm-21.561.08l.02-17.131c0-1.012-.29-1.282-1.282-1.262h-9.244c-.841-.01-1.082.24-1.082 1.082v34.633c0 .832.24 1.092 1.082 1.082h9.244c1.001.02 1.282-.281 1.272-1.272l-.02-17.131h.01zM68.26 86.187h42.041c2.905 0 4.777 1.883 4.577 4.638-.12 1.733-1.152 2.815-2.684 3.516l-14.952 6.823-23.144 10.519-4.136 1.914c-1.722.881-3.335.741-5.037-.081l-12.478-5.88-27.37-12.824c-1.242-.581-2.474-1.162-3.175-2.434-1.482-2.725.471-5.981 3.715-6.171.881-.05 1.762-.01 2.644-.01H68.26v-.01zm-.13-65.329h41.671c2.263 0 2.714.461 2.714 2.755v4.198c-.021 1.412-.722 2.094-2.154 2.174h-.841-82.741c-2.594 0-3.155-.561-3.155-3.176v-3.356c.03-1.954.661-2.585 2.604-2.585H68.14l-.01-.01z",fill:"#0e4160"}}),e("path",{attrs:{d:"M593.247 49.67c-.05 0-.11-.01-.16-.02 0-.03.01-.06.02-.1l.12.14.02-.02z",fill:"#fefefe"}}),e("path",{attrs:{d:"M52.647 61.201l.02 17.031c0 1.002-.27 1.292-1.272 1.272-3.205-.06-6.409-.05-9.604 0-.861.01-1.172-.18-1.172-1.122V43.84c0-.902.26-1.152 1.152-1.132h9.724c1.001-.02 1.172.341 1.172 1.232l-.02 17.271v-.01zm42.973-.19l.02 17.261c0 .912-.2 1.252-1.192 1.232a243.59 243.59 0 0 0-9.364 0c-1.002.02-1.182-.351-1.182-1.242V43.86c0-.871.21-1.182 1.132-1.162a249.45 249.45 0 0 0 9.484 0c.941-.02 1.122.311 1.122 1.172l-.02 17.141zm-21.562.08l.02 17.131c0 .992-.27 1.292-1.272 1.272-3.074-.06-6.159-.05-9.243 0-.841.01-1.081-.25-1.081-1.082V43.78c0-.842.24-1.092 1.081-1.082h9.243c.992-.02 1.292.25 1.282 1.262l-.02 17.131h-.01z",fill:"#3cce49"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-acinq",viewBox:"0 0 103 107"}},[e("circle",{attrs:{fill:"url(#acinq-a)",cx:"47.833",cy:"51.833",r:"56.832"}}),e("g",[e("g",{attrs:{fill:"none","stroke-width":"6","stroke-linejoin":"round"}},[e("path",{attrs:{stroke:"#47BF94",d:"M4.493 79.67c-6.778-11.574 21.882-35.135 41.646-39.636 16.598-3.78 55.176 4.066 53.752 17.433"}}),e("path",{attrs:{stroke:"#359F7E",d:"M10.125 18.133c8.624-9.988 41.797 13.701 51.001 30.018 9.723 17.237 12.87 55.271-1.103 55.351"}}),e("path",{attrs:{stroke:"#49DAAA",d:"M69.826 4.107c12.025 5.964 3.838 38.632-11.184 57.28C47.846 74.79 11.659 91.904 4.493 79.67"}}),e("path",{attrs:{stroke:"#49DAAA",d:"M99.891 57.467C98.471 70.799 62.529 72.9 43.83 64.781c-17.92-7.783-42.47-36.5-33.706-46.648"}}),e("path",{attrs:{stroke:"#AAF0D3",d:"M60.023 103.502c-14.291.08-24.609-29.721-23.918-51.916.758-24.377 20.678-53.948 33.721-47.479"}})])])]),t._v(" "),e("symbol",{attrs:{id:"supporter-nomics",viewBox:"0 0 600 600"}},[e("path",{attrs:{d:"M273.56 133A136.81 136.81 0 0 0 0 136.86v326.28a136.8 136.8 0 0 0 233.57 96.75L326.44 467A136.81 136.81 0 0 0 600 463.14V136.86a136.8 136.8 0 0 0-233.57-96.75L273.56 133",fill:"#a0f"}}),e("ellipse",{attrs:{cx:"302.18",cy:"300.04",rx:"136.81",ry:"136.86",fill:"#fff"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-strike",viewBox:"0 0 155 120"}},[e("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M7.06565 43.2477C1.90963 41.2685 -0.665684 35.4843 1.31353 30.3283C3.29274 25.1722 9.07699 22.5969 14.233 24.5761L51.4526 38.8634C51.4937 38.8798 51.535 38.896 51.5765 38.9119L70.2481 46.0792C75.4041 48.0584 81.1883 45.4831 83.1675 40.3271C85.1468 35.1711 82.5714 29.3868 77.4154 27.4076L77.4132 27.4068C77.4139 27.4064 77.4145 27.406 77.4151 27.4056L58.7436 20.2383C53.5876 18.2591 51.0123 12.4749 52.9915 7.31885C54.9707 2.16283 60.755 -0.412485 65.911 1.56673L120.828 22.6473C120.959 22.6977 121.089 22.7506 121.217 22.8059C121.453 22.8928 121.69 22.9815 121.926 23.0721C147.706 32.9681 160.583 61.8894 150.686 87.6695C140.79 113.45 111.869 126.326 86.089 116.43C85.5927 116.24 85.1011 116.042 84.6144 115.838C84.3783 115.766 84.1431 115.686 83.9091 115.596L30.0742 94.9308C24.9182 92.9516 22.3428 87.1673 24.3221 82.0113C26.3013 76.8553 32.0855 74.2799 37.2415 76.2592L55.9106 83.4256C55.9103 83.4242 55.9099 83.4229 55.9095 83.4215L55.9133 83.423C61.0694 85.4022 66.8536 82.8269 68.8328 77.6709C70.812 72.5148 68.2367 66.7306 63.0807 64.7514L54.6786 61.5261C54.6787 61.5257 54.6788 61.5252 54.6789 61.5247L7.06565 43.2477Z"}})])])]),t._v(" "),e("div",{staticClass:"supporters"},[e("h3",[t._v("Our Supporters")]),t._v(" "),e("p",[t._v("\n The BTCPay Server Project is proudly supported by these entities through the\n "),e("a",{attrs:{href:"https://foundation.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server Foundation")]),t._v(".\n ")]),t._v(" "),e("div",{staticClass:"logos"},[e("a",{attrs:{href:"https://spiral.xyz",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"100",height:"100"}},[e("use",{attrs:{href:"#supporter-spiral"}})]),t._v("\n Spiral\n ")]),t._v(" "),e("a",{attrs:{href:"https://opensats.org",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"120",height:"100"}},[e("use",{attrs:{href:"#supporter-opensats"}})]),t._v("\n OpenSats\n ")]),t._v(" "),e("a",{attrs:{href:"https://www.bailliegifford.com",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"110",height:"100"}},[e("use",{attrs:{href:"#supporter-bailliegifford"}})]),t._v("\n Baillie Gifford\n ")]),t._v(" "),e("a",{attrs:{href:"https://tether.to",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"100",height:"60"}},[e("use",{attrs:{href:"#supporter-tether"}})]),t._v("\n Tether\n ")]),t._v(" "),e("a",{attrs:{href:"https://hrf.org",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"110",height:"60"}},[e("use",{attrs:{href:"#supporter-hrf"}})]),t._v("\n HRF\n ")]),t._v(" "),e("a",{attrs:{href:"https://www.lunanode.com/",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"80",height:"60"}},[e("use",{attrs:{href:"#supporter-lunanode"}})]),t._v("\n LunaNode\n ")]),t._v(" "),e("a",{attrs:{href:"https://walletofsatoshi.com/",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"80",height:"80"}},[e("use",{attrs:{href:"#supporter-walletofsatoshi"}})]),t._v("\n Wallet of Satoshi\n ")]),t._v(" "),e("a",{attrs:{href:"https://coincards.com/",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"80",height:"80"}},[e("use",{attrs:{href:"#supporter-coincards"}})]),t._v("\n Coincards\n ")]),t._v(" "),e("a",{attrs:{href:"https://www.ivpn.net/",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"80",height:"80"}},[e("use",{attrs:{href:"#supporter-ivpn"}})]),t._v("\n IVPN\n ")]),t._v(" "),e("a",{attrs:{href:"https://www.unbank.com/",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"80",height:"80"}},[e("use",{attrs:{href:"#supporter-unbank"}})]),t._v("\n Unbank\n ")])]),t._v(" "),e("p",[t._v("If you'd like to support the project, please visit the "),e("a",{attrs:{href:"https://btcpayserver.org/donate/"}},[t._v("donation page")]),t._v(".")])])])}),[],!1,null,null,null);e.default=l.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[87],{501:function(t,e,a){t.exports=a.p+"assets/img/BTCPayServerScreenshot.276d0810.png"},851:function(t,e,a){"use strict";a.r(e);var r=a(17),o=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-server-documentation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-documentation"}},[t._v("#")]),t._v(" BTCPay Server Documentation")]),t._v(" "),e("h2",{attrs:{id:"what-is-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#what-is-btcpay-server"}},[t._v("#")]),t._v(" What is BTCPay Server?")]),t._v(" "),e("p",[t._v("BTCPay Server is a free, open-source & self-hosted bitcoin payment gateway that allows self-sovereign individuals and businesses to accept bitcoin payments online or in person without any fees.")]),t._v(" "),e("figure",[e("img",{attrs:{src:a(501),alt:"BTCPay Server",title:"BTCPay Server screenshot"}})]),t._v(" "),e("h2",{attrs:{id:"how-btcpay-server-works"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-btcpay-server-works"}},[t._v("#")]),t._v(" How BTCPay Server works?")]),t._v(" "),e("p",[t._v("BTCPay Server is a self-hosted and automated invoicing system. At checkout, a customer is presented with an invoice that they pay from their wallet. BTCPay Server follows the status of the invoice through the blockchain and informs you when the payment has been settled so that you can fulfill the order. It also takes care of payment refunding and bitcoin management alongside plenty of other features.")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/nr0UNbz3AoQ/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=nr0UNbz3AoQ",title:"How BTCPay Works","data-id":"nr0UNbz3AoQ"}},[e("iframe",{attrs:{title:"How BTCPay Works","data-src":"https://www.youtube-nocookie.com/embed/nr0UNbz3AoQ?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/dbX6qWZlxOw/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=dbX6qWZlxOw",title:"BTCPay Server Simply Explained","data-id":"dbX6qWZlxOw"}},[e("iframe",{attrs:{title:"BTCPay Server Simply Explained","data-src":"https://www.youtube-nocookie.com/embed/dbX6qWZlxOw?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("p",[t._v("BTCPay Server is free to use and completely open-source, so developers or security auditors can always inspect the quality of the code.")]),t._v(" "),e("h2",{attrs:{id:"features"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#features"}},[t._v("#")]),t._v(" Features")]),t._v(" "),e("ul",[e("li",[t._v("Direct, peer-to-peer Bitcoin payments")]),t._v(" "),e("li",[t._v("No transaction fees (other than the "),e("a",{attrs:{href:"https://en.bitcoin.it/wiki/Miner_fees",target:"_blank",rel:"noopener noreferrer"}},[t._v("network fee"),e("OutboundLink")],1),t._v(")")]),t._v(" "),e("li",[t._v("No processing fees")]),t._v(" "),e("li",[t._v("No middleman")]),t._v(" "),e("li",[t._v("No KYC")]),t._v(" "),e("li",[t._v("Non-custodial (complete control over the private key)")]),t._v(" "),e("li",[t._v("Enhanced privacy")]),t._v(" "),e("li",[t._v("Enhanced security")]),t._v(" "),e("li",[t._v("Self-hosted software")]),t._v(" "),e("li",[t._v("SegWit support")]),t._v(" "),e("li",[t._v("Lightning Network support (LND, Core Lightning (CLN) & Eclair implementations)")]),t._v(" "),e("li",[t._v("Tor support")]),t._v(" "),e("li",[t._v("Opt-in "),e("RouterLink",{attrs:{to:"/Development/Altcoins/"}},[t._v("altcoin")]),t._v(" integrations")],1),t._v(" "),e("li",[t._v("Full compatibility with legacy BitPay API (easy migration)")]),t._v(" "),e("li",[t._v("Process payments for others")]),t._v(" "),e("li",[t._v("Easy-embeddable payment buttons")]),t._v(" "),e("li",[t._v("Point of sale app")]),t._v(" "),e("li",[t._v("Crowdfunding app")]),t._v(" "),e("li",[t._v("Payment Requests")]),t._v(" "),e("li",[t._v("Internal, full-node reliant wallet with "),e("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[t._v("hardware wallet integration")])],1),t._v(" "),e("li",[e("RouterLink",{attrs:{to:"/Payjoin/"}},[t._v("Payjoin Support")])],1)]),t._v(" "),e("h2",{attrs:{id:"getting-started"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#getting-started"}},[t._v("#")]),t._v(" Getting started")]),t._v(" "),e("p",[t._v("To start using BTCPay Server, "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("decide how you would like to deploy it")]),t._v(". If you decide on a self-hosted option, start by reviewing our extensive deployment documentation. We recommend "),e("RouterLink",{attrs:{to:"/Docker/"}},[t._v("Docker deployment")]),t._v(". If your choice is a third-party hosting, read our "),e("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[t._v("third-party host docs")]),t._v(".")],1),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/R-yaXk4NvEs/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=R-yaXk4NvEs",title:"How BTCPay Server Features Overview","data-id":"R-yaXk4NvEs"}},[e("iframe",{attrs:{title:"How BTCPay Server Features Overview","data-src":"https://www.youtube-nocookie.com/embed/R-yaXk4NvEs?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("h2",{attrs:{id:"get-involved"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#get-involved"}},[t._v("#")]),t._v(" Get involved")]),t._v(" "),e("p",[t._v("Contributing to an open-source project is a great way to learn, network, and build your portfolio. Volunteers around the internet maintain BTCPay Server. If you would like to contribute to the project development, check our "),e("RouterLink",{attrs:{to:"/Contribute/"}},[t._v("contributing guidelines")])],1),t._v(" "),e("p",[t._v("If you're interested in helping out with documentation, look at the video below.")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/bSDROcdSSWw/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=bSDROcdSSWw",title:"Contributing to Documentation","data-id":"bSDROcdSSWw"}},[e("iframe",{attrs:{title:"Contributing to Documentation","data-src":"https://www.youtube-nocookie.com/embed/bSDROcdSSWw?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),t._v(" "),e("h2",{attrs:{id:"support"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#support"}},[t._v("#")]),t._v(" Support")]),t._v(" "),e("p",[t._v("If you have trouble using BTCPay Server, consider joining the "),e("a",{attrs:{href:"https://btcpayserver.org/#communityCTA",target:"_blank",rel:"noopener noreferrer"}},[t._v("communities listed on the official website"),e("OutboundLink")],1),t._v(" to get help from BTCPay community members.")]),t._v(" "),e("p",[t._v("Only file a "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues",target:"_blank",rel:"noopener noreferrer"}},[t._v("Github issue"),e("OutboundLink")],1),t._v(" for technical issues you can't resolve through other channels or feature requests you've validated with other members of the community.")]),t._v(" "),e("p",[t._v("Please check out our "),e("a",{attrs:{href:"https://btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("official website"),e("OutboundLink")],1),t._v(",and "),e("RouterLink",{attrs:{to:"/FAQ/#btcpay-frequently-asked-questions-and-common-issues"}},[t._v("FAQ")]),t._v(" for more details.")],1),t._v(" "),e("svg",{attrs:{width:"0",height:"0",xmlns:"http://www.w3.org/2000/svg"}},[e("defs",[e("linearGradient",{attrs:{id:"spiral-gradient",x1:"81.36",y1:"311.35",x2:"541.35",y2:"311.35",gradientUnits:"userSpaceOnUse"}},[e("stop",{attrs:{offset:".18","stop-color":"#00f"}}),e("stop",{attrs:{offset:"1","stop-color":"#f0f"}})],1),t._v(" "),e("radialGradient",{attrs:{id:"acinq-a",cx:"47.833",cy:"51.834",r:"56.832"}},[e("stop",{attrs:{offset:"0","stop-color":"#fff"}}),e("stop",{attrs:{offset:"1","stop-color":"#fff","stop-opacity":"0"}})],1)],1),t._v(" "),e("symbol",{attrs:{id:"supporter-spiral",viewBox:"0 0 629 629"}},[e("path",{attrs:{d:"M326.4 572.09C201.2 572.09 141 503 112.48 445c-28.22-57.53-30.59-114.56-30.79-122.69-4.85-77 41-231.78 249.58-271.2a28.05 28.05 0 0 1 10.41 55.13c-213.12 40.28-204.44 206-204 213 0 .53.06 1.06.07 1.6.15 7.9 5.1 195.16 188.65 195.16 68.34 0 116.6-29.4 143.6-87.37 24.48-52.74 19.29-112.45-13.52-155.83-22.89-30.27-52.46-45-90.38-45-34.46 0-63.47 9.88-86.21 29.37A91.5 91.5 0 0 0 248 322.3c-1.41 25.4 7.14 49.36 24.07 67.49C287.27 406 305 413.9 326.4 413.9c27.46 0 45.52-9 53.66-26.81 8.38-18.3 3.61-38.93-.19-43.33-9.11-10-18.69-13.68-22.48-13-2.53.43-5.78 4.61-8.48 10.92a28 28 0 0 1-51.58-22c14.28-33.44 37.94-42 50.76-44.2 24.78-4.18 52.17 7.3 73.34 30.65s25.51 68.55 10.15 103.22C421.54 432 394.52 470 326.4 470c-36.72 0-69.67-14.49-95.29-41.92-27.47-29.4-41.34-68.08-39.11-108.89a149.1 149.1 0 0 1 51.31-104.6c33.19-28.45 74.48-42.87 122.71-42.87 55.12 0 101.85 23.25 135.12 67.23 45.36 60 52.9 141.71 19.66 213.3-25.35 54.67-79.68 119.84-194.4 119.84Z",fill:"url(#spiral-gradient)"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-coincards",viewBox:"0 0 64 32"}},[e("g",{attrs:{fill:"none"}},[e("path",{attrs:{d:"M32.7 5.9c-.2-1-1.3-1.7-2.3-1.4L7.7 9.9c-1 .2-1.7 1.3-1.4 2.3l3.1 12.9c.2 1 1.3 1.7 2.3 1.4l22.7-5.4c1-.2 1.7-1.3 1.4-2.3L32.7 5.9Z",fill:"#EF8022"}}),e("path",{attrs:{d:"M12.6 30.3c-.2.2-.5.3-.7.3l.8.5c.9.6 2.1.4 2.7-.5l3.1-4.4-5.9 4.1ZM2.3 19.5l-1 1.4c-.6.9-.4 2.1.5 2.7L8.1 28l-5.8-8.5ZM12.9 8.1l7.2-5-2.7-1.9c-.9-.6-2.1-.4-2.7.5l-5 7.2 3.2-.8Z",fill:"#F9F185"}}),e("path",{attrs:{d:"M9.7 29.4c.6.9 1.8 1.1 2.7.5l6.7-4.6-7.4 1.8c-1.3.3-2.6-.5-2.9-1.8L6 13.5l-3.3 2.3c-.9.6-1.1 1.8-.5 2.7l7.5 10.9Zm4.5-21.6L25.9 5l-1.3-2c-.6-.9-1.8-1.1-2.7-.5l-7.7 5.3Z",fill:"#FFC214"}}),e("path",{attrs:{d:"M11.9 24.8c-.7 0-1.4-.5-1.7-1.1l-1.5-3.2 1.1 4.6c.2.6.7 1.1 1.4 1.1h.3l17-4.1-16.2 2.7h-.4Z",fill:"#FFC214"}}),e("path",{attrs:{d:"M16 17.5s-1.1 1.2-2.5 1.2c-1.7 0-2.6-1.4-2.6-2.8 0-1.3.9-2.7 2.6-2.7 1.3 0 2.3 1 2.3 1l1.1-1.7s-.6-.7-1.9-1.1v-1.2h-1.1v1h-.6v-1h-1.1v1.1c-2.2.5-3.7 2.4-3.7 4.7 0 2.4 1.5 4.2 3.7 4.7v1.2h1.1v-1h.6V22H15v-1.3c1.4-.4 2.1-1.3 2.1-1.3L16 17.5ZM21 13.7c2.1 0 3.8 1.4 3.8 3.6 0 2.1-1.7 3.5-3.8 3.5-2.1 0-3.8-1.4-3.8-3.5s1.7-3.6 3.8-3.6Zm0 5.2c.8 0 1.5-.6 1.5-1.6s-.7-1.7-1.5-1.7-1.5.6-1.5 1.7c0 1 .7 1.6 1.5 1.6Zm4.3-5h2.3v6.7h-2.3v-6.7Zm0-2.6h2.2v1.8h-2.2v-1.8Zm3.2 2.6h2.2v1c.3-.5 1-1.2 2.1-1.2 1.4 0 2.4.6 2.4 2.5v4.4h-2.3v-4c0-.6-.2-.9-.7-.9-.7 0-1.1.4-1.3 1-.1.3-.1.6-.1.9v3h-2.3v-6.7Z",fill:"#FFF"}}),e("path",{attrs:{d:"M39.3 13.9c1.7 0 2.5 1 2.5 1l-.6.9s-.7-.8-1.8-.8c-1.3 0-2.3 1-2.3 2.4 0 1.3 1 2.4 2.3 2.4 1.2 0 2-.9 2-.9l.5.9s-.9 1.1-2.6 1.1c-2.1 0-3.5-1.5-3.5-3.5-.1-2 1.4-3.5 3.5-3.5Zm6.8 2.6h.3v-.1c0-1.1-.6-1.5-1.5-1.5-1 0-1.8.6-1.8.6l-.5-.9s1-.8 2.5-.8c1.7 0 2.6.9 2.6 2.6v4.2h-1.2v-1.1s-.5 1.3-2.1 1.3c-1.1 0-2.3-.7-2.3-2 0-2.2 2.9-2.3 4-2.3Zm-1.4 3.3c1.1 0 1.8-1.1 1.8-2.1v-.2h-.3c-1 0-2.7.1-2.7 1.3-.1.5.3 1 1.2 1Zm3.8-5.8h1.2v1.7c.3-1 1.1-1.7 2.1-1.7h.3v1.3h-.4c-.8 0-1.6.6-1.9 1.6-.1.4-.2.8-.2 1.2v2.7h-1.3V14h.2Zm6.8-.1c1.5 0 2 1 2 1v-3.5h1.3v9.2h-1.2v-1s-.5 1.2-2.2 1.2c-1.8 0-2.9-1.4-2.9-3.5s1.3-3.4 3-3.4Zm.2 5.8c1 0 1.9-.7 1.9-2.4 0-1.2-.6-2.4-1.9-2.4-1 0-1.9.9-1.9 2.4s.8 2.4 1.9 2.4Zm4.2-.8s.7.8 1.9.8c.5 0 1.1-.3 1.1-.8 0-1.2-3.4-1-3.4-3.1 0-1.2 1.1-1.9 2.4-1.9 1.5 0 2.1.7 2.1.7l-.5 1s-.6-.6-1.6-.6c-.5 0-1.1.2-1.1.8 0 1.2 3.4.9 3.4 3.1 0 1.1-.9 1.9-2.4 1.9-1.6 0-2.5-1-2.5-1l.6-.9Z",fill:"#EF8022"}})])]),t._v(" "),e("symbol",{attrs:{id:"supporter-lunanode",viewBox:"0 0 194.219 193.977"}},[e("path",{staticStyle:{fill:"#004581","fill-opacity":"1","fill-rule":"evenodd",stroke:"none"},attrs:{d:"M3185.89 2995.8c-1.77 21.49-2.76 43.2-2.76 65.16 0 411.03 319.09 747.36 723.13 774.95l-618.54-641.7c-54.62-56.68-88.55-126.08-101.83-198.41M3960 2284.09c-270.37 0-508.4 138.15-647.57 347.65l23.25-22.42c76.82-74.06 176.93-109.95 276.2-108.13 99 1.77 197.53 41.2 271.5 117.59l-177.95 171.52c-26.66-27.31-62.22-41.38-98.02-42.14-36.12-.65-72.43 12.41-100.16 39.15l-37.98 36.6c-27.69 26.66-42.04 62.45-42.7 98.57-.65 36.07 12.36 72.48 39.11 100.21l745.68 773.56c305.71-104.45 525.52-394.17 525.52-735.29 0-29.89-1.73-59.34-5.04-88.32-19.44 54.57-51.41 105.56-95.79 148.35l-37.93 36.58c-76.86 74.07-176.93 110.05-276.16 108.18-99.32-1.77-198.13-41.38-272.19-118.25l-290.74-301.59 177.95-171.53 290.74 301.61c26.71 27.73 62.64 42.04 98.72 42.74 36.12.69 72.38-12.35 100.16-39.1l37.89-36.59c27.69-26.66 42.09-62.45 42.74-98.58.61-36.03-12.4-72.48-39.1-100.21l-440.73-457.23c-22.23-1.9-44.69-2.93-67.4-2.93",transform:"matrix(.125 0 0 -.125 -397.891 479.489)"}}),e("path",{staticStyle:{fill:"#3384b9","fill-opacity":"1","fill-rule":"evenodd",stroke:"none"},attrs:{d:"M4376.22 2292.8h360.66v433.41c-17.35-55.88-47.59-108.64-90.81-153.48l-269.85-279.93",transform:"matrix(.125 0 0 -.125 -397.891 479.489)"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-walletofsatoshi",viewBox:"0 0 313.1 76.32"}},[e("path",{attrs:{d:"M110.47 44.8H121c.84 0 1.22-.64.9-1.48l-17.6-42A2 2 0 0 0 102.22 0H87.63a2 2 0 0 0-2 1.34L66 48.11c-.32.84.06 1.48.83 1.48h13.7a1.42 1.42 0 0 1 1.32 1.93l-9.7 24.8 30.55-32.63A1 1 0 0 0 102 42H84.73a1.42 1.42 0 0 1-1.32-2l5.06-12.91 6.86-17.47 6.78 17.51h-7.54a1.42 1.42 0 0 0-1.32.9l-2.83 7.22a1.42 1.42 0 0 0 1.32 1.93H105a1.42 1.42 0 0 1 1.33.91l2.08 5.36a1.92 1.92 0 0 0 2.06 1.35Zm62.65 0h37.42a1.3 1.3 0 0 0 1.46-1.41V35.9a1.3 1.3 0 0 0-1.47-1.41h-26V1.41A1.35 1.35 0 0 0 183 0h-9.92a1.3 1.3 0 0 0-1.47 1.41v42a1.3 1.3 0 0 0 1.51 1.39Zm45.36 0h42a1.3 1.3 0 0 0 1.52-1.41V35.9a1.31 1.31 0 0 0-1.47-1.41h-30.59v-7.36h25.59a1.33 1.33 0 0 0 1.48-1.4v-7a1.33 1.33 0 0 0-1.48-1.41h-25.59v-7h30.59A1.3 1.3 0 0 0 262 8.89V1.41A1.3 1.3 0 0 0 260.53 0h-42A1.3 1.3 0 0 0 217 1.41v42a1.3 1.3 0 0 0 1.48 1.39ZM71.79 0H61.61a1.71 1.71 0 0 0-1.85 1.41L52.08 34.3 44.91 1.41A1.65 1.65 0 0 0 43.12 0H30.38a1.71 1.71 0 0 0-1.85 1.41L21.36 34.3 13.68 1.41A1.65 1.65 0 0 0 11.89 0H1.14C.24 0-.14.51.05 1.41l10.88 42a1.68 1.68 0 0 0 1.79 1.41H28.4a1.65 1.65 0 0 0 1.79-1.41l6.27-28.31 6.34 28.29a1.65 1.65 0 0 0 1.79 1.41H60.2a1.66 1.66 0 0 0 1.8-1.41l10.87-42C73.07.51 72.68 0 71.79 0Zm239.84 0h-43.52a1.3 1.3 0 0 0-1.47 1.41v7.48a1.3 1.3 0 0 0 1.47 1.41h15.29v33.09a1.3 1.3 0 0 0 1.48 1.41h10a1.33 1.33 0 0 0 1.47-1.41V10.3h15.3a1.3 1.3 0 0 0 1.47-1.41V1.41A1.3 1.3 0 0 0 311.63 0ZM127.76 44.8h37.42a1.3 1.3 0 0 0 1.47-1.41V35.9a1.3 1.3 0 0 0-1.47-1.41h-26V1.41a1.35 1.35 0 0 0-1.5-1.41h-9.92a1.3 1.3 0 0 0-1.47 1.41v42a1.3 1.3 0 0 0 1.47 1.39Zm-3.84 9.6h-11.53c-3.13 0-4.53 1.31-4.53 4.36v10.37c0 3.05 1.4 4.36 4.53 4.36h11.53c3.16 0 4.51-1.31 4.51-4.36V58.76c0-3.05-1.35-4.36-4.51-4.36Zm-1 12.95c0 1.48-.29 1.75-2.07 1.75h-5.51c-1.76 0-2.08-.27-2.08-1.75v-6.81c0-1.47.32-1.75 2.08-1.75h5.51c1.78 0 2.07.28 2.07 1.75Zm51.87-5.59h-8.75c-.89 0-1.16-.27-1.16-.95v-1.06c0-.68.27-1 1.16-1h6.7c.65 0 .89.28.89.85v.16a.55.55 0 0 0 .62.6h4a.55.55 0 0 0 .62-.6v-1.08c0-3.21-1.11-4.28-4.4-4.28H164c-3.19 0-4.51 1.31-4.51 4.36v2.84c0 3.06 1.32 4.36 4.51 4.36h8.74c.9 0 1.17.28 1.17 1v1.23c0 .68-.27.95-1.17.95h-7.34c-.62 0-.86-.27-.86-.85v-.16a.56.56 0 0 0-.62-.6h-4a.55.55 0 0 0-.62.6v1.12c0 3.22 1.08 4.28 4.4 4.28h11.2c3.19 0 4.51-1.31 4.51-4.36v-3c-.06-3.1-1.41-4.41-4.57-4.41Zm85.43 0h-8.75c-.89 0-1.16-.27-1.16-.95v-1.06c0-.68.27-1 1.16-1h6.7c.64 0 .89.28.89.85v.16a.55.55 0 0 0 .62.6h4a.55.55 0 0 0 .62-.6v-1.08c0-3.21-1.11-4.28-4.4-4.28h-10.48c-3.19 0-4.51 1.31-4.51 4.36v2.84c0 3.06 1.32 4.36 4.51 4.36h8.74c.89 0 1.16.28 1.16 1v1.23c0 .68-.27.95-1.16.95h-7.34c-.62 0-.86-.27-.86-.85v-.16a.57.57 0 0 0-.62-.6h-4.05a.55.55 0 0 0-.62.6v1.12c0 3.22 1.08 4.28 4.4 4.28h11.2c3.18 0 4.51-1.31 4.51-4.36v-3c0-3.1-1.33-4.41-4.51-4.41Zm26.65-7.36h-4.21a.56.56 0 0 0-.63.6v6.66h-9.2V55a.57.57 0 0 0-.65-.6H268a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.18a.57.57 0 0 0 .65-.6v-6.84h9.2v6.84a.56.56 0 0 0 .63.6h4.21a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.57-.6Zm-137.62 0h-17.07a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.19a.58.58 0 0 0 .65-.6v-6.52h10.15a.57.57 0 0 0 .64-.6v-3.19a.57.57 0 0 0-.64-.6H137v-3.19h12.3a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.62-.6Zm146.47 0h-4.18a.55.55 0 0 0-.62.6v17.89a.55.55 0 0 0 .62.6h4.18a.57.57 0 0 0 .65-.6V55a.57.57 0 0 0-.6-.6Zm-100.28.6a.83.83 0 0 0-.86-.57h-6.16a.83.83 0 0 0-.89.57l-7.42 17.89c-.14.36 0 .63.38.63h4.45a.8.8 0 0 0 .86-.57l1-2.68h9.1l1 2.68a.8.8 0 0 0 .87.57h4.69c.33 0 .49-.27.35-.63Zm-7 11 2.89-7.52 2.92 7.52Zm30.9-11.6H201a.55.55 0 0 0-.62.6v3.19a.55.55 0 0 0 .62.6h6.45v14.1a.55.55 0 0 0 .62.6h4.21a.56.56 0 0 0 .62-.6v-14.1h6.46a.55.55 0 0 0 .62-.6V55a.55.55 0 0 0-.64-.6Zm18.46 0h-11.52c-3.13 0-4.54 1.31-4.54 4.36v10.37c0 3.05 1.41 4.36 4.54 4.36h11.52c3.16 0 4.51-1.31 4.51-4.36V58.76c0-3.05-1.31-4.36-4.51-4.36Zm-.94 12.95c0 1.48-.3 1.75-2.08 1.75h-5.51c-1.75 0-2.07-.27-2.07-1.75v-6.81c0-1.47.32-1.75 2.07-1.75h5.51c1.78 0 2.08.28 2.08 1.75Z",fill:"#fad228",stroke:"#1e2127","stroke-width":"2"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-ivpn",viewBox:"0 0 84 29"}},[e("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M6.75 0h6.03c.07 0 .15.03.2.1.04.05.06.13.05.2L8.6 27.43a.26.26 0 0 1-.24.22l-6.63.38H1.7a.25.25 0 0 1-.19-.08.26.26 0 0 1-.06-.22L5.2 5.05C5.12 1.67 1 .85.49.73-.06.59 0 0 0 0h6.75Zm32.32.12a.25.25 0 0 0-.22-.12h-6.5c-.1 0-.18.05-.23.14l-8.98 17.4L20.08.2a.25.25 0 0 0-.24-.21h-6.55a.25.25 0 0 0-.2.1.26.26 0 0 0-.05.2l4.85 26.05a.25.25 0 0 0 .26.2l7.57-.43c.08 0 .16-.06.2-.14L39.08.38a.26.26 0 0 0-.01-.26Zm20.27 5.5a6.8 6.8 0 0 0-.53-2.08c-.27-.6-.61-1.1-1.01-1.5-.4-.41-.8-.75-1.23-1A8.23 8.23 0 0 0 52.9 0H40.47a.25.25 0 0 0-.25.2l-4.01 24.6c-.01.07.01.14.06.2.05.05.11.08.18.08h.02l6.25-.36c.11 0 .2-.1.22-.21l.75-4.63h6.08c1.39-.09 2.7-.43 3.89-1.03a9.75 9.75 0 0 0 2.99-2.46 9.9 9.9 0 0 0 2-4.76l.56-3.3c.17-1.02.21-1.93.13-2.71Zm-7.21 5.87a2.53 2.53 0 0 1-1.1 1.66c-.27.18-.64.27-1.1.27H44.7l1.1-7h5.3c.45 0 .78.09.97.27.22.2.38.41.47.65.1.27.13.6.1.95l-.52 3.2ZM83.75 0h-6.32c-.12 0-.23.1-.25.22l-2.25 14.34L70.04.17a.25.25 0 0 0-.23-.17H63.5c-.12 0-.23.1-.25.22l-3.86 24.56c-.01.07.01.16.06.22.05.05.12.08.19.08l6.43-.39c.12 0 .21-.1.23-.22l1.62-10.36 3.4 10.08c.04.1.14.17.25.17l8.58-.52c.11 0 .2-.1.23-.22L84 .3a.27.27 0 0 0-.06-.22.24.24 0 0 0-.19-.09Z",fill:"#F34"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-hrf",viewBox:"0 0 3000 987.6"}},[e("path",{attrs:{d:"M1137.09 103.9v773.45h-51.44V515.96h-953.6v361.38H80.62V103.9h51.44v361.2h953.6V103.9h51.43zm-102.77 0h-51.44v258.19H234.94V103.9H183.5v309.05h850.82V103.9zm-696.29 0h-50.87v205.84h50.87V103.9zm593.05 0h-51.44v205.84h51.44V103.9zM183.5 877.34h51.44V619.16h747.94v258.19h51.44V567.72H183.5v309.62zm695.72 0h51.44V670.93h-51.44v206.41zm-592.47 0h51.44V670.93h-51.44v206.41z",fill:"#e12991"}}),e("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M1422.94 103.88V331.3h-44.51v-94.22h-92.2v94.22h-44.83V103.88h44.83v90.32h92.2v-90.32h44.51zM1605.81 168.85V331.3h-41.91v-18.19c-9.75 14.62-26.64 22.74-48.41 22.74-34.44 0-61.4-24.04-61.4-67.25v-99.74H1496v94.54c0 22.1 13.32 33.47 32.16 33.47 20.47 0 35.74-12.02 35.74-40.29v-87.72h41.91zM1885.19 231.23V331.3h-41.91v-97.14c0-19.17-9.75-30.86-27.29-30.86-18.52 0-30.22 12.35-30.22 36.71v91.29h-41.91v-97.14c0-19.17-9.75-30.86-27.29-30.86-17.87 0-30.54 12.35-30.54 36.71v91.29h-41.91V168.85h41.91v17.22c9.1-13.64 24.37-21.77 45.16-21.77 20.14 0 35.09 8.45 44.18 23.39 10.07-14.62 26.32-23.39 48.41-23.39 37.04.01 61.41 26.32 61.41 66.93zM2086.24 168.85V331.3h-41.91v-19.17c-11.7 14.62-29.24 23.72-52.96 23.72-43.21 0-78.95-37.36-78.95-85.77s35.74-85.77 78.95-85.77c23.72 0 41.26 9.1 52.96 23.72v-19.17h41.91zm-41.91 81.23c0-27.29-19.17-45.81-45.16-45.81-25.66 0-44.83 18.52-44.83 45.81 0 27.29 19.17 45.81 44.83 45.81 25.99 0 45.16-18.52 45.16-45.81zM2275.93 231.56v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V168.85h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44.01 61.4 24.05 61.4 67.26zM1316.47 525.36h-30.25v78.95h-44.83V376.89h94.84c41.91 0 75.7 33.79 75.7 75.37 0 28.59-17.87 54.26-43.86 66.28l50.36 85.77h-48.41l-53.55-78.95zm-30.25-39.31h50c16.89 0 30.86-14.95 30.86-33.79s-13.97-33.46-30.86-33.46h-50v67.25zM1437.88 396.71c0-13.97 15.57-25.99 29.54-25.99 14.29 0 22.12 12.02 22.12 25.99s-11.7 25.67-25.99 25.67c-13.97 0-25.67-11.7-25.67-25.67zm4.88 45.16h41.91v162.45h-41.91V441.87zM1681.86 441.87v154.65c0 53.28-41.91 77.33-84.8 77.33-34.77 0-62.7-13.32-77-39.64l35.74-20.47c6.82 12.67 17.54 22.74 42.56 22.74 26.31 0 42.56-14.29 42.56-39.96v-17.54c-11.37 15.27-28.92 24.69-51.98 24.69-46.14 0-80.9-37.36-80.9-83.17 0-45.48 34.76-83.17 80.9-83.17 23.07 0 40.61 9.42 51.98 24.69v-20.14h40.94zm-40.94 78.62c0-25.67-19.17-44.18-45.49-44.18-26.31 0-45.48 18.52-45.48 44.18 0 25.99 19.17 44.51 45.48 44.51 26.32 0 45.49-18.52 45.49-44.51zM1871.55 504.57v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V376.89h41.91v83.17c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25zM1963.46 482.15v67.58c0 17.54 12.67 17.87 36.71 16.57v38.01c-58.81 6.5-78.62-10.72-78.62-54.58v-67.58h-28.27v-40.29h28.27v-32.81l41.91-12.67v45.48h36.71v40.29h-36.71zM2148.63 556.88c0 35.09-30.54 51.98-65.31 51.98-32.49 0-56.53-13.64-68.22-38.66l36.39-20.47c4.55 13.32 15.6 21.12 31.84 21.12 13.32 0 22.42-4.55 22.42-13.97 0-23.72-83.82-10.72-83.82-67.9 0-33.14 28.27-51.66 61.73-51.66 26.32 0 49.06 12.02 61.73 34.44l-35.74 19.49c-4.88-10.4-13.97-16.57-25.99-16.57-10.4 0-18.84 4.55-18.84 13.32-.01 24.04 83.81 9.1 83.81 68.88zM1286.22 692.79v53.93h96.11v42.89h-96.11v87.72h-44.83V649.9h143.54v42.88h-98.71zM1400.82 796.1c0-48.41 38.01-85.77 85.77-85.77s86.1 37.36 86.1 85.77-38.34 85.77-86.1 85.77c-47.76 0-85.77-37.36-85.77-85.77zm129.96 0c0-26.31-19.17-44.83-44.19-44.83-24.69 0-43.86 18.52-43.86 44.83 0 26.32 19.17 44.83 43.86 44.83 25.02.01 44.19-18.51 44.19-44.83zM1744.84 714.88v162.45h-41.91v-18.19c-9.75 14.62-26.64 22.74-48.41 22.74-34.44 0-61.4-24.04-61.4-67.25v-99.74h41.91v94.54c0 22.1 13.32 33.47 32.16 33.47 20.47 0 35.74-12.02 35.74-40.29v-87.72h41.91zM1934.86 777.58v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V714.88h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25zM2135.61 649.9v227.42h-41.91v-19.17c-11.7 14.95-28.92 23.72-52.63 23.72-43.54 0-79.27-37.36-79.27-85.77s35.74-85.77 79.27-85.77c23.72 0 40.94 8.77 52.63 23.72V649.9h41.91zm-41.91 146.2c0-27.29-19.17-45.81-44.84-45.81-25.99 0-45.16 18.52-45.16 45.81 0 27.29 19.17 45.81 45.16 45.81 25.67.01 44.84-18.51 44.84-45.81zM2337.35 714.88v162.45h-41.91v-19.17c-11.7 14.62-29.24 23.72-52.96 23.72-43.21 0-78.95-37.36-78.95-85.77s35.74-85.77 78.95-85.77c23.72 0 41.26 9.1 52.96 23.72v-19.17h41.91zm-41.91 81.22c0-27.29-19.17-45.81-45.16-45.81-25.66 0-44.83 18.52-44.83 45.81 0 27.29 19.17 45.81 44.83 45.81 25.99.01 45.16-18.51 45.16-45.81zM2433.46 755.17v67.58c0 17.54 12.67 17.87 36.71 16.57v38.01c-58.81 6.5-78.62-10.72-78.62-54.58v-67.58h-28.26v-40.29h28.26v-32.81l41.91-12.67v45.48h36.71v40.29h-36.71zM2494.84 669.72c0-13.97 11.7-25.99 25.67-25.99 14.29 0 25.99 12.02 25.99 25.99s-11.7 25.66-25.99 25.66c-13.97.01-25.67-11.69-25.67-25.66zm4.87 45.16h41.91v162.45h-41.91V714.88zM2565 796.1c0-48.41 38.01-85.77 85.77-85.77s86.1 37.36 86.1 85.77-38.34 85.77-86.1 85.77c-47.76 0-85.77-37.36-85.77-85.77zm129.96 0c0-26.31-19.17-44.83-44.19-44.83-24.69 0-43.86 18.52-43.86 44.83 0 26.32 19.17 44.83 43.86 44.83 25.02.01 44.19-18.51 44.19-44.83zM2911.62 777.58v99.74h-41.91v-94.54c0-22.09-13.32-33.46-32.16-33.46-20.47 0-35.74 12.02-35.74 40.29v87.72h-41.91V714.88h41.91v18.19c9.75-14.62 26.64-22.74 48.41-22.74 34.44 0 61.4 24.04 61.4 67.25z"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-opensats",viewBox:"0 0 5220 720"}},[e("path",{attrs:{d:"M0 435.197L229.609 291.597V288.121L0 144.259V29.0508L334.901 245.894V333.824L0 550.798V435.197Z",fill:"#FF3300"}}),e("path",{attrs:{d:"M486.969 623.844H902.627V719.643H486.969V623.844Z",fill:"#FF3300"}}),e("path",{attrs:{d:"M993.879 291.2C993.879 106.422 1084.61 0 1214.37 0C1344.13 0 1434.86 106.422 1434.86 291.2C1434.86 479.061 1344.13 587.581 1214.37 587.581C1084.61 587.581 993.879 479.061 993.879 291.2ZM1345.12 291.2C1345.12 155.01 1293.16 75.9967 1214.37 75.9967C1135.58 75.9967 1083.62 155.01 1083.62 291.2C1083.62 430.473 1135.58 511.584 1214.37 511.584C1293.16 511.584 1344.85 430.473 1344.85 291.2H1345.12Z",fill:"#FF3300"}}),e("path",{attrs:{d:"M1593.29 154.29H1663.81L1670.37 205.37H1673.13C1711.31 169.634 1764.71 144.258 1814.44 144.258C1925.96 144.258 1988.02 228.713 1988.02 359.855C1988.02 504.111 1897.95 587.911 1797.77 587.911C1759.13 587.911 1713.54 568.829 1677.39 535.454H1675.29L1679.43 612.237V749.936H1593.29V154.29ZM1899.65 359.855C1899.65 271.269 1867.44 215.599 1791.21 215.599C1756.57 215.599 1717.93 232.713 1679.69 272.121V472.112C1714.79 503.914 1754.61 515.455 1781.57 515.455C1848.75 515.717 1899.65 459.851 1899.65 359.855Z",fill:"#FF3300"}}),e("path",{attrs:{d:"M2118.96 365.035C2118.96 227.336 2222.75 143.93 2335.98 143.93C2460.16 143.93 2530.82 225.434 2530.82 343.527C2530.67 359.209 2529.35 374.858 2526.88 390.345H2178.73V327.2H2473.22L2454.52 348.249C2454.52 256.449 2410.17 210.55 2338.47 210.55C2264.41 210.55 2203.66 265.17 2203.66 364.904C2203.66 468.833 2268.8 520.044 2359.79 520.044C2407.09 520.044 2445.08 505.75 2483.39 482.8L2513.56 537.29C2464.7 569.886 2407.32 587.378 2348.57 587.582C2220.39 587.582 2118.96 505.947 2118.96 365.035Z",fill:"#FF3300"}}),e("path",{attrs:{d:"M2658.41 154.29H2729.07L2735.63 221.697H2739.04C2781.55 178.289 2829.83 144.258 2895.17 144.258C2994.1 144.258 3039.17 205.042 3039.17 315.201V577.026H2952.9V326.152C2952.9 252.319 2928.11 218.222 2865.39 218.222C2819.47 218.222 2788.31 240.844 2744.68 285.563V577.026H2658.41V154.29Z",fill:"#FF3300"}}),e("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M3208.36 504.308L3259.46 444.376C3303 486.486 3360.93 510.468 3421.5 511.455C3493.27 511.455 3533.03 478.669 3533.03 432.77C3533.03 377.362 3491.63 361.953 3435.41 338.217L3355.57 303.333C3297.64 280.514 3234.21 238.614 3234.21 155.143C3234.21 66.8186 3313.65 0.001814 3425.64 0.001814C3492.01 -0.442962 3555.93 25.0654 3603.75 71.0807L3558.87 126.554C3521.22 93.051 3472.3 74.9951 3421.9 75.9985C3362.2 75.9985 3322.11 103.604 3322.11 150.028C3322.11 199.206 3371.05 217.173 3420.98 236.516L3497.93 270.416C3569.04 298.087 3622.18 339.528 3622.18 422.344C3622.18 513.356 3545.36 587.583 3416.78 587.583C3339.11 587.998 3264.34 558.123 3208.36 504.308V504.308Z"}}),e("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M3762.96 465.557C3762.96 370.741 3849.04 324.055 4062.7 308.186C4059.62 255.73 4031.54 213.896 3956.3 213.896C3905.13 213.896 3854.68 237.304 3813.28 261.5L3780.48 203.994C3827.98 174.684 3898.57 144.062 3971.78 144.062C4088.42 144.062 4148.91 210.945 4148.91 322.678V577.027H4077.73L4070.84 522.144H4068.08C4022.82 557.553 3963.97 587.715 3906.04 587.715C3825.16 587.584 3762.96 540.045 3762.96 465.557ZM4062.7 462.278V363.266C3896.79 375.134 3847.26 408.576 3847.26 459C3847.26 501.489 3885.38 519.063 3930.65 519.063C3975.91 519.063 4018.88 497.883 4062.7 462.278Z"}}),e("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M4388.81 409.884V222.941H4272.17V158.813L4392.16 154.289L4403.44 20.2617H4475.02V154.289H4674.64V222.941H4475.02V410.146C4475.02 482.864 4500.73 518.076 4577.29 518.076C4610.27 517.981 4642.96 511.847 4673.73 499.979L4691.24 562.992C4648.39 578.951 4603.07 587.274 4557.35 587.581C4430.86 587.581 4388.81 516.043 4388.81 409.884Z"}}),e("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{d:"M4818.71 521.815L4857.09 466.014C4909.9 502.948 4972.98 522.353 5037.43 521.487C5102.31 521.487 5133.34 495.259 5133.34 463.85C5133.34 433.95 5115.76 415 5009.22 393.034C4897.7 369.887 4845.21 331.2 4845.21 267.203C4845.21 196.518 4908.85 143.93 5025.95 143.93C5093.26 143.93 5157.55 170.158 5199.93 198.878L5159.45 252.646C5117.79 224.668 5068.79 209.592 5018.6 209.304C4955.62 209.304 4931.28 234.155 4931.28 263.138C4931.28 295.923 4965.07 309.037 5048.12 326.938C5185.89 357.101 5220.33 392.509 5220.33 458.736C5220.33 529.487 5151.71 587.582 5026.8 587.582C4952.47 586.641 4880.07 563.76 4818.71 521.815V521.815Z"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-tether",viewBox:"0 0 111 90"}},[e("path",{attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M24.4825 0.862305H88.0496C89.5663 0.862305 90.9675 1.64827 91.7239 2.92338L110.244 34.1419C111.204 35.7609 110.919 37.8043 109.549 39.1171L58.5729 87.9703C56.9216 89.5528 54.2652 89.5528 52.6139 87.9703L1.70699 39.1831C0.305262 37.8398 0.0427812 35.7367 1.07354 34.1077L20.8696 2.82322C21.6406 1.60483 23.0087 0.862305 24.4825 0.862305ZM79.8419 14.8003V23.5597H61.7343V29.6329C74.4518 30.2819 83.9934 32.9475 84.0642 36.1425L84.0638 42.803C83.993 45.998 74.4518 48.6635 61.7343 49.3125V64.2168H49.7105V49.3125C36.9929 48.6635 27.4513 45.998 27.3805 42.803L27.381 36.1425C27.4517 32.9475 36.9929 30.2819 49.7105 29.6329V23.5597H31.6028V14.8003H79.8419ZM55.7224 44.7367C69.2943 44.7367 80.6382 42.4827 83.4143 39.4727C81.0601 36.9202 72.5448 34.9114 61.7343 34.3597V40.7183C59.7966 40.8172 57.7852 40.8693 55.7224 40.8693C53.6595 40.8693 51.6481 40.8172 49.7105 40.7183V34.3597C38.8999 34.9114 30.3846 36.9202 28.0304 39.4727C30.8066 42.4827 42.1504 44.7367 55.7224 44.7367Z",fill:"#009393"}}),t._v(" "),e("symbol",{attrs:{id:"supporter-unbank",viewBox:"0 0 766 132",fill:"none"}},[e("path",{attrs:{d:"M133.125 66.24v41.145c-.03 10.77-7.051 19.926-17.376 22.792-2.053.571-4.156.831-6.279.831-27.55 0-55.09.03-82.641-.01-13.209-.02-23.625-10.429-23.645-23.623v-82.52c0-13.194 10.425-23.593 23.635-23.613h82.641c13.209.02 23.605 10.429 23.645 23.623l.01 41.385.01-.01zM68.38 33.16H31.987c-.361 0-.721-.02-1.082 0-2.694.17-4.657 2.044-4.717 4.508-.07 2.805 1.662 4.779 4.517 5.019.711.06.851.321.851.952v34.904c0 .661-.19.952-.871 1.162-2.183.661-2.694 3.206-1.042 4.769.751.711 1.632.731 2.574.731h72.316.721c1.472-.05 2.594-1.012 2.844-2.434a2.77 2.77 0 0 0-1.853-3.016c-.641-.21-.771-.501-.771-1.092V43.76c0-.741.19-.972.982-1.082 3.595-.491 5.347-4.348 3.385-7.363-1.062-1.633-2.704-2.154-4.557-2.154H68.41h-.03zm-.12 53.026H28.261c-.881 0-1.763-.04-2.644.01-3.245.19-5.208 3.446-3.715 6.171.701 1.272 1.933 1.853 3.175 2.435l27.37 12.824 12.478 5.88c1.703.822 3.325.972 5.037.081 1.352-.692 2.754-1.293 4.136-1.914l23.144-10.519 14.952-6.822c1.542-.701 2.564-1.783 2.684-3.516.2-2.755-1.672-4.638-4.577-4.638H68.26v.01zm-.13-65.329H26.218c-1.933 0-2.574.631-2.604 2.585-.02 1.122 0 2.234 0 3.356 0 2.615.561 3.176 3.155 3.176h82.741c.281 0 .561.01.841 0 1.432-.08 2.133-.761 2.153-2.174v-4.198c0-2.294-.45-2.755-2.713-2.755H68.12l.01.01zM593.247 49.67c-.27 1.703-.11 3.426-.1 5.129l.13 13.665.241 25.777.23 16.18c.18 5.169-4.006 8.155-7.321 8.145-4.696 0-7.911-3.156-7.971-7.995l-.15-17.261-.261-25.777-.22-22.18-.231-19.415c-.03-3.827 1.903-6.622 5.248-7.714s6.58.05 8.813 3.136l46.859 64.517c.29.401.5.892 1.131 1.262v-1.473-59.849c0-4.378 2.524-7.463 6.61-8.125 4.356-.711 8.542 2.755 8.693 7.183.01.321 0 .641 0 .962v84.554c0 3.897-1.933 6.792-5.248 7.864-3.355 1.082-6.64-.11-8.913-3.246l-46.708-64.327c-.251-.351-.421-.782-.832-.992-.04-.05-.08-.09-.12-.14 0 .03-.01.06-.02.1.05 0 .11.01.16.02h-.02zm-288.231-.21v12.383l.17 12.823.321 31.768c.02 1.753.22 3.526.03 5.269-.481 4.368-3.936 7.113-8.453 6.833-3.715-.231-6.739-3.637-6.79-7.704l-.14-15.589-.24-26.017-.24-22.18-.231-21.218c-.03-3.737 1.933-6.562 5.218-7.624 3.325-1.082 6.61.07 8.833 3.126l47.069 64.808c.25.351.51.691.971 1.292v-1.523-60.45c0-4.087 2.584-7.123 6.56-7.774 4.156-.671 8.182 2.394 8.622 6.572a12.05 12.05 0 0 1 .06 1.192v85.396c0 6.071-6.239 9.697-11.476 6.702-1.062-.611-1.863-1.483-2.574-2.465l-47.009-64.707-.681-.912h-.02zm97.402 22.421l-.02-37.178.02-8.626c.141-2.585.641-5.019 2.855-6.702 1.522-1.162 3.334-1.573 5.197-1.583l20.66.01c11.617.26 21.502 7.153 25.257 17.602 2.955 8.225 1.703 16.109-2.413 23.653-1.102 2.004-1.122 2.004.591 3.436 5.287 4.428 9.504 9.608 11.376 16.37 4.317 15.628-4.026 35.375-24.355 38.861-3.636.621-7.341.471-11.016.511-5.759.06-11.527 0-17.296-.05-1.442-.01-2.894 0-4.306-.21-3.946-.592-6.129-3.246-6.469-7.725a27.22 27.22 0 0 1-.061-2.033V71.871l-.02.01zm15.864 15.598v14.156c0 .491-.171 1.062.701 1.052 6.119-.1 12.258.32 18.366-.171 10.806-.871 17.206-11.921 12.619-21.729-2.163-4.628-5.718-7.634-11.026-8.135a86.36 86.36 0 0 0-9.104-.361l-10.675.17c-.801 0-.891.321-.891.982l.01 14.035zm0-42.537l-.02 10.78c0 .731.19.942.941.942l11.156-.03c7.461-.15 12.619-5.891 11.988-13.274-.431-5.009-4.006-8.796-8.903-9.537-4.767-.721-9.564-.571-14.351-.701-.751-.02-.831.311-.831.922v10.9h.02zM704.27 68.014c.581-.17.811-.571 1.111-.872l21.692-21.76 24.676-24.875c3.165-3.196 7.992-3.286 11.076-.21 3.015 3.005 2.915 7.814-.22 10.97l-24.886 25.016-6.259 6.301c-.601.581-.551.942-.071 1.563l31.026 40.153 1.462 1.903c2.604 3.456 2.073 8.095-1.212 10.72-3.315 2.644-8.072 2.123-10.796-1.323l-11.016-14.226-20.299-26.307c-.431-.561-.691-.822-1.332-.16l-14.281 14.406c-.541.541-.681 1.092-.681 1.813v18.954c-.02 3.166-1.492 5.53-4.347 6.893-2.764 1.312-5.468 1.002-7.921-.832-1.893-1.412-2.935-3.366-2.935-5.77V25.446c0-3.997 3.305-7.273 7.341-7.384 4.086-.12 7.631 3.026 7.812 7.033.1 2.194.05 4.398.05 6.592v36.336l.01-.01zM258.548 50.873l-.03 24.955c-.361 19.586-13.54 37.278-32.838 41.355-16.464 3.486-30.154-1.823-40.83-14.687-5.688-6.852-8.642-14.927-9.484-23.793-.17-1.803-.13-3.587-.13-5.38V24.745c0-3.807 2.063-6.682 5.488-7.674 4.978-1.443 9.765 2.254 9.765 7.584v33.591l.06 17.872c.33 12.232 8.843 23.423 20.66 26.228 10.045 2.374 20.64-1.803 26.879-10.86 3.275-4.749 5.068-10.028 5.078-15.839l.07-50.852c0-3.787 2.083-6.702 5.478-7.704 4.937-1.463 9.784 2.184 9.794 7.413v26.388l.04-.02zm292.788 67.683c-3.295 0-5.898-1.824-7.15-5.04l-7.131-18.413c-.35-.922-.811-1.152-1.742-1.152h-33.75c-.871 0-1.312.19-1.642 1.092l-7.01 18.584c-1.322 3.436-4.297 5.199-8.072 4.909-3.105-.241-5.859-2.786-6.56-6.102-.33-1.572-.07-3.075.501-4.568l11.657-30.906 20.37-53.968c1.272-3.386 3.996-5.4 7.301-5.41 3.254-.01 5.998 1.963 7.28 5.28l32.948 84.904c1.853 4.789-.45 9.447-5.207 10.639-.591.151-1.192.131-1.783.151h-.01zm-20.66-39.843l-12.438-32.068-.271.611-11.547 30.546c-.39 1.032.151.912.802.912h21.842 1.612z",fill:"#3cce49"}}),e("path",{attrs:{d:"M68.38 33.16h36.874c1.863 0 3.495.511 4.557 2.154 1.962 3.005.21 6.873-3.385 7.363-.792.11-.982.341-.982 1.082v34.903c0 .591.13.892.771 1.092a2.76 2.76 0 0 1 1.853 3.016c-.24 1.423-1.372 2.384-2.844 2.434h-.721-72.316c-.931 0-1.823-.02-2.574-.731-1.652-1.563-1.142-4.118 1.042-4.769.681-.21.881-.501.871-1.162V43.639c0-.631-.14-.892-.851-.952-2.854-.24-4.587-2.214-4.517-5.019.06-2.455 2.023-4.338 4.717-4.508.361-.02.721 0 1.082 0H68.35h.03zM52.647 61.201l.02-17.271c0-.892-.16-1.252-1.172-1.232h-9.724c-.891-.01-1.152.23-1.152 1.132v34.543c0 .932.31 1.132 1.172 1.122h9.604c1.002.02 1.282-.27 1.272-1.272l-.02-17.031v.01zm42.973-.19l.02-17.141c0-.862-.18-1.192-1.122-1.172a249.45 249.45 0 0 1-9.484 0c-.921-.02-1.132.291-1.132 1.162v34.403c0 .902.18 1.262 1.182 1.242h9.364c.991.02 1.192-.321 1.192-1.232l-.02-17.261zm-21.561.08l.02-17.131c0-1.012-.29-1.282-1.282-1.262h-9.244c-.841-.01-1.082.24-1.082 1.082v34.633c0 .832.24 1.092 1.082 1.082h9.244c1.001.02 1.282-.281 1.272-1.272l-.02-17.131h.01zM68.26 86.187h42.041c2.905 0 4.777 1.883 4.577 4.638-.12 1.733-1.152 2.815-2.684 3.516l-14.952 6.823-23.144 10.519-4.136 1.914c-1.722.881-3.335.741-5.037-.081l-12.478-5.88-27.37-12.824c-1.242-.581-2.474-1.162-3.175-2.434-1.482-2.725.471-5.981 3.715-6.171.881-.05 1.762-.01 2.644-.01H68.26v-.01zm-.13-65.329h41.671c2.263 0 2.714.461 2.714 2.755v4.198c-.021 1.412-.722 2.094-2.154 2.174h-.841-82.741c-2.594 0-3.155-.561-3.155-3.176v-3.356c.03-1.954.661-2.585 2.604-2.585H68.14l-.01-.01z",fill:"#0e4160"}}),e("path",{attrs:{d:"M593.247 49.67c-.05 0-.11-.01-.16-.02 0-.03.01-.06.02-.1l.12.14.02-.02z",fill:"#fefefe"}}),e("path",{attrs:{d:"M52.647 61.201l.02 17.031c0 1.002-.27 1.292-1.272 1.272-3.205-.06-6.409-.05-9.604 0-.861.01-1.172-.18-1.172-1.122V43.84c0-.902.26-1.152 1.152-1.132h9.724c1.001-.02 1.172.341 1.172 1.232l-.02 17.271v-.01zm42.973-.19l.02 17.261c0 .912-.2 1.252-1.192 1.232a243.59 243.59 0 0 0-9.364 0c-1.002.02-1.182-.351-1.182-1.242V43.86c0-.871.21-1.182 1.132-1.162a249.45 249.45 0 0 0 9.484 0c.941-.02 1.122.311 1.122 1.172l-.02 17.141zm-21.562.08l.02 17.131c0 .992-.27 1.292-1.272 1.272-3.074-.06-6.159-.05-9.243 0-.841.01-1.081-.25-1.081-1.082V43.78c0-.842.24-1.092 1.081-1.082h9.243c.992-.02 1.292.25 1.282 1.262l-.02 17.131h-.01z",fill:"#3cce49"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-acinq",viewBox:"0 0 103 107"}},[e("circle",{attrs:{fill:"url(#acinq-a)",cx:"47.833",cy:"51.833",r:"56.832"}}),e("g",[e("g",{attrs:{fill:"none","stroke-width":"6","stroke-linejoin":"round"}},[e("path",{attrs:{stroke:"#47BF94",d:"M4.493 79.67c-6.778-11.574 21.882-35.135 41.646-39.636 16.598-3.78 55.176 4.066 53.752 17.433"}}),e("path",{attrs:{stroke:"#359F7E",d:"M10.125 18.133c8.624-9.988 41.797 13.701 51.001 30.018 9.723 17.237 12.87 55.271-1.103 55.351"}}),e("path",{attrs:{stroke:"#49DAAA",d:"M69.826 4.107c12.025 5.964 3.838 38.632-11.184 57.28C47.846 74.79 11.659 91.904 4.493 79.67"}}),e("path",{attrs:{stroke:"#49DAAA",d:"M99.891 57.467C98.471 70.799 62.529 72.9 43.83 64.781c-17.92-7.783-42.47-36.5-33.706-46.648"}}),e("path",{attrs:{stroke:"#AAF0D3",d:"M60.023 103.502c-14.291.08-24.609-29.721-23.918-51.916.758-24.377 20.678-53.948 33.721-47.479"}})])])]),t._v(" "),e("symbol",{attrs:{id:"supporter-nomics",viewBox:"0 0 600 600"}},[e("path",{attrs:{d:"M273.56 133A136.81 136.81 0 0 0 0 136.86v326.28a136.8 136.8 0 0 0 233.57 96.75L326.44 467A136.81 136.81 0 0 0 600 463.14V136.86a136.8 136.8 0 0 0-233.57-96.75L273.56 133",fill:"#a0f"}}),e("ellipse",{attrs:{cx:"302.18",cy:"300.04",rx:"136.81",ry:"136.86",fill:"#fff"}})]),t._v(" "),e("symbol",{attrs:{id:"supporter-strike",viewBox:"0 0 155 120"}},[e("path",{staticStyle:{fill:"var(--btcpay-body-text)"},attrs:{"fill-rule":"evenodd","clip-rule":"evenodd",d:"M7.06565 43.2477C1.90963 41.2685 -0.665684 35.4843 1.31353 30.3283C3.29274 25.1722 9.07699 22.5969 14.233 24.5761L51.4526 38.8634C51.4937 38.8798 51.535 38.896 51.5765 38.9119L70.2481 46.0792C75.4041 48.0584 81.1883 45.4831 83.1675 40.3271C85.1468 35.1711 82.5714 29.3868 77.4154 27.4076L77.4132 27.4068C77.4139 27.4064 77.4145 27.406 77.4151 27.4056L58.7436 20.2383C53.5876 18.2591 51.0123 12.4749 52.9915 7.31885C54.9707 2.16283 60.755 -0.412485 65.911 1.56673L120.828 22.6473C120.959 22.6977 121.089 22.7506 121.217 22.8059C121.453 22.8928 121.69 22.9815 121.926 23.0721C147.706 32.9681 160.583 61.8894 150.686 87.6695C140.79 113.45 111.869 126.326 86.089 116.43C85.5927 116.24 85.1011 116.042 84.6144 115.838C84.3783 115.766 84.1431 115.686 83.9091 115.596L30.0742 94.9308C24.9182 92.9516 22.3428 87.1673 24.3221 82.0113C26.3013 76.8553 32.0855 74.2799 37.2415 76.2592L55.9106 83.4256C55.9103 83.4242 55.9099 83.4229 55.9095 83.4215L55.9133 83.423C61.0694 85.4022 66.8536 82.8269 68.8328 77.6709C70.812 72.5148 68.2367 66.7306 63.0807 64.7514L54.6786 61.5261C54.6787 61.5257 54.6788 61.5252 54.6789 61.5247L7.06565 43.2477Z"}})])])]),t._v(" "),e("div",{staticClass:"supporters"},[e("h3",[t._v("Our Supporters")]),t._v(" "),e("p",[t._v("\n The BTCPay Server Project is proudly supported by these entities through the\n "),e("a",{attrs:{href:"https://foundation.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server Foundation")]),t._v(".\n ")]),t._v(" "),e("div",{staticClass:"logos"},[e("a",{attrs:{href:"https://spiral.xyz",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"100",height:"100"}},[e("use",{attrs:{href:"#supporter-spiral"}})]),t._v("\n Spiral\n ")]),t._v(" "),e("a",{attrs:{href:"https://opensats.org",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"120",height:"100"}},[e("use",{attrs:{href:"#supporter-opensats"}})]),t._v("\n OpenSats\n ")]),t._v(" "),e("a",{attrs:{href:"https://tether.to",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"100",height:"60"}},[e("use",{attrs:{href:"#supporter-tether"}})]),t._v("\n Tether\n ")]),t._v(" "),e("a",{attrs:{href:"https://hrf.org",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"110",height:"60"}},[e("use",{attrs:{href:"#supporter-hrf"}})]),t._v("\n HRF\n ")]),t._v(" "),e("a",{attrs:{href:"https://www.lunanode.com/",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{staticStyle:{padding:"5px"},attrs:{role:"img",width:"80",height:"60"}},[e("use",{attrs:{href:"#supporter-lunanode"}})]),t._v("\n LunaNode\n ")]),t._v(" "),e("a",{attrs:{href:"https://walletofsatoshi.com/",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"80",height:"80"}},[e("use",{attrs:{href:"#supporter-walletofsatoshi"}})]),t._v("\n Wallet of Satoshi\n ")]),t._v(" "),e("a",{attrs:{href:"https://coincards.com/",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"80",height:"80"}},[e("use",{attrs:{href:"#supporter-coincards"}})]),t._v("\n Coincards\n ")]),t._v(" "),e("a",{attrs:{href:"https://www.ivpn.net/",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"80",height:"80"}},[e("use",{attrs:{href:"#supporter-ivpn"}})]),t._v("\n IVPN\n ")]),t._v(" "),e("a",{attrs:{href:"https://www.unbank.com/",target:"_blank",rel:"noopener noreferrer"}},[e("svg",{attrs:{role:"img",width:"80",height:"80"}},[e("use",{attrs:{href:"#supporter-unbank"}})]),t._v("\n Unbank\n ")])]),t._v(" "),e("p",[t._v("If you'd like to support the project, please visit the "),e("a",{attrs:{href:"https://btcpayserver.org/donate/"}},[t._v("donation page")]),t._v(".")])])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/88.25ff612b.js b/assets/js/88.d65ea862.js similarity index 97% rename from assets/js/88.25ff612b.js rename to assets/js/88.d65ea862.js index 9197776bf6..391a689d52 100644 --- a/assets/js/88.25ff612b.js +++ b/assets/js/88.d65ea862.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{514:function(t,e,a){t.exports=a.p+"assets/img/support.970aea07.png"},854:function(t,e,a){"use strict";a.r(e);var n=a(17),o=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"lndhub-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lndhub-api"}},[t._v("#")]),t._v(" LNDhub API")]),t._v(" "),e("p",[t._v("A plugin for "),e("a",{attrs:{href:"https://github.com/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server"),e("OutboundLink")],1),t._v(" to add a LNDhub-compatible API for stores.\nThis means that your store's Lightning wallet can be used with the following wallet apps:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://bluewallet.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BlueWallet"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://zeusln.app/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Zeus"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://getalby.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Alby"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("These wallets offer import features, so that you can easily import your store's Lightning wallets into these apps.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("NOTE")]),t._v(" "),e("p",[t._v("The prerequisite for a Lightning wallet to be accessible like this is enabling the plugin for your store.\nPlease note that this offers full access to the Lightning node that is connected to the store, not just the BTCPay Server-related activity.")])]),t._v(" "),e("h2",{attrs:{id:"importing-the-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#importing-the-wallet"}},[t._v("#")]),t._v(" Importing the wallet")]),t._v(" "),e("p",[t._v('On the LNDhub API settings page you will find the "Connect LNDhub-compatible wallet" section.\nIt has a QR code and the Access URL, which contain the details (server URL and credentials) to connect the apps.')]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("The credentials allow unrestricted access to your store's Lightning node.\nTreat the QR code and Access URL as confidential information!")])]),t._v(" "),e("h3",{attrs:{id:"bluewallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bluewallet"}},[t._v("#")]),t._v(" BlueWallet")]),t._v(" "),e("p",[t._v("In BlueWallet you can use this path to import the wallet:")]),t._v(" "),e("p",[e("code",[t._v("Add Wallet > Import Wallet > Scan or import file")]),t._v(".")]),t._v(" "),e("p",[t._v("You can then scan the QR code from the LNDhub API plugin page.\nOnce the wallet is imported, you can also set a name.")]),t._v(" "),e("h3",{attrs:{id:"zeus"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#zeus"}},[t._v("#")]),t._v(" Zeus")]),t._v(" "),e("p",[t._v("In Zeus you can use this path to import the wallet:")]),t._v(" "),e("ul",[e("li",[t._v("Open the settings by clicking on the node icon in the top left corner.")]),t._v(" "),e("li",[t._v("In the settings click the node (first row) to get to the list of nodes.")]),t._v(" "),e("li",[t._v("Click the plus icon in the top right corner to add a new node/wallet.")])]),t._v(" "),e("p",[t._v("You will land on the following screen and have to")]),t._v(" "),e("ul",[e("li",[t._v('Choose "LNDHub" as the "Node Interface"')]),t._v(" "),e("li",[t._v('Enable the "Existing account" toggle')]),t._v(" "),e("li",[t._v('Click the "Scan LNDHub QR" button and scan the code')])]),t._v(" "),e("h3",{attrs:{id:"alby"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#alby"}},[t._v("#")]),t._v(" Alby")]),t._v(" "),e("p",[t._v('In the Alby account dropdown, choose "Add a new account".\nOn the "Add a new lightning account" choose "LNDhub (BlueWallet)".')]),t._v(" "),e("p",[t._v('Now you can either copy and paste the account URL from the LNDhub API plugin page or scan the QR code.\nOnce the account is initialized, you should see a "Success!" message.')]),t._v(" "),e("p",[t._v("There is also the possibility to "),e("a",{attrs:{href:"https://guides.getalby.com/overall-guide/alby-browser-extension/connect-lightning-wallets-and-nodes-to-the-alby-extension/connect-btcpay-server",target:"_blank",rel:"noopener noreferrer"}},[t._v("connect BTCPay Server to the Alby Browser Extension"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"support-this-plugin"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#support-this-plugin"}},[t._v("#")]),t._v(" Support this plugin")]),t._v(" "),e("figure",[e("a",{attrs:{href:"https://github.com/dennisreimann/btcpayserver-plugin-lndhub-api/blob/master/lightning:LNURL1DP68GURN8GHJ7AMPD3KX2AR0VEEKZAR0WD5XJTNRDAKJ7TNHV4KXCTTTDEHHWM30D3H82UNVWQHKXUN0WAJX2ER9V9E8G6PN8QSKVTEZ",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:a(514),alt:"Support this plugin",title:"Support this plugin"}}),e("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{523:function(t,e,a){t.exports=a.p+"assets/img/support.970aea07.png"},854:function(t,e,a){"use strict";a.r(e);var n=a(17),o=Object(n.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"lndhub-api"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#lndhub-api"}},[t._v("#")]),t._v(" LNDhub API")]),t._v(" "),e("p",[t._v("A plugin for "),e("a",{attrs:{href:"https://github.com/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server"),e("OutboundLink")],1),t._v(" to add a LNDhub-compatible API for stores.\nThis means that your store's Lightning wallet can be used with the following wallet apps:")]),t._v(" "),e("ul",[e("li",[e("a",{attrs:{href:"https://bluewallet.io/",target:"_blank",rel:"noopener noreferrer"}},[t._v("BlueWallet"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://zeusln.app/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Zeus"),e("OutboundLink")],1)]),t._v(" "),e("li",[e("a",{attrs:{href:"https://getalby.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Alby"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("These wallets offer import features, so that you can easily import your store's Lightning wallets into these apps.")]),t._v(" "),e("div",{staticClass:"custom-block tip"},[e("p",{staticClass:"custom-block-title"},[t._v("NOTE")]),t._v(" "),e("p",[t._v("The prerequisite for a Lightning wallet to be accessible like this is enabling the plugin for your store.\nPlease note that this offers full access to the Lightning node that is connected to the store, not just the BTCPay Server-related activity.")])]),t._v(" "),e("h2",{attrs:{id:"importing-the-wallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#importing-the-wallet"}},[t._v("#")]),t._v(" Importing the wallet")]),t._v(" "),e("p",[t._v('On the LNDhub API settings page you will find the "Connect LNDhub-compatible wallet" section.\nIt has a QR code and the Access URL, which contain the details (server URL and credentials) to connect the apps.')]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("WARNING")]),t._v(" "),e("p",[t._v("The credentials allow unrestricted access to your store's Lightning node.\nTreat the QR code and Access URL as confidential information!")])]),t._v(" "),e("h3",{attrs:{id:"bluewallet"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#bluewallet"}},[t._v("#")]),t._v(" BlueWallet")]),t._v(" "),e("p",[t._v("In BlueWallet you can use this path to import the wallet:")]),t._v(" "),e("p",[e("code",[t._v("Add Wallet > Import Wallet > Scan or import file")]),t._v(".")]),t._v(" "),e("p",[t._v("You can then scan the QR code from the LNDhub API plugin page.\nOnce the wallet is imported, you can also set a name.")]),t._v(" "),e("h3",{attrs:{id:"zeus"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#zeus"}},[t._v("#")]),t._v(" Zeus")]),t._v(" "),e("p",[t._v("In Zeus you can use this path to import the wallet:")]),t._v(" "),e("ul",[e("li",[t._v("Open the settings by clicking on the node icon in the top left corner.")]),t._v(" "),e("li",[t._v("In the settings click the node (first row) to get to the list of nodes.")]),t._v(" "),e("li",[t._v("Click the plus icon in the top right corner to add a new node/wallet.")])]),t._v(" "),e("p",[t._v("You will land on the following screen and have to")]),t._v(" "),e("ul",[e("li",[t._v('Choose "LNDHub" as the "Node Interface"')]),t._v(" "),e("li",[t._v('Enable the "Existing account" toggle')]),t._v(" "),e("li",[t._v('Click the "Scan LNDHub QR" button and scan the code')])]),t._v(" "),e("h3",{attrs:{id:"alby"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#alby"}},[t._v("#")]),t._v(" Alby")]),t._v(" "),e("p",[t._v('In the Alby account dropdown, choose "Add a new account".\nOn the "Add a new lightning account" choose "LNDhub (BlueWallet)".')]),t._v(" "),e("p",[t._v('Now you can either copy and paste the account URL from the LNDhub API plugin page or scan the QR code.\nOnce the account is initialized, you should see a "Success!" message.')]),t._v(" "),e("p",[t._v("There is also the possibility to "),e("a",{attrs:{href:"https://guides.getalby.com/overall-guide/alby-browser-extension/connect-lightning-wallets-and-nodes-to-the-alby-extension/connect-btcpay-server",target:"_blank",rel:"noopener noreferrer"}},[t._v("connect BTCPay Server to the Alby Browser Extension"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"support-this-plugin"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#support-this-plugin"}},[t._v("#")]),t._v(" Support this plugin")]),t._v(" "),e("figure",[e("a",{attrs:{href:"https://github.com/dennisreimann/btcpayserver-plugin-lndhub-api/blob/master/lightning:LNURL1DP68GURN8GHJ7AMPD3KX2AR0VEEKZAR0WD5XJTNRDAKJ7TNHV4KXCTTTDEHHWM30D3H82UNVWQHKXUN0WAJX2ER9V9E8G6PN8QSKVTEZ",target:"_blank",rel:"noopener noreferrer"}},[e("img",{attrs:{src:a(523),alt:"Support this plugin",title:"Support this plugin"}}),e("OutboundLink")],1)])])}),[],!1,null,null,null);e.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/91.62310f4b.js b/assets/js/91.b8cc05dc.js similarity index 99% rename from assets/js/91.62310f4b.js rename to assets/js/91.b8cc05dc.js index 4fc29655b9..0970310d6c 100644 --- a/assets/js/91.62310f4b.js +++ b/assets/js/91.b8cc05dc.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[91],{528:function(t,_,v){t.exports=v.p+"assets/img/nxplorer-schema.49aa7fcd.png"},862:function(t,_,v){"use strict";v.r(_);var e=v(17),a=Object(e.a)({},(function(){var t=this,_=t._self._c;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"documentation-of-sql-schema"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#documentation-of-sql-schema"}},[t._v("#")]),t._v(" Documentation of SQL Schema")]),t._v(" "),_("p",[t._v("Knowing the SQL schema is useful in three situations:")]),t._v(" "),_("ol",[_("li",[t._v("You want to query the schema directly as NBXplorer's API doesn't provide an API endpoint for your needs")]),t._v(" "),_("li",[t._v("You want to do your own indexer on top of it (in a different language or for a crypto we don't support)")]),t._v(" "),_("li",[t._v("You want to create your own API on top of it for features not exposed by NBXplorer's API.")])]),t._v(" "),_("p",[t._v("This model is contained in "),_("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer/DBScripts/FullSchema.sql",target:"_blank",rel:"noopener noreferrer"}},[t._v("this SQL script"),_("OutboundLink")],1),t._v(".\nThere are additional comments there about the meaning of columns and views.")]),t._v(" "),_("p",[t._v("Here is a diagram:\n"),_("img",{attrs:{src:v(528),alt:"NBXplorer Database Schema",title:"NBXplorer Database Schema"}})]),t._v(" "),_("p",[t._v("The SQL Schema of NBXplorer is multi-tenant, multi-asset, multi-chain.\nIt is divided in several parts:")]),t._v(" "),_("ul",[_("li",[t._v("Blocks and transactions: "),_("code",[t._v("blks")]),t._v(", "),_("code",[t._v("blks_txs")]),t._v(" and "),_("code",[t._v("txs")])]),t._v(" "),_("li",[t._v("Outputs, Inputs and Scripts: "),_("code",[t._v("ins")]),t._v(", "),_("code",[t._v("outs")]),t._v(", "),_("code",[t._v("ins_outs")]),t._v(", "),_("code",[t._v("scripts")])]),t._v(" "),_("li",[t._v("Descriptors: "),_("code",[t._v("descriptors")]),t._v(", "),_("code",[t._v("descriptors_scripts")])]),t._v(" "),_("li",[t._v("Wallets: "),_("code",[t._v("wallets")]),t._v(", "),_("code",[t._v("wallets_wallets")]),t._v(", "),_("code",[t._v("wallets_descriptors")]),t._v(", "),_("code",[t._v("wallets_scripts")])]),t._v(" "),_("li",[t._v("Double spending detection: "),_("code",[t._v("spent_outs")])])]),t._v(" "),_("p",[t._v("Most if the data in those tables is denormalized for better query performance. The denormalization is handled automatically by triggers.")]),t._v(" "),_("h2",{attrs:{id:"using-wallets-tables"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#using-wallets-tables"}},[t._v("#")]),t._v(" Using wallets tables")]),t._v(" "),_("p",[t._v("A wallet is a collection of "),_("code",[t._v("wallets_descriptors")]),t._v(" and "),_("code",[t._v("wallets_scripts")]),t._v(".\nIf a descriptor belongs to a wallet, then any "),_("code",[t._v("descriptors_scripts")]),t._v(" will be added by trigger in the "),_("code",[t._v("wallets_scripts")]),t._v(".")]),t._v(" "),_("p",[t._v("A descriptor is also called "),_("code",[t._v("output descriptor")]),t._v(" in the Bitcoin jargon, it represents a way to derive a collection of addresses deterministically. How to represent and interpret a descriptor is up to the indexer. (see next part)")]),t._v(" "),_("p",[t._v("It is also possible to add directly scripts to "),_("code",[t._v("wallets_scripts")]),t._v(".")]),t._v(" "),_("p",[t._v("On top of it, a wallet can have children by using "),_("code",[t._v("wallets_wallets")]),t._v(".\nAny script from a child wallet will be added to the scripts of the parent wallet.")]),t._v(" "),_("p",[t._v("This allow you to define a hierarchy of wallet.")]),t._v(" "),_("h2",{attrs:{id:"making-your-own-indexer"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#making-your-own-indexer"}},[t._v("#")]),t._v(" Making your own indexer")]),t._v(" "),_("p",[t._v("An indexer typical flow is the following:")]),t._v(" "),_("ol",[_("li",[t._v("Insert block in blks with "),_("code",[t._v("confirmed='f'")])]),t._v(" "),_("li",[t._v("Call "),_("code",[t._v("fetch_matches")]),t._v(" with all the ins and outs of a block")]),t._v(" "),_("li",[t._v("This will create temporary tables "),_("code",[t._v("matched_outs")]),t._v(", "),_("code",[t._v("matched_ins")]),t._v(" and "),_("code",[t._v("matched_conflicts")]),t._v(" the indexer can use to inspect what has been matched")]),t._v(" "),_("li",[t._v("Call save_matches to instruct the database to insert all matched ins/outs.")]),t._v(" "),_("li",[t._v("Turn "),_("code",[t._v("confirmed='t'")]),t._v(" of the block.")])]),t._v(" "),_("p",[t._v("On top of this, an indexer is responsible for creating "),_("code",[t._v("descriptors_scripts")]),t._v(". It can do so by monitoring "),_("code",[t._v("descriptors.gap")]),t._v(", and if the gap become too low, the indexer need to insert more scripts from the descriptor into "),_("code",[t._v("descriptors_scripts")]),t._v(".")]),t._v(" "),_("p",[t._v("This allow indexer to define their own descriptors.")]),t._v(" "),_("h2",{attrs:{id:"views-and-functions"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#views-and-functions"}},[t._v("#")]),t._v(" Views and functions")]),t._v(" "),_("h3",{attrs:{id:"function-to-btc"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#function-to-btc"}},[t._v("#")]),t._v(" Function: to_btc")]),t._v(" "),_("p",[_("code",[t._v("to_btc(v NUMERIC)")])]),t._v(" "),_("p",[t._v("Helper function format a satoshi based value into numeric bitcoin.")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" to_btc"),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("150000000")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("div",{staticClass:"language- extra-class"},[_("pre",{pre:!0,attrs:{class:"language-text"}},[_("code",[t._v("1.50000000\n")])])]),_("h3",{attrs:{id:"function-get-wallets-recent"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#function-get-wallets-recent"}},[t._v("#")]),t._v(" Function: get_wallets_recent")]),t._v(" "),_("p",[_("code",[t._v("get_wallets_recent(in_wallet_id TEXT, in_interval INTERVAL, in_limit INT, in_offset INT)")])]),t._v(" "),_("p",[_("code",[t._v("get_wallets_recent(in_wallet_id TEXT, in_code TEXT, in_interval INTERVAL, in_limit INT, in_offset INT)")])]),t._v(" "),_("p",[t._v("See what has going on recently in a wallet.")]),t._v(" "),_("p",[t._v("Better to use on Postgres 13+, as it greatly benefits from incremental sort.")]),t._v(" "),_("p",[t._v("For example, this returns the "),_("code",[t._v("5")]),t._v(" most recent "),_("code",[t._v("KPrAFh3ZOIS5umpbwuYkU0sF8JW+")]),t._v(" that happened for one year.")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" get_wallets_recent"),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'KPrAFh3ZOIS5umpbwuYkU0sF8JW+'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interval")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'1 year'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v('"code"')]),t._v(" "),_("th",[t._v('"asset_id"')]),t._v(" "),_("th",[t._v('"tx_id"')]),t._v(" "),_("th",[t._v('"seen_at"')]),t._v(" "),_("th",[t._v('"balance_change"')]),t._v(" "),_("th",[t._v('"balance_total"')])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"0e42124df086ef05b0d8cb3a5b2028828b3af27b31d7c5045803cc8541410a9f"')]),t._v(" "),_("td",[t._v('"2022-03-07 17:14:27.269382+00"')]),t._v(" "),_("td",[t._v("-199996.0")]),t._v(" "),_("td",[t._v("55020")])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"529d92bcdba7545befa4b1101256544def3ca9726ebbe4a6bd8122d7762129a2"')]),t._v(" "),_("td",[t._v('"2022-03-06 21:15:48.505111+00"')]),t._v(" "),_("td",[t._v("-229995.0")]),t._v(" "),_("td",[t._v("255016")])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"e9ce704adc9c64e099c2513169d6856bbf2fcdb2de92b465d4d63b67961b2bd2"')]),t._v(" "),_("td",[t._v('"2022-03-04 15:07:08.923081+00"')]),t._v(" "),_("td",[t._v("200000")]),t._v(" "),_("td",[t._v("485011")])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"0581c1545ce58ecf93d70e97321fa27c7d409bb0666a124470491403cb0d91f4"')]),t._v(" "),_("td",[t._v('"2022-03-03 10:59:44.259948+00"')]),t._v(" "),_("td",[t._v("230000")]),t._v(" "),_("td",[t._v("285011")])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"c12d1339295d6a69af8dc0fb411b67d5571d31265b385586341a4126bcda76da"')]),t._v(" "),_("td",[t._v('"2022-02-22 17:00:02.697965+00"')]),t._v(" "),_("td",[t._v("-519989.0")]),t._v(" "),_("td",[t._v("55011")])])])]),t._v(" "),_("h3",{attrs:{id:"view-utxos"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#view-utxos"}},[t._v("#")]),t._v(" View: utxos")]),t._v(" "),_("p",[t._v("List all the UTXOs available:")]),t._v(" "),_("p",[_("strong",[t._v("Warning")]),t._v(": It also returns the UTXO that are confirmed but spent in the mempool, as well as immature utxos and utxos that are being double spent.")]),t._v(" "),_("p",[t._v("If you want the available UTXOs which can be spent use "),_("code",[t._v("WHERE input_mempool IS FALSE AND immature IS FALSE")]),t._v(".")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" utxos\n"),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WHERE")]),t._v(" input_mempool "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("IS")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("FALSE")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("AND")]),t._v("\n immature "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("IS")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("FALSE")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v('"code"')]),t._v(" "),_("th",[t._v('"tx_id"')]),t._v(" "),_("th",[t._v('"idx"')]),t._v(" "),_("th",[t._v('"script"')]),t._v(" "),_("th",[t._v('"value"')]),t._v(" "),_("th",[t._v('"asset_id"')]),t._v(" "),_("th",[t._v('"input_tx_id"')]),t._v(" "),_("th",[t._v('"input_idx"')]),t._v(" "),_("th",[t._v('"input_mempool"')]),t._v(" "),_("th",[t._v('"immature"')]),t._v(" "),_("th",[t._v('"blk_id"')]),t._v(" "),_("th",[t._v('"blk_idx"')]),t._v(" "),_("th",[t._v('"blk_height"')]),t._v(" "),_("th",[t._v('"mempool"')]),t._v(" "),_("th",[t._v('"replaced_by"')]),t._v(" "),_("th",[t._v('"seen_at"')])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"6bf5a95c11c819ff22da3933bef2931977b4906c5820bb48ab5336a77502e4a6"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"00144d60ec59ed28267bf897543a659662cddabd384b"')]),t._v(" "),_("td",[t._v("19490")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"0000010e1bc83fa20421880db7424740392a459c6ac699cefe7eac5004247e46"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("58943")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-08 14:25:17.96779+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"6c43019cb584391a766b1c7d5c67f09174d98b4306edeedf8586c8fdbf1048d6"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"0014f8a89fd6d6d256df24e05b01cade70d2abcdb6f6"')]),t._v(" "),_("td",[t._v("113872")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"00000088cb1683d609054866ff72131af46dd7f6ee51136fdc2184f5ad1bbbf6"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("58502")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-05 10:21:39.483849+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"1457ce82a3eb87a8982429e5185896ddee09c773519fa198de3bba4d6c9b42b7"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"0014002ca9212872715f0a5789d52084a9daecb5dce7"')]),t._v(" "),_("td",[t._v("3899577")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"000001090d8f4c50c77021026d5ec5fbe2072cb95a1f5592635f70dfc30297d0"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("59348")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-11 12:30:12.008471+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"75b7ba9a0718a95234e0b72edd2c721f3066be96eb8076f5b8f3f7160498d07f"')]),t._v(" "),_("td",[t._v("1")]),t._v(" "),_("td",[t._v('"0014ca76914ddc4fca3c37768e599302765ae633b62c"')]),t._v(" "),_("td",[t._v("119727")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"0000009d64990b4a2b4bff9511d5c9713124905a0932026db5737a3ad44f0138"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("60492")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-19 10:08:54.301111+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"9fc4bc1b9dc2d60202fe4e483b54afb5da7efbbfe6966e5e51f4dc6dbc2363b5"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"0014ad054e107c046e69b5ab5abc1e44d25ac9378ff6"')]),t._v(" "),_("td",[t._v("9900")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"0000010003e91e0f56787b9e02b5ae424bb681f09f2ec82f8e23b19a7a93b6e6"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("53506")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-09-01 02:13:21.469658+00"')])])])]),t._v(" "),_("h3",{attrs:{id:"view-descriptors-scripts-unused"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#view-descriptors-scripts-unused"}},[t._v("#")]),t._v(" View: descriptors_scripts_unused")]),t._v(" "),_("p",[t._v("List all the unused scripts from descriptors.")]),t._v(" "),_("p",[t._v("Example: Get the next unused address:")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" descriptors_scripts_unused\n"),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WHERE")]),t._v(" code"),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'BTC'")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("AND")]),t._v(" descriptor"),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'7obopunl9/6GVYkej++YMw6DHWXk'")]),t._v("\n"),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ORDER")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("BY")]),t._v(" idx "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("LIMIT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("OFFSET")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("code")]),t._v(" "),_("th",[t._v("descriptor")]),t._v(" "),_("th",[t._v("script")]),t._v(" "),_("th",[t._v("idx")]),t._v(" "),_("th",[t._v("addr")]),t._v(" "),_("th",[t._v("d_metadata")]),t._v(" "),_("th",[t._v("ds_metadata")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("BTC")]),t._v(" "),_("td",[t._v("7obopunl9/6GVYkej++YMw6DHWXk")]),t._v(" "),_("td",[t._v("001482137a4bbc144f8eb5a02fd2acda36c999a96242")]),t._v(" "),_("td",[t._v("3261")]),t._v(" "),_("td",[t._v("tb1qsgfh5jauz38caddq9lf2ek3kexv6jcjzxu9sfw")]),t._v(" "),_("td",[t._v('{"type": "NBXv1-Derivation", "feature": "Deposit", "derivation": "tpubDCtUtuEgpKLQJMu5uUUuDQub7D4CHjCJsfGhwrA3HV6X6CuV7Zj6RizRFwLPNKqkLrd8TM1Xt3QmwumqRRZAUTrVAA9T8uhyMfodChhFykD", "keyPathTemplate": "0/*"}')]),t._v(" "),_("td")])])]),t._v(" "),_("h3",{attrs:{id:"view-wallets-utxos"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#view-wallets-utxos"}},[t._v("#")]),t._v(" View: wallets_utxos")]),t._v(" "),_("p",[t._v("List all the wallets UTXOs available:")]),t._v(" "),_("p",[_("strong",[t._v("Warning")]),t._v(": It also returns the UTXO that are confirmed but spent in the mempool, as well as immature utxos and utxos that are being double spent.")]),t._v(" "),_("p",[t._v("If you want the available UTXOs which can be spent use "),_("code",[t._v("WHERE input_mempool IS FALSE AND immature IS FALSE")]),t._v(".")]),t._v(" "),_("p",[t._v("Also, keep in mind that if an UTXO belong to two wallets, then you will see two entries for this UTXO.")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" wallets_utxos\n"),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WHERE")]),t._v(" input_mempool "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("IS")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("FALSE")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("AND")]),t._v("\n immature "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("IS")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("FALSE")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v('"wallet_id"')]),t._v(" "),_("th",[t._v('"code"')]),t._v(" "),_("th",[t._v('"tx_id"')]),t._v(" "),_("th",[t._v('"idx"')]),t._v(" "),_("th",[t._v('"script"')]),t._v(" "),_("th",[t._v('"value"')]),t._v(" "),_("th",[t._v('"asset_id"')]),t._v(" "),_("th",[t._v('"input_tx_id"')]),t._v(" "),_("th",[t._v('"input_idx"')]),t._v(" "),_("th",[t._v('"input_mempool"')]),t._v(" "),_("th",[t._v('"immature"')]),t._v(" "),_("th",[t._v('"blk_id"')]),t._v(" "),_("th",[t._v('"blk_idx"')]),t._v(" "),_("th",[t._v('"blk_height"')]),t._v(" "),_("th",[t._v('"mempool"')]),t._v(" "),_("th",[t._v('"replaced_by"')]),t._v(" "),_("th",[t._v('"seen_at"')])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v('"XObUaAdU2HBJk4XHGhIRya3ZObB3"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"6bf5a95c11c819ff22da3933bef2931977b4906c5820bb48ab5336a77502e4a6"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"00144d60ec59ed28267bf897543a659662cddabd384b"')]),t._v(" "),_("td",[t._v("19490")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"0000010e1bc83fa20421880db7424740392a459c6ac699cefe7eac5004247e46"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("58943")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-08 14:25:17.96779+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"XObUaAdU2HBJk4XHGhIRya3ZObB3"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"6c43019cb584391a766b1c7d5c67f09174d98b4306edeedf8586c8fdbf1048d6"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"0014f8a89fd6d6d256df24e05b01cade70d2abcdb6f6"')]),t._v(" "),_("td",[t._v("113872")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"00000088cb1683d609054866ff72131af46dd7f6ee51136fdc2184f5ad1bbbf6"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("58502")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-05 10:21:39.483849+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"ZDP5CJ1pOWLITR1API3aJkEpdQz+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"1457ce82a3eb87a8982429e5185896ddee09c773519fa198de3bba4d6c9b42b7"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"0014002ca9212872715f0a5789d52084a9daecb5dce7"')]),t._v(" "),_("td",[t._v("3899577")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"000001090d8f4c50c77021026d5ec5fbe2072cb95a1f5592635f70dfc30297d0"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("59348")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-11 12:30:12.008471+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"ZDP5CJ1pOWLITR1API3aJkEpdQz+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"75b7ba9a0718a95234e0b72edd2c721f3066be96eb8076f5b8f3f7160498d07f"')]),t._v(" "),_("td",[t._v("1")]),t._v(" "),_("td",[t._v('"0014ca76914ddc4fca3c37768e599302765ae633b62c"')]),t._v(" "),_("td",[t._v("119727")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"0000009d64990b4a2b4bff9511d5c9713124905a0932026db5737a3ad44f0138"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("60492")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-19 10:08:54.301111+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"ZDP5CJ1pOWLITR1API3aJkEpdQz+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"9fc4bc1b9dc2d60202fe4e483b54afb5da7efbbfe6966e5e51f4dc6dbc2363b5"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"0014ad054e107c046e69b5ab5abc1e44d25ac9378ff6"')]),t._v(" "),_("td",[t._v("9900")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"0000010003e91e0f56787b9e02b5ae424bb681f09f2ec82f8e23b19a7a93b6e6"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("53506")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-09-01 02:13:21.469658+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"ZDP5CJ1pOWLITR1API3aJkEpdQz+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"fec5c75b87378068f1d7d3276e90b2579e5fad8854a7002e14c275f3da9823be"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"00145674d00638e0da30ae216df4bb539e94cd2d13d1"')]),t._v(" "),_("td",[t._v("1168447")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"000000b43e91de514fec8f9fc418ecb1e0a2b1d14027b01abaad9d4e39e19e8d"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("60590")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-20 02:18:16.980641+00"')])])])]),t._v(" "),_("h3",{attrs:{id:"view-wallets-balances"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#view-wallets-balances"}},[t._v("#")]),t._v(" View: wallets_balances")]),t._v(" "),_("p",[t._v("See the current balance of wallets.")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("confirmed_balance")]),t._v(" only include the sum of value of all currently confirmed UTXOs.")]),t._v(" "),_("li",[_("code",[t._v("unconfirmed_balance")]),t._v(" will become the next "),_("code",[t._v("confirmed_balance")]),t._v(" of the wallet if all non-double spent transactions get confirmed.")]),t._v(" "),_("li",[_("code",[t._v("immature_balance")]),t._v(" the sum of utxos that can't be spent before they are immature (ie, the UTXO comes from a coinbase that is less than 100 blocks old)")]),t._v(" "),_("li",[_("code",[t._v("available_balance")]),t._v(" is the balance that can be spent. ("),_("code",[t._v("unconfirmed_balance")]),t._v(" - "),_("code",[t._v("immature_balance")]),t._v(")")])]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" wallets_balances\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v('"wallet_id"')]),t._v(" "),_("th",[t._v('"code"')]),t._v(" "),_("th",[t._v('"asset_id"')]),t._v(" "),_("th",[t._v('"unconfirmed_balance"')]),t._v(" "),_("th",[t._v('"confirmed_balance"')]),t._v(" "),_("th",[t._v('"available_balance"')]),t._v(" "),_("th",[t._v('"immature_balance"')])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v('"4Tdfhh5kK8TFKcDVvsp6xdKOFdmA"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("389520")]),t._v(" "),_("td",[t._v("389520")]),t._v(" "),_("td",[t._v("389520")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"7ERM4iRjhk1gmeyHxEJQp0fhzh8z"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("420000000")]),t._v(" "),_("td",[t._v("420000000")]),t._v(" "),_("td",[t._v("420000000")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"IIKKVY87qBLjbaa/KAfUfcNP9HeC"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("100000")]),t._v(" "),_("td",[t._v("100000")]),t._v(" "),_("td",[t._v("100000")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("55020")]),t._v(" "),_("td",[t._v("55020")]),t._v(" "),_("td",[t._v("55020")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"Q+z/7E0DCjazcm5Q7t9wZSoEJ0IP"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("200000")]),t._v(" "),_("td",[t._v("200000")]),t._v(" "),_("td",[t._v("200000")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"XObUaAdU2HBJk4XHGhIRya3ZObB3"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("133362")]),t._v(" "),_("td",[t._v("133362")]),t._v(" "),_("td",[t._v("133362")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"ZDP5CJ1pOWLITR1API3aJkEpdQz+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("5197651")]),t._v(" "),_("td",[t._v("5197651")]),t._v(" "),_("td",[t._v("5197651")]),t._v(" "),_("td",[t._v("0")])])])]),t._v(" "),_("h3",{attrs:{id:"materialized-view-wallets-history"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#materialized-view-wallets-history"}},[t._v("#")]),t._v(" Materialized view: wallets_history")]),t._v(" "),_("p",[t._v("Provide an history of wallets (time ordered list of wallet_id, code, asset_id, balance-change, total-balance), it only takes into account confirmed transactions.")]),t._v(" "),_("p",[t._v("This materialized view is intensive to refresh (for 220K transactions, it takes around 5 seconds)")]),t._v(" "),_("p",[t._v("This is meant to be used for reports and histograms.\nIf you want the latest history of a wallet, use "),_("code",[t._v("get_wallets_recent")]),t._v(" instead.")]),t._v(" "),_("p",[t._v("To refresh the materialized view, use "),_("code",[t._v("SELECT wallets_history_refresh();")]),t._v(". This will return "),_("code",[t._v("true")]),t._v(" if the view has been refreshed.")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" wallets_history "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WHERE")]),t._v(" wallet_id"),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'KPrAFh3ZOIS5umpbwuYkU0sF8JW+'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v('"wallet_id"')]),t._v(" "),_("th",[t._v('"code"')]),t._v(" "),_("th",[t._v('"asset_id"')]),t._v(" "),_("th",[t._v('"tx_id"')]),t._v(" "),_("th",[t._v('"seen_at"')]),t._v(" "),_("th",[t._v('"balance_change"')]),t._v(" "),_("th",[t._v('"balance_total"')]),t._v(" "),_("th",[t._v('"nth"')])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"0e42124df086ef05b0d8cb3a5b2028828b3af27b31d7c5045803cc8541410a9f"')]),t._v(" "),_("td",[t._v('"2022-03-07 17:14:27.269382+00"')]),t._v(" "),_("td",[t._v("-199996")]),t._v(" "),_("td",[t._v("55020")]),t._v(" "),_("td",[t._v("10")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"529d92bcdba7545befa4b1101256544def3ca9726ebbe4a6bd8122d7762129a2"')]),t._v(" "),_("td",[t._v('"2022-03-06 21:15:48.505111+00"')]),t._v(" "),_("td",[t._v("-229995")]),t._v(" "),_("td",[t._v("255016")]),t._v(" "),_("td",[t._v("9")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"e9ce704adc9c64e099c2513169d6856bbf2fcdb2de92b465d4d63b67961b2bd2"')]),t._v(" "),_("td",[t._v('"2022-03-04 15:07:08.923081+00"')]),t._v(" "),_("td",[t._v("200000")]),t._v(" "),_("td",[t._v("485011")]),t._v(" "),_("td",[t._v("8")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"0581c1545ce58ecf93d70e97321fa27c7d409bb0666a124470491403cb0d91f4"')]),t._v(" "),_("td",[t._v('"2022-03-03 10:59:44.259948+00"')]),t._v(" "),_("td",[t._v("230000")]),t._v(" "),_("td",[t._v("285011")]),t._v(" "),_("td",[t._v("7")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"c12d1339295d6a69af8dc0fb411b67d5571d31265b385586341a4126bcda76da"')]),t._v(" "),_("td",[t._v('"2022-02-22 17:00:02.697965+00"')]),t._v(" "),_("td",[t._v("-519989")]),t._v(" "),_("td",[t._v("55011")]),t._v(" "),_("td",[t._v("6")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"081466d46632b56d28260b928fea87addeed24cfd25e3d6504b5ddfacf6176e1"')]),t._v(" "),_("td",[t._v('"2022-02-04 10:42:31.059182+00"')]),t._v(" "),_("td",[t._v("310000")]),t._v(" "),_("td",[t._v("575000")]),t._v(" "),_("td",[t._v("5")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"f0165974071064b32122449dbf72a67ab884723923e8536efb5cf4301bcb7469"')]),t._v(" "),_("td",[t._v('"2022-02-04 10:22:04.47652+00"')]),t._v(" "),_("td",[t._v("164000")]),t._v(" "),_("td",[t._v("265000")]),t._v(" "),_("td",[t._v("4")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"a4e165729e5fb406d878b3c9c8dfabd1a3465084c2c2b63602fd8704c41442ac"')]),t._v(" "),_("td",[t._v('"2022-02-04 09:40:00.427892+00"')]),t._v(" "),_("td",[t._v("101000")]),t._v(" "),_("td",[t._v("101000")]),t._v(" "),_("td",[t._v("3")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"61247ae11a770963ffa26a63bb4ac03a14f759f7691eda8ce10175db6b6aaa77"')]),t._v(" "),_("td",[t._v('"2021-10-11 13:09:22.977488+00"')]),t._v(" "),_("td",[t._v("-850000")]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v("2")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"6bf5a95c11c819ff22da3933bef2931977b4906c5820bb48ab5336a77502e4a6"')]),t._v(" "),_("td",[t._v('"2021-10-08 14:25:17.96779+00"')]),t._v(" "),_("td",[t._v("850000")]),t._v(" "),_("td",[t._v("850000")]),t._v(" "),_("td",[t._v("1")])])])]),t._v(" "),_("h3",{attrs:{id:"function-get-wallets-histogram"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#function-get-wallets-histogram"}},[t._v("#")]),t._v(" Function: get_wallets_histogram")]),t._v(" "),_("p",[_("code",[t._v("get_wallets_histogram(in_wallet_id TEXT, in_code TEXT, in_asset_id TEXT, in_from TIMESTAMPTZ, in_to TIMESTAMPTZ, in_interval INTERVAL)")])]),t._v(" "),_("p",[t._v("This function depends on "),_("code",[t._v("wallets_history")]),t._v(", as such, you should make sure the materialized view is refreshed time for up-to-date histogram.")]),t._v(" "),_("p",[t._v("For example, this will show how the balance of "),_("code",[t._v("KPrAFh3ZOIS5umpbwuYkU0sF8JW+")]),t._v(" changed every week from "),_("code",[t._v("2022-01-23")]),t._v(" to now.")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" get_wallets_histogram"),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'KPrAFh3ZOIS5umpbwuYkU0sF8JW+'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'BTC'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2022-01-23'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CURRENT_TIMESTAMP")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interval")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'1 week'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v('"date"')]),t._v(" "),_("th",[t._v('"balance_change"')]),t._v(" "),_("th",[t._v('"balance"')])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v('"2022-01-23 00:00:00+00"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-01-30 00:00:00+00"')]),t._v(" "),_("td",[t._v("575000")]),t._v(" "),_("td",[t._v("575000")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-02-06 00:00:00+00"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v("575000")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-02-13 00:00:00+00"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v("575000")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-02-20 00:00:00+00"')]),t._v(" "),_("td",[t._v("-519989")]),t._v(" "),_("td",[t._v("55011")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-02-27 00:00:00+00"')]),t._v(" "),_("td",[t._v("430000")]),t._v(" "),_("td",[t._v("485011")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-03-06 00:00:00+00"')]),t._v(" "),_("td",[t._v("-429991")]),t._v(" "),_("td",[t._v("55020")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-03-13 00:00:00+00"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v("55020")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-03-20 00:00:00+00"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v("55020")])])])]),t._v(" "),_("h3",{attrs:{id:"function-nbxv1-get-wallet-id"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#function-nbxv1-get-wallet-id"}},[t._v("#")]),t._v(" Function: nbxv1_get_wallet_id")]),t._v(" "),_("p",[_("code",[t._v("nbxv1_get_wallet_id(in_code TEXT, in_scheme_or_address TEXT) RETURNS TEXT")])]),t._v(" "),_("p",[t._v("This function is specific to the current API of NBXplorer. It calculates the "),_("code",[t._v("wallet_id")]),t._v(" based on the chain code (ie. "),_("code",[t._v("BTC")]),t._v(") and an address or derivation scheme.")]),t._v(" "),_("h3",{attrs:{id:"function-nbxv1-get-descriptor-id"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#function-nbxv1-get-descriptor-id"}},[t._v("#")]),t._v(" Function: nbxv1_get_descriptor_id")]),t._v(" "),_("p",[_("code",[t._v("nbxv1_get_descriptor_id(in_code TEXT, in_scheme TEXT, in_feature TEXT) RETURNS TEXT")])]),t._v(" "),_("p",[t._v("This function is specific to the current API of NBXplorer. It calculates the "),_("code",[t._v("descriptor_id")]),t._v(" based on the chain code (ie. "),_("code",[t._v("BTC")]),t._v("), a derivation scheme, and the feature (ie. "),_("code",[t._v("Deposit")]),t._v(" or "),_("code",[t._v("Change")]),t._v(").")])])}),[],!1,null,null,null);_.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[91],{528:function(t,_,v){t.exports=v.p+"assets/img/nxplorer-schema.49aa7fcd.png"},861:function(t,_,v){"use strict";v.r(_);var e=v(17),a=Object(e.a)({},(function(){var t=this,_=t._self._c;return _("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[_("h1",{attrs:{id:"documentation-of-sql-schema"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#documentation-of-sql-schema"}},[t._v("#")]),t._v(" Documentation of SQL Schema")]),t._v(" "),_("p",[t._v("Knowing the SQL schema is useful in three situations:")]),t._v(" "),_("ol",[_("li",[t._v("You want to query the schema directly as NBXplorer's API doesn't provide an API endpoint for your needs")]),t._v(" "),_("li",[t._v("You want to do your own indexer on top of it (in a different language or for a crypto we don't support)")]),t._v(" "),_("li",[t._v("You want to create your own API on top of it for features not exposed by NBXplorer's API.")])]),t._v(" "),_("p",[t._v("This model is contained in "),_("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/NBXplorer/DBScripts/FullSchema.sql",target:"_blank",rel:"noopener noreferrer"}},[t._v("this SQL script"),_("OutboundLink")],1),t._v(".\nThere are additional comments there about the meaning of columns and views.")]),t._v(" "),_("p",[t._v("Here is a diagram:\n"),_("img",{attrs:{src:v(528),alt:"NBXplorer Database Schema",title:"NBXplorer Database Schema"}})]),t._v(" "),_("p",[t._v("The SQL Schema of NBXplorer is multi-tenant, multi-asset, multi-chain.\nIt is divided in several parts:")]),t._v(" "),_("ul",[_("li",[t._v("Blocks and transactions: "),_("code",[t._v("blks")]),t._v(", "),_("code",[t._v("blks_txs")]),t._v(" and "),_("code",[t._v("txs")])]),t._v(" "),_("li",[t._v("Outputs, Inputs and Scripts: "),_("code",[t._v("ins")]),t._v(", "),_("code",[t._v("outs")]),t._v(", "),_("code",[t._v("ins_outs")]),t._v(", "),_("code",[t._v("scripts")])]),t._v(" "),_("li",[t._v("Descriptors: "),_("code",[t._v("descriptors")]),t._v(", "),_("code",[t._v("descriptors_scripts")])]),t._v(" "),_("li",[t._v("Wallets: "),_("code",[t._v("wallets")]),t._v(", "),_("code",[t._v("wallets_wallets")]),t._v(", "),_("code",[t._v("wallets_descriptors")]),t._v(", "),_("code",[t._v("wallets_scripts")])]),t._v(" "),_("li",[t._v("Double spending detection: "),_("code",[t._v("spent_outs")])])]),t._v(" "),_("p",[t._v("Most if the data in those tables is denormalized for better query performance. The denormalization is handled automatically by triggers.")]),t._v(" "),_("h2",{attrs:{id:"using-wallets-tables"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#using-wallets-tables"}},[t._v("#")]),t._v(" Using wallets tables")]),t._v(" "),_("p",[t._v("A wallet is a collection of "),_("code",[t._v("wallets_descriptors")]),t._v(" and "),_("code",[t._v("wallets_scripts")]),t._v(".\nIf a descriptor belongs to a wallet, then any "),_("code",[t._v("descriptors_scripts")]),t._v(" will be added by trigger in the "),_("code",[t._v("wallets_scripts")]),t._v(".")]),t._v(" "),_("p",[t._v("A descriptor is also called "),_("code",[t._v("output descriptor")]),t._v(" in the Bitcoin jargon, it represents a way to derive a collection of addresses deterministically. How to represent and interpret a descriptor is up to the indexer. (see next part)")]),t._v(" "),_("p",[t._v("It is also possible to add directly scripts to "),_("code",[t._v("wallets_scripts")]),t._v(".")]),t._v(" "),_("p",[t._v("On top of it, a wallet can have children by using "),_("code",[t._v("wallets_wallets")]),t._v(".\nAny script from a child wallet will be added to the scripts of the parent wallet.")]),t._v(" "),_("p",[t._v("This allow you to define a hierarchy of wallet.")]),t._v(" "),_("h2",{attrs:{id:"making-your-own-indexer"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#making-your-own-indexer"}},[t._v("#")]),t._v(" Making your own indexer")]),t._v(" "),_("p",[t._v("An indexer typical flow is the following:")]),t._v(" "),_("ol",[_("li",[t._v("Insert block in blks with "),_("code",[t._v("confirmed='f'")])]),t._v(" "),_("li",[t._v("Call "),_("code",[t._v("fetch_matches")]),t._v(" with all the ins and outs of a block")]),t._v(" "),_("li",[t._v("This will create temporary tables "),_("code",[t._v("matched_outs")]),t._v(", "),_("code",[t._v("matched_ins")]),t._v(" and "),_("code",[t._v("matched_conflicts")]),t._v(" the indexer can use to inspect what has been matched")]),t._v(" "),_("li",[t._v("Call save_matches to instruct the database to insert all matched ins/outs.")]),t._v(" "),_("li",[t._v("Turn "),_("code",[t._v("confirmed='t'")]),t._v(" of the block.")])]),t._v(" "),_("p",[t._v("On top of this, an indexer is responsible for creating "),_("code",[t._v("descriptors_scripts")]),t._v(". It can do so by monitoring "),_("code",[t._v("descriptors.gap")]),t._v(", and if the gap become too low, the indexer need to insert more scripts from the descriptor into "),_("code",[t._v("descriptors_scripts")]),t._v(".")]),t._v(" "),_("p",[t._v("This allow indexer to define their own descriptors.")]),t._v(" "),_("h2",{attrs:{id:"views-and-functions"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#views-and-functions"}},[t._v("#")]),t._v(" Views and functions")]),t._v(" "),_("h3",{attrs:{id:"function-to-btc"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#function-to-btc"}},[t._v("#")]),t._v(" Function: to_btc")]),t._v(" "),_("p",[_("code",[t._v("to_btc(v NUMERIC)")])]),t._v(" "),_("p",[t._v("Helper function format a satoshi based value into numeric bitcoin.")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" to_btc"),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("150000000")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("div",{staticClass:"language- extra-class"},[_("pre",{pre:!0,attrs:{class:"language-text"}},[_("code",[t._v("1.50000000\n")])])]),_("h3",{attrs:{id:"function-get-wallets-recent"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#function-get-wallets-recent"}},[t._v("#")]),t._v(" Function: get_wallets_recent")]),t._v(" "),_("p",[_("code",[t._v("get_wallets_recent(in_wallet_id TEXT, in_interval INTERVAL, in_limit INT, in_offset INT)")])]),t._v(" "),_("p",[_("code",[t._v("get_wallets_recent(in_wallet_id TEXT, in_code TEXT, in_interval INTERVAL, in_limit INT, in_offset INT)")])]),t._v(" "),_("p",[t._v("See what has going on recently in a wallet.")]),t._v(" "),_("p",[t._v("Better to use on Postgres 13+, as it greatly benefits from incremental sort.")]),t._v(" "),_("p",[t._v("For example, this returns the "),_("code",[t._v("5")]),t._v(" most recent "),_("code",[t._v("KPrAFh3ZOIS5umpbwuYkU0sF8JW+")]),t._v(" that happened for one year.")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" get_wallets_recent"),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'KPrAFh3ZOIS5umpbwuYkU0sF8JW+'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interval")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'1 year'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v('"code"')]),t._v(" "),_("th",[t._v('"asset_id"')]),t._v(" "),_("th",[t._v('"tx_id"')]),t._v(" "),_("th",[t._v('"seen_at"')]),t._v(" "),_("th",[t._v('"balance_change"')]),t._v(" "),_("th",[t._v('"balance_total"')])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"0e42124df086ef05b0d8cb3a5b2028828b3af27b31d7c5045803cc8541410a9f"')]),t._v(" "),_("td",[t._v('"2022-03-07 17:14:27.269382+00"')]),t._v(" "),_("td",[t._v("-199996.0")]),t._v(" "),_("td",[t._v("55020")])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"529d92bcdba7545befa4b1101256544def3ca9726ebbe4a6bd8122d7762129a2"')]),t._v(" "),_("td",[t._v('"2022-03-06 21:15:48.505111+00"')]),t._v(" "),_("td",[t._v("-229995.0")]),t._v(" "),_("td",[t._v("255016")])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"e9ce704adc9c64e099c2513169d6856bbf2fcdb2de92b465d4d63b67961b2bd2"')]),t._v(" "),_("td",[t._v('"2022-03-04 15:07:08.923081+00"')]),t._v(" "),_("td",[t._v("200000")]),t._v(" "),_("td",[t._v("485011")])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"0581c1545ce58ecf93d70e97321fa27c7d409bb0666a124470491403cb0d91f4"')]),t._v(" "),_("td",[t._v('"2022-03-03 10:59:44.259948+00"')]),t._v(" "),_("td",[t._v("230000")]),t._v(" "),_("td",[t._v("285011")])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"c12d1339295d6a69af8dc0fb411b67d5571d31265b385586341a4126bcda76da"')]),t._v(" "),_("td",[t._v('"2022-02-22 17:00:02.697965+00"')]),t._v(" "),_("td",[t._v("-519989.0")]),t._v(" "),_("td",[t._v("55011")])])])]),t._v(" "),_("h3",{attrs:{id:"view-utxos"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#view-utxos"}},[t._v("#")]),t._v(" View: utxos")]),t._v(" "),_("p",[t._v("List all the UTXOs available:")]),t._v(" "),_("p",[_("strong",[t._v("Warning")]),t._v(": It also returns the UTXO that are confirmed but spent in the mempool, as well as immature utxos and utxos that are being double spent.")]),t._v(" "),_("p",[t._v("If you want the available UTXOs which can be spent use "),_("code",[t._v("WHERE input_mempool IS FALSE AND immature IS FALSE")]),t._v(".")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" utxos\n"),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WHERE")]),t._v(" input_mempool "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("IS")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("FALSE")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("AND")]),t._v("\n immature "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("IS")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("FALSE")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v('"code"')]),t._v(" "),_("th",[t._v('"tx_id"')]),t._v(" "),_("th",[t._v('"idx"')]),t._v(" "),_("th",[t._v('"script"')]),t._v(" "),_("th",[t._v('"value"')]),t._v(" "),_("th",[t._v('"asset_id"')]),t._v(" "),_("th",[t._v('"input_tx_id"')]),t._v(" "),_("th",[t._v('"input_idx"')]),t._v(" "),_("th",[t._v('"input_mempool"')]),t._v(" "),_("th",[t._v('"immature"')]),t._v(" "),_("th",[t._v('"blk_id"')]),t._v(" "),_("th",[t._v('"blk_idx"')]),t._v(" "),_("th",[t._v('"blk_height"')]),t._v(" "),_("th",[t._v('"mempool"')]),t._v(" "),_("th",[t._v('"replaced_by"')]),t._v(" "),_("th",[t._v('"seen_at"')])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"6bf5a95c11c819ff22da3933bef2931977b4906c5820bb48ab5336a77502e4a6"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"00144d60ec59ed28267bf897543a659662cddabd384b"')]),t._v(" "),_("td",[t._v("19490")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"0000010e1bc83fa20421880db7424740392a459c6ac699cefe7eac5004247e46"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("58943")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-08 14:25:17.96779+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"6c43019cb584391a766b1c7d5c67f09174d98b4306edeedf8586c8fdbf1048d6"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"0014f8a89fd6d6d256df24e05b01cade70d2abcdb6f6"')]),t._v(" "),_("td",[t._v("113872")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"00000088cb1683d609054866ff72131af46dd7f6ee51136fdc2184f5ad1bbbf6"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("58502")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-05 10:21:39.483849+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"1457ce82a3eb87a8982429e5185896ddee09c773519fa198de3bba4d6c9b42b7"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"0014002ca9212872715f0a5789d52084a9daecb5dce7"')]),t._v(" "),_("td",[t._v("3899577")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"000001090d8f4c50c77021026d5ec5fbe2072cb95a1f5592635f70dfc30297d0"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("59348")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-11 12:30:12.008471+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"75b7ba9a0718a95234e0b72edd2c721f3066be96eb8076f5b8f3f7160498d07f"')]),t._v(" "),_("td",[t._v("1")]),t._v(" "),_("td",[t._v('"0014ca76914ddc4fca3c37768e599302765ae633b62c"')]),t._v(" "),_("td",[t._v("119727")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"0000009d64990b4a2b4bff9511d5c9713124905a0932026db5737a3ad44f0138"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("60492")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-19 10:08:54.301111+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"9fc4bc1b9dc2d60202fe4e483b54afb5da7efbbfe6966e5e51f4dc6dbc2363b5"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"0014ad054e107c046e69b5ab5abc1e44d25ac9378ff6"')]),t._v(" "),_("td",[t._v("9900")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"0000010003e91e0f56787b9e02b5ae424bb681f09f2ec82f8e23b19a7a93b6e6"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("53506")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-09-01 02:13:21.469658+00"')])])])]),t._v(" "),_("h3",{attrs:{id:"view-descriptors-scripts-unused"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#view-descriptors-scripts-unused"}},[t._v("#")]),t._v(" View: descriptors_scripts_unused")]),t._v(" "),_("p",[t._v("List all the unused scripts from descriptors.")]),t._v(" "),_("p",[t._v("Example: Get the next unused address:")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" descriptors_scripts_unused\n"),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WHERE")]),t._v(" code"),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'BTC'")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("AND")]),t._v(" descriptor"),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'7obopunl9/6GVYkej++YMw6DHWXk'")]),t._v("\n"),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ORDER")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("BY")]),t._v(" idx "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("LIMIT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("OFFSET")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v("code")]),t._v(" "),_("th",[t._v("descriptor")]),t._v(" "),_("th",[t._v("script")]),t._v(" "),_("th",[t._v("idx")]),t._v(" "),_("th",[t._v("addr")]),t._v(" "),_("th",[t._v("d_metadata")]),t._v(" "),_("th",[t._v("ds_metadata")])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v("BTC")]),t._v(" "),_("td",[t._v("7obopunl9/6GVYkej++YMw6DHWXk")]),t._v(" "),_("td",[t._v("001482137a4bbc144f8eb5a02fd2acda36c999a96242")]),t._v(" "),_("td",[t._v("3261")]),t._v(" "),_("td",[t._v("tb1qsgfh5jauz38caddq9lf2ek3kexv6jcjzxu9sfw")]),t._v(" "),_("td",[t._v('{"type": "NBXv1-Derivation", "feature": "Deposit", "derivation": "tpubDCtUtuEgpKLQJMu5uUUuDQub7D4CHjCJsfGhwrA3HV6X6CuV7Zj6RizRFwLPNKqkLrd8TM1Xt3QmwumqRRZAUTrVAA9T8uhyMfodChhFykD", "keyPathTemplate": "0/*"}')]),t._v(" "),_("td")])])]),t._v(" "),_("h3",{attrs:{id:"view-wallets-utxos"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#view-wallets-utxos"}},[t._v("#")]),t._v(" View: wallets_utxos")]),t._v(" "),_("p",[t._v("List all the wallets UTXOs available:")]),t._v(" "),_("p",[_("strong",[t._v("Warning")]),t._v(": It also returns the UTXO that are confirmed but spent in the mempool, as well as immature utxos and utxos that are being double spent.")]),t._v(" "),_("p",[t._v("If you want the available UTXOs which can be spent use "),_("code",[t._v("WHERE input_mempool IS FALSE AND immature IS FALSE")]),t._v(".")]),t._v(" "),_("p",[t._v("Also, keep in mind that if an UTXO belong to two wallets, then you will see two entries for this UTXO.")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" wallets_utxos\n"),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WHERE")]),t._v(" input_mempool "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("IS")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("FALSE")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("AND")]),t._v("\n immature "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("IS")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token boolean"}},[t._v("FALSE")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v('"wallet_id"')]),t._v(" "),_("th",[t._v('"code"')]),t._v(" "),_("th",[t._v('"tx_id"')]),t._v(" "),_("th",[t._v('"idx"')]),t._v(" "),_("th",[t._v('"script"')]),t._v(" "),_("th",[t._v('"value"')]),t._v(" "),_("th",[t._v('"asset_id"')]),t._v(" "),_("th",[t._v('"input_tx_id"')]),t._v(" "),_("th",[t._v('"input_idx"')]),t._v(" "),_("th",[t._v('"input_mempool"')]),t._v(" "),_("th",[t._v('"immature"')]),t._v(" "),_("th",[t._v('"blk_id"')]),t._v(" "),_("th",[t._v('"blk_idx"')]),t._v(" "),_("th",[t._v('"blk_height"')]),t._v(" "),_("th",[t._v('"mempool"')]),t._v(" "),_("th",[t._v('"replaced_by"')]),t._v(" "),_("th",[t._v('"seen_at"')])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v('"XObUaAdU2HBJk4XHGhIRya3ZObB3"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"6bf5a95c11c819ff22da3933bef2931977b4906c5820bb48ab5336a77502e4a6"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"00144d60ec59ed28267bf897543a659662cddabd384b"')]),t._v(" "),_("td",[t._v("19490")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"0000010e1bc83fa20421880db7424740392a459c6ac699cefe7eac5004247e46"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("58943")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-08 14:25:17.96779+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"XObUaAdU2HBJk4XHGhIRya3ZObB3"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"6c43019cb584391a766b1c7d5c67f09174d98b4306edeedf8586c8fdbf1048d6"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"0014f8a89fd6d6d256df24e05b01cade70d2abcdb6f6"')]),t._v(" "),_("td",[t._v("113872")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"00000088cb1683d609054866ff72131af46dd7f6ee51136fdc2184f5ad1bbbf6"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("58502")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-05 10:21:39.483849+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"ZDP5CJ1pOWLITR1API3aJkEpdQz+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"1457ce82a3eb87a8982429e5185896ddee09c773519fa198de3bba4d6c9b42b7"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"0014002ca9212872715f0a5789d52084a9daecb5dce7"')]),t._v(" "),_("td",[t._v("3899577")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"000001090d8f4c50c77021026d5ec5fbe2072cb95a1f5592635f70dfc30297d0"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("59348")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-11 12:30:12.008471+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"ZDP5CJ1pOWLITR1API3aJkEpdQz+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"75b7ba9a0718a95234e0b72edd2c721f3066be96eb8076f5b8f3f7160498d07f"')]),t._v(" "),_("td",[t._v("1")]),t._v(" "),_("td",[t._v('"0014ca76914ddc4fca3c37768e599302765ae633b62c"')]),t._v(" "),_("td",[t._v("119727")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"0000009d64990b4a2b4bff9511d5c9713124905a0932026db5737a3ad44f0138"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("60492")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-19 10:08:54.301111+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"ZDP5CJ1pOWLITR1API3aJkEpdQz+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"9fc4bc1b9dc2d60202fe4e483b54afb5da7efbbfe6966e5e51f4dc6dbc2363b5"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"0014ad054e107c046e69b5ab5abc1e44d25ac9378ff6"')]),t._v(" "),_("td",[t._v("9900")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"0000010003e91e0f56787b9e02b5ae424bb681f09f2ec82f8e23b19a7a93b6e6"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("53506")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-09-01 02:13:21.469658+00"')])]),t._v(" "),_("tr",[_("td",[t._v('"ZDP5CJ1pOWLITR1API3aJkEpdQz+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('"fec5c75b87378068f1d7d3276e90b2579e5fad8854a7002e14c275f3da9823be"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v('"00145674d00638e0da30ae216df4bb539e94cd2d13d1"')]),t._v(" "),_("td",[t._v("1168447")]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v('"000000b43e91de514fec8f9fc418ecb1e0a2b1d14027b01abaad9d4e39e19e8d"')]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v("60590")]),t._v(" "),_("td",[t._v("False")]),t._v(" "),_("td",[t._v("NULL")]),t._v(" "),_("td",[t._v('"2021-10-20 02:18:16.980641+00"')])])])]),t._v(" "),_("h3",{attrs:{id:"view-wallets-balances"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#view-wallets-balances"}},[t._v("#")]),t._v(" View: wallets_balances")]),t._v(" "),_("p",[t._v("See the current balance of wallets.")]),t._v(" "),_("ul",[_("li",[_("code",[t._v("confirmed_balance")]),t._v(" only include the sum of value of all currently confirmed UTXOs.")]),t._v(" "),_("li",[_("code",[t._v("unconfirmed_balance")]),t._v(" will become the next "),_("code",[t._v("confirmed_balance")]),t._v(" of the wallet if all non-double spent transactions get confirmed.")]),t._v(" "),_("li",[_("code",[t._v("immature_balance")]),t._v(" the sum of utxos that can't be spent before they are immature (ie, the UTXO comes from a coinbase that is less than 100 blocks old)")]),t._v(" "),_("li",[_("code",[t._v("available_balance")]),t._v(" is the balance that can be spent. ("),_("code",[t._v("unconfirmed_balance")]),t._v(" - "),_("code",[t._v("immature_balance")]),t._v(")")])]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" wallets_balances\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v('"wallet_id"')]),t._v(" "),_("th",[t._v('"code"')]),t._v(" "),_("th",[t._v('"asset_id"')]),t._v(" "),_("th",[t._v('"unconfirmed_balance"')]),t._v(" "),_("th",[t._v('"confirmed_balance"')]),t._v(" "),_("th",[t._v('"available_balance"')]),t._v(" "),_("th",[t._v('"immature_balance"')])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v('"4Tdfhh5kK8TFKcDVvsp6xdKOFdmA"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("389520")]),t._v(" "),_("td",[t._v("389520")]),t._v(" "),_("td",[t._v("389520")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"7ERM4iRjhk1gmeyHxEJQp0fhzh8z"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("420000000")]),t._v(" "),_("td",[t._v("420000000")]),t._v(" "),_("td",[t._v("420000000")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"IIKKVY87qBLjbaa/KAfUfcNP9HeC"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("100000")]),t._v(" "),_("td",[t._v("100000")]),t._v(" "),_("td",[t._v("100000")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("55020")]),t._v(" "),_("td",[t._v("55020")]),t._v(" "),_("td",[t._v("55020")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"Q+z/7E0DCjazcm5Q7t9wZSoEJ0IP"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("200000")]),t._v(" "),_("td",[t._v("200000")]),t._v(" "),_("td",[t._v("200000")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"XObUaAdU2HBJk4XHGhIRya3ZObB3"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("133362")]),t._v(" "),_("td",[t._v("133362")]),t._v(" "),_("td",[t._v("133362")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"ZDP5CJ1pOWLITR1API3aJkEpdQz+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v("5197651")]),t._v(" "),_("td",[t._v("5197651")]),t._v(" "),_("td",[t._v("5197651")]),t._v(" "),_("td",[t._v("0")])])])]),t._v(" "),_("h3",{attrs:{id:"materialized-view-wallets-history"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#materialized-view-wallets-history"}},[t._v("#")]),t._v(" Materialized view: wallets_history")]),t._v(" "),_("p",[t._v("Provide an history of wallets (time ordered list of wallet_id, code, asset_id, balance-change, total-balance), it only takes into account confirmed transactions.")]),t._v(" "),_("p",[t._v("This materialized view is intensive to refresh (for 220K transactions, it takes around 5 seconds)")]),t._v(" "),_("p",[t._v("This is meant to be used for reports and histograms.\nIf you want the latest history of a wallet, use "),_("code",[t._v("get_wallets_recent")]),t._v(" instead.")]),t._v(" "),_("p",[t._v("To refresh the materialized view, use "),_("code",[t._v("SELECT wallets_history_refresh();")]),t._v(". This will return "),_("code",[t._v("true")]),t._v(" if the view has been refreshed.")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" wallets_history "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WHERE")]),t._v(" wallet_id"),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'KPrAFh3ZOIS5umpbwuYkU0sF8JW+'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v('"wallet_id"')]),t._v(" "),_("th",[t._v('"code"')]),t._v(" "),_("th",[t._v('"asset_id"')]),t._v(" "),_("th",[t._v('"tx_id"')]),t._v(" "),_("th",[t._v('"seen_at"')]),t._v(" "),_("th",[t._v('"balance_change"')]),t._v(" "),_("th",[t._v('"balance_total"')]),t._v(" "),_("th",[t._v('"nth"')])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"0e42124df086ef05b0d8cb3a5b2028828b3af27b31d7c5045803cc8541410a9f"')]),t._v(" "),_("td",[t._v('"2022-03-07 17:14:27.269382+00"')]),t._v(" "),_("td",[t._v("-199996")]),t._v(" "),_("td",[t._v("55020")]),t._v(" "),_("td",[t._v("10")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"529d92bcdba7545befa4b1101256544def3ca9726ebbe4a6bd8122d7762129a2"')]),t._v(" "),_("td",[t._v('"2022-03-06 21:15:48.505111+00"')]),t._v(" "),_("td",[t._v("-229995")]),t._v(" "),_("td",[t._v("255016")]),t._v(" "),_("td",[t._v("9")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"e9ce704adc9c64e099c2513169d6856bbf2fcdb2de92b465d4d63b67961b2bd2"')]),t._v(" "),_("td",[t._v('"2022-03-04 15:07:08.923081+00"')]),t._v(" "),_("td",[t._v("200000")]),t._v(" "),_("td",[t._v("485011")]),t._v(" "),_("td",[t._v("8")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"0581c1545ce58ecf93d70e97321fa27c7d409bb0666a124470491403cb0d91f4"')]),t._v(" "),_("td",[t._v('"2022-03-03 10:59:44.259948+00"')]),t._v(" "),_("td",[t._v("230000")]),t._v(" "),_("td",[t._v("285011")]),t._v(" "),_("td",[t._v("7")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"c12d1339295d6a69af8dc0fb411b67d5571d31265b385586341a4126bcda76da"')]),t._v(" "),_("td",[t._v('"2022-02-22 17:00:02.697965+00"')]),t._v(" "),_("td",[t._v("-519989")]),t._v(" "),_("td",[t._v("55011")]),t._v(" "),_("td",[t._v("6")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"081466d46632b56d28260b928fea87addeed24cfd25e3d6504b5ddfacf6176e1"')]),t._v(" "),_("td",[t._v('"2022-02-04 10:42:31.059182+00"')]),t._v(" "),_("td",[t._v("310000")]),t._v(" "),_("td",[t._v("575000")]),t._v(" "),_("td",[t._v("5")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"f0165974071064b32122449dbf72a67ab884723923e8536efb5cf4301bcb7469"')]),t._v(" "),_("td",[t._v('"2022-02-04 10:22:04.47652+00"')]),t._v(" "),_("td",[t._v("164000")]),t._v(" "),_("td",[t._v("265000")]),t._v(" "),_("td",[t._v("4")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"a4e165729e5fb406d878b3c9c8dfabd1a3465084c2c2b63602fd8704c41442ac"')]),t._v(" "),_("td",[t._v('"2022-02-04 09:40:00.427892+00"')]),t._v(" "),_("td",[t._v("101000")]),t._v(" "),_("td",[t._v("101000")]),t._v(" "),_("td",[t._v("3")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"61247ae11a770963ffa26a63bb4ac03a14f759f7691eda8ce10175db6b6aaa77"')]),t._v(" "),_("td",[t._v('"2021-10-11 13:09:22.977488+00"')]),t._v(" "),_("td",[t._v("-850000")]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v("2")])]),t._v(" "),_("tr",[_("td",[t._v('"KPrAFh3ZOIS5umpbwuYkU0sF8JW+"')]),t._v(" "),_("td",[t._v('"BTC"')]),t._v(" "),_("td",[t._v('""')]),t._v(" "),_("td",[t._v('"6bf5a95c11c819ff22da3933bef2931977b4906c5820bb48ab5336a77502e4a6"')]),t._v(" "),_("td",[t._v('"2021-10-08 14:25:17.96779+00"')]),t._v(" "),_("td",[t._v("850000")]),t._v(" "),_("td",[t._v("850000")]),t._v(" "),_("td",[t._v("1")])])])]),t._v(" "),_("h3",{attrs:{id:"function-get-wallets-histogram"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#function-get-wallets-histogram"}},[t._v("#")]),t._v(" Function: get_wallets_histogram")]),t._v(" "),_("p",[_("code",[t._v("get_wallets_histogram(in_wallet_id TEXT, in_code TEXT, in_asset_id TEXT, in_from TIMESTAMPTZ, in_to TIMESTAMPTZ, in_interval INTERVAL)")])]),t._v(" "),_("p",[t._v("This function depends on "),_("code",[t._v("wallets_history")]),t._v(", as such, you should make sure the materialized view is refreshed time for up-to-date histogram.")]),t._v(" "),_("p",[t._v("For example, this will show how the balance of "),_("code",[t._v("KPrAFh3ZOIS5umpbwuYkU0sF8JW+")]),t._v(" changed every week from "),_("code",[t._v("2022-01-23")]),t._v(" to now.")]),t._v(" "),_("div",{staticClass:"language-SQL extra-class"},[_("pre",{pre:!0,attrs:{class:"language-sql"}},[_("code",[_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("SELECT")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token operator"}},[t._v("*")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("FROM")]),t._v(" get_wallets_histogram"),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'KPrAFh3ZOIS5umpbwuYkU0sF8JW+'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'BTC'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("''")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2022-01-23'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("CURRENT_TIMESTAMP")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("interval")]),t._v(" "),_("span",{pre:!0,attrs:{class:"token string"}},[t._v("'1 week'")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),_("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),_("p",[t._v("Output:")]),t._v(" "),_("table",[_("thead",[_("tr",[_("th",[t._v('"date"')]),t._v(" "),_("th",[t._v('"balance_change"')]),t._v(" "),_("th",[t._v('"balance"')])])]),t._v(" "),_("tbody",[_("tr",[_("td",[t._v('"2022-01-23 00:00:00+00"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v("0")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-01-30 00:00:00+00"')]),t._v(" "),_("td",[t._v("575000")]),t._v(" "),_("td",[t._v("575000")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-02-06 00:00:00+00"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v("575000")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-02-13 00:00:00+00"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v("575000")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-02-20 00:00:00+00"')]),t._v(" "),_("td",[t._v("-519989")]),t._v(" "),_("td",[t._v("55011")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-02-27 00:00:00+00"')]),t._v(" "),_("td",[t._v("430000")]),t._v(" "),_("td",[t._v("485011")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-03-06 00:00:00+00"')]),t._v(" "),_("td",[t._v("-429991")]),t._v(" "),_("td",[t._v("55020")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-03-13 00:00:00+00"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v("55020")])]),t._v(" "),_("tr",[_("td",[t._v('"2022-03-20 00:00:00+00"')]),t._v(" "),_("td",[t._v("0")]),t._v(" "),_("td",[t._v("55020")])])])]),t._v(" "),_("h3",{attrs:{id:"function-nbxv1-get-wallet-id"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#function-nbxv1-get-wallet-id"}},[t._v("#")]),t._v(" Function: nbxv1_get_wallet_id")]),t._v(" "),_("p",[_("code",[t._v("nbxv1_get_wallet_id(in_code TEXT, in_scheme_or_address TEXT) RETURNS TEXT")])]),t._v(" "),_("p",[t._v("This function is specific to the current API of NBXplorer. It calculates the "),_("code",[t._v("wallet_id")]),t._v(" based on the chain code (ie. "),_("code",[t._v("BTC")]),t._v(") and an address or derivation scheme.")]),t._v(" "),_("h3",{attrs:{id:"function-nbxv1-get-descriptor-id"}},[_("a",{staticClass:"header-anchor",attrs:{href:"#function-nbxv1-get-descriptor-id"}},[t._v("#")]),t._v(" Function: nbxv1_get_descriptor_id")]),t._v(" "),_("p",[_("code",[t._v("nbxv1_get_descriptor_id(in_code TEXT, in_scheme TEXT, in_feature TEXT) RETURNS TEXT")])]),t._v(" "),_("p",[t._v("This function is specific to the current API of NBXplorer. It calculates the "),_("code",[t._v("descriptor_id")]),t._v(" based on the chain code (ie. "),_("code",[t._v("BTC")]),t._v("), a derivation scheme, and the feature (ie. "),_("code",[t._v("Deposit")]),t._v(" or "),_("code",[t._v("Change")]),t._v(").")])])}),[],!1,null,null,null);_.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/92.1627dffa.js b/assets/js/92.2d1f820a.js similarity index 98% rename from assets/js/92.1627dffa.js rename to assets/js/92.2d1f820a.js index 2d7f56432f..8d2c20117f 100644 --- a/assets/js/92.1627dffa.js +++ b/assets/js/92.2d1f820a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[92],{560:function(e,t,a){e.exports=a.p+"assets/img/batch-payouts.75d71d03.jpg"},871:function(e,t,a){"use strict";a.r(t);var s=a(17),o=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"payouts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payouts"}},[e._v("#")]),e._v(" Payouts")]),e._v(" "),t("p",[e._v("The payout functionality is tied into the "),t("RouterLink",{attrs:{to:"/PullPayments/"}},[e._v("Pull Payments")]),e._v(". This feature allows you to create payouts within your BTCPay.\nThis feature allows you to process pull payment (refunds, salary payouts, or withdrawals).")],1),e._v(" "),t("h2",{attrs:{id:"how-does-it-work"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-it-work"}},[e._v("#")]),e._v(" How does it work?")]),e._v(" "),t("p",[e._v("We will go through two examples, one will be a Refund, and the other will be a salary payout.")]),e._v(" "),t("h3",{attrs:{id:"example"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example"}},[e._v("#")]),e._v(" Example")]),e._v(" "),t("p",[e._v("Let's start with the refund example.\nThe customer has bought an item in your store but sadly has to return the item. They want a refund.\nWithin BTCPay, you can create a "),t("RouterLink",{attrs:{to:"/Refund/"}},[e._v("Refund")]),e._v(" and provide the customer with the link to claim their funds.\nWhenever the customer has given their address and claimed the funds, it will be shown in the "),t("code",[e._v("Payouts")]),e._v(".")],1),e._v(" "),t("p",[e._v("The first status it has is "),t("code",[e._v("Awaiting Approval")]),e._v(".\nStore clerks can check if multiple ones are waiting, and after making the selection, you use the "),t("code",[e._v("Actions")]),e._v(" button.")]),e._v(" "),t("p",[e._v("Options on the action button")]),e._v(" "),t("ul",[t("li",[e._v("Approve selected payouts")]),e._v(" "),t("li",[e._v("Approve & send selected payouts")]),e._v(" "),t("li",[e._v("Cancel selected payouts")])]),e._v(" "),t("p",[e._v("The next step is to "),t("code",[e._v("Approve & send selected payouts")]),e._v(" as we want to refund the customer.\nCheck the Customer's Address, shows the amount and if we want fees to be subtracted from the refund or not.\nOnce you've done the checks, only signing the transaction is left.")]),e._v(" "),t("p",[e._v("The customer now gets updated on the Claiming page. He can follow the transaction as he's provided with a link to a block explorer and his transaction.\nOnce the transaction has been confirmed, and the status changes to Completed.")]),e._v(" "),t("p",[e._v("Now let's get into Salary payout, as this is driven from inside the store and not per the Customer's request.\nThe underlying is the same; it uses the Pull payments. But instead of creating a refund, we will make a "),t("RouterLink",{attrs:{to:"/PullPayments/"}},[e._v("Pull Payment")]),e._v(".")],1),e._v(" "),t("p",[e._v("Goto the "),t("code",[e._v("Pull Payments")]),e._v(" tab in your BTCPay server.\nIn the top right, click the "),t("code",[e._v("Create Pull Payment")]),e._v(" Button.")]),e._v(" "),t("p",[e._v("Now we are in the creation of the Payout, give it a name and the desired amount in desired currency, fill out the Description, so the employee knows what it's about.\nThe next portion is similar to refunds. The employee fills out the Destination address and the amount he wants to claim from this Payout. He might decide to make it 2 separate claims, to different addresses, or even partly claim over lightning.")]),e._v(" "),t("p",[e._v("If there are multiple waiting Payouts, you can batch these to be signed and sent out. Once signed, the payouts move to the "),t("code",[e._v("In progress")]),e._v(" tab and show the Transaction.\nWhen accepted by the network, the payout moves to the Completed tab.\nThe completed tab is purely for historical purposes. It holds the processed Payouts and the transaction that belongs to it.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(560),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})]),e._v(" "),t("h2",{attrs:{id:"using-greenfield-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-greenfield-api"}},[e._v("#")]),e._v(" Using Greenfield API")]),e._v(" "),t("p",[e._v("As described in the "),t("RouterLink",{attrs:{to:"/PullPayments/#greenfield-api"}},[e._v("Pull Payments")]),e._v(" Greenfield API allows for broader use of "),t("code",[e._v("Pull Payments")]),e._v(".\nThe payout request will always go to the Payouts tab in your BTCPay server whenever the concept is used.\nBy using the Greenfield API you could automate these requests, a future release of BTCPay server presumably will have automation options for payouts.")],1)])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[92],{560:function(e,t,a){e.exports=a.p+"assets/img/batch-payouts.75d71d03.jpg"},870:function(e,t,a){"use strict";a.r(t);var s=a(17),o=Object(s.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"payouts"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#payouts"}},[e._v("#")]),e._v(" Payouts")]),e._v(" "),t("p",[e._v("The payout functionality is tied into the "),t("RouterLink",{attrs:{to:"/PullPayments/"}},[e._v("Pull Payments")]),e._v(". This feature allows you to create payouts within your BTCPay.\nThis feature allows you to process pull payment (refunds, salary payouts, or withdrawals).")],1),e._v(" "),t("h2",{attrs:{id:"how-does-it-work"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-it-work"}},[e._v("#")]),e._v(" How does it work?")]),e._v(" "),t("p",[e._v("We will go through two examples, one will be a Refund, and the other will be a salary payout.")]),e._v(" "),t("h3",{attrs:{id:"example"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#example"}},[e._v("#")]),e._v(" Example")]),e._v(" "),t("p",[e._v("Let's start with the refund example.\nThe customer has bought an item in your store but sadly has to return the item. They want a refund.\nWithin BTCPay, you can create a "),t("RouterLink",{attrs:{to:"/Refund/"}},[e._v("Refund")]),e._v(" and provide the customer with the link to claim their funds.\nWhenever the customer has given their address and claimed the funds, it will be shown in the "),t("code",[e._v("Payouts")]),e._v(".")],1),e._v(" "),t("p",[e._v("The first status it has is "),t("code",[e._v("Awaiting Approval")]),e._v(".\nStore clerks can check if multiple ones are waiting, and after making the selection, you use the "),t("code",[e._v("Actions")]),e._v(" button.")]),e._v(" "),t("p",[e._v("Options on the action button")]),e._v(" "),t("ul",[t("li",[e._v("Approve selected payouts")]),e._v(" "),t("li",[e._v("Approve & send selected payouts")]),e._v(" "),t("li",[e._v("Cancel selected payouts")])]),e._v(" "),t("p",[e._v("The next step is to "),t("code",[e._v("Approve & send selected payouts")]),e._v(" as we want to refund the customer.\nCheck the Customer's Address, shows the amount and if we want fees to be subtracted from the refund or not.\nOnce you've done the checks, only signing the transaction is left.")]),e._v(" "),t("p",[e._v("The customer now gets updated on the Claiming page. He can follow the transaction as he's provided with a link to a block explorer and his transaction.\nOnce the transaction has been confirmed, and the status changes to Completed.")]),e._v(" "),t("p",[e._v("Now let's get into Salary payout, as this is driven from inside the store and not per the Customer's request.\nThe underlying is the same; it uses the Pull payments. But instead of creating a refund, we will make a "),t("RouterLink",{attrs:{to:"/PullPayments/"}},[e._v("Pull Payment")]),e._v(".")],1),e._v(" "),t("p",[e._v("Goto the "),t("code",[e._v("Pull Payments")]),e._v(" tab in your BTCPay server.\nIn the top right, click the "),t("code",[e._v("Create Pull Payment")]),e._v(" Button.")]),e._v(" "),t("p",[e._v("Now we are in the creation of the Payout, give it a name and the desired amount in desired currency, fill out the Description, so the employee knows what it's about.\nThe next portion is similar to refunds. The employee fills out the Destination address and the amount he wants to claim from this Payout. He might decide to make it 2 separate claims, to different addresses, or even partly claim over lightning.")]),e._v(" "),t("p",[e._v("If there are multiple waiting Payouts, you can batch these to be signed and sent out. Once signed, the payouts move to the "),t("code",[e._v("In progress")]),e._v(" tab and show the Transaction.\nWhen accepted by the network, the payout moves to the Completed tab.\nThe completed tab is purely for historical purposes. It holds the processed Payouts and the transaction that belongs to it.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(560),alt:"BTCPay Server Payouts tab",title:"BTCPay Server Payouts tab"}})]),e._v(" "),t("h2",{attrs:{id:"using-greenfield-api"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#using-greenfield-api"}},[e._v("#")]),e._v(" Using Greenfield API")]),e._v(" "),t("p",[e._v("As described in the "),t("RouterLink",{attrs:{to:"/PullPayments/#greenfield-api"}},[e._v("Pull Payments")]),e._v(" Greenfield API allows for broader use of "),t("code",[e._v("Pull Payments")]),e._v(".\nThe payout request will always go to the Payouts tab in your BTCPay server whenever the concept is used.\nBy using the Greenfield API you could automate these requests, a future release of BTCPay server presumably will have automation options for payouts.")],1)])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/94.15ec39a3.js b/assets/js/94.9963b739.js similarity index 99% rename from assets/js/94.15ec39a3.js rename to assets/js/94.9963b739.js index 5bb4818399..46efb73ed1 100644 --- a/assets/js/94.15ec39a3.js +++ b/assets/js/94.9963b739.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[94],{646:function(e,t,r){e.exports=r.p+"assets/img/BTCPayUseCasev2-1.3b5b3052.png"},895:function(e,t,r){"use strict";r.r(t);var a=r(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"who-can-use-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#who-can-use-btcpay-server"}},[e._v("#")]),e._v(" Who can use BTCPay Server?")]),e._v(" "),t("p",[e._v("The versatility and flexibility of BTCPay Server attract different types of users. "),t("strong",[e._v("Anyone")]),e._v(" can use BTCPay Server.")]),e._v(" "),t("p",[e._v("We're ensuring an open future for businesses and individuals regardless of geographic, political or financial barriers.")]),e._v(" "),t("p",[e._v("Below are the most common use cases for BTCPay Server:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Merchants")]),e._v(" who sell products and services online or in person")]),e._v(" "),t("li",[e._v("Self-sovereign "),t("strong",[e._v("individuals")]),e._v(" wanting to protect their wealth and manage their funds and full bitcoin node")]),e._v(" "),t("li",[t("strong",[e._v("Charities and non-profits")]),e._v(" looking to accept donations or crowdfund their dream project")]),e._v(" "),t("li",[t("strong",[e._v("Developers")]),e._v(" building on top of bitcoin and bleeding-edge payment infrastructure")]),e._v(" "),t("li",[e._v("Members of "),t("strong",[e._v("local communities")]),e._v(" willing to onboard people to their BTCPay instance and offer payment processing as a service or for free, creating a circular economy.")]),e._v(" "),t("li",[t("strong",[e._v("Exchanges")]),e._v(" offering instant conversions for the users of BTCPay Server")]),e._v(" "),t("li",[t("strong",[e._v("Hosting providers")]),e._v(" offering BTCPay as a cloud service or ready-to-use hardware.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(646),alt:"BTCPay UseCase Infographic",title:"BTCPay UseCase Infographic"}})]),e._v(" "),t("p",[e._v("The software usage is by no means limited to the groups of users mentioned in this document.")]),e._v(" "),t("h2",{attrs:{id:"merchants"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#merchants"}},[e._v("#")]),e._v(" Merchants")]),e._v(" "),t("p",[e._v("Merchants accepting bitcoin payments online or in person are the primary user group of a BTCPay Server.")]),e._v(" "),t("p",[e._v("By choosing BTCPay Server to process payments, merchants are:")]),e._v(" "),t("ul",[t("li",[e._v("Saving money (BTCPay is free with no fees or subscriptions)")]),e._v(" "),t("li",[e._v("Cutting out the middle-man (If self-hosted payments go directly to their wallet)")]),e._v(" "),t("li",[e._v("Enhancing privacy for their customers (no address re-use, no information leaks to the third party servers if they're self-hosting BTCPay Server)")]),e._v(" "),t("li",[e._v("Saving time (easy integration with popular e-commerce platforms)")]),e._v(" "),t("li",[e._v("Protecting themselves from interference in their business (self-sovereignty)")])]),e._v(" "),t("h3",{attrs:{id:"online-stores"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#online-stores"}},[e._v("#")]),e._v(" Online stores")]),e._v(" "),t("p",[e._v("Merchants selling goods or services over the internet, usually pick an online e-commerce plugin we offer for multiple popular e-commerce platforms "),t("RouterLink",{attrs:{to:"/WooCommerce/"}},[e._v("WooCommerce")]),e._v(", "),t("RouterLink",{attrs:{to:"/Shopify/"}},[e._v("Shopify")]),e._v(", "),t("RouterLink",{attrs:{to:"/PrestaShop/"}},[e._v("PrestaShop")]),e._v(", "),t("RouterLink",{attrs:{to:"/Magento/"}},[e._v("Magento")]),e._v(" "),t("RouterLink",{attrs:{to:"/Drupal/"}},[e._v("Drupal")]),e._v(", "),t("a",{attrs:{href:"https://github.com/lampsolutions/LampSBtcPayShopware",target:"_blank",rel:"noopener noreferrer"}},[e._v("Shopaware"),t("OutboundLink")],1),e._v(" or other. Install a plugin for the CMS of your choice, and connect it to a self-hosted BTCPay or one hosted by a third party.")],1),e._v(" "),t("p",[e._v("BTCPay Server's checkout is no different from any other payment gateway. The customer gets an invoice. They pay it by scanning a QR code or by copy-pasting the amount and the bitcoin address. When their payment is confirmed, you're notified via the e-commerce software and can ship the item.")]),e._v(" "),t("h3",{attrs:{id:"physical-stores"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#physical-stores"}},[e._v("#")]),e._v(" Physical stores")]),e._v(" "),t("p",[e._v("For in-person retailers, BTCPay Server has a "),t("RouterLink",{attrs:{to:"/Apps/#point-of-sale-app"}},[e._v("web-based Point of Sale")]),e._v(". Similar to the online store, the customer is presented with an invoice that he can pay on the spot. The "),t("strong",[e._v("POS app")]),e._v(" can be run on any web-connected device.")],1),e._v(" "),t("p",[e._v("Take a look at "),t("a",{attrs:{href:"https://mainnet.demo.btcpayserver.org/apps/3utBTfSKkW4gK7aQMd2hW5Bh9Fpa/pos",target:"_blank",rel:"noopener noreferrer"}},[e._v("our demo POS app"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"self-sovereign-individuals"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#self-sovereign-individuals"}},[e._v("#")]),e._v(" Self-sovereign individuals")]),e._v(" "),t("p",[t("strong",[e._v("Privacy-minded individuals")]),e._v(" can use BTCPay Server's internal wallet for their everyday bitcoin transactions without providing a private key. For self-hosted servers, the "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("internal wallet")]),e._v(" relies on a full node, significantly enhancing privacy. "),t("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[e._v("Hardware wallet integration")]),e._v(" allows the usage of a hardware wallet with a "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Full_node",target:"_blank",rel:"noopener noreferrer"}},[e._v("full node"),t("OutboundLink")],1),e._v(" and avoids leaks to a third-party server.")],1),e._v(" "),t("h2",{attrs:{id:"freelancers-bill-pay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#freelancers-bill-pay"}},[e._v("#")]),e._v(" Freelancers & bill pay")]),e._v(" "),t("p",[t("strong",[e._v("Freelancers")]),e._v(" can "),t("em",[e._v("request")]),e._v(" for payment by sharing a "),t("RouterLink",{attrs:{to:"/PaymentRequests/"}},[e._v("Payment Request")]),e._v(". The content and appearance of the payment request are customizable. With or without expiry, customers can pay the request at any time. BTCPay Server automatically updates the exchange rate when the customer pays the payment request when it's convenient for them. Merchants or freelancers can use payment requests for bill pay services. Payment requests can even be used to quickly request money from friends.")],1),e._v(" "),t("p",[e._v("Merchants can "),t("em",[e._v("provide")]),e._v(" payment by sharing a "),t("RouterLink",{attrs:{to:"/PullPayments/"}},[e._v("Pull Payment")]),e._v(". This is a long-lived payment offer that the freelancer can pull funds from at their convenience. The merchant can specify the total amount and approve a partial or full request for payment.")],1),e._v(" "),t("h2",{attrs:{id:"charities-non-profits"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#charities-non-profits"}},[e._v("#")]),e._v(" Charities & non-profits")]),e._v(" "),t("p",[e._v("Charities, non-profits, content creators, and other organizations that want to accept bitcoin donations in a more private way than the traditional static bitcoin address method can utilize the "),t("RouterLink",{attrs:{to:"/WhatsNext/#creating-the-pay-button"}},[e._v("Pay Button")]),e._v(", "),t("RouterLink",{attrs:{to:"/WhatsNext/#creating-the-point-of-sale-app"}},[e._v("POS app")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Apps/#crowdfunding-app"}},[e._v("Crowdfunding app")]),e._v(" for a better user experience.")],1),e._v(" "),t("p",[e._v("Benefits of using BTCPay for accepting donations:")]),e._v(" "),t("ul",[t("li",[e._v("Saving money (no fees, no subscriptions)")]),e._v(" "),t("li",[e._v("Cutting out the middle-man (Payments go directly to their wallet)")]),e._v(" "),t("li",[e._v("Enhancing privacy for them and their donors (no address re-use, no IP leaks to third parties)")])]),e._v(" "),t("p",[e._v("It's essential to mention that BTCPay Server prevents address reuse, as many people have been reusing addresses for donations in the past. Here is why you SHOULD NOT reuse a Bitcoin address:")]),e._v(" "),t("ul",[t("li",[e._v("Privacy: reusing the same address for donations not only makes it incredibly easy to link it to your identity, but it also compromises the privacy of your donors and every person that interacts with you")]),e._v(" "),t("li",[e._v("Security: by compromising your privacy, address reuse increases your attack surface, as people that want to steal from you or harm you would have A LOT of information about you and your donors")]),e._v(" "),t("li",[e._v('High fees: fees for a Bitcoin transaction are calculated according to the "size" of a transaction (which has nothing to do with the amount being sent). By reusing addresses, you are building huge transactions involving many inputs, that will cost you a lot in fees when you want to move them')])]),e._v(" "),t("p",[e._v("You can read more about address reuse on the "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Address_reuse",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Wiki"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"developers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#developers"}},[e._v("#")]),e._v(" Developers")]),e._v(" "),t("p",[e._v("By deploying an instance, developers get a full tech stack to develop on top of Bitcoin. They can build things using the "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Greenfield API"),t("OutboundLink")],1),e._v(" or build free or premium plugins for BTCPay users. Since BTCPay is an open-source organization, they can also get involved and "),t("RouterLink",{attrs:{to:"/Contribute/"}},[e._v("contribute")]),e._v(" and help us improve the software.")],1),e._v(" "),t("h2",{attrs:{id:"local-communities"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-communities"}},[e._v("#")]),e._v(" Local communities")]),e._v(" "),t("p",[e._v("People self-hosting a BTCPay Server instance, can enable registration for other users and become a "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third-party host")]),e._v(" for family, friends or their local community allowing them to accept Bitcoin by piggybacking on the host's instance. This allows motivated community members to onboard local communities and fuel hyperbitcoinization locally.")],1),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/9n81qnzlPf8/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=9n81qnzlPf8",title:"BTCPay Server for local communities","data-id":"9n81qnzlPf8"}},[t("iframe",{attrs:{title:"BTCPay Server for local communities","data-src":"https://www.youtube-nocookie.com/embed/9n81qnzlPf8?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"cryptocurrency-exchanges"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cryptocurrency-exchanges"}},[e._v("#")]),e._v(" Cryptocurrency exchanges")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://directory.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("number of merchants"),t("OutboundLink")],1),e._v(" using BTCPay Server grows each day, and cryptocurrency exchanges could benefit from it by developing integrations with BTCPay and allow offer instant conversion of payments into local fiat currencies.")]),e._v(" "),t("h2",{attrs:{id:"hosting-providers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hosting-providers"}},[e._v("#")]),e._v(" Hosting providers")]),e._v(" "),t("p",[e._v("Hosting providers can (and some already have) create easy 1-click BTCPay deployment solutions for their customers. With the growing interest in BTCPay Server, hosting companies can tap into this source of new customers and make money by hosting easily-deployable BTCPay instances for merchants.")]),e._v(" "),t("hr"),e._v(" "),t("p",[e._v("These are some of the many ways in which you can use BTCPay. Unleash your creativity and feel free to build your own solutions to solve problems.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[94],{646:function(e,t,r){e.exports=r.p+"assets/img/BTCPayUseCasev2-1.3b5b3052.png"},893:function(e,t,r){"use strict";r.r(t);var a=r(17),o=Object(a.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h1",{attrs:{id:"who-can-use-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#who-can-use-btcpay-server"}},[e._v("#")]),e._v(" Who can use BTCPay Server?")]),e._v(" "),t("p",[e._v("The versatility and flexibility of BTCPay Server attract different types of users. "),t("strong",[e._v("Anyone")]),e._v(" can use BTCPay Server.")]),e._v(" "),t("p",[e._v("We're ensuring an open future for businesses and individuals regardless of geographic, political or financial barriers.")]),e._v(" "),t("p",[e._v("Below are the most common use cases for BTCPay Server:")]),e._v(" "),t("ul",[t("li",[t("strong",[e._v("Merchants")]),e._v(" who sell products and services online or in person")]),e._v(" "),t("li",[e._v("Self-sovereign "),t("strong",[e._v("individuals")]),e._v(" wanting to protect their wealth and manage their funds and full bitcoin node")]),e._v(" "),t("li",[t("strong",[e._v("Charities and non-profits")]),e._v(" looking to accept donations or crowdfund their dream project")]),e._v(" "),t("li",[t("strong",[e._v("Developers")]),e._v(" building on top of bitcoin and bleeding-edge payment infrastructure")]),e._v(" "),t("li",[e._v("Members of "),t("strong",[e._v("local communities")]),e._v(" willing to onboard people to their BTCPay instance and offer payment processing as a service or for free, creating a circular economy.")]),e._v(" "),t("li",[t("strong",[e._v("Exchanges")]),e._v(" offering instant conversions for the users of BTCPay Server")]),e._v(" "),t("li",[t("strong",[e._v("Hosting providers")]),e._v(" offering BTCPay as a cloud service or ready-to-use hardware.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:r(646),alt:"BTCPay UseCase Infographic",title:"BTCPay UseCase Infographic"}})]),e._v(" "),t("p",[e._v("The software usage is by no means limited to the groups of users mentioned in this document.")]),e._v(" "),t("h2",{attrs:{id:"merchants"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#merchants"}},[e._v("#")]),e._v(" Merchants")]),e._v(" "),t("p",[e._v("Merchants accepting bitcoin payments online or in person are the primary user group of a BTCPay Server.")]),e._v(" "),t("p",[e._v("By choosing BTCPay Server to process payments, merchants are:")]),e._v(" "),t("ul",[t("li",[e._v("Saving money (BTCPay is free with no fees or subscriptions)")]),e._v(" "),t("li",[e._v("Cutting out the middle-man (If self-hosted payments go directly to their wallet)")]),e._v(" "),t("li",[e._v("Enhancing privacy for their customers (no address re-use, no information leaks to the third party servers if they're self-hosting BTCPay Server)")]),e._v(" "),t("li",[e._v("Saving time (easy integration with popular e-commerce platforms)")]),e._v(" "),t("li",[e._v("Protecting themselves from interference in their business (self-sovereignty)")])]),e._v(" "),t("h3",{attrs:{id:"online-stores"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#online-stores"}},[e._v("#")]),e._v(" Online stores")]),e._v(" "),t("p",[e._v("Merchants selling goods or services over the internet, usually pick an online e-commerce plugin we offer for multiple popular e-commerce platforms "),t("RouterLink",{attrs:{to:"/WooCommerce/"}},[e._v("WooCommerce")]),e._v(", "),t("RouterLink",{attrs:{to:"/Shopify/"}},[e._v("Shopify")]),e._v(", "),t("RouterLink",{attrs:{to:"/PrestaShop/"}},[e._v("PrestaShop")]),e._v(", "),t("RouterLink",{attrs:{to:"/Magento/"}},[e._v("Magento")]),e._v(" "),t("RouterLink",{attrs:{to:"/Drupal/"}},[e._v("Drupal")]),e._v(", "),t("a",{attrs:{href:"https://github.com/lampsolutions/LampSBtcPayShopware",target:"_blank",rel:"noopener noreferrer"}},[e._v("Shopaware"),t("OutboundLink")],1),e._v(" or other. Install a plugin for the CMS of your choice, and connect it to a self-hosted BTCPay or one hosted by a third party.")],1),e._v(" "),t("p",[e._v("BTCPay Server's checkout is no different from any other payment gateway. The customer gets an invoice. They pay it by scanning a QR code or by copy-pasting the amount and the bitcoin address. When their payment is confirmed, you're notified via the e-commerce software and can ship the item.")]),e._v(" "),t("h3",{attrs:{id:"physical-stores"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#physical-stores"}},[e._v("#")]),e._v(" Physical stores")]),e._v(" "),t("p",[e._v("For in-person retailers, BTCPay Server has a "),t("RouterLink",{attrs:{to:"/Apps/#point-of-sale-app"}},[e._v("web-based Point of Sale")]),e._v(". Similar to the online store, the customer is presented with an invoice that he can pay on the spot. The "),t("strong",[e._v("POS app")]),e._v(" can be run on any web-connected device.")],1),e._v(" "),t("p",[e._v("Take a look at "),t("a",{attrs:{href:"https://mainnet.demo.btcpayserver.org/apps/3utBTfSKkW4gK7aQMd2hW5Bh9Fpa/pos",target:"_blank",rel:"noopener noreferrer"}},[e._v("our demo POS app"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"self-sovereign-individuals"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#self-sovereign-individuals"}},[e._v("#")]),e._v(" Self-sovereign individuals")]),e._v(" "),t("p",[t("strong",[e._v("Privacy-minded individuals")]),e._v(" can use BTCPay Server's internal wallet for their everyday bitcoin transactions without providing a private key. For self-hosted servers, the "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("internal wallet")]),e._v(" relies on a full node, significantly enhancing privacy. "),t("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[e._v("Hardware wallet integration")]),e._v(" allows the usage of a hardware wallet with a "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Full_node",target:"_blank",rel:"noopener noreferrer"}},[e._v("full node"),t("OutboundLink")],1),e._v(" and avoids leaks to a third-party server.")],1),e._v(" "),t("h2",{attrs:{id:"freelancers-bill-pay"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#freelancers-bill-pay"}},[e._v("#")]),e._v(" Freelancers & bill pay")]),e._v(" "),t("p",[t("strong",[e._v("Freelancers")]),e._v(" can "),t("em",[e._v("request")]),e._v(" for payment by sharing a "),t("RouterLink",{attrs:{to:"/PaymentRequests/"}},[e._v("Payment Request")]),e._v(". The content and appearance of the payment request are customizable. With or without expiry, customers can pay the request at any time. BTCPay Server automatically updates the exchange rate when the customer pays the payment request when it's convenient for them. Merchants or freelancers can use payment requests for bill pay services. Payment requests can even be used to quickly request money from friends.")],1),e._v(" "),t("p",[e._v("Merchants can "),t("em",[e._v("provide")]),e._v(" payment by sharing a "),t("RouterLink",{attrs:{to:"/PullPayments/"}},[e._v("Pull Payment")]),e._v(". This is a long-lived payment offer that the freelancer can pull funds from at their convenience. The merchant can specify the total amount and approve a partial or full request for payment.")],1),e._v(" "),t("h2",{attrs:{id:"charities-non-profits"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#charities-non-profits"}},[e._v("#")]),e._v(" Charities & non-profits")]),e._v(" "),t("p",[e._v("Charities, non-profits, content creators, and other organizations that want to accept bitcoin donations in a more private way than the traditional static bitcoin address method can utilize the "),t("RouterLink",{attrs:{to:"/WhatsNext/#creating-the-pay-button"}},[e._v("Pay Button")]),e._v(", "),t("RouterLink",{attrs:{to:"/WhatsNext/#creating-the-point-of-sale-app"}},[e._v("POS app")]),e._v(" or "),t("RouterLink",{attrs:{to:"/Apps/#crowdfunding-app"}},[e._v("Crowdfunding app")]),e._v(" for a better user experience.")],1),e._v(" "),t("p",[e._v("Benefits of using BTCPay for accepting donations:")]),e._v(" "),t("ul",[t("li",[e._v("Saving money (no fees, no subscriptions)")]),e._v(" "),t("li",[e._v("Cutting out the middle-man (Payments go directly to their wallet)")]),e._v(" "),t("li",[e._v("Enhancing privacy for them and their donors (no address re-use, no IP leaks to third parties)")])]),e._v(" "),t("p",[e._v("It's essential to mention that BTCPay Server prevents address reuse, as many people have been reusing addresses for donations in the past. Here is why you SHOULD NOT reuse a Bitcoin address:")]),e._v(" "),t("ul",[t("li",[e._v("Privacy: reusing the same address for donations not only makes it incredibly easy to link it to your identity, but it also compromises the privacy of your donors and every person that interacts with you")]),e._v(" "),t("li",[e._v("Security: by compromising your privacy, address reuse increases your attack surface, as people that want to steal from you or harm you would have A LOT of information about you and your donors")]),e._v(" "),t("li",[e._v('High fees: fees for a Bitcoin transaction are calculated according to the "size" of a transaction (which has nothing to do with the amount being sent). By reusing addresses, you are building huge transactions involving many inputs, that will cost you a lot in fees when you want to move them')])]),e._v(" "),t("p",[e._v("You can read more about address reuse on the "),t("a",{attrs:{href:"https://en.bitcoin.it/wiki/Address_reuse",target:"_blank",rel:"noopener noreferrer"}},[e._v("Bitcoin Wiki"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h2",{attrs:{id:"developers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#developers"}},[e._v("#")]),e._v(" Developers")]),e._v(" "),t("p",[e._v("By deploying an instance, developers get a full tech stack to develop on top of Bitcoin. They can build things using the "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Greenfield API"),t("OutboundLink")],1),e._v(" or build free or premium plugins for BTCPay users. Since BTCPay is an open-source organization, they can also get involved and "),t("RouterLink",{attrs:{to:"/Contribute/"}},[e._v("contribute")]),e._v(" and help us improve the software.")],1),e._v(" "),t("h2",{attrs:{id:"local-communities"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-communities"}},[e._v("#")]),e._v(" Local communities")]),e._v(" "),t("p",[e._v("People self-hosting a BTCPay Server instance, can enable registration for other users and become a "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third-party host")]),e._v(" for family, friends or their local community allowing them to accept Bitcoin by piggybacking on the host's instance. This allows motivated community members to onboard local communities and fuel hyperbitcoinization locally.")],1),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/9n81qnzlPf8/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=9n81qnzlPf8",title:"BTCPay Server for local communities","data-id":"9n81qnzlPf8"}},[t("iframe",{attrs:{title:"BTCPay Server for local communities","data-src":"https://www.youtube-nocookie.com/embed/9n81qnzlPf8?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("h2",{attrs:{id:"cryptocurrency-exchanges"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#cryptocurrency-exchanges"}},[e._v("#")]),e._v(" Cryptocurrency exchanges")]),e._v(" "),t("p",[e._v("The "),t("a",{attrs:{href:"https://directory.btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("number of merchants"),t("OutboundLink")],1),e._v(" using BTCPay Server grows each day, and cryptocurrency exchanges could benefit from it by developing integrations with BTCPay and allow offer instant conversion of payments into local fiat currencies.")]),e._v(" "),t("h2",{attrs:{id:"hosting-providers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#hosting-providers"}},[e._v("#")]),e._v(" Hosting providers")]),e._v(" "),t("p",[e._v("Hosting providers can (and some already have) create easy 1-click BTCPay deployment solutions for their customers. With the growing interest in BTCPay Server, hosting companies can tap into this source of new customers and make money by hosting easily-deployable BTCPay instances for merchants.")]),e._v(" "),t("hr"),e._v(" "),t("p",[e._v("These are some of the many ways in which you can use BTCPay. Unleash your creativity and feel free to build your own solutions to solve problems.")])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/95.45ab5873.js b/assets/js/95.e0d6fe47.js similarity index 98% rename from assets/js/95.45ab5873.js rename to assets/js/95.e0d6fe47.js index fdf86ca300..e7335cf838 100644 --- a/assets/js/95.45ab5873.js +++ b/assets/js/95.e0d6fe47.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[95],{666:function(e,t,a){e.exports=a.p+"assets/img/Sequence.94c7564b.svg"},898:function(e,t,a){"use strict";a.r(t);var r=a(17),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[t("a",{attrs:{href:"https://www.nuget.org/packages/BTCPayServer.Hwi",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/nuget/v/BTCPayServer.Hwi.svg",alt:"NuGet",title:"NuGet"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/actions?query=workflow%3ACI",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://github.com/btcpayserver/BTCPayServer.Vault/workflows/CI/badge.svg",alt:"Build status",title:"Build status"}}),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"btcpayservervault"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpayservervault"}},[e._v("#")]),e._v(" BTCPayServer.Vault")]),e._v(" "),t("p",[e._v("This project is composed of two parts:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/tree/master/BTCPayServer.Hwi",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Hwi"),t("OutboundLink")],1),e._v(": An easy to use library ("),t("a",{attrs:{href:"https://www.nuget.org/packages/BTCPayServer.Hwi",target:"_blank",rel:"noopener noreferrer"}},[e._v("nuget"),t("OutboundLink")],1),e._v(") wrapping the command line interface of the "),t("a",{attrs:{href:"https://github.com/bitcoin-core/HWI",target:"_blank",rel:"noopener noreferrer"}},[e._v("hwi project"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/tree/master/BTCPayServer.Vault",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Vault"),t("OutboundLink")],1),e._v(": A simple local web server providing access to the hardware wallet physically connected to your computer via hwi.")])]),e._v(" "),t("p",[e._v("The video below explains how to use BTCPay Vault with BTCPay Server.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/s4qbGxef43A/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=s4qbGxef43A",title:"YouTube","data-id":"s4qbGxef43A"}},[t("iframe",{attrs:{title:"YouTube","data-src":"https://www.youtube-nocookie.com/embed/s4qbGxef43A?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://blog.btcpayserver.org/btcpay-vault/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Vault announcement"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"why-btcpayserver-vault"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-btcpayserver-vault"}},[e._v("#")]),e._v(" Why BTCPayServer Vault")]),e._v(" "),t("p",[e._v("BTCPayServer Vault allows web applications to access your hardware wallet, this enables a better integrated user experience.")]),e._v(" "),t("h2",{attrs:{id:"how-to-install"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-install"}},[e._v("#")]),e._v(" How to install")]),e._v(" "),t("h3",{attrs:{id:"direct-download"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#direct-download"}},[e._v("#")]),e._v(" Direct download")]),e._v(" "),t("p",[e._v("The binaries are on our "),t("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[e._v("release page"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"via-brew-macos-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#via-brew-macos-only"}},[e._v("#")]),e._v(" Via brew (macOS only)")]),e._v(" "),t("p",[e._v("You can use brew:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("brew "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" btcpayserver-vault\n")])])]),t("h2",{attrs:{id:"how-does-btcpayserver-vault-work"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-btcpayserver-vault-work"}},[e._v("#")]),e._v(" How does BTCPayServer Vault work")]),e._v(" "),t("p",[e._v("When running the BTCPayServer Vault, a local webserver is hosted on "),t("code",[e._v("http://127.0.0.1:65092")]),e._v(" which web applications, via your local browser, can connect to in order to interact with your hardware wallet.")]),e._v(" "),t("p",[e._v("The protocol is fairly simple:")]),e._v(" "),t("p",[e._v("First, the web application needs to make a permission request to the Vault by sending a HTTP request "),t("code",[e._v("GET")]),e._v(" to "),t("code",[e._v("http://127.0.0.1:65092/hwi-bridge/v1/request-permission")])]),e._v(" "),t("p",[e._v("This will prompt the user to grant access to the web application and if the user accepts, the request returns HTTP 200. Note that internally, the Vault relies on the "),t("code",[e._v("ORIGIN")]),e._v(" HTTP header to identify the web application requesting access.\nIf the access was granted previously, the request returns HTTP 200.")]),e._v(" "),t("p",[e._v("Second, the web application can query the hardware through "),t("code",[e._v("POST")]),e._v(" requests to "),t("code",[e._v("http://127.0.0.1:65092/hwi-bridge/v1")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"params"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"param1"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"param2"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("Those parameters are then passed as-is to "),t("a",{attrs:{href:"https://github.com/bitcoin-core/HWI",target:"_blank",rel:"noopener noreferrer"}},[e._v("hwi"),t("OutboundLink")],1),e._v(" and the result is returned as a string.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(666),alt:"NuGet",title:"NuGet"}})]),e._v(" "),t("h2",{attrs:{id:"is-it-safe"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#is-it-safe"}},[e._v("#")]),e._v(" Is it safe?")]),e._v(" "),t("p",[e._v("Hardware wallets have been created to protect your money, even if your computer was compromised.")]),e._v(" "),t("p",[e._v("However, while it protects your money, it will not protect your privacy if you allow an untrusted application to access your public keys.\nThis is why BTCPayServer Vault always ask permission to user first before allowing any web application to access your hardware wallet.")]),e._v(" "),t("h2",{attrs:{id:"how-to-build"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-build"}},[e._v("#")]),e._v(" How to build?")]),e._v(" "),t("p",[e._v("This is a two step process:")]),e._v(" "),t("ol",[t("li",[e._v("Install the latest version of the "),t("a",{attrs:{href:"https://dotnet.microsoft.com/download/dotnet-core/6.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET Core 6.0 SDK"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Run "),t("code",[e._v("dotnet build")])])]),e._v(" "),t("p",[e._v("If you want to run it for testing:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Vault\ndotnet run\n")])])]),t("h2",{attrs:{id:"documentation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#documentation"}},[e._v("#")]),e._v(" Documentation")]),e._v(" "),t("p",[e._v("Video below explains how to use BTCPay Vault with BTCPay Server.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/s4qbGxef43A/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=s4qbGxef43A",title:"YouTube","data-id":"s4qbGxef43A"}},[t("iframe",{attrs:{title:"YouTube","data-src":"https://www.youtube-nocookie.com/embed/s4qbGxef43A?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://blog.btcpayserver.org/btcpay-vault/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Vault announcement"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"/Vault"}},[e._v("Using BTCPay Vault with BTCPay Server")])])]),e._v(" "),t("h2",{attrs:{id:"licence"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#licence"}},[e._v("#")]),e._v(" Licence")]),e._v(" "),t("p",[e._v("This project is under MIT License.")]),e._v(" "),t("h2",{attrs:{id:"special-thanks"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#special-thanks"}},[e._v("#")]),e._v(" Special thanks")]),e._v(" "),t("p",[e._v("Special thanks to "),t("a",{attrs:{href:"https://github.com/zkSNACKs/WalletWasabi",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Wallet"),t("OutboundLink")],1),e._v(", this code is based on their work, and as well to the bitcoin developers and "),t("a",{attrs:{href:"https://github.com/achow101",target:"_blank",rel:"noopener noreferrer"}},[e._v("achow101"),t("OutboundLink")],1),e._v(" for the "),t("a",{attrs:{href:"https://github.com/bitcoin-core/HWI",target:"_blank",rel:"noopener noreferrer"}},[e._v("HWI Project"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[95],{663:function(e,t,a){e.exports=a.p+"assets/img/Sequence.94c7564b.svg"},898:function(e,t,a){"use strict";a.r(t);var r=a(17),s=Object(r.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("p",[t("a",{attrs:{href:"https://www.nuget.org/packages/BTCPayServer.Hwi",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://img.shields.io/nuget/v/BTCPayServer.Hwi.svg",alt:"NuGet",title:"NuGet"}}),t("OutboundLink")],1),e._v(" "),t("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/actions?query=workflow%3ACI",target:"_blank",rel:"noopener noreferrer"}},[t("img",{attrs:{src:"https://github.com/btcpayserver/BTCPayServer.Vault/workflows/CI/badge.svg",alt:"Build status",title:"Build status"}}),t("OutboundLink")],1)]),e._v(" "),t("h1",{attrs:{id:"btcpayservervault"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpayservervault"}},[e._v("#")]),e._v(" BTCPayServer.Vault")]),e._v(" "),t("p",[e._v("This project is composed of two parts:")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/tree/master/BTCPayServer.Hwi",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Hwi"),t("OutboundLink")],1),e._v(": An easy to use library ("),t("a",{attrs:{href:"https://www.nuget.org/packages/BTCPayServer.Hwi",target:"_blank",rel:"noopener noreferrer"}},[e._v("nuget"),t("OutboundLink")],1),e._v(") wrapping the command line interface of the "),t("a",{attrs:{href:"https://github.com/bitcoin-core/HWI",target:"_blank",rel:"noopener noreferrer"}},[e._v("hwi project"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/tree/master/BTCPayServer.Vault",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPayServer.Vault"),t("OutboundLink")],1),e._v(": A simple local web server providing access to the hardware wallet physically connected to your computer via hwi.")])]),e._v(" "),t("p",[e._v("The video below explains how to use BTCPay Vault with BTCPay Server.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/s4qbGxef43A/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=s4qbGxef43A",title:"YouTube","data-id":"s4qbGxef43A"}},[t("iframe",{attrs:{title:"YouTube","data-src":"https://www.youtube-nocookie.com/embed/s4qbGxef43A?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://blog.btcpayserver.org/btcpay-vault/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Vault announcement"),t("OutboundLink")],1)])]),e._v(" "),t("h2",{attrs:{id:"why-btcpayserver-vault"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#why-btcpayserver-vault"}},[e._v("#")]),e._v(" Why BTCPayServer Vault")]),e._v(" "),t("p",[e._v("BTCPayServer Vault allows web applications to access your hardware wallet, this enables a better integrated user experience.")]),e._v(" "),t("h2",{attrs:{id:"how-to-install"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-install"}},[e._v("#")]),e._v(" How to install")]),e._v(" "),t("h3",{attrs:{id:"direct-download"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#direct-download"}},[e._v("#")]),e._v(" Direct download")]),e._v(" "),t("p",[e._v("The binaries are on our "),t("a",{attrs:{href:"https://github.com/btcpayserver/BTCPayServer.Vault/releases/latest",target:"_blank",rel:"noopener noreferrer"}},[e._v("release page"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("h3",{attrs:{id:"via-brew-macos-only"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#via-brew-macos-only"}},[e._v("#")]),e._v(" Via brew (macOS only)")]),e._v(" "),t("p",[e._v("You can use brew:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("brew "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("install")]),e._v(" btcpayserver-vault\n")])])]),t("h2",{attrs:{id:"how-does-btcpayserver-vault-work"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-does-btcpayserver-vault-work"}},[e._v("#")]),e._v(" How does BTCPayServer Vault work")]),e._v(" "),t("p",[e._v("When running the BTCPayServer Vault, a local webserver is hosted on "),t("code",[e._v("http://127.0.0.1:65092")]),e._v(" which web applications, via your local browser, can connect to in order to interact with your hardware wallet.")]),e._v(" "),t("p",[e._v("The protocol is fairly simple:")]),e._v(" "),t("p",[e._v("First, the web application needs to make a permission request to the Vault by sending a HTTP request "),t("code",[e._v("GET")]),e._v(" to "),t("code",[e._v("http://127.0.0.1:65092/hwi-bridge/v1/request-permission")])]),e._v(" "),t("p",[e._v("This will prompt the user to grant access to the web application and if the user accepts, the request returns HTTP 200. Note that internally, the Vault relies on the "),t("code",[e._v("ORIGIN")]),e._v(" HTTP header to identify the web application requesting access.\nIf the access was granted previously, the request returns HTTP 200.")]),e._v(" "),t("p",[e._v("Second, the web application can query the hardware through "),t("code",[e._v("POST")]),e._v(" requests to "),t("code",[e._v("http://127.0.0.1:65092/hwi-bridge/v1")]),e._v(".")]),e._v(" "),t("div",{staticClass:"language-json extra-class"},[t("pre",{pre:!0,attrs:{class:"language-json"}},[t("code",[t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("{")]),e._v("\n "),t("span",{pre:!0,attrs:{class:"token property"}},[e._v('"params"')]),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(":")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("[")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"param1"')]),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(",")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"param2"')]),e._v(" "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("]")]),e._v("\n"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("}")]),e._v("\n")])])]),t("p",[e._v("Those parameters are then passed as-is to "),t("a",{attrs:{href:"https://github.com/bitcoin-core/HWI",target:"_blank",rel:"noopener noreferrer"}},[e._v("hwi"),t("OutboundLink")],1),e._v(" and the result is returned as a string.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(663),alt:"NuGet",title:"NuGet"}})]),e._v(" "),t("h2",{attrs:{id:"is-it-safe"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#is-it-safe"}},[e._v("#")]),e._v(" Is it safe?")]),e._v(" "),t("p",[e._v("Hardware wallets have been created to protect your money, even if your computer was compromised.")]),e._v(" "),t("p",[e._v("However, while it protects your money, it will not protect your privacy if you allow an untrusted application to access your public keys.\nThis is why BTCPayServer Vault always ask permission to user first before allowing any web application to access your hardware wallet.")]),e._v(" "),t("h2",{attrs:{id:"how-to-build"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-build"}},[e._v("#")]),e._v(" How to build?")]),e._v(" "),t("p",[e._v("This is a two step process:")]),e._v(" "),t("ol",[t("li",[e._v("Install the latest version of the "),t("a",{attrs:{href:"https://dotnet.microsoft.com/download/dotnet-core/6.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET Core 6.0 SDK"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("Run "),t("code",[e._v("dotnet build")])])]),e._v(" "),t("p",[e._v("If you want to run it for testing:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v("cd")]),e._v(" BTCPayServer.Vault\ndotnet run\n")])])]),t("h2",{attrs:{id:"documentation"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#documentation"}},[e._v("#")]),e._v(" Documentation")]),e._v(" "),t("p",[e._v("Video below explains how to use BTCPay Vault with BTCPay Server.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/s4qbGxef43A/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=s4qbGxef43A",title:"YouTube","data-id":"s4qbGxef43A"}},[t("iframe",{attrs:{title:"YouTube","data-src":"https://www.youtube-nocookie.com/embed/s4qbGxef43A?&autoplay=1&autohide=1&modestbranding=1&color=white&rel=0",frameborder:"0",allow:"autoplay;encrypted-media;picture-in-picture",allowfullscreen:""}})]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://blog.btcpayserver.org/btcpay-vault/",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Vault announcement"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"/Vault"}},[e._v("Using BTCPay Vault with BTCPay Server")])])]),e._v(" "),t("h2",{attrs:{id:"licence"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#licence"}},[e._v("#")]),e._v(" Licence")]),e._v(" "),t("p",[e._v("This project is under MIT License.")]),e._v(" "),t("h2",{attrs:{id:"special-thanks"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#special-thanks"}},[e._v("#")]),e._v(" Special thanks")]),e._v(" "),t("p",[e._v("Special thanks to "),t("a",{attrs:{href:"https://github.com/zkSNACKs/WalletWasabi",target:"_blank",rel:"noopener noreferrer"}},[e._v("Wasabi Wallet"),t("OutboundLink")],1),e._v(", this code is based on their work, and as well to the bitcoin developers and "),t("a",{attrs:{href:"https://github.com/achow101",target:"_blank",rel:"noopener noreferrer"}},[e._v("achow101"),t("OutboundLink")],1),e._v(" for the "),t("a",{attrs:{href:"https://github.com/bitcoin-core/HWI",target:"_blank",rel:"noopener noreferrer"}},[e._v("HWI Project"),t("OutboundLink")],1),e._v(".")])])}),[],!1,null,null,null);t.default=s.exports}}]); \ No newline at end of file diff --git a/assets/js/app.f6e25125.js b/assets/js/app.cf41e488.js similarity index 70% rename from assets/js/app.f6e25125.js rename to assets/js/app.cf41e488.js index b434c531f5..b8a2c2e893 100644 --- a/assets/js/app.f6e25125.js +++ b/assets/js/app.cf41e488.js @@ -1,4 +1,4 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[0],[]]);!function(e){function t(t){for(var r,a,l=t[0],s=t[1],c=t[2],p=0,d=[];p
    '};function o(e,t,n){return en?n:e}function i(e){return 100*(-1+e)}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var s=n.render(!t),c=s.querySelector(r.barSelector),u=r.speed,p=r.easing;return s.offsetWidth,a((function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),l(c,function(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+i(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+i(e)+"%,0)"}:{"margin-left":i(e)+"%"}).transition="all "+t+"ms "+n,o}(e,u,p)),1===e?(l(s,{transition:"none",opacity:1}),s.offsetWidth,setTimeout((function(){l(s,{transition:"all "+u+"ms linear",opacity:0}),setTimeout((function(){n.remove(),t()}),u)}),u)):setTimeout(t,u)})),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout((function(){n.status&&(n.trickle(),e())}),r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always((function(){0==--t?(e=0,n.done()):n.set((e-t)/e)})),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");c(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,a=t.querySelector(r.barSelector),s=e?"-100":i(n.status||0),u=document.querySelector(r.parent);return l(a,{transition:"all 0 linear",transform:"translate3d("+s+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&d(o),u!=document.body&&c(u,"nprogress-custom-parent"),u.appendChild(t),t},n.remove=function(){u(document.documentElement,"nprogress-busy"),u(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&d(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var a=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),l=function(){var e=["Webkit","O","Moz","ms"],t={};function n(n){return n=n.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,(function(e,t){return t.toUpperCase()})),t[n]||(t[n]=function(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,i=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+i)in n)return r;return t}(n))}function r(e,t,r){t=n(t),e.style[t]=r}return function(e,t){var n,o,i=arguments;if(2==i.length)for(n in t)void 0!==(o=t[n])&&t.hasOwnProperty(n)&&r(e,n,o);else r(e,i[1],i[2])}}();function s(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function c(e,t){var n=p(e),r=n+t;s(n,t)||(e.className=r.substring(1))}function u(e,t){var n,r=p(e);s(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function d(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n})?r.call(t,n,t,e):r)||(e.exports=o)},function(e,t,n){"use strict";n(148)},function(e,t,n){"use strict";var r=n(0),o=n(15),i=n(76),a=n(48);e.exports=function(e,t,n,l){l||(l={});var s=l.enumerable,c=void 0!==l.name?l.name:t;if(r(n)&&i(n,c,l),l.global)s?e[t]=n:a(t,n);else{try{l.unsafe?e[t]&&(s=!0):delete e[t]}catch(e){}s?e[t]=n:o.f(e,t,{value:n,enumerable:!1,configurable:!l.nonConfigurable,writable:!l.nonWritable})}return e}},function(e,t,n){"use strict";var r=n(156),o=n(12),i=n(1),a=n(46),l=n(158),s=n(34),c=n(31),u=n(159),p=n(87),d=n(52),h=TypeError,v=function(e,t){this.stopped=e,this.result=t},m=v.prototype;e.exports=function(e,t,n){var f,g,y,b,w,P,C,S=n&&n.that,D=!(!n||!n.AS_ENTRIES),k=!(!n||!n.IS_RECORD),x=!(!n||!n.IS_ITERATOR),T=!(!n||!n.INTERRUPTED),A=r(t,S),E=function(e){return f&&d(f,"normal",e),new v(!0,e)},_=function(e){return D?(i(e),T?A(e[0],e[1],E):A(e[0],e[1])):T?A(e,E):A(e)};if(k)f=e.iterator;else if(x)f=e;else{if(!(g=p(e)))throw new h(a(e)+" is not iterable");if(l(g)){for(y=0,b=s(e);b>y;y++)if((w=_(e[y]))&&c(m,w))return w;return new v(!1)}f=u(e,g)}for(P=k?e.next:f.next;!(C=o(P,f)).done;){try{w=_(C.value)}catch(e){d(f,"throw",e)}if("object"==typeof w&&w&&c(m,w))return w}return new v(!1)}},function(e,t,n){"use strict";var r=n(45),o=TypeError;e.exports=function(e){if(r(e))throw new o("Can't call method on "+e);return e}},function(e,t,n){"use strict";e.exports=function(e){return null==e}},function(e,t,n){"use strict";var r=String;e.exports=function(e){try{return r(e)}catch(e){return"Object"}}},function(e,t,n){"use strict";var r=n(19),o=n(2),i=n(48),a=e.exports=o["__core-js_shared__"]||i("__core-js_shared__",{});(a.versions||(a.versions=[])).push({version:"3.39.0",mode:r?"pure":"global",copyright:"© 2014-2024 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.39.0/LICENSE",source:"https://github.com/zloirock/core-js"})},function(e,t,n){"use strict";var r=n(2),o=Object.defineProperty;e.exports=function(e,t){try{o(r,e,{value:t,configurable:!0,writable:!0})}catch(n){r[e]=t}return t}},function(e,t,n){"use strict";var r=n(71),o=n(72),i=r("keys");e.exports=function(e){return i[e]||(i[e]=o(e))}},function(e,t,n){"use strict";e.exports={}},function(e,t,n){"use strict";e.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},function(e,t,n){"use strict";var r=n(12),o=n(1),i=n(32);e.exports=function(e,t,n){var a,l;o(e);try{if(!(a=i(e,"return"))){if("throw"===t)throw n;return n}a=r(a,e)}catch(e){l=!0,a=e}if("throw"===t)throw n;if(l)throw a;return o(a),n}},function(e,t,n){var r=n(181),o=n(18),i=Object.prototype,a=i.hasOwnProperty,l=i.propertyIsEnumerable,s=r(function(){return arguments}())?r:function(e){return o(e)&&a.call(e,"callee")&&!l.call(e,"callee")};e.exports=s},function(e,t,n){var r=n(16)(n(13),"Map");e.exports=r},function(e,t){e.exports=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}},function(e,t,n){var r=n(201),o=n(208),i=n(210),a=n(211),l=n(212);function s(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t-1&&e%1==0&&e<=9007199254740991}},function(e,t,n){var r=n(11),o=n(60),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;e.exports=function(e,t){if(r(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!o(e))||(a.test(e)||!i.test(e)||null!=t&&e in Object(t))}},function(e,t,n){var r=n(23),o=n(18);e.exports=function(e){return"symbol"==typeof e||o(e)&&"[object Symbol]"==r(e)}},function(e,t){e.exports=function(e){return e}},function(e,t,n){"use strict";n(272)},function(e,t,n){"use strict";var r=n(5),o=n(12),i=n(125),a=n(28),l=n(29),s=n(65),c=n(8),u=n(73),p=Object.getOwnPropertyDescriptor;t.f=r?p:function(e,t){if(e=l(e),t=s(t),u)try{return p(e,t)}catch(e){}if(c(e,t))return a(!o(i.f,e,t),e[t])}},function(e,t,n){"use strict";var r=n(4),o=n(3),i=n(24),a=Object,l=r("".split);e.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(e){return"String"===i(e)?l(e,""):a(e)}:a},function(e,t,n){"use strict";var r=n(126),o=n(66);e.exports=function(e){var t=r(e,"string");return o(t)?t:t+""}},function(e,t,n){"use strict";var r=n(30),o=n(0),i=n(31),a=n(67),l=Object;e.exports=a?function(e){return"symbol"==typeof e}:function(e){var t=r("Symbol");return o(t)&&i(t.prototype,l(e))}},function(e,t,n){"use strict";var r=n(68);e.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},function(e,t,n){"use strict";var r=n(69),o=n(3),i=n(2).String;e.exports=!!Object.getOwnPropertySymbols&&!o((function(){var e=Symbol("symbol detection");return!i(e)||!(Object(e)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},function(e,t,n){"use strict";var r,o,i=n(2),a=n(70),l=i.process,s=i.Deno,c=l&&l.versions||s&&s.version,u=c&&c.v8;u&&(o=(r=u.split("."))[0]>0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=+r[1]),e.exports=o},function(e,t,n){"use strict";var r=n(2).navigator,o=r&&r.userAgent;e.exports=o?String(o):""},function(e,t,n){"use strict";var r=n(47);e.exports=function(e,t){return r[e]||(r[e]=t||{})}},function(e,t,n){"use strict";var r=n(4),o=0,i=Math.random(),a=r(1..toString);e.exports=function(e){return"Symbol("+(void 0===e?"":e)+")_"+a(++o+i,36)}},function(e,t,n){"use strict";var r=n(5),o=n(3),i=n(74);e.exports=!r&&!o((function(){return 7!==Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},function(e,t,n){"use strict";var r=n(2),o=n(7),i=r.document,a=o(i)&&o(i.createElement);e.exports=function(e){return a?i.createElement(e):{}}},function(e,t,n){"use strict";var r=n(5),o=n(3);e.exports=r&&o((function(){return 42!==Object.defineProperty((function(){}),"prototype",{value:42,writable:!1}).prototype}))},function(e,t,n){"use strict";var r=n(4),o=n(3),i=n(0),a=n(8),l=n(5),s=n(128).CONFIGURABLE,c=n(129),u=n(77),p=u.enforce,d=u.get,h=String,v=Object.defineProperty,m=r("".slice),f=r("".replace),g=r([].join),y=l&&!o((function(){return 8!==v((function(){}),"length",{value:8}).length})),b=String(String).split("String"),w=e.exports=function(e,t,n){"Symbol("===m(h(t),0,7)&&(t="["+f(h(t),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),n&&n.getter&&(t="get "+t),n&&n.setter&&(t="set "+t),(!a(e,"name")||s&&e.name!==t)&&(l?v(e,"name",{value:t,configurable:!0}):e.name=t),y&&n&&a(n,"arity")&&e.length!==n.arity&&v(e,"length",{value:n.arity});try{n&&a(n,"constructor")&&n.constructor?l&&v(e,"prototype",{writable:!1}):e.prototype&&(e.prototype=void 0)}catch(e){}var r=p(e);return a(r,"source")||(r.source=g(b,"string"==typeof t?t:"")),e};Function.prototype.toString=w((function(){return i(this)&&d(this).source||c(this)}),"toString")},function(e,t,n){"use strict";var r,o,i,a=n(130),l=n(2),s=n(7),c=n(20),u=n(8),p=n(47),d=n(49),h=n(50),v=l.TypeError,m=l.WeakMap;if(a||p.state){var f=p.state||(p.state=new m);f.get=f.get,f.has=f.has,f.set=f.set,r=function(e,t){if(f.has(e))throw new v("Object already initialized");return t.facade=e,f.set(e,t),t},o=function(e){return f.get(e)||{}},i=function(e){return f.has(e)}}else{var g=d("state");h[g]=!0,r=function(e,t){if(u(e,g))throw new v("Object already initialized");return t.facade=e,c(e,g,t),t},o=function(e){return u(e,g)?e[g]:{}},i=function(e){return u(e,g)}}e.exports={set:r,get:o,has:i,enforce:function(e){return i(e)?o(e):r(e,{})},getterFor:function(e){return function(t){var n;if(!s(t)||(n=o(t)).type!==e)throw new v("Incompatible receiver, "+e+" required");return n}}}},function(e,t,n){"use strict";var r=n(8),o=n(131),i=n(63),a=n(15);e.exports=function(e,t,n){for(var l=o(t),s=a.f,c=i.f,u=0;uc;)o(r,n=t[c++])&&(~a(u,n)||s(u,n));return u}},function(e,t,n){"use strict";var r=n(135);e.exports=function(e){var t=+e;return t!=t||0===t?0:r(t)}},function(e,t,n){"use strict";var r=n(8),o=n(0),i=n(33),a=n(49),l=n(140),s=a("IE_PROTO"),c=Object,u=c.prototype;e.exports=l?c.getPrototypeOf:function(e){var t=i(e);if(r(t,s))return t[s];var n=t.constructor;return o(n)&&t instanceof n?n.prototype:t instanceof c?u:null}},function(e,t,n){"use strict";var r,o,i,a=n(3),l=n(0),s=n(7),c=n(83),u=n(81),p=n(42),d=n(14),h=n(19),v=d("iterator"),m=!1;[].keys&&("next"in(i=[].keys())?(o=u(u(i)))!==Object.prototype&&(r=o):m=!0),!s(r)||a((function(){var e={};return r[v].call(e)!==e}))?r={}:h&&(r=c(r)),l(r[v])||p(r,v,(function(){return this})),e.exports={IteratorPrototype:r,BUGGY_SAFARI_ITERATORS:m}},function(e,t,n){"use strict";var r,o=n(1),i=n(142),a=n(51),l=n(50),s=n(144),c=n(74),u=n(49),p=u("IE_PROTO"),d=function(){},h=function(e){return" + diff --git a/sitemap.xml b/sitemap.xml index 4e3021edb7..301a19a577 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://docs.btcpayserver.org/AdvancedForms/dailyhttps://docs.btcpayserver.org/Apps/dailyhttps://docs.btcpayserver.org/BTCPayServer/LocalDevSetup/dailyhttps://docs.btcpayserver.org/BTCPayServer/Security/dailyhttps://docs.btcpayserver.org/BTCPayServer/db-migration/dailyhttps://docs.btcpayserver.org/BTCPayServer/greenfield-authorization/dailyhttps://docs.btcpayserver.org/BTCPayServer/greenfield-development/dailyhttps://docs.btcpayserver.org/BTCPayVsOthers/dailyhttps://docs.btcpayserver.org/BigCommerce/dailyhttps://docs.btcpayserver.org/Breez/dailyhttps://docs.btcpayserver.org/Bringin/dailyhttps://docs.btcpayserver.org/ColdCardWallet/dailyhttps://docs.btcpayserver.org/Community/dailyhttps://docs.btcpayserver.org/Conference-PoS-guide/dailyhttps://docs.btcpayserver.org/Configurator/dailyhttps://docs.btcpayserver.org/ConnectWallet/dailyhttps://docs.btcpayserver.org/Contribute/Design/dailyhttps://docs.btcpayserver.org/Contribute/DevCode/dailyhttps://docs.btcpayserver.org/Contribute/Dev/dailyhttps://docs.btcpayserver.org/Contribute/DevTest/dailyhttps://docs.btcpayserver.org/Contribute/Misc/dailyhttps://docs.btcpayserver.org/Contribute/dailyhttps://docs.btcpayserver.org/Contribute/Translate/dailyhttps://docs.btcpayserver.org/Contribute/Write/dailyhttps://docs.btcpayserver.org/Contribute/WriteBlog/dailyhttps://docs.btcpayserver.org/Contribute/WriteSoftware/dailyhttps://docs.btcpayserver.org/Contribute/WriteDocs/dailyhttps://docs.btcpayserver.org/CreateStore/dailyhttps://docs.btcpayserver.org/CreateWallet/dailyhttps://docs.btcpayserver.org/CustomIntegration/dailyhttps://docs.btcpayserver.org/Dashboard/dailyhttps://docs.btcpayserver.org/Deployment/Azure/dailyhttps://docs.btcpayserver.org/Deployment/AzurePennyPinching/dailyhttps://docs.btcpayserver.org/Deployment/Clovyr/dailyhttps://docs.btcpayserver.org/Deployment/DynamicDNS/dailyhttps://docs.btcpayserver.org/Deployment/GoogleCloud/dailyhttps://docs.btcpayserver.org/Deployment/Hack0/dailyhttps://docs.btcpayserver.org/Deployment/Hardware/dailyhttps://docs.btcpayserver.org/Deployment/HardwareAsAService/dailyhttps://docs.btcpayserver.org/Deployment/LightningInABox/dailyhttps://docs.btcpayserver.org/Deployment/LunaNode/dailyhttps://docs.btcpayserver.org/Deployment/ManualDeploymentExtended/dailyhttps://docs.btcpayserver.org/Deployment/ManualDeployment/dailyhttps://docs.btcpayserver.org/Deployment/RaspberryPi4/dailyhttps://docs.btcpayserver.org/Deployment/ReverseSSHtunnel/dailyhttps://docs.btcpayserver.org/Deployment/ReverseProxyToTor/dailyhttps://docs.btcpayserver.org/Deployment/ThirdPartyHosting/dailyhttps://docs.btcpayserver.org/Deployment/dailyhttps://docs.btcpayserver.org/Deployment/webdeployment/dailyhttps://docs.btcpayserver.org/Deployment/voltagecloud/dailyhttps://docs.btcpayserver.org/Development/Altcoins/dailyhttps://docs.btcpayserver.org/Development/GreenFieldExample-NodeJS/dailyhttps://docs.btcpayserver.org/Development/GreenfieldExample-PHP/dailyhttps://docs.btcpayserver.org/Development/GreenFieldExample/dailyhttps://docs.btcpayserver.org/Development/InvoiceMetadata/dailyhttps://docs.btcpayserver.org/Development/LocalDev/dailyhttps://docs.btcpayserver.org/Development/LocalDevelopment/dailyhttps://docs.btcpayserver.org/Development/Plugins/dailyhttps://docs.btcpayserver.org/Development/dailyhttps://docs.btcpayserver.org/Development/TestnetDemo/dailyhttps://docs.btcpayserver.org/Development/Theme/dailyhttps://docs.btcpayserver.org/Development/ecommerce-integration-guide/dailyhttps://docs.btcpayserver.org/Docker/dailyhttps://docs.btcpayserver.org/Docker/backup-restore/dailyhttps://docs.btcpayserver.org/Docker/chatwoot/dailyhttps://docs.btcpayserver.org/Docker/cloudflare-tunnel/dailyhttps://docs.btcpayserver.org/Docker/fastsync/dailyhttps://docs.btcpayserver.org/Docker/fireflyiii/dailyhttps://docs.btcpayserver.org/Docker/joinmarket/dailyhttps://docs.btcpayserver.org/Docker/lightning-terminal/dailyhttps://docs.btcpayserver.org/Docker/ndlc/dailyhttps://docs.btcpayserver.org/Docker/pihole/dailyhttps://docs.btcpayserver.org/Docker/tallycoin-connect/dailyhttps://docs.btcpayserver.org/Drupal/dailyhttps://docs.btcpayserver.org/DynamicReports/dailyhttps://docs.btcpayserver.org/ElectrumPersonalServer/dailyhttps://docs.btcpayserver.org/ElectrumWallet/dailyhttps://docs.btcpayserver.org/ElectrumX/dailyhttps://docs.btcpayserver.org/FAQ/Altcoin/dailyhttps://docs.btcpayserver.org/FAQ/Apps/dailyhttps://docs.btcpayserver.org/FAQ/Deployment/dailyhttps://docs.btcpayserver.org/FAQ/General/dailyhttps://docs.btcpayserver.org/FAQ/Integrations/dailyhttps://docs.btcpayserver.org/FAQ/LightningNetwork/dailyhttps://docs.btcpayserver.org/FAQ/dailyhttps://docs.btcpayserver.org/FAQ/ServerSettings/dailyhttps://docs.btcpayserver.org/FAQ/Stores/dailyhttps://docs.btcpayserver.org/FAQ/Synchronization/dailyhttps://docs.btcpayserver.org/FAQ/Wallet/dailyhttps://docs.btcpayserver.org/Forms/dailyhttps://docs.btcpayserver.org/Grandnode/dailyhttps://docs.btcpayserver.org/Guide/dailyhttps://docs.btcpayserver.org/InvoiceNinja/dailyhttps://docs.btcpayserver.org/Invoices/dailyhttps://docs.btcpayserver.org/LNDhubAPI/dailyhttps://docs.btcpayserver.org/HardwareWalletIntegration/dailyhttps://docs.btcpayserver.org/LedgerWallet/dailyhttps://docs.btcpayserver.org/LightningNetwork/dailyhttps://docs.btcpayserver.org/LightningNetwork_PaymentChannels/dailyhttps://docs.btcpayserver.org/Magento/dailyhttps://docs.btcpayserver.org/NBXplorer/API/dailyhttps://docs.btcpayserver.org/NBXplorer/Postgres-Migration/dailyhttps://docs.btcpayserver.org/NBXplorer/Postgres-Schema/dailyhttps://docs.btcpayserver.org/NBXplorer/dailyhttps://docs.btcpayserver.org/Nopcommerce/dailyhttps://docs.btcpayserver.org/Nostr/dailyhttps://docs.btcpayserver.org/Notifications/dailyhttps://docs.btcpayserver.org/Odoo/dailyhttps://docs.btcpayserver.org/OpenCart/dailyhttps://docs.btcpayserver.org/Payjoin/dailyhttps://docs.btcpayserver.org/PaymentRequests/dailyhttps://docs.btcpayserver.org/Payouts/dailyhttps://docs.btcpayserver.org/PhocaCart/dailyhttps://docs.btcpayserver.org/Payroll/dailyhttps://docs.btcpayserver.org/PodServer/dailyhttps://docs.btcpayserver.org/PrestaShop/dailyhttps://docs.btcpayserver.org/PullPayments/dailyhttps://docs.btcpayserver.org/dailyhttps://docs.btcpayserver.org/Refund/dailyhttps://docs.btcpayserver.org/RegisterAccount/dailyhttps://docs.btcpayserver.org/Reporting/dailyhttps://docs.btcpayserver.org/Shopify/dailyhttps://docs.btcpayserver.org/Shopware/dailyhttps://docs.btcpayserver.org/SideShift/dailyhttps://docs.btcpayserver.org/Sign-PSBT-with-sparrow-wallet/dailyhttps://docs.btcpayserver.org/Smartstore/dailyhttps://docs.btcpayserver.org/Translations/dailyhttps://docs.btcpayserver.org/TicketTailor/dailyhttps://docs.btcpayserver.org/Transmuter/DCA/dailyhttps://docs.btcpayserver.org/Transmuter/EmailReceiptsPreset/dailyhttps://docs.btcpayserver.org/Support/dailyhttps://docs.btcpayserver.org/Transmuter/dailyhttps://docs.btcpayserver.org/Trocador/dailyhttps://docs.btcpayserver.org/Troubleshooting/dailyhttps://docs.btcpayserver.org/TryItOut/dailyhttps://docs.btcpayserver.org/UseCase/dailyhttps://docs.btcpayserver.org/Vault/HowToVerify/dailyhttps://docs.btcpayserver.org/VirtueMart/dailyhttps://docs.btcpayserver.org/Vault/dailyhttps://docs.btcpayserver.org/Wabisabi/dailyhttps://docs.btcpayserver.org/Walkthrough/dailyhttps://docs.btcpayserver.org/Wallet/dailyhttps://docs.btcpayserver.org/WalletSetup/dailyhttps://docs.btcpayserver.org/WasabiWallet/dailyhttps://docs.btcpayserver.org/WhatsNext/dailyhttps://docs.btcpayserver.org/Wix/dailyhttps://docs.btcpayserver.org/WooCommerce/dailyhttps://docs.btcpayserver.org/Xenforo/dailyhttps://docs.btcpayserver.org/Zapier/daily \ No newline at end of file +https://docs.btcpayserver.org/Apps/dailyhttps://docs.btcpayserver.org/AdvancedForms/dailyhttps://docs.btcpayserver.org/BTCPayServer/LocalDevSetup/dailyhttps://docs.btcpayserver.org/BTCPayServer/Security/dailyhttps://docs.btcpayserver.org/BTCPayServer/db-migration/dailyhttps://docs.btcpayserver.org/BTCPayServer/greenfield-authorization/dailyhttps://docs.btcpayserver.org/BTCPayServer/greenfield-development/dailyhttps://docs.btcpayserver.org/BTCPayVsOthers/dailyhttps://docs.btcpayserver.org/Breez/dailyhttps://docs.btcpayserver.org/Bringin/dailyhttps://docs.btcpayserver.org/BigCommerce/dailyhttps://docs.btcpayserver.org/ColdCardWallet/dailyhttps://docs.btcpayserver.org/Community/dailyhttps://docs.btcpayserver.org/Conference-PoS-guide/dailyhttps://docs.btcpayserver.org/Configurator/dailyhttps://docs.btcpayserver.org/ConnectWallet/dailyhttps://docs.btcpayserver.org/Contribute/Dev/dailyhttps://docs.btcpayserver.org/Contribute/DevCode/dailyhttps://docs.btcpayserver.org/Contribute/DevTest/dailyhttps://docs.btcpayserver.org/Contribute/Misc/dailyhttps://docs.btcpayserver.org/Contribute/dailyhttps://docs.btcpayserver.org/Contribute/Translate/dailyhttps://docs.btcpayserver.org/Contribute/Write/dailyhttps://docs.btcpayserver.org/Contribute/Design/dailyhttps://docs.btcpayserver.org/Contribute/WriteBlog/dailyhttps://docs.btcpayserver.org/Contribute/WriteDocs/dailyhttps://docs.btcpayserver.org/Contribute/WriteSoftware/dailyhttps://docs.btcpayserver.org/CreateStore/dailyhttps://docs.btcpayserver.org/CreateWallet/dailyhttps://docs.btcpayserver.org/Dashboard/dailyhttps://docs.btcpayserver.org/CustomIntegration/dailyhttps://docs.btcpayserver.org/Deployment/Azure/dailyhttps://docs.btcpayserver.org/Deployment/AzurePennyPinching/dailyhttps://docs.btcpayserver.org/Deployment/Clovyr/dailyhttps://docs.btcpayserver.org/Deployment/DynamicDNS/dailyhttps://docs.btcpayserver.org/Deployment/GoogleCloud/dailyhttps://docs.btcpayserver.org/Deployment/Hack0/dailyhttps://docs.btcpayserver.org/Deployment/Hardware/dailyhttps://docs.btcpayserver.org/Deployment/HardwareAsAService/dailyhttps://docs.btcpayserver.org/Deployment/LightningInABox/dailyhttps://docs.btcpayserver.org/Deployment/LunaNode/dailyhttps://docs.btcpayserver.org/Deployment/ManualDeploymentExtended/dailyhttps://docs.btcpayserver.org/Deployment/ManualDeployment/dailyhttps://docs.btcpayserver.org/Deployment/dailyhttps://docs.btcpayserver.org/Deployment/RaspberryPi4/dailyhttps://docs.btcpayserver.org/Deployment/ReverseProxyToTor/dailyhttps://docs.btcpayserver.org/Deployment/ReverseSSHtunnel/dailyhttps://docs.btcpayserver.org/Deployment/webdeployment/dailyhttps://docs.btcpayserver.org/Deployment/ThirdPartyHosting/dailyhttps://docs.btcpayserver.org/Development/GreenFieldExample-NodeJS/dailyhttps://docs.btcpayserver.org/Development/Altcoins/dailyhttps://docs.btcpayserver.org/Development/GreenFieldExample/dailyhttps://docs.btcpayserver.org/Development/GreenfieldExample-PHP/dailyhttps://docs.btcpayserver.org/Development/LocalDev/dailyhttps://docs.btcpayserver.org/Development/LocalDevelopment/dailyhttps://docs.btcpayserver.org/Development/InvoiceMetadata/dailyhttps://docs.btcpayserver.org/Development/Plugins/dailyhttps://docs.btcpayserver.org/Development/dailyhttps://docs.btcpayserver.org/Deployment/voltagecloud/dailyhttps://docs.btcpayserver.org/Development/Theme/dailyhttps://docs.btcpayserver.org/Development/ecommerce-integration-guide/dailyhttps://docs.btcpayserver.org/Docker/dailyhttps://docs.btcpayserver.org/Docker/backup-restore/dailyhttps://docs.btcpayserver.org/Docker/chatwoot/dailyhttps://docs.btcpayserver.org/Docker/fastsync/dailyhttps://docs.btcpayserver.org/Docker/fireflyiii/dailyhttps://docs.btcpayserver.org/Docker/cloudflare-tunnel/dailyhttps://docs.btcpayserver.org/Docker/joinmarket/dailyhttps://docs.btcpayserver.org/Development/TestnetDemo/dailyhttps://docs.btcpayserver.org/Docker/lightning-terminal/dailyhttps://docs.btcpayserver.org/Docker/ndlc/dailyhttps://docs.btcpayserver.org/Docker/pihole/dailyhttps://docs.btcpayserver.org/Drupal/dailyhttps://docs.btcpayserver.org/DynamicReports/dailyhttps://docs.btcpayserver.org/ElectrumPersonalServer/dailyhttps://docs.btcpayserver.org/ElectrumWallet/dailyhttps://docs.btcpayserver.org/Docker/tallycoin-connect/dailyhttps://docs.btcpayserver.org/FAQ/Altcoin/dailyhttps://docs.btcpayserver.org/ElectrumX/dailyhttps://docs.btcpayserver.org/FAQ/Apps/dailyhttps://docs.btcpayserver.org/FAQ/General/dailyhttps://docs.btcpayserver.org/FAQ/Deployment/dailyhttps://docs.btcpayserver.org/FAQ/Integrations/dailyhttps://docs.btcpayserver.org/FAQ/LightningNetwork/dailyhttps://docs.btcpayserver.org/FAQ/dailyhttps://docs.btcpayserver.org/FAQ/ServerSettings/dailyhttps://docs.btcpayserver.org/FAQ/Stores/dailyhttps://docs.btcpayserver.org/FAQ/Wallet/dailyhttps://docs.btcpayserver.org/FAQ/Synchronization/dailyhttps://docs.btcpayserver.org/Forms/dailyhttps://docs.btcpayserver.org/Grandnode/dailyhttps://docs.btcpayserver.org/Guide/dailyhttps://docs.btcpayserver.org/InvoiceNinja/dailyhttps://docs.btcpayserver.org/HardwareWalletIntegration/dailyhttps://docs.btcpayserver.org/LNDhubAPI/dailyhttps://docs.btcpayserver.org/Invoices/dailyhttps://docs.btcpayserver.org/LedgerWallet/dailyhttps://docs.btcpayserver.org/LightningNetwork/dailyhttps://docs.btcpayserver.org/LightningNetwork_PaymentChannels/dailyhttps://docs.btcpayserver.org/Magento/dailyhttps://docs.btcpayserver.org/NBXplorer/Postgres-Migration/dailyhttps://docs.btcpayserver.org/NBXplorer/Postgres-Schema/dailyhttps://docs.btcpayserver.org/NBXplorer/dailyhttps://docs.btcpayserver.org/Nopcommerce/dailyhttps://docs.btcpayserver.org/Nostr/dailyhttps://docs.btcpayserver.org/Notifications/dailyhttps://docs.btcpayserver.org/Odoo/dailyhttps://docs.btcpayserver.org/OpenCart/dailyhttps://docs.btcpayserver.org/Payjoin/dailyhttps://docs.btcpayserver.org/PaymentRequests/dailyhttps://docs.btcpayserver.org/Payouts/dailyhttps://docs.btcpayserver.org/Payroll/dailyhttps://docs.btcpayserver.org/NBXplorer/API/dailyhttps://docs.btcpayserver.org/PhocaCart/dailyhttps://docs.btcpayserver.org/PodServer/dailyhttps://docs.btcpayserver.org/PrestaShop/dailyhttps://docs.btcpayserver.org/PullPayments/dailyhttps://docs.btcpayserver.org/dailyhttps://docs.btcpayserver.org/Refund/dailyhttps://docs.btcpayserver.org/RegisterAccount/dailyhttps://docs.btcpayserver.org/Reporting/dailyhttps://docs.btcpayserver.org/Shopify/dailyhttps://docs.btcpayserver.org/SideShift/dailyhttps://docs.btcpayserver.org/Smartstore/dailyhttps://docs.btcpayserver.org/Support/dailyhttps://docs.btcpayserver.org/TicketTailor/dailyhttps://docs.btcpayserver.org/Translations/dailyhttps://docs.btcpayserver.org/Transmuter/DCA/dailyhttps://docs.btcpayserver.org/Sign-PSBT-with-sparrow-wallet/dailyhttps://docs.btcpayserver.org/Transmuter/EmailReceiptsPreset/dailyhttps://docs.btcpayserver.org/Troubleshooting/dailyhttps://docs.btcpayserver.org/TryItOut/dailyhttps://docs.btcpayserver.org/Transmuter/dailyhttps://docs.btcpayserver.org/UseCase/dailyhttps://docs.btcpayserver.org/Vault/HowToVerify/dailyhttps://docs.btcpayserver.org/Trocador/dailyhttps://docs.btcpayserver.org/Wabisabi/dailyhttps://docs.btcpayserver.org/Walkthrough/dailyhttps://docs.btcpayserver.org/Vault/dailyhttps://docs.btcpayserver.org/Wallet/dailyhttps://docs.btcpayserver.org/WalletSetup/dailyhttps://docs.btcpayserver.org/WasabiWallet/dailyhttps://docs.btcpayserver.org/WhatsNext/dailyhttps://docs.btcpayserver.org/Wix/dailyhttps://docs.btcpayserver.org/WooCommerce/dailyhttps://docs.btcpayserver.org/Xenforo/dailyhttps://docs.btcpayserver.org/Zapier/dailyhttps://docs.btcpayserver.org/VirtueMart/dailyhttps://docs.btcpayserver.org/Shopware/daily \ No newline at end of file