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