From 7459f7aff6ebcb6f22cd952b561dfddd2ff197c4 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 10:06:12 -0700 Subject: [PATCH 1/7] Editing readme --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 563c21f..bb7c5e6 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,10 @@ [![License](https://img.shields.io/npm/l/@psf/bch-js)](https://github.com/Permissionless-Software-Foundation/bch-js/blob/master/LICENSE.md) [![js-standard-style](https://img.shields.io/badge/javascript-standard%20code%20style-green.svg?style=flat-square)](https://github.com/feross/standard) -This is a REST API server, written in node.js JavaScript, using [Express.js](https://expressjs.com/) framework. The purpose of this code is to create a REST API server that provides a common interface for working with a Bitcoin Cash full node and various indexers. See [this article](https://psfoundation.cash/blog/cash-stack) to learn about the 'Cash Stack'. Visit [FullStack.cash](https://fullstack.cash), sign up for a free account, and use this REST API right away with the [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) JavaScript library. +This is a REST API server, written in node.js JavaScript, using [Express.js](https://expressjs.com/) framework. The purpose of this code is to create a REST API server that provides a common interface for developers to build blockchain-based business applications. This software works with the Bitcoin Cash (BCH) and eCash (XEC) blockchains. +- High-level documentation is available on [CashStack.info](https://cashstack.info). + +While developers are encouraged to run and manage their own infrastructure, cloud-based infrastructure is available via [FullStack.cash](https://fullstack.cash). Sign up for a free account, and use this REST API right away with the [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) JavaScript library. This repository is intended to be paired with [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js), an npm JavaScript library for building Bitcoin Cash apps. From 7a3e03c4b7d82a10bf38bca8c562637cca2e0bfd Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 10:09:52 -0700 Subject: [PATCH 2/7] Editing readme --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bb7c5e6..7fe0f8e 100644 --- a/README.md +++ b/README.md @@ -3,10 +3,10 @@ [![License](https://img.shields.io/npm/l/@psf/bch-js)](https://github.com/Permissionless-Software-Foundation/bch-js/blob/master/LICENSE.md) [![js-standard-style](https://img.shields.io/badge/javascript-standard%20code%20style-green.svg?style=flat-square)](https://github.com/feross/standard) -This is a REST API server, written in node.js JavaScript, using [Express.js](https://expressjs.com/) framework. The purpose of this code is to create a REST API server that provides a common interface for developers to build blockchain-based business applications. This software works with the Bitcoin Cash (BCH) and eCash (XEC) blockchains. +This is a REST API server, written in node.js JavaScript, using the [Express.js](https://expressjs.com/) framework. The purpose of this code is to create a REST API server that provides a common interface for developers to build blockchain-based business applications. This software works with the Bitcoin Cash (BCH) and eCash (XEC) blockchains. - High-level documentation is available on [CashStack.info](https://cashstack.info). -While developers are encouraged to run and manage their own infrastructure, cloud-based infrastructure is available via [FullStack.cash](https://fullstack.cash). Sign up for a free account, and use this REST API right away with the [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) JavaScript library. +While developers are encouraged to run and manage their own infrastructure, cloud-based infrastructure is available via [FullStack.cash](https://fullstack.cash). Free and paid tiers are available. You can use this REST API right away with the [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) JavaScript library. This repository is intended to be paired with [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js), an npm JavaScript library for building Bitcoin Cash apps. From 776628ae9ef18ba683fd9f6604b7dc08b3c2bef2 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 10:22:09 -0700 Subject: [PATCH 3/7] Editing readme --- README.md | 16 ++++++++++------ diagrams/bch-api-dependency-graph.dia | Bin 0 -> 1433 bytes diagrams/bch-api-dependency-graph.png | Bin 0 -> 13529 bytes 3 files changed, 10 insertions(+), 6 deletions(-) create mode 100644 diagrams/bch-api-dependency-graph.dia create mode 100644 diagrams/bch-api-dependency-graph.png diff --git a/README.md b/README.md index 7fe0f8e..31764e7 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,21 @@ This is a REST API server, written in node.js JavaScript, using the [Express.js] While developers are encouraged to run and manage their own infrastructure, cloud-based infrastructure is available via [FullStack.cash](https://fullstack.cash). Free and paid tiers are available. You can use this REST API right away with the [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) JavaScript library. -This repository is intended to be paired with [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js), an npm JavaScript library for building Bitcoin Cash apps. +This repository is intended to be paired with [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js), an npm JavaScript library for building Bitcoin Cash apps. [Code examples](https://github.com/Permissionless-Software-Foundation/bch-js-examples) for common use-cases are available. And the [minimal-slp-wallet](https://www.npmjs.com/package/minimal-slp-wallet) is a front end JavaScript library that incorporates bch-js and provides basic wallet functionality. -![Cash Stack Network Diagram](./generic-network-diagram.png) +![bch-api dependency diagram](./diagrams/bch-api-dependency-graph.png) -Both bch-api and bch-js are part of the 'Cash Stack' [full stack of BCH software](https://troutsblog.com/research/bitcoin-cash/how-to-bch-full-stack-developer). +Both bch-api and bch-js are part of the [Cash Stack](https://cashstack.info). -- [API Documentation](https://fullstack.cash/documentation) -- [Example Code](https://fullstack.cash/examples) +- [CashStack](https://cashstack.info) high-level documentation. +- [bch-api REST API reference](https://api.fullstack.cash/docs/) +- [bch-js JavaScript API reference](https://bchjs.fullstack.cash/) +- [bch-js example code](https://github.com/Permissionless-Software-Foundation/bch-js-examples) +- [Additional documentation on FullStack.cash](https://fullstack.cash/documentation) +- [Additional examples on FullStack.cash](https://fullstack.cash/examples) Have questions? Need help? Join our community support: -[Telegram channel](https://t.me/bch_js_toolkit) +- [Telegram channel](https://t.me/bch_js_toolkit) ## Features The following features set this repository apart from rest.bitcoin.com: diff --git a/diagrams/bch-api-dependency-graph.dia b/diagrams/bch-api-dependency-graph.dia new file mode 100644 index 0000000000000000000000000000000000000000..cb131ae4eae14233c8cc16f22b3140ef3beecc4a GIT binary patch literal 1433 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 Nw!F&Cyz53!{|ANHM}`0Z literal 0 HcmV?d00001 From db0a4c466a64e7604188a880be3598be7f3bcfbe Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 11:52:03 -0700 Subject: [PATCH 4/7] fix(README): Updating README --- README.md | 55 ++++++++++++++------------ diagrams/bch-api-dependency-graph.dia | Bin 1433 -> 1488 bytes diagrams/bch-api-dependency-graph.png | Bin 13529 -> 13865 bytes diagrams/donation-qr.png | Bin 0 -> 2028 bytes start-dev-example.sh | 18 ++------- 5 files changed, 33 insertions(+), 40 deletions(-) create mode 100644 diagrams/donation-qr.png diff --git a/README.md b/README.md index 31764e7..9a9827f 100644 --- a/README.md +++ b/README.md @@ -24,34 +24,19 @@ Both bch-api and bch-js are part of the [Cash Stack](https://cashstack.info). Have questions? Need help? Join our community support: - [Telegram channel](https://t.me/bch_js_toolkit) -## Features -The following features set this repository apart from rest.bitcoin.com: - -- Fine grain access is controlled with a JWT token using -[this back end auth server](https://github.com/Permissionless-Software-Foundation/jwt-bch-api) and [this front end](https://github.com/Permissionless-Software-Foundation/jwt-bch-frontend). Can be used to monetize access to the REST API. -- Typescript removed and ES8 JavaScript used instead. -- `npm audit fix` frequently run to fix dependencies. - -## Live Demo -You can test a live demo of the REST API by running the -[bch-js examples](https://github.com/Permissionless-Software-Foundation/bch-js-examples). -Rate limits are 20 requests per minute, but you can increase them to 100 with a [paid account](https://fullstack.cash/pricing). -You can bootstrap your own REST API server by downloading and installing the infrastructure listed on the [CashStrap](https://fullstack.cash/cashstrap) page. - ### Configure bch-js The live servers can be used by [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) by settings the `restURL` config property to one of these servers: -- BCHN Mainnet REST API server: https://bchn.fullstack.cash/v4/ -- ABC Mainnet REST API server: https://abc.fullstack.cash/v4/ -- Testnet3 REST API server: https://testnet3.fullstack.cash/v4/ +- BCH Mainnet REST API server: https://bchn.fullstack.cash/v5/ +- eCash Mainnet REST API server: https://abc.fullstack.cash/v5/ - Check server status: https://metrics.fullstack.cash ## Installation There are two installation paths, depending if you want a *development* or *production* environment. You'll also need to set up the underlying infrastructure -described on [this page](https://psfoundation.cash/blog/cash-stack). +described on [CashStack.info](https://cashstack.info). -This code targets the Ubuntu 18.04 LTS Linux OS or higher. +This hardware target for this software is a PC running Ubuntu 18.04 LTS Linux OS or higher. ### Development This is a standard node.js project. The installation is as follows: @@ -76,7 +61,7 @@ For a production environment, a Docker container is provided in the containers target the Ubuntu 18.04 LTS Linux OS. - Install Docker and Docker Compose by following the commands on -[this Dev Ops page](https://troutsblog.com/research/dev-ops/overview). +[this Dev Ops page](https://bafybeidpuq6pgpryd22wwykhqh2etw44pzofuncm5ldczk5v733tkwk55y.ipfs.dweb.link/docs/dev-ops/overview). - Customize the [bash script](docker/mainnet/start-local-mainnet.sh) for your installation. @@ -90,7 +75,13 @@ installation. `docker-compose up` ## Rate Limits -The rate limits for [api.fullstack.cash](https://api.fullstack.cash) are controlled by a JWT token. You can increase your rate limits by [purchasing a JWT token](https://https://fullstack.cash). If you're using bch-js, [check the readme for instructions on increasing rate limits](https://github.com/Permissionless-Software-Foundation/bch-js#api-key). For interacting with bch-api directly, you can then include the JWT token in the HTTP header like this: +Rate limiting of the REST API can be controlled in three different ways: + - JWT tokens for individual users + - Basic Authentication tokens for company-wide usage. + - Whitelisting for specific domain names + +### JWT Tokens +The rate limits for [api.fullstack.cash](https://api.fullstack.cash) are controlled by a JWT token. You can increase your rate limits by [purchasing a JWT token](https://fullstack.cash). If you're using bch-js, [check the readme for instructions on increasing rate limits](https://github.com/Permissionless-Software-Foundation/bch-js#api-key). For interacting with bch-api directly, you can then include the JWT token in the HTTP header like this: - `Authorization: Token ` @@ -103,12 +94,24 @@ export BCHJSTOKEN=eyJhbGciOiJ.... curl "https://bchn.fullstack.cash/v4/electrumx/balance/bitcoincash:qr69kyzha07dcecrsvjwsj4s6slnlq4r8c30lxnur3" -X GET -H "Content-Type: application/json" -H "Authorization: Token ${BCHJSTOKEN}" ``` -## Support -Have questions? Need help? Join our community support -[Telegram channel](https://t.me/bch_js_toolkit) +### Basic Authentication +For private installations, Basic Authentication can be used to give everyone in an organization access to higher rate limits, while restricting use by the public. More than one Basic Authentication password can be generated by using the colon `:` to separate entries in the `PRO_PASS` environment variable. See the [bash script](docker/mainnet/start-local-mainnet.sh) for an example. -## IPFS -Copies of this repository will occasionally be uploaded and hosted on [IPFS](https://ipfs.io): +### Whitelists +Website domain names can be added to the `WHITELIST_DOMAINS` environment variable. Multiple domains can be separated with a comma `,`. Any web app making a request from that domain will be granted top-level rate limits. + +## Donate + +The open source software is developed and maintained by the [Permissionless Software Foundation](https://psfoundation.cash). If this library provides value to you, please consider making a donation to support the PSF developers: + +
+ +

bitcoincash:qqsrke9lh257tqen99dkyy2emh4uty0vky9y0z0lsr

+
+ + +## Censorship Resistance +Copies of this repository will occasionally be uploaded and hosted on the Filecoin blockchain, [IPFS](https://ipfs.io), and the [Radicle](https://radicle.xyz) p2p network. - v1.25.1: [QmXFzFJHenymhReDc9oGAxbpmvK2fJYnisQ2pJn3gGyKKX](https://ipfs.io/ipfs/QmXFzFJHenymhReDc9oGAxbpmvK2fJYnisQ2pJn3gGyKKX) diff --git a/diagrams/bch-api-dependency-graph.dia b/diagrams/bch-api-dependency-graph.dia index cb131ae4eae14233c8cc16f22b3140ef3beecc4a..1193c5bb05aa7663a6477e7340eb2dcf0463619c 100644 GIT binary patch literal 1488 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

QXUC0y&Xdd^pzDz2Lh5PI@el)DHf%l|DcVY3g) zPljc~77+M3L-a{ZR&pXOAzcW{PZYz;7+{BTfU`m016H^J?zet3(3D~MdI-Rt_Ay${ z9uKSRP~DVNcvzK*|KDT0&nW=faRRcTH|DXFVUat9ClaJpc-C+UzB&J*Z>zS0VK<(2 zJVna^#b`YV+(6Wrr+0oxUa{d}kRo%~PKIox2^Qm%X!LS52T*$=uo0g}?0}iSzt$BY zI#H{9^~lN+gVPljxssc~BhlXsx=$y>`Oz(BS-6}vL~qEl_<6$l6WMriWJLXF zF8Ym}gU3=$pcnm7e$uT0Bcy=Ei44)fzyuQE;@NKo4k!#SEnq}SSyW;bKy&DmLJB@K z-E-`7;;W*53g`SfNq0op4gLdXzW9~=fPKyRVSboGVl$ohUjJ>Aye>-i+H3C(EK8R z=cj1DFaX~2fW^Ixd34}Sut9)@;Z4}_%p%+UkLf)dP{CloQ=BHstQ;)U~%{golRiq7<5O9Sqc* z%~uAvct$J_I|08#3-(@}iZGfvOpaOA*I@B|I0;1dE1>-^_aC?;MS?F4aT%h`WhQkA z1ZoYvM5I4x9*TaZGM%_J#PzwZHQ=GC=tAwsG?^H+cXU7@;OlZ5Z=fzq69`UOu7-Xy zc+KQs_}T>fl8GXDoPG7EK`YQsV8D{ zYU0VfY7tXlqFu7@m0TM^ZA~H;s#)?8_bo}zWHCh8eIcWdk)F0KOAHuVl52`Idlu`Lh}%hOJ4YCAqm%E~9TuP>t$d}iY47TK zW#j#`jzy5V2`qgGmbd{M0SL>{hyMu%J-wca%F0BPe!6~z9-SnBe5jD|V3z)Pr+|s$ zg22bckR!{+_!onyfn-q(o9WG_KtKTx_uatM;jU&#UR`XQFzE_@PWf2v}88^ zEmT=-)PnUx zLy{5_dix^6h-+a07N$iJ8;lLvjPn2eA5Z*GTgi3!dF21XL~HFV;xqHFAAjsf-g(XG Wz)pXi4}SZFke9{Eq+d07^uGYldSDm; literal 13529 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 Nw!F&Cyz53!{|ANHM}`0Z diff --git a/diagrams/donation-qr.png b/diagrams/donation-qr.png new file mode 100644 index 0000000000000000000000000000000000000000..a0efbbfa12fcfcbbdb8e67be2177f2d244c365a2 GIT binary patch literal 2028 zcmb7Fdr(tX9*%Gg7YF3R6g9YPFWp3U0k!fFotVOfAjTk|gjW$kOiYVeOA(0j_KL_R zY9r7f6vBYKQdU&xDg=Zwfi`WW86Zkii8L(lrJ)EI9tHPYm_BD`XZpvz=Qrp4&hPPk z-#O>c2o9s4`NF+iY-G~8~dE@WWnrgPnaptKCqcLjk$Q_|Nc>_x&!&>tGIm=g8a>Dl~=W?Yn-*j=^! zeON0EM^!wTVrvbfsWqS48H2*To`r^oen`HrDhoZC8h>#oE4RZ7sm$E1d$0XN)b`rb zZi{~{VTR}3@|@*A`}5e|kIgQl?(PG|7{^GP*tfPpa=E_EELfX|%yyuMk6IcTx4x8S z-?AcOadA!49h?VLW~-p6)n6S)(HLvTY04XGNmMzPF$AJ0@~K>92MXgBI+jg?J_doX z90S!{8~-MZqdvks5a_d{1<|TwiXp}7s)siM-5hD2?$GFH4x^Xfw{NRx7s;%t+d&=u zdZ(qjaSGP(n}rvW4$i>sv!O+H0kdCeN;hDl=}YKpYP?FCeUMA!$ZViFSWzqhEM)?g z%7=UzgZ4btngsNhQ=g`ubL4)`dv>31 z_WXRX1AX_i8w~mnvX3@t-`6HjX)pbKRWx$aqc1w_x`nM#l~!Yd`4?^l_+bcFD|AFU z6E9i=8^WaNHL($jWm27){gXQjG<{;S+ufll-UH_e`ZsAaz$d4H#~SPy6@P%jE(N>T zOPlvar$LycToBPKytg>?7eEA{xKsJ1CjMn9!g4f zv%(OnB`$ExEf#&w5my>$K3zJOq$iBK1!SU<3i=m$*??E{FbM|(P%eJ(h@`%X)8DO8 zedku_ueRma5sm;LFaUslHp8Dr6uQ~EyIhQV(ZbF@#ft(fa>ZmL1-KxU^4$P@PSm{C z0tAP9IYMpp{p1tlBFfZXkDehHHQF+wU((D$$mX81V0B?S3up#AH#er4a~*D)Ga|By5LaMmiEdwGlKJx+kiY zN3MDmm$xV%e{W7uU9b4;9a+lPQSGF4#URX((}2rSfdBob?L^+z5Q#o^$f5T2Z}gbq zrANxX+0tTBH0%f}a5jt<2vt(r_1AomiNPz!8$<+`jp zt!6X{Z}QAl6kad z@{Y<_t!71D=y5)ju@xMTG!Lj~p}xWsnz``*t%tnKuF0h@=4#%G-0M`c{PEdZzNaY= zb8lmmYY>rZPS9_`A(&@8b2qgGB4DeNyS=*hy^5=-uggfBk4RG6ip!d>24`LsuwY!J z{x~)HZ7<{MW^e;RH_JkdQ=eoRR_wuz2EXB1XVAX8LAOljvb_;zMyRf_&qQGawI+Lz8^KhU{GG{Ue9?QQC|4t zz;q9yye+fAgGV>wXl~cKOGSC;!82FlDT)jhacMBgfL-8UqDh)w+yo{laKaX#u!Q6N zkH(yiY&;h1&^s=S;y-aeBwyf-p_X`Vn-2mVSQESCw};L~dHmJ2mt%9KOM>d0lw(dW zLUEKlC|93}Lsel6R_>*3H^kFzFzgZ(XcLR({ClWnj|py}$:12300/ -# Use the same address as SLPDB_URL if you don't have a separate whitelist server. -export SLPDB_PASS_WL=somelongpassword -export SLPDB_WHITELIST_URL=http://:12300/ -# slp-api alternative SLP validator using slp-validate: -# https://github.com/Permissionless-Software-Foundation/slp-api -export SLP_API_URL=http://10.0.0.5:5001/ +# psf-slp-indxer +export SLP_INDEXER_API=http://:/ # Mainnet Fulcrum / ElectrumX -export FULCRUM_URL=192.168.0.6 -export FULCRUM_PORT=50002 -# Fulcrum API (used for /v5+ routes) export FULCRUM_API=http://172.17.0.1:3001/v1/ # Redis DB - Used for rate limiting - customize to your own Redis installation. @@ -46,7 +36,7 @@ export REDIS_HOST=172.17.0.1 export TOKENSECRET=somelongpassword # So that bch-api can call bch-js locally. -export LOCAL_RESTURL=http://127.0.0.1:3000/v4/ +export LOCAL_RESTURL=http://127.0.0.1:3000/v5/ # Basic Authentication password export PRO_PASS=somerandomepassword:someotherrandompassword:aThirdPassword From 92c257ceb30046661830a2f5abed305cbfe13002 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 11:59:01 -0700 Subject: [PATCH 5/7] Updating README --- LICENSE.md | 2 +- README.md | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/LICENSE.md b/LICENSE.md index cdcc7fd..f442d31 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2021 Permissionless Software Foundation +Copyright (c) 2022 Permissionless Software Foundation developers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 9a9827f..6797158 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,12 @@ This is a REST API server, written in node.js JavaScript, using the [Express.js] While developers are encouraged to run and manage their own infrastructure, cloud-based infrastructure is available via [FullStack.cash](https://fullstack.cash). Free and paid tiers are available. You can use this REST API right away with the [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js) JavaScript library. -This repository is intended to be paired with [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js), an npm JavaScript library for building Bitcoin Cash apps. [Code examples](https://github.com/Permissionless-Software-Foundation/bch-js-examples) for common use-cases are available. And the [minimal-slp-wallet](https://www.npmjs.com/package/minimal-slp-wallet) is a front end JavaScript library that incorporates bch-js and provides basic wallet functionality. +This repository is intended to be paired with [bch-js](https://github.com/Permissionless-Software-Foundation/bch-js), an npm JavaScript library for building Bitcoin Cash apps. [Code examples](https://github.com/Permissionless-Software-Foundation/bch-js-examples) for common use-cases are available, and the [minimal-slp-wallet](https://www.npmjs.com/package/minimal-slp-wallet) is a front end JavaScript library that incorporates bch-js and provides basic wallet functionality. ![bch-api dependency diagram](./diagrams/bch-api-dependency-graph.png) -Both bch-api and bch-js are part of the [Cash Stack](https://cashstack.info). +## Documentation +All the software above is part of the [Cash Stack](https://cashstack.info). - [CashStack](https://cashstack.info) high-level documentation. - [bch-api REST API reference](https://api.fullstack.cash/docs/) @@ -72,16 +73,16 @@ installation. - Run the Docker container with: -`docker-compose up` +`docker-compose up -d` ## Rate Limits Rate limiting of the REST API can be controlled in three different ways: - JWT tokens for individual users - - Basic Authentication tokens for company-wide usage. + - Basic Authentication tokens for organization-wide usage. - Whitelisting for specific domain names ### JWT Tokens -The rate limits for [api.fullstack.cash](https://api.fullstack.cash) are controlled by a JWT token. You can increase your rate limits by [purchasing a JWT token](https://fullstack.cash). If you're using bch-js, [check the readme for instructions on increasing rate limits](https://github.com/Permissionless-Software-Foundation/bch-js#api-key). For interacting with bch-api directly, you can then include the JWT token in the HTTP header like this: +The rate limits for [api.fullstack.cash](https://api.fullstack.cash) are controlled by a JWT token. You can increase your rate limits by [purchasing a JWT token](https://fullstack.cash). If you're using bch-js, [check the readme for instructions on increasing rate limits](https://github.com/Permissionless-Software-Foundation/bch-js#api-key). For interacting with bch-api directly (without bch-js), you can then include the JWT token in the HTTP header like this: - `Authorization: Token ` @@ -98,14 +99,14 @@ curl "https://bchn.fullstack.cash/v4/electrumx/balance/bitcoincash:qr69kyzha07dc For private installations, Basic Authentication can be used to give everyone in an organization access to higher rate limits, while restricting use by the public. More than one Basic Authentication password can be generated by using the colon `:` to separate entries in the `PRO_PASS` environment variable. See the [bash script](docker/mainnet/start-local-mainnet.sh) for an example. ### Whitelists -Website domain names can be added to the `WHITELIST_DOMAINS` environment variable. Multiple domains can be separated with a comma `,`. Any web app making a request from that domain will be granted top-level rate limits. +Website domain names can be added to the `WHITELIST_DOMAINS` environment variable. Multiple domains can be separated with a comma `,`. Any web app making a request from that domain will be granted top-level rate limits. See the [bash script](docker/mainnet/start-local-mainnet.sh) for an example. ## Donate The open source software is developed and maintained by the [Permissionless Software Foundation](https://psfoundation.cash). If this library provides value to you, please consider making a donation to support the PSF developers:

- +

bitcoincash:qqsrke9lh257tqen99dkyy2emh4uty0vky9y0z0lsr

@@ -117,4 +118,3 @@ Copies of this repository will occasionally be uploaded and hosted on the Fileco ## License [MIT](./LICENSE.md) -a From 2b219901bd7a18ad1e6c2bca77c76c43260673c2 Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 11:59:48 -0700 Subject: [PATCH 6/7] Updating README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6797158..c12cf72 100644 --- a/README.md +++ b/README.md @@ -106,7 +106,7 @@ Website domain names can be added to the `WHITELIST_DOMAINS` environment variabl The open source software is developed and maintained by the [Permissionless Software Foundation](https://psfoundation.cash). If this library provides value to you, please consider making a donation to support the PSF developers:
- +

bitcoincash:qqsrke9lh257tqen99dkyy2emh4uty0vky9y0z0lsr

From 77a541733d13bd33b332fe34cf8138c9ee7aa27e Mon Sep 17 00:00:00 2001 From: Chris Troutner Date: Thu, 28 Apr 2022 12:05:25 -0700 Subject: [PATCH 7/7] fixing readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c12cf72..fb1ac0f 100644 --- a/README.md +++ b/README.md @@ -103,7 +103,7 @@ Website domain names can be added to the `WHITELIST_DOMAINS` environment variabl ## Donate -The open source software is developed and maintained by the [Permissionless Software Foundation](https://psfoundation.cash). If this library provides value to you, please consider making a donation to support the PSF developers: +This open source software is developed and maintained by the [Permissionless Software Foundation](https://psfoundation.cash). If this library provides value to you, please consider making a donation to support the PSF developers: