From 8a31375776e1148c0a5b0334e4aaf2dbc180732f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 10 Dec 2024 15:01:55 +0000 Subject: [PATCH] deploy: 72362d36c2fa36d2ec4e92279aa4fce17371bd47 --- 404.html | 6 +- API/Greenfield/Plugins/swagger.json | 34 + API/Greenfield/v1/swagger.json | 1711 +++++------------ AdvancedForms/index.html | 4 +- Apps/index.html | 4 +- BTCPayServer/LocalDevSetup/index.html | 4 +- BTCPayServer/Security/index.html | 4 +- BTCPayServer/db-migration/index.html | 4 +- .../greenfield-authorization/index.html | 4 +- .../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 +- .../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 +- .../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 +- .../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 | 4 +- 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 | 4 +- 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 | 4 +- 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 | 4 +- 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 +- .../js/{106.e405ade5.js => 106.36628569.js} | 2 +- .../js/{107.16bbc1f0.js => 107.f70f2678.js} | 2 +- .../js/{118.1dd64d48.js => 118.c8e719dc.js} | 2 +- .../js/{119.367fe5cf.js => 119.acf7657e.js} | 2 +- .../js/{121.0b3c9f6d.js => 121.cf62b7dd.js} | 2 +- .../js/{122.6f3a1eda.js => 122.6634e499.js} | 2 +- .../js/{123.1267bc5a.js => 123.77c37c03.js} | 2 +- assets/js/{14.fc1e0815.js => 14.cfdc4e6b.js} | 2 +- .../js/{140.34d47a8c.js => 140.f4d196c2.js} | 2 +- .../js/{141.1a1ab3be.js => 141.b8553449.js} | 2 +- .../js/{148.bdbd287c.js => 148.2d7f89ee.js} | 2 +- .../js/{152.fa684a77.js => 152.a29cef95.js} | 2 +- .../js/{157.3ff54313.js => 157.cd5cf560.js} | 2 +- .../js/{158.e52a4150.js => 158.5a547443.js} | 2 +- .../js/{163.5a30c960.js => 163.a18f8c13.js} | 2 +- .../js/{164.895e7caa.js => 164.86969602.js} | 2 +- .../js/{165.b40b7cd4.js => 165.25950d0a.js} | 2 +- assets/js/{17.19402d73.js => 17.aa77e5f2.js} | 2 +- .../js/{171.94f9605c.js => 171.712fd1e0.js} | 2 +- assets/js/{19.a0826f1f.js => 19.34235057.js} | 2 +- assets/js/{21.175cdbfd.js => 21.c68c08fd.js} | 2 +- assets/js/{22.7417d43d.js => 22.c13a7bf1.js} | 2 +- assets/js/{23.306786fd.js => 23.fcea8aa8.js} | 2 +- assets/js/{24.ee841795.js => 24.3eabf55c.js} | 2 +- assets/js/{27.7a573265.js => 27.73ac3d93.js} | 2 +- assets/js/{29.4f814518.js => 29.5a61b42a.js} | 2 +- assets/js/{37.433ff2dc.js => 37.12b78be2.js} | 2 +- assets/js/{40.f388cce8.js => 40.5f55dac3.js} | 2 +- assets/js/{41.b89f42cb.js => 41.6bb6d0af.js} | 2 +- assets/js/{48.546b1a1c.js => 48.a7c396c2.js} | 2 +- assets/js/{53.de1685c3.js => 53.7465bd8d.js} | 2 +- assets/js/{67.7572d8d1.js => 67.78656f08.js} | 2 +- assets/js/{72.119678b2.js => 72.f8ac4708.js} | 2 +- assets/js/{76.bd24ad38.js => 76.2fb25567.js} | 2 +- assets/js/{78.0606917e.js => 78.9df980a0.js} | 2 +- assets/js/{80.1c986895.js => 80.09b42ef2.js} | 2 +- assets/js/{84.09891e28.js => 84.88cedb38.js} | 2 +- assets/js/{87.23c7b355.js => 87.b75e9822.js} | 2 +- assets/js/{88.7bdcb920.js => 88.25ff612b.js} | 2 +- assets/js/{91.b8cc05dc.js => 91.62310f4b.js} | 2 +- assets/js/{95.217b4f78.js => 95.45ab5873.js} | 2 +- assets/js/{96.e5b0330c.js => 96.9898986c.js} | 2 +- .../js/{app.e4bdef9f.js => app.f6e25125.js} | 4 +- index.html | 4 +- sitemap.xml | 2 +- 194 files changed, 895 insertions(+), 1534 deletions(-) rename assets/js/{106.e405ade5.js => 106.36628569.js} (96%) rename assets/js/{107.16bbc1f0.js => 107.f70f2678.js} (98%) rename assets/js/{118.1dd64d48.js => 118.c8e719dc.js} (99%) rename assets/js/{119.367fe5cf.js => 119.acf7657e.js} (99%) rename assets/js/{121.0b3c9f6d.js => 121.cf62b7dd.js} (99%) rename assets/js/{122.6f3a1eda.js => 122.6634e499.js} (99%) rename assets/js/{123.1267bc5a.js => 123.77c37c03.js} (98%) rename assets/js/{14.fc1e0815.js => 14.cfdc4e6b.js} (89%) rename assets/js/{140.34d47a8c.js => 140.f4d196c2.js} (98%) rename assets/js/{141.1a1ab3be.js => 141.b8553449.js} (99%) rename assets/js/{148.bdbd287c.js => 148.2d7f89ee.js} (99%) rename assets/js/{152.fa684a77.js => 152.a29cef95.js} (98%) rename assets/js/{157.3ff54313.js => 157.cd5cf560.js} (98%) rename assets/js/{158.e52a4150.js => 158.5a547443.js} (96%) rename assets/js/{163.5a30c960.js => 163.a18f8c13.js} (98%) rename assets/js/{164.895e7caa.js => 164.86969602.js} (97%) rename assets/js/{165.b40b7cd4.js => 165.25950d0a.js} (98%) rename assets/js/{17.19402d73.js => 17.aa77e5f2.js} (99%) rename assets/js/{171.94f9605c.js => 171.712fd1e0.js} (95%) rename assets/js/{19.a0826f1f.js => 19.34235057.js} (99%) rename assets/js/{21.175cdbfd.js => 21.c68c08fd.js} (82%) rename assets/js/{22.7417d43d.js => 22.c13a7bf1.js} (80%) rename assets/js/{23.306786fd.js => 23.fcea8aa8.js} (99%) rename assets/js/{24.ee841795.js => 24.3eabf55c.js} (88%) rename assets/js/{27.7a573265.js => 27.73ac3d93.js} (86%) rename assets/js/{29.4f814518.js => 29.5a61b42a.js} (75%) rename assets/js/{37.433ff2dc.js => 37.12b78be2.js} (99%) rename assets/js/{40.f388cce8.js => 40.5f55dac3.js} (99%) rename assets/js/{41.b89f42cb.js => 41.6bb6d0af.js} (86%) rename assets/js/{48.546b1a1c.js => 48.a7c396c2.js} (99%) rename assets/js/{53.de1685c3.js => 53.7465bd8d.js} (87%) rename assets/js/{67.7572d8d1.js => 67.78656f08.js} (99%) rename assets/js/{72.119678b2.js => 72.f8ac4708.js} (96%) rename assets/js/{76.bd24ad38.js => 76.2fb25567.js} (99%) rename assets/js/{78.0606917e.js => 78.9df980a0.js} (97%) rename assets/js/{80.1c986895.js => 80.09b42ef2.js} (94%) rename assets/js/{84.09891e28.js => 84.88cedb38.js} (98%) rename assets/js/{87.23c7b355.js => 87.b75e9822.js} (99%) rename assets/js/{88.7bdcb920.js => 88.25ff612b.js} (96%) rename assets/js/{91.b8cc05dc.js => 91.62310f4b.js} (99%) rename assets/js/{95.217b4f78.js => 95.45ab5873.js} (98%) rename assets/js/{96.e5b0330c.js => 96.9898986c.js} (99%) rename assets/js/{app.e4bdef9f.js => app.f6e25125.js} (87%) diff --git a/404.html b/404.html index 39e81270cc..03e56be009 100644 --- a/404.html +++ b/404.html @@ -9,13 +9,13 @@ - + -

404

Looks like we've got some broken links.
+ - + diff --git a/API/Greenfield/Plugins/swagger.json b/API/Greenfield/Plugins/swagger.json index ad53f0a798..a5d58a0345 100644 --- a/API/Greenfield/Plugins/swagger.json +++ b/API/Greenfield/Plugins/swagger.json @@ -28,6 +28,35 @@ "url": "https://docs.btcpayserver.org/API/Greenfield/v1/" }, "components": { + "parameters": { + "StoreId": { + "name": "storeId", + "in": "path", + "required": true, + "description": "The store ID", + "schema": { + "$ref": "#/components/schemas/StoreId" + } + }, + "InvoiceId": { + "name": "invoiceId", + "in": "path", + "required": true, + "description": "The invoice ID", + "schema": { + "type": "string" + } + }, + "UserIdOrEmail": { + "name": "idOrEmail", + "in": "path", + "required": true, + "description": "The user's id or email", + "schema": { + "type": "string" + } + } + }, "schemas": { "ValidationProblemDetails": { "type": "array", @@ -110,6 +139,11 @@ "format": "minutes", "description": "A span of times in minutes" }, + "StoreId": { + "type": "string", + "description": "Store ID of the item", + "example": "9CiNzKoANXxmk5ayZngSXrHTiVvvgCrwrpFQd4m2K776" + }, "PaymentMethodId": { "type": "string", "description": "Payment method IDs. Available payment method IDs for Bitcoin are: \n- `\"BTC-CHAIN\"`: Onchain \n-`\"BTC-LN\"`: Lightning \n- `\"BTC-LNURL\"`: LNURL", diff --git a/API/Greenfield/v1/swagger.json b/API/Greenfield/v1/swagger.json index 59eadb1510..1cb31b5532 100644 --- a/API/Greenfield/v1/swagger.json +++ b/API/Greenfield/v1/swagger.json @@ -47,19 +47,13 @@ "description": "Revoke the API key of a target user so that it cannot be used anymore", "parameters": [ { - "name": "apikey", - "in": "path", - "required": true, - "description": "The API Key to revoke", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/UserIdOrEmail" }, { - "name": "idOrEmail", + "name": "apikey", "in": "path", "required": true, - "description": "The target user's id or email", + "description": "The API Key to revoke", "schema": { "type": "string" } @@ -244,13 +238,7 @@ "description": "Create a new API Key for a user", "parameters": [ { - "name": "idOrEmail", - "in": "path", - "required": true, - "description": "The target user's id or email", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/UserIdOrEmail" } ], "responses": { @@ -324,13 +312,7 @@ "/api/v1/stores/{storeId}/apps/pos": { "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store ID", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "post": { @@ -387,13 +369,7 @@ "/api/v1/apps/pos/{appId}": { "parameters": [ { - "name": "appId", - "in": "path", - "required": true, - "description": "App ID", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/AppId" } ], "put": { @@ -482,13 +458,7 @@ "/api/v1/apps/crowdfund/{appId}": { "parameters": [ { - "name": "appId", - "in": "path", - "required": true, - "description": "Crowdfund app ID", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/AppId" } ], "get": { @@ -527,13 +497,7 @@ "/api/v1/stores/{storeId}/apps/crowdfund": { "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store ID", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "post": { @@ -597,13 +561,7 @@ "description": "Returns basic app data shared between all types of apps", "parameters": [ { - "name": "appId", - "in": "path", - "required": true, - "description": "The app ID", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/AppId" } ], "responses": { @@ -639,13 +597,7 @@ "description": "Deletes apps with specified ID", "parameters": [ { - "name": "appId", - "in": "path", - "required": true, - "description": "The app ID", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/AppId" } ], "responses": { @@ -673,6 +625,11 @@ ], "summary": "Uploads an image for a app item", "description": "Uploads an image for a app item", + "parameters": [ + { + "$ref": "#/components/parameters/AppId" + } + ], "requestBody": { "content": { "multipart/form-data": { @@ -724,6 +681,20 @@ "summary": "Deletes the app item image", "description": "Deletes the app item image", "operationId": "App_DeleteAppItemImage", + "parameters": [ + { + "$ref": "#/components/parameters/AppId" + }, + { + "name": "fileId", + "in": "path", + "required": true, + "description": "The file ID", + "schema": { + "type": "string" + } + } + ], "responses": { "200": { "description": "App item image deleted successfully" @@ -751,6 +722,9 @@ "summary": "Get app sales statistics", "description": "Returns sales statistics for the app", "parameters": [ + { + "$ref": "#/components/parameters/AppId" + }, { "name": "numberOfDays", "in": "query", @@ -761,15 +735,6 @@ "type": "number", "default": 7 } - }, - { - "name": "appId", - "in": "path", - "required": true, - "description": "The app ID", - "schema": { - "type": "string" - } } ], "responses": { @@ -806,6 +771,9 @@ "summary": "Get app top items statistics", "description": "Returns top items statistics for the app", "parameters": [ + { + "$ref": "#/components/parameters/AppId" + }, { "name": "count", "in": "query", @@ -827,15 +795,6 @@ "type": "number", "default": 0 } - }, - { - "name": "appId", - "in": "path", - "required": true, - "description": "The app ID", - "schema": { - "type": "string" - } } ], "responses": { @@ -869,13 +828,7 @@ "/api/v1/stores/{storeId}/apps": { "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store ID", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "get": { @@ -898,6 +851,9 @@ } } } + }, + "403": { + "description": "If you are authenticated but forbidden to get the data" } }, "security": [ @@ -931,6 +887,9 @@ } } } + }, + "403": { + "description": "If you are authenticated but forbidden to get the data" } }, "security": [ @@ -1224,6 +1183,9 @@ } } }, + "403": { + "description": "If you are authenticated but forbidden to get the data" + }, "default": { "description": "Unexpected error", "content": { @@ -1245,6 +1207,9 @@ ], "summary": "Get invoices", "parameters": [ + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "orderId", "in": "query", @@ -1313,15 +1278,6 @@ "schema": { "$ref": "#/components/schemas/UnixTimestamp" } - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to query", - "schema": { - "type": "string" - } } ], "description": "View information about the existing invoices", @@ -1374,13 +1330,7 @@ "summary": "Create a new invoice", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Create a new invoice", @@ -1438,22 +1388,10 @@ "summary": "Get invoice", "parameters": [ { - "name": "invoiceId", - "in": "path", - "required": true, - "description": "The invoice to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/InvoiceId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "View information about the specified invoice", @@ -1494,22 +1432,10 @@ "operationId": "Invoices_ArchiveInvoice", "parameters": [ { - "name": "invoiceId", - "in": "path", - "required": true, - "description": "The invoice to remove", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/InvoiceId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store the invoice belongs to", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "responses": { @@ -1551,22 +1477,10 @@ "operationId": "Invoices_UpdateInvoice", "parameters": [ { - "name": "invoiceId", - "in": "path", - "required": true, - "description": "The invoice to update", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/InvoiceId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store the invoice belongs to", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "responses": { @@ -1624,6 +1538,12 @@ ], "summary": "Get invoice payment methods", "parameters": [ + { + "$ref": "#/components/parameters/InvoiceId" + }, + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "includeSensitive", "in": "query", @@ -1643,24 +1563,6 @@ "type": "boolean", "default": true } - }, - { - "name": "invoiceId", - "in": "path", - "required": true, - "description": "The invoice to fetch", - "schema": { - "type": "string" - } - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } } ], "description": "View information about the specified invoice's payment methods", @@ -1705,22 +1607,10 @@ "summary": "Mark invoice status", "parameters": [ { - "name": "invoiceId", - "in": "path", - "required": true, - "description": "The invoice to update", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/InvoiceId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Mark an invoice as invalid or settled.", @@ -1778,22 +1668,10 @@ "summary": "Unarchive invoice", "parameters": [ { - "name": "invoiceId", - "in": "path", - "required": true, - "description": "The invoice to update", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/InvoiceId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Unarchive an invoice", @@ -1841,25 +1719,13 @@ "summary": "Activate Payment Method", "parameters": [ { - "$ref": "#/components/parameters/PaymentMethodId" + "$ref": "#/components/parameters/InvoiceId" }, { - "name": "invoiceId", - "in": "path", - "required": true, - "description": "The invoice to update", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Activate an invoice payment method (if lazy payments mode is enabled)", @@ -1900,22 +1766,10 @@ "summary": "Refund invoice", "parameters": [ { - "name": "invoiceId", - "in": "path", - "required": true, - "description": "The invoice to refund", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/InvoiceId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Refund invoice", @@ -2022,14 +1876,7 @@ "summary": "Get node information", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" } ], "description": "View information about the lightning node", @@ -2070,14 +1917,7 @@ "summary": "Get node balance", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" } ], "description": "View balance of the lightning node", @@ -2118,14 +1958,7 @@ "summary": "Get node balance histogram", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" } ], "description": "View balance histogram of the lightning node", @@ -2166,14 +1999,7 @@ "summary": "Connect to lightning node", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" } ], "description": "Connect to another lightning node.", @@ -2237,14 +2063,7 @@ "summary": "Get channels", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" } ], "description": "View information about the current channels of the lightning node", @@ -2283,14 +2102,7 @@ "summary": "Open channel", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" } ], "description": "Open a channel with another lightning node. You should connect to that node first.", @@ -2351,14 +2163,7 @@ "summary": "Get deposit address", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" } ], "description": "Get an on-chain deposit address for the lightning node ", @@ -2400,14 +2205,7 @@ "summary": "Get payment", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { "name": "paymentHash", @@ -2457,14 +2255,7 @@ "summary": "Get invoice", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { "name": "id", @@ -2514,14 +2305,7 @@ "summary": "Pay Lightning Invoice", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" } ], "description": "Pay a lightning invoice. In case the payment response times out, the status will be reported as pending and the final status can be resolved using the [Get payment](#operation/InternalLightningNodeApi_GetPayment) endpoint. The default wait time for payment responses is 30 seconds — it might take longer if multiple routes are tried or a hold invoice is getting paid.", @@ -2602,14 +2386,7 @@ "summary": "Get invoices", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { "name": "pendingOnly", @@ -2690,14 +2467,7 @@ "summary": "Create lightning invoice", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" } ], "description": "Create a lightning invoice.", @@ -2758,14 +2528,7 @@ "summary": "Get payments", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { "name": "includePending", @@ -2848,23 +2611,10 @@ "summary": "Get node information", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning-node configuration to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "View information about the lightning node", @@ -2905,23 +2655,10 @@ "summary": "Get node balance", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning-node configuration to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "View balance of the lightning node", @@ -2962,23 +2699,10 @@ "summary": "Get node balance histogram", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning-node configuration to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "View balance histogram of the lightning node", @@ -3019,23 +2743,10 @@ "summary": "Connect to lightning node", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning-node configuration to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Connect to another lightning node.", @@ -3099,23 +2810,10 @@ "summary": "Get channels", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning-node configuration to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "View information about the current channels of the lightning node", @@ -3154,23 +2852,10 @@ "summary": "Open channel", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning-node configuration to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Open a channel with another lightning node. You should connect to that node first.", @@ -3233,6 +2918,9 @@ ], "summary": "Get deposit address", "parameters": [ + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "cryptoCode", "in": "path", @@ -3243,15 +2931,6 @@ "description": "A bitcoin address belonging to the lightning node" }, "example": "BTC" - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning-node configuration to query", - "schema": { - "type": "string" - } } ], "description": "Get an on-chain deposit address for the lightning node ", @@ -3292,29 +2971,16 @@ "summary": "Get payment", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { - "name": "paymentHash", - "in": "path", - "required": true, - "description": "The payment hash of the lightning payment.", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "paymentHash", "in": "path", "required": true, - "description": "The store id with the lightning-node configuration to query", + "description": "The payment hash of the lightning payment.", "schema": { "type": "string" } @@ -3358,29 +3024,16 @@ "summary": "Get invoice", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { - "name": "id", - "in": "path", - "required": true, - "description": "The id of the lightning invoice.", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "id", "in": "path", "required": true, - "description": "The store id with the lightning-node configuration to query", + "description": "The id of the lightning invoice.", "schema": { "type": "string" } @@ -3424,23 +3077,10 @@ "summary": "Pay Lightning Invoice", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning-node configuration to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Pay a lightning invoice. In case the payment response times out, the status will be reported as pending and the final status can be resolved using the [Get payment](#operation/StoreLightningNodeApi_GetPayment) endpoint. The default wait time for payment responses is 30 seconds — it might take longer if multiple routes are tried or a hold invoice is getting paid.", @@ -3521,14 +3161,10 @@ "summary": "Get invoices", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" + }, + { + "$ref": "#/components/parameters/StoreId" }, { "name": "pendingOnly", @@ -3551,15 +3187,6 @@ "nullable": true, "default": 0 } - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning-node configuration to query", - "schema": { - "type": "string" - } } ], "description": "View information about the lightning invoices", @@ -3618,23 +3245,10 @@ "summary": "Create lightning invoice", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning-node configuration to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Create a lightning invoice.", @@ -3695,14 +3309,10 @@ "summary": "Get payments", "parameters": [ { - "name": "cryptoCode", - "in": "path", - "required": true, - "description": "The cryptoCode of the lightning-node to query", - "schema": { - "type": "string" - }, - "example": "BTC" + "$ref": "#/components/parameters/CryptoCode" + }, + { + "$ref": "#/components/parameters/StoreId" }, { "name": "includePending", @@ -3725,15 +3335,6 @@ "nullable": true, "default": 0 } - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id with the lightning-node configuration to query", - "schema": { - "type": "string" - } } ], "description": "View information about the lightning payments", @@ -3819,6 +3420,9 @@ } } }, + "403": { + "description": "If you are authenticated but forbidden to get the data" + }, "default": { "description": "Unexpected error", "content": { @@ -3870,6 +3474,9 @@ } } }, + "403": { + "description": "If you are authenticated but forbidden to get the data" + }, "default": { "description": "Unexpected error", "content": { @@ -3918,6 +3525,9 @@ } } }, + "403": { + "description": "If you are authenticated but forbidden to get the data" + }, "default": { "description": "Unexpected error", "content": { @@ -3935,13 +3545,7 @@ "/i/{invoiceId}": { "parameters": [ { - "name": "invoiceId", - "in": "path", - "required": true, - "description": "The invoice id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/InvoiceId" }, { "name": "lang", @@ -3968,6 +3572,9 @@ "example": "The HTML checkout page of the invoice" } } + }, + "404": { + "description": "The invoice could not be found" } }, "security": [] @@ -4036,6 +3643,9 @@ } } } + }, + "403": { + "description": "If you are authenticated but forbidden to get the data" } }, "security": [ @@ -4228,7 +3838,7 @@ ], "summary": "Update notification settings", "description": "Updates the current user's notification settings", - "operationId": "Notifications_UpdateNotification", + "operationId": "Notifications_UpdateNotificationSettings", "responses": { "200": { "description": "The current user's notification settings", @@ -4268,17 +3878,11 @@ "get": { "tags": [ "Payment Requests" - ], - "summary": "Get payment requests", - "parameters": [ - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to query", - "schema": { - "type": "string" - } + ], + "summary": "Get payment requests", + "parameters": [ + { + "$ref": "#/components/parameters/StoreId" } ], "description": "View information about the existing payment requests", @@ -4321,13 +3925,7 @@ "summary": "Create a new payment request", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to query", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Create a new payment request", @@ -4385,19 +3983,13 @@ "summary": "Get payment request", "parameters": [ { - "name": "paymentRequestId", - "in": "path", - "required": true, - "description": "The payment request to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "paymentRequestId", "in": "path", "required": true, - "description": "The store to fetch", + "description": "The payment request to fetch", "schema": { "type": "string" } @@ -4441,19 +4033,13 @@ "operationId": "PaymentRequests_ArchivePaymentRequest", "parameters": [ { - "name": "paymentRequestId", - "in": "path", - "required": true, - "description": "The payment request to remove", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "paymentRequestId", "in": "path", "required": true, - "description": "The store the payment request belongs to", + "description": "The payment request to remove", "schema": { "type": "string" } @@ -4496,19 +4082,13 @@ "summary": "Update payment request", "parameters": [ { - "name": "paymentRequestId", - "in": "path", - "required": true, - "description": "The payment request to update", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "paymentRequestId", "in": "path", "required": true, - "description": "The store to query", + "description": "The payment request to update", "schema": { "type": "string" } @@ -4569,19 +4149,13 @@ "summary": "Create a new invoice for the payment request", "parameters": [ { - "name": "paymentRequestId", - "in": "path", - "required": true, - "description": "The payment request to create", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "paymentRequestId", "in": "path", "required": true, - "description": "The store to fetch", + "description": "The payment request to create", "schema": { "type": "string" } @@ -4667,13 +4241,7 @@ "summary": "Get store configured payout processors", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Get store configured payout processors", @@ -4720,19 +4288,13 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "processor", - "in": "path", - "required": true, - "description": "The processor", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "processor", "in": "path", "required": true, - "description": "The store", + "description": "The processor", "schema": { "type": "string" } @@ -4782,6 +4344,9 @@ } } } + }, + "403": { + "description": "If you are authenticated but forbidden to get the data" } }, "security": [ @@ -4803,13 +4368,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Get configured store onchain automated payout processors", @@ -4854,13 +4413,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Update configured store onchain automated payout processors", @@ -4916,13 +4469,7 @@ "$ref": "#/components/parameters/PayoutMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Get configured store Lightning automated payout processors", @@ -4964,16 +4511,10 @@ "summary": "Update configured store Lightning automated payout processors", "parameters": [ { - "$ref": "#/components/parameters/PaymentMethodId" + "$ref": "#/components/parameters/PayoutMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Update configured store Lightning automated payout processors", @@ -5026,13 +4567,7 @@ "summary": "Get configured store onchain automated payout processors", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Get configured store onchain automated payout processors", @@ -5074,13 +4609,7 @@ "summary": "Update configured store onchain automated payout processors", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Update configured store onchain automated payout processors", @@ -5133,13 +4662,7 @@ "summary": "Get configured store Lightning automated payout processors", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Get configured store Lightning automated payout processors", @@ -5291,13 +4814,7 @@ "/api/v1/stores/{storeId}/pull-payments": { "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store ID", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "get": { @@ -5326,6 +4843,9 @@ } } } + }, + "403": { + "description": "If you are authenticated but forbidden to get the data" } }, "tags": [ @@ -5489,19 +5009,13 @@ "/api/v1/stores/{storeId}/pull-payments/{pullPaymentId}": { "parameters": [ { - "name": "pullPaymentId", - "in": "path", - "required": true, - "description": "The ID of the pull payment", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "pullPaymentId", "in": "path", "required": true, - "description": "The ID of the store", + "description": "The ID of the pull payment", "schema": { "type": "string" } @@ -5727,13 +5241,7 @@ "/api/v1/stores/{storeId}/payouts": { "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The ID of the store", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "post": { @@ -5840,19 +5348,13 @@ "/api/v1/stores/{storeId}/payouts/{payoutId}": { "parameters": [ { - "name": "payoutId", - "in": "path", - "required": true, - "description": "The ID of the payout", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "payoutId", "in": "path", "required": true, - "description": "The ID of the store", + "description": "The ID of the payout", "schema": { "type": "string" } @@ -5989,19 +5491,13 @@ "/api/v1/stores/{storeId}/payouts/{payoutId}/mark-paid": { "parameters": [ { - "name": "payoutId", - "in": "path", - "required": true, - "description": "The ID of the payout", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "payoutId", "in": "path", "required": true, - "description": "The ID of the store", + "description": "The ID of the payout", "schema": { "type": "string" } @@ -6055,19 +5551,13 @@ "/api/v1/stores/{storeId}/payouts/{payoutId}/mark": { "parameters": [ { - "name": "payoutId", - "in": "path", - "required": true, - "description": "The ID of the payout", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "payoutId", "in": "path", "required": true, - "description": "The ID of the store", + "description": "The ID of the payout", "schema": { "type": "string" } @@ -6227,13 +5717,7 @@ "summary": "Get store email settings", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "View email settings of the specified store", @@ -6272,13 +5756,7 @@ "summary": "Update store email settings", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to update", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Update a store's email settings", @@ -6340,13 +5818,7 @@ "description": "Send an email using the store's SMTP server", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to send the email from", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "requestBody": { @@ -6393,13 +5865,7 @@ "summary": "Get store configured lightning addresses", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Get store configured lightning addresses", @@ -6443,19 +5909,13 @@ "summary": "Get store configured lightning address", "parameters": [ { - "name": "username", - "in": "path", - "required": true, - "description": "The lightning address username", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "username", "in": "path", "required": true, - "description": "The store to fetch", + "description": "The lightning address username", "schema": { "type": "string" } @@ -6497,13 +5957,7 @@ "summary": "Add or update store configured lightning address", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { "name": "username", @@ -6563,19 +6017,13 @@ "summary": "Remove configured lightning address", "parameters": [ { - "name": "username", - "in": "path", - "required": true, - "description": "The lightning address username", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "storeId", + "name": "username", "in": "path", "required": true, - "description": "The store to fetch", + "description": "The lightning address username", "schema": { "type": "string" } @@ -6613,6 +6061,9 @@ "description": "View information about the stores' configured payment methods", "operationId": "StorePaymentMethods_GetStorePaymentMethods", "parameters": [ + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "onlyEnabled", "in": "query", @@ -6630,15 +6081,6 @@ "schema": { "type": "boolean" } - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } } ], "responses": { @@ -6698,6 +6140,9 @@ { "$ref": "#/components/parameters/PaymentMethodId" }, + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "includeConfig", "in": "query", @@ -6706,15 +6151,6 @@ "schema": { "type": "boolean" } - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } } ], "responses": { @@ -6770,13 +6206,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "requestBody": { @@ -6841,13 +6271,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "responses": { @@ -6893,13 +6317,7 @@ "summary": "Get store rate settings", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "View rate settings of the specified store", @@ -6935,15 +6353,9 @@ "tags": [ "Stores (Rates Config)" ], - "parameters": [ - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "parameters": [ + { + "$ref": "#/components/parameters/StoreId" } ], "summary": "Update store rate settings", @@ -7002,6 +6414,9 @@ "Stores (Rates Config)" ], "parameters": [ + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "currencyPair", "description": "The currency pairs to preview", @@ -7016,15 +6431,6 @@ } }, "x-position": 1 - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } } ], "summary": "Preview rate configuration results", @@ -7086,6 +6492,9 @@ "Stores (Rates)" ], "parameters": [ + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "currencyPair", "description": "The currency pairs to fetch rates for", @@ -7104,15 +6513,6 @@ } }, "x-position": 1 - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } } ], "summary": "Get rates", @@ -7164,13 +6564,7 @@ "summary": "Get store users", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "View users of the specified store", @@ -7187,10 +6581,10 @@ } }, "403": { - "description": "If you are authenticated but forbidden to view the specified store" + "description": "If you are authenticated but forbidden to view the specified store's users" }, "404": { - "description": "The key is not found for this store" + "description": "The store could not be found" } }, "security": [ @@ -7211,13 +6605,7 @@ "operationId": "Stores_AddStoreUser", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "requestBody": { @@ -7237,7 +6625,7 @@ "description": "The user was added" }, "400": { - "description": "A list of errors that occurred when creating the store", + "description": "A list of errors that occurred when adding the store user", "content": { "application/json": { "schema": { @@ -7247,7 +6635,10 @@ } }, "403": { - "description": "If you are authenticated but forbidden to add new stores" + "description": "If you are authenticated but forbidden to add new store users" + }, + "404": { + "description": "The store or user could not be found" }, "409": { "description": "Error code: `duplicate-store-user-role`. Removing this user would result in the store having no owner.", @@ -7271,6 +6662,63 @@ } }, "/api/v1/stores/{storeId}/users/{idOrEmail}": { + "put": { + "tags": [ + "Stores (Users)" + ], + "summary": "Updates a store user", + "description": "Updates a store user", + "operationId": "Stores_UpdateStoreUser", + "parameters": [ + { + "$ref": "#/components/parameters/StoreId" + }, + { + "$ref": "#/components/parameters/UserIdOrEmail" + } + ], + "requestBody": { + "x-name": "request", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/StoreUserData" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "200": { + "description": "The user was updated" + }, + "400": { + "description": "A list of errors that occurred when updating the store user", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ValidationProblemDetails" + } + } + } + }, + "403": { + "description": "If you are authenticated but forbidden to update store users" + }, + "404": { + "description": "The store or user could not be found" + } + }, + "security": [ + { + "API_Key": [ + "btcpay.store.canmodifystoresettings" + ], + "Basic": [] + } + ] + }, "delete": { "tags": [ "Stores (Users)" @@ -7280,22 +6728,10 @@ "description": "Removes the specified store user. If there is no other owner, this endpoint will fail.", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "idOrEmail", - "in": "path", - "required": true, - "description": "The user's id or email", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/UserIdOrEmail" } ], "responses": { @@ -7303,7 +6739,7 @@ "description": "The user has been removed" }, "400": { - "description": "A list of errors that occurred when removing the store", + "description": "A list of errors that occurred when removing the store user", "content": { "application/json": { "schema": { @@ -7323,10 +6759,10 @@ } }, "403": { - "description": "If you are authenticated but forbidden to remove the specified store" + "description": "If you are authenticated but forbidden to remove the specified store user" }, "404": { - "description": "The key is not found for this store" + "description": "The store or user could not be found" } }, "security": [ @@ -7350,13 +6786,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "View information about the specified wallet", @@ -7400,13 +6830,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "View the balance histogram of the specified wallet", @@ -7449,6 +6873,9 @@ { "$ref": "#/components/parameters/PaymentMethodId" }, + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "blockTarget", "in": "query", @@ -7458,15 +6885,6 @@ "type": "number", "minimum": 1 } - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } } ], "description": "Get wallet onchain fee rate", @@ -7510,13 +6928,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { "name": "forceGenerate", @@ -7568,13 +6980,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "UnReserve address", @@ -7610,6 +7016,9 @@ { "$ref": "#/components/parameters/PaymentMethodId" }, + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "labelFilter", "in": "query", @@ -7649,15 +7058,6 @@ "$ref": "#/components/schemas/TransactionStatus" } } - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } } ], "description": "Get store on-chain wallet transactions", @@ -7705,13 +7105,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "requestBody": { @@ -7773,13 +7167,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { "name": "transactionId", @@ -7830,13 +7218,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { "name": "transactionId", @@ -7908,13 +7290,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Get store on-chain wallet utxos", @@ -7961,13 +7337,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Generate a wallet and update the specified store's payment method to it", @@ -8044,6 +7414,9 @@ ], "summary": "Preview store on-chain payment method addresses", "parameters": [ + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "paymentMethodId", "in": "path", @@ -8071,15 +7444,6 @@ "schema": { "type": "number" } - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } } ], "description": "View addresses of the current payment method of the store", @@ -8120,6 +7484,9 @@ { "$ref": "#/components/parameters/PaymentMethodId" }, + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "offset", "in": "query", @@ -8137,15 +7504,6 @@ "schema": { "type": "number" } - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } } ], "description": "View addresses of a proposed payment method of the store", @@ -8207,6 +7565,9 @@ { "$ref": "#/components/parameters/PaymentMethodId" }, + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "ids", "in": "query", @@ -8230,15 +7591,6 @@ }, "example": "tx" }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } - }, { "name": "includeNeighbourData", "in": "query", @@ -8292,13 +7644,7 @@ "$ref": "#/components/parameters/PaymentMethodId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Add/Update wallet objects", @@ -8351,6 +7697,9 @@ { "$ref": "#/components/parameters/PaymentMethodId" }, + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "objectId", "in": "path", @@ -8371,15 +7720,6 @@ }, "example": "tx" }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } - }, { "name": "includeNeighbourData", "in": "query", @@ -8429,6 +7769,9 @@ { "$ref": "#/components/parameters/PaymentMethodId" }, + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "objectId", "in": "path", @@ -8448,15 +7791,6 @@ "type": "string" }, "example": "tx" - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } } ], "description": "Remove wallet object", @@ -8492,6 +7826,9 @@ { "$ref": "#/components/parameters/PaymentMethodId" }, + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "objectId", "in": "path", @@ -8511,15 +7848,6 @@ "type": "string" }, "example": "tx" - }, - { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } } ], "description": "Add/Update wallet object link", @@ -8565,6 +7893,9 @@ { "$ref": "#/components/parameters/PaymentMethodId" }, + { + "$ref": "#/components/parameters/StoreId" + }, { "name": "linkId", "in": "path", @@ -8589,30 +7920,21 @@ "name": "linkType", "in": "path", "required": true, - "description": "The object type of the linked neighbour", - "schema": { - "type": "string" - }, - "example": "tx" - }, - { - "name": "objectType", - "in": "path", - "required": true, - "description": "The object type to fetch", + "description": "The object type of the linked neighbour", "schema": { "type": "string" }, "example": "tx" }, { - "name": "storeId", + "name": "objectType", "in": "path", "required": true, - "description": "The store to fetch", + "description": "The object type to fetch", "schema": { "type": "string" - } + }, + "example": "tx" } ], "description": "Remove wallet object link", @@ -8739,13 +8061,7 @@ "summary": "Get store", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "View information about the specified store", @@ -8784,13 +8100,7 @@ "summary": "Update store", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to update", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "Update the specified store", @@ -8853,13 +8163,7 @@ "description": "Removes the specified store. If there is another user with access, only your access will be removed.", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to remove", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "responses": { @@ -8900,6 +8204,11 @@ ], "summary": "Uploads a logo for the store", "description": "Uploads a logo for the store", + "parameters": [ + { + "$ref": "#/components/parameters/StoreId" + } + ], "requestBody": { "content": { "multipart/form-data": { @@ -8949,6 +8258,11 @@ "summary": "Deletes the store logo", "description": "Delete the store's logo", "operationId": "Stores_DeleteStoreLogo", + "parameters": [ + { + "$ref": "#/components/parameters/StoreId" + } + ], "responses": { "200": { "description": "Store logo deleted successfully" @@ -8975,13 +8289,7 @@ "summary": "Get store's roles", "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store to fetch", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "description": "View information about the specified store's roles", @@ -9344,13 +8652,7 @@ "description": "Get 1 user by ID or Email.", "parameters": [ { - "name": "idOrEmail", - "in": "path", - "required": true, - "description": "The ID or email of the user to load", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/UserIdOrEmail" } ], "responses": { @@ -9392,13 +8694,7 @@ "description": "Delete a user.\n\nMust be an admin to perform this operation.\n\nAttempting to delete the only admin user will not succeed.\n\nAll data associated with the user will be deleted as well if the operation succeeds.", "parameters": [ { - "name": "idOrEmail", - "in": "path", - "required": true, - "description": "The ID or email of the user to be deleted", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/UserIdOrEmail" } ], "responses": { @@ -9435,13 +8731,7 @@ "description": "Lock or unlock a user.\n\nMust be an admin to perform this operation.\n\nAttempting to lock the only admin user will not succeed.", "parameters": [ { - "name": "idOrEmail", - "in": "path", - "required": true, - "description": "The ID of the user to be un/locked", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/UserIdOrEmail" } ], "requestBody": { @@ -9488,13 +8778,7 @@ "description": "Approve or unapprove a user.\n\nMust be an admin to perform this operation.\n\nAttempting to (un)approve a user for which this requirement does not exist will not succeed.", "parameters": [ { - "name": "idOrEmail", - "in": "path", - "required": true, - "description": "The ID of the user to be un/approved", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/UserIdOrEmail" } ], "requestBody": { @@ -9534,13 +8818,7 @@ "/api/v1/stores/{storeId}/webhooks": { "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" } ], "get": { @@ -9628,22 +8906,10 @@ "/api/v1/stores/{storeId}/webhooks/{webhookId}": { "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "webhookId", - "in": "path", - "required": true, - "description": "The webhook id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/WebhookId" } ], "get": { @@ -9754,22 +9020,10 @@ "/api/v1/stores/{storeId}/webhooks/{webhookId}/deliveries": { "parameters": [ { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "webhookId", - "in": "path", - "required": true, - "description": "The webhook id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/WebhookId" } ], "get": { @@ -9818,31 +9072,13 @@ "/api/v1/stores/{storeId}/webhooks/{webhookId}/deliveries/{deliveryId}": { "parameters": [ { - "name": "deliveryId", - "in": "path", - "required": true, - "description": "The id of the delivery", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/DeliveryId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "webhookId", - "in": "path", - "required": true, - "description": "The webhook id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/WebhookId" } ], "get": { @@ -9880,31 +9116,13 @@ "/api/v1/stores/{storeId}/webhooks/{webhookId}/deliveries/{deliveryId}/request": { "parameters": [ { - "name": "deliveryId", - "in": "path", - "required": true, - "description": "The id of the delivery", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/DeliveryId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "webhookId", - "in": "path", - "required": true, - "description": "The webhook id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/WebhookId" } ], "get": { @@ -9946,31 +9164,13 @@ "/api/v1/stores/{storeId}/webhooks/{webhookId}/deliveries/{deliveryId}/redeliver": { "parameters": [ { - "name": "deliveryId", - "in": "path", - "required": true, - "description": "The id of the delivery", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/DeliveryId" }, { - "name": "storeId", - "in": "path", - "required": true, - "description": "The store id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/StoreId" }, { - "name": "webhookId", - "in": "path", - "required": true, - "description": "The webhook id", - "schema": { - "type": "string" - } + "$ref": "#/components/parameters/WebhookId" } ], "post": { @@ -10053,9 +9253,12 @@ "example": "my test app" }, "storeId": { - "type": "string", "description": "Id of the store to which the app belongs", - "example": "9CiNzKoANXxmk5ayZngSXrHTiVvvgCrwrpFQd4m2K776" + "allOf": [ + { + "$ref": "#/components/schemas/StoreId" + } + ] }, "created": { "type": "integer", @@ -10473,7 +9676,7 @@ "price": { "type": 2, "formatted": "$100.00", - "value": 100 + "value": 100.0 }, "title": "test perk", "buyButtonText": null, @@ -10675,6 +9878,7 @@ "nullable": true }, "created": { + "type": "number", "nullable": true, "description": "The creation date of the file as a unix timestamp", "allOf": [ @@ -10706,6 +9910,7 @@ "additionalProperties": false, "properties": { "status": { + "type": "string", "nullable": false, "description": "Mark an invoice as completed or invalid.", "allOf": [ @@ -10772,6 +9977,7 @@ "$ref": "#/components/schemas/InvoiceMetadata" }, "checkout": { + "type": "object", "nullable": true, "description": "Additional settings to customize the checkout flow", "allOf": [ @@ -10781,6 +9987,7 @@ ] }, "receipt": { + "type": "object", "nullable": true, "description": "Additional settings to customize the public receipt", "allOf": [ @@ -10805,8 +10012,12 @@ "description": "The identifier of the invoice" }, "storeId": { - "type": "string", - "description": "The store identifier that the invoice belongs to" + "description": "The store identifier that the invoice belongs to", + "allOf": [ + { + "$ref": "#/components/schemas/StoreId" + } + ] }, "amount": { "type": "string", @@ -11035,6 +10246,7 @@ "title": "Receipt information", "properties": { "receiptData": { + "type": "object", "description": "A custom JSON object that represents information displayed on the receipt page of an invoice.", "nullable": true } @@ -11090,6 +10302,7 @@ "additionalProperties": false, "properties": { "speedPolicy": { + "type": "string", "nullable": true, "allOf": [ { @@ -11111,6 +10324,7 @@ "$ref": "#/components/schemas/PaymentMethodId" } ], + "type": "string", "nullable": true, "description": "Default payment type for the invoice (e.g., BTC, BTC-LightningNetwork). Default payment method set for the store is used if this parameter is not specified." }, @@ -11120,6 +10334,7 @@ "description": "If true, payment methods are enabled individually upon user interaction in the invoice. Default to store's settings'" }, "expirationMinutes": { + "type": "number", "nullable": true, "description": "The number of minutes after which an invoice becomes expired. Defaults to the store's settings. (The default store settings is 15)", "allOf": [ @@ -11142,9 +10357,9 @@ "type": "number", "format": "double", "nullable": true, - "minimum": 0, - "maximum": 100, - "default": 0, + "minimum": 0.0, + "maximum": 100.0, + "default": 0.0, "description": "A percentage determining whether to count the invoice as paid when the invoice is paid within the specified margin of error. Defaults to the store's settings. (The default store settings is 0)" }, "redirectURL": { @@ -11456,6 +10671,11 @@ "format": "minutes", "description": "A span of times in minutes" }, + "StoreId": { + "type": "string", + "description": "Store ID of the item", + "example": "9CiNzKoANXxmk5ayZngSXrHTiVvvgCrwrpFQd4m2K776" + }, "PaymentMethodId": { "type": "string", "description": "Payment method IDs. Available payment method IDs for Bitcoin are: \n- `\"BTC-CHAIN\"`: Onchain \n-`\"BTC-LN\"`: Lightning \n- `\"BTC-LNURL\"`: LNURL", @@ -11614,6 +10834,7 @@ "description": "The payment preimage (available when status is complete)" }, "createdAt": { + "type": "number", "description": "The unix timestamp when the payment got created", "nullable": true, "allOf": [ @@ -11649,6 +10870,7 @@ "nullable": false }, "paidAt": { + "type": "number", "description": "The unix timestamp when the invoice got paid", "nullable": true, "allOf": [ @@ -11774,6 +10996,7 @@ "type": "object", "properties": { "onchain": { + "type": "object", "description": "On-chain balance of the Lightning node", "nullable": true, "allOf": [ @@ -11783,6 +11006,7 @@ ] }, "offchain": { + "type": "object", "description": "Off-chain balance of the Lightning node", "nullable": true, "allOf": [ @@ -11864,6 +11088,7 @@ "example": "21" }, "sendTimeout": { + "type": "number", "nullable": true, "example": 30, "default": 30, @@ -11927,6 +11152,11 @@ "description": "The html body of the notifications" }, "storeId": { + "allOf": [ + { + "$ref": "#/components/schemas/StoreId" + } + ], "type": "string", "nullable": true, "description": "If related to a store, the store id of the notification" @@ -11938,12 +11168,12 @@ "description": "The link of the notification" }, "createdTime": { - "description": "The creation time of the notification", "allOf": [ { "$ref": "#/components/schemas/UnixTimestamp" } - ] + ], + "description": "The creation time of the notification" }, "seen": { "type": "boolean", @@ -12086,7 +11316,13 @@ }, "storeId": { "type": "string", - "description": "The store identifier that the payment request belongs to" + "nullable": false, + "description": "The store identifier that the payment request belongs to", + "allOf": [ + { + "$ref": "#/components/schemas/StoreId" + } + ] }, "status": { "type": "string", @@ -12099,6 +11335,7 @@ "nullable": false }, "createdTime": { + "type": "number", "description": "The creation date of the payment request", "allOf": [ { @@ -12147,6 +11384,7 @@ "format": "html" }, "expiryDate": { + "type": "number", "description": "The expiry date of the payment request", "nullable": true, "allOf": [ @@ -12609,8 +11847,8 @@ "verificationProgress": { "type": "number", "format": "double", - "minimum": 0, - "maximum": 1, + "minimum": 0.0, + "maximum": 1.0, "description": "The current synchronization progress" } } @@ -12899,8 +12137,23 @@ }, "role": { "type": "string", - "description": "The role of the user. Default roles are `Owner` and `Guest`", + "description": "The role of the user. Default roles are `Owner`, `Manager`, `Employee` and `Guest`", "nullable": false + }, + "email": { + "type": "string", + "description": "The email of the user", + "nullable": true + }, + "name": { + "type": "string", + "description": "The name of the user", + "nullable": true + }, + "imageUrl": { + "type": "string", + "description": "The profile picture URL of the user", + "nullable": true } } } @@ -13473,6 +12726,7 @@ "type": "object", "properties": { "paymentMethodId": { + "type": "string", "allOf": [ { "$ref": "#/components/schemas/PaymentMethodId" @@ -13599,9 +12853,9 @@ "paymentTolerance": { "type": "number", "format": "double", - "minimum": 0, - "maximum": 100, - "default": 0, + "minimum": 0.0, + "maximum": 100.0, + "default": 0.0, "description": "Consider an invoice fully paid, even if the payment is missing 'x' % of the full amount." }, "archived": { @@ -13615,6 +12869,7 @@ "description": "If true, then no authentication is needed to create invoices on this store." }, "receipt": { + "type": "object", "nullable": true, "description": "Additional settings to customize the public receipt", "allOf": [ @@ -13705,7 +12960,7 @@ "$ref": "#/components/schemas/PaymentMethodId" }, "paymentMethodCriteria": { - "type": "array", + "type": "object", "nullable": true, "items": { "$ref": "#/components/schemas/PaymentMethodCriteriaData" @@ -13769,6 +13024,7 @@ "description": "True if the instance requires approval to log in" }, "created": { + "type": "number", "nullable": true, "description": "The creation date of the user as a unix timestamp. Null if created before v1.0.5.6", "allOf": [ @@ -13822,6 +13078,7 @@ "nullable": false }, "timestamp": { + "type": "number", "nullable": false, "description": "Timestamp of when the delivery got broadcasted", "allOf": [ @@ -14012,7 +13269,12 @@ "storeId": { "type": "string", "description": "The store id of the invoice's event", - "nullable": false + "nullable": false, + "allOf": [ + { + "$ref": "#/components/schemas/StoreId" + } + ] }, "invoiceId": { "type": "string", @@ -14112,6 +13374,7 @@ "$ref": "#/components/schemas/PaymentMethodId" } ], + "type": "string", "description": "What payment method was used for this payment", "nullable": false }, @@ -14154,20 +13417,53 @@ ] } }, - "securitySchemes": { - "API_Key": { - "type": "apiKey", - "description": "BTCPay Server supports authenticating and authorizing users through an API Key that is generated by them. Send the API Key as a header value to Authorization with the format: `token {token}`. For a smoother experience, you can generate a url that redirects users to an API key creation screen.\n\n The following permissions are available to the context of the user creating the API Key:\n\n* `unrestricted`: Unrestricted access\n* `btcpay.user.candeleteuser`: Delete user\n* `btcpay.user.canviewprofile`: View your profile\n* `btcpay.user.canmodifyprofile`: Manage your profile\n* `btcpay.user.canmanagenotificationsforuser`: Manage your notifications\n* `btcpay.user.canviewnotificationsforuser`: View your notifications\n\nThe following permissions are available if the user is an administrator:\n\n* `btcpay.server.canviewusers`: View users\n* `btcpay.server.cancreateuser`: Create new users\n* `btcpay.server.canmanageusers`: Manage users\n* `btcpay.server.canmodifyserversettings`: Manage your server\n* `btcpay.server.canuseinternallightningnode`: Use the internal lightning node\n* `btcpay.server.canviewlightninginvoiceinternalnode`: View invoices from internal lightning node\n* `btcpay.server.cancreatelightninginvoiceinternalnode`: Create invoices with internal lightning node\n\nThe following permissions applies to all stores of the user, you can limit to a specific store with the following format: `btcpay.store.cancreateinvoice:6HSHAEU4iYWtjxtyRs9KyPjM9GAQp8kw2T9VWbGG1FnZ`:\n\n* `btcpay.store.canmodifystoresettings`: Modify your stores\n* `btcpay.store.webhooks.canmodifywebhooks`: Modify stores webhooks\n* `btcpay.store.canviewstoresettings`: View your stores\n* `btcpay.store.canviewreports`: View your reports\n* `btcpay.store.cancreateinvoice`: Create an invoice\n* `btcpay.store.canviewinvoices`: View invoices\n* `btcpay.store.canmodifyinvoices`: Modify invoices\n* `btcpay.store.canmodifypaymentrequests`: Modify your payment requests\n* `btcpay.store.canviewpaymentrequests`: View your payment requests\n* `btcpay.store.canviewpullpayments`: View your pull payments\n* `btcpay.store.canmanagepullpayments`: Manage your pull payments\n* `btcpay.store.canarchivepullpayments`: Archive your pull payments\n* `btcpay.store.cancreatepullpayments`: Create pull payments\n* `btcpay.store.canmanagepayouts`: Manage payouts\n* `btcpay.store.canviewpayouts`: View payouts\n* `btcpay.store.cancreatenonapprovedpullpayments`: Create non-approved pull payments\n* `btcpay.store.canuselightningnode`: Use the lightning nodes associated with your stores\n* `btcpay.store.canviewlightninginvoice`: View the lightning invoices associated with your stores\n* `btcpay.store.cancreatelightninginvoice`: Create invoices from the lightning nodes associated with your stores\n\nNote that API Keys only limits permission of a user and can never expand it. If an API Key has the permission `btcpay.server.canmodifyserversettings` but that the user account creating this API Key is not administrator, the API Key will not be able to modify the server settings.\nSome permissions may include other permissions, see [this operation](#operation/permissionsMetadata).\n", - "name": "Authorization", - "in": "header" - }, - "Basic": { - "type": "http", - "description": "BTCPay Server supports authenticating and authorizing users through the Basic HTTP authentication scheme. Send the user and password encoded in base64 with the format `Basic {base64(username:password)}`. Using this authentication method implicitly provides you with the `unrestricted` permission", - "scheme": "Basic" - } - }, "parameters": { + "AppId": { + "name": "appId", + "in": "path", + "required": true, + "description": "App ID", + "schema": { + "type": "string" + } + }, + "StoreId": { + "name": "storeId", + "in": "path", + "required": true, + "description": "The store ID", + "schema": { + "$ref": "#/components/schemas/StoreId" + } + }, + "InvoiceId": { + "name": "invoiceId", + "in": "path", + "required": true, + "description": "The invoice ID", + "schema": { + "type": "string" + } + }, + "UserIdOrEmail": { + "name": "idOrEmail", + "in": "path", + "required": true, + "description": "The user's id or email", + "schema": { + "type": "string" + } + }, + "CryptoCode": { + "name": "cryptoCode", + "in": "path", + "required": true, + "description": "The cryptoCode of the lightning-node to query", + "schema": { + "type": "string" + }, + "example": "BTC" + }, "PaymentMethodId": { "name": "paymentMethodId", "in": "path", @@ -14179,7 +13475,7 @@ "example": "BTC-CHAIN" }, "PayoutMethodId": { - "name": "paymentMethodId", + "name": "payoutMethodId", "in": "path", "required": true, "description": "The payout method id", @@ -14187,6 +13483,37 @@ "$ref": "#/components/schemas/PayoutMethodId" }, "example": "BTC-CHAIN" + }, + "WebhookId": { + "name": "webhookId", + "in": "path", + "required": true, + "description": "The webhook id", + "schema": { + "type": "string" + } + }, + "DeliveryId": { + "name": "deliveryId", + "in": "path", + "required": true, + "description": "The id of the delivery", + "schema": { + "type": "string" + } + } + }, + "securitySchemes": { + "API_Key": { + "type": "apiKey", + "description": "BTCPay Server supports authenticating and authorizing users through an API Key that is generated by them. Send the API Key as a header value to Authorization with the format: `token {token}`. For a smoother experience, you can generate a url that redirects users to an API key creation screen.\n\n The following permissions are available to the context of the user creating the API Key:\n\n* `unrestricted`: Unrestricted access\n* `btcpay.user.candeleteuser`: Delete user\n* `btcpay.user.canviewprofile`: View your profile\n* `btcpay.user.canmodifyprofile`: Manage your profile\n* `btcpay.user.canmanagenotificationsforuser`: Manage your notifications\n* `btcpay.user.canviewnotificationsforuser`: View your notifications\n\nThe following permissions are available if the user is an administrator:\n\n* `btcpay.server.canviewusers`: View users\n* `btcpay.server.cancreateuser`: Create new users\n* `btcpay.server.canmanageusers`: Manage users\n* `btcpay.server.canmodifyserversettings`: Manage your server\n* `btcpay.server.canuseinternallightningnode`: Use the internal lightning node\n* `btcpay.server.canviewlightninginvoiceinternalnode`: View invoices from internal lightning node\n* `btcpay.server.cancreatelightninginvoiceinternalnode`: Create invoices with internal lightning node\n\nThe following permissions applies to all stores of the user, you can limit to a specific store with the following format: `btcpay.store.cancreateinvoice:6HSHAEU4iYWtjxtyRs9KyPjM9GAQp8kw2T9VWbGG1FnZ`:\n\n* `btcpay.store.canmodifystoresettings`: Modify your stores\n* `btcpay.store.webhooks.canmodifywebhooks`: Modify stores webhooks\n* `btcpay.store.canviewstoresettings`: View your stores\n* `btcpay.store.canviewreports`: View your reports\n* `btcpay.store.cancreateinvoice`: Create an invoice\n* `btcpay.store.canviewinvoices`: View invoices\n* `btcpay.store.canmodifyinvoices`: Modify invoices\n* `btcpay.store.canmodifypaymentrequests`: Modify your payment requests\n* `btcpay.store.canviewpaymentrequests`: View your payment requests\n* `btcpay.store.canviewpullpayments`: View your pull payments\n* `btcpay.store.canmanagepullpayments`: Manage your pull payments\n* `btcpay.store.canarchivepullpayments`: Archive your pull payments\n* `btcpay.store.cancreatepullpayments`: Create pull payments\n* `btcpay.store.canmanagepayouts`: Manage payouts\n* `btcpay.store.canviewpayouts`: View payouts\n* `btcpay.store.cancreatenonapprovedpullpayments`: Create non-approved pull payments\n* `btcpay.store.canuselightningnode`: Use the lightning nodes associated with your stores\n* `btcpay.store.canviewlightninginvoice`: View the lightning invoices associated with your stores\n* `btcpay.store.cancreatelightninginvoice`: Create invoices from the lightning nodes associated with your stores\n\nNote that API Keys only limits permission of a user and can never expand it. If an API Key has the permission `btcpay.server.canmodifyserversettings` but that the user account creating this API Key is not administrator, the API Key will not be able to modify the server settings.\nSome permissions may include other permissions, see [this operation](#operation/permissionsMetadata).\n", + "name": "Authorization", + "in": "header" + }, + "Basic": { + "type": "http", + "description": "BTCPay Server supports authenticating and authorizing users through the Basic HTTP authentication scheme. Send the user and password encoded in base64 with the format `Basic {base64(username:password)}`. Using this authentication method implicitly provides you with the `unrestricted` permission", + "scheme": "Basic" } } }, diff --git a/AdvancedForms/index.html b/AdvancedForms/index.html index 8dbf8c2a34..c67fdd1b26 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 31e0f6de7d..96394c0b79 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 f5bf3c2810..27208a1ef1 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 e3803f3d03..b76bbe9ed6 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 1bca587dfe..7288855f5b 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 101a17fd17..28b21cdb26 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 bd3a5bfa3a..9b262f8103 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 03e41c8523..2435443a9a 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 d1d694f136..091dd110f2 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 dc4db4c94c..cc23ceb202 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 e67cd58a87..7c678c5987 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 34785abca0..5b3fd526ea 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 3956da2d2e..05eb5e7156 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 70795128f9..3278cd9f9d 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 c53a07099c..8c8bc108ba 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 38ae204a05..7df825df72 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 8dcc9db453..aed5823884 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 7c33ee392c..b57fa463ea 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 cbc8195955..d923fc1240 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 9e4ac60752..173c64a1a6 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 4e65516f4f..6489871201 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 7594a7a216..03cb62c6d2 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 221b76bc56..ed7c0eb459 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 52dfc44438..08cebeb206 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 f0e9051ce2..72a4c6eb7f 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 75e798bb8b..929ef9ac04 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 6f2f80fcbe..b5b7e194f4 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 a7617a16ca..c27f18e4ef 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 13b4dbcfab..80fb17837c 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 f804508a64..4c43062aa0 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 4d9353e27b..cc2f3e846f 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 10a71a8fae..0ec31b29b6 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 66b5710799..57973d6425 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 42e8046019..3f721c798f 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 4ee4a03985..2f5fb390a7 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 ebd0e4ade0..81c583156d 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 530ff3e8d3..1954a4d632 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 b23a6bb11f..a5967dbea9 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 228488bfe9..d73dc053fc 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 1ca1fb811c..32c5a12733 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 b329cbb690..a63ef67994 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 9024bb23e3..4715cbc43e 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 6f5b88cb7d..aa9a5e96f1 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 102a8e4c11..79af0132b7 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 d76448f4ba..e8c7417085 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 7556adabac..22349c6982 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 4176580a58..881b994d39 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 75fee9ded7..0fca9bd686 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 a35e60ba49..190fafe18e 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 96ef561fa0..5dbd9b01ef 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 9327497040..2f263251d3 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 0310414ee5..71d129d3ba 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 1460b1fd7f..ef3bd25a16 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 39df3e48b2..f5ddce9a13 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 41a8a93bff..a2a45701d0 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 97cc20b2b5..4a7174c987 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 3516a09b29..2f9e1424a3 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 af1d237a0f..381d3eb1c4 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 b4b1d78f30..c402d42604 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 b3af7386ff..12c6f8ab17 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 aca5e2cebc..f1247d3c3c 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 0f3fb41df2..7b82750483 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 29743914aa..66c961fe08 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 ca8d5adfdd..d826e08533 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 79378153f6..5d72e96b79 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 12cb336210..4dc799344b 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 584df3e561..14c4282ed5 100644 --- a/Docker/index.html +++ b/Docker/index.html @@ -9,7 +9,7 @@ - + @@ -218,6 +218,6 @@ →

- + diff --git a/Docker/joinmarket/index.html b/Docker/joinmarket/index.html index 3a506c1a34..533f98867a 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 62883f7150..677f690ff3 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 32f1088db8..1599206640 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 1892aec99b..e585f53012 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 bfaf19e323..9c86cc073d 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 3db7c6ef8a..b4bdff1343 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 237600441e..40f417632b 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 79e095ddca..28003f3813 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 3e1470769b..889c57945e 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 c81515d93c..9d9c85c0e3 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 9208f55fae..ce27eae0ff 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 34de9011a4..40b5a019b0 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 2f67671a88..66774e61c4 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 2c073b470c..8d256e4c71 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 d7fb24b861..73783bad5f 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 920de7c2b8..cb248e3b81 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 b5a24722b9..5e2a5d010a 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 9e6f9e5e94..e431c57d5a 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 e5e40b8850..67e48242b1 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 9539ea88f9..5e15d744f8 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 db1aecba1c..5d4865c85b 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 c42368f5b2..31729c0b93 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 3eb661d69a..ab9327b987 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 8683ce171c..98958917db 100644 --- a/Guide/index.html +++ b/Guide/index.html @@ -9,7 +9,7 @@ - + @@ -85,6 +85,6 @@ →

- + diff --git a/HardwareWalletIntegration/index.html b/HardwareWalletIntegration/index.html index 59dd03ec33..1e169f4c0b 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 b4da8272de..fb4b200b7a 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 c612d46e72..20b3f55387 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 a1e24bb68c..8c68d158aa 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 64f1e2dd18..150a326aad 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 16e397a128..82a6a6e61d 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 e1797f0cd3..18541a4148 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 f9eef1b9c4..d6ee109bfb 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 1fdf923268..301d6c9d58 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 e761bbdfab..73347f4e4c 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 40b6268b0c..2b904b1597 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 cb9bf1cc48..a8b0153639 100644 --- a/NBXplorer/index.html +++ b/NBXplorer/index.html @@ -9,7 +9,7 @@ - + @@ -108,6 +108,6 @@ →

- + diff --git a/Nopcommerce/index.html b/Nopcommerce/index.html index 6838046d18..25fb562667 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 798f41c905..3e1fa684c1 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 c653390a93..41d5eab7aa 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 193ff4bee4..3def757eec 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 628933ad2e..d0b996d220 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 c15e9bddaf..b96dc1860b 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 2e4a2d3b12..5faef19752 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 f8cd4bde5b..6a1c3056ba 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 241d00c4d2..b2c4fdacc1 100644 --- a/Payroll/index.html +++ b/Payroll/index.html @@ -9,7 +9,7 @@ - + @@ -70,6 +70,6 @@ →

- + diff --git a/PhocaCart/index.html b/PhocaCart/index.html index 853cca56da..037ca67ebb 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 b82a06f0bd..ea63bda8dc 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 f798ad0bd3..2afc08bc47 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 df7c195aca..c6524c35a6 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 f4f6210a04..7eb94debc6 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 dccb8b2a08..2bd2ad47eb 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 4b7043b4b7..05ad368ffd 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 6aeabf5bbd..27167972fd 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 d12174d127..2116b00a22 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 49bc7c903a..520c14fd4c 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 491ab1e894..98f473f871 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 944de3e9eb..df1bdd0c40 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 1af959347c..922ac48bbf 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 bc4bf136c0..81d5ceeca2 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 4f6d0f606e..ce7640ca42 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 e1210b32ea..da261714ef 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 10956da4ee..96503e532c 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 e17ca22396..6ca4ca0edd 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 f3a5040839..e485ba4eeb 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 285ab73259..e11bc5252f 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 12c933619c..822e9177c4 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 8a346b6a50..f460481bbf 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 6c8aefc998..91adc1ad36 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 24aa9c56c6..c1d263d12e 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 039cd74e3c..0630edb373 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 ca16568eae..9af493b133 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 c8e4630c85..a5d321cdee 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 4feed1d3dd..7637ddc72f 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 319ed23bb7..6de91d873c 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 eafbc3e484..57a2d190fb 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 cc873fe4e8..e33d7a884d 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 a9c73d8a3b..489bcabfee 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 f70e0c1e02..1bd1f8c5d4 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 855782bfbb..b910fb5cf8 100644 --- a/Zapier/index.html +++ b/Zapier/index.html @@ -9,7 +9,7 @@ - + @@ -77,6 +77,6 @@ →

    - + diff --git a/assets/js/106.e405ade5.js b/assets/js/106.36628569.js similarity index 96% rename from assets/js/106.e405ade5.js rename to assets/js/106.36628569.js index 2de9e88c50..6372ad7575 100644 --- a/assets/js/106.e405ade5.js +++ b/assets/js/106.36628569.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[106],{775: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],{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 diff --git a/assets/js/107.16bbc1f0.js b/assets/js/107.f70f2678.js similarity index 98% rename from assets/js/107.16bbc1f0.js rename to assets/js/107.f70f2678.js index b93f757ff5..4b8f147375 100644 --- a/assets/js/107.16bbc1f0.js +++ b/assets/js/107.f70f2678.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[107],{777: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],{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 diff --git a/assets/js/118.1dd64d48.js b/assets/js/118.c8e719dc.js similarity index 99% rename from assets/js/118.1dd64d48.js rename to assets/js/118.c8e719dc.js index 8f7671f9a7..a336204a53 100644 --- a/assets/js/118.1dd64d48.js +++ b/assets/js/118.c8e719dc.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[118],{801: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:"minimal-manual-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#minimal-manual-setup"}},[t._v("#")]),t._v(" Minimal manual setup")]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),e("h4",{attrs:{id:"not-recommended-for-production-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#not-recommended-for-production-use"}},[t._v("#")]),t._v(" Not recommended for production use")]),t._v(" "),e("p",[t._v("Manual installation is NOT recommended for production use unless you are very confident with your Operating System and Bitcoin security expertise. If you are unsure use the docker deployment or one of the other "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("deployment options")]),t._v(".")],1),t._v(" "),e("h4",{attrs:{id:"you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[t._v("#")]),t._v(" You must have technical literacy and be able to resolve any issues on your own. The community will not provide extensive support for this deployment.")])]),t._v(" "),e("p",[t._v("The process is basically the following:")]),t._v(" "),e("ol",[e("li",[t._v("Download and sync "),e("a",{attrs:{href:"https://bitcoincore.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Core"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Clone and run "),e("a",{attrs:{href:"https://github.com/dgarage/NBxplorer",target:"_blank",rel:"noopener noreferrer"}},[t._v("NBXplorer"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Clone and run "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("Take a look at our video to learn more:")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Xo_vApXTZBU/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Xo_vApXTZBU",title:"BTCPay Server - Setup","data-id":"Xo_vApXTZBU"}},[e("iframe",{attrs:{title:"BTCPay Server - Setup","data-src":"https://www.youtube-nocookie.com/embed/Xo_vApXTZBU?&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:"warning-not-recommended-to-use-in-production"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#warning-not-recommended-to-use-in-production"}},[t._v("#")]),t._v(" Warning: Not recommended to use in production")]),t._v(" "),e("p",[e("strong",[t._v("Manual installation")]),t._v(" is NOT recommended in production. It should be only used for learning purpose.")]),t._v(" "),e("p",[t._v("Instead you should use the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[t._v("docker deployment"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("The docker deployment will provide you easy update system and make sure that all moving parts are wired correctly without any technical knowledge. It will also setup HTTPS for you.")]),t._v(" "),e("h2",{attrs:{id:"typical-manual-installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#typical-manual-installation"}},[t._v("#")]),t._v(" Typical manual installation")]),t._v(" "),e("p",[t._v("This steps have been done on Ubuntu 18.04, adapt for your own install.")]),t._v(" "),e("p",[t._v("For Testnet specific deployment, after installing Bitcoin, .NET Core, NBXplorer and BTCPayServer, see "),e("a",{attrs:{href:"#testnet-specific-deployments"}},[t._v("Commands for Running in Testnet Mode")])]),t._v(" "),e("h3",{attrs:{id:"1-install-bitcoin-core-0191"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1-install-bitcoin-core-0191"}},[t._v("#")]),t._v(" 1) Install Bitcoin Core 0.19.1")]),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("BITCOIN_VERSION")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.19.1"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BITCOIN_URL")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://bitcoin.org/bin/bitcoin-core-0.19.1/bitcoin-0.19.1-x86_64-linux-gnu.tar.gz"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BITCOIN_SHA256")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"5fcac9416e486d4960e1a946145566350ca670f9aaba99de6542080851122e4c"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# install bitcoin binaries")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" /tmp\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" bitcoin.tar.gz "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_URL")]),t._v('"')]),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 string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_SHA256")]),t._v(' bitcoin.tar.gz"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" sha256sum "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" - "),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 function"}},[t._v("mkdir")]),t._v(" bin "),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 function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xzvf")]),t._v(" bitcoin.tar.gz "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-C")]),t._v(" /usr/local/bin --strip-components"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bitcoin-'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_VERSION")]),t._v('/bin/bitcoin-cli"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bitcoin-'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_VERSION")]),t._v('/bin/bitcoind"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" bitcoin.tar.gz\n")])])]),e("h3",{attrs:{id:"2-install-net-80-sdk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2-install-net-80-sdk"}},[t._v("#")]),t._v(" 2) Install .NET 8.0 SDK")]),t._v(" "),e("p",[t._v("On my Ubuntu 20.04 (See "),e("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004-",target:"_blank",rel:"noopener noreferrer"}},[t._v("these instructions"),e("OutboundLink")],1),t._v(" or "),e("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/8.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(" for different OS).")]),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("# Add Microsoft package repository")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" packages-microsoft-prod.deb\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" dpkg "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" packages-microsoft-prod.deb\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" packages-microsoft-prod.deb\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Install the SDK")]),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("apt-get")]),t._v(" update\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" apt-transport-https\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" update\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" dotnet-sdk-6.0\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Check")]),t._v("\ndotnet "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\n")])])]),e("h3",{attrs:{id:"3-install-nbxplorer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#3-install-nbxplorer"}},[t._v("#")]),t._v(" 3) Install NBXplorer")]),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("cd")]),t._v(" ~\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/dgarage/NBXplorer\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" NBXplorer\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout latest\n./build.sh\n")])])]),e("h3",{attrs:{id:"4-install-btcpayserver"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#4-install-btcpayserver"}},[t._v("#")]),t._v(" 4) Install BTCPayServer")]),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("cd")]),t._v(" ~\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/btcpayserver/btcpayserver\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout latest\n./build.sh\n")])])]),e("h3",{attrs:{id:"5-run-bitcoind"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#5-run-bitcoind"}},[t._v("#")]),t._v(" 5) Run bitcoind")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("bitcoind\n")])])]),e("h3",{attrs:{id:"6-run-nbxplorer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#6-run-nbxplorer"}},[t._v("#")]),t._v(" 6) Run NBXplorer")]),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("cd")]),t._v(" ~/NBXplorer\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--dbtrie")]),t._v("\n")])])]),e("p",[t._v("Note that using the "),e("code",[t._v("--dbtrie")]),t._v(" backend for NBXplorer, while easier, is deprecated.\nYou should better use a postgresql backend as documented on "),e("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[t._v("Extended Manual Deployment")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"7-run-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#7-run-btcpay-server"}},[t._v("#")]),t._v(" 7) Run 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 builtin class-name"}},[t._v("cd")]),t._v(" ~/btcpayserver\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--port")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bind")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0\n")])])]),e("p",[t._v("Now you can browse your server on port 8080.")]),t._v(" "),e("p",[t._v("Note that by default, BTCPay Server will use SQLite as backend, while being easier, this is deprecated.\nYou should better use a postgresql backend as documented on "),e("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[t._v("Extended Manual Deployment")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"testnet-specific-deployments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#testnet-specific-deployments"}},[t._v("#")]),t._v(" Testnet Specific Deployments")]),t._v(" "),e("p",[t._v("Follow the instructions for installing Bitcoin, .NET Core, NBXplorer and BTCPayServer above.")]),t._v(" "),e("p",[t._v("Then when running them use:")]),t._v(" "),e("h3",{attrs:{id:"run-bitcoind-in-testnet-mode"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#run-bitcoind-in-testnet-mode"}},[t._v("#")]),t._v(" Run bitcoind in testnet mode")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("bitcoind "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-testnet")]),t._v("\n")])])]),e("h3",{attrs:{id:"run-nbxplorer-in-testnet-mode"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#run-nbxplorer-in-testnet-mode"}},[t._v("#")]),t._v(" Run NBXplorer in testnet mode")]),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("cd")]),t._v(" ~/NBXplorer\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--network")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("testnet\n")])])]),e("h3",{attrs:{id:"run-btcpayserver-in-testnet-mode"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#run-btcpayserver-in-testnet-mode"}},[t._v("#")]),t._v(" Run BTCPayServer in testnet mode")]),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("cd")]),t._v(" ~/btcpayserver\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--port")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bind")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0 "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--network")]),t._v(" testnet\n")])])]),e("h2",{attrs:{id:"additional-links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-links"}},[t._v("#")]),t._v(" Additional links")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[t._v("Extended Manual Deployment")])],1),t._v(" "),e("li",[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("How to Setup BTC and Lightning Payment Gateway with BTCPayServer on Linux [Manual Install]"),e("OutboundLink")],1),t._v(" from freedomnode.com.")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[118],{802: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:"minimal-manual-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#minimal-manual-setup"}},[t._v("#")]),t._v(" Minimal manual setup")]),t._v(" "),e("div",{staticClass:"custom-block danger"},[e("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),e("h4",{attrs:{id:"not-recommended-for-production-use"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#not-recommended-for-production-use"}},[t._v("#")]),t._v(" Not recommended for production use")]),t._v(" "),e("p",[t._v("Manual installation is NOT recommended for production use unless you are very confident with your Operating System and Bitcoin security expertise. If you are unsure use the docker deployment or one of the other "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("deployment options")]),t._v(".")],1),t._v(" "),e("h4",{attrs:{id:"you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[t._v("#")]),t._v(" You must have technical literacy and be able to resolve any issues on your own. The community will not provide extensive support for this deployment.")])]),t._v(" "),e("p",[t._v("The process is basically the following:")]),t._v(" "),e("ol",[e("li",[t._v("Download and sync "),e("a",{attrs:{href:"https://bitcoincore.org",target:"_blank",rel:"noopener noreferrer"}},[t._v("Bitcoin Core"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Clone and run "),e("a",{attrs:{href:"https://github.com/dgarage/NBxplorer",target:"_blank",rel:"noopener noreferrer"}},[t._v("NBXplorer"),e("OutboundLink")],1)]),t._v(" "),e("li",[t._v("Clone and run "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("BTCPay Server"),e("OutboundLink")],1)])]),t._v(" "),e("p",[t._v("Take a look at our video to learn more:")]),t._v(" "),e("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/Xo_vApXTZBU/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=Xo_vApXTZBU",title:"BTCPay Server - Setup","data-id":"Xo_vApXTZBU"}},[e("iframe",{attrs:{title:"BTCPay Server - Setup","data-src":"https://www.youtube-nocookie.com/embed/Xo_vApXTZBU?&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:"warning-not-recommended-to-use-in-production"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#warning-not-recommended-to-use-in-production"}},[t._v("#")]),t._v(" Warning: Not recommended to use in production")]),t._v(" "),e("p",[e("strong",[t._v("Manual installation")]),t._v(" is NOT recommended in production. It should be only used for learning purpose.")]),t._v(" "),e("p",[t._v("Instead you should use the "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[t._v("docker deployment"),e("OutboundLink")],1),t._v(".")]),t._v(" "),e("p",[t._v("The docker deployment will provide you easy update system and make sure that all moving parts are wired correctly without any technical knowledge. It will also setup HTTPS for you.")]),t._v(" "),e("h2",{attrs:{id:"typical-manual-installation"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#typical-manual-installation"}},[t._v("#")]),t._v(" Typical manual installation")]),t._v(" "),e("p",[t._v("This steps have been done on Ubuntu 18.04, adapt for your own install.")]),t._v(" "),e("p",[t._v("For Testnet specific deployment, after installing Bitcoin, .NET Core, NBXplorer and BTCPayServer, see "),e("a",{attrs:{href:"#testnet-specific-deployments"}},[t._v("Commands for Running in Testnet Mode")])]),t._v(" "),e("h3",{attrs:{id:"1-install-bitcoin-core-0191"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#1-install-bitcoin-core-0191"}},[t._v("#")]),t._v(" 1) Install Bitcoin Core 0.19.1")]),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("BITCOIN_VERSION")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.19.1"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BITCOIN_URL")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://bitcoin.org/bin/bitcoin-core-0.19.1/bitcoin-0.19.1-x86_64-linux-gnu.tar.gz"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BITCOIN_SHA256")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"5fcac9416e486d4960e1a946145566350ca670f9aaba99de6542080851122e4c"')]),t._v("\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# install bitcoin binaries")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" /tmp\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" bitcoin.tar.gz "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_URL")]),t._v('"')]),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 string"}},[t._v('"'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_SHA256")]),t._v(' bitcoin.tar.gz"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" sha256sum "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-c")]),t._v(" - "),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 function"}},[t._v("mkdir")]),t._v(" bin "),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 function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xzvf")]),t._v(" bitcoin.tar.gz "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-C")]),t._v(" /usr/local/bin --strip-components"),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bitcoin-'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_VERSION")]),t._v('/bin/bitcoin-cli"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bitcoin-'),e("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$BITCOIN_VERSION")]),t._v('/bin/bitcoind"')]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" bitcoin.tar.gz\n")])])]),e("h3",{attrs:{id:"2-install-net-80-sdk"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#2-install-net-80-sdk"}},[t._v("#")]),t._v(" 2) Install .NET 8.0 SDK")]),t._v(" "),e("p",[t._v("On my Ubuntu 20.04 (See "),e("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004-",target:"_blank",rel:"noopener noreferrer"}},[t._v("these instructions"),e("OutboundLink")],1),t._v(" or "),e("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/8.0",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),e("OutboundLink")],1),t._v(" for different OS).")]),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("# Add Microsoft package repository")]),t._v("\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" packages-microsoft-prod.deb\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" dpkg "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" packages-microsoft-prod.deb\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" packages-microsoft-prod.deb\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Install the SDK")]),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("apt-get")]),t._v(" update\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" apt-transport-https\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" update\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt-get")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" dotnet-sdk-6.0\n\n"),e("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Check")]),t._v("\ndotnet "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\n")])])]),e("h3",{attrs:{id:"3-install-nbxplorer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#3-install-nbxplorer"}},[t._v("#")]),t._v(" 3) Install NBXplorer")]),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("cd")]),t._v(" ~\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/dgarage/NBXplorer\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" NBXplorer\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout latest\n./build.sh\n")])])]),e("h3",{attrs:{id:"4-install-btcpayserver"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#4-install-btcpayserver"}},[t._v("#")]),t._v(" 4) Install BTCPayServer")]),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("cd")]),t._v(" ~\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/btcpayserver/btcpayserver\n"),e("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver\n"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout latest\n./build.sh\n")])])]),e("h3",{attrs:{id:"5-run-bitcoind"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#5-run-bitcoind"}},[t._v("#")]),t._v(" 5) Run bitcoind")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("bitcoind\n")])])]),e("h3",{attrs:{id:"6-run-nbxplorer"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#6-run-nbxplorer"}},[t._v("#")]),t._v(" 6) Run NBXplorer")]),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("cd")]),t._v(" ~/NBXplorer\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--dbtrie")]),t._v("\n")])])]),e("p",[t._v("Note that using the "),e("code",[t._v("--dbtrie")]),t._v(" backend for NBXplorer, while easier, is deprecated.\nYou should better use a postgresql backend as documented on "),e("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[t._v("Extended Manual Deployment")]),t._v(".")],1),t._v(" "),e("h3",{attrs:{id:"7-run-btcpay-server"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#7-run-btcpay-server"}},[t._v("#")]),t._v(" 7) Run 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 builtin class-name"}},[t._v("cd")]),t._v(" ~/btcpayserver\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--port")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bind")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0\n")])])]),e("p",[t._v("Now you can browse your server on port 8080.")]),t._v(" "),e("p",[t._v("Note that by default, BTCPay Server will use SQLite as backend, while being easier, this is deprecated.\nYou should better use a postgresql backend as documented on "),e("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[t._v("Extended Manual Deployment")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"testnet-specific-deployments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#testnet-specific-deployments"}},[t._v("#")]),t._v(" Testnet Specific Deployments")]),t._v(" "),e("p",[t._v("Follow the instructions for installing Bitcoin, .NET Core, NBXplorer and BTCPayServer above.")]),t._v(" "),e("p",[t._v("Then when running them use:")]),t._v(" "),e("h3",{attrs:{id:"run-bitcoind-in-testnet-mode"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#run-bitcoind-in-testnet-mode"}},[t._v("#")]),t._v(" Run bitcoind in testnet mode")]),t._v(" "),e("div",{staticClass:"language-bash extra-class"},[e("pre",{pre:!0,attrs:{class:"language-bash"}},[e("code",[t._v("bitcoind "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-testnet")]),t._v("\n")])])]),e("h3",{attrs:{id:"run-nbxplorer-in-testnet-mode"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#run-nbxplorer-in-testnet-mode"}},[t._v("#")]),t._v(" Run NBXplorer in testnet mode")]),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("cd")]),t._v(" ~/NBXplorer\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--network")]),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("testnet\n")])])]),e("h3",{attrs:{id:"run-btcpayserver-in-testnet-mode"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#run-btcpayserver-in-testnet-mode"}},[t._v("#")]),t._v(" Run BTCPayServer in testnet mode")]),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("cd")]),t._v(" ~/btcpayserver\n./run.sh "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--port")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("8080")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--bind")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0 "),e("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--network")]),t._v(" testnet\n")])])]),e("h2",{attrs:{id:"additional-links"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#additional-links"}},[t._v("#")]),t._v(" Additional links")]),t._v(" "),e("ul",[e("li",[e("RouterLink",{attrs:{to:"/Deployment/ManualDeploymentExtended/"}},[t._v("Extended Manual Deployment")])],1),t._v(" "),e("li",[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("How to Setup BTC and Lightning Payment Gateway with BTCPayServer on Linux [Manual Install]"),e("OutboundLink")],1),t._v(" from freedomnode.com.")])])])}),[],!1,null,null,null);e.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/119.367fe5cf.js b/assets/js/119.acf7657e.js similarity index 99% rename from assets/js/119.367fe5cf.js rename to assets/js/119.acf7657e.js index 7765a67cee..b21e0538d7 100644 --- a/assets/js/119.367fe5cf.js +++ b/assets/js/119.acf7657e.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[119],{802: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:"extended-manual-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#extended-manual-setup"}},[t._v("#")]),t._v(" Extended Manual Setup")]),t._v(" "),s("p",[t._v("This document lists steps for "),s("strong",[t._v("manually deploying BTCPay Server")]),t._v(" and additional related components. Following these steps is likely to take a long time. A shorter and more pragmatic approach is to use a "),s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[t._v("docker based deployment"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("The instructions also build all the application components from source which can be an advantage for certain audit and/or security scenarios.")]),t._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),s("h4",{attrs:{id:"not-recommended-for-production-use"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#not-recommended-for-production-use"}},[t._v("#")]),t._v(" Not recommended for production use")]),t._v(" "),s("p",[t._v("Manual installation is NOT recommended for production use unless you are very confident with your Operating System and Bitcoin security expertise. If you are unsure use the docker deployment or one of the other "),s("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("deployment options")]),t._v(".")],1),t._v(" "),s("h4",{attrs:{id:"you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[t._v("#")]),t._v(" You must have technical literacy and be able to resolve any issues on your own. The community will not provide extensive support for this deployment.")])]),t._v(" "),s("h2",{attrs:{id:"installation-steps-overview"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation-steps-overview"}},[t._v("#")]),t._v(" Installation Steps Overview")]),t._v(" "),s("p",[t._v("The instructions in this article have been tested on Ubuntu 20.04. They should be applicable to other Linux based distributions. They are also based on all components being on the same host or virtual machine. It is possible to split the components across different hosts but these instructions don't describe that.")]),t._v(" "),s("p",[t._v("An example hostname of "),s("code",[t._v("mainnet.demo.btcpayserver.org")]),t._v(" has been used, it needs to be replaced with the hostname you are using for your BTCPay Server.")]),t._v(" "),s("h3",{attrs:{id:"security"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#security"}},[t._v("#")]),t._v(" Security")]),t._v(" "),s("p",[t._v("If you do use these instructions to install a BTCPay Server connected to the Bitcoin mainnet then at a minimum you should understand how the wallet mechanisms work. It's highly recommended to read the two articles below and ask questions if anything is not clear.")]),t._v(" "),s("ul",[s("li",[s("RouterLink",{attrs:{to:"/FAQ/Wallet/"}},[t._v("BTCPay Wallet FAQ")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network and BTCPay (first section)")])],1)]),t._v(" "),s("p",[t._v("As an additional aid below is a list of iptables rules and instructions which should include all the ports that need to be open. "),s("strong",[t._v("NO WARRANTY")]),t._v(". Use at your own risk, "),s("strong",[t._v("including risk of locking yourself out")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" iptables.txt\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("# Generated by iptables-save v1.6.1 on Mon May 27 18:48:11 2019\n*filter\n:INPUT ACCEPT [0:0]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [0:0]\n-A INPUT -i lo -j ACCEPT\n-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT # SSH\n-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT # BTCPay HTTP\n-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT # BTCPay HTTPS\n-A INPUT -p tcp -m tcp --dport 8333 -j ACCEPT # Bitcoind P2P\n-A INPUT -p tcp -m tcp --dport 9735 -j ACCEPT # Lightning P2P\n-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\nCOMMIT\n# Completed on Mon May 27 18:48:11 2019\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" iptables-restore "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" iptables.txt\n")])])]),s("p",[t._v("At this point if you are still connected to you ssh session it's a good sign. If not the rules are temporary and you can use whatever mechanism you have to remotely reboot your server and try again.")]),t._v(" "),s("p",[t._v("The rules have now been temporarily applied. To apply the rules automatically each time your server starts use the "),s("code",[t._v("iptables-persistent")]),t._v(" package.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" iptables-persistent\n")])])]),s("p",[t._v("If you subsequently change the iptables rules and want to save them across reboots use the command below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" netfilter-persistent save\n")])])]),s("h2",{attrs:{id:"unprivileged-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#unprivileged-user"}},[t._v("#")]),t._v(" Unprivileged user")]),t._v(" "),s("p",[t._v("These instructions configure everything to run under an "),s("strong",[t._v("unprivileged user")]),t._v(" called "),s("code",[t._v("admin")]),t._v(". Create this user before proceeding:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useradd")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-M")]),t._v(" admin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("usermod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-L")]),t._v(" admin\n")])])]),s("h3",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),s("ul",[s("li",[t._v("Postgresql")]),t._v(" "),s("li",[t._v("Tor")]),t._v(" "),s("li",[t._v("NGINX and Let's Encrypt")])]),t._v(" "),s("h3",{attrs:{id:"application-components"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#application-components"}},[t._v("#")]),t._v(" Application Components")]),t._v(" "),s("ul",[s("li",[t._v("Bitcoin Core"),s("sup",[t._v("1,2")])]),t._v(" "),s("li",[t._v("NBXplorer"),s("sup",[t._v("1,2")])]),t._v(" "),s("li",[t._v("BTCPay Server"),s("sup",[t._v("1,2")])]),t._v(" "),s("li",[t._v("Lightning Network Daemon (LND)"),s("sup",[t._v("2")])]),t._v(" "),s("li",[t._v("Ride The Lightning (RTL)"),s("sup",[t._v("2")])])]),t._v(" "),s("p",[s("sup",[t._v("1")]),t._v(" The bare minimum install of a BTCPay Server only requires these items. Using a bare minimum configuration reduces the functionality: no Lightning payments, no auto-renewal of TLS certificates, less reliable data store, less capable of handling NAT and more.")]),t._v(" "),s("p",[s("sup",[t._v("2")]),t._v(" Built from source code.")]),t._v(" "),s("h2",{attrs:{id:"postgresql"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#postgresql"}},[t._v("#")]),t._v(" Postgresql")]),t._v(" "),s("p",[s("strong",[t._v("Postgresql")]),t._v(" can be used by BTCPay Server in place of the default SQLite file based storage. It's also possible to use MySQL.")]),t._v(" "),s("h5",{attrs:{id:"install"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" postgresql postgresql-contrib\n")])])]),s("h5",{attrs:{id:"configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("p",[t._v("Covered in BTCPay Server Configuration.")]),t._v(" "),s("h5",{attrs:{id:"check"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ psql "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\npsql "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("PostgreSQL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Ubuntu "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v("-4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status postgresql\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\npsql "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Ubuntu "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v("-4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),t._v("\nType "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"help"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" help.\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("postgres")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\q")]),t._v("\n")])])]),s("h2",{attrs:{id:"tor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tor"}},[t._v("#")]),t._v(" Tor")]),t._v(" "),s("p",[s("strong",[t._v("Tor")]),t._v(" can be used by the following components to provide enhanced privacy and/or help with NAT traversal:")]),t._v(" "),s("ul",[s("li",[t._v("Bitcoin Core Daemon")]),t._v(" "),s("li",[t._v("Lightning Network Daemon (LND).")])]),t._v(" "),s("p",[t._v("Additional information running Bitcoin Core with Tor support can be found "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/tor.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h5",{attrs:{id:"install-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-2"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" tor\n")])])]),s("h5",{attrs:{id:"configuration-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-2"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" /etc/tor/torrc "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (and uncomment two lines below)")]),t._v("\nControlPort "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9051")]),t._v("\nCookieAuthentication "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart tor\n")])])]),s("p",[t._v("Covered further in Bitcoin and Lightning Network Daemon sections.")]),t._v(" "),s("h5",{attrs:{id:"check-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-2"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ tor "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\nTor version "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.4")]),t._v(".2.7\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tlnp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" tor "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (lines below correspond to the tor control port and SOCKS proxy)")]),t._v("\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1:9050 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1376")]),t._v("/tor\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1:9051 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1376")]),t._v("/tor\n")])])]),s("h2",{attrs:{id:"nginx-and-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx-and-lets-encrypt"}},[t._v("#")]),t._v(" NGINX and Let's Encrypt")]),t._v(" "),s("p",[s("strong",[t._v("NGINX")]),t._v(" is used as a web server to manage HTTP requests to BTCPay Server and Ride The Lightning. Paired with "),s("strong",[t._v("Let's Encrypt")]),t._v(" it allows seamless procurement and renewal of a TLS certificate for your BTCPay Server instance.")]),t._v(" "),s("p",[t._v("Let's Encrypt is a free service for procuring and renewing TLS certificates. The service comes with scripts that can be installed to automatically manage the whole process.")]),t._v(" "),s("h5",{attrs:{id:"install-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-3"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-install-nginx"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-nginx"}},[t._v("#")]),t._v(" 1. Install NGINX.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" nginx\n")])])]),s("h5",{attrs:{id:"2-install-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-install-lets-encrypt"}},[t._v("#")]),t._v(" 2. Install Let's Encrypt")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" certbot python3-certbot-nginx\n")])])]),s("h5",{attrs:{id:"configuration-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-3"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("h5",{attrs:{id:"1-lets-encrypt-tls-certificate"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-lets-encrypt-tls-certificate"}},[t._v("#")]),t._v(" 1. Let's Encrypt TLS certificate")]),t._v(" "),s("p",[t._v("You must create an A or AAAA record for "),s("strong",[t._v("")]),t._v(" that points to the IP address of your server instance.\nIf your server is behind NAT then you need to forward port 80 to your instance.")]),t._v(" "),s("p",[t._v("The "),s("strong",[t._v("certbot")]),t._v(" script works by checking for a specific file on the web server hosting the requested domain. If it can't get the file the TLS certificate won't be issued. If the initial attempt fails it will be periodically re-attempted or you can simply re-run the command.")]),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(" certbot "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--nginx")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("your domain name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (e.g: sudo certbot --nginx -d mainnet.demo.btcpayserver.org)")]),t._v("\n")])])]),s("h5",{attrs:{id:"2-add-nginx-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-add-nginx-configuration-file"}},[t._v("#")]),t._v(" 2. Add NGINX configuration file")]),t._v(" "),s("p",[t._v("The configuration file below has been copied from the BTCPay Server docker install.")]),t._v(" "),s("p",[t._v('Search for "mainnet.demo.btcpayserver.org" and replace it with your own domain name.')]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" /etc/nginx/conf.d/default.conf\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("# If we receive X-Forwarded-Proto, pass it through; otherwise, pass along the\n# scheme used to connect to this server\nmap $http_x_forwarded_proto $proxy_x_forwarded_proto {\n default $http_x_forwarded_proto;\n '' $scheme;\n}\n# If we receive X-Forwarded-Port, pass it through; otherwise, pass along the\n# server port the client connected to\nmap $http_x_forwarded_port $proxy_x_forwarded_port {\n default $http_x_forwarded_port;\n '' $server_port;\n}\n# If we receive Upgrade, set Connection to \"upgrade\"; otherwise, delete any\n# Connection header that may have been passed to this server\nmap $http_upgrade $proxy_connection {\n default upgrade;\n '' close;\n}\n# Apply fix for very long server names\nserver_names_hash_bucket_size 128;\n# Prevent Nginx Information Disclosure\nserver_tokens off;\n# Default dhparam\n# Set appropriate X-Forwarded-Ssl header\nmap $scheme $proxy_x_forwarded_ssl {\n default off;\n https on;\n}\n\ngzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;\nlog_format vhost '$host $remote_addr - $remote_user [$time_local] '\n '\"$request\" $status $body_bytes_sent '\n '\"$http_referer\" \"$http_user_agent\"';\naccess_log off;\n# HTTP 1.1 support\nproxy_http_version 1.1;\nproxy_buffering off;\nproxy_set_header Host $http_host;\nproxy_set_header Upgrade $http_upgrade;\nproxy_set_header Connection $proxy_connection;\nproxy_set_header X-Real-IP $remote_addr;\nproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\nproxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;\nproxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl;\nproxy_set_header X-Forwarded-Port $proxy_x_forwarded_port;\nproxy_buffer_size 128k;\nproxy_buffers 4 256k;\nproxy_busy_buffers_size 256k;\nclient_header_buffer_size 500k;\nlarge_client_header_buffers 4 500k;\n# Mitigate httpoxy attack (see README for details)\nproxy_set_header Proxy \"\";\n\nserver {\n server_name mainnet.demo.btcpayserver.org;\n listen 80;\n access_log /var/log/nginx/access.log vhost;\n return 301 https://$host$request_uri;\n}\nserver {\n client_max_body_size 100M;\n server_name mainnet.demo.btcpayserver.org;\n listen 443 ssl http2 ;\n access_log /var/log/nginx/access.log vhost;\n ssl_protocols TLSv1.2;\n ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';\n ssl_prefer_server_ciphers on;\n ssl_session_timeout 5m;\n ssl_session_cache shared:SSL:50m;\n ssl_session_tickets off;\n ssl_certificate /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/cert.pem;\n ssl_certificate_key /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/privkey.pem;\n ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;\n ssl_stapling on;\n ssl_stapling_verify on;\n ssl_trusted_certificate /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/fullchain.pem;\n add_header Strict-Transport-Security \"max-age=31536000\" always;\n #include /etc/nginx/vhost.d/default;\n\n # Here is the main BTCPay Server application\n location / {\n proxy_pass http://127.0.0.1:23000;\n }\n\n # Include the next two stanzas if and only if you want to expose your lightning gRPC & RPC interfaces to the internet\n location /lnrpc.Lightning {\n grpc_pass grpcs://127.0.0.1:10009;\n }\n\n location /lnd-rest/btc/ {\n rewrite ^/lnd-rest/btc/(.*) /$1 break;\n proxy_pass https://127.0.0.1:8080/;\n }\n\n # Include this stanza if you are planning to set up Ride The Lightning (RTL)\n location /rtl/ {\n proxy_pass http://127.0.0.1:3000/rtl/;\n }\n}\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart nginx\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status nginx\n")])])]),s("p",[t._v("If there is an error message restarting "),s("code",[t._v("nginx")]),t._v(" try:")]),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" nginx\n")])])]),s("h5",{attrs:{id:"check-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-3"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("h5",{attrs:{id:"1-check-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-check-lets-encrypt"}},[t._v("#")]),t._v(" 1. Check Let's Encrypt")]),t._v(" "),s("p",[t._v("It can be a little bit tricky to get everything set up correctly for the Let's Encrypt script to work correctly. Some additional commands are listed below to help with any troubleshooting.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" certbot certificates\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nFound the following certs:\n Certificate Name: mainnet.demo.btcpayserver.org\n Domains: mainnet.demo.btcpayserver.org\n Expiry Date: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-08-10 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(":00:31+00:00 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("VALID: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("79")]),t._v(" days"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Certificate Path: /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/fullchain.pem\n Private Key Path: /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/privkey.pem\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /etc/cron.d/certbot "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (check the cron job exists)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" */12 * * * root "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-x")]),t._v(" /usr/bin/certbot "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" /run/systemd/system "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" perl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sleep int(rand(43200))'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" certbot "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-q")]),t._v(" renew\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/log/letsencrypt/letsencrypt.log "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (check for problems)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-05-22 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":36:36,062:DEBUG:certbot.main:certbot version: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.31")]),t._v(".0\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" certbot renew --dry-run "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (test renewal)")]),t._v("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n** DRY RUN: simulating "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'certbot renew'")]),t._v(" close to cert expiry\n** "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("The "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" certificates below have not been saved."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nCongratulations, all renewals succeeded. The following certs have been renewed:\n /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/fullchain.pem "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("success"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n** DRY RUN: simulating "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'certbot renew'")]),t._v(" close to cert expiry\n** "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("The "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" certificates above have not been saved."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n")])])]),s("h5",{attrs:{id:"2-check-nginx"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-check-nginx"}},[t._v("#")]),t._v(" 2. Check NGINX.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" nginx "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-v")]),t._v("\nnginx version: nginx/1.18.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Ubuntu"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tlnp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" nginx\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:443 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:80 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\ntcp6 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" :::443 :::* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\ntcp6 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" :::80 :::* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" nginx "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n--\n-- A start job "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" unit nginx.service has finished successfully.\n--\n-- The job identifier is "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19471")]),t._v(".\n")])])]),s("p",[t._v("Attempt to open your web site in a browser. At this point it is expected that a "),s("code",[t._v("502 Bad Gateway")]),t._v("error will occur. The "),s("code",[t._v("nginx")]),t._v(" logs can be checked to verify that the connection attempt was received.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/log/nginx/access.log\nmainnet.demo.btcpayserver.org "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1 - - "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v("/Jul/2020:12:19:57 +0100"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET / HTTP/2.0"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("502")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("552")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"')]),t._v("\n")])])]),s("p",[t._v("If there is a problem then the "),s("code",[t._v("nginx")]),t._v(" error log can also be checked.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/log/nginx/error.log\n")])])]),s("h2",{attrs:{id:"bitcoin-core"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-core"}},[t._v("#")]),t._v(" Bitcoin Core")]),t._v(" "),s("p",[t._v("The gateway to the Bitcoin network for BTCPay Server components.")]),t._v(" "),s("h5",{attrs:{id:"install-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-4"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("p",[t._v("The full instructions to "),s("strong",[t._v("build Bitcoin Core from source")]),t._v(" are "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("The alternative to building from source is to download a signed binary distribution from "),s("a",{attrs:{href:"https://bitcoincore.org/en/download/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://bitcoincore.org/en/download/"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://bitcoincore.org/bin/bitcoin-core-0.20.0/bitcoin-0.20.0-x86_64-linux-gnu.tar.gz\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://bitcoincore.org/bin/bitcoin-core-0.20.0/SHA256SUMS.asc\n")])])]),s("h5",{attrs:{id:"1-install-pre-requisites-and-dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-pre-requisites-and-dependencies"}},[t._v("#")]),t._v(" 1. Install Pre-requisites and dependencies")]),t._v(" "),s("p",[t._v("These instructions do not build the Bitcoin Core GUI components as they are not needed for "),s("code",[t._v("BTCPay Server")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" build-essential libtool autotools-dev automake pkg-config bsdmainutils python3\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" libevent-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev libminiupnpc-dev libzmq3-dev\n")])])]),s("h5",{attrs:{id:"2-download-and-build-source"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-download-and-build-source"}},[t._v("#")]),t._v(" 2. Download and Build Source")]),t._v(" "),s("p",[t._v("Before cloning the "),s("code",[t._v("Bitcoin Core")]),t._v(' repository identify the most recent stable version. One convenient way to do this is on the GitHub repository page look at the latest version under the "Releases" heading. At the time of writing the stable version is '),s("code",[t._v("0.20.0")]),t._v(". Adjust the tag in the "),s("code",[t._v("git clone")]),t._v(" command below for the stable version you want to build.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n~/src$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--depth")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--branch")]),t._v(" v0.20.0 https://github.com/bitcoin/bitcoin.git\n~/src$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" bitcoin\n")])])]),s("p",[t._v("A specific version of the Berkeley DB dependency needs to be installed.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~/src/bitcoin$ ./contrib/install_db4.sh "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("pwd")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\n")])])]),s("p",[t._v("Use the "),s("code",[t._v("autoconf")]),t._v(" scripts to generate the make files and then build.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~/src/bitcoin$ ./autogen.sh\n~/src/bitcoin$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BDB_PREFIX")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/home/admin/src/bitcoin/db4'")]),t._v("\n~/src/bitcoin$ ./configure "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BDB_LIBS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-L'),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${BDB_PREFIX}")]),t._v('/lib -ldb_cxx-4.8"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BDB_CFLAGS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-I'),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${BDB_PREFIX}")]),t._v('/include"')]),t._v("\n~/src/bitcoin$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~/src/bitcoin$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v("\n~/src/bitcoin$ bitcoind "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version")]),t._v("\nBitcoin Core version v0.20.0\n")])])]),s("h5",{attrs:{id:"3-create-the-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-the-configuration-file"}},[t._v("#")]),t._v(" 3. Create the configuration file")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("configuration file")]),t._v(" is available on the Bitcoin Core repository at https://github.com/bitcoin/bitcoin/blob/master/share/examples/bitcoin.conf.")]),t._v(" "),s("p",[t._v("Create a "),s("strong",[t._v("bitcoin.conf file")]),t._v(" to suit your needs. An example file that is suitable for BTCPay Server is shown below. This configuration does not prune blocks which means as of May 2019 you will require 235 GB for the Bitcoin blockchain.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" bitcoin.conf\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("server=1 # need RPC for btcpay.\nrpcbind=127.0.0.1 # loopback is default for 0.18.0 but no harm making sure.\nwhitelist=127.0.0.1 # for nbxplorer.\nrpcallowip=127.0.0.1/32 # loopback is default but again no harm.\nzmqpubrawblock=tcp://127.0.0.1:28332 # needed for lightning.\nzmqpubrawtx=tcp://127.0.0.1:28333 # needed for lightning.\n#prune=5000 # Recommended if not enough disk space for full 600+GB blockchain.\n")])])]),s("p",[t._v("Copy the file to the directory specified in the systemd service file and assign read permissions to all users.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /etc/bitcoin\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" bitcoin.conf /etc/bitcoin\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/bitcoin/bitcoin.conf\n")])])]),s("h5",{attrs:{id:"5-create-a-systemd-service"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#5-create-a-systemd-service"}},[t._v("#")]),t._v(" 5. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is available in the Bitcoin Core repository at https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/init/bitcoind.service.")]),t._v(" "),s("p",[t._v("Edit the service file depending on your needs.")]),t._v(" "),s("p",[t._v("In the example below the "),s("strong",[t._v("User")]),t._v(" and "),s("strong",[t._v("Group")]),t._v(" have been changed to use the "),s("code",[t._v("admin")]),t._v(" user instead of requiring a new "),s("code",[t._v("bitcoin")]),t._v(" user. If the "),s("code",[t._v("admin")]),t._v(" user on your system is intended for running "),s("code",[t._v("BTCPayServer")]),t._v(" this is a reasonable choice. Otherwise consider creating a dedicated "),s("code",[t._v("bitcoin")]),t._v(" user.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" bitcoind.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Unit]\nDescription=Bitcoin daemon\nAfter=network.target\n\n[Service]\nExecStart=/usr/bin/bitcoind -daemon \\\n -pid=/run/bitcoind/bitcoind.pid \\\n -conf=/etc/bitcoin/bitcoin.conf \\\n -datadir=/var/lib/bitcoind\n\n# Make sure the config directory is readable by the service user\nPermissionsStartOnly=true\nExecStartPre=/bin/chgrp admin /etc/bitcoin\n\n# Process management\n####################\n\nType=forking\nPIDFile=/run/bitcoind/bitcoind.pid\nRestart=on-failure\nTimeoutStopSec=600\n\n# Run as admin:admin\nUser=admin\nGroup=admin\n\n# /run/bitcoind\nRuntimeDirectory=bitcoind\nRuntimeDirectoryMode=0710\n\n# /etc/bitcoin\nConfigurationDirectory=bitcoin\nConfigurationDirectoryMode=0710\n\n# /var/lib/bitcoind\nStateDirectory=bitcoind\nStateDirectoryMode=0710\n\n# Hardening measures\n####################\n# Provide a private /tmp and /var/tmp.\nPrivateTmp=true\n\n# Deny access to /home, /root and /run/user\nProtectHome=true\n\n# Mount /usr, /boot/ and /etc read-only for the process.\nProtectSystem=full\n\n# Disallow the process and all of its children to gain\n# new privileges through execve().\nNoNewPrivileges=true\n\n# Use a new /dev namespace only populated with API pseudo devices\n# such as /dev/null, /dev/zero and /dev/random.\nPrivateDevices=true\n\n# Deny the creation of writable and executable memory mappings.\nMemoryDenyWriteExecute=true\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("p",[t._v("Once the service file is ready complete the commands below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" bitcoind.service /etc/systemd/system\n~$ "),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" bitcoind\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status bitcoind\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(":51:52 ubuntu systemd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[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(": Started Bitcoin daemon.\n")])])]),s("p",[t._v("If the start attempt shows an error message check the log using:")]),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" bitcoind\n")])])]),s("h5",{attrs:{id:"6-create-a-symbolic-link-to-the-bitcoind-cookie-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#6-create-a-symbolic-link-to-the-bitcoind-cookie-file"}},[t._v("#")]),t._v(" 6. Create a symbolic link to the bitcoind cookie file")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("bitcoin-cli")]),t._v(" client needs to authenticate to "),s("code",[t._v("bitcoind")]),t._v(" for RPC calls. The easiest way to allow this is to create a symbolic link to the cookie file.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" /var/lib/bitcoind/.cookie .bitcoin/.cookie\n")])])]),s("p",[t._v("It's not vital to perform this step but if not done then every "),s("code",[t._v("bitcoin-cli")]),t._v(" command needs to specify the path to the cookie file as below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ bitcoin-cli "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-rpccookiefile")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/var/lib/bitcoind/.cookie getblockchaininfo\n")])])]),s("h5",{attrs:{id:"check-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-4"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("p",[t._v("It will take Bitcoin anywhere from a few hours to a few days to synchronise the blockchain. Use any or all of the commands below to check its status.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status bitcoind\nActive: active "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("running"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" since Sun "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-26 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(":51:52 IST"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 2min 47s ago\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/lib/bitcoind/debug.log "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-26T20:55:09Z UpdateTip: new "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("best")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("0000000000000361c37dfb6fa905ef967b95411fa96f7dcb4eca5dd4434d9e59 "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("height")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("126732")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("version")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("0x00000001 "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("log2_work")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("62.952182")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("tx")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("560114")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("date")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2011-05-25T21:26:08Z'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("progress")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.001018")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("cache")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("43")]),t._v(".6MiB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("291168txo"),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("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ bitcoin-cli getblockchaininfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"chain"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"main"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"blocks"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("133015")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"headers"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("640929")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bestblockhash"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0000000000000e81b67de8d61eab726f40585bed954b1dd59f86ab10e4e55398"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"difficulty"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("876954.4935135372")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mediantime"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1308897947")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"verificationprogress"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.001530462018729556")]),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("When the "),s("code",[t._v("verificationprogress")]),t._v(" gets to either "),s("code",[t._v("0.99..")]),t._v(" or "),s("code",[t._v("1.0")]),t._v(" your node has synchronised. To double check you can also use a public block explorer such as "),s("a",{attrs:{href:"https://blockstream.info/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://blockstream.info/"),s("OutboundLink")],1),t._v(" to view the latest "),s("code",[t._v("Bitcoin")]),t._v(" block and compare it to the "),s("code",[t._v("blocks")]),t._v(" value from the "),s("code",[t._v("bitcoin-cli getblockchaininfo")]),t._v(" result.")]),t._v(" "),s("h5",{attrs:{id:"check-tor-and-bitcoin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-tor-and-bitcoin"}},[t._v("#")]),t._v(" Check Tor and Bitcoin")]),t._v(" "),s("p",[t._v("If Tor was installed prior to the Bitcoin Daemon then it should have automatically registered and begun listening on a torv2 onion address (note support for torv3 onion addresses is in the "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/issues/18884",target:"_blank",rel:"noopener noreferrer"}},[t._v("pipeline"),s("OutboundLink")],1),t._v(").")]),t._v(" "),s("p",[t._v("The easiest way to get your Bitcoin Daemon torv2 address is using "),s("code",[t._v("bitcoin-cli")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("bitcoin-cli getnetworkinfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("200100")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"subversion"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/Satoshi:0.20.1/"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"protocolversion"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("70015")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"localservices"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0000000000000409"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"localaddresses"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[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 string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"192.168.11.4"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"port"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"score"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),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 string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v5j6hfz4xafmeckf.onion"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"port"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"score"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("156")]),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 string"}},[t._v('"warnings"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("An alternative approach is to search the Bitcoin daemon log file:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /var/lib/bitcoind/debug.log "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" onion\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-05-23T18:24:22Z tor: Got "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("service")]),t._v(" ID 4d4al7v4hj5p7bb6, advertising "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("service")]),t._v(" 4d4al7v4hj5p7bb6.onion:8333\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-05-23T18:24:22Z AddLocal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("4d4al7v4hj5p7bb6.onion:8333,4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("If there is a problem and no onion address can be found in the log file then check for Tor related error messages:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /var/lib/bitcoind/debug.log "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" tor\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27T08:03:28Z torcontrol thread start\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27T08:03:28Z tor: Authentication cookie /run/tor/control.authcookie could not be opened "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("check permissions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("The above error message can occur if the user accounts running the Bitcoin service does not have read access to the Tor authentication cookie file, "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/tor.md#3-automatically-listen-on-tor",target:"_blank",rel:"noopener noreferrer"}},[t._v("more info"),s("OutboundLink")],1),t._v(". To fix this particular error add the required user account to the "),s("code",[t._v("debian-tor")]),t._v(" group.")]),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("usermod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-G")]),t._v(" debian-tor admin\n")])])]),s("p",[t._v("To change your onion address:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" /var/lib/bitcoind/onion_private_key\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart bitcoind\n~$ bitcoin-cli getnetworkinfo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" onion\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"onion"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"qud5iwbntqxlfwjv.onion"')]),t._v(",\n")])])]),s("p",[t._v("To check your onion address from a remote host with tor installed:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ torsocks "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--shell")]),t._v("\n~$ telnet 4d4al7v4hj5p7bb6.onion "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v("\n Trying "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.42")]),t._v(".42.0"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n Connected to "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.42")]),t._v(".42.0.\n Escape character is "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'^]'")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exit")]),t._v("\n")])])]),s("p",[t._v("To connect another "),s("code",[t._v("bitcoind")]),t._v(" instance to your new node:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ bitcoin-cli addnode "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4d4al7v4hj5p7bb6.onion"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"add"')]),t._v("\n~$ bitcoin-cli getaddednodeinfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"addednode"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4d4al7v4hj5p7bb6.onion"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"connected"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" true,\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"addresses"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[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 string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4d4al7v4hj5p7bb6.onion:8333"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"connected"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"outbound"')]),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:"nbxplorer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nbxplorer"}},[t._v("#")]),t._v(" NBXplorer")]),t._v(" "),s("p",[s("strong",[t._v("NBXplorer")]),t._v(" is a dotnet core application that monitors the Bitcoin blockchain for transactions of interest to your BTCPay Server.")]),t._v(" "),s("h5",{attrs:{id:"install-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-5"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-install-net-80-sdk"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-net-80-sdk"}},[t._v("#")]),t._v(" 1. Install .NET 8.0 SDK")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004-",target:"_blank",rel:"noopener noreferrer"}},[t._v("Follow the install instuctions"),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("# Add Microsoft package repository")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" packages-microsoft-prod.deb\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" dpkg "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" packages-microsoft-prod.deb\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" packages-microsoft-prod.deb\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Install the SDK")]),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("apt-get")]),t._v(" update\n"),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" apt-transport-https\n"),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(" update\n"),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" dotnet-sdk-8.0\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Check")]),t._v("\ndotnet "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\n")])])]),s("h5",{attrs:{id:"2-build-nbxplorer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-build-nbxplorer"}},[t._v("#")]),t._v(" 2. Build NBXplorer")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n~/src$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/dgarage/NBXplorer\n~/src$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" NBXplorer\n~/src/NBXplorer$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\./)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),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("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n~/src/NBXplorer$ ./build.sh\n")])])]),s("h5",{attrs:{id:"3-create-postgresql-database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-postgresql-database"}},[t._v("#")]),t._v(" 3. Create Postgresql Database")]),t._v(" "),s("p",[t._v("While NBXplorer support storing data in a local database via "),s("code",[t._v("--dbtrie")]),t._v(", this is deprecated. Here how to create the appropriate database and user for NBXlporer in "),s("strong",[t._v("Postgresql")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\n")])])]),s("p",[t._v("Then execute")]),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 keyword"}},[t._v("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" nbxplorer TEMPLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'template0'")]),t._v(" LC_CTYPE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" LC_COLLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" ENCODING "),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("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("USER")]),t._v(" nbxplorer "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WITH")]),t._v(" ENCRYPTED PASSWORD "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'urpassword'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("GRANT")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ALL")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIVILEGES")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ON")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" nbxplorer "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TO")]),t._v(" nbxplorer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Exit")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("postgres=#\\q\n")])])]),s("h5",{attrs:{id:"4-create-a-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-configuration-file"}},[t._v("#")]),t._v(" 4. Create a configuration file")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" nbxplorer.config\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("### Database ###\npostgres=User ID=nbxplorer;Password=urpassword;Application Name=nbxplorer;MaxPoolSize=20;Host=localhost;Port=5432;Database=nbxplorer;\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" /etc/nbxplorer\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" nbxplorer.config /etc/nbxplorer\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/nbxplorer/nbxplorer.config\n")])])]),s("p",[t._v("Note: If you previously used a "),s("code",[t._v("dbtrie")]),t._v(" backend for NBXplorer, but want to switch to postgres, "),s("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/docs/Postgres-Migration.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("read this documentation"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h5",{attrs:{id:"5-create-a-systemd-service-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#5-create-a-systemd-service-2"}},[t._v("#")]),t._v(" 5. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is shown below. Adjust the paths, User and Group accordingly.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" nbxplorer.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Unit]\nDescription=NBXplorer daemon\nRequires=bitcoind.service\nAfter=bitcoind.service\n\n[Service]\nWorkingDirectory=/home/admin/src/NBXplorer\nExecStart=/home/admin/src/NBXplorer/run.sh --conf=/etc/nbxplorer/nbxplorer.config\nUser=admin\nGroup=admin\nType=simple\nPIDFile=/run/nbxplorer/nbxplorer.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" nbxplorer.service /etc/systemd/system\n~$ "),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" nbxplorer\n")])])]),s("h5",{attrs:{id:"check-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-5"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" nbxplorer "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":13:35 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Data Directory: /home/admin/.nbxplorer/Main\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":13:35 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Configuration File: /home/admin/.nbxplorer/Main/settings.config\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":13:35 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Network: Mainnet\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":20:04 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Events: BTC: New block 0000000000000000000c405ba5df5f5533359a4393247a0c52d26c458d4dd989 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("577449")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("If it doesn't start correctly stop the service and run the application directly to get any error messages.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop nbxplorer\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ./src/NBXplorer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" ./run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),t._v("\n")])])]),s("h5",{attrs:{id:"update"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),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("# Stop the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop nbxplorer\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Checkout and build latest tag")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/NBXplorer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" fetch "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--tags")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\./)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),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("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" ./build.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Restart the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start nbxplorer\n")])])]),s("h5",{attrs:{id:"migration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#migration"}},[t._v("#")]),t._v(" Migration")]),t._v(" "),s("p",[t._v("With BTCPay Server v1.5 we "),s("a",{attrs:{href:"https://blog.btcpayserver.org/nbxplorer-postgres/",target:"_blank",rel:"noopener noreferrer"}},[t._v("improved NBXplorer by switching to Postgres"),s("OutboundLink")],1),t._v(".\nIf you are still using the DBTrie based version, please consider "),s("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/docs/Postgres-Migration.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("migrating NBXplorer"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("Afterwards you need to set "),s("code",[t._v("BTCPAY_EXPLORERPOSTGRES")]),t._v(" to the same connection string as NBXplorer.")]),t._v(" "),s("h2",{attrs:{id:"btcpay-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server"}},[t._v("#")]),t._v(" BTCPay Server")]),t._v(" "),s("p",[t._v("Like NBXplorer the BTCPay Server application is also .NET Core. The install steps assume .NET Core was previosuly installed.")]),t._v(" "),s("h5",{attrs:{id:"install-6"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-6"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-build-btcpay-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-build-btcpay-server"}},[t._v("#")]),t._v(" 1. Build BTCPay Server")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Clone the repository")]),t._v("\n~/src$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/btcpayserver/btcpayserver.git\n~/src$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Checkout latest tag")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\.[0-9]+\\.[0-9]+$/)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),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("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Build the app")]),t._v("\n~/src/btcpayserver$ ./build.sh\n")])])]),s("h5",{attrs:{id:"2-create-postgresql-database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-create-postgresql-database"}},[t._v("#")]),t._v(" 2. Create Postgresql Database")]),t._v(" "),s("p",[t._v("By default BTCPay Server will store data in a single SQLite file. A more robust option is to use "),s("strong",[t._v("Postgresql")]),t._v(" which requires the appropriate database and user to exist.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\n")])])]),s("p",[t._v("Then execute")]),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 keyword"}},[t._v("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" btcpay TEMPLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'template0'")]),t._v(" LC_CTYPE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" LC_COLLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" ENCODING "),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("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("USER")]),t._v(" btcpay "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WITH")]),t._v(" ENCRYPTED PASSWORD "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'urpassword'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("GRANT")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ALL")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIVILEGES")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ON")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" btcpay "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TO")]),t._v(" btcpay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Exit")]),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 assign-left variable"}},[t._v("postgres")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#\\q")]),t._v("\n")])])]),s("h5",{attrs:{id:"3-create-a-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-a-configuration-file"}},[t._v("#")]),t._v(" 3. Create a configuration file")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" btcpay.config\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("### Database ###\npostgres=User ID=btcpay;Password=urpassword;Application Name=btcpayserver;Host=localhost;Port=5432;Database=btcpay;\nexplorer.postgres=User ID=nbxplorer;Password=urpassword;Application Name=nbxplorer;MaxPoolSize=20;Host=localhost;Port=5432;Database=nbxplorer;\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" /etc/btcpay\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" btcpay.config /etc/btcpay\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/btcpay/btcpay.config\n")])])]),s("h5",{attrs:{id:"4-create-a-systemd-service"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-systemd-service"}},[t._v("#")]),t._v(" 4. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is shown below. Adjust the paths, User and Group accordingly.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" btcpay.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('[Unit]\nDescription=BTCPay Server\nRequires=nbxplorer.service\nAfter=nbxplorer.service\n\n[Service]\nWorkingDirectory=/home/admin/src/btcpayserver\nEnvironment=BTCPAY_BTCEXTERNALRTL="server=https://mainnet.demo.btcpayserver.org/rtl;cookiefile=/var/lib/rtl/.cookie"\nExecStart=/home/admin/src/btcpayserver/run.sh --conf=/etc/btcpay/btcpay.config\nUser=admin\nGroup=admin\nType=simple\nPIDFile=/run/btcpayserver/btcpayserver.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n')])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" btcpay.service /etc/systemd/system\n~$ "),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" btcpay\n")])])]),s("h5",{attrs:{id:"check-6"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-6"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" btcpay "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n-- The start-up result is RESULT.\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":01:25 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10263")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Data Directory: /home/admin/.btcpayserver/Main\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":01:25 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10263")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Configuration File: /etc/btcpay/btcpay.config\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":01:25 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10263")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Network: Mainnet\n")])])]),s("p",[t._v("If it doesn't start correctly stop the service and run the application directly to get any error messages.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop btcpay\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/btcpayserver"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" ./run.sh "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--conf")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/etc/btcpay/btcpay.config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("An example of checking information in the database.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("postgres")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\connect btcpay;")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("btcpay")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\dt")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("btcpay")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# select * from "Invoices";')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("btcpay")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\q")]),t._v("\n")])])]),s("p",[t._v('Attempting to open your BTCPay Server domain in a browser now should show the "Welcome to your BTCPay Server" page.\nIf you are not using a Lightning Node this is the end of the install.')]),t._v(" "),s("h5",{attrs:{id:"update-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-2"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),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("# Stop the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop btcpay\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Checkout and build latest tag")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/btcpayserver"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" fetch "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--tags")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\.[0-9]+\\.[0-9]+$/)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),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("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" ./build.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Restart the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start btcpay\n")])])]),s("h2",{attrs:{id:"lightning-network-daemon-lnd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-daemon-lnd"}},[t._v("#")]),t._v(" Lightning Network Daemon (LND)")]),t._v(" "),s("h5",{attrs:{id:"install-7"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-7"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("p",[t._v("Full "),s("a",{attrs:{href:"https://github.com/lightningnetwork/lnd/blob/master/docs/INSTALL.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("instructions"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h5",{attrs:{id:"1-install-go"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-go"}},[t._v("#")]),t._v(" 1. Install Go")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://dl.google.com/go/go1.13.linux-amd64.tar.gz\n~$ sha256sum go1.13.linux-amd64.tar.gz\n68a2297eb099d1a76097905a2ce334e3155004ec08cdea85f24527be3c48e856 go1.13.linux-amd64.tar.gz\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-C")]),t._v(" /usr/local "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xzf")]),t._v(" go1.13.linux-amd64.tar.gz\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),t._v(":/usr/local/go/bin\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("GOPATH")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=~")]),t._v("/gocode\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin\n~$ go version\ngo version go1.13 linux/amd64\n")])])]),s("h5",{attrs:{id:"2-build-and-install-lnd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-build-and-install-lnd"}},[t._v("#")]),t._v(" 2. Build and install LND")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/lightningnetwork/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# installs to a directory in $GOPATH/bin")]),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("cp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lnd "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lncli /usr/bin\n~$ lnd "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\nlnd version "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.10")]),t._v(".99-beta "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("commit")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("clock/v1.0.0-229-ge64e71d86dc1ac716c30a80f85a22e8fb544697f\n")])])]),s("h5",{attrs:{id:"3-create-a-symbolic-link-to-the-bitcoin-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-a-symbolic-link-to-the-bitcoin-configuration-file"}},[t._v("#")]),t._v(" 3. Create a symbolic link to the Bitcoin configuration file")]),t._v(" "),s("p",[t._v("lnd looks for bitcoin.conf in a specific location to get necessary RPC and zeromq details.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" ~/.bitcoin/bitcoin.conf /etc/bitcoin/bitcoin.conf\n")])])]),s("h5",{attrs:{id:"4-create-a-configuration-file-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-configuration-file-2"}},[t._v("#")]),t._v(" 4. Create a configuration file")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" lnd.conf\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Application Options]\ndatadir=/var/lib/lnd/data\ntlscertpath=/var/lib/lnd/tls.cert\ntlskeypath=/var/lib/lnd/tls.key\nlogdir=/var/lib/lnd/logs\nmaxlogfiles=3\nmaxlogfilesize=10\n#externalip=1.1.1.1 # change to your public IP address if required.\nalias=i_luv_btcpay\nlisten=0.0.0.0:9735\n\n[Bitcoin]\nbitcoin.active=1\nbitcoin.node=bitcoind\nbitcoin.mainnet=true\n\n[tor]\ntor.active=true\ntor.v3=true\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /etc/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /var/lib/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chown")]),t._v(" admin:admin "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-R")]),t._v(" /var/lib/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" lnd.conf /etc/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/lnd/lnd.conf\n")])])]),s("h5",{attrs:{id:"5-create-a-systemd-service-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#5-create-a-systemd-service-3"}},[t._v("#")]),t._v(" 5. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is shown below. Adjust the paths, User and Group accordingly.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" lnd.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Unit]\nDescription=LND Lightning Network Daemon\nRequires=bitcoind.service\nAfter=bitcoind.service\n\n[Service]\nExecStart=/usr/bin/lnd --configfile=/etc/lnd/lnd.conf\nExecStop=/usr/bin/lncli --lnddir /var/lib/lnd stop\nPIDFile= /run/lnd/lnd.pid\n\nUser=admin\nGroup=admin\n\nType=simple\nKillMode=process\nTimeoutStartSec=60\nTimeoutStopSec=60\nRestart=always\nRestartSec=60\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" lnd.service /etc/systemd/system\n~$ "),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" lnd\n")])])]),s("h5",{attrs:{id:"configuration-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-4"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),s("p",[s("strong",[t._v("Running a Bitcoin Lightning daemon requires a hot wallet on your BTCPay Server.")])])]),t._v(" "),s("p",[t._v("With Bitcoin the protocol has evolved and deterministic key derivation means the keys for your wallet can be kept in a different location to the BTCPay Server. Lightning daemons do not have this facility. Any Bitcoins committed or received in your lightning channels are controlled by private keys that are on your BTCPay Server.")]),t._v(" "),s("h5",{attrs:{id:"1-create-a-symbolic-link-to-the-lnd-data-directory"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-create-a-symbolic-link-to-the-lnd-data-directory"}},[t._v("#")]),t._v(" 1. Create a symbolic link to the lnd data directory")]),t._v(" "),s("p",[t._v("The install steps above use "),s("code",[t._v("/var/lib/lnd")]),t._v(" as the data directory rather than the default "),s("code",[t._v("/home/user/.lnd")]),t._v(". In order to save typing when using the "),s("code",[t._v("lncli")]),t._v(" client it's useful to add a symbolic directory link.")]),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("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" /var/lib/lnd .lnd\n")])])]),s("h5",{attrs:{id:"2-create-lightning-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-create-lightning-wallet"}},[t._v("#")]),t._v(" 2. Create Lightning wallet")]),t._v(" "),s("p",[t._v("The first time the lnd is started a new wallet must be created and the backup seed safely recorded (if someone else gets your seed they can steal your funds so keep it safe).")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli create\nInput wallet password:\nConfirm password:\n\nDo you have an existing cipher seed mnemonic you want to use? "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Enter y/n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(": n\n\nYour cipher seed can optionally be encrypted.\nInput your passphrase "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" you wish to encrypt it "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("or press enter to proceed without a cipher seed passphrase"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(":\n\nGenerating fresh cipher seed"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET"),s("span",{pre:!0,attrs:{class:"token operator"}},[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---------------BEGIN LND CIPHER SEED---------------\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(". above "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(". catch "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(". start "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(". tape\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(". sound "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(". friend "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v(". water "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(". royal\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(". solid "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(". poet "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v(". wisdom "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),t._v(". match\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("13")]),t._v(". virtual "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v(". zero "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(". slender "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v(". thrive\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v(". idle "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(". catch "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(". robot "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(". clay\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(". resemble "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(". angry "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(". work "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v(". "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("until")]),t._v("\n---------------END LND CIPHER SEED-----------------\n\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET"),s("span",{pre:!0,attrs:{class:"token operator"}},[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\nlnd successfully initialized"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n")])])]),s("p",[t._v("Note that if the symbolic directory link from the previous step "),s("strong",[t._v("was not")]),t._v(" created the command is:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("lncli "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--lnddir")]),t._v(" /var/lib/lnd create\n")])])]),s("h5",{attrs:{id:"3-unlock-the-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-unlock-the-wallet"}},[t._v("#")]),t._v(" 3. Unlock the wallet")]),t._v(" "),s("p",[t._v("Every time lnd is restarted the wallet "),s("strong",[t._v("needs to be unlocked")]),t._v(". This is not ideal for a BTCPay Server that can is designed to run unattended but Lighting is still in its infancy.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli unlock\n")])])]),s("h5",{attrs:{id:"check-7"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-7"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli getinfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.10.99-beta commit=clock/v1.0.0-229-ge64e71d86dc1ac716c30a80f85a22e8fb544697f"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"commit_hash"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"e64e71d86dc1ac716c30a80f85a22e8fb544697f"')]),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("Check the service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" lnd "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":46:29 ubuntu lnd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("654474")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":46:29.909 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("INF"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" DISC: Attempting to bootstrap with: BOLT-0010 DNS Seed: "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("nodes.lightning.directory soa.nodes.lightning.directory"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("lseed.bitcoinstats.com "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41 ubuntu lnd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("654474")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41.939 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("INF"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" DISC: Attempting to bootstrap with: Authenticated Channel Graph\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41 ubuntu lnd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("654474")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41.940 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("ERR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" SRVR: Unable to retrieve initial bootstrap peers: no addresses found\n")])])]),s("p",[t._v("The "),s("strong",[t._v("Lightning Node Connection String")]),t._v(" to use with "),s("code",[t._v("BTCPay Server")]),t._v(" is:")]),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 assign-left variable"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("lnd-rest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("server")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("https://127.0.0.1:8080/"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("macaroonfilepath")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/home/admin/.lnd/data/chain/bitcoin/mainnet/admin.macaroon"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("allowinsecure")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true\n")])])]),s("h5",{attrs:{id:"add-lnd-as-internal-node"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#add-lnd-as-internal-node"}},[t._v("#")]),t._v(" Add LND as internal node")]),t._v(" "),s("p",[t._v("To add LND as internal node you have to edit the "),s("a",{attrs:{href:"#3-create-a-configuration-file"}},[t._v("btcpay.config file")]),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 builtin class-name"}},[t._v("cd")]),t._v(" /etc/btcpay\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" btcpay.config\n")])])]),s("p",[t._v("Right below the database part, add the "),s("code",[t._v("BTC.lightning")]),t._v(" setting:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("### Lightning ###\nBTC.lightning=type=lnd-rest;server=https://127.0.0.1:8080/;macaroonfilepath=/home/admin/.lnd/data/chain/bitcoin/mainnet/admin.macaroon;allowinsecure=true\n")])])]),s("p",[t._v('See the "Use custom node" view on the Lightning node connection setting screen in BTCPay Server for details on the connection string.')]),t._v(" "),s("p",[t._v("You need to restart BTCPay Server for the settings update to take effect:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart btcpay\n")])])]),s("h5",{attrs:{id:"check-tor-and-lnd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-tor-and-lnd"}},[t._v("#")]),t._v(" Check Tor and LND")]),t._v(" "),s("p",[t._v("As with the Bitcoin daemon if Tor is installed and the configuration file enables it (the one above does) then "),s("code",[t._v("lnd")]),t._v(" will automatically register an onion address. In lnd's case torv3 addresses are supported.")]),t._v(" "),s("p",[t._v("The torv3 onion address below is a lot longer than the torv2 one from the Bitcoin daemon section (16 characters compared to 56 characters).")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli getinfo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" onion\n"),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"029b0e3c05595074afcffdca0fb22fb68a95a9c4698dd20962f647de4891eceabd@liyuvwbbycrvvuzcrsd5rq7svwckabejlsymcxiwzkj3smvlwcsqpjyd.onion:9735"')]),t._v("\n")])])]),s("p",[t._v("The Tor address created by lnd can be used to connect to other Lighting peers on the Tor network. The Tor address can work in parallel with an IPv4 or IPv6 address. To register one of those make sure the "),s("code",[t._v("externalip")]),t._v(" is set in the lnd configuration file.")]),t._v(" "),s("h5",{attrs:{id:"update-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-3"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),t._v(":/usr/local/go/bin\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("GOPATH")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=~")]),t._v("/gocode\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/src/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" pull\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# installs to a directory in $GOPATH/bin")]),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("cp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lnd "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lncli /usr/bin\n~$ lnd "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\nlnd version "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.10")]),t._v(".99-beta "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("commit")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("clock/v1.0.0-229-ge64e71d86dc1ac716c30a80f85a22e8fb544697f\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start lnd\n")])])]),s("p",[t._v("After the daemon has been restarted the wallet needs to be unlocked:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli unlock\n")])])]),s("p",[t._v("If "),s("code",[t._v("Ride The Lightning (RTL)")]),t._v(" is installed, see next section, it may have stopped when lnd disappeared so it will also need to be restarted.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start rtl\n")])])]),s("h2",{attrs:{id:"ride-the-lightning-rtl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ride-the-lightning-rtl"}},[t._v("#")]),t._v(" Ride The Lightning (RTL)")]),t._v(" "),s("p",[s("strong",[t._v("Ride the Lightning")]),t._v(" is a Node.js application to manage your Lightning peers, channels, wallet etc.")]),t._v(" "),s("p",[t._v("The advantage of the work that has gone into BTCPay Server is that the RTL web page can be controlled and accessed in the same manner as the BTCPay site.")]),t._v(" "),s("h5",{attrs:{id:"install-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-8"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-install-dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-dependencies"}},[t._v("#")]),t._v(" 1. Install dependencies")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" nodejs build-essential "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v("\n")])])]),s("h5",{attrs:{id:"2-build-rtl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-build-rtl"}},[t._v("#")]),t._v(" 2. Build RTL")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/src\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/Ride-The-Lightning/RTL.git\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" RTL\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--only")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("prod\n")])])]),s("h5",{attrs:{id:"3-create-a-configuration-file-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-a-configuration-file-2"}},[t._v("#")]),t._v(" 3. Create a configuration file")]),t._v(" "),s("p",[t._v("Copy the sample config file from "),s("code",[t._v("sample-RTL-Config.json")]),t._v(" and adjust accordingly. An example that works with the rest of the instructions in this document is shown below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" src/RTL/sample-RTL-Config.json RTL-Config.json\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" RTL-Config.json\n")])])]),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('"port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"3000"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"defaultNodeIndex"')]),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('"SSO"')]),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('"rtlSSO"')]),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('"rtlCookiePath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/var/lib/rtl/.cookie"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" # Needs to match the value in BTCPay systemd settings.\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"logoutRedirectLink"')]),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/login"')]),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('"nodes"')]),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('"index"')]),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('"lnNode"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Node 1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"lnImplementation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LND"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Authentication"')]),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('"macaroonPath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/var/lib/lnd/data/chain/bitcoin/mainnet"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"configPath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/etc/lnd/lnd.conf"')]),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('"Settings"')]),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('"userPersona"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"MERCHANT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"themeMode"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"DAY"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"themeColor"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PURPLE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"channelBackupPath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/home/admin/rtl/backup/node-1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"enableLogging"')]),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('"lnServerUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:8080/v1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"swapServerUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/v1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fiatConversion"')]),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 "),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("Note that RTL has different behaviour and requirements compared to the other services documented in theses instructions, specifically:")]),t._v(" "),s("ol",[s("li",[t._v("The configuration file needs to exist in RTL's data directory,")]),t._v(" "),s("li",[t._v("The RTL process may write update to the configuration file.")])]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /var/lib/rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" ~/RTL-Config.json /var/lib/rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chown")]),t._v(" admin:admin "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-R")]),t._v(" /var/lib/rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /var/lib/rtl/RTL-Config.json\n")])])]),s("h5",{attrs:{id:"4-create-a-systemd-service-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-systemd-service-2"}},[t._v("#")]),t._v(" 4. Create a systemd service")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" rtl.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('[Unit]\nDescription=Ride The Lightning\nRequires=lnd.service\nAfter=lnd.service\n\n[Service]\nEnvironment="RTL_CONFIG_PATH=/var/lib/rtl"\nWorkingDirectory=/var/lib/rtl\nExecStart=/usr/bin/node /home/admin/src/RTL/rtl\nUser=admin\nGroup=admin\nType=simple\nPIDFile=/run/rtl/rtl.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n')])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" rtl.service /etc/systemd/system\n~$ "),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" rtl\n")])])]),s("h5",{attrs:{id:"check-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-8"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("p",[t._v("Check the service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" rtl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(":27:52 ubuntu node"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("988638")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": Server is up and running, please "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open")]),t._v(" the UI at http://localhost:3000\n")])])]),s("p",[t._v("If it doesn't start correctly stop the service and run the application directly to get any error messages.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("RTL_CONFIG_PATH")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/var/lib/rtl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/RTL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("node")]),t._v(" rtl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nServer is up and running, please "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open")]),t._v(" the UI at http://localhost:3000\n")])])]),s("p",[t._v("From the "),s("code",[t._v("BTCPay Server")]),t._v(" web page the "),s("code",[t._v("RTL")]),t._v(" interface should be accessible from "),s("code",[t._v("Server Settings->Services")]),t._v(' under the "Crypto services exposed by your server" heading.')]),t._v(" "),s("h5",{attrs:{id:"update-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-4"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/RTL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" pull"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start rtl\n")])])]),s("h2",{attrs:{id:"the-end"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#the-end"}},[t._v("#")]),t._v(" The End")]),t._v(" "),s("h3",{attrs:{id:"questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#questions"}},[t._v("#")]),t._v(" Questions")]),t._v(" "),s("p",[t._v("Join the "),s("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("community chat"),s("OutboundLink")],1),t._v(" on Mattermost by downloading "),s("a",{attrs:{href:"https://mattermost.com/download/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mattermost app"),s("OutboundLink")],1),t._v(", or on "),s("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("Telegram"),s("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);s.default=n.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[119],{801: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:"extended-manual-setup"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#extended-manual-setup"}},[t._v("#")]),t._v(" Extended Manual Setup")]),t._v(" "),s("p",[t._v("This document lists steps for "),s("strong",[t._v("manually deploying BTCPay Server")]),t._v(" and additional related components. Following these steps is likely to take a long time. A shorter and more pragmatic approach is to use a "),s("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver-docker",target:"_blank",rel:"noopener noreferrer"}},[t._v("docker based deployment"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("The instructions also build all the application components from source which can be an advantage for certain audit and/or security scenarios.")]),t._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),s("h4",{attrs:{id:"not-recommended-for-production-use"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#not-recommended-for-production-use"}},[t._v("#")]),t._v(" Not recommended for production use")]),t._v(" "),s("p",[t._v("Manual installation is NOT recommended for production use unless you are very confident with your Operating System and Bitcoin security expertise. If you are unsure use the docker deployment or one of the other "),s("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("deployment options")]),t._v(".")],1),t._v(" "),s("h4",{attrs:{id:"you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#you-must-have-technical-literacy-and-be-able-to-resolve-any-issues-on-your-own-the-community-will-not-provide-extensive-support-for-this-deployment"}},[t._v("#")]),t._v(" You must have technical literacy and be able to resolve any issues on your own. The community will not provide extensive support for this deployment.")])]),t._v(" "),s("h2",{attrs:{id:"installation-steps-overview"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#installation-steps-overview"}},[t._v("#")]),t._v(" Installation Steps Overview")]),t._v(" "),s("p",[t._v("The instructions in this article have been tested on Ubuntu 20.04. They should be applicable to other Linux based distributions. They are also based on all components being on the same host or virtual machine. It is possible to split the components across different hosts but these instructions don't describe that.")]),t._v(" "),s("p",[t._v("An example hostname of "),s("code",[t._v("mainnet.demo.btcpayserver.org")]),t._v(" has been used, it needs to be replaced with the hostname you are using for your BTCPay Server.")]),t._v(" "),s("h3",{attrs:{id:"security"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#security"}},[t._v("#")]),t._v(" Security")]),t._v(" "),s("p",[t._v("If you do use these instructions to install a BTCPay Server connected to the Bitcoin mainnet then at a minimum you should understand how the wallet mechanisms work. It's highly recommended to read the two articles below and ask questions if anything is not clear.")]),t._v(" "),s("ul",[s("li",[s("RouterLink",{attrs:{to:"/FAQ/Wallet/"}},[t._v("BTCPay Wallet FAQ")])],1),t._v(" "),s("li",[s("RouterLink",{attrs:{to:"/LightningNetwork/"}},[t._v("Lightning Network and BTCPay (first section)")])],1)]),t._v(" "),s("p",[t._v("As an additional aid below is a list of iptables rules and instructions which should include all the ports that need to be open. "),s("strong",[t._v("NO WARRANTY")]),t._v(". Use at your own risk, "),s("strong",[t._v("including risk of locking yourself out")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" iptables.txt\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("# Generated by iptables-save v1.6.1 on Mon May 27 18:48:11 2019\n*filter\n:INPUT ACCEPT [0:0]\n:FORWARD ACCEPT [0:0]\n:OUTPUT ACCEPT [0:0]\n-A INPUT -i lo -j ACCEPT\n-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT # SSH\n-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT # BTCPay HTTP\n-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT # BTCPay HTTPS\n-A INPUT -p tcp -m tcp --dport 8333 -j ACCEPT # Bitcoind P2P\n-A INPUT -p tcp -m tcp --dport 9735 -j ACCEPT # Lightning P2P\n-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT\nCOMMIT\n# Completed on Mon May 27 18:48:11 2019\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" iptables-restore "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v(" iptables.txt\n")])])]),s("p",[t._v("At this point if you are still connected to you ssh session it's a good sign. If not the rules are temporary and you can use whatever mechanism you have to remotely reboot your server and try again.")]),t._v(" "),s("p",[t._v("The rules have now been temporarily applied. To apply the rules automatically each time your server starts use the "),s("code",[t._v("iptables-persistent")]),t._v(" package.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" iptables-persistent\n")])])]),s("p",[t._v("If you subsequently change the iptables rules and want to save them across reboots use the command below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" netfilter-persistent save\n")])])]),s("h2",{attrs:{id:"unprivileged-user"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#unprivileged-user"}},[t._v("#")]),t._v(" Unprivileged user")]),t._v(" "),s("p",[t._v("These instructions configure everything to run under an "),s("strong",[t._v("unprivileged user")]),t._v(" called "),s("code",[t._v("admin")]),t._v(". Create this user before proceeding:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("useradd")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-M")]),t._v(" admin "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("usermod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-L")]),t._v(" admin\n")])])]),s("h3",{attrs:{id:"prerequisites"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#prerequisites"}},[t._v("#")]),t._v(" Prerequisites")]),t._v(" "),s("ul",[s("li",[t._v("Postgresql")]),t._v(" "),s("li",[t._v("Tor")]),t._v(" "),s("li",[t._v("NGINX and Let's Encrypt")])]),t._v(" "),s("h3",{attrs:{id:"application-components"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#application-components"}},[t._v("#")]),t._v(" Application Components")]),t._v(" "),s("ul",[s("li",[t._v("Bitcoin Core"),s("sup",[t._v("1,2")])]),t._v(" "),s("li",[t._v("NBXplorer"),s("sup",[t._v("1,2")])]),t._v(" "),s("li",[t._v("BTCPay Server"),s("sup",[t._v("1,2")])]),t._v(" "),s("li",[t._v("Lightning Network Daemon (LND)"),s("sup",[t._v("2")])]),t._v(" "),s("li",[t._v("Ride The Lightning (RTL)"),s("sup",[t._v("2")])])]),t._v(" "),s("p",[s("sup",[t._v("1")]),t._v(" The bare minimum install of a BTCPay Server only requires these items. Using a bare minimum configuration reduces the functionality: no Lightning payments, no auto-renewal of TLS certificates, less reliable data store, less capable of handling NAT and more.")]),t._v(" "),s("p",[s("sup",[t._v("2")]),t._v(" Built from source code.")]),t._v(" "),s("h2",{attrs:{id:"postgresql"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#postgresql"}},[t._v("#")]),t._v(" Postgresql")]),t._v(" "),s("p",[s("strong",[t._v("Postgresql")]),t._v(" can be used by BTCPay Server in place of the default SQLite file based storage. It's also possible to use MySQL.")]),t._v(" "),s("h5",{attrs:{id:"install"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" postgresql postgresql-contrib\n")])])]),s("h5",{attrs:{id:"configuration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("p",[t._v("Covered in BTCPay Server Configuration.")]),t._v(" "),s("h5",{attrs:{id:"check"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ psql "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\npsql "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("PostgreSQL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Ubuntu "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v("-4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status postgresql\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\npsql "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Ubuntu "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12.2")]),t._v("-4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("))")]),t._v("\nType "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"help"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" help.\n\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("postgres")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\q")]),t._v("\n")])])]),s("h2",{attrs:{id:"tor"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#tor"}},[t._v("#")]),t._v(" Tor")]),t._v(" "),s("p",[s("strong",[t._v("Tor")]),t._v(" can be used by the following components to provide enhanced privacy and/or help with NAT traversal:")]),t._v(" "),s("ul",[s("li",[t._v("Bitcoin Core Daemon")]),t._v(" "),s("li",[t._v("Lightning Network Daemon (LND).")])]),t._v(" "),s("p",[t._v("Additional information running Bitcoin Core with Tor support can be found "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/tor.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h5",{attrs:{id:"install-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-2"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" tor\n")])])]),s("h5",{attrs:{id:"configuration-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-2"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" /etc/tor/torrc "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (and uncomment two lines below)")]),t._v("\nControlPort "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9051")]),t._v("\nCookieAuthentication "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart tor\n")])])]),s("p",[t._v("Covered further in Bitcoin and Lightning Network Daemon sections.")]),t._v(" "),s("h5",{attrs:{id:"check-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-2"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ tor "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\nTor version "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.4")]),t._v(".2.7\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tlnp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" tor "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (lines below correspond to the tor control port and SOCKS proxy)")]),t._v("\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1:9050 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1376")]),t._v("/tor\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1:9051 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1376")]),t._v("/tor\n")])])]),s("h2",{attrs:{id:"nginx-and-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nginx-and-lets-encrypt"}},[t._v("#")]),t._v(" NGINX and Let's Encrypt")]),t._v(" "),s("p",[s("strong",[t._v("NGINX")]),t._v(" is used as a web server to manage HTTP requests to BTCPay Server and Ride The Lightning. Paired with "),s("strong",[t._v("Let's Encrypt")]),t._v(" it allows seamless procurement and renewal of a TLS certificate for your BTCPay Server instance.")]),t._v(" "),s("p",[t._v("Let's Encrypt is a free service for procuring and renewing TLS certificates. The service comes with scripts that can be installed to automatically manage the whole process.")]),t._v(" "),s("h5",{attrs:{id:"install-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-3"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-install-nginx"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-nginx"}},[t._v("#")]),t._v(" 1. Install NGINX.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" nginx\n")])])]),s("h5",{attrs:{id:"2-install-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-install-lets-encrypt"}},[t._v("#")]),t._v(" 2. Install Let's Encrypt")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" certbot python3-certbot-nginx\n")])])]),s("h5",{attrs:{id:"configuration-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-3"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("h5",{attrs:{id:"1-lets-encrypt-tls-certificate"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-lets-encrypt-tls-certificate"}},[t._v("#")]),t._v(" 1. Let's Encrypt TLS certificate")]),t._v(" "),s("p",[t._v("You must create an A or AAAA record for "),s("strong",[t._v("")]),t._v(" that points to the IP address of your server instance.\nIf your server is behind NAT then you need to forward port 80 to your instance.")]),t._v(" "),s("p",[t._v("The "),s("strong",[t._v("certbot")]),t._v(" script works by checking for a specific file on the web server hosting the requested domain. If it can't get the file the TLS certificate won't be issued. If the initial attempt fails it will be periodically re-attempted or you can simply re-run the command.")]),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(" certbot "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--nginx")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("<")]),t._v("your domain name"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(">")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (e.g: sudo certbot --nginx -d mainnet.demo.btcpayserver.org)")]),t._v("\n")])])]),s("h5",{attrs:{id:"2-add-nginx-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-add-nginx-configuration-file"}},[t._v("#")]),t._v(" 2. Add NGINX configuration file")]),t._v(" "),s("p",[t._v("The configuration file below has been copied from the BTCPay Server docker install.")]),t._v(" "),s("p",[t._v('Search for "mainnet.demo.btcpayserver.org" and replace it with your own domain name.')]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" /etc/nginx/conf.d/default.conf\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("# If we receive X-Forwarded-Proto, pass it through; otherwise, pass along the\n# scheme used to connect to this server\nmap $http_x_forwarded_proto $proxy_x_forwarded_proto {\n default $http_x_forwarded_proto;\n '' $scheme;\n}\n# If we receive X-Forwarded-Port, pass it through; otherwise, pass along the\n# server port the client connected to\nmap $http_x_forwarded_port $proxy_x_forwarded_port {\n default $http_x_forwarded_port;\n '' $server_port;\n}\n# If we receive Upgrade, set Connection to \"upgrade\"; otherwise, delete any\n# Connection header that may have been passed to this server\nmap $http_upgrade $proxy_connection {\n default upgrade;\n '' close;\n}\n# Apply fix for very long server names\nserver_names_hash_bucket_size 128;\n# Prevent Nginx Information Disclosure\nserver_tokens off;\n# Default dhparam\n# Set appropriate X-Forwarded-Ssl header\nmap $scheme $proxy_x_forwarded_ssl {\n default off;\n https on;\n}\n\ngzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;\nlog_format vhost '$host $remote_addr - $remote_user [$time_local] '\n '\"$request\" $status $body_bytes_sent '\n '\"$http_referer\" \"$http_user_agent\"';\naccess_log off;\n# HTTP 1.1 support\nproxy_http_version 1.1;\nproxy_buffering off;\nproxy_set_header Host $http_host;\nproxy_set_header Upgrade $http_upgrade;\nproxy_set_header Connection $proxy_connection;\nproxy_set_header X-Real-IP $remote_addr;\nproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\nproxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;\nproxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl;\nproxy_set_header X-Forwarded-Port $proxy_x_forwarded_port;\nproxy_buffer_size 128k;\nproxy_buffers 4 256k;\nproxy_busy_buffers_size 256k;\nclient_header_buffer_size 500k;\nlarge_client_header_buffers 4 500k;\n# Mitigate httpoxy attack (see README for details)\nproxy_set_header Proxy \"\";\n\nserver {\n server_name mainnet.demo.btcpayserver.org;\n listen 80;\n access_log /var/log/nginx/access.log vhost;\n return 301 https://$host$request_uri;\n}\nserver {\n client_max_body_size 100M;\n server_name mainnet.demo.btcpayserver.org;\n listen 443 ssl http2 ;\n access_log /var/log/nginx/access.log vhost;\n ssl_protocols TLSv1.2;\n ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';\n ssl_prefer_server_ciphers on;\n ssl_session_timeout 5m;\n ssl_session_cache shared:SSL:50m;\n ssl_session_tickets off;\n ssl_certificate /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/cert.pem;\n ssl_certificate_key /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/privkey.pem;\n ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;\n ssl_stapling on;\n ssl_stapling_verify on;\n ssl_trusted_certificate /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/fullchain.pem;\n add_header Strict-Transport-Security \"max-age=31536000\" always;\n #include /etc/nginx/vhost.d/default;\n\n # Here is the main BTCPay Server application\n location / {\n proxy_pass http://127.0.0.1:23000;\n }\n\n # Include the next two stanzas if and only if you want to expose your lightning gRPC & RPC interfaces to the internet\n location /lnrpc.Lightning {\n grpc_pass grpcs://127.0.0.1:10009;\n }\n\n location /lnd-rest/btc/ {\n rewrite ^/lnd-rest/btc/(.*) /$1 break;\n proxy_pass https://127.0.0.1:8080/;\n }\n\n # Include this stanza if you are planning to set up Ride The Lightning (RTL)\n location /rtl/ {\n proxy_pass http://127.0.0.1:3000/rtl/;\n }\n}\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart nginx\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status nginx\n")])])]),s("p",[t._v("If there is an error message restarting "),s("code",[t._v("nginx")]),t._v(" try:")]),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" nginx\n")])])]),s("h5",{attrs:{id:"check-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-3"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("h5",{attrs:{id:"1-check-lets-encrypt"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-check-lets-encrypt"}},[t._v("#")]),t._v(" 1. Check Let's Encrypt")]),t._v(" "),s("p",[t._v("It can be a little bit tricky to get everything set up correctly for the Let's Encrypt script to work correctly. Some additional commands are listed below to help with any troubleshooting.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" certbot certificates\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\nFound the following certs:\n Certificate Name: mainnet.demo.btcpayserver.org\n Domains: mainnet.demo.btcpayserver.org\n Expiry Date: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-08-10 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(":00:31+00:00 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("VALID: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("79")]),t._v(" days"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n Certificate Path: /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/fullchain.pem\n Private Key Path: /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/privkey.pem\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /etc/cron.d/certbot "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (check the cron job exists)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" */12 * * * root "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-x")]),t._v(" /usr/bin/certbot "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("\\")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-d")]),t._v(" /run/systemd/system "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" perl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-e")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'sleep int(rand(43200))'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" certbot "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-q")]),t._v(" renew\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/log/letsencrypt/letsencrypt.log "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (check for problems)")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-05-22 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":36:36,062:DEBUG:certbot.main:certbot version: "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.31")]),t._v(".0\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" certbot renew --dry-run "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# (test renewal)")]),t._v("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n** DRY RUN: simulating "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'certbot renew'")]),t._v(" close to cert expiry\n** "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("The "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" certificates below have not been saved."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n\nCongratulations, all renewals succeeded. The following certs have been renewed:\n /etc/letsencrypt/live/mainnet.demo.btcpayserver.org/fullchain.pem "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("success"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n** DRY RUN: simulating "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'certbot renew'")]),t._v(" close to cert expiry\n** "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("The "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("test")]),t._v(" certificates above have not been saved."),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n")])])]),s("h5",{attrs:{id:"2-check-nginx"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-check-nginx"}},[t._v("#")]),t._v(" 2. Check NGINX.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" nginx "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-v")]),t._v("\nnginx version: nginx/1.18.0 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Ubuntu"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("netstat")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-tlnp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" nginx\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:443 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\ntcp "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:80 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.0")]),t._v(".0.0:* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\ntcp6 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" :::443 :::* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\ntcp6 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" :::80 :::* LISTEN "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("266275")]),t._v("/nginx: maste\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" nginx "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n--\n-- A start job "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("for")]),t._v(" unit nginx.service has finished successfully.\n--\n-- The job identifier is "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19471")]),t._v(".\n")])])]),s("p",[t._v("Attempt to open your web site in a browser. At this point it is expected that a "),s("code",[t._v("502 Bad Gateway")]),t._v("error will occur. The "),s("code",[t._v("nginx")]),t._v(" logs can be checked to verify that the connection attempt was received.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/log/nginx/access.log\nmainnet.demo.btcpayserver.org "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.0")]),t._v(".0.1 - - "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v("/Jul/2020:12:19:57 +0100"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"GET / HTTP/2.0"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("502")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("552")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"')]),t._v("\n")])])]),s("p",[t._v("If there is a problem then the "),s("code",[t._v("nginx")]),t._v(" error log can also be checked.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/log/nginx/error.log\n")])])]),s("h2",{attrs:{id:"bitcoin-core"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-core"}},[t._v("#")]),t._v(" Bitcoin Core")]),t._v(" "),s("p",[t._v("The gateway to the Bitcoin network for BTCPay Server components.")]),t._v(" "),s("h5",{attrs:{id:"install-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-4"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("p",[t._v("The full instructions to "),s("strong",[t._v("build Bitcoin Core from source")]),t._v(" are "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/build-unix.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("here"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("The alternative to building from source is to download a signed binary distribution from "),s("a",{attrs:{href:"https://bitcoincore.org/en/download/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://bitcoincore.org/en/download/"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://bitcoincore.org/bin/bitcoin-core-0.20.0/bitcoin-0.20.0-x86_64-linux-gnu.tar.gz\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://bitcoincore.org/bin/bitcoin-core-0.20.0/SHA256SUMS.asc\n")])])]),s("h5",{attrs:{id:"1-install-pre-requisites-and-dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-pre-requisites-and-dependencies"}},[t._v("#")]),t._v(" 1. Install Pre-requisites and dependencies")]),t._v(" "),s("p",[t._v("These instructions do not build the Bitcoin Core GUI components as they are not needed for "),s("code",[t._v("BTCPay Server")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" build-essential libtool autotools-dev automake pkg-config bsdmainutils python3\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" libevent-dev libboost-system-dev libboost-filesystem-dev libboost-test-dev libboost-thread-dev libminiupnpc-dev libzmq3-dev\n")])])]),s("h5",{attrs:{id:"2-download-and-build-source"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-download-and-build-source"}},[t._v("#")]),t._v(" 2. Download and Build Source")]),t._v(" "),s("p",[t._v("Before cloning the "),s("code",[t._v("Bitcoin Core")]),t._v(' repository identify the most recent stable version. One convenient way to do this is on the GitHub repository page look at the latest version under the "Releases" heading. At the time of writing the stable version is '),s("code",[t._v("0.20.0")]),t._v(". Adjust the tag in the "),s("code",[t._v("git clone")]),t._v(" command below for the stable version you want to build.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n~/src$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--depth")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--branch")]),t._v(" v0.20.0 https://github.com/bitcoin/bitcoin.git\n~/src$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" bitcoin\n")])])]),s("p",[t._v("A specific version of the Berkeley DB dependency needs to be installed.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~/src/bitcoin$ ./contrib/install_db4.sh "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("pwd")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("`")])]),t._v("\n")])])]),s("p",[t._v("Use the "),s("code",[t._v("autoconf")]),t._v(" scripts to generate the make files and then build.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~/src/bitcoin$ ./autogen.sh\n~/src/bitcoin$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BDB_PREFIX")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'/home/admin/src/bitcoin/db4'")]),t._v("\n~/src/bitcoin$ ./configure "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BDB_LIBS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-L'),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${BDB_PREFIX}")]),t._v('/lib -ldb_cxx-4.8"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("BDB_CFLAGS")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"-I'),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("${BDB_PREFIX}")]),t._v('/include"')]),t._v("\n~/src/bitcoin$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~/src/bitcoin$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v("\n~/src/bitcoin$ bitcoind "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version")]),t._v("\nBitcoin Core version v0.20.0\n")])])]),s("h5",{attrs:{id:"3-create-the-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-the-configuration-file"}},[t._v("#")]),t._v(" 3. Create the configuration file")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("configuration file")]),t._v(" is available on the Bitcoin Core repository at https://github.com/bitcoin/bitcoin/blob/master/share/examples/bitcoin.conf.")]),t._v(" "),s("p",[t._v("Create a "),s("strong",[t._v("bitcoin.conf file")]),t._v(" to suit your needs. An example file that is suitable for BTCPay Server is shown below. This configuration does not prune blocks which means as of May 2019 you will require 235 GB for the Bitcoin blockchain.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" bitcoin.conf\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("server=1 # need RPC for btcpay.\nrpcbind=127.0.0.1 # loopback is default for 0.18.0 but no harm making sure.\nwhitelist=127.0.0.1 # for nbxplorer.\nrpcallowip=127.0.0.1/32 # loopback is default but again no harm.\nzmqpubrawblock=tcp://127.0.0.1:28332 # needed for lightning.\nzmqpubrawtx=tcp://127.0.0.1:28333 # needed for lightning.\n#prune=5000 # Recommended if not enough disk space for full 600+GB blockchain.\n")])])]),s("p",[t._v("Copy the file to the directory specified in the systemd service file and assign read permissions to all users.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /etc/bitcoin\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" bitcoin.conf /etc/bitcoin\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/bitcoin/bitcoin.conf\n")])])]),s("h5",{attrs:{id:"5-create-a-systemd-service"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#5-create-a-systemd-service"}},[t._v("#")]),t._v(" 5. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is available in the Bitcoin Core repository at https://raw.githubusercontent.com/bitcoin/bitcoin/master/contrib/init/bitcoind.service.")]),t._v(" "),s("p",[t._v("Edit the service file depending on your needs.")]),t._v(" "),s("p",[t._v("In the example below the "),s("strong",[t._v("User")]),t._v(" and "),s("strong",[t._v("Group")]),t._v(" have been changed to use the "),s("code",[t._v("admin")]),t._v(" user instead of requiring a new "),s("code",[t._v("bitcoin")]),t._v(" user. If the "),s("code",[t._v("admin")]),t._v(" user on your system is intended for running "),s("code",[t._v("BTCPayServer")]),t._v(" this is a reasonable choice. Otherwise consider creating a dedicated "),s("code",[t._v("bitcoin")]),t._v(" user.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" bitcoind.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Unit]\nDescription=Bitcoin daemon\nAfter=network.target\n\n[Service]\nExecStart=/usr/bin/bitcoind -daemon \\\n -pid=/run/bitcoind/bitcoind.pid \\\n -conf=/etc/bitcoin/bitcoin.conf \\\n -datadir=/var/lib/bitcoind\n\n# Make sure the config directory is readable by the service user\nPermissionsStartOnly=true\nExecStartPre=/bin/chgrp admin /etc/bitcoin\n\n# Process management\n####################\n\nType=forking\nPIDFile=/run/bitcoind/bitcoind.pid\nRestart=on-failure\nTimeoutStopSec=600\n\n# Run as admin:admin\nUser=admin\nGroup=admin\n\n# /run/bitcoind\nRuntimeDirectory=bitcoind\nRuntimeDirectoryMode=0710\n\n# /etc/bitcoin\nConfigurationDirectory=bitcoin\nConfigurationDirectoryMode=0710\n\n# /var/lib/bitcoind\nStateDirectory=bitcoind\nStateDirectoryMode=0710\n\n# Hardening measures\n####################\n# Provide a private /tmp and /var/tmp.\nPrivateTmp=true\n\n# Deny access to /home, /root and /run/user\nProtectHome=true\n\n# Mount /usr, /boot/ and /etc read-only for the process.\nProtectSystem=full\n\n# Disallow the process and all of its children to gain\n# new privileges through execve().\nNoNewPrivileges=true\n\n# Use a new /dev namespace only populated with API pseudo devices\n# such as /dev/null, /dev/zero and /dev/random.\nPrivateDevices=true\n\n# Deny the creation of writable and executable memory mappings.\nMemoryDenyWriteExecute=true\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("p",[t._v("Once the service file is ready complete the commands below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" bitcoind.service /etc/systemd/system\n~$ "),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" bitcoind\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status bitcoind\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("26")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(":51:52 ubuntu systemd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[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(": Started Bitcoin daemon.\n")])])]),s("p",[t._v("If the start attempt shows an error message check the log using:")]),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" bitcoind\n")])])]),s("h5",{attrs:{id:"6-create-a-symbolic-link-to-the-bitcoind-cookie-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#6-create-a-symbolic-link-to-the-bitcoind-cookie-file"}},[t._v("#")]),t._v(" 6. Create a symbolic link to the bitcoind cookie file")]),t._v(" "),s("p",[t._v("The "),s("code",[t._v("bitcoin-cli")]),t._v(" client needs to authenticate to "),s("code",[t._v("bitcoind")]),t._v(" for RPC calls. The easiest way to allow this is to create a symbolic link to the cookie file.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" /var/lib/bitcoind/.cookie .bitcoin/.cookie\n")])])]),s("p",[t._v("It's not vital to perform this step but if not done then every "),s("code",[t._v("bitcoin-cli")]),t._v(" command needs to specify the path to the cookie file as below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ bitcoin-cli "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-rpccookiefile")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/var/lib/bitcoind/.cookie getblockchaininfo\n")])])]),s("h5",{attrs:{id:"check-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-4"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("p",[t._v("It will take Bitcoin anywhere from a few hours to a few days to synchronise the blockchain. Use any or all of the commands below to check its status.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl status bitcoind\nActive: active "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("running"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(" since Sun "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-26 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(":51:52 IST"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" 2min 47s ago\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tail")]),t._v(" /var/lib/bitcoind/debug.log "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-f")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-26T20:55:09Z UpdateTip: new "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("best")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("0000000000000361c37dfb6fa905ef967b95411fa96f7dcb4eca5dd4434d9e59 "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("height")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("126732")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("version")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("0x00000001 "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("log2_work")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("62.952182")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("tx")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("560114")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("date")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'2011-05-25T21:26:08Z'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("progress")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.001018")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("cache")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("43")]),t._v(".6MiB"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("291168txo"),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("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ bitcoin-cli getblockchaininfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"chain"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"main"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"blocks"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("133015")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"headers"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("640929")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"bestblockhash"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0000000000000e81b67de8d61eab726f40585bed954b1dd59f86ab10e4e55398"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"difficulty"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("876954.4935135372")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mediantime"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1308897947")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"verificationprogress"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.001530462018729556")]),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("When the "),s("code",[t._v("verificationprogress")]),t._v(" gets to either "),s("code",[t._v("0.99..")]),t._v(" or "),s("code",[t._v("1.0")]),t._v(" your node has synchronised. To double check you can also use a public block explorer such as "),s("a",{attrs:{href:"https://blockstream.info/",target:"_blank",rel:"noopener noreferrer"}},[t._v("https://blockstream.info/"),s("OutboundLink")],1),t._v(" to view the latest "),s("code",[t._v("Bitcoin")]),t._v(" block and compare it to the "),s("code",[t._v("blocks")]),t._v(" value from the "),s("code",[t._v("bitcoin-cli getblockchaininfo")]),t._v(" result.")]),t._v(" "),s("h5",{attrs:{id:"check-tor-and-bitcoin"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-tor-and-bitcoin"}},[t._v("#")]),t._v(" Check Tor and Bitcoin")]),t._v(" "),s("p",[t._v("If Tor was installed prior to the Bitcoin Daemon then it should have automatically registered and begun listening on a torv2 onion address (note support for torv3 onion addresses is in the "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/issues/18884",target:"_blank",rel:"noopener noreferrer"}},[t._v("pipeline"),s("OutboundLink")],1),t._v(").")]),t._v(" "),s("p",[t._v("The easiest way to get your Bitcoin Daemon torv2 address is using "),s("code",[t._v("bitcoin-cli")]),t._v(":")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("bitcoin-cli getnetworkinfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("200100")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"subversion"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/Satoshi:0.20.1/"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"protocolversion"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("70015")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"localservices"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0000000000000409"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"localaddresses"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[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 string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"192.168.11.4"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"port"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"score"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),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 string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"v5j6hfz4xafmeckf.onion"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"port"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"score"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("156")]),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 string"}},[t._v('"warnings"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('""')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),s("p",[t._v("An alternative approach is to search the Bitcoin daemon log file:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /var/lib/bitcoind/debug.log "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" onion\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-05-23T18:24:22Z tor: Got "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("service")]),t._v(" ID 4d4al7v4hj5p7bb6, advertising "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("service")]),t._v(" 4d4al7v4hj5p7bb6.onion:8333\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2019")]),t._v("-05-23T18:24:22Z AddLocal"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("4d4al7v4hj5p7bb6.onion:8333,4"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("If there is a problem and no onion address can be found in the log file then check for Tor related error messages:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cat")]),t._v(" /var/lib/bitcoind/debug.log "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" tor\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27T08:03:28Z torcontrol thread start\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27T08:03:28Z tor: Authentication cookie /run/tor/control.authcookie could not be opened "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("check permissions"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("The above error message can occur if the user accounts running the Bitcoin service does not have read access to the Tor authentication cookie file, "),s("a",{attrs:{href:"https://github.com/bitcoin/bitcoin/blob/master/doc/tor.md#3-automatically-listen-on-tor",target:"_blank",rel:"noopener noreferrer"}},[t._v("more info"),s("OutboundLink")],1),t._v(". To fix this particular error add the required user account to the "),s("code",[t._v("debian-tor")]),t._v(" group.")]),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("usermod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-a")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-G")]),t._v(" debian-tor admin\n")])])]),s("p",[t._v("To change your onion address:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" /var/lib/bitcoind/onion_private_key\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart bitcoind\n~$ bitcoin-cli getnetworkinfo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" onion\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"name"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"onion"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"qud5iwbntqxlfwjv.onion"')]),t._v(",\n")])])]),s("p",[t._v("To check your onion address from a remote host with tor installed:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ torsocks "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--shell")]),t._v("\n~$ telnet 4d4al7v4hj5p7bb6.onion "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8333")]),t._v("\n Trying "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.42")]),t._v(".42.0"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n Connected to "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("127.42")]),t._v(".42.0.\n Escape character is "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'^]'")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(".")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("exit")]),t._v("\n")])])]),s("p",[t._v("To connect another "),s("code",[t._v("bitcoind")]),t._v(" instance to your new node:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ bitcoin-cli addnode "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4d4al7v4hj5p7bb6.onion"')]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"add"')]),t._v("\n~$ bitcoin-cli getaddednodeinfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"addednode"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4d4al7v4hj5p7bb6.onion"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"connected"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" true,\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"addresses"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[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 string"}},[t._v('"address"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"4d4al7v4hj5p7bb6.onion:8333"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"connected"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"outbound"')]),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:"nbxplorer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#nbxplorer"}},[t._v("#")]),t._v(" NBXplorer")]),t._v(" "),s("p",[s("strong",[t._v("NBXplorer")]),t._v(" is a dotnet core application that monitors the Bitcoin blockchain for transactions of interest to your BTCPay Server.")]),t._v(" "),s("h5",{attrs:{id:"install-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-5"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-install-net-80-sdk"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-net-80-sdk"}},[t._v("#")]),t._v(" 1. Install .NET 8.0 SDK")]),t._v(" "),s("p",[s("a",{attrs:{href:"https://docs.microsoft.com/en-us/dotnet/core/install/linux-ubuntu#2004-",target:"_blank",rel:"noopener noreferrer"}},[t._v("Follow the install instuctions"),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("# Add Microsoft package repository")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-O")]),t._v(" packages-microsoft-prod.deb\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" dpkg "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-i")]),t._v(" packages-microsoft-prod.deb\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("rm")]),t._v(" packages-microsoft-prod.deb\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Install the SDK")]),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("apt-get")]),t._v(" update\n"),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" apt-transport-https\n"),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(" update\n"),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-y")]),t._v(" dotnet-sdk-8.0\n\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("## Check")]),t._v("\ndotnet "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\n")])])]),s("h5",{attrs:{id:"2-build-nbxplorer"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-build-nbxplorer"}},[t._v("#")]),t._v(" 2. Build NBXplorer")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n~/src$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/dgarage/NBXplorer\n~/src$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" NBXplorer\n~/src/NBXplorer$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\./)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),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("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n~/src/NBXplorer$ ./build.sh\n")])])]),s("h5",{attrs:{id:"3-create-postgresql-database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-postgresql-database"}},[t._v("#")]),t._v(" 3. Create Postgresql Database")]),t._v(" "),s("p",[t._v("While NBXplorer support storing data in a local database via "),s("code",[t._v("--dbtrie")]),t._v(", this is deprecated. Here how to create the appropriate database and user for NBXlporer in "),s("strong",[t._v("Postgresql")]),t._v(".")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\n")])])]),s("p",[t._v("Then execute")]),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 keyword"}},[t._v("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" nbxplorer TEMPLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'template0'")]),t._v(" LC_CTYPE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" LC_COLLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" ENCODING "),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("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("USER")]),t._v(" nbxplorer "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WITH")]),t._v(" ENCRYPTED PASSWORD "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'urpassword'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("GRANT")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ALL")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIVILEGES")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ON")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" nbxplorer "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TO")]),t._v(" nbxplorer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Exit")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("postgres=#\\q\n")])])]),s("h5",{attrs:{id:"4-create-a-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-configuration-file"}},[t._v("#")]),t._v(" 4. Create a configuration file")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" nbxplorer.config\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("### Database ###\npostgres=User ID=nbxplorer;Password=urpassword;Application Name=nbxplorer;MaxPoolSize=20;Host=localhost;Port=5432;Database=nbxplorer;\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" /etc/nbxplorer\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" nbxplorer.config /etc/nbxplorer\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/nbxplorer/nbxplorer.config\n")])])]),s("p",[t._v("Note: If you previously used a "),s("code",[t._v("dbtrie")]),t._v(" backend for NBXplorer, but want to switch to postgres, "),s("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/docs/Postgres-Migration.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("read this documentation"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h5",{attrs:{id:"5-create-a-systemd-service-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#5-create-a-systemd-service-2"}},[t._v("#")]),t._v(" 5. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is shown below. Adjust the paths, User and Group accordingly.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" nbxplorer.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Unit]\nDescription=NBXplorer daemon\nRequires=bitcoind.service\nAfter=bitcoind.service\n\n[Service]\nWorkingDirectory=/home/admin/src/NBXplorer\nExecStart=/home/admin/src/NBXplorer/run.sh --conf=/etc/nbxplorer/nbxplorer.config\nUser=admin\nGroup=admin\nType=simple\nPIDFile=/run/nbxplorer/nbxplorer.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" nbxplorer.service /etc/systemd/system\n~$ "),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" nbxplorer\n")])])]),s("h5",{attrs:{id:"check-5"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-5"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" nbxplorer "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":13:35 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Data Directory: /home/admin/.nbxplorer/Main\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":13:35 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Configuration File: /home/admin/.nbxplorer/Main/settings.config\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":13:35 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Network: Mainnet\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(":20:04 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8065")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Events: BTC: New block 0000000000000000000c405ba5df5f5533359a4393247a0c52d26c458d4dd989 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("577449")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v("\n")])])]),s("p",[t._v("If it doesn't start correctly stop the service and run the application directly to get any error messages.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop nbxplorer\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ./src/NBXplorer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" ./run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),t._v("\n")])])]),s("h5",{attrs:{id:"update"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),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("# Stop the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop nbxplorer\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Checkout and build latest tag")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/NBXplorer"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" fetch "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--tags")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\./)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),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("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" ./build.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Restart the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start nbxplorer\n")])])]),s("h5",{attrs:{id:"migration"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#migration"}},[t._v("#")]),t._v(" Migration")]),t._v(" "),s("p",[t._v("With BTCPay Server v1.5 we "),s("a",{attrs:{href:"https://blog.btcpayserver.org/nbxplorer-postgres/",target:"_blank",rel:"noopener noreferrer"}},[t._v("improved NBXplorer by switching to Postgres"),s("OutboundLink")],1),t._v(".\nIf you are still using the DBTrie based version, please consider "),s("a",{attrs:{href:"https://github.com/dgarage/NBXplorer/blob/master/docs/Postgres-Migration.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("migrating NBXplorer"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("p",[t._v("Afterwards you need to set "),s("code",[t._v("BTCPAY_EXPLORERPOSTGRES")]),t._v(" to the same connection string as NBXplorer.")]),t._v(" "),s("h2",{attrs:{id:"btcpay-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server"}},[t._v("#")]),t._v(" BTCPay Server")]),t._v(" "),s("p",[t._v("Like NBXplorer the BTCPay Server application is also .NET Core. The install steps assume .NET Core was previosuly installed.")]),t._v(" "),s("h5",{attrs:{id:"install-6"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-6"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-build-btcpay-server"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-build-btcpay-server"}},[t._v("#")]),t._v(" 1. Build BTCPay Server")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Clone the repository")]),t._v("\n~/src$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/btcpayserver/btcpayserver.git\n~/src$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" btcpayserver\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Checkout latest tag")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\.[0-9]+\\.[0-9]+$/)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),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("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Build the app")]),t._v("\n~/src/btcpayserver$ ./build.sh\n")])])]),s("h5",{attrs:{id:"2-create-postgresql-database"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-create-postgresql-database"}},[t._v("#")]),t._v(" 2. Create Postgresql Database")]),t._v(" "),s("p",[t._v("By default BTCPay Server will store data in a single SQLite file. A more robust option is to use "),s("strong",[t._v("Postgresql")]),t._v(" which requires the appropriate database and user to exist.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\n")])])]),s("p",[t._v("Then execute")]),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 keyword"}},[t._v("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" btcpay TEMPLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'template0'")]),t._v(" LC_CTYPE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" LC_COLLATE "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'C'")]),t._v(" ENCODING "),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("CREATE")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("USER")]),t._v(" btcpay "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("WITH")]),t._v(" ENCRYPTED PASSWORD "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'urpassword'")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("GRANT")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ALL")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("PRIVILEGES")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("ON")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("DATABASE")]),t._v(" btcpay "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("TO")]),t._v(" btcpay"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("Exit")]),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 assign-left variable"}},[t._v("postgres")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("#\\q")]),t._v("\n")])])]),s("h5",{attrs:{id:"3-create-a-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-a-configuration-file"}},[t._v("#")]),t._v(" 3. Create a configuration file")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" btcpay.config\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("### Database ###\npostgres=User ID=btcpay;Password=urpassword;Application Name=btcpayserver;Host=localhost;Port=5432;Database=btcpay;\nexplorer.postgres=User ID=nbxplorer;Password=urpassword;Application Name=nbxplorer;MaxPoolSize=20;Host=localhost;Port=5432;Database=nbxplorer;\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" /etc/btcpay\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" btcpay.config /etc/btcpay\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/btcpay/btcpay.config\n")])])]),s("h5",{attrs:{id:"4-create-a-systemd-service"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-systemd-service"}},[t._v("#")]),t._v(" 4. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is shown below. Adjust the paths, User and Group accordingly.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" btcpay.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('[Unit]\nDescription=BTCPay Server\nRequires=nbxplorer.service\nAfter=nbxplorer.service\n\n[Service]\nWorkingDirectory=/home/admin/src/btcpayserver\nEnvironment=BTCPAY_BTCEXTERNALRTL="server=https://mainnet.demo.btcpayserver.org/rtl;cookiefile=/var/lib/rtl/.cookie"\nExecStart=/home/admin/src/btcpayserver/run.sh --conf=/etc/btcpay/btcpay.config\nUser=admin\nGroup=admin\nType=simple\nPIDFile=/run/btcpayserver/btcpayserver.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n')])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" btcpay.service /etc/systemd/system\n~$ "),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" btcpay\n")])])]),s("h5",{attrs:{id:"check-6"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-6"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" btcpay "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n-- The start-up result is RESULT.\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":01:25 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10263")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Data Directory: /home/admin/.btcpayserver/Main\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":01:25 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10263")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Configuration File: /etc/btcpay/btcpay.config\nMay "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(":01:25 btc run.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10263")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": info: Configuration: Network: Mainnet\n")])])]),s("p",[t._v("If it doesn't start correctly stop the service and run the application directly to get any error messages.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop btcpay\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/btcpayserver"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" ./run.sh "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--conf")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/etc/btcpay/btcpay.config"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n")])])]),s("p",[t._v("An example of checking information in the database.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-u")]),t._v(" postgres psql\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("postgres")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\connect btcpay;")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("btcpay")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\dt")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("btcpay")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v('# select * from "Invoices";')]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("btcpay")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# \\q")]),t._v("\n")])])]),s("p",[t._v('Attempting to open your BTCPay Server domain in a browser now should show the "Welcome to your BTCPay Server" page.\nIf you are not using a Lightning Node this is the end of the install.')]),t._v(" "),s("h5",{attrs:{id:"update-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-2"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),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("# Stop the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop btcpay\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Checkout and build latest tag")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/btcpayserver"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" fetch "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--tags")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" checkout "),s("span",{pre:!0,attrs:{class:"token variable"}},[s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$(")]),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" tag "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--sort")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-version:refname")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("awk")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v("'match($0, /^v[0-9]+\\.[0-9]+\\.[0-9]+$/)'")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("head")]),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("1")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v(")")])]),t._v(" "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("&&")]),t._v(" ./build.sh"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# Restart the service")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start btcpay\n")])])]),s("h2",{attrs:{id:"lightning-network-daemon-lnd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#lightning-network-daemon-lnd"}},[t._v("#")]),t._v(" Lightning Network Daemon (LND)")]),t._v(" "),s("h5",{attrs:{id:"install-7"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-7"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("p",[t._v("Full "),s("a",{attrs:{href:"https://github.com/lightningnetwork/lnd/blob/master/docs/INSTALL.md",target:"_blank",rel:"noopener noreferrer"}},[t._v("instructions"),s("OutboundLink")],1),t._v(".")]),t._v(" "),s("h5",{attrs:{id:"1-install-go"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-go"}},[t._v("#")]),t._v(" 1. Install Go")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("wget")]),t._v(" https://dl.google.com/go/go1.13.linux-amd64.tar.gz\n~$ sha256sum go1.13.linux-amd64.tar.gz\n68a2297eb099d1a76097905a2ce334e3155004ec08cdea85f24527be3c48e856 go1.13.linux-amd64.tar.gz\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("tar")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-C")]),t._v(" /usr/local "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-xzf")]),t._v(" go1.13.linux-amd64.tar.gz\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),t._v(":/usr/local/go/bin\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("GOPATH")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=~")]),t._v("/gocode\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin\n~$ go version\ngo version go1.13 linux/amd64\n")])])]),s("h5",{attrs:{id:"2-build-and-install-lnd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-build-and-install-lnd"}},[t._v("#")]),t._v(" 2. Build and install LND")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" src"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" src\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/lightningnetwork/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# installs to a directory in $GOPATH/bin")]),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("cp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lnd "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lncli /usr/bin\n~$ lnd "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\nlnd version "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.10")]),t._v(".99-beta "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("commit")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("clock/v1.0.0-229-ge64e71d86dc1ac716c30a80f85a22e8fb544697f\n")])])]),s("h5",{attrs:{id:"3-create-a-symbolic-link-to-the-bitcoin-configuration-file"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-a-symbolic-link-to-the-bitcoin-configuration-file"}},[t._v("#")]),t._v(" 3. Create a symbolic link to the Bitcoin configuration file")]),t._v(" "),s("p",[t._v("lnd looks for bitcoin.conf in a specific location to get necessary RPC and zeromq details.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" ~/.bitcoin/bitcoin.conf /etc/bitcoin/bitcoin.conf\n")])])]),s("h5",{attrs:{id:"4-create-a-configuration-file-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-configuration-file-2"}},[t._v("#")]),t._v(" 4. Create a configuration file")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" lnd.conf\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Application Options]\ndatadir=/var/lib/lnd/data\ntlscertpath=/var/lib/lnd/tls.cert\ntlskeypath=/var/lib/lnd/tls.key\nlogdir=/var/lib/lnd/logs\nmaxlogfiles=3\nmaxlogfilesize=10\n#externalip=1.1.1.1 # change to your public IP address if required.\nalias=i_luv_btcpay\nlisten=0.0.0.0:9735\n\n[Bitcoin]\nbitcoin.active=1\nbitcoin.node=bitcoind\nbitcoin.mainnet=true\n\n[tor]\ntor.active=true\ntor.v3=true\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /etc/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /var/lib/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chown")]),t._v(" admin:admin "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-R")]),t._v(" /var/lib/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" lnd.conf /etc/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /etc/lnd/lnd.conf\n")])])]),s("h5",{attrs:{id:"5-create-a-systemd-service-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#5-create-a-systemd-service-3"}},[t._v("#")]),t._v(" 5. Create a systemd service")]),t._v(" "),s("p",[t._v("An example "),s("strong",[t._v("systemd service")]),t._v(" file is shown below. Adjust the paths, User and Group accordingly.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" lnd.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("[Unit]\nDescription=LND Lightning Network Daemon\nRequires=bitcoind.service\nAfter=bitcoind.service\n\n[Service]\nExecStart=/usr/bin/lnd --configfile=/etc/lnd/lnd.conf\nExecStop=/usr/bin/lncli --lnddir /var/lib/lnd stop\nPIDFile= /run/lnd/lnd.pid\n\nUser=admin\nGroup=admin\n\nType=simple\nKillMode=process\nTimeoutStartSec=60\nTimeoutStopSec=60\nRestart=always\nRestartSec=60\n\n[Install]\nWantedBy=multi-user.target\n")])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" lnd.service /etc/systemd/system\n~$ "),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" lnd\n")])])]),s("h5",{attrs:{id:"configuration-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#configuration-4"}},[t._v("#")]),t._v(" Configuration")]),t._v(" "),s("div",{staticClass:"custom-block danger"},[s("p",{staticClass:"custom-block-title"},[t._v("DANGER")]),t._v(" "),s("p",[s("strong",[t._v("Running a Bitcoin Lightning daemon requires a hot wallet on your BTCPay Server.")])])]),t._v(" "),s("p",[t._v("With Bitcoin the protocol has evolved and deterministic key derivation means the keys for your wallet can be kept in a different location to the BTCPay Server. Lightning daemons do not have this facility. Any Bitcoins committed or received in your lightning channels are controlled by private keys that are on your BTCPay Server.")]),t._v(" "),s("h5",{attrs:{id:"1-create-a-symbolic-link-to-the-lnd-data-directory"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-create-a-symbolic-link-to-the-lnd-data-directory"}},[t._v("#")]),t._v(" 1. Create a symbolic link to the lnd data directory")]),t._v(" "),s("p",[t._v("The install steps above use "),s("code",[t._v("/var/lib/lnd")]),t._v(" as the data directory rather than the default "),s("code",[t._v("/home/user/.lnd")]),t._v(". In order to save typing when using the "),s("code",[t._v("lncli")]),t._v(" client it's useful to add a symbolic directory link.")]),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("ln")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-s")]),t._v(" /var/lib/lnd .lnd\n")])])]),s("h5",{attrs:{id:"2-create-lightning-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-create-lightning-wallet"}},[t._v("#")]),t._v(" 2. Create Lightning wallet")]),t._v(" "),s("p",[t._v("The first time the lnd is started a new wallet must be created and the backup seed safely recorded (if someone else gets your seed they can steal your funds so keep it safe).")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli create\nInput wallet password:\nConfirm password:\n\nDo you have an existing cipher seed mnemonic you want to use? "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("Enter y/n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(": n\n\nYour cipher seed can optionally be encrypted.\nInput your passphrase "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("if")]),t._v(" you wish to encrypt it "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("(")]),t._v("or press enter to proceed without a cipher seed passphrase"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(")")]),t._v(":\n\nGenerating fresh cipher seed"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\n\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET"),s("span",{pre:!0,attrs:{class:"token operator"}},[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---------------BEGIN LND CIPHER SEED---------------\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),t._v(". above "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2")]),t._v(". catch "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("3")]),t._v(". start "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("4")]),t._v(". tape\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("5")]),t._v(". sound "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("6")]),t._v(". friend "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("7")]),t._v(". water "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("8")]),t._v(". royal\n "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("9")]),t._v(". solid "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("10")]),t._v(". poet "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("11")]),t._v(". wisdom "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("12")]),t._v(". match\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("13")]),t._v(". virtual "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("14")]),t._v(". zero "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(". slender "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("16")]),t._v(". thrive\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("17")]),t._v(". idle "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(". catch "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("19")]),t._v(". robot "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("20")]),t._v(". clay\n"),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("21")]),t._v(". resemble "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("22")]),t._v(". angry "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("23")]),t._v(". work "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("24")]),t._v(". "),s("span",{pre:!0,attrs:{class:"token keyword"}},[t._v("until")]),t._v("\n---------------END LND CIPHER SEED-----------------\n\n"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("YOU MUST WRITE DOWN THIS SEED TO BE ABLE TO RESTORE THE WALLET"),s("span",{pre:!0,attrs:{class:"token operator"}},[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\nlnd successfully initialized"),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("!")]),t._v("\n")])])]),s("p",[t._v("Note that if the symbolic directory link from the previous step "),s("strong",[t._v("was not")]),t._v(" created the command is:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("lncli "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--lnddir")]),t._v(" /var/lib/lnd create\n")])])]),s("h5",{attrs:{id:"3-unlock-the-wallet"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-unlock-the-wallet"}},[t._v("#")]),t._v(" 3. Unlock the wallet")]),t._v(" "),s("p",[t._v("Every time lnd is restarted the wallet "),s("strong",[t._v("needs to be unlocked")]),t._v(". This is not ideal for a BTCPay Server that can is designed to run unattended but Lighting is still in its infancy.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli unlock\n")])])]),s("h5",{attrs:{id:"check-7"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-7"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli getinfo\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("{")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"version"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"0.10.99-beta commit=clock/v1.0.0-229-ge64e71d86dc1ac716c30a80f85a22e8fb544697f"')]),t._v(",\n "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"commit_hash"')]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"e64e71d86dc1ac716c30a80f85a22e8fb544697f"')]),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("Check the service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" lnd "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":46:29 ubuntu lnd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("654474")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":46:29.909 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("INF"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" DISC: Attempting to bootstrap with: BOLT-0010 DNS Seed: "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("nodes.lightning.directory soa.nodes.lightning.directory"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("lseed.bitcoinstats.com "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v("\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41 ubuntu lnd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("654474")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41.939 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("INF"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" DISC: Attempting to bootstrap with: Authenticated Channel Graph\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41 ubuntu lnd"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("654474")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("2020")]),t._v("-07-27 "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("15")]),t._v(":49:41.940 "),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),t._v("ERR"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(" SRVR: Unable to retrieve initial bootstrap peers: no addresses found\n")])])]),s("p",[t._v("The "),s("strong",[t._v("Lightning Node Connection String")]),t._v(" to use with "),s("code",[t._v("BTCPay Server")]),t._v(" is:")]),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 assign-left variable"}},[t._v("type")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("lnd-rest"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("server")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("https://127.0.0.1:8080/"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("macaroonfilepath")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/home/admin/.lnd/data/chain/bitcoin/mainnet/admin.macaroon"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("allowinsecure")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("true\n")])])]),s("h5",{attrs:{id:"add-lnd-as-internal-node"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#add-lnd-as-internal-node"}},[t._v("#")]),t._v(" Add LND as internal node")]),t._v(" "),s("p",[t._v("To add LND as internal node you have to edit the "),s("a",{attrs:{href:"#3-create-a-configuration-file"}},[t._v("btcpay.config file")]),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 builtin class-name"}},[t._v("cd")]),t._v(" /etc/btcpay\n"),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" btcpay.config\n")])])]),s("p",[t._v("Right below the database part, add the "),s("code",[t._v("BTC.lightning")]),t._v(" setting:")]),t._v(" "),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v("### Lightning ###\nBTC.lightning=type=lnd-rest;server=https://127.0.0.1:8080/;macaroonfilepath=/home/admin/.lnd/data/chain/bitcoin/mainnet/admin.macaroon;allowinsecure=true\n")])])]),s("p",[t._v('See the "Use custom node" view on the Lightning node connection setting screen in BTCPay Server for details on the connection string.')]),t._v(" "),s("p",[t._v("You need to restart BTCPay Server for the settings update to take effect:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl restart btcpay\n")])])]),s("h5",{attrs:{id:"check-tor-and-lnd"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-tor-and-lnd"}},[t._v("#")]),t._v(" Check Tor and LND")]),t._v(" "),s("p",[t._v("As with the Bitcoin daemon if Tor is installed and the configuration file enables it (the one above does) then "),s("code",[t._v("lnd")]),t._v(" will automatically register an onion address. In lnd's case torv3 addresses are supported.")]),t._v(" "),s("p",[t._v("The torv3 onion address below is a lot longer than the torv2 one from the Bitcoin daemon section (16 characters compared to 56 characters).")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli getinfo "),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("|")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("grep")]),t._v(" onion\n"),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"029b0e3c05595074afcffdca0fb22fb68a95a9c4698dd20962f647de4891eceabd@liyuvwbbycrvvuzcrsd5rq7svwckabejlsymcxiwzkj3smvlwcsqpjyd.onion:9735"')]),t._v("\n")])])]),s("p",[t._v("The Tor address created by lnd can be used to connect to other Lighting peers on the Tor network. The Tor address can work in parallel with an IPv4 or IPv6 address. To register one of those make sure the "),s("code",[t._v("externalip")]),t._v(" is set in the lnd configuration file.")]),t._v(" "),s("h5",{attrs:{id:"update-3"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-3"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),t._v(":/usr/local/go/bin\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("GOPATH")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=~")]),t._v("/gocode\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("PATH")])]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),s("span",{pre:!0,attrs:{class:"token environment constant"}},[t._v("$PATH")]),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v(":")]),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/src/lnd\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" pull\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("make")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token comment"}},[t._v("# installs to a directory in $GOPATH/bin")]),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("cp")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lnd "),s("span",{pre:!0,attrs:{class:"token variable"}},[t._v("$GOPATH")]),t._v("/bin/lncli /usr/bin\n~$ lnd "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--version")]),t._v("\nlnd version "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.10")]),t._v(".99-beta "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("commit")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("clock/v1.0.0-229-ge64e71d86dc1ac716c30a80f85a22e8fb544697f\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start lnd\n")])])]),s("p",[t._v("After the daemon has been restarted the wallet needs to be unlocked:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ lncli unlock\n")])])]),s("p",[t._v("If "),s("code",[t._v("Ride The Lightning (RTL)")]),t._v(" is installed, see next section, it may have stopped when lnd disappeared so it will also need to be restarted.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start rtl\n")])])]),s("h2",{attrs:{id:"ride-the-lightning-rtl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#ride-the-lightning-rtl"}},[t._v("#")]),t._v(" Ride The Lightning (RTL)")]),t._v(" "),s("p",[s("strong",[t._v("Ride the Lightning")]),t._v(" is a Node.js application to manage your Lightning peers, channels, wallet etc.")]),t._v(" "),s("p",[t._v("The advantage of the work that has gone into BTCPay Server is that the RTL web page can be controlled and accessed in the same manner as the BTCPay site.")]),t._v(" "),s("h5",{attrs:{id:"install-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#install-8"}},[t._v("#")]),t._v(" Install")]),t._v(" "),s("h5",{attrs:{id:"1-install-dependencies"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#1-install-dependencies"}},[t._v("#")]),t._v(" 1. Install dependencies")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("apt")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" nodejs build-essential "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v("\n")])])]),s("h5",{attrs:{id:"2-build-rtl"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#2-build-rtl"}},[t._v("#")]),t._v(" 2. Build RTL")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~/src\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" clone https://github.com/Ride-The-Lightning/RTL.git\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" RTL\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--only")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("prod\n")])])]),s("h5",{attrs:{id:"3-create-a-configuration-file-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#3-create-a-configuration-file-2"}},[t._v("#")]),t._v(" 3. Create a configuration file")]),t._v(" "),s("p",[t._v("Copy the sample config file from "),s("code",[t._v("sample-RTL-Config.json")]),t._v(" and adjust accordingly. An example that works with the rest of the instructions in this document is shown below.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" src/RTL/sample-RTL-Config.json RTL-Config.json\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" RTL-Config.json\n")])])]),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('"port"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"3000"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"defaultNodeIndex"')]),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('"SSO"')]),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('"rtlSSO"')]),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('"rtlCookiePath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/var/lib/rtl/.cookie"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" # Needs to match the value in BTCPay systemd settings.\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"logoutRedirectLink"')]),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/login"')]),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('"nodes"')]),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('"index"')]),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('"lnNode"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Node 1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"lnImplementation"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"LND"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"Authentication"')]),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('"macaroonPath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/var/lib/lnd/data/chain/bitcoin/mainnet"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"configPath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/etc/lnd/lnd.conf"')]),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('"Settings"')]),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('"userPersona"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"MERCHANT"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"themeMode"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"DAY"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"themeColor"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"PURPLE"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"channelBackupPath"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"/home/admin/rtl/backup/node-1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"enableLogging"')]),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('"lnServerUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"https://localhost:8080/v1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"swapServerUrl"')]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token string"}},[t._v('"http://localhost:8081/v1"')]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v("\n "),s("span",{pre:!0,attrs:{class:"token property"}},[t._v('"fiatConversion"')]),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 "),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("Note that RTL has different behaviour and requirements compared to the other services documented in theses instructions, specifically:")]),t._v(" "),s("ol",[s("li",[t._v("The configuration file needs to exist in RTL's data directory,")]),t._v(" "),s("li",[t._v("The RTL process may write update to the configuration file.")])]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("mkdir")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-p")]),t._v(" /var/lib/rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" ~/RTL-Config.json /var/lib/rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chown")]),t._v(" admin:admin "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("-R")]),t._v(" /var/lib/rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("chmod")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("644")]),t._v(" /var/lib/rtl/RTL-Config.json\n")])])]),s("h5",{attrs:{id:"4-create-a-systemd-service-2"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#4-create-a-systemd-service-2"}},[t._v("#")]),t._v(" 4. Create a systemd service")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("vi")]),t._v(" rtl.service\n")])])]),s("div",{staticClass:"language- extra-class"},[s("pre",{pre:!0,attrs:{class:"language-text"}},[s("code",[t._v('[Unit]\nDescription=Ride The Lightning\nRequires=lnd.service\nAfter=lnd.service\n\n[Service]\nEnvironment="RTL_CONFIG_PATH=/var/lib/rtl"\nWorkingDirectory=/var/lib/rtl\nExecStart=/usr/bin/node /home/admin/src/RTL/rtl\nUser=admin\nGroup=admin\nType=simple\nPIDFile=/run/rtl/rtl.pid\nRestart=on-failure\n\n[Install]\nWantedBy=multi-user.target\n')])])]),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("cp")]),t._v(" rtl.service /etc/systemd/system\n~$ "),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(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--now")]),t._v(" rtl\n")])])]),s("h5",{attrs:{id:"check-8"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#check-8"}},[t._v("#")]),t._v(" Check")]),t._v(" "),s("p",[t._v("Check the service:")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),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("-xe")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--unit")]),t._v(" rtl "),s("span",{pre:!0,attrs:{class:"token parameter variable"}},[t._v("--follow")]),t._v("\n"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("..")]),t._v(".\nJul "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("27")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("18")]),t._v(":27:52 ubuntu node"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("[")]),s("span",{pre:!0,attrs:{class:"token number"}},[t._v("988638")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("]")]),t._v(": Server is up and running, please "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open")]),t._v(" the UI at http://localhost:3000\n")])])]),s("p",[t._v("If it doesn't start correctly stop the service and run the application directly to get any error messages.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("export")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token assign-left variable"}},[t._v("RTL_CONFIG_PATH")]),s("span",{pre:!0,attrs:{class:"token operator"}},[t._v("=")]),t._v("/var/lib/rtl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/RTL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("node")]),t._v(" rtl"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\nServer is up and running, please "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("open")]),t._v(" the UI at http://localhost:3000\n")])])]),s("p",[t._v("From the "),s("code",[t._v("BTCPay Server")]),t._v(" web page the "),s("code",[t._v("RTL")]),t._v(" interface should be accessible from "),s("code",[t._v("Server Settings->Services")]),t._v(' under the "Crypto services exposed by your server" heading.')]),t._v(" "),s("h5",{attrs:{id:"update-4"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#update-4"}},[t._v("#")]),t._v(" Update")]),t._v(" "),s("p",[t._v("Updating could break things. Be careful on a live system.")]),t._v(" "),s("div",{staticClass:"language-bash extra-class"},[s("pre",{pre:!0,attrs:{class:"language-bash"}},[s("code",[t._v("~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl stop rtl\n~$ "),s("span",{pre:!0,attrs:{class:"token builtin class-name"}},[t._v("cd")]),t._v(" ~"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("pushd")]),t._v(" ~/src/RTL"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("git")]),t._v(" pull"),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("npm")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("install")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v(" "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("popd")]),s("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(";")]),t._v("\n~$ "),s("span",{pre:!0,attrs:{class:"token function"}},[t._v("sudo")]),t._v(" systemctl start rtl\n")])])]),s("h2",{attrs:{id:"the-end"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#the-end"}},[t._v("#")]),t._v(" The End")]),t._v(" "),s("h3",{attrs:{id:"questions"}},[s("a",{staticClass:"header-anchor",attrs:{href:"#questions"}},[t._v("#")]),t._v(" Questions")]),t._v(" "),s("p",[t._v("Join the "),s("a",{attrs:{href:"https://chat.btcpayserver.org/",target:"_blank",rel:"noopener noreferrer"}},[t._v("community chat"),s("OutboundLink")],1),t._v(" on Mattermost by downloading "),s("a",{attrs:{href:"https://mattermost.com/download/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Mattermost app"),s("OutboundLink")],1),t._v(", or on "),s("a",{attrs:{href:"https://t.me/btcpayserver",target:"_blank",rel:"noopener noreferrer"}},[t._v("Telegram"),s("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);s.default=n.exports}}]); \ No newline at end of file diff --git a/assets/js/121.0b3c9f6d.js b/assets/js/121.cf62b7dd.js similarity index 99% rename from assets/js/121.0b3c9f6d.js rename to assets/js/121.cf62b7dd.js index 28faf8fe97..cbc89b681b 100644 --- a/assets/js/121.0b3c9f6d.js +++ b/assets/js/121.cf62b7dd.js @@ -1 +1 @@ -(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 +(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 diff --git a/assets/js/122.6f3a1eda.js b/assets/js/122.6634e499.js similarity index 99% rename from assets/js/122.6f3a1eda.js rename to assets/js/122.6634e499.js index a8a187b334..4e716ba31e 100644 --- a/assets/js/122.6f3a1eda.js +++ b/assets/js/122.6634e499.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[122],{807: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],{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 diff --git a/assets/js/123.1267bc5a.js b/assets/js/123.77c37c03.js similarity index 98% rename from assets/js/123.1267bc5a.js rename to assets/js/123.77c37c03.js index 91fcfb599f..37fe99edab 100644 --- a/assets/js/123.1267bc5a.js +++ b/assets/js/123.77c37c03.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[123],{809: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],{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 diff --git a/assets/js/14.fc1e0815.js b/assets/js/14.cfdc4e6b.js similarity index 89% rename from assets/js/14.fc1e0815.js rename to assets/js/14.cfdc4e6b.js index 6b306778b0..2b6de16240 100644 --- a/assets/js/14.fc1e0815.js +++ b/assets/js/14.cfdc4e6b.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"},660:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--01-install-web.4d28e0bd.png"},661:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--02-install-upload.8972740d.png"},662:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--03-enable-plugin.1b4a6c9f.png"},663:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--04-add-new-payment-method.e5a94ee3.png"},664:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--05-payment-method-details.adf89c97.png"},665:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--06-payment-method-configuration-tab.45617db0.png"},666:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--07-account-manage.d477b8b4.png"},667:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--08-add-api-key.a58b2941.png"},668:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--09-permissions-and-select-store.9ccef388.png"},669:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--10-permissions-set.74d76936.png"},670:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--11-copy-api-key.94be9878.png"},671:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--12-copy-store-id.84c19f9f.png"},672:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--13-save-vm-payment-method-form.0a3e52bd.png"},673:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--14-create-webhook.1b6e4881.png"},674:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--15-webhook-payload-url.37a4f55f.png"},675:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--16-webhook-copy-secret.71b0dd07.png"},676:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--16-virtuemart-configuration-save.ee549862.png"},677:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--17-webhook-save.dfd4fca5.png"},678:function(e,t,a){e.exports=a.p+"assets/img/btcpay-vm--18-troubleshoot-copy-callback-url.70d08e31.png"},899: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(660),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(661),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(662),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(663),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(664),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(665),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(666),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(667),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(668),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(669),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(670),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(671),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(672),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(673),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(674),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(675),alt:"BTCPay Joomla VirtueMart: Webhook payload URL",title:"BTCPay Joomla VirtueMart: Webhook payload URL"}}),e._v(" "),t("img",{attrs:{src:a(676),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(677),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(678),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"},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 diff --git a/assets/js/140.34d47a8c.js b/assets/js/140.f4d196c2.js similarity index 98% rename from assets/js/140.34d47a8c.js rename to assets/js/140.f4d196c2.js index f7a8872823..637113a3bc 100644 --- a/assets/js/140.34d47a8c.js +++ b/assets/js/140.f4d196c2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[140],{833: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],{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 diff --git a/assets/js/141.1a1ab3be.js b/assets/js/141.b8553449.js similarity index 99% rename from assets/js/141.1a1ab3be.js rename to assets/js/141.b8553449.js index 692bd4741b..742918e74a 100644 --- a/assets/js/141.1a1ab3be.js +++ b/assets/js/141.b8553449.js @@ -1 +1 @@ -(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 +(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 diff --git a/assets/js/148.bdbd287c.js b/assets/js/148.2d7f89ee.js similarity index 99% rename from assets/js/148.bdbd287c.js rename to assets/js/148.2d7f89ee.js index 09de673b14..008f489a02 100644 --- a/assets/js/148.bdbd287c.js +++ b/assets/js/148.2d7f89ee.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[148],{849: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-server-accept-bitcoin-payments-in-grandnode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-accept-bitcoin-payments-in-grandnode"}},[e._v("#")]),e._v(" BTCPay Server Accept Bitcoin payments in GrandNode")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/grandnode/main/GrandNodeAcceptBitcoin.png",alt:"BTCPay GrandNode Banner",title:"BTCPay GrandNode 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 GrandNode e-commerce store using BTCPay Server a free, self-hosted and open-source 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 through "),t("a",{attrs:{href:"https://github.com/btcpayserver/nopcommerce/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://grandnode.com/btcpay-server-accept-bitcoin-payments",target:"_blank",rel:"noopener noreferrer"}},[e._v("GrandNode Extension Marketplace"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("For installing the plugin on GrandNode, you can either upload the plugin directly to the "),t("code",[e._v("/plugins")]),e._v(" folder in your GrandNode main directory and restart your application, or use the Admin Panel to upload the plugin.")]),e._v(" "),t("p",[e._v("In the "),t("strong",[e._v("Admin Panel")]),e._v(", navigate to "),t("strong",[e._v("Plugins -> Local Plugins")]),e._v(" and click the "),t("strong",[e._v('"Upload"')]),e._v(' button. Ensure the plugin file is in ZIP for successful upload. After uploading, find the plugin in the list, click "Install" next to it, and enable it if needed.')]),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, depending on your preferences and requirements.")]),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 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 of your BTCPay Server')]),e._v(" "),t("li",[e._v("On the authorization page: Select the store you want to connect to your GrandNode (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 GrandNode')]),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 bottom to persist the configuration. Congrats, the configuration is now complete!')])]),e._v(" "),t("p",[t("em",[e._v("Note: given the architecture of GrandNode, 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 GrandNode, 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.")]),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 GrandNode, 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 GrandNode (step 1) into "),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 copy 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 GrandNode and paste the Secret Key into the "),t("code",[e._v("WebHook Secret")]),e._v(" field")]),e._v(" "),t("li",[e._v("Click save to apply all the changes")])]),e._v(" "),t("p",[e._v("Now your BTCPay Server is connected to your GranNode sucessfully.")]),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 experience a bug please "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpay-grandnode-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/grandnode/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=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[148],{850: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-server-accept-bitcoin-payments-in-grandnode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-server-accept-bitcoin-payments-in-grandnode"}},[e._v("#")]),e._v(" BTCPay Server Accept Bitcoin payments in GrandNode")]),e._v(" "),t("figure",[t("img",{attrs:{src:"https://raw.githubusercontent.com/btcpayserver/grandnode/main/GrandNodeAcceptBitcoin.png",alt:"BTCPay GrandNode Banner",title:"BTCPay GrandNode 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 GrandNode e-commerce store using BTCPay Server a free, self-hosted and open-source 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 through "),t("a",{attrs:{href:"https://github.com/btcpayserver/nopcommerce/releases",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub"),t("OutboundLink")],1),e._v(" or "),t("a",{attrs:{href:"https://grandnode.com/btcpay-server-accept-bitcoin-payments",target:"_blank",rel:"noopener noreferrer"}},[e._v("GrandNode Extension Marketplace"),t("OutboundLink")],1),e._v(".")]),e._v(" "),t("p",[e._v("For installing the plugin on GrandNode, you can either upload the plugin directly to the "),t("code",[e._v("/plugins")]),e._v(" folder in your GrandNode main directory and restart your application, or use the Admin Panel to upload the plugin.")]),e._v(" "),t("p",[e._v("In the "),t("strong",[e._v("Admin Panel")]),e._v(", navigate to "),t("strong",[e._v("Plugins -> Local Plugins")]),e._v(" and click the "),t("strong",[e._v('"Upload"')]),e._v(' button. Ensure the plugin file is in ZIP for successful upload. After uploading, find the plugin in the list, click "Install" next to it, and enable it if needed.')]),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, depending on your preferences and requirements.")]),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 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 of your BTCPay Server')]),e._v(" "),t("li",[e._v("On the authorization page: Select the store you want to connect to your GrandNode (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 GrandNode')]),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 bottom to persist the configuration. Congrats, the configuration is now complete!')])]),e._v(" "),t("p",[t("em",[e._v("Note: given the architecture of GrandNode, 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 GrandNode, 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.")]),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 GrandNode, 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 GrandNode (step 1) into "),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 copy 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 GrandNode and paste the Secret Key into the "),t("code",[e._v("WebHook Secret")]),e._v(" field")]),e._v(" "),t("li",[e._v("Click save to apply all the changes")])]),e._v(" "),t("p",[e._v("Now your BTCPay Server is connected to your GranNode sucessfully.")]),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 experience a bug please "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpay-grandnode-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/grandnode/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=o.exports}}]); \ No newline at end of file diff --git a/assets/js/152.fa684a77.js b/assets/js/152.a29cef95.js similarity index 98% rename from assets/js/152.fa684a77.js rename to assets/js/152.a29cef95.js index 7128f34851..202d047b31 100644 --- a/assets/js/152.fa684a77.js +++ b/assets/js/152.a29cef95.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[152],{862: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],{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 diff --git a/assets/js/157.3ff54313.js b/assets/js/157.cd5cf560.js similarity index 98% rename from assets/js/157.3ff54313.js rename to assets/js/157.cd5cf560.js index 697a2a311f..efd14f55eb 100644 --- a/assets/js/157.3ff54313.js +++ b/assets/js/157.cd5cf560.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[157],{872: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 +(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.e52a4150.js b/assets/js/158.5a547443.js similarity index 96% rename from assets/js/158.e52a4150.js rename to assets/js/158.5a547443.js index f4fb260f9a..26de88d93c 100644 --- a/assets/js/158.e52a4150.js +++ b/assets/js/158.5a547443.js @@ -1 +1 @@ -(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 +(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 diff --git a/assets/js/163.5a30c960.js b/assets/js/163.a18f8c13.js similarity index 98% rename from assets/js/163.5a30c960.js rename to assets/js/163.a18f8c13.js index c8c3f54297..ffbad19bc9 100644 --- a/assets/js/163.5a30c960.js +++ b/assets/js/163.a18f8c13.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[163],{887: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],{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 diff --git a/assets/js/164.895e7caa.js b/assets/js/164.86969602.js similarity index 97% rename from assets/js/164.895e7caa.js rename to assets/js/164.86969602.js index 013a77d23b..18af1096a5 100644 --- a/assets/js/164.895e7caa.js +++ b/assets/js/164.86969602.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[164],{885: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],{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 diff --git a/assets/js/165.b40b7cd4.js b/assets/js/165.25950d0a.js similarity index 98% rename from assets/js/165.b40b7cd4.js rename to assets/js/165.25950d0a.js index 91af4872ee..f5c16a9f3c 100644 --- a/assets/js/165.b40b7cd4.js +++ b/assets/js/165.25950d0a.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[165],{888: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],{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 diff --git a/assets/js/17.19402d73.js b/assets/js/17.aa77e5f2.js similarity index 99% rename from assets/js/17.19402d73.js rename to assets/js/17.aa77e5f2.js index e00b5c9b33..40d1373ba4 100644 --- a/assets/js/17.19402d73.js +++ b/assets/js/17.aa77e5f2.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"},902: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],{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 diff --git a/assets/js/171.94f9605c.js b/assets/js/171.712fd1e0.js similarity index 95% rename from assets/js/171.94f9605c.js rename to assets/js/171.712fd1e0.js index f1b24ed431..2aa625f66e 100644 --- a/assets/js/171.94f9605c.js +++ b/assets/js/171.712fd1e0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[171],{903: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],{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 diff --git a/assets/js/19.a0826f1f.js b/assets/js/19.34235057.js similarity index 99% rename from assets/js/19.a0826f1f.js rename to assets/js/19.34235057.js index 13dfd53732..62d581771c 100644 --- a/assets/js/19.a0826f1f.js +++ b/assets/js/19.34235057.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{631:function(A,e,t){A.exports=t.p+"assets/img/FrontPage.616c97f1.png"},632:function(A,e,t){A.exports=t.p+"assets/img/TicketApp.3fcd4bd4.png"},633:function(A,e){A.exports="data:image/png;base64,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"},634:function(A,e,t){A.exports=t.p+"assets/img/ExternalService_Setup.9c2a74c4.png"},635:function(A,e){A.exports="data:image/png;base64,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"},636:function(A,e,t){A.exports=t.p+"assets/img/SIN_PairingCode.cd005782.jpg"},637:function(A,e,t){A.exports=t.p+"assets/img/ExternalService_Add.f82f2998.png"},638:function(A,e){A.exports="data:image/png;base64,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"},639:function(A,e){A.exports="data:image/png;base64,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"},640:function(A,e){A.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+8AAAC7CAIAAACb7zgOAAAVsUlEQVR4AezWAYaDMRQGwL3/JR/i3eATAckCUP6iINWZU8zfAQAAvpPNfwgAAGweAACweQAAsPkk3V03AQAAujvJu80nGWPMOffe5w4AAMDee845xkjyuPnuXmud+wAAAGut7n7cfFUdAADgVlVl8wAAYPMAAIDNAwAANg8AADYPAADYPAAAYPMAAPDDbB4AAGweAACweQAAwOYBAMDmAQAAmwcAAGweAACweQAAsHkAAMDmAQAAmwcAAJt/9c/eGXg2snUB/G8pliyYgAFahSgSpanyWh6JxcQiUcT7sBJepHQEgyCUIARhWDVUlWeVygaNYCtUhEqWJWFJKYPQb86c9jS3t9d0vn1d+vX8BPvSyb13zr3hd0/O3PcynJtL794v7fderINe2Wv/ndm9Zf5/mNiGt2zS9vT2mfyw094y+GBPXtdtfutP5rdId/+9d8vl85fpiWEYhmEYtvnuftSzjZVa/5GsR0Cm88ezhTdnJzl4s/TFZZt/GoZtfnaUh6+G4UxewuZvxl8O8jtrOnShxzP7zuDm9k3DMAzDMGzz7mlpSRKmQSMJb76LChbSs0Dxd09mnJv/zfzst6z85q6jllp3dNosfIxXz1+zzbvjL81SZq3Wfc027/ZqCS2aqPZc2ebDzKz6NzE9tpFMbCR1DVqO4LbhzcIwDMMwbPOYcRfT8NPWh/dLq7EVzNmLir/TGnOlzW8Go62WWpwytMbXbPPo7u/M12vzMmTzYWZWzVWv/YO+uacFEPpU6/stwzAMwzBvuW5+2NgQ0vDo9yvFUk7wjOvjXe+yWLXPdfO/HbZ5tnnlpONXkmEYhmGYN/wU7EUt5ilFojFcrL0pnPbB8ilnP++AXmtmdy7a/JVT+GMZKnD07YI9dBdLDq5Oqx/v6wGWk5lqZwKfVTCftqvZmA77Cv2P0vH3Dtk8XdBtlrBiGIoNUqVW//rJSof239HHyuh2IIu5WrvAAUx6jWLK6wuLj3eK9sXs0S7CaP0I2FdgEKj0CLv5UoQ2c0f3A+vXHn7f+NFpFLOJ5Sh0qi1vFm2qeJaDGVneLhyNFzWdXvJI8OMLL7p3d/RPLbMODUJU17PVs6k6/tcXjpmh8H60Rw8O3jnIb+va40ZItUez3sHHuIaV3Af9xTUw69t4R/ingdLm0XrphVMgdwGhS4sLyb10yvgnWhVK3AHdI8274NzuwC5t6tDU3QTd9Bv5balfuLFDC+vXMVy19kSaTbXNq2dWvT5lfp7kYFWbXfeWYZg3DMMwbPNopcJze1GUeM/yMWdPYrpUPHWFnKKR1pfTRau8m/SVMeb50J03nZsxX3Q282bFKqV9i42s19GnJaaHhq+5+nZuzyp7/rQWjy36zXzcMvwWlo2CBRegvf118oS6uWeliJjvxP3JCuYwv9tpFFOjVLHM3Ba63afjn+FsHtst0A6H9gzeIPd7VJuEAUSrw8FXLKuQ0uEy3AYIwUzm9iiYcX+8192mVclvwwWr+PGT0ePqixOI8Cp0vZmH9hvnXljc7n6cQlopGqjjiYO+YkcX9ycoX/a62Mtv6v79Urj0lN+1mVuPeo3AdoVsfsNIr+k7Ra+LFEwK/RUqyC2YRAw1rAE9thZT2fzoxKr8bazA9ds56KvZnQldwELCLrAFWmY0bKu0o1PcZDAg0cSutyDvR7sGGzxy7rRh6Fv5Mty+P4/FWnULrhf6pR8ZMLAWzhc2FcLmFTMbtD6Jm2HDoLlgGIZ54zAM2zxaKR5Wc9uvrqIKo+VjahlrJCjrTPngbUrot/diIEBWb8Fr4yT3pOMZR+3fW7WLm1tkdmauLDj0qLkNjRv2CISJNI7S7SJzuAU0ckqZw1CvvH+PG1ugSml7LEoeun4om6eWsdQBw7W9ueWPimqTtFLbj8Hksj+jocIPHfS7BwXToALoi2oMDxoKX2kjhnTN7N6FlDQxe/hT8fHFCuzZtUvvr5ptauSnkwG9bg7Q5nEL99W9+5CTXbr/sYJCnXOmtAYa0EvYShtopHC/ixy1jIcTY9xe2V+rIwrsN9pzErRgYEWl4akPIcjYMjr3Q1PD5qav77H9nku3hv3ifw7xDEpk3PpTWYQWstImYH2K36Yo3A7DMAzDMGzzQk38sJnAqhu0fFQN1FayPbIQwxHz3ygx4uk3xFeTVO8RXStKWwXJoTFzT7akUCiC7B93DvSYb9aBfidO+h3Z9oPm7uCbYW0ejyNEPcWCpQ921zbw46jsaJZYyjI4sw+sUmYjGdOpmISCSVdSrDCYoW1eDinR3hMLgaTyJC1lts7HLnoqhUt+YTRQtdHsKZI0Tgr1r9fNaxa9A+sTu6BlJr3kQFFApBcOBp2bIkOTnmwM5VujQ+WdhmXmUkmsnsLg/6rNB69PXNGfIrTTYBiGYRiGbR41C8+rgX9QdQ04IqaQexWNfEJSFvkd+nfw2eEq4yGHxmGg+wZ+Skgho8GjcKPZK8ZAfYW1eWwQtyjwMDHsgkA3wQuxNgkFkZKp+h/5stU8PKtnqJfAYIa3eTk4wTJ9M2wVsX7JfwTCGS/U0piHZ5228BrO5GCK78h/DW3zgV1gWLL19qPh9cauYo1l6p1HF3e/u1K4pGUg9kv5cm0tW7DqrX+c8sa/ZPPB65PapJ0GwzAMwzBs85Ty3G02dqnkZqHyu1FPYDl4CJtX5OaLpyrTwpoHsfiHbF6Vm1c4DSaboaqEyl3Ilp7MfVKOmTROHokMlUaYba+OBUcIpUoQq1ErRe3c/XDxH7xD6uWlbV7OzVOcFbjjC8fa1O4egaBwSeVMwaotZ+5xOb2AzTuz550toyr0Cm3z+GXZqA/mFPx/1ebV61N+HoNhGIZhGLZ5BLPv8ZgmWDgmmBMbSbLAYJtX180rHtrDlK1QAD2yjcgz6ubp0UNVLX6u2cxhzXFQXXKs1qdNAhVqSyORQbWKFYp5ehwWHiNeLRV20dIWbnCvIww+rM3/aY8Cbf5rUN28lj9+qm5+dCXWKaFz40MUFC7kyjm+fIZqz3tljarqfW565bVn1c2358+yeayhomWGzHon7YmyJkoIyPy6e9SZhLV5aTowsL9k89hU8PpkGIZhGIZtXglWxkuyhU5Gj2wSQQI6cbKadKaNlnVIxwXcXmXtPR1ZUzCWNcOgNC1eUF2XzrTRkpUFjVM8C+sn9b+J/6tO6cyQyLqFkkcuCycSFqEjXRyJDG54Ilo0AvdOmfhoRPMLb5DLuq/v/tkve/nEejyUzaNK4nks5d26NBI6iQgPnymVnSk8bJDVpTNt9MznseJ0f5wpf3gaPt9MGw8KF0Ye3DRItYHJZyNCawAOiomnDUVuXlxsWqpUKZqHP4K7GNkLXfgrJ4JRlcD9JAUE1yS2E9rmZyd/aTgdsLZ3luOx1dA2r5jZwPVJXy59p8mlNgzDMAzDNi8lL7GgRXpAViyZCBJQZNang8Chwrjs4KEuCiadKlxMZ7H35PPm2wf5TTqvPV9vo2mpIC/fao4eKxQdoA4nu+cO6BxxOvn+zn1jH+sX0khUDkrpfFA0KZKjoxIMHiyt1p50wlXa4Md1jCTavMRN/wBcFoKTO5o+dYS8eag8i336Zf/hLPyEd+WlK5wZn6J5TGG4gmwecQc23jUsgOrX6UhdN4+43+p3h5ku548nAV0gkzPhTH31MsOZFW4TAxLW5nGcGFhtq9S6HP7vlTbSzKrX5xuzeYZhGIZhm2cGDTrZ5hXBMAzDMAzDsM0zN6dQu699wgKhVwDDMAzDMAzDNs9MHLNw97/zjKY/Tzkg/2XXDiwohqEAio77l/sAFI/MEQQhBI3OkAIVChS0nDPFxQUAQM1/xv7/XaP2BAAANQ8AAKh5AAB4Ss0DAABqHgAAUPMAAKDmAQAANQ8AAKh5AABAzQMAgJoHAADUPAAAoOYBAEDNAwAAah4AAFDzAACAmgcAADW/6L1HxHaTUhpjTOC1AAA1HxG11mORc26tlXKyc8Y8kRxBFP4tBA7ubywhOfkKSydiUlKQdiP+gyOkhgAhIN0UzbLJigRrZKKzzpJJEZFX5Rv7k59Lavdq5LX1ni4YmuquV1U94k1P3fy4WCyallydffdp79u/+bI9Xi74+fLL+An+UqaDo6/l895spSY7GgtDSHK+nH2alt17PAO9ioTvcjlGcNHNv91H8e+sGxI1jMhd9svl0R+DUW4Z3DsqX9tjiftCV/gXFzQMwzAMq/nb29ufgb7vvw+s1+vNr7YQxIGuxPWuSy4F1Xw7E8poq/l27P7D1TgV7+ahdIdrVjY0euh7lh5+NwazmEvL4Gb1/L+CYRiGYTV/dXX1E3BycrK/v394ePj8/Hx9fb2V/tgeVvNW81bzug40OrzgR0ItsUP+8zAMwzAMq/lSSt/3PwQuLi4mk8nBwcFisdgMboT+VmfzIsjQGACB0pUpx6VnYFqK6CFpRQgDaJeh22e2ihHaSDuQCibKR4YmU0AgfAGMAt41ZKWksjvhLONnBWqeOT8ql39KzOBQ5uAsrhnvIBNlRAV3iXiRwzTMMOuCrej15Qxh4kf4VcI5gYathblwkZRvvIpDzTM/qtFpmat5Pu/JdqIlJoIYHPFGQ7A0EHvNjNiz1kGyKkuGYRiGYTV/f38/ATayvg9UqnmVINAH0EbQJRCRVBIhLiEj8AdeJRd7D1Q0UK/EXHZmhz11Ia5TNU8DEIgfyTk/qU1DTmgQylmuEbvkPKhSzQ9+U9cUdqtl93cjKn9BO6l4wpY2lLDdiivkhCsIVG0tzA1i6k7LN2rFpTleNXq+XdWSd4FuJ65D3U/ojcYGHsZC1ww8u3PBLZiUZZYlhWEYhmH4bP709HQSOD8/7wOtap56KDRN/q4/LvSUTmUEzBLNFC7CJtMuXD9dp1LN68TK9fOQOTe8Y4qAa3IiUoc8pGEGMtfycKIjADOWVjxly+mUerJ4TriKQO3W4lx6h/34FYcx33o1qnl5g9RwC4BSduSP1TCICyWf3vV5rRWGYRiGYTX/u6A/Pj7ugVY1L728fKfPV+1VQkfMRKOgDYNCgX/+ub5Ob1PzcERB06Tt2NeRqy7lTJ7goI4yNZ+4hjswkZFEcGcVT9mqXh+myOIJ4ToCNVtLBzErKd9YFc+1bHunTb6dSB6Px/9Uzcf1EKM+c6aPoxpCTZYMwzAMw2r+5ubm6empD6zX637A4+Pjw8NDM9cKZVB1Nq+nklxcNUqdmqfN9mfz4LnFSa24y+NSMaTdR3kPtHDIXcv7DR3Jz+aTDhZlq9PzD4aScAOBmq3F1IlHLd94FYexLguS6gVQy3w70alu5io1z+SjBPjt4LHmbL4iS4ZhGIZhNf/y8nJ3d3cl2Ej519fXhqZ5/c4GZVyNmo/x6r75BjUPv/A1dt98HjJylSDlHBooJuatzANVDZNlEncRPlIhI4AOasVTtpgeF3OEKeUQwpUEOLepbz4v3ygVr++0AWcsKF+orNhO0OJTnVKl5nHfzeZ4Hqjom4eN9s2nMAzDMAyr+ff397e3t18Fm8GPj4+mb9qw9YUSR1+X59qI32npVjUfHom5lWqeE+dnlWfzmEiVrL0KSU7y5iJNncSbceZEfCVGcj5bJZ02ietIoyaWI7mYzivOjIEtp8PgL2fPGFHCNQQatpbS0PKNVnGmgjREzed3n1rm20keZprUPJgoYfkfvXn/22/s3aENADAMA8H9tw40CreluxGKHljN/0oAoOahQEqOqd/9AQA1Dxl4VCGTHgBAzcN3AEvKd8nQxU4dANQ8AACg5gEAQM0DAABqHgAAUPMAADBOzQMAgJoHAADUPAAAoOYBAAA1DwAAah4AAFDzAACAmgcAADUPAACoeQAAQM0DAABqHgAA1DwAAKDmAQAANQ8AAGoeAABQ8wAAgJoHAADUPAAAqHkAAEDNAwAAah4AANQ8AACg5gEAgP6aP3bOAEOWGIqia2k0elmlMSsJUjspspRELaPp2cSnH//KXJHfpvwx5RyD8qSSl2o4lbnqc7vfLtf4+9geB/Ta8m0pn1Y+nD1db6m+Lut6uZfnkZPr4aQ6XvqojQye/LN8XPJuZQAAAADA5t1KH2Wrv8XmhWz+gE4k0GbzDjb/gwAAAABg84+yXNdmZWwem/9VAAAAAHA2b35s8ZtQ2z31dXln1O9lGzr033s1IIS15aivLSoa43GgtaloSZthgkgN2Dwi2oi/VIdb1tK+KSO2ozmtvaWUsHl78usmm3+tWMryesLPfgYZvzfjFQAAAAA4g83reN7Utq6q1LXTx6iH+EY9hDWuY7yJo705xGm0ZDfqLUs6ux4eJb2K0UMMkFLPzubVgBpTz5Ozed+ylo6i+mlVu9YM2Z5St4vYdTwN7Vo/jWxeD1wzTJqxykkAAAAAwOb9JD7vJsEhi+GaYY2e0lHdb7cwjKQ5xsie5bLj/InGv2vzPmY6/3zLsYTGj9HturBO1LA1M+hEW8u7N6PKiQEAAADA5rvjXkU4LHbiQmla7EpqgRPlQzphjTkl3Jr2SwbmfZt3Tdft37N59eYNSLX7eM/4vULTjm3e59Tq1oxVTgoAAAAANi93bNk1d6q2/lYgdH5szG1eUn7Q2bz6/PbZvLDoji/qZ/Oq+077k3XvxNYS3owqpwEAAAAAm1ceXRauxMvc5j1QPs/Nv2/zWjeuY/z/yc1PbF6xeO9Bs+la/83w3LzGDHLz01cmb8YrpwAAAAAAm7dvvFhiu0txjNTWkjB596SNbtFy8teZzXcf2El5cjZvK9o3bbQpR2NS/efcvFI0jlZc8rpojOqpaqdfvg7UBkkb++0GzVjltAAAAACQtPnTbh1gWAxDARTd/+YKQohQ2UDEqwLoGIMB1Q/1H85xF3F/AQAAbh4AAHDzAADg5gEAADcPAAC4eQAAcPMAAICbBwAA3DwAAODmAQDAzQMAAG7+2wAAwM3PFbWPrTRJkiRJd9U+5opcNz9XlLbHcV4AAMC9OM7S9rki0c3XPj5ceQAAMPS1j0Q3v5V2AQAAL/+zmwcAgGduHgAAcPMAAPA+Nw8AALh5AABIxM0DAABuHgAA3LybBwAANw8AALh5AADIyM0DAABuHgAA3LybBwAANw8AALh5AADIx80DAABuHgAA3LybBwAANw8AALh5AADIx80DAABuHgAA3LybBwAANw8AALh5AADIxM0DAABuHgAA3LybBwAAN1/7iOO8AACAJ3GctY9ENz9XlLYbegAAeFz50va5ItHN/w197WMr7S5JkiRJtY//lc9z8wAAwHvcPAAAuHkAAMDNAwAAbh4AANw8AADg5gEAADcPAAC4eQAAcPMAAICbBwAA3DwAALh5AADAzQMAAG4eAABw8wAA4OYBAAA3DwAAuHkAAHDzAACAm88NAADcPAAA4OYBAAA3DwAAbh4AAHDzAACAmwcAADf/AzdqrTUOa7yAAAAAAElFTkSuQmCC"},641:function(A,e,t){A.exports=t.p+"assets/img/CustomerEmailBody.d9e6d6a4.png"},642:function(A,e,t){A.exports=t.p+"assets/img/EmployeeEmail.f299755f.png"},643:function(A,e,t){A.exports=t.p+"assets/img/FinalRecipeView.863abe31.png"},644:function(A,e,t){A.exports=t.p+"assets/img/ReceivedCustomerEmailBody.7466a15a.png"},645:function(A,e,t){A.exports=t.p+"assets/img/EmployeeEmailBody.ea00b163.jpg"},890:function(A,e,t){"use strict";t.r(e);var i=t(17),a=Object(i.a)({},(function(){var A=this,e=A._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-email-receipts-ticket-sale-guide"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-email-receipts-ticket-sale-guide"}},[A._v("#")]),A._v(" BTCPay Email Receipts - Ticket Sale Guide")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(631),alt:"FrontPage",title:"FrontPage"}})]),A._v(" "),e("p",[A._v("This guide shows how to setup a simple event ticket sale system, using the "),e("strong",[A._v("BTCPay Email Receipts")]),A._v(" preset in Transmuter.")]),A._v(" "),e("p",[A._v("Transmuter is currently in "),e("em",[A._v("alpha state")]),A._v(", but this preset relies mainly on sending emails, so it's fairly easy to use with your BTCPay, even if you are not a developer. What you will need in addition to Transmuter is, a BTCPayServer instance with at least one store and a few email accounts for testing your ticketing setup. This guide is using Gmail for simplicity, although other email clients can be used.")]),A._v(" "),e("h2",{attrs:{id:"how-the-ticket-sale-system-works"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-the-ticket-sale-system-works"}},[A._v("#")]),A._v(" How the Ticket Sale System Works")]),A._v(" "),e("p",[A._v("Create a simple BTCPay Point Of Sale App that sells tickets for a future event with limited quantity.\nWhen someone purchases a ticket in the connected BTCPayServer POS App, send the customer an email receipt containing their QR code event ticket and send an email receipt to the event organizer, alerting of the ticket sale and the payment details.")]),A._v(" "),e("h2",{attrs:{id:"btcpay-pos-app-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-pos-app-setup"}},[A._v("#")]),A._v(" BTCPay POS App Setup")]),A._v(" "),e("p",[A._v('First create a Point of Sale App in BTCPayServer called "Ticket App" with one product (our event ticket), which has an inventory limit of quantity 30.')]),A._v(" "),e("figure",[e("img",{attrs:{src:t(632),alt:"TicketApp",title:"TicketApp"}})]),A._v(" "),e("h2",{attrs:{id:"transmuter-email-receipts-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transmuter-email-receipts-setup"}},[A._v("#")]),A._v(" Transmuter Email Receipts Setup")]),A._v(" "),e("p",[A._v("In our Transmuter create a Preset > BTCPay Email Receipts.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(633),alt:"Presets",title:"Presets"}})]),A._v(" "),e("figure",[e("img",{attrs:{src:t(634),alt:"ExternalService_Setup",title:"ExternalService_Setup"}})]),A._v(" "),e("p",[A._v("Next, connect our BTCPay as an external service to Transmuter.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(635),alt:"CreateBTCPayService",title:"CreateBTCPayService"}})]),A._v(" "),e("p",[A._v("Next obtain a pairing code from our BTCPay. So Transmuter can send emails when BTCPay POS invoices are paid.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(636),alt:"SIN_PairingCode",title:"SIN_PairingCode"}})]),A._v(" "),e("p",[A._v("Once pairing is successful shows in your BTCPay, go back to Transmuter press Save to authorize your BTCPay client connection.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(637),alt:"ExternalService_Add",title:"ExternalService_Add"}})]),A._v(" "),e("p",[A._v("Next create an email sending SMTP service.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(638),alt:"CreateExternalService_SMTP",title:"CreateExternalService_SMTP"}})]),A._v(" "),e("p",[A._v("See this "),e("RouterLink",{attrs:{to:"/FAQ/FAQ-ServerSettings/#how-to-configure-smtp-settings-in-btcpay"}},[A._v("SMTP settings example")]),A._v(" for setup. Save after data is updated, and return to preset of Email Forwarder.")],1),A._v(" "),e("figure",[e("img",{attrs:{src:t(639),alt:"InvoiceStatusTrigger",title:"InvoiceStatusTrigger"}})]),A._v(" "),e("p",[A._v("Choose the invoice status to send ticket email receipts on. During testing, use the "),e("strong",[A._v("New")]),A._v(" invoice status, so that payment is not required to send emails. Once everything is setup correctly and working properly, choose a status like "),e("RouterLink",{attrs:{to:"/Invoices/"}},[A._v("Paid or Confirmed")]),A._v(".")],1),A._v(" "),e("figure",[e("img",{attrs:{src:t(640),alt:"SendEmailToCustomerEmail",title:"SendEmailToCustomerEmail"}})]),A._v(" "),e("p",[A._v("Select send email to the address registered on the BTCPay Invoice. Be sure that the refund email setting has not been "),e("RouterLink",{attrs:{to:"/FAQ/FAQ-Stores/#how-to-disable-email-on-invoices"}},[A._v("disabled")]),A._v(" in your BTCPay store, in order to prompt customers to provide their email before paying the invoice.")],1),A._v(" "),e("p",[A._v("Next supply the sending email address, email subject and email body. Note the highlighted line in the picture below, it uses http://goqr.me/api to create a QR code of the invoice payment which will be used as the event ticket inside the customer's receipt email.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(641),alt:"CustomerEmailBody",title:"CustomerEmailBody"}})]),A._v(" "),e("p",[A._v("After saving, there will be a recipe which has been generated by the preset. In the action group, there will be one email for the customer. Next, add a second email to notify the owner of the ticket sale. This is also important in case the customer provides an incorrect email, the event organizer will still receive their payment information.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(642),alt:"EmployeeEmail",title:"EmployeeEmail"}})]),A._v(" "),e("p",[A._v("Add your second email account details, email subject and HTML email body. Note some of the purchase data you can insert into the event organizer email receipt. Press save.")]),A._v(" "),e("p",[A._v("Be sure to enable your recipe (checkbox).")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(643),alt:"FinalRecipeView",title:"FinalRecipeView"}})]),A._v(" "),e("p",[A._v("Once the recipe is "),e("strong",[A._v("enabled")]),A._v(", start creating invoices in the BTCPay POS Ticket App and see the emails sent. Providing a valid email in the POS invoice creation process will send an event ticket email receipt to the customer and a payment email to the event organizer.")]),A._v(" "),e("p",[A._v("When the QR code contained in the customer email is scanned (with phone camera for example), it will lead to the BTCPay invoice page to verify the ticket at your event.")]),A._v(" "),e("p",[A._v("Below is a basic HTML email template that the customer would receive and a basic HTML email template that the event organizer would receive, with some invoice data from the time of purchase. Feel free to improve these demo "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/tree/master/docs/templates",target:"_blank",rel:"noopener noreferrer"}},[A._v("templates"),e("OutboundLink")],1),A._v(".")]),A._v(" "),e("p",[e("img",{attrs:{src:t(644),alt:"ReceivedCustomerEmailBody",title:"ReceivedCustomerEmailBody"}}),A._v(" "),e("img",{attrs:{src:t(645),alt:"EmployeeEmailBody",title:"EmployeeEmailBody"}})])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[19],{631:function(A,e,t){A.exports=t.p+"assets/img/FrontPage.616c97f1.png"},632:function(A,e,t){A.exports=t.p+"assets/img/TicketApp.3fcd4bd4.png"},633:function(A,e){A.exports="data:image/png;base64,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"},634:function(A,e,t){A.exports=t.p+"assets/img/ExternalService_Setup.9c2a74c4.png"},635:function(A,e){A.exports="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAcAAAESCAIAAAAOhSuaAAAZLElEQVR4AezXgQAAAAACoP2lH+SyKIVvAABYAQAAWAEAAGAFAACAFQAAAFYAAABYAQAAYAUAAIAVAAAAVgAAAFgBAABgBQAAgBUAAABWAGPvDDwb2dow/rcUl1wwAQO0LkTRKG0tt+Uj6yK1SCzGXr6VspGSCAZBCEUIQlgxrCpVobJBI2iEVaGSUlLKlHAwzLfpZt40JzmVt5u737h9fgZb2545c96D5znnPeddInflv35f+W30vK3cuf8uBl+P4pFYotKyHfdVAgAAAAC4Akf0LipZIxJe10ea7/HR1rf3jEzR6gxei0hqpbxvVzyZpvsS4ArETatcSO5vbWg0mPpGeCuWKNV6Q9cXXJd2vL7Fvzy4AAAAAACvzRUMzvN7+jNSOFq+dV8IXAFcgdOv/nc7oB7V1IVPgm9SJ99+vnNfEQAAAACAK3Duzg5JsfneFQz77dPRhkYo1/rnXAHtk4S3Zp+jF7sCcd05q5jxyEbu4jW5AqdfjgafTqfA6ngwQ7rPXIHTPz7Y1b6HPnLUHrqvBwAAAADAFYhmemOi2LTteKF2dStcQjz0Lq2Ckaz6wxU0015X0/+4KyCp6vuWfe0KBpUoTbDQ35X2vTvFffesYBRaLgAAAAAA+L+5gsHnKO0SBP7MN213qcAVwBXcVaNeyN6UrhwXAAAAAAD4zBUMawnNU2zrmebQXTZwBXAF9NUUMgAAAAAA4CdX0CvteqkdodyluygXmalzt4NGLro62nDQ86MfCdGvl5L7m6sBL0d/P11p3rpzuO/WR9n2lGUe1Dcjo0QmWxKXi555sC+trBEZt6athiNG4bRrO8vV7qJ+GPLSrozje5XdCo4OrdKIzT5/VQbuIp1nhUBW7XbHSr3b0MaBiKWsDjXIDwTXFfTL/5E/diGch7Y1OoOheUcR9oyjs+7D3PQkalx8qyTe6KPfj1mjH8+T3lbYbvHanaWdD031TRF9Kd9pbzSrvQC9SxZrfeESjMnvBwAAAAAAV0DajiQR3xXcn8S1OZfziMuj+Tcaadup2pSOtE8/airFrMeqN0xX4PSPFXfdaLHS1XBprkDaaQnlO9Nac4MGtue4C7gCZufVIZhxBf1eJTrbpvYomnmB4LsCWXn/FtzJL1YH4Obkw2ZwXmf0/VJXKFxBr5MPSQPrtFLaM13tFrfG/7tvPSiiT4h2IaI9E0TG5PcPAAAAAIArELWEp1fCxa77EleQTHwKzl7ZKS4ynjgLht+b5dNG3SolIvoKrdp2Z1SdvrF/YBatRv20kn0/UcaB9ye2t+R8bJpZ04y/oSR14/uPj0+pac/cdaNHEiWrfl4rm0ZY81o7qIml5vnYXwyvq7EqbRfcVt5KX3p98thPg+7C3zHMcedLLdvld14OgdIVhKPR0GihfTd+aGYPovrEPwQT59QeIxB8V0D2iS4giubO+8JxldxU3nq/r0WSk85Qz2tinitIJt7MUertnOdJYpYtm4JSePz7xrGtjL50KJ+2CL6HL2Xs6hq9izH5fQAAAAAA4ApIvJIA+upyXQE9oU/TJahEK7vuJc9U+nN1VeDvicQcfP74oSIntPTKUdoHqA7U5wpUJ6fpjISsMjcK336uXoEkFp0+6eO1dEv8yCz6FJQ3ENR+g995dQgk1U7/m25MhndgTTYWSOizA8GvV3Bj7evS/kNkJpGJTid7A/g4pESvQkN0dCW7Am/KFTsDyfld5tempT9xVdweT8hPDfFsjEQtGZhco2RdiemLfcu1AX/yAwAAAAD4zxVcvNAVBKKjDJmn2FZMuTR7b+3P6jPHnYN9Elf0TekKnE7uD+UZCVowXst3luMKiG5p52kiE/24nm87C+9CcDuvDgGpdtW1PySFVzSz6RKsQHBcAWF3yjP5UYHNj9VrhYj/gwZw3ih1ZFdALmIG+isqVyylDwXp0xQx6hff0J6JpSjyzZv8AAAAAAD/DlegkrAPx+8nCkwtuIPZ1kLSnOEKOk/U5DNX5ketwc9VMZu9WZ9OEaylrfL74I91/WxLLP5R7M7LIVC4AsoNU55UJliBYLsCYnTuOaJL2fbZC/FkMBX+TXrv5zt5cCiJi5g1Qk+zsK5LO7L9UHwvJRrJR5aXOPkBAAAAAHzgCkhjcc8VnAnluuwKZ8Vd2P32eaNaMrOHxh6VvOW4AvuLoX6dlG6+7PtDh43U9FevHTYEp2V259UhUKt2lStgB0Jun4+4aeSeegMtWr6RhbXqoffKrmCrdOUqIAOgJetCuoCL7IcyRqKWXFF7tpdPfgAAAAAAf9xB1Mpqv8trqNw7iBTClyGMrq0fV0lKD8MVkDr85a6AsE9I1lOKCKNldufVIeC7AlYg1O3zGZwmvYO5lG1PLXNdgTqylAJEyUL0Ilr+V8WI8Qr+5AcAAAAA8IcrEGcHv8vZF3xXoHIa+0eN+rnyubqXjtKO78kpVGr1807vvpbguoLPtGacqarfW2/1xdJdgdP9ITrp2Sl2WS2zO79UV8APxBJcAR2ZoM7UnalCyOFD65n507wRLMlOvxZIt2ijjP5KFSPGdgR/8gMAAAAA+MQVUI0n9a2dPFdAqm4Bvehd10MpN7bzc+cKWqZXWCrTdH5pBeKr4q532tVMaN7J4xtOy9zOL9UV8AOxNFdAgpuKTjTN4JR8V7OwK6DDvnSKgP6KyhSov5eiozbP/MkPAAAAAOAnV0CL3HTB5YAtSdUnO+n2G0JdQyr1VaHhnnEFko2h8gt0n/2vcQXdSc762dBzCFS/TNEy9ZDf+eW7An4gWK6gVVRXLpP2CiiJn8aT6wrUPFRjdH8R/VvK9VJEXzRU5er4kx8AAAAAwFeuQE4doZsijcJpdzB0JwwfepdWwUhWb9WyUj7ZqbYZzkO78rHQksXomtlyCarnReJMFl606CvvPNDp1WLnwZW4beTS1mC5roBsFelj0Ur9MefGevl76WZNfueX7gr4geC5ghTNKyHPBOlcgSTBA9FS23YlBuf5lHXHcQXyke5wLp+gMgULRJ+umaKSCFMmR/SpXgFn8gMAAAAA+MMVEOIyv0PGQPlEywu4AklCUa3ccR3fg1hIJ71FUpgKwWYefy259/131jdC88QZrSVTldyEaabIsdyfxCcfEtT/NFLj4seZ+J+rARKOvJtJ1ZeTUu4QVSeQCh5r0eqt6iBHUI8mRx07sAYus/PLdwXcQLBdwYo0pJujL5p3BxENIP3X6o6RGc+fQ2NnNUgvZbgCaUPmewfo5PFiroDKk9Gs3jMyUm1j5uQHAAAAAPCVK6Cl6Ij+066AEO38bkDZlJ5r0XulkrekERvPFfxaV/ft5uTDuvIrAjHeXoH6DhnKHZLSfuQNhADVD/bqEoQU1woxOr98V8ANBM8V5OSW5UJm5W/Cnab3hbYRZp/gPnevQDY/tNfE2SkadgoRXX03FH/yAwAAAAD4yhUQdrdWPDT2nqzjBla3w++ShQrdmrKYK6DWDmLh1SCtm4YjRpaaIuxONR0L6d7aatpq2wpxRgy71TS1rIciZt12Jzh3zYoZj2xotO6+ub1/UKpe9oXjqmG5Ak/6K/SouMiseW+XClqJb1bq3baueUvO2Ybtsju/fFfACwTztLHzcHVhjabW1o8Pp+86Kl+og3LbKpvG3rpOmwbhrViiZLVvBP9cgXy8nsoUcPPHBheVrBEJ6fQVkXihRlOaWGDy+xAA/tfeHXDIleZ7HL8A9k2swWBeSoABAiCCwAW9NhC9xpIlWQtoGtPAQmiDTQ/TmAuuQFJJD21iI7mRi1u6QyY6kgDOfZL/dO1vd55tlepU59T05+MxKqfOOX26A//vnFMdAFQBAACgCgAAAFUAAACoAgAAQBUAAACqAAAAUAUAAIAqAAAAVAEAAKAKAAAAVQAAAKgCAABAFQAAAKoAAABQBQAAgCoAAABUAQAAoAoAAGD1qQIAAEAVAAAAqgAAAFAFAACAKgAAAFQBAACgCgAAAFUAAACogun2pc+/+OzGgyEcbl+pLecDAACogstXLn1+5dZUFZxfAAC4V3DzVsuAy9uHqgAAAM5tFUyG57cuf3Fp+3mvCh5cb48Y1ZqVw72b7fWk7dY21n2GtqX2yZx4f9rcDgAAjLUK6kXN91EFFQDX7/0jD+p1NUCriNp5NvTnSYYojXpdxwIAACOtgoyBrII0uXE85bcqmN03iBLI6T/PXIfEOccHAABUQdwNiCqIp4BqdaqgHdXOEDvn/YRccchIAQCAKqhR/uatqoKc8vNewTxVUGeWAasGAABVUKN/fji4Tfz1dFC9nrsK8nMFqwUAAFRBTf9VBbMPE79fN6/Pf68gT3W8YvunAAAAqgAAAFAFAACAKgAAAFQBAACgCgAAAFUAAACoAgAAQBUAAACqAAAAUAUAAIAqAAAAVAEAAKAKXrw8evj42f39R+NZlmVZlmVZlmW1Kb3N6susgkiC/UdPj169HsYEAABoU3qb1TMMllUFrT8kwWgBACAM2sS+9CpoNyaG0QEAAHJiVwVnDwAAVAEAAKAKAAAAVQAAAKgCAABAFQAAAKoAAABQBQAAgCoAAABUwd7WhS8vbuwNJexvfHnxwub+MJ+9zYvtPMdra29oDm5fjY21ru5O64CD3bV/bF+/fRAbj9faTm0FAIBlUwVX19dqWA/TnfULH1gFNcTX6zowAqPm/jx5bDnY3WjHVhVUUdRRZxcGAACgCmJGn83xG5vrC1VBnTMzI6qg3p2N/iGqIPbMCwAAgKVRBbt7OxEAx+P4tDbmxJ+3AlLsUw8O5SNJUQWx5xxVUBdQ15OPFXXCI0sDAAAWoAqmMbjPxvocymMEzz37nyuoo0Ln5D2dJ4hqz73N2pjTf780AABgUargeLCOLVEFMcpHIaQ4vA6sfRapgllddHaLU8XlxUYAAFiUKoj/T1/zfY7dTT5N1J3powpq9I8xfbEniFLnFxbFzh/n4wcAAKAKauLfqVE7SyBH8P2NevfkKsgMyD/mV5y7CmJj/7ZDhgoAAJyCKqjX9XHerIKc+6+uz95d7Ami2TSfHw7u/GbSE64wT5W/VhUAAE5JFeSTP90qyIl8vn/FrF8Fs5N39u9WQf5raJtbearF/00DAABQBYvIfhiL7A0AAFgmVZC/J3Q88l9OAACAZVAFMXyP50Gd+AjE/PcuAABAFQAAAKoAAABQBQAAgCoAAABUAQAAcK6q4OHjZ0evXg8AAMD4tFm9TexLr4IXL4/2Hz0dYRgAAIAkaLN6m9iXWAUZBq0/2o0Jy7Isy7Isy7LGs9qUHkmwQBWcQwAAgCoAAACyCgAAAFUAAACoAgAAQBUAAACqAAAAUAUAAIAqAAAAVAEAAKAKAAAAVQAAAKgCAABAFQAAAKoAAABQBQAAgCoAAABUAQAAoAoAAABVAAAAqAIAAEAVTLcvff7FZ/+8Lm0/HwAAgHN3r+Dezc8ubx8OAACAKgAAAFTB8et46/Obk2E43L7y2Y0H7b/1oFF7Hcc/uO4BJAAA+LVUQY34V25NhzK5UYP+uyqIof/5rcv1+uckuH6vcywAALCaVXB8WyCn/NzYxCGdY90uAACAFa6C+N1ENye1vZVApkLu0w45voeQK3YDAABWswrqAaH2UNDkxuzRoJPuFcR2AABg5asgt1y59C+PFdXTRPFZgnwNAAD8mqqgZv36PHHeK9i+dbnzu4byX0OLcgAAAFaoClLnNxHFE0QAAMA5qYLJjfjQ8PmoAgAAUAX5z5Z9EQ8U/bqqAAAAVAEAAKAKAAAAVQAAAKgCAABAFQAAAKoAAABQBQAAgCoAAABUAQAAoApevDx6+PjZ/f1HlmVZlmVZlmWNZ7Upvc3qS6yCTIL9R0+PXr0eAACAMWlTepvVMwyWVQWtP0abBAAAIAzaxL70Kmg3JgYAAGBkcmL/pFUAAACoAgAAQBUAAACqAAAAUAUAAIAqAAAAVAEAAKAKAAAAVQAAAKiCva0LX16crY29Dzl082Icu7U3LGB/o3OGM3Swu1ZfvdbV3enwyUx31i9s7p/8dxQ7nOZbXr99EFsAAFAFNQrX6xjN9zdidkxZBWs7B7OJNo5daDzd263XZ14Fednz77ncKsiN2Sp7O/UaAIDxuvbV9fw/7+2Pq1IFWQILVEFzcPtq7b/Alw6qoPtDXh0AAEwe/JBV0P64MlWQU2k+V5N3EuJBoxxYsyIqD/KhoNpSh8z64f2Bea8g5dea7VAn2WmHvLuk/8ovnVeSX31zP7/H25uzK+/P+nG2OjbugcT3nm/Ftxk/hJ2tn3erP+61L5G75bFxSXPcKwjzXMB/x489/hai97p/rflYlyABADjl7YL2YsU+V5Bja2d2nL17sHs7qyCH1/fvbrSNMf3HvBuDeHz1nHrza2W01NnqdW7PE+ZXzBSpr1KvU/ZPDsHdATovO7/f+O5q/6iR+mNef3urXm/Wxu55SlZKXNvcF5Db4ycW31Tnr7XejTyoPQEAWPR2QXuxIlWQ43XnCaKYkjvTat5SSDmVxtlyY+yWU2/3waS8hu4JY3CPb622x/eY4pCQtxfySmLPzsXUW3FV/bLKy8jTdqsgVVTU2ea9gDh5/FRjnzxJ5yLrkuooAAAWuF3Q1op92jinwDk+Y5CDZmd7Pm+TO8eUn/J/Udf4m2u2vV7kpeYJ475HtspCVVAXnEflnvmMTT7p9AFVkJc6TxXkXZQ5LiC+i9lNj7z43Ln/VNLpf+sRAIDbBW2tWhXE7D7HvYLcub+x/wRLm63jy3UPrEE29a+hTpUnjNdhgSqoU21t5FfMPfttM18VxIsPuVeQJ5zzAuKGSf23meNewRIyAACA1X+CqAbWEz5X0Jvd40n6mKTXcgzd25q9zsfZ82H3/pnjhBub8YhLfK5g8SrI7z3f7X6uYIEqiOk/frAn/A6iejd+MnNeQDxctLH57x++OuFzBQAA+FfM6mGS/EhrPqySVZDihG1kjzE3ZtCYyE/80vkUUFZB74RZF3HOeargn/8ttoiZ+BLxZFS91XlQat4qyItc29w6+V5B/ijim53rAvqPQuU+nb/W/JnERgAAVq8KRiem3vMIAABUQTyedP4AAIAqqGdyxv+0OgAAqAIAAEAVAAAAqgAAAFAFAACAKgAAAFa8Ch4+fnb06vUwPgAAQJvV28S+9Cp48fJo/9HTEYYBAABIgjart4l9iVWQYdD6o92YGM+yLMuyLMuyLKtN6ZEEC1TBeQYAAPSrAAAAUAUAAIAqAAAAVAEAAKAKAAAAVQAAAKgCAABAFQAAAKoAAABQBQAAgCoAAABUAQAAoAoAAABV8Ne94bd/Hv7j2ohWu552VSXdvf/DH/70l//8/fo5X+2H0H4UAwAAnKYKMgl+89VYYiBXu6oKg0yCtWt/lAS12o/i44QBAACqYEx3CTp3DNIv7xK4YzAAAMCpq2CMMZAryYBfrgEAAFSBKgAAAFWgCgAAQBWoAgAAUAWqAAAAVIEqAAAAVaAKAABAFagCAABQBaoAAABUgSoAAIClVMFkaH56khuHrw9jy3iq4O7hEKZ355+w4wxvnnzzkcf37/7+5ueL+ebx2zy/KgAAYHWq4O3w0zB8feoq+N2TYThcYhXETF+FcHhnCVVw52B48/i7xargpFXNcDAZaRUAAKAKvn83Y69UFfx+Mh3e/v1vqgAAgI9EFfzu2vDjMPw46VfB92+Hcjz0187x7uG7Q2bqraVVQUzYMZeXuIFQI35sjzPUW7FznKdUctQhM/UV+1XQucL40nkltfP4qgAAAFXQXjRfRxXMhv54fTzxf1sPHcXhZ3OvYCYH+r89mT7+bjagz/5P/52DmuNrRn+SVdDeqhcn3Suo/SsP4uTzVEG7pDezK7w7ueNeAQAAq1AFGQP1Iqb/3Pkw7ye8u2nw/bdn/gRRjd2dJ4hi8q65vHeGO/mZ4JOqIF7nBcxbBXl5qgAAgBWpgmqA77+NKpgMoamdZ88R1W5nWwUxZOf4ns/55M69uw1ZC/0q6HxgoFcasVu3W5p6a/xVAACAKsjJvn34OO8VxLu52p4/HcadhLOsghjf48WH3CvIt+a8V1DnnOteQb47mVYYqAIAAFaiCvKzxb3PFXSOyhL4NE8QxVBer2vyjtedzxV8E2GwjM8VtBd5SaoAAIDVqYJ4jihL4Mchf79Q7fAvv4Mo9oy3zuZfMYvtb6cH/d9NVMP6L34HUZwkbwj0fwdRJME8nyvoHDWZjuB3EAEAoApGsOarAmsAAABVoAoAAEAVqAIAAFAFqgAAAFSBKgAAAFWgCgAAQBWoAgAAUAWqYBEAAKiC3/55vEnQri394U9/kQG52g9kAACA01fBX/eG33w1xiRoV9WuLd29/8PatT+KgVrtR9F+IAMAAJymCjIMxnbHoF1PJkGGgTsGdZdAEgAA8EFVAAAAqAIAAEAVAAAAqgAAAFAFAACAKgAAAFQBAACgCgAAAFUAAACoAgAAQBUAAACqAAAAUAUAAIAqAAAAVMH//O//jXlZlmVZlmVZluVeQQ8AAKAKAAAAVQAAAKgCAABAFQAAAKoAAABQBQAAgCoAAABUAQAAoAoAAABVAAAAqAIAAEAVAAAAqgAAAFAFAACAKgAAAFQBAADw/z4lNZUNoEtYAAAAAElFTkSuQmCC"},636:function(A,e,t){A.exports=t.p+"assets/img/SIN_PairingCode.cd005782.jpg"},637:function(A,e,t){A.exports=t.p+"assets/img/ExternalService_Add.f82f2998.png"},638:function(A,e){A.exports="data:image/png;base64,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"},639:function(A,e){A.exports="data:image/png;base64,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"},640:function(A,e){A.exports="data:image/png;base64,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"},641:function(A,e,t){A.exports=t.p+"assets/img/CustomerEmailBody.d9e6d6a4.png"},642:function(A,e,t){A.exports=t.p+"assets/img/EmployeeEmail.f299755f.png"},643:function(A,e,t){A.exports=t.p+"assets/img/FinalRecipeView.863abe31.png"},644:function(A,e,t){A.exports=t.p+"assets/img/ReceivedCustomerEmailBody.7466a15a.png"},645:function(A,e,t){A.exports=t.p+"assets/img/EmployeeEmailBody.ea00b163.jpg"},889:function(A,e,t){"use strict";t.r(e);var i=t(17),a=Object(i.a)({},(function(){var A=this,e=A._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":A.$parent.slotKey}},[e("h1",{attrs:{id:"btcpay-email-receipts-ticket-sale-guide"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-email-receipts-ticket-sale-guide"}},[A._v("#")]),A._v(" BTCPay Email Receipts - Ticket Sale Guide")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(631),alt:"FrontPage",title:"FrontPage"}})]),A._v(" "),e("p",[A._v("This guide shows how to setup a simple event ticket sale system, using the "),e("strong",[A._v("BTCPay Email Receipts")]),A._v(" preset in Transmuter.")]),A._v(" "),e("p",[A._v("Transmuter is currently in "),e("em",[A._v("alpha state")]),A._v(", but this preset relies mainly on sending emails, so it's fairly easy to use with your BTCPay, even if you are not a developer. What you will need in addition to Transmuter is, a BTCPayServer instance with at least one store and a few email accounts for testing your ticketing setup. This guide is using Gmail for simplicity, although other email clients can be used.")]),A._v(" "),e("h2",{attrs:{id:"how-the-ticket-sale-system-works"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-the-ticket-sale-system-works"}},[A._v("#")]),A._v(" How the Ticket Sale System Works")]),A._v(" "),e("p",[A._v("Create a simple BTCPay Point Of Sale App that sells tickets for a future event with limited quantity.\nWhen someone purchases a ticket in the connected BTCPayServer POS App, send the customer an email receipt containing their QR code event ticket and send an email receipt to the event organizer, alerting of the ticket sale and the payment details.")]),A._v(" "),e("h2",{attrs:{id:"btcpay-pos-app-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#btcpay-pos-app-setup"}},[A._v("#")]),A._v(" BTCPay POS App Setup")]),A._v(" "),e("p",[A._v('First create a Point of Sale App in BTCPayServer called "Ticket App" with one product (our event ticket), which has an inventory limit of quantity 30.')]),A._v(" "),e("figure",[e("img",{attrs:{src:t(632),alt:"TicketApp",title:"TicketApp"}})]),A._v(" "),e("h2",{attrs:{id:"transmuter-email-receipts-setup"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#transmuter-email-receipts-setup"}},[A._v("#")]),A._v(" Transmuter Email Receipts Setup")]),A._v(" "),e("p",[A._v("In our Transmuter create a Preset > BTCPay Email Receipts.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(633),alt:"Presets",title:"Presets"}})]),A._v(" "),e("figure",[e("img",{attrs:{src:t(634),alt:"ExternalService_Setup",title:"ExternalService_Setup"}})]),A._v(" "),e("p",[A._v("Next, connect our BTCPay as an external service to Transmuter.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(635),alt:"CreateBTCPayService",title:"CreateBTCPayService"}})]),A._v(" "),e("p",[A._v("Next obtain a pairing code from our BTCPay. So Transmuter can send emails when BTCPay POS invoices are paid.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(636),alt:"SIN_PairingCode",title:"SIN_PairingCode"}})]),A._v(" "),e("p",[A._v("Once pairing is successful shows in your BTCPay, go back to Transmuter press Save to authorize your BTCPay client connection.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(637),alt:"ExternalService_Add",title:"ExternalService_Add"}})]),A._v(" "),e("p",[A._v("Next create an email sending SMTP service.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(638),alt:"CreateExternalService_SMTP",title:"CreateExternalService_SMTP"}})]),A._v(" "),e("p",[A._v("See this "),e("RouterLink",{attrs:{to:"/FAQ/FAQ-ServerSettings/#how-to-configure-smtp-settings-in-btcpay"}},[A._v("SMTP settings example")]),A._v(" for setup. Save after data is updated, and return to preset of Email Forwarder.")],1),A._v(" "),e("figure",[e("img",{attrs:{src:t(639),alt:"InvoiceStatusTrigger",title:"InvoiceStatusTrigger"}})]),A._v(" "),e("p",[A._v("Choose the invoice status to send ticket email receipts on. During testing, use the "),e("strong",[A._v("New")]),A._v(" invoice status, so that payment is not required to send emails. Once everything is setup correctly and working properly, choose a status like "),e("RouterLink",{attrs:{to:"/Invoices/"}},[A._v("Paid or Confirmed")]),A._v(".")],1),A._v(" "),e("figure",[e("img",{attrs:{src:t(640),alt:"SendEmailToCustomerEmail",title:"SendEmailToCustomerEmail"}})]),A._v(" "),e("p",[A._v("Select send email to the address registered on the BTCPay Invoice. Be sure that the refund email setting has not been "),e("RouterLink",{attrs:{to:"/FAQ/FAQ-Stores/#how-to-disable-email-on-invoices"}},[A._v("disabled")]),A._v(" in your BTCPay store, in order to prompt customers to provide their email before paying the invoice.")],1),A._v(" "),e("p",[A._v("Next supply the sending email address, email subject and email body. Note the highlighted line in the picture below, it uses http://goqr.me/api to create a QR code of the invoice payment which will be used as the event ticket inside the customer's receipt email.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(641),alt:"CustomerEmailBody",title:"CustomerEmailBody"}})]),A._v(" "),e("p",[A._v("After saving, there will be a recipe which has been generated by the preset. In the action group, there will be one email for the customer. Next, add a second email to notify the owner of the ticket sale. This is also important in case the customer provides an incorrect email, the event organizer will still receive their payment information.")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(642),alt:"EmployeeEmail",title:"EmployeeEmail"}})]),A._v(" "),e("p",[A._v("Add your second email account details, email subject and HTML email body. Note some of the purchase data you can insert into the event organizer email receipt. Press save.")]),A._v(" "),e("p",[A._v("Be sure to enable your recipe (checkbox).")]),A._v(" "),e("figure",[e("img",{attrs:{src:t(643),alt:"FinalRecipeView",title:"FinalRecipeView"}})]),A._v(" "),e("p",[A._v("Once the recipe is "),e("strong",[A._v("enabled")]),A._v(", start creating invoices in the BTCPay POS Ticket App and see the emails sent. Providing a valid email in the POS invoice creation process will send an event ticket email receipt to the customer and a payment email to the event organizer.")]),A._v(" "),e("p",[A._v("When the QR code contained in the customer email is scanned (with phone camera for example), it will lead to the BTCPay invoice page to verify the ticket at your event.")]),A._v(" "),e("p",[A._v("Below is a basic HTML email template that the customer would receive and a basic HTML email template that the event organizer would receive, with some invoice data from the time of purchase. Feel free to improve these demo "),e("a",{attrs:{href:"https://github.com/btcpayserver/btcTransmuter/tree/master/docs/templates",target:"_blank",rel:"noopener noreferrer"}},[A._v("templates"),e("OutboundLink")],1),A._v(".")]),A._v(" "),e("p",[e("img",{attrs:{src:t(644),alt:"ReceivedCustomerEmailBody",title:"ReceivedCustomerEmailBody"}}),A._v(" "),e("img",{attrs:{src:t(645),alt:"EmployeeEmailBody",title:"EmployeeEmailBody"}})])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/21.175cdbfd.js b/assets/js/21.c68c08fd.js similarity index 82% rename from assets/js/21.175cdbfd.js rename to assets/js/21.c68c08fd.js index b573e0573c..d554a0e356 100644 --- a/assets/js/21.175cdbfd.js +++ b/assets/js/21.c68c08fd.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{357:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep1.50bf607b.png"},358:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep1ssh.0dffbb41.png"},359:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep2.6445f876.png"},360:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep3.cbc1a6d5.png"},361:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep4.f508346c.png"},362:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep5.7241d979.png"},363:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep6.2a59c072.png"},364:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep7.03daf718.png"},365:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorDeploy1.47811ae2.png"},366:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorDeploy2.10af2275.png"},367:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorDeploy3.e7fd2183.png"},368:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorDeployManual.f79f2323.png"},776:function(t,e,o){"use strict";o.r(e);var r=o(17),a=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"deploy-btcpay-with-configurator"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#deploy-btcpay-with-configurator"}},[t._v("#")]),t._v(" Deploy BTCPay with Configurator")]),t._v(" "),e("p",[t._v("BTCPay Server can easily be configured and deployed to a server using Configurator. This tool makes deployment simple by allowing users to initialize or modify their BTCPay setup from the Configurator.")]),t._v(" "),e("p",[t._v("Configurator can be used to modify an existing BTCPay Server, from the admin account only. Other users may visit the server's Configurator url to deploy new BTCPay instances.")]),t._v(" "),e("p",[t._v("Someone such as a BTCPay third-party host may provide a Configurator instance for their users. This can help transition users to a self-hosted solution when they are ready to stop using the third-party host's server.")]),t._v(" "),e("p",[t._v("Another use-case is for server admins who are deploying BTCPay Server's on behalf of clients or other users as part of a consulting business. Admins can easily export a Docker deployment script from Configurator selections or deploy the configuration immediately to a VPS or on-premise server using SSH.")]),t._v(" "),e("h1",{attrs:{id:"how-to-set-up-configurator"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-set-up-configurator"}},[t._v("#")]),t._v(" How to set up Configurator")]),t._v(" "),e("h2",{attrs:{id:"option-1-add-as-an-external-service-to-btcpay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#option-1-add-as-an-external-service-to-btcpay"}},[t._v("#")]),t._v(" Option 1: Add as an external service to BTCPay")]),t._v(" "),e("p",[t._v("If you already have an existing BTCPay Server "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("deployed")]),t._v(" with the "),e("code",[t._v("opt-add-configurator")]),t._v(" "),e("a",{attrs:{href:"/FAQ/FAQ-Deployment#how-can-i-modify-or-deactivate-environment-variables"}},[t._v("environment variable added")]),t._v(", view your Configurator by navigating to:")],1),t._v(" "),e("p",[e("strong",[t._v("Server Settings > Services > Other external services > Configurator > Click See information")])]),t._v(" "),e("p",[t._v("Once enabled, non-admins may also view the Configurator at: "),e("code",[t._v("yourbtcpaydomain.com/configurator")]),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"option-2-build-locally-with-docker"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#option-2-build-locally-with-docker"}},[t._v("#")]),t._v(" Option 2: Build locally with Docker")]),t._v(" "),e("p",[t._v("If you have Docker installed on your machine, you can open a terminal and the run the following command to run Configurator inside of a Docker container to use on your local machine:")]),t._v(" "),e("p",[e("code",[t._v("docker run -p 1337:80 --name btcpayserver-configurator btcpayserver/btcpayserver-configurator")])]),t._v(" "),e("p",[t._v("Now you can open a browser tab and view your Configurator at "),e("strong",[t._v("localhost:1337")])]),t._v(" "),e("h1",{attrs:{id:"how-to-use-configurator"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use-configurator"}},[t._v("#")]),t._v(" How to use Configurator")]),t._v(" "),e("p",[t._v("Step 1: Destination")]),t._v(" "),e("p",[t._v("Select an option to deploy using SSH now or generate a bash script for later deployment.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(357),alt:"Select Deployment",title:"Select Deployment"}})]),t._v(" "),e("p",[t._v("To configure and deploy a server now, provide your SSH credentials where you would like it deployed to.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(358),alt:"Provide SSH Details",title:"Provide SSH Details"}})]),t._v(" "),e("p",[t._v('Note: The "Load Existing Settings" option will use the previous deployment\'s selections for faster configuration if you are modifying an existing installation.')]),t._v(" "),e("p",[t._v("Step 2: Domain")]),t._v(" "),e("p",[t._v("Provide the domain name associated with your server IP address.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(359),alt:"Provide Domain",title:"Provide Domain"}})]),t._v(" "),e("p",[t._v("Step 3: Chain")]),t._v(" "),e("p",[t._v("Select the desired Bitcoin network type, Bitcoin node pruning level and add any altcoins.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(360),alt:"Select Chain",title:"Select Chain"}})]),t._v(" "),e("p",[t._v("Step 4: Lightning")]),t._v(" "),e("p",[t._v("Select the desired Lightning network option (optional).")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(361),alt:"Lightning Options",title:"Lightning Options"}})]),t._v(" "),e("p",[t._v("Step 5: Additional")]),t._v(" "),e("p",[t._v("Add any additional services to your BTCPay Server deployment (optional).")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(362),alt:"Docker Options",title:"Docker Options"}})]),t._v(" "),e("p",[t._v("Step 6: Advanced")]),t._v(" "),e("p",[t._v("Provide any additional advanced settings (optional).")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(363),alt:"Advanced Settings",title:"Advanced Settings"}})]),t._v(" "),e("p",[t._v("Step 7: Summary")]),t._v(" "),e("p",[t._v("Verify your configuration settings look correct before deploying the server.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(364),alt:"Review Settings",title:"Review Settings"}})]),t._v(" "),e("p",[t._v("During Deployment:")]),t._v(" "),e("p",[t._v("Configurator will SSH into the target server and do the following actions completely automated on your behalf:")]),t._v(" "),e("ul",[e("li",[t._v("Install Docker")]),t._v(" "),e("li",[t._v("Install Docker-Compose")]),t._v(" "),e("li",[t._v("Install Git")]),t._v(" "),e("li",[t._v("Setup BTCPay settings")]),t._v(" "),e("li",[t._v("Make sure it starts at reboot via upstart or systemd")]),t._v(" "),e("li",[t._v("Add BTCPay utilities in /user/bin")]),t._v(" "),e("li",[t._v("Start BTCPay")])]),t._v(" "),e("p",[t._v("The deployment progress will be displayed in your Configurator.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(365),alt:"Wait for Deployment",title:"Wait for Deployment"}})]),t._v(" "),e("p",[t._v("Upon deployment completion, Configurator will display the domain of the newly configured BTCPay Server.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(366),alt:"Deployment Location",title:"Deployment Location"}})]),t._v(" "),e("p",[t._v("The list of executed commands that were used to deploy the server configuration are also displayed.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(367),alt:"Executed Commands",title:"Executed Commands"}})]),t._v(" "),e("h2",{attrs:{id:"export-manual-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#export-manual-configuration"}},[t._v("#")]),t._v(" Export Manual Configuration")]),t._v(" "),e("p",[t._v("If you want to deploy the configuration to your server at a later time, you can instead export a bash script of your settings. Later you can paste the configuration into your server terminal.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(368),alt:"Manual Script",title:"Manual Script"}})]),t._v(" "),e("h2",{attrs:{id:"privacy-security-concerns"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#privacy-security-concerns"}},[t._v("#")]),t._v(" Privacy & Security Concerns")]),t._v(" "),e("p",[t._v("If you are using someone else's Configurator to deploy your BTCPay Server, such as a "),e("RouterLink",{attrs:{to:"/ThirdPartyHosting/"}},[t._v("trusted Third-Party")]),t._v(", you will be providing them with your:")],1),t._v(" "),e("ul",[e("li",[t._v("server IP/domain and ssh password")]),t._v(" "),e("li",[t._v("server configuration settings")])]),t._v(" "),e("p",[t._v("Users are advised to change their SSH password after Configurator deployment is complete.")]),t._v(" "),e("p",[t._v("To mitigate these privacy and security concerns, use either the "),e("a",{attrs:{href:"#option-2-build-locally-with-Docker"}},[t._v("local deployment with Docker")]),t._v(" or the "),e("a",{attrs:{href:"#export-manual-configuration"}},[t._v("exported manual script")]),t._v(" without providing your domain. Be sure to include the domain when you paste the commands into your terminal.")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[21],{356:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep1.50bf607b.png"},357:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep1ssh.0dffbb41.png"},358:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep2.6445f876.png"},359:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep3.cbc1a6d5.png"},360:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep4.f508346c.png"},361:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep5.7241d979.png"},362:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep6.2a59c072.png"},363:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorStep7.03daf718.png"},364:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorDeploy1.47811ae2.png"},365:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorDeploy2.10af2275.png"},366:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorDeploy3.e7fd2183.png"},367:function(t,e,o){t.exports=o.p+"assets/img/ConfiguratorDeployManual.f79f2323.png"},774:function(t,e,o){"use strict";o.r(e);var r=o(17),a=Object(r.a)({},(function(){var t=this,e=t._self._c;return e("ContentSlotsDistributor",{attrs:{"slot-key":t.$parent.slotKey}},[e("h1",{attrs:{id:"deploy-btcpay-with-configurator"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#deploy-btcpay-with-configurator"}},[t._v("#")]),t._v(" Deploy BTCPay with Configurator")]),t._v(" "),e("p",[t._v("BTCPay Server can easily be configured and deployed to a server using Configurator. This tool makes deployment simple by allowing users to initialize or modify their BTCPay setup from the Configurator.")]),t._v(" "),e("p",[t._v("Configurator can be used to modify an existing BTCPay Server, from the admin account only. Other users may visit the server's Configurator url to deploy new BTCPay instances.")]),t._v(" "),e("p",[t._v("Someone such as a BTCPay third-party host may provide a Configurator instance for their users. This can help transition users to a self-hosted solution when they are ready to stop using the third-party host's server.")]),t._v(" "),e("p",[t._v("Another use-case is for server admins who are deploying BTCPay Server's on behalf of clients or other users as part of a consulting business. Admins can easily export a Docker deployment script from Configurator selections or deploy the configuration immediately to a VPS or on-premise server using SSH.")]),t._v(" "),e("h1",{attrs:{id:"how-to-set-up-configurator"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-set-up-configurator"}},[t._v("#")]),t._v(" How to set up Configurator")]),t._v(" "),e("h2",{attrs:{id:"option-1-add-as-an-external-service-to-btcpay"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#option-1-add-as-an-external-service-to-btcpay"}},[t._v("#")]),t._v(" Option 1: Add as an external service to BTCPay")]),t._v(" "),e("p",[t._v("If you already have an existing BTCPay Server "),e("RouterLink",{attrs:{to:"/Deployment/"}},[t._v("deployed")]),t._v(" with the "),e("code",[t._v("opt-add-configurator")]),t._v(" "),e("a",{attrs:{href:"/FAQ/FAQ-Deployment#how-can-i-modify-or-deactivate-environment-variables"}},[t._v("environment variable added")]),t._v(", view your Configurator by navigating to:")],1),t._v(" "),e("p",[e("strong",[t._v("Server Settings > Services > Other external services > Configurator > Click See information")])]),t._v(" "),e("p",[t._v("Once enabled, non-admins may also view the Configurator at: "),e("code",[t._v("yourbtcpaydomain.com/configurator")]),t._v(".")]),t._v(" "),e("h2",{attrs:{id:"option-2-build-locally-with-docker"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#option-2-build-locally-with-docker"}},[t._v("#")]),t._v(" Option 2: Build locally with Docker")]),t._v(" "),e("p",[t._v("If you have Docker installed on your machine, you can open a terminal and the run the following command to run Configurator inside of a Docker container to use on your local machine:")]),t._v(" "),e("p",[e("code",[t._v("docker run -p 1337:80 --name btcpayserver-configurator btcpayserver/btcpayserver-configurator")])]),t._v(" "),e("p",[t._v("Now you can open a browser tab and view your Configurator at "),e("strong",[t._v("localhost:1337")])]),t._v(" "),e("h1",{attrs:{id:"how-to-use-configurator"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-use-configurator"}},[t._v("#")]),t._v(" How to use Configurator")]),t._v(" "),e("p",[t._v("Step 1: Destination")]),t._v(" "),e("p",[t._v("Select an option to deploy using SSH now or generate a bash script for later deployment.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(356),alt:"Select Deployment",title:"Select Deployment"}})]),t._v(" "),e("p",[t._v("To configure and deploy a server now, provide your SSH credentials where you would like it deployed to.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(357),alt:"Provide SSH Details",title:"Provide SSH Details"}})]),t._v(" "),e("p",[t._v('Note: The "Load Existing Settings" option will use the previous deployment\'s selections for faster configuration if you are modifying an existing installation.')]),t._v(" "),e("p",[t._v("Step 2: Domain")]),t._v(" "),e("p",[t._v("Provide the domain name associated with your server IP address.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(358),alt:"Provide Domain",title:"Provide Domain"}})]),t._v(" "),e("p",[t._v("Step 3: Chain")]),t._v(" "),e("p",[t._v("Select the desired Bitcoin network type, Bitcoin node pruning level and add any altcoins.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(359),alt:"Select Chain",title:"Select Chain"}})]),t._v(" "),e("p",[t._v("Step 4: Lightning")]),t._v(" "),e("p",[t._v("Select the desired Lightning network option (optional).")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(360),alt:"Lightning Options",title:"Lightning Options"}})]),t._v(" "),e("p",[t._v("Step 5: Additional")]),t._v(" "),e("p",[t._v("Add any additional services to your BTCPay Server deployment (optional).")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(361),alt:"Docker Options",title:"Docker Options"}})]),t._v(" "),e("p",[t._v("Step 6: Advanced")]),t._v(" "),e("p",[t._v("Provide any additional advanced settings (optional).")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(362),alt:"Advanced Settings",title:"Advanced Settings"}})]),t._v(" "),e("p",[t._v("Step 7: Summary")]),t._v(" "),e("p",[t._v("Verify your configuration settings look correct before deploying the server.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(363),alt:"Review Settings",title:"Review Settings"}})]),t._v(" "),e("p",[t._v("During Deployment:")]),t._v(" "),e("p",[t._v("Configurator will SSH into the target server and do the following actions completely automated on your behalf:")]),t._v(" "),e("ul",[e("li",[t._v("Install Docker")]),t._v(" "),e("li",[t._v("Install Docker-Compose")]),t._v(" "),e("li",[t._v("Install Git")]),t._v(" "),e("li",[t._v("Setup BTCPay settings")]),t._v(" "),e("li",[t._v("Make sure it starts at reboot via upstart or systemd")]),t._v(" "),e("li",[t._v("Add BTCPay utilities in /user/bin")]),t._v(" "),e("li",[t._v("Start BTCPay")])]),t._v(" "),e("p",[t._v("The deployment progress will be displayed in your Configurator.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(364),alt:"Wait for Deployment",title:"Wait for Deployment"}})]),t._v(" "),e("p",[t._v("Upon deployment completion, Configurator will display the domain of the newly configured BTCPay Server.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(365),alt:"Deployment Location",title:"Deployment Location"}})]),t._v(" "),e("p",[t._v("The list of executed commands that were used to deploy the server configuration are also displayed.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(366),alt:"Executed Commands",title:"Executed Commands"}})]),t._v(" "),e("h2",{attrs:{id:"export-manual-configuration"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#export-manual-configuration"}},[t._v("#")]),t._v(" Export Manual Configuration")]),t._v(" "),e("p",[t._v("If you want to deploy the configuration to your server at a later time, you can instead export a bash script of your settings. Later you can paste the configuration into your server terminal.")]),t._v(" "),e("figure",[e("img",{attrs:{src:o(367),alt:"Manual Script",title:"Manual Script"}})]),t._v(" "),e("h2",{attrs:{id:"privacy-security-concerns"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#privacy-security-concerns"}},[t._v("#")]),t._v(" Privacy & Security Concerns")]),t._v(" "),e("p",[t._v("If you are using someone else's Configurator to deploy your BTCPay Server, such as a "),e("RouterLink",{attrs:{to:"/ThirdPartyHosting/"}},[t._v("trusted Third-Party")]),t._v(", you will be providing them with your:")],1),t._v(" "),e("ul",[e("li",[t._v("server IP/domain and ssh password")]),t._v(" "),e("li",[t._v("server configuration settings")])]),t._v(" "),e("p",[t._v("Users are advised to change their SSH password after Configurator deployment is complete.")]),t._v(" "),e("p",[t._v("To mitigate these privacy and security concerns, use either the "),e("a",{attrs:{href:"#option-2-build-locally-with-Docker"}},[t._v("local deployment with Docker")]),t._v(" or the "),e("a",{attrs:{href:"#export-manual-configuration"}},[t._v("exported manual script")]),t._v(" without providing your domain. Be sure to include the domain when you paste the commands into your terminal.")])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/22.7417d43d.js b/assets/js/22.c13a7bf1.js similarity index 80% rename from assets/js/22.7417d43d.js rename to assets/js/22.c13a7bf1.js index 00e343f9bd..63164b1c89 100644 --- a/assets/js/22.7417d43d.js +++ b/assets/js/22.c13a7bf1.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[22],{331:function(t,e,a){t.exports=a.p+"assets/img/BroadcastConfirm.fde15efd.png"},501:function(t,e,a){t.exports=a.p+"assets/img/1-store-created.617b1965.png"},502:function(t,e,a){t.exports=a.p+"assets/img/2-connect-wallet.1ace2dcb.png"},503:function(t,e,a){t.exports=a.p+"assets/img/3-choose-import-method.d4dbc1cd.png"},504:function(t,e,a){t.exports=a.p+"assets/img/4-vault-notif.2c298f47.png"},505:function(t,e,a){t.exports=a.p+"assets/img/5-address-type.bebe1cf2.png"},506:function(t,e,a){t.exports=a.p+"assets/img/6-pubkey-hww.30a1cab5.png"},507:function(t,e,a){t.exports=a.p+"assets/img/7-confirm-addresses.8735ed56.png"},508:function(t,e,a){t.exports=a.p+"assets/img/8-wallet-setup-complete.d955c440.png"},509:function(t,e,a){t.exports=a.p+"assets/img/9-send-btc.58dad487.png"},510:function(t,e,a){t.exports=a.p+"assets/img/10-choose-signing-method.843569ac.png"},511:function(t,e,a){t.exports=a.p+"assets/img/11-sign-transaction.69390a6b.png"},851: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(501),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(502),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(503),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(504),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(505),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(506),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(507),alt:"BTCPay Server Vault configuration",title:"BTCPay Server Vault configuration"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(508),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(509),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(510),alt:"Send Bitcoin via BTCPay Vault",title:"Send Bitcoin via BTCPay Vault"}})]),t._v(" "),e("figure",[e("img",{attrs:{src:a(511),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"},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 diff --git a/assets/js/23.306786fd.js b/assets/js/23.fcea8aa8.js similarity index 99% rename from assets/js/23.306786fd.js rename to assets/js/23.fcea8aa8.js index c516184afc..9427f443c6 100644 --- a/assets/js/23.306786fd.js +++ b/assets/js/23.fcea8aa8.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,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"},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"},889: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],{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,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"},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 diff --git a/assets/js/24.ee841795.js b/assets/js/24.3eabf55c.js similarity index 88% rename from assets/js/24.ee841795.js rename to assets/js/24.3eabf55c.js index 64dd10f201..68ac64b8bd 100644 --- a/assets/js/24.ee841795.js +++ b/assets/js/24.3eabf55c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[24],{648:function(e,t,o){e.exports=o.p+"assets/img/img_1.6bc7d880.png"},649:function(e,t,o){e.exports=o.p+"assets/img/img_2.9f8b0cc3.png"},650:function(e,t,o){e.exports=o.p+"assets/img/img_3.2595db17.png"},651:function(e,t,o){e.exports=o.p+"assets/img/coinselection.4c853f71.png"},652:function(e,t,o){e.exports=o.p+"assets/img/img.9710314c.png"},653:function(e,t,o){e.exports=o.p+"assets/img/img_4.c8000fea.png"},654:function(e,t,o){e.exports=o.p+"assets/img/scientist_mode.66645705.png"},655:function(e,t,o){e.exports=o.p+"assets/img/img_5.a8ef891b.png"},656:function(e,t,o){e.exports=o.p+"assets/img/img_6.745de6b7.png"},657:function(e,t,o){e.exports=o.p+"assets/img/img_7.0d3fb434.png"},658:function(e,t,o){e.exports=o.p+"assets/img/img_8.34595a5a.png"},659:function(e,t,o){e.exports=o.p+"assets/img/img_9.6da23178.png"},898: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(648),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(649),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(650),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(651),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(652),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(653),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(654),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(655),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(656),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(657),alt:"./img_7.png",title:"./img_7.png"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:o(658),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(659),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],{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 diff --git a/assets/js/27.7a573265.js b/assets/js/27.73ac3d93.js similarity index 86% rename from assets/js/27.7a573265.js rename to assets/js/27.73ac3d93.js index 4647de9acc..667f00bc0e 100644 --- a/assets/js/27.7a573265.js +++ b/assets/js/27.73ac3d93.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{513:function(e,t,a){e.exports=a.p+"assets/img/BTCPayInvoiceNinja.7c719a40.png"},514:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja1.0e516fad.png"},515:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja2.88829647.png"},516:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja3.dc5c485d.png"},517:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja4.2117b703.png"},518:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja5.ae71c87e.png"},519:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja6.49c81682.png"},520:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja7.267cea6e.png"},521:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja8.0b028207.png"},522:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja9.06f827a4.png"},853: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:"how-to-accept-bitcoin-payments-with-invoice-ninja"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-accept-bitcoin-payments-with-invoice-ninja"}},[e._v("#")]),e._v(" How to accept Bitcoin payments with Invoice Ninja?")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(513),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("p",[t("a",{attrs:{href:"http://invoiceninja.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Invoice Ninja"),t("OutboundLink")],1),e._v(" is a robust invoicing and billing software designed to help small businesses, freelancers, and entrepreneurs manage their invoices, payments, and clients. With its wide array of features, InvoiceNinja simplifies the billing process, allowing users to focus on growing their business.")]),e._v(" "),t("p",[e._v("The integration of "),t("a",{attrs:{href:"https://btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server"),t("OutboundLink")],1),e._v(" with Invoice Ninja enables you to accept bitcoin as a payment method, without fees, intermediaries with payments going directly to your bitcoin wallet.")]),e._v(" "),t("p",[e._v("This guide will walk you through the steps to configure and use your BTCPay Server with InvoiceNinja. BTCPay payment capabilities are directly integrated into InvoiceNinja. No plugins are needed.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/4oy-DCf6lhw/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=4oy-DCf6lhw",title:"Invoice Ninja","data-id":"4oy-DCf6lhw"}},[t("iframe",{attrs:{title:"Invoice Ninja","data-src":"https://www.youtube-nocookie.com/embed/4oy-DCf6lhw?&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("InvoiceNinja (hosted or self-hosted)")]),e._v(" "),t("li",[e._v("BTCPay Server ("),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or hosted by a "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third-party provider")]),e._v(")")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("Created store")]),e._v(" on BTCPay Server")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("Connected wallet")]),e._v(" on BTCPay Server")],1)]),e._v(" "),t("h2",{attrs:{id:"1-payment-gateway-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-payment-gateway-configuration"}},[e._v("#")]),e._v(" 1. Payment Gateway configuration")]),e._v(" "),t("p",[e._v("To configure BTCPay in Invoice Ninja, follow these steps:")]),e._v(" "),t("ol",[t("li",[e._v("Log in to the Invoice Ninja Admin Portal:")]),e._v(" "),t("li",[e._v("Go to the Settings > "),t("strong",[e._v("Payment Settings")])]),e._v(" "),t("li",[e._v("In the top right corner, click on the "),t("strong",[e._v("Add payment gateway")])]),e._v(" "),t("li",[e._v("Scroll through the dropdown menu and click "),t("strong",[e._v("BTCPay")])]),e._v(" "),t("li",[e._v("Next, you’ll see the BTCPay configuration page. It’s important that "),t("strong",[e._v("before adding any data")]),e._v(" in the credential fields, "),t("strong",[e._v("you click Save, to create a payment gateway")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(514),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:a(515),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("p",[e._v("Once we created a payment gateway, let’s proceed to step 2, and pair our BTCPay Server with Invoice Ninja.")]),e._v(" "),t("h2",{attrs:{id:"2-pairing-your-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-pairing-your-btcpay-server"}},[e._v("#")]),e._v(" 2. Pairing your BTCPay Server")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(516),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("h3",{attrs:{id:"21-btcpay-url"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-btcpay-url"}},[e._v("#")]),e._v(" 2.1 BTCPay URL")]),e._v(" "),t("p",[e._v("In the BTCPay URL field of your, 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(".\n"),t("em",[e._v("For example; https://mainnet.demo.btcpayserver.org")])]),e._v(" "),t("h3",{attrs:{id:"22-btcpay-store-id"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-btcpay-store-id"}},[e._v("#")]),e._v(" 2.2 BTCPay Store ID")]),e._v(" "),t("p",[e._v("BTCPay Store ID can be obtained from your BTCPay Server, in "),t("strong",[e._v("Store Settings > General > Store ID")]),e._v(" field. Copy it and paste it over in the BTCPay Store ID field.")]),e._v(" "),t("h3",{attrs:{id:"23-generating-the-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#23-generating-the-api-key"}},[e._v("#")]),e._v(" 2.3 Generating the API key")]),e._v(" "),t("p",[e._v("To create the BTCPay API key, click on the Account located at the bottom of the sidebar.")]),e._v(" "),t("ol",[t("li",[e._v("Click on the "),t("strong",[e._v("Manage Account > API Key")]),e._v(".")]),e._v(" "),t("li",[e._v("Click on the "),t("strong",[e._v("Generate API")]),e._v(" key button")]),e._v(" "),t("li",[e._v("Click on the checkboxes and enable the following permissions:\n"),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")])])]),e._v(" "),t("li",[e._v("Optionally, if you have multiple BTCPay Stores, you can select a store to which permissions apply")]),e._v(" "),t("li",[t("strong",[e._v("Reveal and copy the API key")]),e._v(" by and "),t("strong",[e._v("paste")]),e._v(" it over in the Invoice Ninja in the API Key field.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(517),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:a(518),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("h3",{attrs:{id:"24-generating-the-webhook"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#24-generating-the-webhook"}},[e._v("#")]),e._v(" 2.4 Generating the webhook")]),e._v(" "),t("ol",[t("li",[e._v("In your InvoiceNinja, under your "),t("strong",[e._v("Payment Settings > Edit Payment Gateway,")]),e._v(" click on the "),t("strong",[e._v("Payment Gateway")]),e._v(" tab, and copy the "),t("strong",[e._v("Webhook URL")]),e._v('"')]),e._v(" "),t("li",[e._v("Next, go to your BTCPay Server Store Settings > "),t("strong",[e._v("Webhooks")])]),e._v(" "),t("li",[e._v("Click on the "),t("strong",[e._v("Create Webhook")]),e._v(" button")]),e._v(" "),t("li",[e._v("Paste the Webhook URL you copied from InvoiceNinja (step 1) into "),t("strong",[e._v("Payload URL")]),e._v(" field")]),e._v(" "),t("li",[e._v('Click on the "Eye" icon next to the Secret field to reveal the secret key and copy it.')]),e._v(" "),t("li",[e._v("Don't forget to click on the Add webhook to apply all the changes.")]),e._v(" "),t("li",[e._v("Go back InvoiceNinja and paste the Secret Key into the Webhook Secret field")]),e._v(" "),t("li",[e._v("Click "),t("strong",[e._v("Save")]),e._v(" to apply all the changes")])]),e._v(" "),t("p",[t("em",[e._v('In the"Settings" and "Limits/Fees" tab, you can set other options, common to other InvoiceNinja payment systems.')])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(519),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("h3",{attrs:{id:"3-enable-crypto-payment-method"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-enable-crypto-payment-method"}},[e._v("#")]),e._v(" 3. Enable Crypto payment method")]),e._v(" "),t("p",[e._v("Once everything is set up, don’t forget to enable the Crypto payment option from the Payment Gateway Settings tab, and click save.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(520),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("p",[e._v("Now you are all set! Feel free to generate invoices for your clients and get paid in Bitcoin.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(521),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:a(522),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[27],{502:function(e,t,a){e.exports=a.p+"assets/img/BTCPayInvoiceNinja.7c719a40.png"},503:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja1.0e516fad.png"},504:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja2.88829647.png"},505:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja3.dc5c485d.png"},506:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja4.2117b703.png"},507:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja5.ae71c87e.png"},508:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja6.49c81682.png"},509:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja7.267cea6e.png"},510:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja8.0b028207.png"},511:function(e,t,a){e.exports=a.p+"assets/img/InvoiceNinja9.06f827a4.png"},852: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:"how-to-accept-bitcoin-payments-with-invoice-ninja"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#how-to-accept-bitcoin-payments-with-invoice-ninja"}},[e._v("#")]),e._v(" How to accept Bitcoin payments with Invoice Ninja?")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(502),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("p",[t("a",{attrs:{href:"http://invoiceninja.com",target:"_blank",rel:"noopener noreferrer"}},[e._v("Invoice Ninja"),t("OutboundLink")],1),e._v(" is a robust invoicing and billing software designed to help small businesses, freelancers, and entrepreneurs manage their invoices, payments, and clients. With its wide array of features, InvoiceNinja simplifies the billing process, allowing users to focus on growing their business.")]),e._v(" "),t("p",[e._v("The integration of "),t("a",{attrs:{href:"https://btcpayserver.org",target:"_blank",rel:"noopener noreferrer"}},[e._v("BTCPay Server"),t("OutboundLink")],1),e._v(" with Invoice Ninja enables you to accept bitcoin as a payment method, without fees, intermediaries with payments going directly to your bitcoin wallet.")]),e._v(" "),t("p",[e._v("This guide will walk you through the steps to configure and use your BTCPay Server with InvoiceNinja. BTCPay payment capabilities are directly integrated into InvoiceNinja. No plugins are needed.")]),e._v(" "),t("a",{staticClass:"ytEmbed",staticStyle:{"background-image":"url(https://img.youtube.com/vi/4oy-DCf6lhw/hqdefault.jpg)"},attrs:{href:"https://www.youtube.com/watch?v=4oy-DCf6lhw",title:"Invoice Ninja","data-id":"4oy-DCf6lhw"}},[t("iframe",{attrs:{title:"Invoice Ninja","data-src":"https://www.youtube-nocookie.com/embed/4oy-DCf6lhw?&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("InvoiceNinja (hosted or self-hosted)")]),e._v(" "),t("li",[e._v("BTCPay Server ("),t("RouterLink",{attrs:{to:"/Deployment/"}},[e._v("self-hosted")]),e._v(" or hosted by a "),t("RouterLink",{attrs:{to:"/Deployment/ThirdPartyHosting/"}},[e._v("third-party provider")]),e._v(")")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/CreateStore/"}},[e._v("Created store")]),e._v(" on BTCPay Server")],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WalletSetup/"}},[e._v("Connected wallet")]),e._v(" on BTCPay Server")],1)]),e._v(" "),t("h2",{attrs:{id:"1-payment-gateway-configuration"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#1-payment-gateway-configuration"}},[e._v("#")]),e._v(" 1. Payment Gateway configuration")]),e._v(" "),t("p",[e._v("To configure BTCPay in Invoice Ninja, follow these steps:")]),e._v(" "),t("ol",[t("li",[e._v("Log in to the Invoice Ninja Admin Portal:")]),e._v(" "),t("li",[e._v("Go to the Settings > "),t("strong",[e._v("Payment Settings")])]),e._v(" "),t("li",[e._v("In the top right corner, click on the "),t("strong",[e._v("Add payment gateway")])]),e._v(" "),t("li",[e._v("Scroll through the dropdown menu and click "),t("strong",[e._v("BTCPay")])]),e._v(" "),t("li",[e._v("Next, you’ll see the BTCPay configuration page. It’s important that "),t("strong",[e._v("before adding any data")]),e._v(" in the credential fields, "),t("strong",[e._v("you click Save, to create a payment gateway")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(503),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:a(504),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("p",[e._v("Once we created a payment gateway, let’s proceed to step 2, and pair our BTCPay Server with Invoice Ninja.")]),e._v(" "),t("h2",{attrs:{id:"2-pairing-your-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#2-pairing-your-btcpay-server"}},[e._v("#")]),e._v(" 2. Pairing your BTCPay Server")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(505),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("h3",{attrs:{id:"21-btcpay-url"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#21-btcpay-url"}},[e._v("#")]),e._v(" 2.1 BTCPay URL")]),e._v(" "),t("p",[e._v("In the BTCPay URL field of your, 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(".\n"),t("em",[e._v("For example; https://mainnet.demo.btcpayserver.org")])]),e._v(" "),t("h3",{attrs:{id:"22-btcpay-store-id"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#22-btcpay-store-id"}},[e._v("#")]),e._v(" 2.2 BTCPay Store ID")]),e._v(" "),t("p",[e._v("BTCPay Store ID can be obtained from your BTCPay Server, in "),t("strong",[e._v("Store Settings > General > Store ID")]),e._v(" field. Copy it and paste it over in the BTCPay Store ID field.")]),e._v(" "),t("h3",{attrs:{id:"23-generating-the-api-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#23-generating-the-api-key"}},[e._v("#")]),e._v(" 2.3 Generating the API key")]),e._v(" "),t("p",[e._v("To create the BTCPay API key, click on the Account located at the bottom of the sidebar.")]),e._v(" "),t("ol",[t("li",[e._v("Click on the "),t("strong",[e._v("Manage Account > API Key")]),e._v(".")]),e._v(" "),t("li",[e._v("Click on the "),t("strong",[e._v("Generate API")]),e._v(" key button")]),e._v(" "),t("li",[e._v("Click on the checkboxes and enable the following permissions:\n"),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")])])]),e._v(" "),t("li",[e._v("Optionally, if you have multiple BTCPay Stores, you can select a store to which permissions apply")]),e._v(" "),t("li",[t("strong",[e._v("Reveal and copy the API key")]),e._v(" by and "),t("strong",[e._v("paste")]),e._v(" it over in the Invoice Ninja in the API Key field.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(506),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:a(507),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("h3",{attrs:{id:"24-generating-the-webhook"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#24-generating-the-webhook"}},[e._v("#")]),e._v(" 2.4 Generating the webhook")]),e._v(" "),t("ol",[t("li",[e._v("In your InvoiceNinja, under your "),t("strong",[e._v("Payment Settings > Edit Payment Gateway,")]),e._v(" click on the "),t("strong",[e._v("Payment Gateway")]),e._v(" tab, and copy the "),t("strong",[e._v("Webhook URL")]),e._v('"')]),e._v(" "),t("li",[e._v("Next, go to your BTCPay Server Store Settings > "),t("strong",[e._v("Webhooks")])]),e._v(" "),t("li",[e._v("Click on the "),t("strong",[e._v("Create Webhook")]),e._v(" button")]),e._v(" "),t("li",[e._v("Paste the Webhook URL you copied from InvoiceNinja (step 1) into "),t("strong",[e._v("Payload URL")]),e._v(" field")]),e._v(" "),t("li",[e._v('Click on the "Eye" icon next to the Secret field to reveal the secret key and copy it.')]),e._v(" "),t("li",[e._v("Don't forget to click on the Add webhook to apply all the changes.")]),e._v(" "),t("li",[e._v("Go back InvoiceNinja and paste the Secret Key into the Webhook Secret field")]),e._v(" "),t("li",[e._v("Click "),t("strong",[e._v("Save")]),e._v(" to apply all the changes")])]),e._v(" "),t("p",[t("em",[e._v('In the"Settings" and "Limits/Fees" tab, you can set other options, common to other InvoiceNinja payment systems.')])]),e._v(" "),t("figure",[t("img",{attrs:{src:a(508),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("h3",{attrs:{id:"3-enable-crypto-payment-method"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#3-enable-crypto-payment-method"}},[e._v("#")]),e._v(" 3. Enable Crypto payment method")]),e._v(" "),t("p",[e._v("Once everything is set up, don’t forget to enable the Crypto payment option from the Payment Gateway Settings tab, and click save.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(509),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("p",[e._v("Now you are all set! Feel free to generate invoices for your clients and get paid in Bitcoin.")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(510),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:a(511),alt:"BTCPay Server Invoice",title:"BTCPay Server Invoice"}})])])}),[],!1,null,null,null);t.default=o.exports}}]); \ No newline at end of file diff --git a/assets/js/29.4f814518.js b/assets/js/29.5a61b42a.js similarity index 75% rename from assets/js/29.4f814518.js rename to assets/js/29.5a61b42a.js index d6d4d2ed26..1b16aac016 100644 --- a/assets/js/29.4f814518.js +++ b/assets/js/29.5a61b42a.js @@ -1 +1 @@ -(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 +(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 diff --git a/assets/js/37.433ff2dc.js b/assets/js/37.12b78be2.js similarity index 99% rename from assets/js/37.433ff2dc.js rename to assets/js/37.12b78be2.js index 5716efdcd4..38bf66870f 100644 --- a/assets/js/37.433ff2dc.js +++ b/assets/js/37.12b78be2.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{369:function(e,t,o){e.exports=o.p+"assets/img/docker-compose-up-dev.82514a01.png"},370:function(e,t,o){e.exports=o.p+"assets/img/vs-solution-explorer.71213904.png"},371:function(e,t,o){e.exports=o.p+"assets/img/vs-debug-console.9b8e7386.png"},372:function(e,t,o){e.exports=o.p+"assets/img/dashboard-change.d3ce411b.jpg"},373:function(e,t){e.exports="data:image/png;base64,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"},374:function(e,t,o){e.exports=o.p+"assets/img/DB-Connect.f1650039.png"},375:function(e,t,o){e.exports=o.p+"assets/img/DB-Edit.54e91f2d.png"},778: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:"setup-developer-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-developer-environment"}},[e._v("#")]),e._v(" Setup Developer Environment")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#developer-resources"}},[e._v("Developer Resources")])]),t("li",[t("a",{attrs:{href:"#windows-setup-software"}},[e._v("Windows Setup Software")])]),t("li",[t("a",{attrs:{href:"#git-setup"}},[e._v("Git Setup")]),t("ul",[t("li",[t("a",{attrs:{href:"#fork-btcpay-server-repository"}},[e._v("Fork BTCPay Server Repository")])]),t("li",[t("a",{attrs:{href:"#clone-btcpay-server-repository"}},[e._v("Clone BTCPay Server Repository")])]),t("li",[t("a",{attrs:{href:"#create-a-development-feature-branch"}},[e._v("Create a Development Feature Branch")])])])]),t("li",[t("a",{attrs:{href:"#local-btcpay-setup"}},[e._v("Local BTCPay Setup")]),t("ul",[t("li",[t("a",{attrs:{href:"#bitcoin-regtest-network-setup"}},[e._v("Bitcoin Regtest Network Setup")])]),t("li",[t("a",{attrs:{href:"#build-local-btcpay-server-in-browser-mode"}},[e._v("Build Local BTCPay Server in Browser Mode")])]),t("li",[t("a",{attrs:{href:"#visual-studio-setup"}},[e._v("Visual Studio Setup")])]),t("li",[t("a",{attrs:{href:"#build-local-btcpay-server-in-debug-mode"}},[e._v("Build Local BTCPay Server in Debug Mode")])]),t("li",[t("a",{attrs:{href:"#visual-studio-code-changes-in-your-local-btcpay-server"}},[e._v("Visual Studio Code Changes In Your Local BTCPay Server")])])])]),t("li",[t("a",{attrs:{href:"#git-maintenance"}},[e._v("Git Maintenance")]),t("ul",[t("li",[t("a",{attrs:{href:"#sync-forked-btcpay-server-repository"}},[e._v("Sync Forked BTCPay Server Repository")])]),t("li",[t("a",{attrs:{href:"#commit-code-to-make-pull-request"}},[e._v("Commit Code To Make Pull Request")])]),t("li",[t("a",{attrs:{href:"#create-a-branch-of-a-pull-request"}},[e._v("Create a Branch of a Pull Request")])]),t("li",[t("a",{attrs:{href:"#delete-local-branch"}},[e._v("Delete Local Branch")])])])]),t("li",[t("a",{attrs:{href:"#working-with-docker-containers"}},[e._v("Working with Docker Containers")])]),t("li",[t("a",{attrs:{href:"#greenfield-api-development"}},[e._v("Greenfield API Development")])]),t("li",[t("a",{attrs:{href:"#working-with-the-database"}},[e._v("Working with the Database")])]),t("li",[t("a",{attrs:{href:"#questions"}},[e._v("Questions")])])])]),t("p"),e._v(" "),t("p",[e._v("This guide will help you set up your developer environment to prepare you for later contributions to the BTCPay Server repositories. A variety of beginner tools are used in the guide below to help you get started with development. Once you understand the general setup process, feel free to use any tools that you like.")]),e._v(" "),t("p",[e._v("If you are looking for how to make a simple code change such as fixing a typo or copy change, check out the simplified "),t("RouterLink",{attrs:{to:"/Contribute/WriteSoftware/"}},[e._v("Write Software")]),e._v(" tutorial instead. If you are an advanced developer with a local environment already set up for development, you can skip ahead to the "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("LocalDevelopment")]),e._v(" documentation.")],1),e._v(" "),t("h2",{attrs:{id:"developer-resources"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#developer-resources"}},[e._v("#")]),e._v(" Developer Resources")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://docs.github.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github Docs"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("BTCPay Commands and Concepts")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/#videos"}},[e._v("Environment Setup Videos (Linux, Mac, Windows)")])],1)]),e._v(" "),t("h2",{attrs:{id:"windows-setup-software"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#windows-setup-software"}},[e._v("#")]),e._v(" Windows Setup Software")]),e._v(" "),t("p",[e._v("Software to install to follow this guide:")]),e._v(" "),t("ol",[t("li",[t("a",{attrs:{href:"https://visualstudio.microsoft.com/downloads/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Visual Studio Community Edition"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/8.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET Core SDK 8.0+"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.docker.com/products/docker-desktop",target:"_blank",rel:"noopener noreferrer"}},[e._v("Docker Desktop"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("PowerShell (included in Windows OS)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://gitforwindows.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitBash"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://desktop.github.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Desktop"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("www.Github.com account"),t("OutboundLink")],1),e._v(" (sign up)")])]),e._v(" "),t("p",[e._v("Note: "),t("em",[e._v("This guide assumes installations in default locations. Take note if you have a different file directory structure.")])]),e._v(" "),t("h2",{attrs:{id:"git-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#git-setup"}},[e._v("#")]),e._v(" Git Setup")]),e._v(" "),t("h3",{attrs:{id:"fork-btcpay-server-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fork-btcpay-server-repository"}},[e._v("#")]),e._v(" Fork BTCPay Server Repository")]),e._v(" "),t("ul",[t("li",[e._v("Open a web browser and login to your www.Github.com account.")]),e._v(" "),t("li",[e._v("Navigate to 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 press the "),t("code",[e._v("Fork")]),e._v(" button to create your own copy of the BTCPay Server repository on Github.")]),e._v(" "),t("li",[e._v("Next open Github Desktop and login so that Github Desktop knows about your www.Github.com account and connects to it.")])]),e._v(" "),t("h3",{attrs:{id:"clone-btcpay-server-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clone-btcpay-server-repository"}},[e._v("#")]),e._v(" Clone BTCPay Server Repository")]),e._v(" "),t("ul",[t("li",[e._v("In GitHub Desktop, use the "),t("code",[e._v("Add")]),e._v(" button and see the option clone repository.")]),e._v(" "),t("li",[e._v("If you are using your www.Github.com credentials in GitHub Desktop, you will see your BTCPay Server repository that you just forked on www.Github.com. Select it and take note of the local path shown below. (by default it will be something like "),t("code",[e._v("C:\\Users\\SatoshisComputer\\Documents\\GitHub\\btcpayserver")]),e._v(" for clarity, lets call it our: "),t("em",[e._v("clone local path")]),e._v(") then press clone.")]),e._v(" "),t("li",[e._v("Now you will see the BTCPay Server repository has been cloned in your GitHub Desktop and you will be on the "),t("em",[e._v("master branch")]),e._v(".")])]),e._v(" "),t("h3",{attrs:{id:"create-a-development-feature-branch"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-development-feature-branch"}},[e._v("#")]),e._v(" Create a Development Feature Branch")]),e._v(" "),t("ul",[t("li",[e._v("Next we will practice working with our BTCPay Server repository that we just cloned to our computer using Github Desktop.")]),e._v(" "),t("li",[e._v("When developing, you may want to work on different features at once. To do that, we typically want to create multiple feature branches instead of making all changes to the master branch.")]),e._v(" "),t("li",[e._v("We're using GitBash and some Git commands, so open GitBash. (If you prefer to only use GitHub desktop instead of GitBash, you can create branches there instead.)")]),e._v(" "),t("li",[e._v("Once you have a GitBash terminal open, we need to change directory to our clone of BTCPay Server repository.")]),e._v(" "),t("li",[e._v("To do this, navigate to our "),t("em",[e._v("clone local path")]),e._v(" with the change directory command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")])]),e._v(" "),t("li",[e._v("You can see your clone of BTCPay Server is on the branch called "),t("code",[e._v("master")])]),e._v(" "),t("li",[e._v("Make a copy of your master branch to do some development on it, with the command: "),t("code",[e._v("$ git branch OurNewDevelopmentBranch")])]),e._v(" "),t("li",[e._v("Let's view all the branches we have now, with the command: "),t("code",[e._v("$ git branch")]),e._v(" you can see we have master and OurNewDevelopmentBranch")]),e._v(" "),t("li",[e._v("In Git, we now have a copy of our forked BTCPay Server repository (our clone). When we want to switch between branches (copies of our clone), we need to tell Git which branch our development code changes should be assigned to. We do this by checking out our branch, with the command: "),t("code",[e._v("$ git checkout OurNewDevelopmentBranch")])]),e._v(" "),t("li",[e._v("Now you are on OurNewDevelopmentBranch in GitBash.")]),e._v(" "),t("li",[e._v("Open your GitHub Desktop and you can see you are no longer on master and you are now on "),t("code",[e._v("OurNewDevelopmentBranch")])]),e._v(" "),t("li",[e._v("In the top menu in Github Desktop click: "),t("code",[e._v("Repository > Show In Explorer")]),e._v(" to see the location of the files.")])]),e._v(" "),t("h2",{attrs:{id:"local-btcpay-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-btcpay-setup"}},[e._v("#")]),e._v(" Local BTCPay Setup")]),e._v(" "),t("h3",{attrs:{id:"bitcoin-regtest-network-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-regtest-network-setup"}},[e._v("#")]),e._v(" Bitcoin Regtest Network Setup")]),e._v(" "),t("ul",[t("li",[e._v("For the next step make sure that you have Docker-Compose installed (included with Docker Desktop). Open a PowerShell terminal and navigate to your "),t("em",[e._v("clone local path")]),e._v(" and into the BTCPayServer.Tests directory with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver/BTCPayServer.Tests")])]),e._v(" "),t("li",[e._v("The BTCPay Server.Tests project contains the docker files needed to run our docker commands that will start all the project dependencies and create a local Regtest network.")]),e._v(" "),t("li",[e._v("In Powershell, start the docker services with the command: "),t("code",[e._v("docker-compose up dev")]),e._v("(you must be in the BTCPay Server.Tests to run this command).")]),e._v(" "),t("li",[e._v("In your PowerShell terminal you will first see the necessary docker images being pulled, then containers being built. If the build is successful the containers will all show as done.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(369),alt:"BTCPayServer.Tests powershell terminal",title:"BTCPayServer.Tests powershell terminal"}})]),e._v(" "),t("h3",{attrs:{id:"build-local-btcpay-server-in-browser-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-local-btcpay-server-in-browser-mode"}},[e._v("#")]),e._v(" Build Local BTCPay Server in Browser Mode")]),e._v(" "),t("p",[e._v("If you don't want to do any coding and you simply want to create a local BTCPay Server for testing features in the interface, you can start a local BTCPay from the command line.")]),e._v(" "),t("p",[e._v("After building your "),t("a",{attrs:{href:"#bitcoin-regtest-network-setup"}},[e._v("regtest network")]),e._v(", navigate to your "),t("code",[e._v("btcpayserver\\BTCPayServer")]),e._v(" directory and run the following command:")]),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("p",[e._v("Open a new browser and visit: "),t("a",{attrs:{href:"http://127.0.0.1:14142",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://127.0.0.1:14142"),t("OutboundLink")],1)]),e._v(" "),t("h3",{attrs:{id:"visual-studio-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#visual-studio-setup"}},[e._v("#")]),e._v(" Visual Studio Setup")]),e._v(" "),t("ul",[t("li",[e._v("Open a file explorer to the BTCPay Server repository folder. Without opening any of the folders shown, look for the "),t("code",[e._v("btcpayserver.sln")]),e._v(" item and right click it to "),t("code",[e._v("Open with > Visual Studio")]),e._v(". You may need to choose Open with > Choose another app ... and look for Visual Studio if you have never opened this kind of file before.")]),e._v(" "),t("li",[e._v("To get your Visual Studio set up choose "),t("code",[e._v("View > Solution Explorer")]),e._v(" from the top menu. In this solution explorer you will see all the BTCPay Server files and folders.")]),e._v(" "),t("li",[e._v("The top project is BTCPay Server, make sure it's in bold. If it isn't, right click it and choose Set as StartUp Project.")]),e._v(" "),t("li",[e._v("Your Visual Studio is now set up and ready.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(370),alt:"VS Solution Explorer",title:"VS Solution Explorer"}})]),e._v(" "),t("h3",{attrs:{id:"build-local-btcpay-server-in-debug-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-local-btcpay-server-in-debug-mode"}},[e._v("#")]),e._v(" Build Local BTCPay Server in Debug Mode")]),e._v(" "),t("ul",[t("li",[e._v("Back in Visual Studio, click: "),t("code",[e._v("Build > Build Solution")])]),e._v(" "),t("li",[e._v("In the output window, a successful build will look something like this: "),t("code",[e._v("========== Build: 6 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========")])]),e._v(" "),t("li",[e._v("Next press "),t("code",[e._v("Debug > Start Debugging")])]),e._v(" "),t("li",[e._v("First a Visual Studio debug console will open which shows information about the status of your local BTCPay Server.")]),e._v(" "),t("li",[e._v("Next a local BTCPay Server will be created in a web browser, showing on the home page that it's in "),t("code",[e._v("REGTEST")]),e._v(" mode.")]),e._v(" "),t("li",[e._v("You now will have three windows to view: BTCPay Server browser session, our Visual Studio debug console and our BTCPay Server.Tests powershell terminal.")]),e._v(" "),t("li",[e._v("Register a new user in your BTCPay Server and see the registration event is shown in your Visual Studio debug console.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(371),alt:"VS Debug Console",title:"VS Debug Console"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:o(372),alt:"Local Regtest BTCPay",title:"Local Regtest BTCPay"}})]),e._v(" "),t("h3",{attrs:{id:"visual-studio-code-changes-in-your-local-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#visual-studio-code-changes-in-your-local-btcpay-server"}},[e._v("#")]),e._v(" Visual Studio Code Changes In Your Local BTCPay Server")]),e._v(" "),t("ul",[t("li",[e._v("Make changes to code in Visual Studio (Ex: modify the "),t("code",[e._v("This store is ready to accept transactions, good job!")]),e._v(" text in the "),t("code",[e._v("~\\BTCPayServer\\Views\\UIStores\\Dashboard.cshtml")]),e._v(" file)")]),e._v(" "),t("li",[e._v("Refresh the page to see your text changes on the home page.")]),e._v(" "),t("li",[e._v("Some code changes require re-start of Debugging for changes to take effect.")]),e._v(" "),t("li",[e._v("Add breakpoints in Visual Studio and see those breakpoints get hit when you try to use a feature in your local BTCPay Server instance.")])]),e._v(" "),t("h2",{attrs:{id:"git-maintenance"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#git-maintenance"}},[e._v("#")]),e._v(" Git Maintenance")]),e._v(" "),t("h3",{attrs:{id:"sync-forked-btcpay-server-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sync-forked-btcpay-server-repository"}},[e._v("#")]),e._v(" Sync Forked BTCPay Server Repository")]),e._v(" "),t("ul",[t("li",[e._v("With many contributors adding code changes to the Master BTCPay Server Repository, sometimes your forked copy can fall behind, unless you merge new changes into your fork.")]),e._v(" "),t("li",[e._v("If you go to your Fork of BTCPay Server on www.Github.com you will see a message saying that your branch is behind by some commits. Example: "),t("code",[e._v("This branch is 32 commits behind btcpayserver:master")]),e._v(".")]),e._v(" "),t("li",[e._v("To update, you can use GitBash or simply use Github Desktop by clicking through the synchronization prompts.")]),e._v(" "),t("li",[e._v("Open a GitBash terminal and update your BTCPay Server repository with the following commands.")]),e._v(" "),t("li",[e._v("First always navigate to your "),t("em",[e._v("clone local path")]),e._v(" with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")]),e._v(" and make sure you are on "),t("code",[e._v("master")]),e._v(" branch.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" fetch upstream\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" merge upstream/master\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 operator"}},[e._v("<")]),e._v("SomeCommitMessage"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n\nMessage prompt: "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".your branch is ahead of origin master by "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"X"')]),e._v(" commits"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(". use "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push to publish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\n\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(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push origin master\n")])])]),t("p",[e._v("If you see an error "),t("code",[e._v("fatal: 'upstream' does not appear to be a git repository")]),e._v(" when running "),t("code",[e._v("$ git fetch upstream")]),e._v(", you must first configure a remote that points to the upstream repository in Git. That is needed only once. Just run the following command while you are in your "),t("em",[e._v("clone local path")]),e._v(" .")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" remote "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" upstream https://github.com/btcpayserver/btcpayserver.git\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# check if the upstream repo is added succesfully")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" remote "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-v")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# you should see something like this:")]),e._v("\norigin\tYOUR_FORKED_GITHUB_REPO "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("fetch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\norigin\tYOUR_FORKED_GITHUB_REPO "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("push"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nupstream\thttps://github.com/btcpayserver/btcpayserver.git "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("fetch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nupstream\thttps://github.com/btcpayserver/btcpayserver.git "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("push"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("h3",{attrs:{id:"commit-code-to-make-pull-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#commit-code-to-make-pull-request"}},[e._v("#")]),e._v(" Commit Code To Make Pull Request")]),e._v(" "),t("ul",[t("li",[e._v("After you have made some code changes on a feature branch (Example: A feature branch called "),t("code",[e._v("Fix/BugBranch")]),e._v(") and you want to make a Pull Request to the BTCPay Server Repository. Open a GitBash terminal and navigate to your "),t("em",[e._v("clone local path")]),e._v(" with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")]),e._v(" and make sure you are on the "),t("strong",[e._v("correct branch")]),e._v(" that you want to commit and use git status to check the files changed are the ones you want to commit.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" status\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(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" commit\n\nText Editor appears to "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" your commit message"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\nExample Commit Message: Fix bug "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("for")]),e._v(" update button\n\nAccept Changes: Ctrl + x\nSave Changes: Shift + y\nClose Editor with: Enter\n\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push origin Fix/BugBranch\n")])])]),t("p",[e._v("See your new branch has been created on you www.Github.com BTCPay Server Fork, review changes and create Pull Request.")]),e._v(" "),t("h3",{attrs:{id:"create-a-branch-of-a-pull-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-branch-of-a-pull-request"}},[e._v("#")]),e._v(" Create a Branch of a Pull Request")]),e._v(" "),t("p",[e._v("A great way to contribute without having to be an advanced developer is by testing other contributor's pull requests. Manual testing is a great way to help other's and ensure that BTCPay Server code changes are working properly. Here is an example of how to make a branch of someone else's pull request, using this previous PoS Pull Request https://github.com/btcpayserver/btcpayserver/pull/454. Open a GitBash terminal and navigate to your "),t("em",[e._v("clone local path")]),e._v(" with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")]),e._v(" and use "),t("code",[e._v("git status")]),e._v(" to check you don't have any other staged commits (git status is clear).")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" status\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" fetch upstream pull/454/head:pos-new-design\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" branch "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("to your new testing branch called pos-new-design"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("Note: Be sure to change the /454/ pull request number to the number of the one you would like to test. You can typically leave /head: as is, and add the name of the pull request branch after it.")]),e._v(" "),t("h3",{attrs:{id:"delete-local-branch"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#delete-local-branch"}},[e._v("#")]),e._v(" Delete Local Branch")]),e._v(" "),t("p",[e._v("If you delete a branch on your forked BTCPay repository on Github.com, your local copy on your machine will still remain, unless you delete it:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),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(" branch "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-D")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("branch name"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n")])])]),t("p",[e._v("Note: You can't delete a branch if you have it checked out, so checkout another branch like "),t("code",[e._v("master")]),e._v(" first, as shown in the example above.")]),e._v(" "),t("h2",{attrs:{id:"working-with-docker-containers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#working-with-docker-containers"}},[e._v("#")]),e._v(" Working with Docker Containers")]),e._v(" "),t("p",[e._v("If you want to use Docker Commands when developing locally, you can run the following commands in the "),t("code",[e._v("BTCPayServer.Tests")]),e._v(" directory.")]),e._v(" "),t("ul",[t("li",[e._v("Show running containers "),t("code",[e._v("docker ps")])]),e._v(" "),t("li",[e._v("Show logs for a container "),t("code",[e._v("docker ps logs ")])]),e._v(" "),t("li",[e._v("Start Docker containers "),t("code",[e._v("docker-compose up dev")])]),e._v(" "),t("li",[e._v("Stop Docker containers "),t("code",[e._v("docker-compose down")])]),e._v(" "),t("li",[e._v("Destroy Docker containers "),t("code",[e._v("docker-compoose down --v")])])]),e._v(" "),t("h2",{attrs:{id:"greenfield-api-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#greenfield-api-development"}},[e._v("#")]),e._v(" Greenfield API Development")]),e._v(" "),t("p",[e._v("The BTCPay Greenfield API is "),t("RouterLink",{attrs:{to:"/FAQ/General/#how-can-i-use-the-btcpay-server-api"}},[e._v("currently being developed")]),e._v(". You can find a "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[e._v("usage example here")]),e._v(". The official Greenfield "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API reference documentation"),t("OutboundLink")],1),e._v(" is available for developers who want to develop with the BTCPay REST API.")],1),e._v(" "),t("p",[e._v("Developers who would like to contribute to the Greenfield API should follow the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/docs/greenfield-development.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("developer guidelines"),t("OutboundLink")],1),e._v(" used by the BTCPay project for additions or modifications. If you feel these guidelines are not clear, consider discussing your ideas in the community chat (development channel) or "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[e._v("open a github issue"),t("OutboundLink")],1),e._v(" to discuss endpoint implementation ideas.")]),e._v(" "),t("h2",{attrs:{id:"working-with-the-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#working-with-the-database"}},[e._v("#")]),e._v(" Working with the Database")]),e._v(" "),t("p",[e._v("BTCPay uses a PostgreSQL database by default. During development you can easily connect to it. This is helpful if you want to view how data is saved, modify records or use it to find issues during development. You can use the free tool "),t("a",{attrs:{href:"https://www.pgadmin.org/download/",target:"_blank",rel:"noopener noreferrer"}},[e._v("PgAdmin4"),t("OutboundLink")],1),e._v(" to do this.")]),e._v(" "),t("p",[e._v("Start your BTCPay in your local environment and view your debug console to find your database connection details:")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(373),alt:"PostgreSQL Configuration",title:"PostgreSQL Configuration"}})]),e._v(" "),t("p",[e._v("Next, open your PgAdmin and select: "),t("code",[e._v("Servers > Create > Server...")]),e._v(" to connect to your server. Provide a name for your server and provide your host connection details from your Visual Studio debug console:")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(374),alt:"PgAdmin Connection",title:"PgAdmin Connection"}})]),e._v(" "),t("p",[e._v("Save to connect to your development btcpayserver database. In the btcpayserver database look for:\n"),t("code",[e._v("Schemas > public > Tables")]),e._v(" to see the tables which contain the BTCPay Server data.")]),e._v(" "),t("p",[e._v("As an example, you can see all the users registered to your development BTCPay by viewing the rows of the "),t("code",[e._v("AspNetUsers")]),e._v(" table. Try changing the username of a registered user in the database, then "),t("code",[e._v("Save Changes")]),e._v(" and "),t("code",[e._v("Refresh (F5)")]),e._v(". Now log into your BTCPay using the new username and original password.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(375),alt:"PgAdmin Edit",title:"PgAdmin Edit"}})]),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 local development setup, 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(". If 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=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[37],{369:function(e,t,o){e.exports=o.p+"assets/img/docker-compose-up-dev.82514a01.png"},370:function(e,t,o){e.exports=o.p+"assets/img/vs-solution-explorer.71213904.png"},371:function(e,t,o){e.exports=o.p+"assets/img/vs-debug-console.9b8e7386.png"},372:function(e,t,o){e.exports=o.p+"assets/img/dashboard-change.d3ce411b.jpg"},373:function(e,t){e.exports="data:image/png;base64,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"},374:function(e,t,o){e.exports=o.p+"assets/img/DB-Connect.f1650039.png"},375:function(e,t,o){e.exports=o.p+"assets/img/DB-Edit.54e91f2d.png"},777: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:"setup-developer-environment"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setup-developer-environment"}},[e._v("#")]),e._v(" Setup Developer Environment")]),e._v(" "),t("p"),t("div",{staticClass:"table-of-contents"},[t("ul",[t("li",[t("a",{attrs:{href:"#developer-resources"}},[e._v("Developer Resources")])]),t("li",[t("a",{attrs:{href:"#windows-setup-software"}},[e._v("Windows Setup Software")])]),t("li",[t("a",{attrs:{href:"#git-setup"}},[e._v("Git Setup")]),t("ul",[t("li",[t("a",{attrs:{href:"#fork-btcpay-server-repository"}},[e._v("Fork BTCPay Server Repository")])]),t("li",[t("a",{attrs:{href:"#clone-btcpay-server-repository"}},[e._v("Clone BTCPay Server Repository")])]),t("li",[t("a",{attrs:{href:"#create-a-development-feature-branch"}},[e._v("Create a Development Feature Branch")])])])]),t("li",[t("a",{attrs:{href:"#local-btcpay-setup"}},[e._v("Local BTCPay Setup")]),t("ul",[t("li",[t("a",{attrs:{href:"#bitcoin-regtest-network-setup"}},[e._v("Bitcoin Regtest Network Setup")])]),t("li",[t("a",{attrs:{href:"#build-local-btcpay-server-in-browser-mode"}},[e._v("Build Local BTCPay Server in Browser Mode")])]),t("li",[t("a",{attrs:{href:"#visual-studio-setup"}},[e._v("Visual Studio Setup")])]),t("li",[t("a",{attrs:{href:"#build-local-btcpay-server-in-debug-mode"}},[e._v("Build Local BTCPay Server in Debug Mode")])]),t("li",[t("a",{attrs:{href:"#visual-studio-code-changes-in-your-local-btcpay-server"}},[e._v("Visual Studio Code Changes In Your Local BTCPay Server")])])])]),t("li",[t("a",{attrs:{href:"#git-maintenance"}},[e._v("Git Maintenance")]),t("ul",[t("li",[t("a",{attrs:{href:"#sync-forked-btcpay-server-repository"}},[e._v("Sync Forked BTCPay Server Repository")])]),t("li",[t("a",{attrs:{href:"#commit-code-to-make-pull-request"}},[e._v("Commit Code To Make Pull Request")])]),t("li",[t("a",{attrs:{href:"#create-a-branch-of-a-pull-request"}},[e._v("Create a Branch of a Pull Request")])]),t("li",[t("a",{attrs:{href:"#delete-local-branch"}},[e._v("Delete Local Branch")])])])]),t("li",[t("a",{attrs:{href:"#working-with-docker-containers"}},[e._v("Working with Docker Containers")])]),t("li",[t("a",{attrs:{href:"#greenfield-api-development"}},[e._v("Greenfield API Development")])]),t("li",[t("a",{attrs:{href:"#working-with-the-database"}},[e._v("Working with the Database")])]),t("li",[t("a",{attrs:{href:"#questions"}},[e._v("Questions")])])])]),t("p"),e._v(" "),t("p",[e._v("This guide will help you set up your developer environment to prepare you for later contributions to the BTCPay Server repositories. A variety of beginner tools are used in the guide below to help you get started with development. Once you understand the general setup process, feel free to use any tools that you like.")]),e._v(" "),t("p",[e._v("If you are looking for how to make a simple code change such as fixing a typo or copy change, check out the simplified "),t("RouterLink",{attrs:{to:"/Contribute/WriteSoftware/"}},[e._v("Write Software")]),e._v(" tutorial instead. If you are an advanced developer with a local environment already set up for development, you can skip ahead to the "),t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("LocalDevelopment")]),e._v(" documentation.")],1),e._v(" "),t("h2",{attrs:{id:"developer-resources"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#developer-resources"}},[e._v("#")]),e._v(" Developer Resources")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"https://docs.github.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Github Docs"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[e._v("BTCPay Commands and Concepts")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/Development/LocalDevelopment/#videos"}},[e._v("Environment Setup Videos (Linux, Mac, Windows)")])],1)]),e._v(" "),t("h2",{attrs:{id:"windows-setup-software"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#windows-setup-software"}},[e._v("#")]),e._v(" Windows Setup Software")]),e._v(" "),t("p",[e._v("Software to install to follow this guide:")]),e._v(" "),t("ol",[t("li",[t("a",{attrs:{href:"https://visualstudio.microsoft.com/downloads/",target:"_blank",rel:"noopener noreferrer"}},[e._v("Visual Studio Community Edition"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://dotnet.microsoft.com/en-us/download/dotnet/8.0",target:"_blank",rel:"noopener noreferrer"}},[e._v(".NET Core SDK 8.0+"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://www.docker.com/products/docker-desktop",target:"_blank",rel:"noopener noreferrer"}},[e._v("Docker Desktop"),t("OutboundLink")],1)]),e._v(" "),t("li",[e._v("PowerShell (included in Windows OS)")]),e._v(" "),t("li",[t("a",{attrs:{href:"https://gitforwindows.org/",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitBash"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://desktop.github.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("GitHub Desktop"),t("OutboundLink")],1)]),e._v(" "),t("li",[t("a",{attrs:{href:"https://github.com/",target:"_blank",rel:"noopener noreferrer"}},[e._v("www.Github.com account"),t("OutboundLink")],1),e._v(" (sign up)")])]),e._v(" "),t("p",[e._v("Note: "),t("em",[e._v("This guide assumes installations in default locations. Take note if you have a different file directory structure.")])]),e._v(" "),t("h2",{attrs:{id:"git-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#git-setup"}},[e._v("#")]),e._v(" Git Setup")]),e._v(" "),t("h3",{attrs:{id:"fork-btcpay-server-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#fork-btcpay-server-repository"}},[e._v("#")]),e._v(" Fork BTCPay Server Repository")]),e._v(" "),t("ul",[t("li",[e._v("Open a web browser and login to your www.Github.com account.")]),e._v(" "),t("li",[e._v("Navigate to 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 press the "),t("code",[e._v("Fork")]),e._v(" button to create your own copy of the BTCPay Server repository on Github.")]),e._v(" "),t("li",[e._v("Next open Github Desktop and login so that Github Desktop knows about your www.Github.com account and connects to it.")])]),e._v(" "),t("h3",{attrs:{id:"clone-btcpay-server-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#clone-btcpay-server-repository"}},[e._v("#")]),e._v(" Clone BTCPay Server Repository")]),e._v(" "),t("ul",[t("li",[e._v("In GitHub Desktop, use the "),t("code",[e._v("Add")]),e._v(" button and see the option clone repository.")]),e._v(" "),t("li",[e._v("If you are using your www.Github.com credentials in GitHub Desktop, you will see your BTCPay Server repository that you just forked on www.Github.com. Select it and take note of the local path shown below. (by default it will be something like "),t("code",[e._v("C:\\Users\\SatoshisComputer\\Documents\\GitHub\\btcpayserver")]),e._v(" for clarity, lets call it our: "),t("em",[e._v("clone local path")]),e._v(") then press clone.")]),e._v(" "),t("li",[e._v("Now you will see the BTCPay Server repository has been cloned in your GitHub Desktop and you will be on the "),t("em",[e._v("master branch")]),e._v(".")])]),e._v(" "),t("h3",{attrs:{id:"create-a-development-feature-branch"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-development-feature-branch"}},[e._v("#")]),e._v(" Create a Development Feature Branch")]),e._v(" "),t("ul",[t("li",[e._v("Next we will practice working with our BTCPay Server repository that we just cloned to our computer using Github Desktop.")]),e._v(" "),t("li",[e._v("When developing, you may want to work on different features at once. To do that, we typically want to create multiple feature branches instead of making all changes to the master branch.")]),e._v(" "),t("li",[e._v("We're using GitBash and some Git commands, so open GitBash. (If you prefer to only use GitHub desktop instead of GitBash, you can create branches there instead.)")]),e._v(" "),t("li",[e._v("Once you have a GitBash terminal open, we need to change directory to our clone of BTCPay Server repository.")]),e._v(" "),t("li",[e._v("To do this, navigate to our "),t("em",[e._v("clone local path")]),e._v(" with the change directory command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")])]),e._v(" "),t("li",[e._v("You can see your clone of BTCPay Server is on the branch called "),t("code",[e._v("master")])]),e._v(" "),t("li",[e._v("Make a copy of your master branch to do some development on it, with the command: "),t("code",[e._v("$ git branch OurNewDevelopmentBranch")])]),e._v(" "),t("li",[e._v("Let's view all the branches we have now, with the command: "),t("code",[e._v("$ git branch")]),e._v(" you can see we have master and OurNewDevelopmentBranch")]),e._v(" "),t("li",[e._v("In Git, we now have a copy of our forked BTCPay Server repository (our clone). When we want to switch between branches (copies of our clone), we need to tell Git which branch our development code changes should be assigned to. We do this by checking out our branch, with the command: "),t("code",[e._v("$ git checkout OurNewDevelopmentBranch")])]),e._v(" "),t("li",[e._v("Now you are on OurNewDevelopmentBranch in GitBash.")]),e._v(" "),t("li",[e._v("Open your GitHub Desktop and you can see you are no longer on master and you are now on "),t("code",[e._v("OurNewDevelopmentBranch")])]),e._v(" "),t("li",[e._v("In the top menu in Github Desktop click: "),t("code",[e._v("Repository > Show In Explorer")]),e._v(" to see the location of the files.")])]),e._v(" "),t("h2",{attrs:{id:"local-btcpay-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#local-btcpay-setup"}},[e._v("#")]),e._v(" Local BTCPay Setup")]),e._v(" "),t("h3",{attrs:{id:"bitcoin-regtest-network-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#bitcoin-regtest-network-setup"}},[e._v("#")]),e._v(" Bitcoin Regtest Network Setup")]),e._v(" "),t("ul",[t("li",[e._v("For the next step make sure that you have Docker-Compose installed (included with Docker Desktop). Open a PowerShell terminal and navigate to your "),t("em",[e._v("clone local path")]),e._v(" and into the BTCPayServer.Tests directory with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver/BTCPayServer.Tests")])]),e._v(" "),t("li",[e._v("The BTCPay Server.Tests project contains the docker files needed to run our docker commands that will start all the project dependencies and create a local Regtest network.")]),e._v(" "),t("li",[e._v("In Powershell, start the docker services with the command: "),t("code",[e._v("docker-compose up dev")]),e._v("(you must be in the BTCPay Server.Tests to run this command).")]),e._v(" "),t("li",[e._v("In your PowerShell terminal you will first see the necessary docker images being pulled, then containers being built. If the build is successful the containers will all show as done.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(369),alt:"BTCPayServer.Tests powershell terminal",title:"BTCPayServer.Tests powershell terminal"}})]),e._v(" "),t("h3",{attrs:{id:"build-local-btcpay-server-in-browser-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-local-btcpay-server-in-browser-mode"}},[e._v("#")]),e._v(" Build Local BTCPay Server in Browser Mode")]),e._v(" "),t("p",[e._v("If you don't want to do any coding and you simply want to create a local BTCPay Server for testing features in the interface, you can start a local BTCPay from the command line.")]),e._v(" "),t("p",[e._v("After building your "),t("a",{attrs:{href:"#bitcoin-regtest-network-setup"}},[e._v("regtest network")]),e._v(", navigate to your "),t("code",[e._v("btcpayserver\\BTCPayServer")]),e._v(" directory and run the following command:")]),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("p",[e._v("Open a new browser and visit: "),t("a",{attrs:{href:"http://127.0.0.1:14142",target:"_blank",rel:"noopener noreferrer"}},[e._v("http://127.0.0.1:14142"),t("OutboundLink")],1)]),e._v(" "),t("h3",{attrs:{id:"visual-studio-setup"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#visual-studio-setup"}},[e._v("#")]),e._v(" Visual Studio Setup")]),e._v(" "),t("ul",[t("li",[e._v("Open a file explorer to the BTCPay Server repository folder. Without opening any of the folders shown, look for the "),t("code",[e._v("btcpayserver.sln")]),e._v(" item and right click it to "),t("code",[e._v("Open with > Visual Studio")]),e._v(". You may need to choose Open with > Choose another app ... and look for Visual Studio if you have never opened this kind of file before.")]),e._v(" "),t("li",[e._v("To get your Visual Studio set up choose "),t("code",[e._v("View > Solution Explorer")]),e._v(" from the top menu. In this solution explorer you will see all the BTCPay Server files and folders.")]),e._v(" "),t("li",[e._v("The top project is BTCPay Server, make sure it's in bold. If it isn't, right click it and choose Set as StartUp Project.")]),e._v(" "),t("li",[e._v("Your Visual Studio is now set up and ready.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(370),alt:"VS Solution Explorer",title:"VS Solution Explorer"}})]),e._v(" "),t("h3",{attrs:{id:"build-local-btcpay-server-in-debug-mode"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#build-local-btcpay-server-in-debug-mode"}},[e._v("#")]),e._v(" Build Local BTCPay Server in Debug Mode")]),e._v(" "),t("ul",[t("li",[e._v("Back in Visual Studio, click: "),t("code",[e._v("Build > Build Solution")])]),e._v(" "),t("li",[e._v("In the output window, a successful build will look something like this: "),t("code",[e._v("========== Build: 6 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========")])]),e._v(" "),t("li",[e._v("Next press "),t("code",[e._v("Debug > Start Debugging")])]),e._v(" "),t("li",[e._v("First a Visual Studio debug console will open which shows information about the status of your local BTCPay Server.")]),e._v(" "),t("li",[e._v("Next a local BTCPay Server will be created in a web browser, showing on the home page that it's in "),t("code",[e._v("REGTEST")]),e._v(" mode.")]),e._v(" "),t("li",[e._v("You now will have three windows to view: BTCPay Server browser session, our Visual Studio debug console and our BTCPay Server.Tests powershell terminal.")]),e._v(" "),t("li",[e._v("Register a new user in your BTCPay Server and see the registration event is shown in your Visual Studio debug console.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(371),alt:"VS Debug Console",title:"VS Debug Console"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:o(372),alt:"Local Regtest BTCPay",title:"Local Regtest BTCPay"}})]),e._v(" "),t("h3",{attrs:{id:"visual-studio-code-changes-in-your-local-btcpay-server"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#visual-studio-code-changes-in-your-local-btcpay-server"}},[e._v("#")]),e._v(" Visual Studio Code Changes In Your Local BTCPay Server")]),e._v(" "),t("ul",[t("li",[e._v("Make changes to code in Visual Studio (Ex: modify the "),t("code",[e._v("This store is ready to accept transactions, good job!")]),e._v(" text in the "),t("code",[e._v("~\\BTCPayServer\\Views\\UIStores\\Dashboard.cshtml")]),e._v(" file)")]),e._v(" "),t("li",[e._v("Refresh the page to see your text changes on the home page.")]),e._v(" "),t("li",[e._v("Some code changes require re-start of Debugging for changes to take effect.")]),e._v(" "),t("li",[e._v("Add breakpoints in Visual Studio and see those breakpoints get hit when you try to use a feature in your local BTCPay Server instance.")])]),e._v(" "),t("h2",{attrs:{id:"git-maintenance"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#git-maintenance"}},[e._v("#")]),e._v(" Git Maintenance")]),e._v(" "),t("h3",{attrs:{id:"sync-forked-btcpay-server-repository"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#sync-forked-btcpay-server-repository"}},[e._v("#")]),e._v(" Sync Forked BTCPay Server Repository")]),e._v(" "),t("ul",[t("li",[e._v("With many contributors adding code changes to the Master BTCPay Server Repository, sometimes your forked copy can fall behind, unless you merge new changes into your fork.")]),e._v(" "),t("li",[e._v("If you go to your Fork of BTCPay Server on www.Github.com you will see a message saying that your branch is behind by some commits. Example: "),t("code",[e._v("This branch is 32 commits behind btcpayserver:master")]),e._v(".")]),e._v(" "),t("li",[e._v("To update, you can use GitBash or simply use Github Desktop by clicking through the synchronization prompts.")]),e._v(" "),t("li",[e._v("Open a GitBash terminal and update your BTCPay Server repository with the following commands.")]),e._v(" "),t("li",[e._v("First always navigate to your "),t("em",[e._v("clone local path")]),e._v(" with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")]),e._v(" and make sure you are on "),t("code",[e._v("master")]),e._v(" branch.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" fetch upstream\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" merge upstream/master\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 operator"}},[e._v("<")]),e._v("SomeCommitMessage"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n\nMessage prompt: "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".your branch is ahead of origin master by "),t("span",{pre:!0,attrs:{class:"token string"}},[e._v('"X"')]),e._v(" commits"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(". use "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push to publish"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\n\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(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push origin master\n")])])]),t("p",[e._v("If you see an error "),t("code",[e._v("fatal: 'upstream' does not appear to be a git repository")]),e._v(" when running "),t("code",[e._v("$ git fetch upstream")]),e._v(", you must first configure a remote that points to the upstream repository in Git. That is needed only once. Just run the following command while you are in your "),t("em",[e._v("clone local path")]),e._v(" .")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" remote "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" upstream https://github.com/btcpayserver/btcpayserver.git\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# check if the upstream repo is added succesfully")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" remote "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-v")]),e._v("\n\n"),t("span",{pre:!0,attrs:{class:"token comment"}},[e._v("# you should see something like this:")]),e._v("\norigin\tYOUR_FORKED_GITHUB_REPO "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("fetch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\norigin\tYOUR_FORKED_GITHUB_REPO "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("push"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nupstream\thttps://github.com/btcpayserver/btcpayserver.git "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("fetch"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\nupstream\thttps://github.com/btcpayserver/btcpayserver.git "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("push"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("h3",{attrs:{id:"commit-code-to-make-pull-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#commit-code-to-make-pull-request"}},[e._v("#")]),e._v(" Commit Code To Make Pull Request")]),e._v(" "),t("ul",[t("li",[e._v("After you have made some code changes on a feature branch (Example: A feature branch called "),t("code",[e._v("Fix/BugBranch")]),e._v(") and you want to make a Pull Request to the BTCPay Server Repository. Open a GitBash terminal and navigate to your "),t("em",[e._v("clone local path")]),e._v(" with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")]),e._v(" and make sure you are on the "),t("strong",[e._v("correct branch")]),e._v(" that you want to commit and use git status to check the files changed are the ones you want to commit.")])]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" status\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(" "),t("span",{pre:!0,attrs:{class:"token builtin class-name"}},[e._v(".")]),e._v("\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" commit\n\nText Editor appears to "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("add")]),e._v(" your commit message"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("..")]),e._v(".\nExample Commit Message: Fix bug "),t("span",{pre:!0,attrs:{class:"token keyword"}},[e._v("for")]),e._v(" update button\n\nAccept Changes: Ctrl + x\nSave Changes: Shift + y\nClose Editor with: Enter\n\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" push origin Fix/BugBranch\n")])])]),t("p",[e._v("See your new branch has been created on you www.Github.com BTCPay Server Fork, review changes and create Pull Request.")]),e._v(" "),t("h3",{attrs:{id:"create-a-branch-of-a-pull-request"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-branch-of-a-pull-request"}},[e._v("#")]),e._v(" Create a Branch of a Pull Request")]),e._v(" "),t("p",[e._v("A great way to contribute without having to be an advanced developer is by testing other contributor's pull requests. Manual testing is a great way to help other's and ensure that BTCPay Server code changes are working properly. Here is an example of how to make a branch of someone else's pull request, using this previous PoS Pull Request https://github.com/btcpayserver/btcpayserver/pull/454. Open a GitBash terminal and navigate to your "),t("em",[e._v("clone local path")]),e._v(" with the command: "),t("code",[e._v("$ cd Documents/Github/btcpayserver")]),e._v(" and use "),t("code",[e._v("git status")]),e._v(" to check you don't have any other staged commits (git status is clear).")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" status\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" fetch upstream pull/454/head:pos-new-design\n$ "),t("span",{pre:!0,attrs:{class:"token function"}},[e._v("git")]),e._v(" branch "),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v("(")]),e._v("to your new testing branch called pos-new-design"),t("span",{pre:!0,attrs:{class:"token punctuation"}},[e._v(")")]),e._v("\n")])])]),t("p",[e._v("Note: Be sure to change the /454/ pull request number to the number of the one you would like to test. You can typically leave /head: as is, and add the name of the pull request branch after it.")]),e._v(" "),t("h3",{attrs:{id:"delete-local-branch"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#delete-local-branch"}},[e._v("#")]),e._v(" Delete Local Branch")]),e._v(" "),t("p",[e._v("If you delete a branch on your forked BTCPay repository on Github.com, your local copy on your machine will still remain, unless you delete it:")]),e._v(" "),t("div",{staticClass:"language-bash extra-class"},[t("pre",{pre:!0,attrs:{class:"language-bash"}},[t("code",[e._v("$ "),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(" branch "),t("span",{pre:!0,attrs:{class:"token parameter variable"}},[e._v("-D")]),e._v(" "),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v("<")]),e._v("branch name"),t("span",{pre:!0,attrs:{class:"token operator"}},[e._v(">")]),e._v("\n")])])]),t("p",[e._v("Note: You can't delete a branch if you have it checked out, so checkout another branch like "),t("code",[e._v("master")]),e._v(" first, as shown in the example above.")]),e._v(" "),t("h2",{attrs:{id:"working-with-docker-containers"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#working-with-docker-containers"}},[e._v("#")]),e._v(" Working with Docker Containers")]),e._v(" "),t("p",[e._v("If you want to use Docker Commands when developing locally, you can run the following commands in the "),t("code",[e._v("BTCPayServer.Tests")]),e._v(" directory.")]),e._v(" "),t("ul",[t("li",[e._v("Show running containers "),t("code",[e._v("docker ps")])]),e._v(" "),t("li",[e._v("Show logs for a container "),t("code",[e._v("docker ps logs ")])]),e._v(" "),t("li",[e._v("Start Docker containers "),t("code",[e._v("docker-compose up dev")])]),e._v(" "),t("li",[e._v("Stop Docker containers "),t("code",[e._v("docker-compose down")])]),e._v(" "),t("li",[e._v("Destroy Docker containers "),t("code",[e._v("docker-compoose down --v")])])]),e._v(" "),t("h2",{attrs:{id:"greenfield-api-development"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#greenfield-api-development"}},[e._v("#")]),e._v(" Greenfield API Development")]),e._v(" "),t("p",[e._v("The BTCPay Greenfield API is "),t("RouterLink",{attrs:{to:"/FAQ/General/#how-can-i-use-the-btcpay-server-api"}},[e._v("currently being developed")]),e._v(". You can find a "),t("RouterLink",{attrs:{to:"/Development/GreenFieldExample/"}},[e._v("usage example here")]),e._v(". The official Greenfield "),t("a",{attrs:{href:"https://docs.btcpayserver.org/API/Greenfield/v1/",target:"_blank",rel:"noopener noreferrer"}},[e._v("API reference documentation"),t("OutboundLink")],1),e._v(" is available for developers who want to develop with the BTCPay REST API.")],1),e._v(" "),t("p",[e._v("Developers who would like to contribute to the Greenfield API should follow the "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/blob/master/docs/greenfield-development.md",target:"_blank",rel:"noopener noreferrer"}},[e._v("developer guidelines"),t("OutboundLink")],1),e._v(" used by the BTCPay project for additions or modifications. If you feel these guidelines are not clear, consider discussing your ideas in the community chat (development channel) or "),t("a",{attrs:{href:"https://github.com/btcpayserver/btcpayserver/issues/new/choose",target:"_blank",rel:"noopener noreferrer"}},[e._v("open a github issue"),t("OutboundLink")],1),e._v(" to discuss endpoint implementation ideas.")]),e._v(" "),t("h2",{attrs:{id:"working-with-the-database"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#working-with-the-database"}},[e._v("#")]),e._v(" Working with the Database")]),e._v(" "),t("p",[e._v("BTCPay uses a PostgreSQL database by default. During development you can easily connect to it. This is helpful if you want to view how data is saved, modify records or use it to find issues during development. You can use the free tool "),t("a",{attrs:{href:"https://www.pgadmin.org/download/",target:"_blank",rel:"noopener noreferrer"}},[e._v("PgAdmin4"),t("OutboundLink")],1),e._v(" to do this.")]),e._v(" "),t("p",[e._v("Start your BTCPay in your local environment and view your debug console to find your database connection details:")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(373),alt:"PostgreSQL Configuration",title:"PostgreSQL Configuration"}})]),e._v(" "),t("p",[e._v("Next, open your PgAdmin and select: "),t("code",[e._v("Servers > Create > Server...")]),e._v(" to connect to your server. Provide a name for your server and provide your host connection details from your Visual Studio debug console:")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(374),alt:"PgAdmin Connection",title:"PgAdmin Connection"}})]),e._v(" "),t("p",[e._v("Save to connect to your development btcpayserver database. In the btcpayserver database look for:\n"),t("code",[e._v("Schemas > public > Tables")]),e._v(" to see the tables which contain the BTCPay Server data.")]),e._v(" "),t("p",[e._v("As an example, you can see all the users registered to your development BTCPay by viewing the rows of the "),t("code",[e._v("AspNetUsers")]),e._v(" table. Try changing the username of a registered user in the database, then "),t("code",[e._v("Save Changes")]),e._v(" and "),t("code",[e._v("Refresh (F5)")]),e._v(". Now log into your BTCPay using the new username and original password.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(375),alt:"PgAdmin Edit",title:"PgAdmin Edit"}})]),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 local development setup, 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(". If 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=r.exports}}]); \ No newline at end of file diff --git a/assets/js/40.f388cce8.js b/assets/js/40.5f55dac3.js similarity index 99% rename from assets/js/40.f388cce8.js rename to assets/js/40.5f55dac3.js index 55fccf03ce..0ea19874b2 100644 --- a/assets/js/40.f388cce8.js +++ b/assets/js/40.5f55dac3.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{494:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder1.c4b78601.png"},495:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder2.aa5f358e.png"},496:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder2-1.762fc637.png"},497:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder2-2.265e8675.png"},498:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder2-3.700def4f.png"},499:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder2-4.d3dbe396.png"},500:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder3.9c86be51.png"},850:function(e,t,o){"use strict";o.r(t);var r=o(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:"forms"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#forms"}},[e._v("#")]),e._v(" Forms")]),e._v(" "),t("p",[e._v("BTCPay Server's Forms Builder enables you to request specific information from your customer.")]),e._v(" "),t("p",[e._v("These forms are fully customizable to suit your requirements.\nIn this introduction, we will go through the visual form builder; if you'd like to do more advanced settings, please visit the "),t("RouterLink",{attrs:{to:"/AdvancedForms/"}},[e._v("Advanced Forms")]),e._v(" section of our documentation.")],1),e._v(" "),t("h2",{attrs:{id:"setting-up-your-stores-first-custom-form"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-your-stores-first-custom-form"}},[e._v("#")]),e._v(" Setting up your store's first Custom form.")]),e._v(" "),t("p",[e._v("In this example, we will start with creating a standard form we've pre-made.\nClick on Store Settings and the last tab of your store settings is Forms. Click Forms to create your first Custom Form.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(494),alt:"BTCPay Server formbuilder - settings",title:"BTCPay Server formbuilder - settings"}})]),e._v(" "),t("p",[e._v("On the custom forms page, click Create New Form.\nWe've pre-made two examples, "),t("code",[e._v("Email")]),e._v(" and "),t("code",[e._v("Address")]),e._v(".\nFor this example, click the Address form.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(495),alt:"BTCPay Server formbuilder - Create new form",title:"BTCPay Server formbuilder - Create new form"}})]),e._v(" "),t("p",[e._v("We can now drag around the fields pre-made by BTCPay Server.\nYou can re-order them or create a new field by clicking on the "),t("code",[e._v("Add form element")]),e._v(" at the bottom of the form.")]),e._v(" "),t("h2",{attrs:{id:"create-a-custom-form"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-custom-form"}},[e._v("#")]),e._v(" Create a custom form.")]),e._v(" "),t("p",[e._v("You might have a different use case. For example if you own a restaurant you need to know the table number, how to call the customer when serving them, allergies, and special requests.")]),e._v(" "),t("p",[e._v("Let's create a custom form in the following steps.\nWe will start at the same settings tab from the previous example, Store settings -> Forms.")]),e._v(" "),t("p",[e._v("Click "),t("code",[e._v("create form")]),e._v(" in the top right.\nWe'll start by giving it a name; in the example, we will use "),t("code",[e._v("Restaurant")]),e._v(".\nUnlike before, we will start with the empty field that was generated.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(496),alt:"BTCPay Server formbuilder - Create new form",title:"BTCPay Server formbuilder - Create new form"}})]),e._v(" "),t("ol",[t("li",[e._v("We will name the first field, "),t("code",[e._v("Table number")])]),e._v(" "),t("li",[e._v("Define the "),t("code",[e._v("Type")]),e._v(" of the field; we need it to be Text or Number, click on the drop-down and select "),t("code",[e._v("Number")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(497),alt:"BTCPay Server formbuilder - Create new form",title:"BTCPay Server formbuilder - Create new form"}})]),e._v(" "),t("ol",{attrs:{start:"3"}},[t("li",[e._v("The label we set for this field as it shows to the customer; in our example, we will name it "),t("code",[e._v("Table Number")]),e._v(".")]),e._v(" "),t("li",[e._v("Regarding The name of the field, we replicate the previous field's name, "),t("code",[e._v("Table Number")]),e._v(", for consistency.")]),e._v(" "),t("li",[e._v("We could define a "),t("code",[e._v("Default value")]),e._v("; however, we'll keep it empty in the example.")]),e._v(" "),t("li",[t("code",[e._v("Helper Text")]),e._v(" This is the text provided below the field we are creating to indicate what you request from the customer.")]),e._v(" "),t("li",[e._v("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.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(498),alt:"BTCPay Server formbuilder - Create new form",title:"BTCPay Server formbuilder - Create new form"}})]),e._v(" "),t("p",[e._v("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.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(499),alt:"BTCPay Server formbuilder - Create new form",title:"BTCPay Server formbuilder - Create new form"}})]),e._v(" "),t("p",[e._v("Now that the first field is done, you can click on the "),t("code",[e._v("+ Add form element")]),e._v(" below your first field and create the rest of the required form fields. Once you've made all the fields, click "),t("code",[e._v("Save")]),e._v(" in the top right of your screen, and all should be set!")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(500),alt:"BTCPay Server formbuilder - Create new form",title:"BTCPay Server formbuilder - Create new form"}})]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("Form Builder")]),e._v(" makes creating custom forms flexible and easy. If you still require more personalization, as mentioned at the start of this guide, please read on "),t("RouterLink",{attrs:{to:"/AdvancedForms/"}},[e._v("Advanced Forms")]),e._v(" to learn about the JSON created in the "),t("code",[e._v("Code")]),e._v(" tab in the Form builder.")],1),e._v(" "),t("h2",{attrs:{id:"public-forms"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#public-forms"}},[e._v("#")]),e._v(" Public Forms")]),e._v(" "),t("p",[e._v("When "),t("code",[e._v("Allow form for public use")]),e._v(" 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.")]),e._v(" "),t("p",[e._v('By default, the invoice currency is set to the store\'s default currency, and the amount is set to "any".')]),e._v(" "),t("p",[e._v("You can configure the form to have a pre-configured currency and amount by creating fields with specific names.")]),e._v(" "),t("ul",[t("li",[e._v("Invoice currency: Create a field that has its name as "),t("code",[e._v("invoice_currency")]),e._v(". Make sure its value returns a valid currency code.")]),e._v(" "),t("li",[e._v("Invoice amount: Create a field that has its name as "),t("code",[e._v("invoice_amount")]),e._v(". Make sure its value returns a number.")])]),e._v(" "),t("p",[e._v("You can create these fields with type "),t("code",[e._v("hidden")]),e._v(" 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 "),t("code",[e._v("Constant")]),e._v(" to checked.")]),e._v(" "),t("p",[e._v("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.")]),e._v(" "),t("h2",{attrs:{id:"adjust-invoice-amounts-based-on-user-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adjust-invoice-amounts-based-on-user-input"}},[e._v("#")]),e._v(" Adjust invoice amounts based on user input")]),e._v(" "),t("p",[e._v("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.")]),e._v(" "),t("p",[e._v("The form comes with such functionality as of BTCPay Server version 1.11.0. Any field that has its name start with "),t("code",[e._v("invoice_amount_adjustment")]),e._v(" (supported since v1.11) or "),t("code",[e._v("invoice_amount_multiply_adjustment")]),e._v(" (supported since v1.12) and its value being a valid number will automatically adjust the invoice amount.")]),e._v(" "),t("p",[e._v("This functionality currently works for public form usage and for the Point of Sale plugin.\nSee the "),t("RouterLink",{attrs:{to:"/AdvancedForms/#mirror-fields"}},[e._v("Mirror Fields")]),e._v(" section of the Advanced Forms guide for details.")],1),e._v(" "),t("h3",{attrs:{id:"charging-extra-based-on-shipping-method"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#charging-extra-based-on-shipping-method"}},[e._v("#")]),e._v(" Charging extra based on shipping method")]),e._v(" "),t("p",[e._v('Create a field of type "select", with the name '),t("code",[e._v("invoice_amount_adjustment_shipping_method")]),e._v(", and options that map to what shipping methods you have available. We will use 2 options: "),t("code",[e._v("DHL")]),e._v(" with a value of "),t("code",[e._v("10")]),e._v(" and "),t("code",[e._v("Fedex")]),e._v(" with a value of "),t("code",[e._v("20")]),e._v(". When a user selects either or, the invoice amount will be adjusted by 10 or 20 respectively.")]),e._v(" "),t("p",[e._v("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 "),t("code",[e._v("Mirror")]),e._v(" fields to accomplish this.")]),e._v(" "),t("p",[e._v("To save the user selected shipping method choice we must do the following instead:")]),e._v(" "),t("ul",[t("li",[e._v('Create a field of type "select", with the name '),t("code",[e._v("shipping_method")]),e._v(", and options that map to what shipping methods you have available. We will use 2 options: "),t("code",[e._v("DHL")]),e._v(" with a value of "),t("code",[e._v("dhl")]),e._v(" and "),t("code",[e._v("Fedex")]),e._v(" with a value of "),t("code",[e._v("fedex")]),e._v(".")]),e._v(" "),t("li",[e._v('Create a field of type "mirror", with the name '),t("code",[e._v("invoice_amount_adjustment_shipping_method")]),e._v(". In "),t("code",[e._v("Field to mirror")]),e._v(", select the "),t("code",[e._v("shipping_method")]),e._v(" field. And in "),t("code",[e._v("Value Mapper")]),e._v(", create all the options from "),t("code",[e._v("shipping_method")]),e._v(" and the value to charge.")])]),e._v(" "),t("h3",{attrs:{id:"promo-codes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#promo-codes"}},[e._v("#")]),e._v(" Promo codes")]),e._v(" "),t("ul",[t("li",[e._v('Create a field of type "text", with the name '),t("code",[e._v("promoCode")]),e._v(".")]),e._v(" "),t("li",[e._v('Create a field of type "mirror", with the name '),t("code",[e._v("invoice_amount_adjustment_promo")]),e._v(". In "),t("code",[e._v("Field to mirror")]),e._v(", select the "),t("code",[e._v("promoCode")]),e._v(" field. And in "),t("code",[e._v("Value Mapper")]),e._v(", create all the promotional codes you wish to have available. For example set "),t("code",[e._v("Original Value")]),e._v(" to "),t("code",[e._v("chocolate")]),e._v(" and "),t("code",[e._v("Mapped Value")]),e._v(" to "),t("code",[e._v("-5")]),e._v(".")])]),e._v(" "),t("p",[e._v("When the user enters "),t("code",[e._v("chocolate")]),e._v(" in the promo code field, the invoice amount will be adjusted by -5.")]),e._v(" "),t("h3",{attrs:{id:"showing-user-input-on-the-receipt"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#showing-user-input-on-the-receipt"}},[e._v("#")]),e._v(" Showing user input on the receipt")]),e._v(" "),t("p",[e._v("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.")]),e._v(" "),t("ul",[t("li",[e._v("Create a field of type "),t("code",[e._v("fieldset")]),e._v(", with name "),t("code",[e._v("receiptData")]),e._v(".")]),e._v(" "),t("li",[e._v("For every field you wish to show in the receipt, create a field of type "),t("code",[e._v("mirror")]),e._v(", and set the "),t("code",[e._v("Field to mirror")]),e._v(" to the field you wish to copy over to the receipt.")])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[40],{494:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder1.c4b78601.png"},495:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder2.aa5f358e.png"},496:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder2-1.762fc637.png"},497:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder2-2.265e8675.png"},498:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder2-3.700def4f.png"},499:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder2-4.d3dbe396.png"},500:function(e,t,o){e.exports=o.p+"assets/img/btcpayformbuilder3.9c86be51.png"},849:function(e,t,o){"use strict";o.r(t);var r=o(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:"forms"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#forms"}},[e._v("#")]),e._v(" Forms")]),e._v(" "),t("p",[e._v("BTCPay Server's Forms Builder enables you to request specific information from your customer.")]),e._v(" "),t("p",[e._v("These forms are fully customizable to suit your requirements.\nIn this introduction, we will go through the visual form builder; if you'd like to do more advanced settings, please visit the "),t("RouterLink",{attrs:{to:"/AdvancedForms/"}},[e._v("Advanced Forms")]),e._v(" section of our documentation.")],1),e._v(" "),t("h2",{attrs:{id:"setting-up-your-stores-first-custom-form"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#setting-up-your-stores-first-custom-form"}},[e._v("#")]),e._v(" Setting up your store's first Custom form.")]),e._v(" "),t("p",[e._v("In this example, we will start with creating a standard form we've pre-made.\nClick on Store Settings and the last tab of your store settings is Forms. Click Forms to create your first Custom Form.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(494),alt:"BTCPay Server formbuilder - settings",title:"BTCPay Server formbuilder - settings"}})]),e._v(" "),t("p",[e._v("On the custom forms page, click Create New Form.\nWe've pre-made two examples, "),t("code",[e._v("Email")]),e._v(" and "),t("code",[e._v("Address")]),e._v(".\nFor this example, click the Address form.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(495),alt:"BTCPay Server formbuilder - Create new form",title:"BTCPay Server formbuilder - Create new form"}})]),e._v(" "),t("p",[e._v("We can now drag around the fields pre-made by BTCPay Server.\nYou can re-order them or create a new field by clicking on the "),t("code",[e._v("Add form element")]),e._v(" at the bottom of the form.")]),e._v(" "),t("h2",{attrs:{id:"create-a-custom-form"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#create-a-custom-form"}},[e._v("#")]),e._v(" Create a custom form.")]),e._v(" "),t("p",[e._v("You might have a different use case. For example if you own a restaurant you need to know the table number, how to call the customer when serving them, allergies, and special requests.")]),e._v(" "),t("p",[e._v("Let's create a custom form in the following steps.\nWe will start at the same settings tab from the previous example, Store settings -> Forms.")]),e._v(" "),t("p",[e._v("Click "),t("code",[e._v("create form")]),e._v(" in the top right.\nWe'll start by giving it a name; in the example, we will use "),t("code",[e._v("Restaurant")]),e._v(".\nUnlike before, we will start with the empty field that was generated.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(496),alt:"BTCPay Server formbuilder - Create new form",title:"BTCPay Server formbuilder - Create new form"}})]),e._v(" "),t("ol",[t("li",[e._v("We will name the first field, "),t("code",[e._v("Table number")])]),e._v(" "),t("li",[e._v("Define the "),t("code",[e._v("Type")]),e._v(" of the field; we need it to be Text or Number, click on the drop-down and select "),t("code",[e._v("Number")]),e._v(".")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(497),alt:"BTCPay Server formbuilder - Create new form",title:"BTCPay Server formbuilder - Create new form"}})]),e._v(" "),t("ol",{attrs:{start:"3"}},[t("li",[e._v("The label we set for this field as it shows to the customer; in our example, we will name it "),t("code",[e._v("Table Number")]),e._v(".")]),e._v(" "),t("li",[e._v("Regarding The name of the field, we replicate the previous field's name, "),t("code",[e._v("Table Number")]),e._v(", for consistency.")]),e._v(" "),t("li",[e._v("We could define a "),t("code",[e._v("Default value")]),e._v("; however, we'll keep it empty in the example.")]),e._v(" "),t("li",[t("code",[e._v("Helper Text")]),e._v(" This is the text provided below the field we are creating to indicate what you request from the customer.")]),e._v(" "),t("li",[e._v("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.")])]),e._v(" "),t("figure",[t("img",{attrs:{src:o(498),alt:"BTCPay Server formbuilder - Create new form",title:"BTCPay Server formbuilder - Create new form"}})]),e._v(" "),t("p",[e._v("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.")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(499),alt:"BTCPay Server formbuilder - Create new form",title:"BTCPay Server formbuilder - Create new form"}})]),e._v(" "),t("p",[e._v("Now that the first field is done, you can click on the "),t("code",[e._v("+ Add form element")]),e._v(" below your first field and create the rest of the required form fields. Once you've made all the fields, click "),t("code",[e._v("Save")]),e._v(" in the top right of your screen, and all should be set!")]),e._v(" "),t("figure",[t("img",{attrs:{src:o(500),alt:"BTCPay Server formbuilder - Create new form",title:"BTCPay Server formbuilder - Create new form"}})]),e._v(" "),t("p",[e._v("The "),t("code",[e._v("Form Builder")]),e._v(" makes creating custom forms flexible and easy. If you still require more personalization, as mentioned at the start of this guide, please read on "),t("RouterLink",{attrs:{to:"/AdvancedForms/"}},[e._v("Advanced Forms")]),e._v(" to learn about the JSON created in the "),t("code",[e._v("Code")]),e._v(" tab in the Form builder.")],1),e._v(" "),t("h2",{attrs:{id:"public-forms"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#public-forms"}},[e._v("#")]),e._v(" Public Forms")]),e._v(" "),t("p",[e._v("When "),t("code",[e._v("Allow form for public use")]),e._v(" 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.")]),e._v(" "),t("p",[e._v('By default, the invoice currency is set to the store\'s default currency, and the amount is set to "any".')]),e._v(" "),t("p",[e._v("You can configure the form to have a pre-configured currency and amount by creating fields with specific names.")]),e._v(" "),t("ul",[t("li",[e._v("Invoice currency: Create a field that has its name as "),t("code",[e._v("invoice_currency")]),e._v(". Make sure its value returns a valid currency code.")]),e._v(" "),t("li",[e._v("Invoice amount: Create a field that has its name as "),t("code",[e._v("invoice_amount")]),e._v(". Make sure its value returns a number.")])]),e._v(" "),t("p",[e._v("You can create these fields with type "),t("code",[e._v("hidden")]),e._v(" 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 "),t("code",[e._v("Constant")]),e._v(" to checked.")]),e._v(" "),t("p",[e._v("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.")]),e._v(" "),t("h2",{attrs:{id:"adjust-invoice-amounts-based-on-user-input"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#adjust-invoice-amounts-based-on-user-input"}},[e._v("#")]),e._v(" Adjust invoice amounts based on user input")]),e._v(" "),t("p",[e._v("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.")]),e._v(" "),t("p",[e._v("The form comes with such functionality as of BTCPay Server version 1.11.0. Any field that has its name start with "),t("code",[e._v("invoice_amount_adjustment")]),e._v(" (supported since v1.11) or "),t("code",[e._v("invoice_amount_multiply_adjustment")]),e._v(" (supported since v1.12) and its value being a valid number will automatically adjust the invoice amount.")]),e._v(" "),t("p",[e._v("This functionality currently works for public form usage and for the Point of Sale plugin.\nSee the "),t("RouterLink",{attrs:{to:"/AdvancedForms/#mirror-fields"}},[e._v("Mirror Fields")]),e._v(" section of the Advanced Forms guide for details.")],1),e._v(" "),t("h3",{attrs:{id:"charging-extra-based-on-shipping-method"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#charging-extra-based-on-shipping-method"}},[e._v("#")]),e._v(" Charging extra based on shipping method")]),e._v(" "),t("p",[e._v('Create a field of type "select", with the name '),t("code",[e._v("invoice_amount_adjustment_shipping_method")]),e._v(", and options that map to what shipping methods you have available. We will use 2 options: "),t("code",[e._v("DHL")]),e._v(" with a value of "),t("code",[e._v("10")]),e._v(" and "),t("code",[e._v("Fedex")]),e._v(" with a value of "),t("code",[e._v("20")]),e._v(". When a user selects either or, the invoice amount will be adjusted by 10 or 20 respectively.")]),e._v(" "),t("p",[e._v("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 "),t("code",[e._v("Mirror")]),e._v(" fields to accomplish this.")]),e._v(" "),t("p",[e._v("To save the user selected shipping method choice we must do the following instead:")]),e._v(" "),t("ul",[t("li",[e._v('Create a field of type "select", with the name '),t("code",[e._v("shipping_method")]),e._v(", and options that map to what shipping methods you have available. We will use 2 options: "),t("code",[e._v("DHL")]),e._v(" with a value of "),t("code",[e._v("dhl")]),e._v(" and "),t("code",[e._v("Fedex")]),e._v(" with a value of "),t("code",[e._v("fedex")]),e._v(".")]),e._v(" "),t("li",[e._v('Create a field of type "mirror", with the name '),t("code",[e._v("invoice_amount_adjustment_shipping_method")]),e._v(". In "),t("code",[e._v("Field to mirror")]),e._v(", select the "),t("code",[e._v("shipping_method")]),e._v(" field. And in "),t("code",[e._v("Value Mapper")]),e._v(", create all the options from "),t("code",[e._v("shipping_method")]),e._v(" and the value to charge.")])]),e._v(" "),t("h3",{attrs:{id:"promo-codes"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#promo-codes"}},[e._v("#")]),e._v(" Promo codes")]),e._v(" "),t("ul",[t("li",[e._v('Create a field of type "text", with the name '),t("code",[e._v("promoCode")]),e._v(".")]),e._v(" "),t("li",[e._v('Create a field of type "mirror", with the name '),t("code",[e._v("invoice_amount_adjustment_promo")]),e._v(". In "),t("code",[e._v("Field to mirror")]),e._v(", select the "),t("code",[e._v("promoCode")]),e._v(" field. And in "),t("code",[e._v("Value Mapper")]),e._v(", create all the promotional codes you wish to have available. For example set "),t("code",[e._v("Original Value")]),e._v(" to "),t("code",[e._v("chocolate")]),e._v(" and "),t("code",[e._v("Mapped Value")]),e._v(" to "),t("code",[e._v("-5")]),e._v(".")])]),e._v(" "),t("p",[e._v("When the user enters "),t("code",[e._v("chocolate")]),e._v(" in the promo code field, the invoice amount will be adjusted by -5.")]),e._v(" "),t("h3",{attrs:{id:"showing-user-input-on-the-receipt"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#showing-user-input-on-the-receipt"}},[e._v("#")]),e._v(" Showing user input on the receipt")]),e._v(" "),t("p",[e._v("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.")]),e._v(" "),t("ul",[t("li",[e._v("Create a field of type "),t("code",[e._v("fieldset")]),e._v(", with name "),t("code",[e._v("receiptData")]),e._v(".")]),e._v(" "),t("li",[e._v("For every field you wish to show in the receipt, create a field of type "),t("code",[e._v("mirror")]),e._v(", and set the "),t("code",[e._v("Field to mirror")]),e._v(" to the field you wish to copy over to the receipt.")])])])}),[],!1,null,null,null);t.default=i.exports}}]); \ No newline at end of file diff --git a/assets/js/41.b89f42cb.js b/assets/js/41.6bb6d0af.js similarity index 86% rename from assets/js/41.b89f42cb.js rename to assets/js/41.6bb6d0af.js index d933152a83..ed72c54192 100644 --- a/assets/js/41.b89f42cb.js +++ b/assets/js/41.6bb6d0af.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[41],{553:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Receive_1.9b34f175.png"},554:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Receive_2.46633674.png"},555:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Receive_3.9eede34c.png"},556:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Pay_1.b4dc6b43.png"},557:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Pay_2.8a0a51a4.png"},558:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Pay_3.6dc7c8c0.png"},559:function(e,a,t){e.exports=t.p+"assets/img/Payjoin_Guide_Pay_4.5608332a.png"},870: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(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("figure",[a("img",{attrs:{src:t(555),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(556),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(557),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(558),alt:"Receive PayJoin in BTCPay Server",title:"Receive PayJoin in BTCPay Server"}})]),e._v(" "),a("figure",[a("img",{attrs:{src:t(559),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"},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 diff --git a/assets/js/48.546b1a1c.js b/assets/js/48.a7c396c2.js similarity index 99% rename from assets/js/48.546b1a1c.js rename to assets/js/48.a7c396c2.js index 7c22d61c5f..e9ce3f5abf 100644 --- a/assets/js/48.546b1a1c.js +++ b/assets/js/48.a7c396c2.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"},808: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],{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 diff --git a/assets/js/53.de1685c3.js b/assets/js/53.7465bd8d.js similarity index 87% rename from assets/js/53.de1685c3.js rename to assets/js/53.7465bd8d.js index 578648fc2d..cc9fea9c66 100644 --- a/assets/js/53.de1685c3.js +++ b/assets/js/53.7465bd8d.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[53],{548:function(e,t,a){e.exports=a.p+"assets/img/PaymentRequestList.a24a908a.png"},549:function(e,t,a){e.exports=a.p+"assets/img/CreatePaymentRequest.98e26b82.png"},550:function(e,t,a){e.exports=a.p+"assets/img/NewPaymentRequest.f3ddaa42.png"},551:function(e,t,a){e.exports=a.p+"assets/img/PaymentRequestListOptions.606f0cf0.png"},552: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(548),alt:"Create Payment Request",title:"Create Payment Request"}})]),e._v(" "),t("figure",[t("img",{attrs:{src:a(549),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(550),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(551),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(552),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"},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 diff --git a/assets/js/67.7572d8d1.js b/assets/js/67.78656f08.js similarity index 99% rename from assets/js/67.7572d8d1.js rename to assets/js/67.78656f08.js index 1f73f3c120..6490098a18 100644 --- a/assets/js/67.7572d8d1.js +++ b/assets/js/67.78656f08.js @@ -1 +1 @@ -(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 +(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 diff --git a/assets/js/72.119678b2.js b/assets/js/72.f8ac4708.js similarity index 96% rename from assets/js/72.119678b2.js rename to assets/js/72.f8ac4708.js index c3410a1d13..ac89343cd4 100644 --- a/assets/js/72.119678b2.js +++ b/assets/js/72.f8ac4708.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[72],{523:function(e,t,i){e.exports=i.p+"assets/img/Invoices.d261efe1.png"},524:function(e,t,i){e.exports=i.p+"assets/img/InvoiceFiltering.71317a76.gif"},854: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(523),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(524),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],{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 diff --git a/assets/js/76.bd24ad38.js b/assets/js/76.2fb25567.js similarity index 99% rename from assets/js/76.bd24ad38.js rename to assets/js/76.2fb25567.js index 60c43e690a..8a59f6c500 100644 --- a/assets/js/76.bd24ad38.js +++ b/assets/js/76.2fb25567.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[76],{350:function(t,e,o){t.exports=o.p+"assets/img/BTCPayPointOfSale1.84c38097.jpg"},762: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],{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 diff --git a/assets/js/78.0606917e.js b/assets/js/78.9df980a0.js similarity index 97% rename from assets/js/78.0606917e.js rename to assets/js/78.9df980a0.js index cb97d3b143..85394d5300 100644 --- a/assets/js/78.0606917e.js +++ b/assets/js/78.9df980a0.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{356:function(e,t,a){e.exports=a.p+"assets/img/ImportWallet.c61d1458.png"},774:function(e,t,a){"use strict";a.r(t);var l=a(17),r=Object(l.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"connect-an-existing-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connect-an-existing-wallet"}},[e._v("#")]),e._v(" Connect an existing wallet")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(356),alt:"Import Existing Wallet",title:"Import Existing Wallet"}})]),e._v(" "),t("p",[e._v("By using an existing wallet, you can receive payments to the external wallet, without BTCPay Server knowing the wallet's private key. If a malicious attacker hacked your server and obtained the xpub, they could observe your transaction history, but cannot access the funds.")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#connect-hardware-wallet"}},[e._v("Connect hardware wallet (Recommended)")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#import-wallet-file"}},[e._v("Import Wallet file (Recommended)")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#enter-extended-public-key"}},[e._v("Enter extended public key")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#scan-wallet-qr-code"}},[e._v("Scan wallet QR code")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#enter-wallet-seed"}},[e._v("Enter wallet seed (Not Recommended)")])])]),e._v(" "),t("h3",{attrs:{id:"connect-hardware-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connect-hardware-wallet"}},[e._v("#")]),e._v(" Connect hardware wallet")]),e._v(" "),t("p",[e._v("Hardware wallets provide a good balance between security and ease of use. If you already have a hardware wallet set up, you can easily use it with your BTCPay Server. Thanks to built-in "),t("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[e._v("hardware wallet integration")]),e._v(" the xpub key from the hardware wallet is automatically added to your BTCPay Server. The integration further allows you to spend funds received to your store within BTCPay's "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("internal wallet")]),e._v(".")],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 you own a hardware wallet, follow the instructions on how to "),t("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[e._v("use a an existing hardware wallet with your BTCPay Server")])],1)]),e._v(" "),t("h3",{attrs:{id:"import-wallet-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#import-wallet-file"}},[e._v("#")]),e._v(" Import Wallet file")]),e._v(" "),t("p",[e._v("Using an existing software wallet assumes that you already have an external wallet created and backed up. In theory, any mobile/desktop wallet that provides an extended public key should work, however, most wallets have technical limitations "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("(gap-limit)")]),e._v(" that may cause serious user-experience problems for you later on.")],1),e._v(" "),t("p",[e._v("For that reason, we recommend that you only use software wallets listed below.")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/ElectrumWallet/"}},[e._v("Electrum Wallet")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WasabiWallet/"}},[e._v("Wasabi Wallet")])],1)]),e._v(" "),t("p",[e._v("Click on the links above and you will be redirected to a step by step tutorial on how to set up each particular software wallet with BTCPay Server.")]),e._v(" "),t("p",[e._v("To spend and manage the funds received to your external software wallet, you can use the "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("internal BTCPay Wallet")]),e._v(" and sign a transaction with your private key or simply manage the funds in that external wallet itself.")],1),e._v(" "),t("h3",{attrs:{id:"enter-extended-public-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enter-extended-public-key"}},[e._v("#")]),e._v(" Enter extended public key")]),e._v(" "),t("p",[e._v("This option can be useful if you want to modify "),t("RouterLink",{attrs:{to:"/FAQ/General/#what-if-i-have-a-problem-paying-an-invoice"}},[e._v("legacy wallet addresses")]),e._v(" or if your wallet type is not compatible with the Hardware Wallet Integration (Vault).")],1),e._v(" "),t("p",[e._v("This method requires you to configure your wallet connection manually and should only be used if you have a good understanding of wallet extended public keys, account key paths and master fingerprints.")]),e._v(" "),t("h3",{attrs:{id:"scan-wallet-qr-code"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#scan-wallet-qr-code"}},[e._v("#")]),e._v(" Scan wallet QR code")]),e._v(" "),t("p",[e._v("Some wallets allow you to create a wallet and export the extended public key (xPub) using a QR Code. You can easily connect your BTCPay Server to these types of wallets with the scan QR code option. The common "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("(gap-limit)")]),e._v(" issue is likely to occur using any xPub, unless the wallet provider has a way to adjust it.")],1),e._v(" "),t("p",[e._v("To spend and manage the funds in your "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("internal BTCPay Wallet")]),e._v(" you will need to provide the private key (used to generate the xpub QR Code) during transaction signing or simply receive funds through your BTCPay and manage the funds in the external wallet.")],1),e._v(" "),t("h3",{attrs:{id:"enter-wallet-seed"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enter-wallet-seed"}},[e._v("#")]),e._v(" Enter wallet seed")]),e._v(" "),t("p",[e._v("This option is useful if you have "),t("strong",[e._v("no other way")]),e._v(" of spending funds in a certain wallet. Such as an altcoin wallet that was previously compatible with the hardware wallet integration but no longer is. In general you should never type wallet seed words on any internet connected device.")]),e._v(" "),t("p",[e._v("This method requires you to configure your wallet connection manually and should only be used if you have a good understanding of wallet formats, extended public keys, account key paths and master fingerprints.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[78],{368:function(e,t,a){e.exports=a.p+"assets/img/ImportWallet.c61d1458.png"},775:function(e,t,a){"use strict";a.r(t);var l=a(17),r=Object(l.a)({},(function(){var e=this,t=e._self._c;return t("ContentSlotsDistributor",{attrs:{"slot-key":e.$parent.slotKey}},[t("h2",{attrs:{id:"connect-an-existing-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connect-an-existing-wallet"}},[e._v("#")]),e._v(" Connect an existing wallet")]),e._v(" "),t("figure",[t("img",{attrs:{src:a(368),alt:"Import Existing Wallet",title:"Import Existing Wallet"}})]),e._v(" "),t("p",[e._v("By using an existing wallet, you can receive payments to the external wallet, without BTCPay Server knowing the wallet's private key. If a malicious attacker hacked your server and obtained the xpub, they could observe your transaction history, but cannot access the funds.")]),e._v(" "),t("ul",[t("li",[t("a",{attrs:{href:"#connect-hardware-wallet"}},[e._v("Connect hardware wallet (Recommended)")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#import-wallet-file"}},[e._v("Import Wallet file (Recommended)")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#enter-extended-public-key"}},[e._v("Enter extended public key")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#scan-wallet-qr-code"}},[e._v("Scan wallet QR code")])]),e._v(" "),t("li",[t("a",{attrs:{href:"#enter-wallet-seed"}},[e._v("Enter wallet seed (Not Recommended)")])])]),e._v(" "),t("h3",{attrs:{id:"connect-hardware-wallet"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#connect-hardware-wallet"}},[e._v("#")]),e._v(" Connect hardware wallet")]),e._v(" "),t("p",[e._v("Hardware wallets provide a good balance between security and ease of use. If you already have a hardware wallet set up, you can easily use it with your BTCPay Server. Thanks to built-in "),t("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[e._v("hardware wallet integration")]),e._v(" the xpub key from the hardware wallet is automatically added to your BTCPay Server. The integration further allows you to spend funds received to your store within BTCPay's "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("internal wallet")]),e._v(".")],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 you own a hardware wallet, follow the instructions on how to "),t("RouterLink",{attrs:{to:"/HardwareWalletIntegration/"}},[e._v("use a an existing hardware wallet with your BTCPay Server")])],1)]),e._v(" "),t("h3",{attrs:{id:"import-wallet-file"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#import-wallet-file"}},[e._v("#")]),e._v(" Import Wallet file")]),e._v(" "),t("p",[e._v("Using an existing software wallet assumes that you already have an external wallet created and backed up. In theory, any mobile/desktop wallet that provides an extended public key should work, however, most wallets have technical limitations "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("(gap-limit)")]),e._v(" that may cause serious user-experience problems for you later on.")],1),e._v(" "),t("p",[e._v("For that reason, we recommend that you only use software wallets listed below.")]),e._v(" "),t("ul",[t("li",[t("RouterLink",{attrs:{to:"/ElectrumWallet/"}},[e._v("Electrum Wallet")])],1),e._v(" "),t("li",[t("RouterLink",{attrs:{to:"/WasabiWallet/"}},[e._v("Wasabi Wallet")])],1)]),e._v(" "),t("p",[e._v("Click on the links above and you will be redirected to a step by step tutorial on how to set up each particular software wallet with BTCPay Server.")]),e._v(" "),t("p",[e._v("To spend and manage the funds received to your external software wallet, you can use the "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("internal BTCPay Wallet")]),e._v(" and sign a transaction with your private key or simply manage the funds in that external wallet itself.")],1),e._v(" "),t("h3",{attrs:{id:"enter-extended-public-key"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enter-extended-public-key"}},[e._v("#")]),e._v(" Enter extended public key")]),e._v(" "),t("p",[e._v("This option can be useful if you want to modify "),t("RouterLink",{attrs:{to:"/FAQ/General/#what-if-i-have-a-problem-paying-an-invoice"}},[e._v("legacy wallet addresses")]),e._v(" or if your wallet type is not compatible with the Hardware Wallet Integration (Vault).")],1),e._v(" "),t("p",[e._v("This method requires you to configure your wallet connection manually and should only be used if you have a good understanding of wallet extended public keys, account key paths and master fingerprints.")]),e._v(" "),t("h3",{attrs:{id:"scan-wallet-qr-code"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#scan-wallet-qr-code"}},[e._v("#")]),e._v(" Scan wallet QR code")]),e._v(" "),t("p",[e._v("Some wallets allow you to create a wallet and export the extended public key (xPub) using a QR Code. You can easily connect your BTCPay Server to these types of wallets with the scan QR code option. The common "),t("RouterLink",{attrs:{to:"/FAQ/Wallet/#missing-payments-in-my-software-or-hardware-wallet"}},[e._v("(gap-limit)")]),e._v(" issue is likely to occur using any xPub, unless the wallet provider has a way to adjust it.")],1),e._v(" "),t("p",[e._v("To spend and manage the funds in your "),t("RouterLink",{attrs:{to:"/Wallet/"}},[e._v("internal BTCPay Wallet")]),e._v(" you will need to provide the private key (used to generate the xpub QR Code) during transaction signing or simply receive funds through your BTCPay and manage the funds in the external wallet.")],1),e._v(" "),t("h3",{attrs:{id:"enter-wallet-seed"}},[t("a",{staticClass:"header-anchor",attrs:{href:"#enter-wallet-seed"}},[e._v("#")]),e._v(" Enter wallet seed")]),e._v(" "),t("p",[e._v("This option is useful if you have "),t("strong",[e._v("no other way")]),e._v(" of spending funds in a certain wallet. Such as an altcoin wallet that was previously compatible with the hardware wallet integration but no longer is. In general you should never type wallet seed words on any internet connected device.")]),e._v(" "),t("p",[e._v("This method requires you to configure your wallet connection manually and should only be used if you have a good understanding of wallet formats, extended public keys, account key paths and master fingerprints.")])])}),[],!1,null,null,null);t.default=r.exports}}]); \ No newline at end of file diff --git a/assets/js/80.1c986895.js b/assets/js/80.09b42ef2.js similarity index 94% rename from assets/js/80.1c986895.js rename to assets/js/80.09b42ef2.js index d57ed67ecb..cc8d3b2b8c 100644 --- a/assets/js/80.1c986895.js +++ b/assets/js/80.09b42ef2.js @@ -1 +1 @@ -(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 +(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 diff --git a/assets/js/84.09891e28.js b/assets/js/84.88cedb38.js similarity index 98% rename from assets/js/84.09891e28.js rename to assets/js/84.88cedb38.js index ccb2144644..27f74df996 100644 --- a/assets/js/84.09891e28.js +++ b/assets/js/84.88cedb38.js @@ -1 +1 @@ -(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 +(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 diff --git a/assets/js/87.23c7b355.js b/assets/js/87.b75e9822.js similarity index 99% rename from assets/js/87.23c7b355.js rename to assets/js/87.b75e9822.js index 5657922a01..8c54af1065 100644 --- a/assets/js/87.23c7b355.js +++ b/assets/js/87.b75e9822.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[87],{512:function(t,e,a){t.exports=a.p+"assets/img/BTCPayServerScreenshot.276d0810.png"},852: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(512),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),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 diff --git a/assets/js/88.7bdcb920.js b/assets/js/88.25ff612b.js similarity index 96% rename from assets/js/88.7bdcb920.js rename to assets/js/88.25ff612b.js index c291eb3eec..9197776bf6 100644 --- a/assets/js/88.7bdcb920.js +++ b/assets/js/88.25ff612b.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[88],{525:function(t,e,a){t.exports=a.p+"assets/img/support.970aea07.png"},855: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(525),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],{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 diff --git a/assets/js/91.b8cc05dc.js b/assets/js/91.62310f4b.js similarity index 99% rename from assets/js/91.b8cc05dc.js rename to assets/js/91.62310f4b.js index 0970310d6c..4fc29655b9 100644 --- a/assets/js/91.b8cc05dc.js +++ b/assets/js/91.62310f4b.js @@ -1 +1 @@ -(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 +(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 diff --git a/assets/js/95.217b4f78.js b/assets/js/95.45ab5873.js similarity index 98% rename from assets/js/95.217b4f78.js rename to assets/js/95.45ab5873.js index 974d734817..fdf86ca300 100644 --- a/assets/js/95.217b4f78.js +++ b/assets/js/95.45ab5873.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[95],{647:function(e,t,a){e.exports=a.p+"assets/img/Sequence.94c7564b.svg"},897: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(647),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],{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 diff --git a/assets/js/96.e5b0330c.js b/assets/js/96.9898986c.js similarity index 99% rename from assets/js/96.e5b0330c.js rename to assets/js/96.9898986c.js index 3cba95cc12..00576e5049 100644 --- a/assets/js/96.e5b0330c.js +++ b/assets/js/96.9898986c.js @@ -1 +1 @@ -(window.webpackJsonp=window.webpackJsonp||[]).push([[96],{761: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:"tooling"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tooling"}},[t._v("#")]),t._v(" Tooling")]),t._v(" "),e("p",[t._v("This README describe some useful tooling that you may need during development and testing.\nTo learn how to get started with your local development environment, read "),e("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[t._v("our documentation")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"how-to-manually-test-payments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-manually-test-payments"}},[t._v("#")]),t._v(" How to manually test payments")]),t._v(" "),e("h3",{attrs:{id:"using-the-test-bitcoin-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-bitcoin-cli"}},[t._v("#")]),t._v(" Using the test bitcoin-cli")]),t._v(" "),e("p",[t._v("You can call bitcoin-cli inside the container with "),e("code",[t._v("docker exec")]),t._v(".\nFor example, if you want to send "),e("code",[t._v("0.23111090")]),t._v(" to "),e("code",[t._v("mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v("./docker-bitcoin-cli.sh sendtoaddress "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.23111090")]),t._v("\n")])])]),e("p",[t._v("If you are using Powershell:")]),t._v(" "),e("div",{staticClass:"language-powershell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-powershell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\\docker-bitcoin-"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cli")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ps1 sendtoaddress "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf"')]),t._v(" 0"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("23111090\n")])])]),e("p",[t._v("You can also generate blocks:")]),t._v(" "),e("div",{staticClass:"language-powershell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-powershell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\\docker-bitcoin-generate"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ps1 3\n")])])]),e("h3",{attrs:{id:"using-polar-to-test-lightning-payments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-polar-to-test-lightning-payments"}},[t._v("#")]),t._v(" Using Polar to test Lightning payments")]),t._v(" "),e("ul",[e("li",[t._v("Install and run "),e("a",{attrs:{href:"https://lightningpolar.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Polar"),e("OutboundLink")],1),t._v(". Setup a small network of nodes.")]),t._v(" "),e("li",[t._v("Go to your store's General Settings and enable Lightning.")]),t._v(" "),e("li",[t._v("Build your connection string using the Connect information in the Polar app.")])]),t._v(" "),e("p",[t._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')]),t._v(" "),e("p",[t._v("Now you can create a Lightning invoice on BTCPay Server regtest and make a payment through Polar.")]),t._v(" "),e("p",[t._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".')]),t._v(" "),e("h3",{attrs:{id:"using-the-test-litecoin-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-litecoin-cli"}},[t._v("#")]),t._v(" Using the test litecoin-cli")]),t._v(" "),e("p",[t._v("Same as bitcoin-cli, but with "),e("code",[t._v(".\\docker-litecoin-cli.ps1")]),t._v(" and "),e("code",[t._v(".\\docker-litecoin-cli.sh")]),t._v(" instead.")]),t._v(" "),e("h3",{attrs:{id:"using-the-test-lightning-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-lightning-cli"}},[t._v("#")]),t._v(" Using the test lightning-cli")]),t._v(" "),e("p",[t._v("If you are using Linux:")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v("./docker-customer-lightning-cli.sh pay lnbcrt100u1pd2e6uspp5ajnadvhazjrz55twd5k6yeg9u87wpw0q2fdr7g960yl5asv5fmnqdq9d3hkccqpxmedyrk0ehw5ueqx5e0r4qrrv74cewddfcvsxaawqz7634cmjj39sqwy5tvhz0hasktkk6t9pqfdh3edmf3z09zst5y7khv3rvxh8ctqqw6mwhh\n")])])]),e("p",[t._v("If you are using Powershell:")]),t._v(" "),e("div",{staticClass:"language-powershell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-powershell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\\docker-customer-lightning-"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cli")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ps1 pay lnbcrt100u1pd2e6uspp5ajnadvhazjrz55twd5k6yeg9u87wpw0q2fdr7g960yl5asv5fmnqdq9d3hkccqpxmedyrk0ehw5ueqx5e0r4qrrv74cewddfcvsxaawqz7634cmjj39sqwy5tvhz0hasktkk6t9pqfdh3edmf3z09zst5y7khv3rvxh8ctqqw6mwhh\n")])])]),e("p",[t._v("If you get this message:")]),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(" "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"code"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("205")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"message"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Could not find a route"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"data"')]),t._v(" "),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 property"}},[t._v('"getroute_tries"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"sendpay_tries"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("Please, run the test "),e("code",[t._v("CanSetLightningServer")]),t._v(", this will establish a channel between the customer and the merchant, then, retry.")]),t._v(" "),e("p",[t._v("Alternatively you can run the "),e("code",[t._v("./docker-lightning-channel-setup.sh")]),t._v(" script to establish the channel connection.\nThe "),e("code",[t._v("./docker-lightning-channel-teardown.sh")]),t._v(" script closes any existing lightning channels.")]),t._v(" "),e("h3",{attrs:{id:"alternative-lightning-testing-using-polar-to-test-lightning-payments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#alternative-lightning-testing-using-polar-to-test-lightning-payments"}},[t._v("#")]),t._v(" Alternative Lightning testing: Using Polar to test Lightning payments")]),t._v(" "),e("ul",[e("li",[t._v("Install and run "),e("a",{attrs:{href:"https://lightningpolar.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Polar"),e("OutboundLink")],1),t._v(". Setup a small network of nodes.")]),t._v(" "),e("li",[t._v("Go to your store's General Settings and enable Lightning.")]),t._v(" "),e("li",[t._v("Build your connection string using the Connect information in the Polar app.")])]),t._v(" "),e("p",[t._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')]),t._v(" "),e("p",[t._v("Now you can create a lightning invoice on BTCPay Server regtest and make a payment through Polar.")]),t._v(" "),e("p",[t._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".')]),t._v(" "),e("h2",{attrs:{id:"faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[t._v("#")]),t._v(" FAQ")]),t._v(" "),e("h3",{attrs:{id:"docker-compose-up-dev-failed-or-tests-are-not-passing-what-should-i-do"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#docker-compose-up-dev-failed-or-tests-are-not-passing-what-should-i-do"}},[t._v("#")]),t._v(" "),e("code",[t._v("docker-compose up dev")]),t._v(" failed or tests are not passing, what should I do?")]),t._v(" "),e("ol",[e("li",[t._v("Run "),e("code",[t._v("docker-compose down --volumes")]),t._v(" (this will reset your test environment)")]),t._v(" "),e("li",[t._v("Run "),e("code",[t._v("docker-compose pull")]),t._v(" (this will ensure you have the latest images)")]),t._v(" "),e("li",[t._v("Run again with "),e("code",[t._v("docker-compose up dev")])])]),t._v(" "),e("h3",{attrs:{id:"how-to-run-the-altcoin-environment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-altcoin-environment"}},[t._v("#")]),t._v(" How to run the Altcoin environment?")]),t._v(" "),e("p",[e("code",[t._v("docker-compose -f docker-compose.altcoins.yml up dev")])]),t._v(" "),e("p",[t._v("If you still have issues, try to restart docker.")]),t._v(" "),e("h3",{attrs:{id:"how-to-run-the-selenium-test-with-a-browser"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-selenium-test-with-a-browser"}},[t._v("#")]),t._v(" How to run the Selenium test with a browser?")]),t._v(" "),e("p",[t._v("Run "),e("code",[t._v("dotnet user-secrets set RunSeleniumInBrowser true")]),t._v(" to run tests in browser.")]),t._v(" "),e("p",[t._v("To switch back to headless mode (recommended) you can run "),e("code",[t._v("dotnet user-secrets remove RunSeleniumInBrowser")]),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"session-not-created-this-version-of-chromedriver-only-supports-chrome-version-88"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#session-not-created-this-version-of-chromedriver-only-supports-chrome-version-88"}},[t._v("#")]),t._v(" Session not created: This version of ChromeDriver only supports Chrome version 88")]),t._v(" "),e("p",[t._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.")]),t._v(" "),e("p",[t._v("If you want to use a older chrome driver on "),e("a",{attrs:{href:"https://chromedriver.chromium.org/downloads",target:"_blank",rel:"noopener noreferrer"}},[t._v("this page"),e("OutboundLink")],1),t._v(" then point to it with")]),t._v(" "),e("p",[e("code",[t._v('dotnet user-secrets set ChromeDriverDirectory "path/to/the/driver/directory"')])])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file +(window.webpackJsonp=window.webpackJsonp||[]).push([[96],{762: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:"tooling"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#tooling"}},[t._v("#")]),t._v(" Tooling")]),t._v(" "),e("p",[t._v("This README describe some useful tooling that you may need during development and testing.\nTo learn how to get started with your local development environment, read "),e("RouterLink",{attrs:{to:"/Development/LocalDevelopment/"}},[t._v("our documentation")]),t._v(".")],1),t._v(" "),e("h2",{attrs:{id:"how-to-manually-test-payments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-manually-test-payments"}},[t._v("#")]),t._v(" How to manually test payments")]),t._v(" "),e("h3",{attrs:{id:"using-the-test-bitcoin-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-bitcoin-cli"}},[t._v("#")]),t._v(" Using the test bitcoin-cli")]),t._v(" "),e("p",[t._v("You can call bitcoin-cli inside the container with "),e("code",[t._v("docker exec")]),t._v(".\nFor example, if you want to send "),e("code",[t._v("0.23111090")]),t._v(" to "),e("code",[t._v("mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf")]),t._v(":")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v("./docker-bitcoin-cli.sh sendtoaddress "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0.23111090")]),t._v("\n")])])]),e("p",[t._v("If you are using Powershell:")]),t._v(" "),e("div",{staticClass:"language-powershell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-powershell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\\docker-bitcoin-"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cli")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ps1 sendtoaddress "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"mohu16LH66ptoWGEL1GtP6KHTBJYXMWhEf"')]),t._v(" 0"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("23111090\n")])])]),e("p",[t._v("You can also generate blocks:")]),t._v(" "),e("div",{staticClass:"language-powershell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-powershell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\\docker-bitcoin-generate"),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ps1 3\n")])])]),e("h3",{attrs:{id:"using-polar-to-test-lightning-payments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-polar-to-test-lightning-payments"}},[t._v("#")]),t._v(" Using Polar to test Lightning payments")]),t._v(" "),e("ul",[e("li",[t._v("Install and run "),e("a",{attrs:{href:"https://lightningpolar.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Polar"),e("OutboundLink")],1),t._v(". Setup a small network of nodes.")]),t._v(" "),e("li",[t._v("Go to your store's General Settings and enable Lightning.")]),t._v(" "),e("li",[t._v("Build your connection string using the Connect information in the Polar app.")])]),t._v(" "),e("p",[t._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')]),t._v(" "),e("p",[t._v("Now you can create a Lightning invoice on BTCPay Server regtest and make a payment through Polar.")]),t._v(" "),e("p",[t._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".')]),t._v(" "),e("h3",{attrs:{id:"using-the-test-litecoin-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-litecoin-cli"}},[t._v("#")]),t._v(" Using the test litecoin-cli")]),t._v(" "),e("p",[t._v("Same as bitcoin-cli, but with "),e("code",[t._v(".\\docker-litecoin-cli.ps1")]),t._v(" and "),e("code",[t._v(".\\docker-litecoin-cli.sh")]),t._v(" instead.")]),t._v(" "),e("h3",{attrs:{id:"using-the-test-lightning-cli"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#using-the-test-lightning-cli"}},[t._v("#")]),t._v(" Using the test lightning-cli")]),t._v(" "),e("p",[t._v("If you are using Linux:")]),t._v(" "),e("div",{staticClass:"language-sh extra-class"},[e("pre",{pre:!0,attrs:{class:"language-sh"}},[e("code",[t._v("./docker-customer-lightning-cli.sh pay lnbcrt100u1pd2e6uspp5ajnadvhazjrz55twd5k6yeg9u87wpw0q2fdr7g960yl5asv5fmnqdq9d3hkccqpxmedyrk0ehw5ueqx5e0r4qrrv74cewddfcvsxaawqz7634cmjj39sqwy5tvhz0hasktkk6t9pqfdh3edmf3z09zst5y7khv3rvxh8ctqqw6mwhh\n")])])]),e("p",[t._v("If you are using Powershell:")]),t._v(" "),e("div",{staticClass:"language-powershell extra-class"},[e("pre",{pre:!0,attrs:{class:"language-powershell"}},[e("code",[e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("\\docker-customer-lightning-"),e("span",{pre:!0,attrs:{class:"token function"}},[t._v("cli")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(".")]),t._v("ps1 pay lnbcrt100u1pd2e6uspp5ajnadvhazjrz55twd5k6yeg9u87wpw0q2fdr7g960yl5asv5fmnqdq9d3hkccqpxmedyrk0ehw5ueqx5e0r4qrrv74cewddfcvsxaawqz7634cmjj39sqwy5tvhz0hasktkk6t9pqfdh3edmf3z09zst5y7khv3rvxh8ctqqw6mwhh\n")])])]),e("p",[t._v("If you get this message:")]),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(" "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"code"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("205")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"message"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token string"}},[t._v('"Could not find a route"')]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"data"')]),t._v(" "),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 property"}},[t._v('"getroute_tries"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("1")]),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v(",")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token property"}},[t._v('"sendpay_tries"')]),t._v(" "),e("span",{pre:!0,attrs:{class:"token operator"}},[t._v(":")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token number"}},[t._v("0")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v(" "),e("span",{pre:!0,attrs:{class:"token punctuation"}},[t._v("}")]),t._v("\n")])])]),e("p",[t._v("Please, run the test "),e("code",[t._v("CanSetLightningServer")]),t._v(", this will establish a channel between the customer and the merchant, then, retry.")]),t._v(" "),e("p",[t._v("Alternatively you can run the "),e("code",[t._v("./docker-lightning-channel-setup.sh")]),t._v(" script to establish the channel connection.\nThe "),e("code",[t._v("./docker-lightning-channel-teardown.sh")]),t._v(" script closes any existing lightning channels.")]),t._v(" "),e("h3",{attrs:{id:"alternative-lightning-testing-using-polar-to-test-lightning-payments"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#alternative-lightning-testing-using-polar-to-test-lightning-payments"}},[t._v("#")]),t._v(" Alternative Lightning testing: Using Polar to test Lightning payments")]),t._v(" "),e("ul",[e("li",[t._v("Install and run "),e("a",{attrs:{href:"https://lightningpolar.com/",target:"_blank",rel:"noopener noreferrer"}},[t._v("Polar"),e("OutboundLink")],1),t._v(". Setup a small network of nodes.")]),t._v(" "),e("li",[t._v("Go to your store's General Settings and enable Lightning.")]),t._v(" "),e("li",[t._v("Build your connection string using the Connect information in the Polar app.")])]),t._v(" "),e("p",[t._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')]),t._v(" "),e("p",[t._v("Now you can create a lightning invoice on BTCPay Server regtest and make a payment through Polar.")]),t._v(" "),e("p",[t._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".')]),t._v(" "),e("h2",{attrs:{id:"faq"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#faq"}},[t._v("#")]),t._v(" FAQ")]),t._v(" "),e("h3",{attrs:{id:"docker-compose-up-dev-failed-or-tests-are-not-passing-what-should-i-do"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#docker-compose-up-dev-failed-or-tests-are-not-passing-what-should-i-do"}},[t._v("#")]),t._v(" "),e("code",[t._v("docker-compose up dev")]),t._v(" failed or tests are not passing, what should I do?")]),t._v(" "),e("ol",[e("li",[t._v("Run "),e("code",[t._v("docker-compose down --volumes")]),t._v(" (this will reset your test environment)")]),t._v(" "),e("li",[t._v("Run "),e("code",[t._v("docker-compose pull")]),t._v(" (this will ensure you have the latest images)")]),t._v(" "),e("li",[t._v("Run again with "),e("code",[t._v("docker-compose up dev")])])]),t._v(" "),e("h3",{attrs:{id:"how-to-run-the-altcoin-environment"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-altcoin-environment"}},[t._v("#")]),t._v(" How to run the Altcoin environment?")]),t._v(" "),e("p",[e("code",[t._v("docker-compose -f docker-compose.altcoins.yml up dev")])]),t._v(" "),e("p",[t._v("If you still have issues, try to restart docker.")]),t._v(" "),e("h3",{attrs:{id:"how-to-run-the-selenium-test-with-a-browser"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#how-to-run-the-selenium-test-with-a-browser"}},[t._v("#")]),t._v(" How to run the Selenium test with a browser?")]),t._v(" "),e("p",[t._v("Run "),e("code",[t._v("dotnet user-secrets set RunSeleniumInBrowser true")]),t._v(" to run tests in browser.")]),t._v(" "),e("p",[t._v("To switch back to headless mode (recommended) you can run "),e("code",[t._v("dotnet user-secrets remove RunSeleniumInBrowser")]),t._v(".")]),t._v(" "),e("h3",{attrs:{id:"session-not-created-this-version-of-chromedriver-only-supports-chrome-version-88"}},[e("a",{staticClass:"header-anchor",attrs:{href:"#session-not-created-this-version-of-chromedriver-only-supports-chrome-version-88"}},[t._v("#")]),t._v(" Session not created: This version of ChromeDriver only supports Chrome version 88")]),t._v(" "),e("p",[t._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.")]),t._v(" "),e("p",[t._v("If you want to use a older chrome driver on "),e("a",{attrs:{href:"https://chromedriver.chromium.org/downloads",target:"_blank",rel:"noopener noreferrer"}},[t._v("this page"),e("OutboundLink")],1),t._v(" then point to it with")]),t._v(" "),e("p",[e("code",[t._v('dotnet user-secrets set ChromeDriverDirectory "path/to/the/driver/directory"')])])])}),[],!1,null,null,null);e.default=a.exports}}]); \ No newline at end of file diff --git a/assets/js/app.e4bdef9f.js b/assets/js/app.f6e25125.js similarity index 87% rename from assets/js/app.e4bdef9f.js rename to assets/js/app.f6e25125.js index de4dc44a60..b434c531f5 100644 --- a/assets/js/app.e4bdef9f.js +++ b/assets/js/app.f6e25125.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 071fb13439..4e3021edb7 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -1 +1 @@ -https://docs.btcpayserver.org/AdvancedForms/dailyhttps://docs.btcpayserver.org/BTCPayServer/LocalDevSetup/dailyhttps://docs.btcpayserver.org/Apps/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/ConnectWallet/dailyhttps://docs.btcpayserver.org/Contribute/Design/dailyhttps://docs.btcpayserver.org/Configurator/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/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/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/ManualDeployment/dailyhttps://docs.btcpayserver.org/Deployment/ManualDeploymentExtended/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/ThirdPartyHosting/dailyhttps://docs.btcpayserver.org/Deployment/voltagecloud/dailyhttps://docs.btcpayserver.org/Deployment/webdeployment/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/Drupal/dailyhttps://docs.btcpayserver.org/Docker/tallycoin-connect/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/Grandnode/dailyhttps://docs.btcpayserver.org/Forms/dailyhttps://docs.btcpayserver.org/HardwareWalletIntegration/dailyhttps://docs.btcpayserver.org/Guide/dailyhttps://docs.btcpayserver.org/InvoiceNinja/dailyhttps://docs.btcpayserver.org/Invoices/dailyhttps://docs.btcpayserver.org/LNDhubAPI/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-Schema/dailyhttps://docs.btcpayserver.org/NBXplorer/Postgres-Migration/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/PaymentRequests/dailyhttps://docs.btcpayserver.org/Payjoin/dailyhttps://docs.btcpayserver.org/Payouts/dailyhttps://docs.btcpayserver.org/Payroll/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/Shopware/dailyhttps://docs.btcpayserver.org/SideShift/dailyhttps://docs.btcpayserver.org/Sign-PSBT-with-sparrow-wallet/dailyhttps://docs.btcpayserver.org/Support/dailyhttps://docs.btcpayserver.org/Translations/dailyhttps://docs.btcpayserver.org/Smartstore/dailyhttps://docs.btcpayserver.org/TicketTailor/dailyhttps://docs.btcpayserver.org/Transmuter/DCA/dailyhttps://docs.btcpayserver.org/Transmuter/EmailReceiptsPreset/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/Vault/dailyhttps://docs.btcpayserver.org/Wabisabi/dailyhttps://docs.btcpayserver.org/VirtueMart/dailyhttps://docs.btcpayserver.org/Walkthrough/dailyhttps://docs.btcpayserver.org/Wallet/dailyhttps://docs.btcpayserver.org/WasabiWallet/dailyhttps://docs.btcpayserver.org/WalletSetup/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/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