diff --git a/README.md b/README.md
index d44e54075..7f188ceb2 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+
@@ -15,64 +16,38 @@
js-stellar-sdk is a JavaScript library for communicating with a
[Stellar Horizon server](https://github.com/stellar/go/tree/master/services/horizon) and [Soroban RPC](https://soroban.stellar.org/docs/reference/rpc).
-It is used for building Stellar apps either on Node.js or in the browser.
+It is used for building Stellar apps either on Node.js or in the browser, though it can be used in other environments with some tinkering.
It provides:
-- a networking layer API for Horizon endpoints (REST-based) and Soroban RPC (JSON-RPC-based).
+- a networking layer API for Horizon endpoints (REST-based),
+- a networking layer for Soroban RPC (JSONRPC-based).
- facilities for building and signing transactions, for communicating with a
Stellar Horizon instance, and for submitting transactions or querying network
history.
-### stellar-sdk vs stellar-base
-
-`stellar-sdk` is a high-level library that serves as client-side API for Horizon and Soroban RPC, while [stellar-base](https://github.com/stellar/js-stellar-base) is lower-level library for creating Stellar primitive constructs via XDR helpers and wrappers.
-
-**Most people will want stellar-sdk instead of stellar-base.** You should only
-use stellar-base if you know what you're doing!
-
-If you add `stellar-sdk` to a project, **do not add `stellar-base`!** Mis-matching
-versions could cause weird, hard-to-find bugs. `stellar-sdk` automatically
-installs `stellar-base` and exposes all of its exports in case you need them.
+**Jump to:**
-> **Important!** The Node.js version of the `stellar-base` (`stellar-sdk` dependency) package
-> uses the [`sodium-native`](https://www.npmjs.com/package/sodium-native) package as
-> an [optional dependency](https://docs.npmjs.com/files/package.json#optionaldependencies). `sodium-native` is
-> a low level binding to [libsodium](https://github.com/jedisct1/libsodium),
-> (an implementation of [Ed25519](https://ed25519.cr.yp.to/) signatures).
-> If installation of `sodium-native` fails, or it is unavailable, `stellar-base` (and `stellar-sdk`) will
-> fallback to using the [`tweetnacl`](https://www.npmjs.com/package/tweetnacl) package implementation.
->
-> If you are using `stellar-sdk`/`stellar-base` in a browser you can ignore
-> this. However, for production backend deployments you should be
-> using `sodium-native`. If `sodium-native` is successfully installed and working the
-> `StellarSdk.FastSigning` variable will return `true`.
+ * [Installation](#installation): details on hitting the ground running
+ * [Usage](#usage): links to documentation and a variety of workarounds for non-traditional JavaScript environments
+ - [...with React Native](#usage-with-react-native)
+ - [...with Expo](#usage-with-expo-managed-workflows)
+ - [...with CloudFlare Workers](#usage-with-cloudflare-workers)
+ * [Developing](#developing): contribute to the project!
+ * [Understanding `stellar-sdk` vs. `stellar-base`](#stellar-sdk-vs-stellar-base)
+ * [License](#license)
-## Quick start
+## Installation
-Using npm to include js-stellar-sdk in your own project:
+Using npm or yarn to include `stellar-sdk` in your own project:
```shell
npm install --save @stellar/stellar-sdk
+# or
+yarn add @stellar/stellar-sdk
```
-Alternatively, you can use cdnjs in a browser:
-
-```html
-
-````
-
-## Install
-
-### To use as a module in a Node.js project
-
-1. Install it using npm:
-
-```shell
-npm install --save stellar-sdk
-```
-
-2. require/import it in your JavaScript:
+Then, require or import it in your JavaScript code:
```js
var StellarSdk = require('@stellar/stellar-sdk');
@@ -80,95 +55,48 @@ var StellarSdk = require('@stellar/stellar-sdk');
import * as StellarSdk from '@stellar/stellar-sdk';
```
-### To self host for use in the browser
-
-1. Install it using [bower](http://bower.io):
+(Preferably, you would only import the pieces you need to enable tree-shaking and lower your final bundle sizes.)
-```shell
-bower install @stellar/stellar-sdk
-```
+### Browsers
-2. Include it in the browser:
+You can use a CDN:
```html
-
-
+
```
-If you don't want to use or install Bower, you can copy built JS files from the
-[bower-js-stellar-sdk repo](https://github.com/stellar/bower-js-stellar-sdk).
+Note that this method relies using a third party to host the JS library. This may not be entirely secure. You can self-host it via [Bower](http://bower.io):
-### To use the [cdnjs](https://cdnjs.com/libraries/stellar-sdk) hosted script in the browser
+```shell
+bower install @stellar/stellar-sdk
+```
-1. Instruct the browser to fetch the library from
- [cdnjs](https://cdnjs.com/libraries/stellar-sdk), a 3rd party service that
- hosts js libraries:
+and include it in the browser:
```html
-
+
```
-Note that this method relies using a third party to host the JS library. This
-may not be entirely secure.
-
-Make sure that you are using the latest version number. They can be found on the
-[releases page in Github](https://github.com/stellar/js-stellar-sdk/releases).
-
-### To develop and test js-stellar-sdk itself
-
-1. Clone the repo:
-
-```shell
-git clone https://github.com/stellar/js-stellar-sdk.git
-```
-
-2. Install dependencies inside js-stellar-sdk folder:
-
-```shell
-cd js-stellar-sdk
-yarn
-```
-
-3. Install Node 18
-
-Because we support the oldest maintenance version of Node, please install and develop on Node 18 so you don't get surprised when your code works locally but breaks in CI.
-
-Here's how to install `nvm` if you haven't: https://github.com/creationix/nvm
-
-```shell
-nvm install
-
-# if you've never installed 16 before you'll want to re-install yarn
-npm install -g yarn
-```
-
-If you work on several projects that use different Node versions, you might it
-helpful to install this automatic version manager:
-https://github.com/wbyoung/avn
+If you don't want to use or install Bower, you can copy the packaged JS files from the [Bower repo](https://github.com/stellar/bower-js-stellar-sdk), or just build the package yourself locally (see [Developing :arrow_right: Building](#building)) and copy the bundle.
-4. Observe the project's code style
+| Always make sure that you are using the latest version number. They can be found on the [releases page](https://github.com/stellar/js-stellar-sdk/releases) in GitHub. |
+|----|
-While you're making changes, make sure to run the linter to catch any linting
-errors (in addition to making sure your text editor supports ESLint)
-
-```shell
-yarn fmt
-```
+## Usage
+The usage documentation for this library lives in a handful of places:
-## Usage
+ * across the [Stellar Developer Docs](), which includes tutorials and examples,
+ * within [this repository itself](https://github.com/stellar/js-stellar-sdk/blob/master/docs/reference/readme.md), and
+ * on the generated [API doc site](https://stellar.github.io/js-stellar-sdk/).
-For information on how to use js-stellar-sdk, take a look at [the
-documentation](https://stellar.github.io/js-stellar-sdk/), or [the
-examples](https://github.com/stellar/js-stellar-sdk/tree/master/docs/reference).
+You can also refer to:
-There is also Horizon REST API Documentation
-[here](https://developers.stellar.org/api/introduction/) and Soroban JSON-RPC documentation [here](https://soroban.stellar.org/docs/reference/rpc).
+ * the [documentation](https://developers.stellar.org/api/introduction/) for the Horizon REST API (if using the `Horizon` module) and
+ * the [documentation](https://soroban.stellar.org/docs/reference/rpc) for Soroban RPC's API (if using the `SorobanRpc` module)
### Usage with React-Native
@@ -192,7 +120,7 @@ module.exports = {
There is also a [sample](https://github.com/fnando/rn-stellar-sdk-sample) that you can follow.
-#### Using in an Expo managed workflow
+#### Usage with Expo managed workflows
1. Install `yarn add --dev rn-nodeify`
2. Add the following postinstall script:
@@ -207,16 +135,104 @@ At this point, the Stellar SDK will work, except that `StellarSdk.Keypair.random
```javascript
import * as Random from 'expo-random';
-import StellarSdk from '@stellar/stellar-sdk';
+import { Keypair } from '@stellar/stellar-sdk';
const generateRandomKeypair = () => {
const randomBytes = Random.getRandomBytes(32);
-
- return StellarSdk.Keypair.fromRawEd25519Seed(Buffer.from(randomBytes));
+ return Keypair.fromRawEd25519Seed(Buffer.from(randomBytes));
};
```
-## Testing
+#### Usage with CloudFlare Workers
+
+Both `eventsource` (needed for streaming) and `axios` (needed for making HTTP requests) are problematic dependencies in the CFW environment. The experimental branch [`make-eventsource-optional`](https://github.com/stellar/js-stellar-sdk/pull/901) is an attempt to resolve these issues.
+
+It requires the following additional tweaks to your project:
+ * the `axios-fetch-adapter` lets you use `axios` with `fetch` as a backend, which is available to CF workers
+ * it only works with `axios@"<= 1.0.0"` versions, so we need to force an override into the underlying dependency
+ * and this can be problematic with newer `yarn` versions, so we need to force the environment to use Yarn 1
+
+In summary, the `package.json` tweaks look something like this:
+
+```jsonc
+"dependencies": {
+ // ...
+ "@stellar/stellar-sdk": "git+https://github.com/stellar/js-stellar-sdk#make-eventsource-optional",
+ "@vespaiach/axios-fetch-adapter": "^0.3.1",
+ "axios": "^0.26.1"
+},
+"overrides": {
+ "@stellar/stellar-sdk": {
+ "axios": "$axios"
+ }
+},
+"packageManager": "yarn@1.22.19"
+```
+
+Then, you need to override the adapter in your codebase:
+
+```typescript
+import { Horizon } from '@stellar/stellar-sdk';
+import fetchAdapter from '@vespaiach/axios-fetch-adapter';
+
+Horizon.AxiosClient.defaults.adapter = fetchAdapter as any;
+
+// then, the rest of your code...
+```
+
+All HTTP calls will use `fetch`, now, meaning it should work in the CloudFlare Worker environment.
+
+## Developing
+
+So you want to contribute to the library: welcome! Whether you're working on a fork or want to make an upstream request, the dev-test loop is pretty straightforward.
+
+1. Clone the repo:
+
+```shell
+git clone https://github.com/stellar/js-stellar-sdk.git
+```
+
+2. Install dependencies inside js-stellar-sdk folder:
+
+```shell
+cd js-stellar-sdk
+yarn
+```
+
+3. Install Node 18
+
+Because we support the oldest maintenance version of Node, please install and develop on Node 18 so you don't get surprised when your code works locally but breaks in CI.
+
+Here's how to install `nvm` if you haven't: https://github.com/creationix/nvm
+
+```shell
+nvm install 18
+
+# if you've never installed 18 before you'll want to re-install yarn
+npm install -g yarn
+```
+
+If you work on several projects that use different Node versions, you might it helpful to install this automatic version manager: https://github.com/wbyoung/avn
+
+4. Observe the project's code style
+
+While you're making changes, make sure to run the linter to catch any linting
+errors (in addition to making sure your text editor supports ESLint) and conform to the project's code style.
+
+```shell
+yarn fmt
+```
+
+### Building
+You can build the developer version (unoptimized, commented, with source maps, etc.) or the production bundles:
+
+```shell
+yarn build
+# or
+yarn build:prod
+```
+
+### Testing
To run all tests:
@@ -229,13 +245,19 @@ To run a specific set of tests:
```shell
yarn test:node
yarn test:browser
+yarn test:integration
```
+In order to have a faster test loop, these suite-specific commands **do not** build the bundles first (unlike `yarn test`). If you make code changes, you will need to run `yarn build` (or a subset like `yarn build:node` corresponding to the test suite) before running the tests again to see your changes.
+
To generate and check the documentation site:
```shell
# install the `serve` command if you don't have it already
-npm install -g serve
+npm i -g serve
+
+# clone the base library for complete docs
+git clone https://github.com/stellar/js-stellar-base
# generate the docs files
yarn docs
@@ -246,16 +268,25 @@ cd jsdoc && serve .
# you'll be able to browse the docs at http://localhost:5000
```
-## Documentation
+### Publishing
+
+For information on how to contribute or publish new versions of this software to `npm`, please refer to our [contribution guide](https://github.com/stellar/js-stellar-sdk/blob/master/CONTRIBUTING.md).
-Documentation for this repo lives in
-[Developers site](https://github.com/stellar/js-stellar-sdk/blob/master/docs/reference/readme.md).
+## Miscellaneous
-## Contributing and Publishing
+### `stellar-sdk` vs `stellar-base`
-For information on how to contribute or publish new versions of this software to `npm`, please refer to our [contribution guide](https://github.com/stellar/js-stellar-sdk/blob/master/CONTRIBUTING.md).
+`stellar-sdk` is a high-level library that serves as client-side API for Horizon and Soroban RPC, while [`stellar-base](https://github.com/stellar/js-stellar-base) is lower-level library for creating Stellar primitive constructs via XDR helpers and wrappers.
+
+**Most people will want stellar-sdk instead of stellar-base.** You should only use stellar-base if you know what you're doing!
+
+If you add `stellar-sdk` to a project, **do not add `stellar-base`!** Mismatching versions could cause weird, hard-to-find bugs. `stellar-sdk` automatically installs `stellar-base` and exposes all of its exports in case you need them.
+
+> **Important!** The Node.js version of the `stellar-base` (`stellar-sdk` dependency) package uses the [`sodium-native`](https://www.npmjs.com/package/sodium-native) package as an [optional dependency](https://docs.npmjs.com/files/package.json#optionaldependencies). `sodium-native` is a low level binding to [libsodium](https://github.com/jedisct1/libsodium), (an implementation of [Ed25519](https://ed25519.cr.yp.to/) signatures).
+> If installation of `sodium-native` fails, or it is unavailable, `stellar-base` (and `stellar-sdk`) will fallback to using the [`tweetnacl`](https://www.npmjs.com/package/tweetnacl) package implementation. If you are using them in a browser, you can ignore this. However, for production backend deployments, you should be using `sodium-native`.
+> If `sodium-native` is successfully installed and working the `StellarSdk.FastSigning` variable will return `true`.
-## License
+### License
js-stellar-sdk is licensed under an Apache-2.0 license. See the
[LICENSE](https://github.com/stellar/js-stellar-sdk/blob/master/LICENSE) file