diff --git a/.test-env b/.test-env
index 3b17bb191..df783a4fd 100644
--- a/.test-env
+++ b/.test-env
@@ -3,6 +3,8 @@ SDK_TESTING_URL="https://github.com/algorand/algorand-sdk-testing"
SDK_TESTING_BRANCH="master"
SDK_TESTING_HARNESS="test-harness"
+INSTALL_ONLY=0
+
VERBOSE_HARNESS=0
# WARNING: If set to 1, new features will be LOST when downloading the test harness.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index e4114e3e7..058575ec7 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,17 @@
+# v1.22.0
+
+## What's Changed
+
+### Bugfixes
+
+- Bug-Fix: Fix typo in documentation for `searchAccounts` `currencyGreaterThan` by @fionnachan in https://github.com/algorand/js-algorand-sdk/pull/572
+
+### Enhancements
+
+- REST API: Add algod block hash endpoint, add indexer block header-only param. by @winder in https://github.com/algorand/js-algorand-sdk/pull/665
+
+**Full Changelog**: https://github.com/algorand/js-algorand-sdk/compare/v1.21.0...v1.22.0
+
# v1.21.0
## What's Changed
diff --git a/Makefile b/Makefile
index 6f9bb461a..3fdc3afab 100644
--- a/Makefile
+++ b/Makefile
@@ -13,7 +13,10 @@ display-all-js-steps:
tail -n +135 tests/cucumber/steps/steps.js | grep -v '^ *//' | awk "/(Given|Then|When)/,/',/" | grep -E "\'.+\'" | sed "s/^[^']*'\([^']*\)'.*/\1/g"
harness:
- ./test-harness.sh
+ ./test-harness.sh up
+
+harness-down:
+ ./test-harness.sh down
docker-build:
docker build -t js-sdk-testing -f tests/cucumber/docker/Dockerfile $(CURDIR) --build-arg TEST_BROWSER --build-arg CI=true
diff --git a/README.md b/README.md
index 69e6e9cec..b38073e84 100644
--- a/README.md
+++ b/README.md
@@ -22,8 +22,8 @@ Include a minified browser bundle directly in your HTML like so:
```html
```
@@ -32,8 +32,8 @@ or
```html
```
diff --git a/package-lock.json b/package-lock.json
index 2d069eee4..f47ad66a1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "algosdk",
- "version": "1.21.0",
+ "version": "1.22.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "algosdk",
- "version": "1.21.0",
+ "version": "1.22.0",
"license": "MIT",
"dependencies": {
"algo-msgpack-with-bigint": "^2.1.1",
diff --git a/package.json b/package.json
index 0f4a53a46..1ffc10863 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "algosdk",
- "version": "1.21.0",
+ "version": "1.22.0",
"description": "The official JavaScript SDK for Algorand",
"main": "dist/cjs/index.js",
"module": "dist/esm/index.js",
diff --git a/src/client/v2/algod/algod.ts b/src/client/v2/algod/algod.ts
index c64bb4936..bf0e05833 100644
--- a/src/client/v2/algod/algod.ts
+++ b/src/client/v2/algod/algod.ts
@@ -9,6 +9,7 @@ import Dryrun from './dryrun';
import Genesis from './genesis';
import GetAssetByID from './getAssetByID';
import GetApplicationByID from './getApplicationByID';
+import GetBlockHash from './getBlockHash';
import HealthCheck from './healthCheck';
import PendingTransactionInformation from './pendingTransactionInformation';
import PendingTransactions from './pendingTransactions';
@@ -205,6 +206,23 @@ export default class AlgodClient extends ServiceClient {
return new Block(this.c, roundNumber);
}
+ /**
+ * Get the block hash for the block on the given round.
+ *
+ * #### Example
+ * ```typescript
+ * const roundNumber = 18038133;
+ * const block = await algodClient.getBlockHash(roundNumber).do();
+ * ```
+ *
+ * [Response data schema details](https://developer.algorand.org/docs/rest-apis/algod/v2/#get-v2blocksroundhash)
+ * @param roundNumber - The round number of the block to get.
+ * @category GET
+ */
+ getBlockHash(roundNumber: number) {
+ return new GetBlockHash(this.c, this.intDecoding, roundNumber);
+ }
+
/**
* Returns the transaction information for a specific pending transaction.
*
diff --git a/src/client/v2/algod/getBlockHash.ts b/src/client/v2/algod/getBlockHash.ts
new file mode 100644
index 000000000..40d01b499
--- /dev/null
+++ b/src/client/v2/algod/getBlockHash.ts
@@ -0,0 +1,18 @@
+import JSONRequest from '../jsonrequest';
+import HTTPClient from '../../client';
+import IntDecoding from '../../../types/intDecoding';
+
+export default class GetBlockHash extends JSONRequest {
+ round: number;
+
+ constructor(c: HTTPClient, intDecoding: IntDecoding, roundNumber: number) {
+ super(c, intDecoding);
+ if (!Number.isInteger(roundNumber))
+ throw Error('roundNumber should be an integer');
+ this.round = roundNumber;
+ }
+
+ path() {
+ return `/v2/blocks/${this.round}/hash`;
+ }
+}
diff --git a/src/client/v2/indexer/lookupBlock.ts b/src/client/v2/indexer/lookupBlock.ts
index d722827cf..3b5030712 100644
--- a/src/client/v2/indexer/lookupBlock.ts
+++ b/src/client/v2/indexer/lookupBlock.ts
@@ -27,4 +27,13 @@ export default class LookupBlock extends JSONRequest {
path() {
return `/v2/blocks/${this.round}`;
}
+
+ /**
+ * Header only flag. When this is set to true, returned block does not contain the
+ * transactions.
+ */
+ headerOnly(headerOnly: boolean) {
+ this.query['header-only'] = headerOnly;
+ return this;
+ }
}
diff --git a/src/client/v2/indexer/searchAccounts.ts b/src/client/v2/indexer/searchAccounts.ts
index 31a62f02d..21b1df4b0 100644
--- a/src/client/v2/indexer/searchAccounts.ts
+++ b/src/client/v2/indexer/searchAccounts.ts
@@ -43,7 +43,7 @@ export default class SearchAccounts extends JSONRequest {
* .do();
* ```
* @remarks
- * If you are looking for accounts with the currency amount greater than 0, simply construct the query without `currencyGreaterThan` because it doesn't accept `-1`, and passing the `0` `currency-greater-than` value would exclude transactions with a 0 amount.
+ * If you are looking for accounts with the currency amount greater than 0, simply construct the query without `currencyGreaterThan` because it doesn't accept `-1`, and passing the `0` `currency-greater-than` value would exclude accounts with a 0 amount.
*
* @param greater
* @category query
diff --git a/test-harness.sh b/test-harness.sh
index ad68eaf63..182039e1a 100755
--- a/test-harness.sh
+++ b/test-harness.sh
@@ -1,7 +1,47 @@
#!/usr/bin/env bash
-
set -euo pipefail
+# test-harness.sh setup/start cucumber test environment.
+#
+# Configuration is managed with environment variables, the ones you
+# are most likely to reconfigured are stored in '.test-env'.
+#
+# Variables:
+# SDK_TESTING_URL - URL to algorand-sdk-testing, useful for forks.
+# SDK_TESTING_BRANCH - branch to checkout, useful for new tests.
+# SDK_TESTING_HARNESS - local directory that the algorand-sdk-testing repo is cloned into.
+# VERBOSE_HARNESS - more output while the script runs.
+# INSTALL_ONLY - installs feature files only, useful for unit tests.
+#
+# WARNING: If set to 1, new features will be LOST when downloading the test harness.
+# REGARDLESS: modified features are ALWAYS overwritten.
+# REMOVE_LOCAL_FEATURES - delete all local cucumber feature files before downloading these from github.
+#
+# WARNING: Be careful when turning on the next variable.
+# In that case you'll need to provide all variables expected by `algorand-sdk-testing`'s `.env`
+# OVERWRITE_TESTING_ENVIRONMENT=0
+
+SHUTDOWN=0
+if [ $# -ne 0 ]; then
+ if [ $# -ne 1 ]; then
+ echo "this script accepts a single argument, which must be 'up' or 'down'."
+ exit 1
+ fi
+
+ case $1 in
+ 'up')
+ ;; # default.
+ 'down')
+ SHUTDOWN=1
+ ;;
+ *)
+ echo "unknown parameter '$1'."
+ echo "this script accepts a single argument, which must be 'up' or 'down'."
+ exit 1
+ ;;
+ esac
+fi
+
START=$(date "+%s")
THIS=$(basename "$0")
@@ -23,10 +63,19 @@ if [ -d "$SDK_TESTING_HARNESS" ]; then
./scripts/down.sh
popd
rm -rf "$SDK_TESTING_HARNESS"
+ if [[ $SHUTDOWN == 1 ]]; then
+ echo "$THIS: network shutdown complete."
+ exit 0
+ fi
else
echo "$THIS: directory $SDK_TESTING_HARNESS does not exist - NOOP"
fi
+if [[ $SHUTDOWN == 1 ]]; then
+ echo "$THIS: unable to shutdown network."
+ exit 1
+fi
+
git clone --depth 1 --single-branch --branch "$SDK_TESTING_BRANCH" "$SDK_TESTING_URL" "$SDK_TESTING_HARNESS"
@@ -52,6 +101,11 @@ if [[ $VERBOSE_HARNESS == 1 ]]; then
fi
echo "$THIS: seconds it took to get to end of cloning and copying: $(($(date "+%s") - START))s"
+if [[ $INSTALL_ONLY == 1 ]]; then
+ echo "$THIS: configured to install feature files only. Not starting test harness environment."
+ exit 0
+fi
+
## Start test harness environment
pushd "$SDK_TESTING_HARNESS"
diff --git a/tests/cucumber/steps/steps.js b/tests/cucumber/steps/steps.js
index cf1807a19..6904ad221 100644
--- a/tests/cucumber/steps/steps.js
+++ b/tests/cucumber/steps/steps.js
@@ -2152,6 +2152,13 @@ module.exports = function getSteps(options) {
}
);
+ When(
+ 'we make a Lookup Block call against round {int} and header {string}',
+ async function (int, string) {
+ await this.indexerClient.lookupBlock(int).headerOnly(string).do();
+ }
+ );
+
When(
'we make a Lookup Account by ID call against account {string} with round {int}',
async function (account, round) {
@@ -4417,6 +4424,13 @@ module.exports = function getSteps(options) {
await this.v2Client.getStateProof(int).do();
});
+ When(
+ 'we make a Lookup Block Hash call against round {int}',
+ async function (int) {
+ await this.v2Client.getBlockHash(int).do();
+ }
+ );
+
Given(
'a base64 encoded program bytes for heuristic sanity check {string}',
async function (programByteStr) {
diff --git a/tests/cucumber/unit.tags b/tests/cucumber/unit.tags
index 3acf36fea..8dcfa14b3 100644
--- a/tests/cucumber/unit.tags
+++ b/tests/cucumber/unit.tags
@@ -4,6 +4,7 @@
@unit.algod.ledger_refactoring
@unit.applications
@unit.atomic_transaction_composer
+@unit.blocksummary
@unit.dryrun
@unit.dryrun.trace.application
@unit.feetest
@@ -17,6 +18,7 @@
@unit.responses.231
@unit.responses.participationupdates
@unit.responses.unlimited_assets
+@unit.responses.blocksummary
@unit.sourcemap
@unit.stateproof.paths
@unit.stateproof.responses